Merge remote-tracking branch 'upstream/dev-freeze' into dev

Conflicts:
	code/game/objects/items/stacks/tiles/plasteel.dm
	code/game/objects/items/stacks/tiles/tile_types.dm
	code/modules/materials/materials.dm
	code/modules/mob/living/carbon/human/life.dm
	code/modules/mob/living/silicon/pai/pai.dm
	code/modules/surgery/implant.dm
	code/setup.dm
This commit is contained in:
PsiOmega
2015-06-26 20:28:47 +02:00
41 changed files with 290 additions and 149 deletions

View File

@@ -114,10 +114,10 @@
ReplaceWithLattice()
return
if (istype(C, /obj/item/stack/tile/plasteel))
if (istype(C, /obj/item/stack/tile/steel))
var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
if(L)
var/obj/item/stack/tile/plasteel/S = C
var/obj/item/stack/tile/steel/S = C
if (S.get_amount() < 1)
return
qdel(L)

View File

@@ -226,14 +226,15 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
//Returns the firelevel
/datum/gas_mixture/proc/zburn(zone/zone, force_burn, no_check = 0)
#ifdef FIREDBG
log_debug("***************** FIREDBG *****************")
if(zone) log_debug("Burning [zone.name]!")
#endif
. = 0
if((temperature > PHORON_MINIMUM_BURN_TEMPERATURE || force_burn) && (no_check ||check_recombustability(zone? zone.fuel_objs : null)))
var/gas_fuel = 0 //in the case of mixed gas/liquid fires, the gas burns first.
#ifdef FIREDBG
log_debug("***************** FIREDBG *****************")
log_debug("Burning [zone? zone.name : "zoneless gas_mixture"]!")
#endif
var/gas_fuel = 0
var/liquid_fuel = 0
var/total_fuel = 0
var/total_oxidizers = 0
@@ -269,23 +270,27 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
//calculate the firelevel.
var/firelevel = calculate_firelevel(total_fuel, total_oxidizers, reaction_limit)
var/firelevel_ratio = firelevel / vsc.fire_firelevel_multiplier
//vapour fuels are extremely volatile! The reaction progress is a percentage of the total fuel (similar to old zburn).
var/gas_reaction_progress = min(0.2, (firelevel/vsc.fire_firelevel_multiplier))*gas_fuel*FIRE_GAS_BURNRATE_MULT
//vapour fuels are extremely volatile! The reaction progress is a percentage of the total fuel (similar to old zburn).)
var/min_burn = 0.30*volume*group_multiplier/CELL_VOLUME //in moles - so that fires with very small gas concentrations burn out fast
var/gas_reaction_progress = max(min_burn, firelevel_ratio*gas_fuel)*FIRE_GAS_BURNRATE_MULT
//liquid fuels are not as volatile, and the reaction progress depends on the size of the area that is burning. Limit the burn rate to a certain amount per area.
var/liquid_reaction_progress = ((firelevel/vsc.fire_firelevel_multiplier)*0.2 + 0.05)*fuel_area*FIRE_LIQUID_BURNRATE_MULT
var/liquid_reaction_progress = (firelevel_ratio*0.2 + 0.05)*fuel_area*FIRE_LIQUID_BURNRATE_MULT
var/total_reaction_progress = gas_reaction_progress + liquid_reaction_progress
var/used_fuel = min(total_reaction_progress, reaction_limit)
var/used_oxidizers = used_fuel*(FIRE_REACTION_OXIDIZER_AMOUNT/FIRE_REACTION_FUEL_AMOUNT)
#ifdef FIREDBG
log_debug("gas_fuel = [gas_fuel], liquid_fuel = [liquid_fuel], total_oxidizers = [total_oxidizers]")
log_debug("fuel_area = [fuel_area], total_fuel = [total_fuel], reaction_limit = [reaction_limit]")
log_debug("firelevel -> [firelevel] / [vsc.fire_firelevel_multiplier]")
log_debug("liquid_reaction_progress = [liquid_reaction_progress]")
log_debug("gas_reaction_progress = [gas_reaction_progress]")
log_debug("used_fuel = [used_fuel]; used_oxidizers = [used_oxidizers]; reaction_limit=[reaction_limit]")
log_debug("total_reaction_progress = [total_reaction_progress]")
log_debug("used_fuel = [used_fuel], used_oxidizers = [used_oxidizers]; ")
#endif
//if the reaction is progressing too slow then it isn't self-sustaining anymore and burns out
@@ -297,8 +302,8 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
//*** Remove fuel and oxidizer, add carbon dioxide and heat
//remove and add gasses as calculated
var/used_gas_fuel = between(0.25, used_fuel*(gas_reaction_progress/total_reaction_progress), gas_fuel) //remove in proportion to the relative reaction progress
var/used_liquid_fuel = between(0.25, used_fuel-used_gas_fuel, liquid_fuel)
var/used_gas_fuel = min(max(0.25, used_fuel*(gas_reaction_progress/total_reaction_progress)), gas_fuel) //remove in proportion to the relative reaction progress
var/used_liquid_fuel = min(max(0.25, used_fuel-used_gas_fuel), liquid_fuel)
//remove_by_flag() and adjust_gas() handle the group_multiplier for us.
remove_by_flag(XGM_GAS_OXIDIZER, used_oxidizers)
@@ -309,10 +314,10 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
zone.remove_liquidfuel(used_liquid_fuel, !check_combustability())
//calculate the energy produced by the reaction and then set the new temperature of the mix
temperature = (starting_energy + vsc.fire_fuel_energy_release * used_fuel) / heat_capacity()
temperature = (starting_energy + vsc.fire_fuel_energy_release * (used_gas_fuel + used_liquid_fuel)) / heat_capacity()
#ifdef FIREDBG
log_debug("used_gas_fuel = [used_gas_fuel]; used_liquid_fuel = [used_liquid_fuel]; total = [used_gas_fuel+used_liquid_fuel]")
log_debug("used_gas_fuel = [used_gas_fuel]; used_liquid_fuel = [used_liquid_fuel]; total = [used_fuel]")
log_debug("new temperature = [temperature]")
#endif
@@ -353,7 +358,7 @@ datum/gas_mixture/proc/check_recombustability(list/fuel_objs)
. = 0
for(var/g in gas)
if(gas_data.flags[g] & XGM_GAS_FUEL && QUANTIZE(gas[g] * vsc.fire_consuption_rate) >= 0.1)
if(gas_data.flags[g] & XGM_GAS_FUEL && QUANTIZE(gas[g] * vsc.fire_consuption_rate) >= 0.005)
. = 1
break

View File

@@ -297,7 +297,7 @@ var/global/datum/controller/radio/radio_controller
devices_line -= null
if (devices_line.len==0)
devices -= devices_filter
qdel(devices_line)
del(devices_line)
/datum/signal
var/obj/source

View File

@@ -20,7 +20,7 @@
for(var/obj/machinery/power/apc/C in world)
if(C.cell && C.z in config.station_levels)
if(!C.is_critical && C.cell && (C.z in config.station_levels))
C.cell.charge = 0
/proc/power_restore(var/announce = 1)
@@ -29,7 +29,7 @@
if(announce)
command_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
for(var/obj/machinery/power/apc/C in world)
if(C.cell && C.z in config.station_levels)
if(C.cell && (C.z in config.station_levels))
C.cell.charge = C.cell.maxcharge
for(var/obj/machinery/power/smes/S in world)
var/area/current_area = get_area(S)

View File

@@ -399,7 +399,7 @@
imp += "[I] implanted:"
else
unknown_body++
if(unknown_body || e.hidden)
if(unknown_body)
imp += "Unknown body present:"
if(!AN && !open && !infected & !imp)

View File

@@ -10,7 +10,7 @@
var/list/mode = list("dismantle"=0,"laying"=0,"collect"=0)
/obj/machinery/floorlayer/New()
T = new/obj/item/stack/tile/plasteel(src)
T = new/obj/item/stack/tile/steel(src)
..()
/obj/machinery/floorlayer/Move(new_turf,M_Dir)

View File

@@ -13,6 +13,7 @@ obj/machinery/recharger
var/icon_state_charged = "recharger2"
var/icon_state_charging = "recharger1"
var/icon_state_idle = "recharger0" //also when unpowered
var/portable = 1
obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob)
if(istype(user,/mob/living/silicon))
@@ -45,7 +46,7 @@ obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob)
G.loc = src
charging = G
update_icon()
else if(istype(G, /obj/item/weapon/wrench))
else if(portable && istype(G, /obj/item/weapon/wrench))
if(charging)
user << "<span class='warning'>Remove [charging] first!</span>"
return
@@ -155,3 +156,4 @@ obj/machinery/recharger/wallcharger
icon_state_charged = "wrecharger2"
icon_state_charging = "wrecharger1"
icon_state_idle = "wrecharger0"
portable = 0

View File

@@ -254,7 +254,7 @@ Alien plants should do something if theres a lot of poison
/obj/effect/alien/weeds/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300)
if(exposed_temperature > 300 + T0C)
health -= 5
healthcheck()
@@ -425,7 +425,7 @@ Alien plants should do something if theres a lot of poison
Burst()
/obj/effect/alien/egg/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 500)
if(exposed_temperature > 500 + T0C)
health -= 5
healthcheck()

View File

@@ -48,7 +48,7 @@
qdel(src)
/obj/effect/spider/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300)
if(exposed_temperature > 300 + T0C)
health -= 5
healthcheck()

View File

@@ -21,7 +21,7 @@
if(istype(A, /turf/simulated/floor))
var/turf/simulated/floor/F = A
if(F.is_plasteel_floor()) // only tiled floors
if(F.is_steel_floor()) // only tiled floors
if(tile_dir_mode)
var/D = get_dir(usr, F)
if(usr.loc == F)

View File

@@ -1,7 +1,7 @@
/obj/item/stack/tile/plasteel
/obj/item/stack/tile/steel
name = "floor tile"
singular_name = "floor tile"
desc = "Those could work as a pretty decent throwing weapon"
desc = "Those could work as a pretty decent throwing weapon" //why?
icon_state = "tile"
force = 6.0
matter = list(DEFAULT_WALL_MATERIAL = 937.5)
@@ -10,23 +10,23 @@
throw_range = 20
flags = CONDUCT
/obj/item/stack/tile/plasteel/New(var/loc, var/amount=null)
/obj/item/stack/tile/steel/New(var/loc, var/amount=null)
..()
src.pixel_x = rand(1, 14)
src.pixel_y = rand(1, 14)
return
/obj/item/stack/tile/plasteel/cyborg
/obj/item/stack/tile/steel/cyborg
name = "floor tile synthesizer"
desc = "A device that makes floor tiles."
gender = NEUTER
matter = null
uses_charge = 1
charge_costs = list(250)
stacktype = /obj/item/stack/tile/plasteel
build_type = /obj/item/stack/tile/plasteel
stacktype = /obj/item/stack/tile/steel
build_type = /obj/item/stack/tile/steel
/obj/item/stack/tile/plasteel/proc/build(turf/S as turf)
/obj/item/stack/tile/steel/proc/build(turf/S as turf)
if (istype(S,/turf/space))
S.ChangeTurf(/turf/simulated/floor/plating/airless)
else

View File

@@ -26,7 +26,7 @@
throwforce = 1.0
throw_speed = 5
throw_range = 20
flags = CONDUCT
flags = 0
origin_tech = list(TECH_BIO = 1)
/*
@@ -41,7 +41,7 @@
throwforce = 1.0
throw_speed = 5
throw_range = 20
flags = CONDUCT
flags = 0
/obj/item/stack/tile/wood/cyborg
name = "wood floor tile synthesizer"
@@ -63,4 +63,4 @@
throwforce = 1.0
throw_speed = 5
throw_range = 20
flags = CONDUCT
flags = 0

View File

@@ -53,7 +53,7 @@
/obj/structure/lattice/attackby(obj/item/C as obj, mob/user as mob)
if (istype(C, /obj/item/stack/tile/plasteel))
if (istype(C, /obj/item/stack/tile/steel))
var/turf/T = get_turf(src)
T.attackby(C, user) //BubbleWrap - hand this off to the underlying turf instead
return

View File

@@ -29,7 +29,7 @@ var/list/wood_icons = list("wood","wood-broken")
/turf/simulated/floor
//Note to coders, the 'intact' var can no longer be used to determine if the floor is a plating or not.
//Use the is_plating(), is_plasteel_floor() and is_light_floor() procs instead. --Errorage
//Use the is_plating(), is_steel_floor() and is_light_floor() procs instead. --Errorage
name = "floor"
icon = 'icons/turf/floors.dmi'
icon_state = "floor"
@@ -42,7 +42,7 @@ var/list/wood_icons = list("wood","wood-broken")
var/broken = 0
var/burnt = 0
var/mineral = DEFAULT_WALL_MATERIAL
var/floor_type = /obj/item/stack/tile/plasteel
var/floor_type = /obj/item/stack/tile/steel
var/lightfloor_state // for light floors, this is the state of the tile. 0-7, 0x4 is on-bit - use the helper procs below
proc/get_lightfloor_state()
@@ -102,13 +102,23 @@ var/list/wood_icons = list("wood","wood-broken")
return
/turf/simulated/floor/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
var/temp_destroy = get_damage_temperature()
if(!burnt && prob(5))
burn_tile()
else if(prob(1) && !is_plating())
make_plating()
burn_tile()
burn_tile(exposed_temperature)
else if(temp_destroy && exposed_temperature >= (temp_destroy + 100) && prob(1) && !is_plating())
make_plating() //destroy the tile, exposing plating
burn_tile(exposed_temperature)
return
//should be a little bit lower than the temperature required to destroy the material
/turf/simulated/floor/proc/get_damage_temperature()
if(is_steel_floor()) return T0C+1400
if(is_wood_floor()) return T0C+200
if(is_carpet_floor()) return T0C+200
if(is_grass_floor()) return T0C+80
return null
/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)
@@ -122,7 +132,7 @@ var/list/wood_icons = list("wood","wood-broken")
turf/simulated/floor/proc/update_icon()
if(lava)
return
else if(is_plasteel_floor())
else if(is_steel_floor())
if(!broken && !burnt)
icon_state = icon_regular_floor
else if(is_plating())
@@ -237,8 +247,8 @@ turf/simulated/floor/proc/update_icon()
make_plating()
break_tile()
/turf/simulated/floor/is_plasteel_floor()
if(ispath(floor_type, /obj/item/stack/tile/plasteel))
/turf/simulated/floor/is_steel_floor()
if(ispath(floor_type, /obj/item/stack/tile/steel))
return 1
else
return 0
@@ -277,7 +287,7 @@ turf/simulated/floor/proc/update_icon()
if(istype(src,/turf/simulated/floor/mech_bay_recharge_floor))
src.ChangeTurf(/turf/simulated/floor/plating)
if(broken) return
if(is_plasteel_floor())
if(is_steel_floor())
src.icon_state = "damaged[pick(1,2,3,4,5)]"
broken = 1
else if(is_light_floor())
@@ -296,28 +306,38 @@ turf/simulated/floor/proc/update_icon()
src.icon_state = "sand[pick("1","2","3")]"
broken = 1
/turf/simulated/floor/proc/burn_tile()
/turf/simulated/floor/proc/burn_tile(var/exposed_temperature)
if(istype(src,/turf/simulated/floor/engine)) return
if(istype(src,/turf/simulated/floor/plating/airless/asteroid)) return//Asteroid tiles don't burn
if(broken || burnt) return
if(is_plasteel_floor())
src.icon_state = "damaged[pick(1,2,3,4,5)]"
burnt = 1
else if(is_plasteel_floor())
var/damage_temp = get_damage_temperature()
if(broken) return
if(burnt)
if(is_steel_floor() && exposed_temperature >= damage_temp) //allow upgrading from scorched tiles to damaged tiles
src.icon_state = "damaged[pick(1,2,3,4,5)]"
broken = 1
return
if(is_steel_floor() && exposed_temperature >= T0C+300) //enough to char the floor, but not hot enough to actually burn holes in it
src.icon_state = "floorscorched[pick(1,2)]"
burnt = 1
else if(is_plating())
src.icon_state = "panelscorched"
burnt = 1
else if(is_wood_floor())
src.icon_state = "wood-broken"
burnt = 1
else if(is_carpet_floor())
src.icon_state = "carpet-broken"
burnt = 1
else if(is_grass_floor())
src.icon_state = "sand[pick("1","2","3")]"
burnt = 1
else if(exposed_temperature >= damage_temp)
if(is_steel_floor())
src.icon_state = "damaged[pick(1,2,3,4,5)]"
burnt = 1
else if(is_plating())
src.icon_state = "panelscorched"
burnt = 1
else if(is_wood_floor())
src.icon_state = "wood-broken"
burnt = 1
else if(is_carpet_floor())
src.icon_state = "carpet-broken"
burnt = 1
else if(is_grass_floor())
src.icon_state = "sand[pick("1","2","3")]"
burnt = 1
//This proc will set floor_type to null and the update_icon() proc will then change the icon_state of the turf
//This proc auto corrects the grass tiles' siding.
@@ -351,13 +371,13 @@ turf/simulated/floor/proc/update_icon()
//This proc will make the turf a plasteel floor tile. The expected argument is the tile to make the turf with
//If none is given it will make a new object. dropping or unequipping must be handled before or after calling
//this proc.
/turf/simulated/floor/proc/make_plasteel_floor(var/obj/item/stack/tile/plasteel/T = null)
/turf/simulated/floor/proc/make_plasteel_floor(var/obj/item/stack/tile/steel/T = null)
broken = 0
burnt = 0
intact = 1
set_light(0)
if(T)
if(istype(T,/obj/item/stack/tile/plasteel))
if(istype(T,/obj/item/stack/tile/steel))
floor_type = T.type
if (icon_regular_floor)
icon_state = icon_regular_floor
@@ -368,7 +388,7 @@ turf/simulated/floor/proc/update_icon()
levelupdate()
return
//if you gave a valid parameter, it won't get thisf ar.
floor_type = /obj/item/stack/tile/plasteel
floor_type = /obj/item/stack/tile/steel
icon_state = "floor"
icon_regular_floor = icon_state

View File

@@ -35,10 +35,10 @@
ReplaceWithLattice()
return
if (istype(C, /obj/item/stack/tile/plasteel))
if (istype(C, /obj/item/stack/tile/steel))
var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
if(L)
var/obj/item/stack/tile/plasteel/S = C
var/obj/item/stack/tile/steel/S = C
if (S.get_amount() < 1)
return
qdel(L)

View File

@@ -2,7 +2,7 @@
icon = 'icons/turf/floors.dmi'
level = 1.0
//for floors, use is_plating(), is_plasteel_floor() and is_light_floor()
//for floors, use is_plating(), is_steel_floor() and is_light_floor()
var/intact = 1
//Properties for open tiles (/floor)
@@ -156,7 +156,7 @@
return 0
/turf/proc/is_asteroid_floor()
return 0
/turf/proc/is_plasteel_floor()
/turf/proc/is_steel_floor()
return 0
/turf/proc/is_light_floor()
return 0

View File

@@ -641,13 +641,13 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack)
if ("pirate")
M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)

View File

@@ -178,6 +178,25 @@
return ..()
// here because it's similar to below
// Returns null if no DB connection can be established, or -1 if the requested key was not found in the database
/proc/get_player_age(key)
establish_db_connection()
if(!dbcon.IsConnected())
return null
var/sql_ckey = sql_sanitize_text(ckey(key))
var/DBQuery/query = dbcon.NewQuery("SELECT datediff(Now(),firstseen) as age FROM erro_player WHERE ckey = '[sql_ckey]'")
query.Execute()
if(query.NextRow())
return text2num(query.item[1])
else
return -1
/client/proc/log_client_to_db()

View File

@@ -141,21 +141,18 @@
desc = "A pair of kitty ears. Meow!"
icon_state = "kitty"
body_parts_covered = 0
var/icon/mob
var/icon/mob2
siemens_coefficient = 1.5
item_icons = list()
update_icon(var/mob/living/carbon/human/user)
if(!istype(user)) return
mob = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty")
mob2 = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty2")
mob.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD)
mob2.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD)
var/icon/ears = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty")
ears.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD)
var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner")
var/icon/earbit2 = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner2")
mob.Blend(earbit, ICON_OVERLAY)
mob2.Blend(earbit2, ICON_OVERLAY)
ears.Blend(earbit, ICON_OVERLAY)
item_icons[icon_head] = ears
/obj/item/clothing/head/richard
name = "chicken mask"

View File

@@ -46,7 +46,7 @@
recipes += new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0)
recipes += new/datum/stack_recipe("floor tile", /obj/item/stack/tile/plasteel, 1, 4, 20)
recipes += new/datum/stack_recipe("floor tile", /obj/item/stack/tile/steel, 1, 4, 20)
recipes += new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60)
recipes += new/datum/stack_recipe("computer frame", /obj/structure/computerframe, 5, time = 25, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1)

View File

@@ -68,7 +68,7 @@ var/list/name_to_material
// Attributes
var/cut_delay = 0 // Delay in ticks when cutting through this wall.
var/radioactivity // Radiation var. Used in wall and object processing to irradiate surroundings.
var/ignition_point // Point at which the material catches on fire.
var/ignition_point // K, point at which the material catches on fire.
var/melting_point = 1800 // K, walls will take damage if they're next to a fire hotter than this
var/integrity = 150 // General-use HP value for products.
var/opacity = 1 // Is the material transparent? 0.5< makes transparent walls/doors.
@@ -247,7 +247,7 @@ var/list/name_to_material
/material/phoron
name = "phoron"
stack_type = /obj/item/stack/material/phoron
ignition_point = 100
ignition_point = PHORON_MINIMUM_BURN_TEMPERATURE
icon_base = "stone"
icon_colour = "#FC2BC5"
shard_type = SHARD_SHARD
@@ -430,7 +430,7 @@ var/list/name_to_material
name = "phoron glass"
stack_type = /obj/item/stack/material/glass/phoronglass
flags = MATERIAL_BRITTLE
ignition_point = 300
ignition_point = PHORON_MINIMUM_BURN_TEMPERATURE+300
integrity = 200 // idk why but phoron windows are strong, so.
icon_colour = "#FC2BC5"
stack_origin_tech = list(TECH_MATERIAL = 3, TECH_PHORON = 2)
@@ -459,6 +459,7 @@ var/list/name_to_material
icon_colour = "#CCCCCC"
hardness = 10
weight = 12
melting_point = T0C+371 //assuming heat resistant plastic
stack_origin_tech = list(TECH_MATERIAL = 3)
/material/plastic/holographic
@@ -521,6 +522,8 @@ var/list/name_to_material
shard_can_repair = 0 // you can't weld splinters back into planks
hardness = 15
weight = 18
melting_point = T0C+300 //okay, not melting in this case, but hot enough to destroy wood
ignition_point = T0C+288
stack_origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1)
dooropen_noise = 'sound/effects/doorcreaky.ogg'
door_icon_base = "wood"
@@ -542,6 +545,8 @@ var/list/name_to_material
icon_colour = "#AAAAAA"
hardness = 1
weight = 1
ignition_point = T0C+232 //"the temperature at which book-paper catches fire, and burns." close enough
melting_point = T0C+232 //temperature at which cardboard walls would be destroyed
stack_origin_tech = list(TECH_MATERIAL = 1)
door_icon_base = "wood"
destruction_desc = "crumples"
@@ -550,6 +555,8 @@ var/list/name_to_material
name = "cloth"
stack_origin_tech = list(TECH_MATERIAL = 2)
door_icon_base = "wood"
ignition_point = T0C+232
melting_point = T0C+300
flags = MATERIAL_PADDING
/material/cult
@@ -578,6 +585,7 @@ var/list/name_to_material
icon_colour = "#E85DD8"
dooropen_noise = 'sound/effects/attackblob.ogg'
door_icon_base = "resin"
melting_point = T0C+300
/material/resin/can_open_material_door(var/mob/living/user)
var/mob/living/carbon/M = user
@@ -591,6 +599,8 @@ var/list/name_to_material
icon_colour = "#5C4831"
stack_origin_tech = list(TECH_MATERIAL = 2)
flags = MATERIAL_PADDING
ignition_point = T0C+300
melting_point = T0C+300
/material/carpet
name = "carpet"
@@ -598,12 +608,16 @@ var/list/name_to_material
use_name = "red upholstery"
icon_colour = "#DA020A"
flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300
/material/cotton
name = "cotton"
display_name ="cotton"
icon_colour = "#FFFFFF"
flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300
/material/cloth_teal
name = "teal"
@@ -611,6 +625,8 @@ var/list/name_to_material
use_name = "teal cloth"
icon_colour = "#00EAFA"
flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300
/material/cloth_black
name = "black"
@@ -618,6 +634,8 @@ var/list/name_to_material
use_name = "black cloth"
icon_colour = "#505050"
flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300
/material/cloth_green
name = "green"
@@ -625,6 +643,8 @@ var/list/name_to_material
use_name = "green cloth"
icon_colour = "#01C608"
flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300
/material/cloth_puple
name = "purple"
@@ -632,6 +652,8 @@ var/list/name_to_material
use_name = "purple cloth"
icon_colour = "#9C56C4"
flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300
/material/cloth_blue
name = "blue"
@@ -639,6 +661,8 @@ var/list/name_to_material
use_name = "blue cloth"
icon_colour = "#6B6FE3"
flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300
/material/cloth_beige
name = "beige"
@@ -646,6 +670,8 @@ var/list/name_to_material
use_name = "beige cloth"
icon_colour = "#E8E7C8"
flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300
/material/cloth_lime
name = "lime"
@@ -653,3 +679,5 @@ var/list/name_to_material
use_name = "lime cloth"
icon_colour = "#62E36C"
flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300

View File

@@ -150,7 +150,7 @@
if(!target && amount < maxAmount && eattiles || maketiles) // Eat tiles
if(eattiles)
for(var/obj/item/stack/tile/plasteel/T in view(src))
for(var/obj/item/stack/tile/steel/T in view(src))
if(T in ignorelist)
continue
target = T
@@ -217,7 +217,7 @@
if(A && (locate(/obj/structure/lattice, A) && building == 1 || !locate(/obj/structure/lattice, A) && building == 2)) // Make sure that it still needs repairs
var/obj/item/I
if(building == 1)
I = new /obj/item/stack/tile/plasteel(src)
I = new /obj/item/stack/tile/steel(src)
else
I = PoolOrNew(/obj/item/stack/rods, src)
A.attackby(I, src)
@@ -232,14 +232,14 @@
visible_message("<span class='notice'>[src] begins to improve the floor.</span>")
if(do_after(src, 50))
if(!F.floor_type)
var/obj/item/stack/tile/plasteel/T = new /obj/item/stack/tile/plasteel(src)
var/obj/item/stack/tile/steel/T = new /obj/item/stack/tile/steel(src)
F.attackby(T, src)
addTiles(-1)
target = null
repairing = 0
update_icons()
else if(istype(A, /obj/item/stack/tile/plasteel) && amount < maxAmount)
var/obj/item/stack/tile/plasteel/T = A
else if(istype(A, /obj/item/stack/tile/steel) && amount < maxAmount)
var/obj/item/stack/tile/steel/T = A
visible_message("<span class='notice'>[src] begins to collect tiles.</span>")
repairing = 1
update_icons()
@@ -271,7 +271,7 @@
new /obj/item/device/assembly/prox_sensor(Tsec)
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
var/obj/item/stack/tile/plasteel/T = new /obj/item/stack/tile/plasteel(Tsec)
var/obj/item/stack/tile/steel/T = new /obj/item/stack/tile/steel(Tsec)
T.amount = amount
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
@@ -287,8 +287,8 @@
/* Assembly */
/obj/item/weapon/storage/toolbox/mechanical/attackby(var/obj/item/stack/tile/plasteel/T, mob/user as mob)
if(!istype(T, /obj/item/stack/tile/plasteel))
/obj/item/weapon/storage/toolbox/mechanical/attackby(var/obj/item/stack/tile/steel/T, mob/user as mob)
if(!istype(T, /obj/item/stack/tile/steel))
..()
return
if(contents.len >= 1)

View File

@@ -381,7 +381,8 @@
/mob/living/carbon/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
bodytemperature = max(bodytemperature, BODYTEMP_HEAT_DAMAGE_LIMIT+10)
var/temp_inc = max(BODYTEMP_HEATING_MAX*(1-get_heat_protection()), 0)
bodytemperature = min(bodytemperature + temp_inc, exposed_temperature)
/mob/living/carbon/can_use_hands()
if(handcuffed)

View File

@@ -962,11 +962,18 @@
spawn(rand(20,50))
client.dir = 1
if(hallucination<=2)
hallucination = 0
halloss = 0
else
hallucination -= 2
if(hallucination)
if(hallucination >= 20)
if(prob(3))
fake_attack(src)
if(!handling_hal)
spawn handle_hallucinations() //The not boring kind!
if(client && prob(5))
client.dir = pick(2,4,8)
var/client/C = client
spawn(rand(20,50))
if(C)
C.dir = 1
else
for(var/atom/a in hallucinations)

View File

@@ -636,17 +636,24 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/update_inv_head(var/update_icons=1)
if(head)
head.screen_loc = ui_head //TODO
var/image/standing
if(istype(head,/obj/item/clothing/head/kitty))
standing = image("icon" = head:mob)
else
if(head.icon_override)
standing = image("icon" = head.icon_override, "icon_state" = "[head.icon_state]")
else if(head.sprite_sheets && head.sprite_sheets[species.name])
standing = image("icon" = head.sprite_sheets[species.name], "icon_state" = "[head.icon_state]")
else
standing = image("icon" = 'icons/mob/head.dmi', "icon_state" = "[head.icon_state]")
//Determine the icon to use
var/t_icon = INV_HEAD_DEF_ICON
if(head.icon_override)
t_icon = head.icon_override
else if(head.sprite_sheets && head.sprite_sheets[species.name])
t_icon = head.sprite_sheets[species.name]
else if(head.item_icons && (icon_head in head.item_icons))
t_icon = head.item_icons[icon_head]
//Determine the state to use
var/t_state = head.icon_state
if(head.item_state)
t_state = head.item_state
//Create the image
var/image/standing = image(icon = t_icon, icon_state = t_state)
if(head.blood_DNA)
var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "helmetblood")
bloodsies.color = head.blood_color

View File

@@ -239,6 +239,12 @@
adjust_fire_stacks(2)
IgniteMob()
/mob/living/proc/get_cold_protection()
return 0
/mob/living/proc/get_heat_protection()
return 0
//Finds the effective temperature that the mob is burning at.
/mob/living/proc/fire_burn_temperature()
if (fire_stacks <= 0)

View File

@@ -271,9 +271,10 @@
if(ishuman(holder))
var/mob/living/carbon/human/H = holder
for(var/obj/item/organ/external/affecting in H.organs)
if(affecting.hidden == card)
if(card in affecting.implants)
affecting.take_damage(rand(30,50))
H.visible_message("<span class='danger'>\The [src] explodes out of \the [H]'s [affecting.name][(affecting.status & ORGAN_ROBOT) ? " in a shower of gore" : ""]!</span>")
affecting.implants -= card
H.visible_message("<span class='danger'>\The [src] explodes out of \the [H]'s [affecting.name] in shower of gore!</span>")
break
holder.drop_from_inventory(card)
else if(istype(card.loc,/obj/item/device/pda))

View File

@@ -372,7 +372,7 @@ var/global/list/robot_modules = list(
C.synths = list(wire)
src.modules += C
var/obj/item/stack/tile/plasteel/cyborg/S = new /obj/item/stack/tile/plasteel/cyborg(src)
var/obj/item/stack/tile/steel/cyborg/S = new /obj/item/stack/tile/steel/cyborg(src)
S.synths = list(metal)
src.modules += S
@@ -695,7 +695,7 @@ var/global/list/robot_modules = list(
C.synths = list(wire)
src.modules += C
var/obj/item/stack/tile/plasteel/cyborg/S = new /obj/item/stack/tile/plasteel/cyborg(src)
var/obj/item/stack/tile/steel/cyborg/S = new /obj/item/stack/tile/steel/cyborg(src)
S.synths = list(metal)
src.modules += S

View File

@@ -190,7 +190,10 @@ datum/preferences
qdel(I)
var/jobflag
var/dept
if(job_civilian_high)
if (job_civilian_low & ASSISTANT)
jobflag = job_civilian_low
dept = CIVILIAN
else if(job_civilian_high)
jobflag = job_civilian_high
dept = CIVILIAN
else if (job_medsci_high)
@@ -199,7 +202,6 @@ datum/preferences
else if (job_engsec_high)
jobflag = job_engsec_high
dept = ENGSEC
if(jobflag && dept && job_master)
for (var/datum/job/J in job_master.occupations)
if((J.department_flag & dept) && (J.flag & jobflag))

View File

@@ -2,6 +2,7 @@
//Having them here also makes for a nice reference list of the various overlay-updating procs available
//default item on-mob icons
#define INV_HEAD_DEF_ICON 'icons/mob/head.dmi'
#define INV_BACK_DEF_ICON 'icons/mob/back.dmi'
#define INV_L_HAND_DEF_ICON 'icons/mob/items/lefthand.dmi'
#define INV_R_HAND_DEF_ICON 'icons/mob/items/righthand.dmi'

View File

@@ -42,7 +42,6 @@
var/cavity = 0
var/sabotaged = 0 // If a prosthetic limb is emagged, it will detonate when it fails.
var/encased // Needs to be opened with a saw to access the organs.
var/obj/item/hidden = null
var/list/implants = list()
var/wound_update_accuracy = 1 // how often wounds should be updated, a higher number means less often
var/joint = "joint" // Descriptive string used in dislocation.

View File

@@ -8,6 +8,7 @@
gender = PLURAL
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "paper"
item_state = "paper"
throwforce = 0
w_class = 1.0
throw_range = 1

View File

@@ -165,7 +165,7 @@
explosion(src.loc,1,2,4)
else if (reagents.total_volume > 100)
explosion(src.loc,0,1,3)
else
else if (reagents.total_volume > 50)
explosion(src.loc,-1,1,2)
if(src)
qdel(src)

View File

@@ -120,8 +120,9 @@
var/closing = 0
/datum/computer/file/embedded_program/docking/simple/escape_pod/proc/arm()
armed = 1
open_door()
if(!armed)
armed = 1
open_door()
/datum/computer/file/embedded_program/docking/simple/escape_pod/receive_user_command(command)

View File

@@ -28,7 +28,7 @@
/obj/item/weapon/scalpel/laser1 = 75, \
/obj/item/weapon/melee/energy/sword = 5
)
priority = 2
min_duration = 90
max_duration = 110
@@ -69,7 +69,7 @@
allowed_tools = list(
/obj/item/weapon/scalpel/manager = 100
)
priority = 2
min_duration = 80
max_duration = 120

View File

@@ -51,7 +51,7 @@
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && !affected.cavity && !affected.hidden
return affected && !affected.cavity
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -106,7 +106,15 @@
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && !istype(user,/mob/living/silicon/robot) && !affected.hidden && affected.cavity && tool.w_class <= get_max_wclass(affected)
if(istype(user,/mob/living/silicon/robot))
return
if(affected && affected.cavity)
var/total_volume = tool.w_class
for(var/obj/item/I in affected.implants)
if(istype(I,/obj/item/weapon/implant))
continue
total_volume += I.w_class
return total_volume <= get_max_wclass(affected)
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -126,8 +134,8 @@
affected.wounds += I
affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1)
user.drop_item()
affected.hidden = tool
tool.loc = target
affected.implants += tool
tool.loc = affected
affected.cavity = 0
//////////////////////////////////////////////////////////////////
@@ -162,7 +170,7 @@
if (affected.implants.len)
var/obj/item/obj = affected.implants[1]
var/obj/item/obj = pick(affected.implants)
if(istype(obj,/obj/item/weapon/implant))
var/obj/item/weapon/implant/imp = obj
@@ -189,6 +197,8 @@
worm.leave_host()
else
obj.loc = get_turf(target)
obj.add_blood(target)
obj.update_icon()
if(istype(obj,/obj/item/weapon/implant))
var/obj/item/weapon/implant/imp = obj
imp.imp_in = null
@@ -196,16 +206,6 @@
else
user.visible_message("\blue [user] removes \the [tool] from [target]'s [affected.name].", \
"\blue There's something inside [target]'s [affected.name], but you just missed it this time." )
else if (affected.hidden)
user.visible_message("\blue [user] takes something out of [target]'s [affected.name] with \the [tool].", \
"\blue You take something out of [target]'s [affected.name]s with \the [tool]." )
affected.hidden.loc = get_turf(target)
if(!affected.hidden.blood_DNA)
affected.hidden.blood_DNA = list()
affected.hidden.blood_DNA[target.dna.unique_enzymes] = target.dna.b_type
affected.hidden.update_icon()
affected.hidden = null
else
user.visible_message("\blue [user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out.", \
"\blue You could not find anything inside [target]'s [affected.name]." )

View File

@@ -232,6 +232,7 @@
gas[g] = gas[g] * (1 - ratio)
removed.temperature = temperature
removed.volume = volume * group_multiplier / out_group_multiplier
update_values()
removed.update_values()

View File

@@ -179,9 +179,10 @@ var/world_topic_spam_protect_time = world.timeofday
return "Bad Key"
var/client/C
var/req_ckey = ckey(input["adminmsg"])
for(var/client/K in clients)
if(K.ckey == input["adminmsg"])
if(K.ckey == req_ckey)
C = K
break
if(!C)
@@ -222,10 +223,28 @@ var/world_topic_spam_protect_time = world.timeofday
world_topic_spam_protect_ip = addr
return "Bad Key"
return show_player_info_irc(input["notes"])
return show_player_info_irc(ckey(input["notes"]))
else if(copytext(T,1,4) == "age")
var/input[] = params2list(T)
if(input["key"] != config.comms_password)
if(world_topic_spam_protect_ip == addr && abs(world_topic_spam_protect_time - world.time) < 50)
spawn(50)
world_topic_spam_protect_time = world.time
return "Bad Key (Throttled)"
world_topic_spam_protect_time = world.time
world_topic_spam_protect_ip = addr
return "Bad Key"
var/age = get_player_age(input["age"])
if(isnum(age))
if(age >= 0)
return "[age]"
else
return "Ckey not found"
else
return "Database connection failed or not set up"
/world/Reboot(var/reason)

View File

@@ -60,6 +60,29 @@
<h3 class="author">PsiOmegaDelta updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">The traitor uplink no longer displays all items in a long list, instead has categories which when accessed shows the relevant items.</li>
<h2 class="date">24 June 2015</h2>
<h3 class="author">HarpyEagle updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixed Tajaran name generation producing names without a space between first and last.</li>
<li class="wip">Adds docking to the mercenary shuttle. Works similarly to other shuttles, except docking and undocking is manually initiated and not automatic. A system to approve or deny dock requests still to be implemented.</li>
<li class="rscadd">Toolboxes can now hold larger items, such as stacks of metal or power cells, at the cost of having less space for other things.</li>
<li class="tweak">Gloves/shoes can now be worn even if you have one hand/foot missing. The other one still has to be present, of course. The items still drop when you first lose the hand/foot.</li>
<li class="tweak">Budget insulated gloves are somewhat less useless. On average, they will stop half the damage from getting shocked, and the worst case insulation is not as bad as it used to be. Budget gloves that are as good as regular insulated gloves are still as rare as they were before though.</li>
<li class="tweak">PTR bullets are now hitscan, to make them somewhat better for actual sniping.</li>
<li class="maptweak">The telecoms server room now has an actual cycling airlock into it.</li>
<li class="tweak">Non-vital body parts will no longer take further damage above a certain amount, and will inflict paincrit effects instead. On most humaniods the head, chest, and groin are vital.</li>
<li class="rscadd">Engineers now spawn with industrial workboots (credit: ChessPiece/Bishop).</li>
<li class="bugfix">Damaged robotic legs now more likely to have an effect.</li>
<li class="bugfix">Fixed bug preventing internal organs from taking damage in some cases.</li>
<li class="maptweak">New flavours of tables around the station. Engineering starts with more plastic.</li>
<li class="bugfix">Fixed worn items not appearing in some cases. Most notably crossbows and certain guns when worn on the back. As a side effect, laundry machines no longer transform items.</li>
<li class="bugfix">Crit oxyloss now runs in game time instead of real time. So if lag is slowing your movement the same slowdown applies to the dying person you're trying to reach.</li>
<li class="rscadd">Breathmasks can now be adjusted by clicking on them in your hand, in addition to the verb.</li>
<li class="rscadd">Wearing a space helmet or similar face-covering gear now prevents eating and force-feeding food, drink, and pills.</li>
<li class="rscadd">Phoron in air ignites above it's flashpoint temperature and a certain (very small) minimum concentration. Environments that have oxygen and are hot enough, and have phoron but not enough concentration to burn will produce flareouts, which are mostly a visual effect.</li>
<li class="rscadd">Adds animation when making unarmed attacks or attacking with melee weapons, to help make it clearer who is attacking.</li>
<li class="soundadd">Opening an unpowered door now has an appropriate sound.</li>
<li class="rscadd">Ingesting diseased blood may contract the disease.</li>
</ul>
<h2 class="date">19 June 2015</h2>

View File

@@ -2052,3 +2052,4 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
to help make it clearer who is attacking.
- soundadd: Opening an unpowered door now has an appropriate sound.
- rscadd: Ingesting diseased blood may contract the disease.
2015-06-26: {}

View File

@@ -29,7 +29,7 @@
"aC" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/obj/structure/window/basic{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter)
"aD" = (/obj/structure/table/reinforced,/obj/item/stack/material/plasteel{amount = 50},/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter)
"aE" = (/obj/structure/table/reinforced,/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter)
"aF" = (/obj/structure/table/reinforced,/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/random/tech_supply,/obj/machinery/camera/motion/engineering_outpost,/turf/simulated/floor,/area/constructionsite/teleporter)
"aF" = (/obj/structure/table/reinforced,/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/random/tech_supply,/obj/machinery/camera/motion/engineering_outpost{c_tag = "Construction Site Teleporter"},/turf/simulated/floor,/area/constructionsite/teleporter)
"aG" = (/obj/structure/table/reinforced,/obj/random/powercell,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter)
"aH" = (/obj/machinery/shieldgen,/obj/structure/window/basic{tag = "icon-window (WEST)"; icon_state = "window"; dir = 8},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter)
"aI" = (/obj/machinery/shieldgen,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter)