Merge branch 'bleeding-edge-freeze' of https://github.com/Baystation12/Baystation12 into bleeding-edge-freeze

This commit is contained in:
Whitellama
2013-06-24 21:48:33 -07:00
76 changed files with 2416 additions and 1754 deletions
+9 -4
View File
@@ -389,6 +389,7 @@
#include "code\game\machinery\doors\checkForMultipleDoors.dm"
#include "code\game\machinery\doors\door.dm"
#include "code\game\machinery\doors\firedoor.dm"
#include "code\game\machinery\doors\multi_tile.dm"
#include "code\game\machinery\doors\poddoor.dm"
#include "code\game\machinery\doors\shutters.dm"
#include "code\game\machinery\doors\unpowered.dm"
@@ -461,6 +462,7 @@
#include "code\game\objects\effects\decals\crayon.dm"
#include "code\game\objects\effects\decals\misc.dm"
#include "code\game\objects\effects\decals\remains.dm"
#include "code\game\objects\effects\decals\warning_stripes.dm"
#include "code\game\objects\effects\decals\Cleanable\aliens.dm"
#include "code\game\objects\effects\decals\Cleanable\fuel.dm"
#include "code\game\objects\effects\decals\Cleanable\humans.dm"
@@ -731,10 +733,6 @@
#include "code\modules\awaymissions\pamphlet.dm"
#include "code\modules\awaymissions\trigger.dm"
#include "code\modules\awaymissions\zlevel.dm"
#include "code\modules\awaymissions\maploader\dmm_suite.dm"
#include "code\modules\awaymissions\maploader\reader.dm"
#include "code\modules\awaymissions\maploader\swapmaps.dm"
#include "code\modules\awaymissions\maploader\writer.dm"
#include "code\modules\client\client defines.dm"
#include "code\modules\client\client procs.dm"
#include "code\modules\client\preferences.dm"
@@ -832,6 +830,10 @@
#include "code\modules\library\lib_machines.dm"
#include "code\modules\library\lib_readme.dm"
#include "code\modules\liquid\splash_simulation.dm"
#include "code\modules\maps\dmm_suite.dm"
#include "code\modules\maps\reader.dm"
#include "code\modules\maps\swapmaps.dm"
#include "code\modules\maps\writer.dm"
#include "code\modules\mining\machine_input_output_plates.dm"
#include "code\modules\mining\machine_processing.dm"
#include "code\modules\mining\machine_stacking.dm"
@@ -984,6 +986,7 @@
#include "code\modules\mob\living\silicon\pai\recruit.dm"
#include "code\modules\mob\living\silicon\pai\say.dm"
#include "code\modules\mob\living\silicon\pai\software.dm"
#include "code\modules\mob\living\silicon\robot\component.dm"
#include "code\modules\mob\living\silicon\robot\death.dm"
#include "code\modules\mob\living\silicon\robot\emote.dm"
#include "code\modules\mob\living\silicon\robot\examine.dm"
@@ -993,6 +996,7 @@
#include "code\modules\mob\living\silicon\robot\life.dm"
#include "code\modules\mob\living\silicon\robot\login.dm"
#include "code\modules\mob\living\silicon\robot\robot.dm"
#include "code\modules\mob\living\silicon\robot\robot_damage.dm"
#include "code\modules\mob\living\silicon\robot\robot_items.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
@@ -1123,6 +1127,7 @@
#include "code\modules\reagents\Chemistry-Reagents-Antidepressants.dm"
#include "code\modules\reagents\Chemistry-Reagents.dm"
#include "code\modules\reagents\Chemistry-Recipes.dm"
#include "code\modules\reagents\dartgun.dm"
#include "code\modules\reagents\grenade_launcher.dm"
#include "code\modules\reagents\reagent_containers.dm"
#include "code\modules\reagents\reagent_dispenser.dm"
+1 -1
View File
@@ -1,6 +1,6 @@
/obj/item/weapon/circuitboard/atmoscontrol
name = "\improper Central Atmospherics Computer Circuitboard"
build_path = "/obj/machinery/computer/security/atmoscontrol"
build_path = /obj/machinery/computer/atmoscontrol
/obj/machinery/computer/atmoscontrol
name = "\improper Central Atmospherics Computer"
+2 -2
View File
@@ -188,7 +188,7 @@ connection
//If there are more than one connection, decrement the number of connections
//Otherwise, remove all connections between the zones.
if(zone_2 in zone_1.connected_zones)
if(zone_2 in zone_1.closed_connection_zones)
if(zone_1.closed_connection_zones[zone_2] > 1)
zone_1.closed_connection_zones[zone_2]--
else
@@ -198,7 +198,7 @@ connection
zone_1.closed_connection_zones = null
//Then do the same for the other zone.
if(zone_1 in zone_2.connected_zones)
if(zone_1 in zone_2.closed_connection_zones)
if(zone_2.closed_connection_zones[zone_1] > 1)
zone_2.closed_connection_zones[zone_1]--
else
+43 -34
View File
@@ -3,16 +3,15 @@ client/proc/Zone_Info(turf/T as null|turf)
set category = "Debug"
if(T)
if(T.zone)
T.zone.DebugDisplay(mob)
T.zone.DebugDisplay(src)
else
mob << "No zone here."
else
for(T in world)
T.overlays -= 'debug_space.dmi'
T.overlays -= 'debug_group.dmi'
T.overlays -= 'debug_connect.dmi'
if(zone_debug_images)
images -= zone_debug_images
zone_debug_images = null
client/var/list/zone_debug_images
client/proc/Test_ZAS_Connection(var/turf/simulated/T as turf)
set category = "Debug"
@@ -57,50 +56,60 @@ client/proc/Test_ZAS_Connection(var/turf/simulated/T as turf)
zone/proc
DebugDisplay(mob/M)
DebugDisplay(client/client)
if(!istype(client))
return
if(!dbg_output)
dbg_output = 1 //Don't want to be spammed when someone investigates a zone...
if(!client.zone_debug_images)
client.zone_debug_images = list()
for(var/turf/T in contents)
T.overlays += 'debug_group.dmi'
client.zone_debug_images += image('debug_group.dmi', T)
for(var/turf/space/S in unsimulated_tiles)
S.overlays += 'debug_space.dmi'
client.zone_debug_images += image('debug_space.dmi', S)
M << "<u>Zone Air Contents</u>"
M << "Oxygen: [air.oxygen]"
M << "Nitrogen: [air.nitrogen]"
M << "Plasma: [air.toxins]"
M << "Carbon Dioxide: [air.carbon_dioxide]"
M << "Temperature: [air.temperature]"
M << "Heat Energy: [air.temperature * air.heat_capacity()]"
M << "Pressure: [air.return_pressure()]"
M << ""
M << "Space Tiles: [length(unsimulated_tiles)]"
M << "Movable Objects: [length(movables())]"
M << "<u>Connections: [length(connections)]</u>"
client << "<u>Zone Air Contents</u>"
client << "Oxygen: [air.oxygen]"
client << "Nitrogen: [air.nitrogen]"
client << "Plasma: [air.toxins]"
client << "Carbon Dioxide: [air.carbon_dioxide]"
client << "Temperature: [air.temperature] K"
client << "Heat Energy: [air.temperature * air.heat_capacity()] J"
client << "Pressure: [air.return_pressure()] KPa"
client << ""
client << "Space Tiles: [length(unsimulated_tiles)]"
client << "Movable Objects: [length(movables())]"
client << "<u>Connections: [length(connections)]</u>"
for(var/connection/C in connections)
M << "[C.A] --> [C.B] [(C.indirect?"Open":"Closed")]"
C.A.overlays += 'debug_connect.dmi'
C.B.overlays += 'debug_connect.dmi'
client << "\ref[C] [C.A] --> [C.B] [(C.indirect?"Open":"Closed")]"
client.zone_debug_images += image('debug_connect.dmi', C.A)
client.zone_debug_images += image('debug_connect.dmi', C.B)
client << "Connected Zones:"
for(var/zone/zone in connected_zones)
client << "\ref[zone] [zone] - [connected_zones[zone]] (Connected)"
for(var/zone/zone in closed_connection_zones)
client << "\ref[zone] [zone] - [closed_connection_zones[zone]] (Unconnected)"
for(var/C in connections)
if(!istype(C,/connection))
M << "[C] (Not Connection!)"
client << "[C] (Not Connection!)"
client.images += client.zone_debug_images
else
dbg_output = 0
for(var/turf/T in contents)
T.overlays -= 'debug_group.dmi'
client.images -= client.zone_debug_images
client.zone_debug_images = null
for(var/turf/space/S in unsimulated_tiles)
S.overlays -= 'debug_space.dmi'
for(var/connection/C in connections)
C.A.overlays -= 'debug_connect.dmi'
C.B.overlays -= 'debug_connect.dmi'
for(var/zone/Z in zones)
if(Z.air == air && Z != src)
var/turf/zloc = pick(Z.contents)
M << "\red Illegal air datum shared by: [zloc.loc.name]"
client << "\red Illegal air datum shared by: [zloc.loc.name]"
+2 -1
View File
@@ -51,7 +51,8 @@ datum/controller/game_controller/New()
datum/controller/game_controller/proc/setup()
world.tick_lag = config.Ticklag
createRandomZlevel()
spawn(20)
createRandomZlevel()
if(!air_master)
air_master = new /datum/controller/air_system()
+12 -7
View File
@@ -7,8 +7,9 @@
manifest_inject(H)
return
/obj/effect/datacore/proc/manifest_modify(var/name, var/assignment, var/alt_title = null)
/obj/effect/datacore/proc/manifest_modify(var/name, var/assignment)
var/datum/data/record/foundrecord
var/real_title = assignment
for(var/datum/data/record/t in data_core.general)
if (t)
@@ -16,14 +17,18 @@
foundrecord = t
break
var/list/all_jobs = get_job_datums()
for(var/datum/job/J in all_jobs)
var/list/alttitles = get_alternate_titles(J.title)
if(!J) continue
if(assignment in alttitles)
real_title = J.title
break
if(foundrecord)
foundrecord.fields["rank"] = assignment
if(alt_title)
foundrecord.fields["real_rank"] = alt_title
else
foundrecord.fields["real_rank"] = assignment
foundrecord.fields["real_rank"] = real_title
/obj/effect/datacore/proc/manifest_inject(var/mob/living/carbon/human/H)
if(H.mind && (H.mind.assigned_role != "MODE"))
@@ -106,7 +106,10 @@
src << "<span class='notice'>We stab [T] with the proboscis.</span>"
src.visible_message("<span class='danger'>[src] stabs [T] with the proboscis!</span>")
T << "<span class='danger'>You feel a sharp stabbing pain!</span>"
T.take_overall_damage(40)
var/datum/organ/external/affecting = T.get_organ(src.zone_sel.selecting)
if(affecting.take_damage(39,0,1,"large organic needle"))
T:UpdateDamageIcon()
continue
feedback_add_details("changeling_powers","A[stage]")
if(!do_mob(src, T, 150))
+23
View File
@@ -117,3 +117,26 @@ var/list/nonhuman_positions = list(
/proc/guest_jobbans(var/job)
return ((job in command_positions) || (job in nonhuman_positions) || (job in security_positions))
/proc/get_job_datums()
var/list/occupations = list()
var/list/all_jobs = typesof(/datum/job)
for(var/A in all_jobs)
var/datum/job/job = new A()
if(!job) continue
occupations += job
return occupations
/proc/get_alternate_titles(var/job)
var/list/jobs = get_job_datums()
var/list/titles = list()
for(var/datum/job/J in jobs)
if(!J) continue
if(J.title == job)
titles = J.alt_titles
return titles
@@ -96,6 +96,36 @@
if(target)
loadProgram(target)
else if(href_list["desert"])
target = locate(/area/holodeck/source_desert)
if(target)
loadProgram(target)
else if(href_list["space"])
target = locate(/area/holodeck/source_space)
if(target)
loadProgram(target)
else if(href_list["picnicarea"])
target = locate(/area/holodeck/source_picnicarea)
if(target)
loadProgram(target)
else if(href_list["snowfield"])
target = locate(/area/holodeck/source_snowfield)
if(target)
loadProgram(target)
else if(href_list["theatre"])
target = locate(/area/holodeck/source_theatre)
if(target)
loadProgram(target)
else if(href_list["meetinghall"])
target = locate(/area/holodeck/source_meetinghall)
if(target)
loadProgram(target)
else if(href_list["turnoff"])
target = locate(/area/holodeck/source_plating)
if(target)
+71 -104
View File
@@ -86,7 +86,8 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
var/list/signalers[12]
var/lockdownbyai = 0
autoclose = 1
var/doortype = 0
var/assembly_type = /obj/structure/door_assembly
var/mineral = null
var/justzap = 0
var/safe = 1
normalspeed = 1
@@ -96,125 +97,116 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
/obj/machinery/door/airlock/command
name = "Airlock"
icon = 'icons/obj/doors/Doorcom.dmi'
doortype = 1
assembly_type = /obj/structure/door_assembly/door_assembly_com
/obj/machinery/door/airlock/security
name = "Airlock"
icon = 'icons/obj/doors/Doorsec.dmi'
doortype = 2
assembly_type = /obj/structure/door_assembly/door_assembly_sec
/obj/machinery/door/airlock/engineering
name = "Airlock"
icon = 'icons/obj/doors/Dooreng.dmi'
doortype = 3
assembly_type = /obj/structure/door_assembly/door_assembly_eng
/obj/machinery/door/airlock/medical
name = "Airlock"
icon = 'icons/obj/doors/Doormed.dmi'
doortype = 4
assembly_type = /obj/structure/door_assembly/door_assembly_med
/obj/machinery/door/airlock/maintenance
name = "Maintenance Access"
icon = 'icons/obj/doors/Doormaint.dmi'
doortype = 5
assembly_type = /obj/structure/door_assembly/door_assembly_mai
/obj/machinery/door/airlock/external
name = "External Airlock"
icon = 'icons/obj/doors/Doorext.dmi'
doortype = 6
assembly_type = /obj/structure/door_assembly/door_assembly_ext
/obj/machinery/door/airlock/glass
name = "Glass Airlock"
icon = 'icons/obj/doors/Doorglass.dmi'
opacity = 0
doortype = 7
glass = 1
/obj/machinery/door/airlock/centcom
name = "Airlock"
icon = 'icons/obj/doors/Doorele.dmi'
opacity = 0
doortype = 8
/obj/machinery/door/airlock/vault
name = "Vault"
icon = 'icons/obj/doors/vault.dmi'
opacity = 1
doortype = 9
/obj/machinery/door/airlock/glass_large
name = "Glass Airlock"
icon = 'icons/obj/doors/Door2x1glassfull.dmi'
opacity = 0
doortype = 10
glass = 1
assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites.
/obj/machinery/door/airlock/freezer
name = "Freezer Airlock"
icon = 'icons/obj/doors/Doorfreezer.dmi'
opacity = 1
doortype = 11
assembly_type = /obj/structure/door_assembly/door_assembly_fre
/obj/machinery/door/airlock/hatch
name = "Airtight Hatch"
icon = 'icons/obj/doors/Doorhatchele.dmi'
opacity = 1
doortype = 12
assembly_type = /obj/structure/door_assembly/door_assembly_hatch
/obj/machinery/door/airlock/maintenance_hatch
name = "Maintenance Hatch"
icon = 'icons/obj/doors/Doorhatchmaint2.dmi'
opacity = 1
doortype = 13
assembly_type = /obj/structure/door_assembly/door_assembly_mhatch
/obj/machinery/door/airlock/glass_command
name = "Maintenance Hatch"
icon = 'icons/obj/doors/Doorcomglass.dmi'
opacity = 0
doortype = 14
assembly_type = /obj/structure/door_assembly/door_assembly_com
glass = 1
/obj/machinery/door/airlock/glass_engineering
name = "Maintenance Hatch"
icon = 'icons/obj/doors/Doorengglass.dmi'
opacity = 0
doortype = 15
assembly_type = /obj/structure/door_assembly/door_assembly_eng
glass = 1
/obj/machinery/door/airlock/glass_security
name = "Maintenance Hatch"
icon = 'icons/obj/doors/Doorsecglass.dmi'
opacity = 0
doortype = 16
assembly_type = /obj/structure/door_assembly/door_assembly_sec
glass = 1
/obj/machinery/door/airlock/glass_medical
name = "Maintenance Hatch"
icon = 'icons/obj/doors/Doormedglass.dmi'
opacity = 0
doortype = 17
assembly_type = /obj/structure/door_assembly/door_assembly_med
glass = 1
/obj/machinery/door/airlock/mining
name = "Mining Airlock"
icon = 'icons/obj/doors/Doormining.dmi'
doortype = 18
assembly_type = /obj/structure/door_assembly/door_assembly_min
/obj/machinery/door/airlock/atmos
name = "Atmospherics Airlock"
icon = 'icons/obj/doors/Dooratmo.dmi'
doortype = 19
assembly_type = /obj/structure/door_assembly/door_assembly_atmo
/obj/machinery/door/airlock/research
name = "Airlock"
icon = 'icons/obj/doors/Doorresearch.dmi'
doortype = 20
assembly_type = /obj/structure/door_assembly/door_assembly_research
/obj/machinery/door/airlock/glass_research
name = "Maintenance Hatch"
icon = 'icons/obj/doors/Doorresearchglass.dmi'
opacity = 0
doortype = 21
assembly_type = /obj/structure/door_assembly/door_assembly_research
glass = 1
heat_proof = 1
@@ -222,40 +214,36 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
name = "Maintenance Hatch"
icon = 'icons/obj/doors/Doorminingglass.dmi'
opacity = 0
doortype = 22
assembly_type = /obj/structure/door_assembly/door_assembly_min
glass = 1
/obj/machinery/door/airlock/glass_atmos
name = "Maintenance Hatch"
icon = 'icons/obj/doors/Dooratmoglass.dmi'
opacity = 0
doortype = 23
assembly_type = /obj/structure/door_assembly/door_assembly_atmo
glass = 1
/obj/machinery/door/airlock/gold
name = "Gold Airlock"
icon = 'icons/obj/doors/Doorgold.dmi'
var/mineral = "gold"
doortype = 24
mineral = "gold"
/obj/machinery/door/airlock/silver
name = "Silver Airlock"
icon = 'icons/obj/doors/Doorsilver.dmi'
var/mineral = "silver"
doortype = 25
mineral = "silver"
/obj/machinery/door/airlock/diamond
name = "Diamond Airlock"
icon = 'icons/obj/doors/Doordiamond.dmi'
var/mineral = "diamond"
doortype = 26
mineral = "diamond"
/obj/machinery/door/airlock/uranium
name = "Uranium Airlock"
desc = "And they said I was crazy."
icon = 'icons/obj/doors/Dooruranium.dmi'
var/mineral = "uranium"
doortype = 27
mineral = "uranium"
var/last_event = 0
/obj/machinery/door/airlock/uranium/process()
@@ -274,8 +262,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
name = "Plasma Airlock"
desc = "No way this can end badly."
icon = 'icons/obj/doors/Doorplasma.dmi'
var/mineral = "plasma"
doortype = 28
mineral = "plasma"
/obj/machinery/door/airlock/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300)
@@ -303,37 +290,35 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
W.ignite((temperature/4))//Added so that you can't set off a massive chain reaction with a small flame
for(var/obj/machinery/door/airlock/plasma/D in range(3,src))
D.ignite(temperature/4)
new/obj/structure/door_assembly/door_assembly_0( src.loc )
new/obj/structure/door_assembly( src.loc )
del (src)
/obj/machinery/door/airlock/clown
name = "Bananium Airlock"
icon = 'icons/obj/doors/Doorbananium.dmi'
var/mineral = "clown"
doortype = 29
mineral = "clown"
/obj/machinery/door/airlock/sandstone
name = "Sandstone Airlock"
icon = 'icons/obj/doors/Doorsand.dmi'
var/mineral = "sandstone"
doortype = 30
mineral = "sandstone"
/obj/machinery/door/airlock/science
name = "Airlock"
icon = 'icons/obj/doors/Doorsci.dmi'
doortype = 31
assembly_type = /obj/structure/door_assembly/door_assembly_science
/obj/machinery/door/airlock/glass_science
name = "Glass Airlocks"
icon = 'icons/obj/doors/Doorsciglass.dmi'
opacity = 0
doortype = 32
assembly_type = /obj/structure/door_assembly/door_assembly_science
glass = 1
/obj/machinery/door/airlock/highsecurity
name = "High Tech Security Airlock"
icon = 'icons/obj/doors/hightechsecurity.dmi'
doortype = 33
assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity
/*
About the new airlock wires panel:
@@ -1203,37 +1188,16 @@ About the new airlock wires panel:
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.")
if(do_after(user,40))
user << "\blue You removed the airlock electronics!"
switch(src.doortype)
if(0) new/obj/structure/door_assembly/door_assembly_0( src.loc )
if(1) new/obj/structure/door_assembly/door_assembly_com( src.loc )
if(2) new/obj/structure/door_assembly/door_assembly_sec( src.loc )
if(3) new/obj/structure/door_assembly/door_assembly_eng( src.loc )
if(4) new/obj/structure/door_assembly/door_assembly_med( src.loc )
if(5) new/obj/structure/door_assembly/door_assembly_mai( src.loc )
if(6) new/obj/structure/door_assembly/door_assembly_ext( src.loc )
if(7) new/obj/structure/door_assembly/door_assembly_glass( src.loc )
if(12) new/obj/structure/door_assembly/door_assembly_hatch( src.loc )
if(13) new/obj/structure/door_assembly/door_assembly_mhatch( src.loc )
if(14) new/obj/structure/door_assembly/door_assembly_com/glass( src.loc )
if(15) new/obj/structure/door_assembly/door_assembly_eng/glass( src.loc )
if(16) new/obj/structure/door_assembly/door_assembly_sec/glass( src.loc )
if(17) new/obj/structure/door_assembly/door_assembly_med/glass( src.loc )
if(18) new/obj/structure/door_assembly/door_assembly_min( src.loc )
if(19) new/obj/structure/door_assembly/door_assembly_atmo( src.loc )
if(20) new/obj/structure/door_assembly/door_assembly_research( src.loc )
if(21) new/obj/structure/door_assembly/door_assembly_research/glass( src.loc )
if(22) new/obj/structure/door_assembly/door_assembly_min/glass( src.loc )
if(23) new/obj/structure/door_assembly/door_assembly_atmo/glass( src.loc )
if(24) new/obj/structure/door_assembly/door_assembly_gold( src.loc )
if(25) new/obj/structure/door_assembly/door_assembly_silver( src.loc )
if(26) new/obj/structure/door_assembly/door_assembly_diamond( src.loc )
if(27) new/obj/structure/door_assembly/door_assembly_uranium( src.loc )
if(28) new/obj/structure/door_assembly/door_assembly_plasma( src.loc )
if(29) new/obj/structure/door_assembly/door_assembly_clown( src.loc )
if(30) new/obj/structure/door_assembly/door_assembly_sandstone( src.loc )
if(31) new/obj/structure/door_assembly/door_assembly_science( src.loc )
if(32) new/obj/structure/door_assembly/door_assembly_science/glass( src.loc )
if(33) new/obj/structure/door_assembly/door_assembly_highsecurity(src.loc)
var/obj/structure/door_assembly/da = new assembly_type(src.loc)
da.anchored = 1
if(mineral)
da.glass = mineral
else if(glass)
da.glass = 1
da.state = 1
da.created_name = src.name
da.update_state()
var/obj/item/weapon/airlock_electronics/ae
if(!electronics)
@@ -1310,29 +1274,31 @@ About the new airlock wires panel:
if( !arePowerSystemsOn() || (stat & NOPOWER) || isWireCut(AIRLOCK_WIRE_DOOR_BOLTS) )
return
if(safe)
if(locate(/mob/living) in get_turf(src))
// playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) //THE BUZZING IT NEVER STOPS -Pete
spawn (60)
close()
return
for(var/turf/turf in locs)
if(locate(/mob/living) in turf)
// playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) //THE BUZZING IT NEVER STOPS -Pete
spawn (60)
close()
return
for(var/mob/living/M in get_turf(src))
if(isrobot(M))
M.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
else
M.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
M.SetStunned(5)
M.SetWeakened(5)
var/obj/effect/stop/S
S = new /obj/effect/stop
S.victim = M
S.loc = src.loc
spawn(20)
del(S)
M.emote("scream")
var/turf/location = src.loc
if(istype(location, /turf/simulated))
location.add_blood(M)
for(var/turf/turf in locs)
for(var/mob/living/M in turf)
if(isrobot(M))
M.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
else
M.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
M.SetStunned(5)
M.SetWeakened(5)
var/obj/effect/stop/S
S = new /obj/effect/stop
S.victim = M
S.loc = M.loc
spawn(20)
del(S)
M.emote("scream")
var/turf/location = src.loc
if(istype(location, /turf/simulated))
location.add_blood(M)
use_power(50)
if(istype(src, /obj/machinery/door/airlock/glass))
@@ -1341,9 +1307,10 @@ About the new airlock wires panel:
playsound(src.loc, 'sound/items/bikehorn.ogg', 30, 1)
else
playsound(src.loc, 'sound/machines/airlock.ogg', 30, 1)
var/obj/structure/window/killthis = (locate(/obj/structure/window) in get_turf(src))
if(killthis)
killthis.ex_act(2)//Smashin windows
for(var/turf/turf in locs)
var/obj/structure/window/killthis = (locate(/obj/structure/window) in turf)
if(killthis)
killthis.ex_act(2)//Smashin windows
..()
return
-1
View File
@@ -3,7 +3,6 @@
name = "Glass Alarm Airlock"
icon = 'icons/obj/doors/Doorglass.dmi'
opacity = 0
doortype = 7
glass = 1
var/datum/radio_frequency/air_connection
+44 -1
View File
@@ -20,8 +20,12 @@
var/heat_proof = 0 // For glass airlocks/opacity firedoors
var/air_properties_vary_with_direction = 0
//Multi-tile doors
dir = EAST
var/width = 1
/obj/machinery/door/New()
..()
. = ..()
if(density)
layer = 3.1 //Above most items if closed
explosion_resistance = initial(explosion_resistance)
@@ -29,6 +33,16 @@
else
layer = 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6
explosion_resistance = 0
if(width > 1)
if(dir in list(EAST, WEST))
bound_width = width * world.icon_size
bound_height = world.icon_size
else
bound_width = world.icon_size
bound_height = width * world.icon_size
update_nearby_tiles(need_rebuild=1)
return
@@ -258,6 +272,22 @@
if(istype(south)) air_master.tiles_to_update += south
if(istype(east)) air_master.tiles_to_update += east
if(istype(west)) air_master.tiles_to_update += west
if(width > 1)
var/turf/simulated/next_turf = src
var/step_dir = turn(dir, 180)
for(var/current_step = 2, current_step <= width, current_step++)
next_turf = get_step(src, step_dir)
north = get_step(next_turf, step_dir)
east = get_step(next_turf, turn(step_dir, 90))
south = get_step(next_turf, turn(step_dir, -90))
update_heat_protection(next_turf)
if(istype(north)) air_master.tiles_to_update |= north
if(istype(south)) air_master.tiles_to_update |= south
if(istype(east)) air_master.tiles_to_update |= east
return 1
/obj/machinery/door/proc/update_heat_protection(var/turf/simulated/source)
@@ -273,5 +303,18 @@
close()
return
/obj/machinery/door/Move(new_loc, new_dir)
update_nearby_tiles()
. = ..()
if(width > 1)
if(dir in list(EAST, WEST))
bound_width = width * world.icon_size
bound_height = world.icon_size
else
bound_width = world.icon_size
bound_height = width * world.icon_size
update_nearby_tiles()
/obj/machinery/door/morgue
icon = 'icons/obj/doors/doormorgue.dmi'
+5 -1
View File
@@ -272,4 +272,8 @@
if(istype(source)) air_master.tiles_to_update += source
if(istype(destination)) air_master.tiles_to_update += destination
return 1
*/
*/
/obj/machinery/door/firedoor/multi_tile
icon = 'DoorHazard2x1.dmi'
width = 2
+9
View File
@@ -0,0 +1,9 @@
//Terribly sorry for the code doubling, but things go derpy otherwise.
/obj/machinery/door/airlock/multi_tile
width = 2
/obj/machinery/door/airlock/multi_tile/glass
name = "Glass Airlock"
icon = 'icons/obj/doors/Door2x1glass.dmi'
opacity = 0
glass = 1
+13 -1
View File
@@ -1053,4 +1053,16 @@
set_ready_state(0)
chassis.use_power(energy_drain)
do_after_cooldown()
return 1
return 1
/obj/item/weapon/paintkit //Please don't use this for anything, it's a base type for custom mech paintjobs.
name = "mecha customisation kit"
desc = "A generic kit containing all the needed tools and parts to turn a mech into another mech."
icon = 'custom_items.dmi'
icon_state = "royce_kit"
var/new_name = "mech" //What is the variant called?
var/new_desc = "A mech." //How is the new mech described?
var/new_icon = "ripley" //What base icon will the new mech use?
var/removable = null //Can the kit be removed?
var/list/allowed_types = list() //Types of mech that the kit will work on.
+6 -1
View File
@@ -44,7 +44,12 @@
/obj/item/robot_parts/l_arm,
/obj/item/robot_parts/r_arm,
/obj/item/robot_parts/l_leg,
/obj/item/robot_parts/r_leg
/obj/item/robot_parts/r_leg,
/obj/item/robot_parts/robot_component/binary_communication_device,
/obj/item/robot_parts/robot_component/radio,
/obj/item/robot_parts/robot_component/actuator,
/obj/item/robot_parts/robot_component/diagnosis_unit,
/obj/item/robot_parts/robot_component/camera
),
"Ripley"=list(
/obj/item/mecha_parts/chassis/ripley,
+28
View File
@@ -759,6 +759,34 @@
user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src]")
return
else if(istype(W, /obj/item/weapon/paintkit))
if(occupant)
user << "You can't customize a mech while someone is piloting it - that would be unsafe!"
return
var/obj/item/weapon/paintkit/P = W
var/found = null
for(var/type in P.allowed_types)
if(type==src.initial_icon)
found = 1
break
if(!found)
user << "That kit isn't meant for use on this class of exosuit."
return
user.visible_message("[user] opens [P] and spends some quality time customising [src].")
src.name = P.new_name
src.desc = P.new_desc
src.initial_icon = P.new_icon
src.reset_icon()
user.drop_item()
del(P)
else
call((proc_res["dynattackby"]||src), "dynattackby")(W,user)
/*
+3 -15
View File
@@ -2,6 +2,7 @@
desc = "Autonomous Power Loader Unit. The workhorse of the exosuit world."
name = "APLU \"Ripley\""
icon_state = "ripley"
initial_icon = "ripley"
step_in = 6
max_temperature = 20000
health = 200
@@ -19,6 +20,7 @@
desc = "Standart APLU chassis was refitted with additional thermal protection and cistern."
name = "APLU \"Firefighter\""
icon_state = "firefighter"
initial_icon = "firefighter"
max_temperature = 65000
health = 250
lights_power = 8
@@ -107,18 +109,4 @@
T.Entered(A)
step_rand(A)
..()
return
/obj/mecha/working/ripley/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/fluff/sven_fjeltson_1))//this shit broke ripleys
src.icon_state = "earth"
src.initial_icon = "earth"
src.name = "APLU \"Strike the Earth!\""
src.desc = "Looks like an over worked, under maintained Ripley with some horrific damage."
user << "You pick up your old \"Strike the Earth!\" APLU."
user.drop_item()
del(W)
return
else
..()
return
+5
View File
@@ -110,6 +110,11 @@
for(var/mob/O in oviewers(src))
O.show_message("\red [usr] destroys the [name]!", 1)
health = 0
else
usr << "\blue You claw at the [name]."
for(var/mob/O in oviewers(src))
O.show_message("\red [usr] claws at the [name]!", 1)
health -= rand(5,10)
healthcheck()
return
@@ -0,0 +1,9 @@
/obj/effect/decal/warning_stripes
icon = 'icons/effects/warning_stripes.dmi'
layer = 2
/obj/effect/decal/warning_stripes/New()
. = ..()
loc.overlays += src
del src
+2 -2
View File
@@ -850,7 +850,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
P.overlays.Cut()
P.overlays += image('icons/obj/pda.dmi', "pda-r")
else
U << "<span class='notice'>ERROR: Server isn't responding.</span>"
U << "<span class='notice'>ERROR: Messaging server is not responding.</span>"
/obj/item/device/pda/verb/verb_remove_id()
@@ -1162,7 +1162,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
plist[text("[name]")] = P
return plist
//Some spare PDAs in a box
/obj/item/weapon/storage/box/PDAs
+2 -2
View File
@@ -162,7 +162,7 @@
else
user << "\blue You need to attach a flash to it first!"
if(istype(W, /obj/item/device/mmi) || istype(W, /obj/item/device/mmi/posibrain))
if(istype(W, /obj/item/device/mmi))
var/obj/item/device/mmi/M = W
if(check_completion())
if(!istype(loc,/turf))
@@ -194,7 +194,7 @@
user << "\red This [W] does not seem to fit."
return
var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc))
var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc), unfinished = 1)
if(!O) return
user.drop_item()
@@ -124,7 +124,6 @@ var/global/list/datum/stack_recipe/plasma_recipes = list ( \
throw_range = 3
origin_tech = "materials=3"
perunit = 2000
sheettype = "plastic"
var/global/list/datum/stack_recipe/plastic_recipes = list ( \
new/datum/stack_recipe("plastic crate", /obj/structure/closet/pcrate, 10, one_per_turf = 1, on_floor = 1), \
@@ -13,10 +13,20 @@
var/global/list/datum/stack_recipe/metal_recipes = list ( \
new/datum/stack_recipe("stool", /obj/structure/stool, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("chair", /obj/structure/stool/bed/chair, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("swivel chair", /obj/structure/stool/bed/chair/office/dark, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("comfy chair", /obj/structure/stool/bed/chair/comfy/beige, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("bed", /obj/structure/stool/bed, 2, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe_list("office chairs",list( \
new/datum/stack_recipe("dark office chair", /obj/structure/stool/bed/chair/office/dark, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("light office chair", /obj/structure/stool/bed/chair/office/light, 5, one_per_turf = 1, on_floor = 1), \
), 5), \
new/datum/stack_recipe_list("comfy chairs", list( \
new/datum/stack_recipe("beige comfy chair", /obj/structure/stool/bed/chair/comfy/beige, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("black comfy chair", /obj/structure/stool/bed/chair/comfy/black, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("brown comfy chair", /obj/structure/stool/bed/chair/comfy/brown, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("lime comfy chair", /obj/structure/stool/bed/chair/comfy/lime, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("teal comfy chair", /obj/structure/stool/bed/chair/comfy/teal, 2, one_per_turf = 1, on_floor = 1), \
), 2), \
null, \
new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts, 2), \
new/datum/stack_recipe("rack parts", /obj/item/weapon/rack_parts), \
new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1), \
@@ -28,10 +38,28 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
null, \
new/datum/stack_recipe("computer frame", /obj/structure/computerframe, 5, time = 25, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("machine frame", /obj/machinery/constructable_frame/machine_frame, 5, time = 25, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe_list("airlock assemblies", list( \
new/datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 50, one_per_turf = 1, on_floor = 1), \
/* new/datum/stack_recipe("science airlock assembly", /obj/structure/door_assembly/door_assembly_science, 4, time = 50, one_per_turf = 1, on_floor = 1), \ */
new/datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, 4, time = 50, one_per_turf = 1, on_floor = 1), \
), 4), \
null, \
new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade), \
new/datum/stack_recipe("light fixture frame", /obj/item/light_fixture_frame, 2), \
new/datum/stack_recipe("small light fixture frame", /obj/item/light_fixture_frame/small, 1), \
+74 -38
View File
@@ -1,7 +1,8 @@
/* Stack type objects!
* Contains:
* Stacks
* Recipe datum
* Recipe datum
* Recipe list datum
*/
/*
@@ -32,51 +33,66 @@
return
/obj/item/stack/attack_self(mob/user as mob)
interact(user)
list_recipes(user)
/obj/item/stack/interact(mob/user as mob)
/obj/item/stack/proc/list_recipes(mob/user as mob, recipes_sublist)
if (!recipes)
return
if (!src || amount<=0)
user << browse(null, "window=stack")
user.set_machine(src) //for correct work of onclose
var/list/recipe_list = recipes
if (recipes_sublist && recipe_list[recipes_sublist] && istype(recipe_list[recipes_sublist], /datum/stack_recipe_list))
var/datum/stack_recipe_list/srl = recipe_list[recipes_sublist]
recipe_list = srl.recipes
var/t1 = text("<HTML><HEAD><title>Constructions from []</title></HEAD><body><TT>Amount Left: []<br>", src, src.amount)
for(var/i=1;i<=recipes.len,i++)
var/datum/stack_recipe/R = recipes[i]
if (isnull(R))
for(var/i=1;i<=recipe_list.len,i++)
var/E = recipe_list[i]
if (isnull(E))
t1 += "<hr>"
continue
if (i>1 && !isnull(recipes[i-1]))
if (i>1 && !isnull(recipe_list[i-1]))
t1+="<br>"
var/max_multiplier = round(src.amount / R.req_amount)
var/title as text
var/can_build = 1
can_build = can_build && (max_multiplier>0)
/*
if (R.one_per_turf)
can_build = can_build && !(locate(R.result_type) in usr.loc)
if (R.on_floor)
can_build = can_build && istype(usr.loc, /turf/simulated/floor)
*/
if (R.res_amount>1)
title+= "[R.res_amount]x [R.title]\s"
else
title+= "[R.title]"
title+= " ([R.req_amount] [src.singular_name]\s)"
if (can_build)
t1 += text("<A href='?src=\ref[];make=[]'>[]</A> ", src, i, title)
else
t1 += text("[]", title)
continue
if (R.max_res_amount>1 && max_multiplier>1)
max_multiplier = min(max_multiplier, round(R.max_res_amount/R.res_amount))
t1 += " |"
var/list/multipliers = list(5,10,25)
for (var/n in multipliers)
if (max_multiplier>=n)
t1 += " <A href='?src=\ref[src];make=[i];multiplier=[n]'>[n*R.res_amount]x</A>"
if (!(max_multiplier in multipliers))
t1 += " <A href='?src=\ref[src];make=[i];multiplier=[max_multiplier]'>[max_multiplier*R.res_amount]x</A>"
if (istype(E, /datum/stack_recipe_list))
var/datum/stack_recipe_list/srl = E
if (src.amount >= srl.req_amount)
t1 += "<a href='?src=\ref[src];sublist=[i]'>[srl.title] ([srl.req_amount] [src.singular_name]\s)</a>"
else
t1 += "[srl.title] ([srl.req_amount] [src.singular_name]\s)<br>"
if (istype(E, /datum/stack_recipe))
var/datum/stack_recipe/R = E
var/max_multiplier = round(src.amount / R.req_amount)
var/title as text
var/can_build = 1
can_build = can_build && (max_multiplier>0)
/*
if (R.one_per_turf)
can_build = can_build && !(locate(R.result_type) in usr.loc)
if (R.on_floor)
can_build = can_build && istype(usr.loc, /turf/simulated/floor)
*/
if (R.res_amount>1)
title+= "[R.res_amount]x [R.title]\s"
else
title+= "[R.title]"
title+= " ([R.req_amount] [src.singular_name]\s)"
if (can_build)
t1 += text("<A href='?src=\ref[src];sublist=[recipes_sublist];make=[i]'>[title]</A> ")
else
t1 += text("[]", title)
continue
if (R.max_res_amount>1 && max_multiplier>1)
max_multiplier = min(max_multiplier, round(R.max_res_amount/R.res_amount))
t1 += " |"
var/list/multipliers = list(5,10,25)
for (var/n in multipliers)
if (max_multiplier>=n)
t1 += " <A href='?src=\ref[src];make=[i];multiplier=[n]'>[n*R.res_amount]x</A>"
if (!(max_multiplier in multipliers))
t1 += " <A href='?src=\ref[src];make=[i];multiplier=[max_multiplier]'>[max_multiplier*R.res_amount]x</A>"
t1 += "</TT></body></HTML>"
user << browse(t1, "window=stack")
@@ -87,10 +103,18 @@
..()
if ((usr.restrained() || usr.stat || usr.get_active_hand() != src))
return
if (href_list["sublist"] && !href_list["make"])
list_recipes(usr, text2num(href_list["sublist"]))
if (href_list["make"])
if (src.amount < 1) del(src) //Never should happen
var/datum/stack_recipe/R = recipes[text2num(href_list["make"])]
var/list/recipes_list = recipes
if (href_list["sublist"])
var/datum/stack_recipe_list/srl = recipes_list[text2num(href_list["sublist"])]
recipes_list = srl.recipes
var/datum/stack_recipe/R = recipes_list[text2num(href_list["make"])]
var/multiplier = text2num(href_list["multiplier"])
if (!multiplier) multiplier = 1
if (src.amount < R.req_amount*multiplier)
@@ -222,4 +246,16 @@
src.max_res_amount = max_res_amount
src.time = time
src.one_per_turf = one_per_turf
src.on_floor = on_floor
src.on_floor = on_floor
/*
* Recipe list datum
*/
/datum/stack_recipe_list
var/title = "ERROR"
var/list/recipes = null
var/req_amount = 1
New(title, recipes, req_amount = 1)
src.title = title
src.recipes = recipes
src.req_amount = req_amount
+165 -305
View File
@@ -6,278 +6,129 @@ obj/structure/door_assembly
anchored = 0
density = 1
var/state = 0
var/mineral = null
var/base_icon_state = "door_as_0"
var/glass_base_icon_state = "door_as_g0"
var/base_icon_state = ""
var/base_name = "Airlock"
var/obj/item/weapon/airlock_electronics/electronics = null
var/airlock_type = /obj/machinery/door/airlock //the type path of the airlock once completed
var/glass_type = /obj/machinery/door/airlock/glass
var/glass = null
var/airlock_type = "" //the type path of the airlock once completed
var/glass_type = "/glass"
var/glass = 0 // 0 = glass can be installed. -1 = glass can't be installed. 1 = glass is already installed. Text = mineral plating is installed instead.
var/created_name = null
New()
base_icon_state = copytext(icon_state,1,lentext(icon_state))
door_assembly_0
name = "Airlock Assembly"
icon_state = "door_as_1"
airlock_type = /obj/machinery/door/airlock
anchored = 1
density = 1
state = 1
glass = 0
update_state()
door_assembly_com
name = "Command Airlock Assembly"
icon_state = "door_as_com1"
glass_base_icon_state = "door_as_gcom"
glass_type = /obj/machinery/door/airlock/glass_command
airlock_type = /obj/machinery/door/airlock/command
anchored = 1
density = 1
state = 1
glass = 0
glass
glass = 1
icon_state = "door_as_gcom1"
base_icon_state = "com"
base_name = "Command Airlock"
glass_type = "/glass_command"
airlock_type = "/command"
door_assembly_sec
name = "Security Airlock Assembly"
icon_state = "door_as_sec1"
glass_base_icon_state = "door_as_gsec"
glass_type = /obj/machinery/door/airlock/glass_security
airlock_type = /obj/machinery/door/airlock/security
anchored = 1
density = 1
state = 1
glass = 0
glass
glass = 1
icon_state = "door_as_gsec1"
base_icon_state = "sec"
base_name = "Security Airlock"
glass_type = "/glass_security"
airlock_type = "/security"
door_assembly_eng
name = "Engineering Airlock Assembly"
icon_state = "door_as_eng1"
glass_base_icon_state = "door_as_geng"
glass_type = /obj/machinery/door/airlock/glass_engineering
airlock_type = /obj/machinery/door/airlock/engineering
anchored = 1
density = 1
state = 1
glass = 0
glass
glass = 1
icon_state = "door_as_geng1"
base_icon_state = "eng"
base_name = "Engineering Airlock"
glass_type = "/glass_engineering"
airlock_type = "/engineering"
door_assembly_min
name = "Mining Airlock Assembly"
icon_state = "door_as_min1"
glass_base_icon_state = "door_as_gmin"
glass_type = /obj/machinery/door/airlock/glass_mining
airlock_type = /obj/machinery/door/airlock/mining
anchored = 1
density = 1
state = 1
glass = 0
glass
glass = 1
icon_state = "door_as_gmin1"
base_icon_state = "min"
base_name = "Mining Airlock"
glass_type = "/glass_mining"
airlock_type = "/mining"
door_assembly_atmo
name = "Atmospherics Airlock Assembly"
icon_state = "door_as_atmo1"
glass_base_icon_state = "door_as_gatmo"
glass_type = /obj/machinery/door/airlock/glass_atmos
airlock_type = /obj/machinery/door/airlock/atmos
anchored = 1
density = 1
state = 1
glass = 0
glass
glass = 1
icon_state = "door_as_gatmo1"
base_icon_state = "atmo"
base_name = "Atmospherics Airlock"
glass_type = "/glass_atmos"
airlock_type = "/atmos"
door_assembly_research
name = "Research Airlock Assembly"
icon_state = "door_as_res1"
glass_base_icon_state = "door_as_gres"
glass_type = /obj/machinery/door/airlock/glass_research
airlock_type = /obj/machinery/door/airlock/research
anchored = 1
density = 1
state = 1
glass = 0
glass
glass = 1
icon_state = "door_as_gres1"
base_icon_state = "res"
base_name = "Research Airlock"
glass_type = "/glass_research"
airlock_type = "/research"
door_assembly_science
name = "Science Airlock Assembly"
icon_state = "door_as_sci1"
glass_base_icon_state = "door_as_gsci"
glass_type = /obj/machinery/door/airlock/glass_science
airlock_type = /obj/machinery/door/airlock/science
anchored = 1
density = 1
state = 1
glass = 0
glass
glass = 1
icon_state = "door_as_gsci1"
base_icon_state = "sci"
base_name = "Science Airlock"
glass_type = "/glass_science"
airlock_type = "/science"
door_assembly_med
name = "Medical Airlock Assembly"
icon_state = "door_as_med1"
airlock_type = /obj/machinery/door/airlock/medical
anchored = 1
density = 1
state = 1
glass
mineral = "glass"
icon_state = "door_as_gmed1"
base_icon_state = "med"
base_name = "Medical Airlock"
glass_type = "/glass_medical"
airlock_type = "/medical"
door_assembly_mai
name = "Maintenance Airlock Assembly"
icon_state = "door_as_mai1"
airlock_type = /obj/machinery/door/airlock/maintenance
anchored = 1
density = 1
state = 1
glass = 0
base_icon_state = "mai"
base_name = "Maintenance Airlock"
airlock_type = "/maintenance"
glass = -1
door_assembly_ext
name = "External Airlock Assembly"
icon_state = "door_as_ext1"
airlock_type = /obj/machinery/door/airlock/external
anchored = 1
density = 1
state = 1
glass = 0
base_icon_state = "ext"
base_name = "External Airlock"
airlock_type = "/external"
glass = -1
door_assembly_fre
name = "Freezer Airlock Assembly"
icon_state = "door_as_fre1"
airlock_type = /obj/machinery/door/airlock/freezer
anchored = 1
density = 1
state = 1
glass = 0
base_icon_state = "fre"
base_name = "Freezer Airlock"
airlock_type = "/freezer"
glass = -1
door_assembly_hatch
name = "Airtight Hatch Assembly"
icon_state = "door_as_hatch1"
airlock_type = /obj/machinery/door/airlock/hatch
anchored = 1
density = 1
state = 1
glass = 0
base_icon_state = "hatch"
base_name = "Airtight Hatch"
airlock_type = "/hatch"
glass = -1
door_assembly_mhatch
name = "Maintenance Hatch Assembly"
icon_state = "door_as_mhatch1"
airlock_type = /obj/machinery/door/airlock/maintenance_hatch
anchored = 1
density = 1
state = 1
glass = 0
door_assembly_glass
name = "Glass Airlock Assembly"
icon_state = "door_as_g1"
airlock_type = /obj/machinery/door/airlock/glass
anchored = 1
density = 1
state = 1
mineral = "glass"
door_assembly_gold
name = "Gold Airlock Assembly"
icon_state = "door_as_gold1"
airlock_type = /obj/machinery/door/airlock/gold
anchored = 1
density = 1
state = 1
mineral = "gold"
door_assembly_silver
name = "Silver Airlock Assembly"
icon_state = "door_as_silver1"
airlock_type = /obj/machinery/door/airlock/silver
anchored = 1
density = 1
state = 1
mineral = "silver"
door_assembly_diamond
name = "Diamond Airlock Assembly"
icon_state = "door_as_diamond1"
airlock_type = /obj/machinery/door/airlock/diamond
anchored = 1
density = 1
state = 1
mineral = "diamond"
door_assembly_uranium
name = "Uranium Airlock Assembly"
icon_state = "door_as_uranium1"
airlock_type = /obj/machinery/door/airlock/uranium
anchored = 1
density = 1
state = 1
mineral = "uranium"
door_assembly_plasma
name = "Plasma Airlock Assembly"
icon_state = "door_as_plasma1"
airlock_type = /obj/machinery/door/airlock/plasma
anchored = 1
density = 1
state = 1
mineral = "plasma"
door_assembly_clown
name = "Bananium Airlock Assembly"
icon_state = "door_as_clown1"
airlock_type = /obj/machinery/door/airlock/clown
anchored = 1
density = 1
state = 1
mineral = "clown"
door_assembly_sandstone
name = "Sandstone Airlock Assembly"
icon_state = "door_as_sandstone1"
airlock_type = /obj/machinery/door/airlock/sandstone
anchored = 1
density = 1
state = 1
mineral = "sandstone"
door_assembly_sandstone
name = "Sandstone Airlock Assembly"
icon_state = "door_as_sandstone1"
airlock_type = /obj/machinery/door/airlock/sandstone
anchored = 1
density = 1
state = 1
mineral = "sandstone"
base_icon_state = "mhatch"
base_name = "Maintenance Hatch"
airlock_type = "/maintenance_hatch"
glass = -1
door_assembly_highsecurity // Borrowing this until WJohnston makes sprites for the assembly
name = "High Tech Security Assembly"
icon_state = "door_as_highsec1"
airlock_type = /obj/machinery/door/airlock/highsecurity
anchored = 1
density = 1
state = 1
glass = 0
base_icon_state = "highsec"
base_name = "High Security Airlock"
airlock_type = "/highsecurity"
glass = -1
multi_tile
icon = 'icons/obj/doors/door_assembly2x1.dmi'
dir = EAST
var/width = 1
//Temporary until we get sprites.
// airlock_type = "/multi_tile/maint"
glass = 1
glass_type = "/multi_tile/glass"
New()
if(dir in list(EAST, WEST))
bound_width = width * world.icon_size
bound_height = world.icon_size
else
bound_width = world.icon_size
bound_height = width * world.icon_size
Move()
. = ..()
if(dir in list(EAST, WEST))
bound_width = width * world.icon_size
bound_height = world.icon_size
else
bound_width = world.icon_size
bound_height = width * world.icon_size
/obj/structure/door_assembly/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/pen))
@@ -287,46 +138,47 @@ obj/structure/door_assembly
created_name = t
return
if(istype(W, /obj/item/weapon/weldingtool) && !anchored )
if(istype(W, /obj/item/weapon/weldingtool) && ( (istext(glass)) || (glass == 1) || (!anchored) ))
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0,user))
user.visible_message("[user] dissassembles the airlock assembly.", "You start to dissassemble the airlock assembly.")
if (WT.remove_fuel(0, user))
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
if(do_after(user, 40))
if(!src || !WT.isOn()) return
user << "\blue You dissasembled the airlock assembly!"
new /obj/item/stack/sheet/metal(get_turf(src), 4)
if (mineral)
if (mineral == "glass")
new /obj/item/stack/sheet/rglass(get_turf(src))
else
var/M = text2path("/obj/item/stack/sheet/mineral/[mineral]")
new M(get_turf(src))
new M(get_turf(src))
del(src)
if(istext(glass))
user.visible_message("[user] welds the [glass] plating off the airlock assembly.", "You start to weld the [glass] plating off the airlock assembly.")
if(do_after(user, 40))
if(!src || !WT.isOn()) return
user << "\blue You welded the [glass] plating off!"
var/M = text2path("/obj/item/stack/sheet/mineral/[glass]")
new M(src.loc, 2)
glass = 0
else if(glass == 1)
user.visible_message("[user] welds the glass panel out of the airlock assembly.", "You start to weld the glass panel out of the airlock assembly.")
if(do_after(user, 40))
if(!src || !WT.isOn()) return
user << "\blue You welded the glass panel out!"
new /obj/item/stack/sheet/rglass(src.loc)
glass = 0
else if(!anchored)
user.visible_message("[user] dissassembles the airlock assembly.", "You start to dissassemble the airlock assembly.")
if(do_after(user, 40))
if(!src || !WT.isOn()) return
user << "\blue You dissasembled the airlock assembly!"
new /obj/item/stack/sheet/metal(src.loc, 4)
del (src)
else
user << "\blue You need more welding fuel to dissassemble the airlock assembly."
user << "\blue You need more welding fuel."
return
else if(istype(W, /obj/item/weapon/wrench) && !anchored )
else if(istype(W, /obj/item/weapon/wrench) && state == 0)
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
user.visible_message("[user] secures the airlock assembly to the floor.", "You start to secure the airlock assembly to the floor.")
if(anchored)
user.visible_message("[user] unsecures the airlock assembly from the floor.", "You start to unsecure the airlock assembly from the floor.")
else
user.visible_message("[user] secures the airlock assembly to the floor.", "You start to secure the airlock assembly to the floor.")
if(do_after(user, 40))
if(!src) return
user << "\blue You secured the airlock assembly!"
src.name = "Secured Airlock Assembly"
src.anchored = 1
else if(istype(W, /obj/item/weapon/wrench) && anchored )
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
user.visible_message("[user] unsecures the airlock assembly from the floor.", "You start to unsecure the airlock assembly from the floor.")
if(do_after(user, 40))
if(!src) return
user << "\blue You unsecured the airlock assembly!"
src.name = "Airlock Assembly"
src.anchored = 0
user << "\blue You [anchored? "un" : ""]secured the airlock assembly!"
anchored = !anchored
else if(istype(W, /obj/item/weapon/cable_coil) && state == 0 && anchored )
var/obj/item/weapon/cable_coil/coil = W
@@ -336,7 +188,6 @@ obj/structure/door_assembly
coil.use(1)
src.state = 1
user << "\blue You wire the Airlock!"
src.name = "Wired Airlock Assembly"
else if(istype(W, /obj/item/weapon/wirecutters) && state == 1 )
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
@@ -345,9 +196,8 @@ obj/structure/door_assembly
if(do_after(user, 40))
if(!src) return
user << "\blue You cut the airlock wires.!"
new/obj/item/weapon/cable_coil(get_turf(user), 1)
new/obj/item/weapon/cable_coil(src.loc, 1)
src.state = 0
src.name = "Secured Airlock Assembly"
else if(istype(W, /obj/item/weapon/airlock_electronics) && state == 1 && W:icon_state != "door_electronics_smoked")
playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
@@ -364,8 +214,6 @@ obj/structure/door_assembly
else
W.loc = src.loc
//del(W)
else if(istype(W, /obj/item/weapon/crowbar) && state == 2 )
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to install electronics into the airlock assembly.")
@@ -382,32 +230,28 @@ obj/structure/door_assembly
ae = electronics
electronics = null
ae.loc = src.loc
else if(istype(W, /obj/item/stack/sheet) && !mineral)
var/obj/item/stack/sheet/G = W
if(G)
if(G.amount>=1)
if(G.type == /obj/item/stack/sheet/rglass)
else if(istype(W, /obj/item/stack/sheet) && !glass)
var/obj/item/stack/sheet/S = W
if (S)
if (S.amount>=1)
if(istype(S, /obj/item/stack/sheet/rglass))
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
user.visible_message("[user] adds [G.name] to the airlock assembly.", "You start to install [G.name] into the airlock assembly.")
user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
if(do_after(user, 40))
user << "\blue You installed reinforced glass windows into the airlock assembly!"
G.use(1)
src.mineral = "glass"
src.name = "Near finished Window Airlock Assembly"
src.airlock_type = /obj/machinery/door/airlock/glass
src.base_icon_state = "door_as_g" //this will be applied to the icon_state with the correct state number at the proc's end.
else if(istype(G, /obj/item/stack/sheet/mineral))
var/M = G.sheettype
if(G.amount>=2)
S.use(1)
glass = 1
else if(istype(S, /obj/item/stack/sheet/mineral) && S.sheettype)
var/M = S.sheettype
if(S.amount>=2)
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
user.visible_message("[user] adds [G.name] to the airlock assembly.", "You start to install [G.name] into the airlock assembly.")
user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
if(do_after(user, 40))
user << "\blue You installed [M] plating into the airlock assembly!"
G.use(2)
src.mineral = "[M]"
src.name = "Near finished [M] Airlock Assembly"
src.airlock_type = text2path ("/obj/machinery/door/airlock/[M]")
src.base_icon_state = "door_as_[M]"
S.use(2)
glass = "[M]"
else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 )
playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
user << "\blue Now finishing the airlock."
@@ -415,11 +259,15 @@ obj/structure/door_assembly
if(do_after(user, 40))
if(!src) return
user << "\blue You finish the airlock!"
var/obj/machinery/door/airlock/door
if (mineral)
airlock_type = text2path("/obj/machinery/door/airlock/[mineral]")
door = new src.airlock_type( src.loc )
//door.req_access = src.req_access
var/path
if(istext(glass))
path = text2path("/obj/machinery/door/airlock/[glass]")
else if (glass == 1)
path = text2path("/obj/machinery/door/airlock[glass_type]")
else
path = text2path("/obj/machinery/door/airlock[airlock_type]")
var/obj/machinery/door/airlock/door = new path(src.loc)
door.assembly_type = type
door.electronics = src.electronics
if(src.electronics.one_access)
door.req_access = null
@@ -428,11 +276,23 @@ obj/structure/door_assembly
door.req_access = src.electronics.conf_access
if(created_name)
door.name = created_name
else
door.name = "[istext(glass) ? "[glass] airlock" : base_name]"
src.electronics.loc = door
del(src)
else
..()
icon_state = "[base_icon_state][state]"
//This updates the icon_state. They are named as "door_as1_eng" where the 1 in that example
//represents what state it's in. So the most generic algorithm for the correct updating of
//this is simply to change the number.
update_state()
/obj/structure/door_assembly/proc/update_state()
icon_state = "door_as_[glass == 1 ? "g" : ""][istext(glass) ? glass : base_icon_state][state]"
name = ""
switch (state)
if(0)
if (anchored)
name = "Secured "
if(1)
name = "Wired "
if(2)
name = "Near Finished "
name += "[glass == 1 ? "Window " : ""][istext(glass) ? "[glass] Airlock" : base_name] Assembly"
@@ -1,251 +0,0 @@
//
dmm_suite{
load_map(var/dmm_file as file, var/z_offset as num){
if(!z_offset){
z_offset = world.maxz+1
}
var/quote = ascii2text(34)
var/tfile = file2text(dmm_file)
var/tfile_len = length(tfile)
var/list/grid_models[0]
var/key_len = length(copytext(tfile,2,findtext(tfile,quote,2,0)))
for(var/lpos=1;lpos<tfile_len;lpos=findtext(tfile,"\n",lpos,0)+1){
var/tline = copytext(tfile,lpos,findtext(tfile,"\n",lpos,0))
if(copytext(tline,1,2)!=quote){break}
var/model_key = copytext(tline,2,findtext(tfile,quote,2,0))
var/model_contents = copytext(tline,findtext(tfile,"=")+3,length(tline))
grid_models[model_key] = model_contents
sleep(-1)
}
var/zcrd=-1
var/ycrd=0
var/xcrd=0
for(var/zpos=findtext(tfile,"\n(1,1,");TRUE;zpos=findtext(tfile,"\n(1,1,",zpos+1,0)){
if(zpos==0) break
zcrd++
world.maxz = max(world.maxz, zcrd+z_offset)
ycrd=0
var/zgrid = copytext(tfile,findtext(tfile,quote+"\n",zpos,0)+2,findtext(tfile,"\n"+quote,zpos,0)+1)
for(var/gpos=1;gpos!=0;gpos=findtext(zgrid,"\n",gpos,0)+1){
var/grid_line = copytext(zgrid,gpos,findtext(zgrid,"\n",gpos,0)+1)
var/y_depth = length(zgrid)/(length(grid_line))
if(world.maxy<y_depth){world.maxy=y_depth}
grid_line=copytext(grid_line,1,length(grid_line))
if(!ycrd){
ycrd = y_depth
}
else{ycrd--}
xcrd=0
for(var/mpos=1;mpos<=length(grid_line);mpos+=key_len){
xcrd++
if(world.maxx<xcrd){world.maxx=xcrd}
var/model_key = copytext(grid_line,mpos,mpos+key_len)
parse_grid(grid_models[model_key],xcrd,ycrd,zcrd+z_offset)
}
if(gpos+length(grid_line)+1>length(zgrid)){break}
sleep(-1)
}
if(findtext(tfile,quote+"}",zpos,0)+2>=tfile_len){break}
sleep(-1)
}
}
proc{
parse_grid(var/model as text,var/xcrd as num,var/ycrd as num,var/zcrd as num){
/*Method parse_grid()
- Accepts a text string containing a comma separated list of type paths of the
same construction as those contained in a .dmm file, and instantiates them.
*/
var/list/text_strings[0]
for(var/index=1;findtext(model,quote);index++){
/*Loop: Stores quoted portions of text in text_strings, and replaces them with an
index to that list.
- Each iteration represents one quoted section of text.
*/
text_strings.len=index
text_strings[index] = copytext(model,findtext(model,quote)+1,findtext(model,quote,findtext(model,quote)+1,0))
model = copytext(model,1,findtext(model,quote))+"~[index]"+copytext(model,findtext(model,quote,findtext(model,quote)+1,0)+1,0)
sleep(-1)
}
var/list/old_turf_underlays[0]
var/old_turf_density
var/old_turf_opacity
/*The old_turf variables store information about turfs instantiated in this location/iteration.
This is done to approximate the layered turf effect of DM's map editor.
An image of each turf is stored in old_turf_underlays[], and is later added to the new turf's underlays.
*/
for(var/dpos=1;dpos!=0;dpos=findtext(model,",",dpos,0)+1){
/*Loop: Identifies each object's data, instantiates it, and reconstitues it's fields.
- Each iteration represents one object's data, including type path and field values.
*/
var/full_def = copytext(model,dpos,findtext(model,",",dpos,0))
var/atom_def = text2path(copytext(full_def,1,findtext(full_def,"{")))
var/list/attributes[0]
if(findtext(full_def,"{")){
full_def = copytext(full_def,1,length(full_def))
for(var/apos=findtext(full_def,"{")+1;apos!=0;apos=findtext(full_def,";",apos,0)+1){
//Loop: Identifies each attribute/value pair, and stores it in attributes[].
attributes.Add(copytext(full_def,apos,findtext(full_def,";",apos,0)))
if(!findtext(copytext(full_def,apos,0),";")){break}
sleep(-1)
}
}
//Construct attributes associative list
var/list/fields = new(0)
for(var/index=1;index<=attributes.len;index++){
var/trim_left = trim_text(copytext(attributes[index],1,findtext(attributes[index],"=")))
var/trim_right = trim_text(copytext(attributes[index],findtext(attributes[index],"=")+1,0))
//Check for string
if(findtext(trim_right,"~")){
var/reference_index = copytext(trim_right,findtext(trim_right,"~")+1,0)
trim_right=text_strings[text2num(reference_index)]
}
//Check for number
else if(isnum(text2num(trim_right))){
trim_right = text2num(trim_right)
}
//Check for file
else if(copytext(trim_right,1,2) == "'"){
trim_right = file(copytext(trim_right,2,length(trim_right)))
}
fields[trim_left] = trim_right
}
//End construction
//Begin Instanciation
var/atom/instance
var/dmm_suite/preloader/_preloader = new(fields)
if(ispath(atom_def,/area)){
instance = locate(atom_def)
instance.contents.Add(locate(xcrd,ycrd,zcrd))
}
else if(ispath(atom_def,/turf)){
var/turf/old_turf = locate(xcrd,ycrd,zcrd)
if(old_turf.density){old_turf_density = 1}
if(old_turf.opacity){old_turf_opacity = 1}
if(old_turf.icon){
var/image/old_turf_image = image(old_turf.icon,null,old_turf.icon_state,old_turf.layer,old_turf.dir)
old_turf_underlays.Add(old_turf_image)
}
instance = new atom_def(old_turf, _preloader)
for(var/inverse_index=old_turf_underlays.len;inverse_index;inverse_index--){
var/image/image_underlay = old_turf_underlays[inverse_index]
image_underlay.loc = instance
instance.underlays.Add(image_underlay)
}
if(!instance.density){instance.density = old_turf_density}
if(!instance.opacity){instance.opacity = old_turf_opacity}
}
if(_preloader && instance){
_preloader.load(instance)
}
//End Instanciation
if(!findtext(copytext(model,dpos,0),",")){break}
sleep(-1)
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
for(var/dpos=1;dpos!=0;dpos=findtext(model,",",dpos,0)+1)
{
/*Loop: Identifies each object's data, instantiates it, and reconstitues it's fields.
- Each iteration represents one object's data, including type path and field values.
*/
var/full_def = copytext(model,dpos,findtext(model,",",dpos,0))
var/atom_def = text2path(copytext(full_def,1,findtext(full_def,"{")))
var/list/attributes[0]
if(findtext(full_def,"{")){
full_def = copytext(full_def,1,length(full_def))
for(var/apos=findtext(full_def,"{")+1;apos!=0;apos=findtext(full_def,";",apos,0)+1){
//Loop: Identifies each attribute/value pair, and stores it in attributes[].
attributes.Add(copytext(full_def,apos,findtext(full_def,";",apos,0)))
if(!findtext(copytext(full_def,apos,0),";")){break}
sleep(-1)
}
}
//Construct attributes associative list
var/list/fields = new(0)
for(var/index=1;index<=attributes.len;index++){
var/trim_left = trim_text(copytext(attributes[index],1,findtext(attributes[index],"=")))
var/trim_right = trim_text(copytext(attributes[index],findtext(attributes[index],"=")+1,0))
//Check for string
if(findtext(trim_right,"~")){
var/reference_index = copytext(trim_right,findtext(trim_right,"~")+1,0)
trim_right=text_strings[text2num(reference_index)]
}
//Check for number
else if(isnum(text2num(trim_right))){
trim_right = text2num(trim_right)
}
//Check for file
else if(copytext(trim_right,1,2) == "'"){
trim_right = file(copytext(trim_right,2,length(trim_right)))
}
fields[trim_left] = trim_right
}
//End construction
//Begin Instanciation
var/atom/instance
var/dmm_suite/preloader/_preloader = new(fields)
if(!ispath(atom_def,/area) && !ispath(atom_def,/turf))
{
instance = new atom_def(locate(xcrd,ycrd,zcrd), _preloader)
}
if(_preloader && instance)
{
_preloader.load(instance)
}
//End Instanciation
if(!findtext(copytext(model,dpos,0),",")){break}
sleep(-1)
}
}
trim_text(var/what as text){
while(length(what) && findtext(what," ",1,2)){
what=copytext(what,2,0)
}
while(length(what) && findtext(what," ",length(what),0)){
what=copytext(what,1,length(what))
}
return what
}
}
}
atom/New(atom/loc, dmm_suite/preloader/_dmm_preloader){
if(istype(_dmm_preloader, /dmm_suite/preloader)){
_dmm_preloader.load(src)
}
. = ..()
}
dmm_suite{
preloader{
parent_type = /datum
var{
list/attributes
}
New(list/the_attributes){
.=..()
if(!the_attributes.len){ Del()}
attributes = the_attributes
}
proc{
load(atom/what){
for(var/attribute in attributes){
what.vars[attribute] = attributes[attribute]
}
Del()
}
}
}
}
+1 -1
View File
@@ -40,7 +40,7 @@ proc/createRandomZlevel()
var/map = pick(potentialRandomZlevels)
var/file = file(map)
if(isfile(file))
maploader.load_map(file)
maploader.load_map(file, load_speed = 100)
for(var/obj/effect/landmark/L in landmarks_list)
if (L.name != "awaystart")
+5 -5
View File
@@ -63,18 +63,18 @@
//Medical
/obj/item/clothing/head/surgery
name = "surgical cap"
desc = "A cap surgeons wear during operations. Keeps thier hair from tickling your internal organs."
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs."
icon_state = "surgcap_blue"
flags = FPRINT | TABLEPASS | BLOCKHAIR
flags = FPRINT | TABLEPASS | BLOCKHEADHAIR
/obj/item/clothing/head/surgery/purple
desc = "A cap surgeons wear during operations. Keeps thier hair from tickling your internal organs. This one is deep purple."
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is deep purple."
icon_state = "surgcap_purple"
/obj/item/clothing/head/surgery/blue
desc = "A cap surgeons wear during operations. Keeps thier hair from tickling your internal organs. This one is baby blue"
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is baby blue."
icon_state = "surgcap_blue"
/obj/item/clothing/head/surgery/green
desc = "A cap surgeons wear during operations. Keeps thier hair from tickling your internal organs. This one is dark green"
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is dark green."
icon_state = "surgcap_green"
+64 -1
View File
@@ -226,4 +226,67 @@
desc = "Worn brownish synthcotton vest with lots of pockets to unload your hands."
icon_state = "vest_brown"
color = "vest_brown"
slots = 5
slots = 5
/*
Holobadges are worn on the belt or neck, and can be used to show that the holder is an authorized
Security agent - the user details can be imprinted on the badge with a Security-access ID card,
or they can be emagged to accept any ID for use in disguises.
*/
/obj/item/clothing/tie/holobadge
name = "holobadge"
desc = "This glowing blue badge marks the holder as THE LAW."
icon_state = "holobadge"
color = "holobadge"
slot_flags = SLOT_BELT
var/emagged = 0 //Emagging removes Sec check.
var/stored_name = null
/obj/item/clothing/tie/holobadge/cord
icon_state = "holobadge-cord"
color = "holobadge-cord"
slot_flags = SLOT_MASK
/obj/item/clothing/tie/holobadge/attack_self(mob/user as mob)
if(!stored_name)
user << "Waving around a badge before swiping an ID would be pretty pointless."
return
if(isliving(user))
user.visible_message("\red [user] displays their NanoTrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.","\red You display your NanoTrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.")
/obj/item/clothing/tie/holobadge/attackby(var/obj/item/O as obj, var/mob/user as mob)
if (istype(O, /obj/item/weapon/card/emag))
if (emagged)
user << "\red [src] is already cracked."
return
else
emagged = 1
user << "\red You swipe [O] and crack the holobadge security checks."
return
else if(istype(O, /obj/item/weapon/card/id) || istype(O, /obj/item/device/pda))
var/obj/item/weapon/card/id/id_card = null
if(istype(O, /obj/item/weapon/card/id))
id_card = O
else
var/obj/item/device/pda/pda = O
id_card = pda.id
if(access_security in id_card.access || emagged)
user << "You imprint your ID details onto the badge."
stored_name = id_card.registered_name
name = "holobadge ([stored_name])"
desc = "This glowing blue badge marks [stored_name] as THE LAW."
else
user << "[src] rejects your insufficient access rights."
return
..()
/obj/item/clothing/tie/holobadge/attack(mob/living/carbon/human/M, mob/living/user)
if(isliving(user))
user.visible_message("\red [user] invades [M]'s personal space, thrusting [src] into their face insistently.","\red You invade [M]'s personal space, thrusting [src] into their face insistently. You are the law.")
+16 -7
View File
@@ -1,4 +1,3 @@
hi
// Add custom items you give to people here, and put their icons in custom_items.dmi
// Remember to change 'icon = 'custom_items.dmi'' for items not using /obj/item/fluff as a base
// Clothing item_state doesn't use custom_items.dmi. Just add them to the normal clothing files.
@@ -359,19 +358,29 @@ hi
////// Ripley customisation kit - Butchery Royce - MayeDay
/obj/item/weapon/fluff/butcher_royce_1
/obj/item/weapon/paintkit/fluff/butcher_royce_1
name = "Ripley customisation kit"
desc = "A kit containing all the needed tools and parts to turn an APLU Ripley into a Titan's Fist worker mech."
icon = 'custom_items.dmi'
icon_state = "royce_kit"
new_name = "APLU \"Titan's Fist\""
new_desc = "This ordinary mining Ripley has been customized to look like a unit of the Titans Fist."
new_icon = "titan"
allowed_types = list("ripley","firefighter")
////// Ripley customisation kit - Sven Fjeltson - Mordeth221
/obj/item/weapon/fluff/sven_fjeltson_1
name = "Mercenary APLU kit"
desc = "A kit containing all the needed tools and parts to turn an APLU Ripley into an old Mercenaries APLU."
icon = 'custom_items.dmi'
icon_state = "sven_kit"
/obj/item/weapon/paintkit/fluff/sven_fjeltson_1
name = "Mercenary APLU kit"
desc = "A kit containing all the needed tools and parts to turn an APLU Ripley into an old Mercenaries APLU."
icon = 'custom_items.dmi'
icon_state = "sven_kit"
new_name = "APLU \"Strike the Earth!\""
new_desc = "Looks like an over worked, under maintained Ripley with some horrific damage."
new_icon = "earth"
allowed_types = list("ripley","firefighter")
//////////////////////////////////
//////////// Clothing ////////////
@@ -53,10 +53,11 @@ dmm_suite{
*/
verb/load_map(var/dmm_file as file, var/z_offset as num){
verb/load_map(var/dmm_file as file, var/z_offset as num, var/load_speed as num)
// dmm_file: A .dmm file to load (Required).
// z_offset: A number representing the z-level on which to start loading the map (Optional).
}
// load_speed: How many tiles should be loaded per second, defaults to no pause (Optional)
verb/write_map(var/turf/t1 as turf, var/turf/t2 as turf, var/flags as num){
// t1: A turf representing one corner of a three dimensional grid (Required).
// t2: Another turf representing the other corner of the same grid (Required).
+325
View File
@@ -0,0 +1,325 @@
dmm_suite
var/debug_file = file("maploader_debug.txt")
load_map(var/dmm_file as file, var/z_offset as num, var/y_offset as num, var/x_offset as num, var/load_speed = 0 as num)
if(!z_offset)
z_offset = world.maxz + 1
//Ensure values are sane.
else if(z_offset < 0)
z_offset = abs(z_offset)
else if(!isnum(z_offset))
z_offset = 0
if(x_offset < 0)
x_offset = abs(x_offset)
else if(!isnum(x_offset))
x_offset = 0
if(y_offset < 0)
y_offset = abs(y_offset)
else if(!isnum(y_offset))
y_offset = 0
debug_file << "Starting Map Load @ ([x_offset], [y_offset], [z_offset]), [load_speed] tiles per second."
//Handle slowed loading.
var/delay_chance = 0
if(load_speed > 0)
//Chance out of 100 every tenth of a second.
delay_chance = 1000 / load_speed
//String holding a quotation mark.
var/quote = ascii2text(34)
var/input_file = file2text(dmm_file)
var/input_file_len = length(input_file)
//Stores the contents of each tile model in the map
var/list/grid_models = list()
//Length of the tile model code. e.g. "aaa" is 3 long.
var/key_len = length(copytext(input_file, 2 ,findtext(input_file, quote, 2)))
//The key of the default tile model. (In SS13 this is: "/turf/space,/area")
var/default_key
debug_file << " Building turf array."
//Iterates through the mapfile to build the model tiles for the map.
for(var/line_position = 1; line_position < input_file_len; line_position = findtext(input_file,"\n", line_position) + 1)
var/next_line = copytext(input_file, line_position, findtext(input_file,"\n", line_position) - 1)
//If the first character in the line is not a quote, the model tiles are all defined.
if(copytext(next_line, 1, 2) != quote)
break
//Copy contents of the model into the grid_models list.
var/model_key = copytext(next_line, 2, findtext(input_file, quote, 2))
var/model_contents = copytext(next_line, findtext(next_line, "=" ) + 3)
if(!default_key && model_contents == "[world.turf],[world.area]")
default_key = model_key
grid_models[model_key] = model_contents
if(prob(delay_chance))
sleep(1)
//Co-ordinates of the tile being loaded.
var/z_coordinate = -1
var/y_coordinate = 0
var/x_coordinate = 0
//Store the
var/y_depth = 0
//Iterate through all z-levels to load the tiles.
for(var/z_position = findtext(input_file, "\n(1,1,"); TRUE; z_position = findtext(input_file, "\n(1,1,", z_position + 1))
//break when there are no more z-levels.
if(z_position == 0)
break
//Increment the z_coordinate and update the world's borders
z_coordinate++
world.maxz = max(world.maxz, z_coordinate + z_offset)
//Here we go!
y_coordinate = 0
y_depth = 0
var/z_level = copytext(input_file, \
findtext(input_file, quote + "\n", z_position) + 2,\
findtext(input_file, "\n" + quote, z_position) + 1)
//Iterate through each line, increasing the y_coordinate.
for(var/grid_position = 1; grid_position != 0; grid_position = findtext(z_level, "\n", grid_position) + 1)
//Grab this line of data.
var/grid_line = copytext(z_level, grid_position, findtext(z_level, "\n", grid_position))
//Compute the size of the z-levels y axis.
if(!y_depth)
y_depth = length(z_level) / (length(grid_line) + 1)
y_depth += y_offset
if(y_depth != round(y_depth, 1))
debug_file << " Warning: y_depth is not a round number"
//And update the worlds variables.
if(world.maxy < y_depth)
world.maxy = y_depth
//The top of the map is the highest "y" co-ordinate, so we start there and iterate downwards
if(!y_coordinate)
y_coordinate = y_depth + 1
//Decrement and load this line of the map.
y_coordinate--
x_coordinate = x_offset
//Iterate through the line loading the model tile data.
for(var/model_position = 1; model_position <= length(grid_line); model_position += key_len)
x_coordinate++
//Find the model key and load that model.
var/model_key = copytext(grid_line, model_position, model_position + key_len)
//If the key is the default one, skip it and save the computation time.
if(model_key == default_key)
continue
if(world.maxx < x_coordinate)
world.maxx = x_coordinate
parse_grid(grid_models[model_key], x_coordinate, y_coordinate, z_coordinate + z_offset)
if(prob(delay_chance))
sleep(1)
//If we hit the last tile in this z-level, we should break out of the loop.
if(grid_position + length(grid_line) + 1 > length(z_level))
break
//Break out of the loop when we hit the end of the file.
if(findtext(input_file, quote + "}", z_position) + 2 >= input_file_len)
break
proc/parse_grid(var/model as text, var/x_coordinate as num, var/y_coordinate as num, var/z_coordinate as num)
//Accepts a text string containing a comma separated list of type paths of the
// same construction as those contained in a .dmm file, and instantiates them.
var/list/text_strings = list()
for(var/index = 1; findtext(model, quote); index++)
/*Loop: Stores quoted portions of text in text_strings, and replaces them with an
index to that list.
- Each iteration represents one quoted section of text.
*/
//Add the next section of quoted text to the list
var/first_quote = findtext(model, quote)
var/second_quote = findtext(model, quote, first_quote + 1)
var/quoted_chunk = copytext(model, first_quote + 1, second_quote)
text_strings += quoted_chunk
//Then remove the quoted section.
model = copytext(model, 1, first_quote) + "~[index]" + copytext(model, second_quote + 1)
var/debug_output = 0
//if(x_coordinate == 86 && y_coordinate == 88 && z_coordinate == 7)
// debug_output = 1
if(debug_output)
debug_file << " Now debugging turf: [model] ([x_coordinate], [y_coordinate], [z_coordinate])"
var/next_position = 1
for(var/data_position = 1, next_position || data_position != 1, data_position = next_position + 1)
next_position = findtext(model, ",/", data_position)
var/full_def = copytext(model, data_position, next_position)
if(debug_output)
debug_file << " Current Line: [full_def] -- ([data_position] - [next_position])"
/*Loop: Identifies each object's data, instantiates it, and reconstitues it's fields.
- Each iteration represents one object's data, including type path and field values.
*/
//Load the attribute data.
var/attribute_position = findtext(full_def,"{")
var/atom_def = text2path(copytext(full_def, 1, attribute_position))
var/list/attributes = list()
if(attribute_position)
full_def = copytext(full_def, attribute_position + 1)
if(debug_output)
debug_file << " Atom Def: [atom_def]"
debug_file << " Parameters: [full_def]"
var/next_attribute = 1
for(attribute_position = 1, next_attribute || attribute_position != 1, attribute_position = next_attribute + 1)
next_attribute = findtext(full_def, ";", attribute_position)
//Loop: Identifies each attribute/value pair, and stores it in attributes[].
attributes += copytext(full_def, attribute_position, next_attribute)
//Construct attributes associative list
var/list/fields = list()
for(var/attribute in attributes)
var/trim_left = trim_text(copytext(attribute, 1, findtext(attribute, "=")))
var/trim_right = trim_text(copytext(attribute, findtext(attribute, "=") + 1))
if(findtext(trim_right, "list("))
trim_right = get_list(trim_right, text_strings)
else if(findtext(trim_right, "~"))//Check for strings
while(findtext(trim_right,"~"))
var/reference_index = copytext(trim_right, findtext(trim_right, "~") + 1)
trim_right = text_strings[text2num(reference_index)]
//Check for numbers
else if(isnum(text2num(trim_right)))
trim_right = text2num(trim_right)
//Check for file
else if(copytext(trim_right,1,2) == "'")
trim_right = file(copytext(trim_right, 2, length(trim_right)))
fields[trim_left] = trim_right
sleep(-1)
if(debug_output)
var/return_data = " Debug Fields:"
for(var/item in fields)
return_data += " [item] = [fields[item]];"
debug_file << return_data
//Begin Instanciation
var/atom/instance
if(ispath(atom_def,/area))
instance = locate(atom_def)
if(!istype(instance, atom_def))
instance = new atom_def
instance.contents.Add(locate(x_coordinate,y_coordinate,z_coordinate))
else
instance = new atom_def(locate(x_coordinate,y_coordinate,z_coordinate))
if(instance)
for(var/item in fields)
instance.vars[item] = fields[item]
else if(!(atom_def in borked_paths))
borked_paths += atom_def
var/return_data = " Failure [atom_def] @ ([x_coordinate], [y_coordinate], [z_coordinate]) fields:"
for(var/item in fields)
return_data += " [item] = [fields[item]];"
debug_file << return_data
sleep(-1)
return 1
var/list/borked_paths = list()
proc/trim_text(var/what as text)
while(length(what) && findtext(what, " ", 1, 2))
what = copytext(what, 2)
while(length(what) && findtext(what, " ", length(what)))
what = copytext(what, 1, length(what))
return what
proc/get_list(var/text, var/list/text_strings)
//First, trim the data to just the list contents
var/list_start = findtext(text, "(") + 1
var/list_end = findtext(text, ")", list_start)
var/list_contents = copytext(text, list_start, list_end)
//Then, we seperate it into the individual entries
var/list/entries = list()
var/entry_end = 1
for(var/entry_start = 1, entry_end || entry_start != 1, entry_start = entry_end + 1)
entry_end = findtext(list_contents, ",", entry_start)
entries += copytext(list_contents, entry_start, entry_end)
//Finally, we assemble the completed list.
var/list/final_list = list()
for(var/entry in entries)
var/equals_position = findtext(entry, "=")
if(equals_position)
var/trim_left = trim_text(copytext(entry, 1, equals_position))
var/trim_right = trim_text(copytext(entry, equals_position + 1))
if(findtext(trim_right, "list("))
trim_right = get_list(trim_right, text_strings)
else if(findtext(trim_right, "~"))//Check for strings
while(findtext(trim_right,"~"))
var/reference_index = copytext(trim_right, findtext(trim_right, "~") + 1)
trim_right = text_strings[text2num(reference_index)]
//Check for numbers
else if(isnum(text2num(trim_right)))
trim_right = text2num(trim_right)
//Check for file
else if(copytext(trim_right,1,2) == "'")
trim_right = file(copytext(trim_right, 2, length(trim_right)))
if(findtext(trim_left, "~"))//Check for strings
while(findtext(trim_left,"~"))
var/reference_index = copytext(trim_left, findtext(trim_left, "~") + 1)
trim_left = text_strings[text2num(reference_index)]
final_list[trim_left] = trim_right
else
if(findtext(entry, "~"))//Check for strings
while(findtext(entry, "~"))
var/reference_index = copytext(entry, findtext(entry, "~") + 1)
entry = text_strings[text2num(reference_index)]
//Check for numbers
else if(isnum(text2num(entry)))
entry = text2num(entry)
//Check for file
else if(copytext(entry, 1, 2) == "'")
entry = file(copytext(entry, 2, length(entry)))
final_list += entry
return final_list
+1 -1
View File
@@ -311,7 +311,7 @@ commented out in r5061, I left it because of the shroom thingies
if (istype(W, /obj/item/device/measuring_tape))
var/obj/item/device/measuring_tape/P = W
user.visible_message("\blue[user] extends [P] towards [src].","\blue You extend [P] towards [src].")
if(do_after(user,40))
if(do_after(user,25))
user << "\blue \icon[P] [src] has been excavated to a depth of [2*src.excavation_level]cm."
return
@@ -88,7 +88,7 @@
update_inv_glasses()
else if (W == head)
head = null
if(W.flags & BLOCKHAIR)
if((W.flags & BLOCKHAIR) || (W.flags & BLOCKHEADHAIR))
update_hair(0) //rebuild hair
success = 1
update_inv_head()
@@ -107,7 +107,7 @@
else if (W == wear_mask)
wear_mask = null
success = 1
if(W.flags & BLOCKHAIR)
if((W.flags & BLOCKHAIR) || (W.flags & BLOCKHEADHAIR))
update_hair(0) //rebuild hair
if(internal)
if(internals)
@@ -188,7 +188,7 @@
update_inv_back(redraw_mob)
if(slot_wear_mask)
src.wear_mask = W
if(wear_mask.flags & BLOCKHAIR)
if((wear_mask.flags & BLOCKHAIR) || (wear_mask.flags & BLOCKHEADHAIR))
update_hair(redraw_mob) //rebuild hair
W.equipped(src, slot)
update_inv_wear_mask(redraw_mob)
@@ -229,7 +229,7 @@
update_inv_gloves(redraw_mob)
if(slot_head)
src.head = W
if(head.flags & BLOCKHAIR)
if((head.flags & BLOCKHAIR) || (head.flags & BLOCKHEADHAIR))
update_hair(redraw_mob) //rebuild hair
if(istype(W,/obj/item/clothing/head/kitty))
W.update_icon(src)
@@ -350,7 +350,6 @@ proc/get_damage_icon_part(damage_state, body_part)
//masks and helmets can obscure our hair.
if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
if(update_icons) update_icons()
return
//base icons
@@ -367,7 +366,7 @@ proc/get_damage_icon_part(damage_state, body_part)
face_standing.Blend(facial_s, ICON_OVERLAY)
face_lying.Blend(facial_l, ICON_OVERLAY)
if(h_style)
if(h_style && !(head && (head.flags & BLOCKHEADHAIR)))
var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
if(hair_style)
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
@@ -0,0 +1,145 @@
// TODO: remove the robot.mmi and robot.cell variables and completely rely on the robot component system
/datum/robot_component/var/name
/datum/robot_component/var/installed = 0
/datum/robot_component/var/powered = 0
/datum/robot_component/var/toggled = 1
/datum/robot_component/var/brute_damage = 0
/datum/robot_component/var/electronics_damage = 0
/datum/robot_component/var/energy_consumption = 0
/datum/robot_component/var/max_damage = 30
/datum/robot_component/var/mob/living/silicon/robot/owner
// The actual device object that has to be installed for this.
/datum/robot_component/var/external_type = null
// The wrapped device(e.g. radio), only set if external_type isn't null
/datum/robot_component/var/obj/item/wrapped = null
/datum/robot_component/New(mob/living/silicon/robot/R)
src.owner = R
/datum/robot_component/proc/install()
/datum/robot_component/proc/uninstall()
/datum/robot_component/proc/destroy()
if(wrapped)
del wrapped
wrapped = new/obj/item/broken_device
// The thing itself isn't there anymore, but some fried remains are.
installed = -1
uninstall()
/datum/robot_component/proc/take_damage(brute, electronics, sharp)
if(installed != 1) return
brute_damage += brute
electronics_damage += electronics
if(brute_damage + electronics_damage > max_damage) destroy()
/datum/robot_component/proc/heal_damage(brute, electronics)
if(installed != 1)
// If it's not installed, can't repair it.
return 0
brute_damage = max(0, brute_damage - brute)
electronics_damage = max(0, electronics_damage - electronics)
/datum/robot_component/proc/is_powered()
return installed == 1 && (!energy_consumption || powered)
/datum/robot_component/proc/consume_power()
if(toggled == 0)
powered = 0
return
if(owner.cell.charge >= energy_consumption)
owner.cell.use(energy_consumption)
powered = 1
else
powered = 0
/datum/robot_component/actuator
name = "actuator"
energy_consumption = 2
external_type = /obj/item/robot_parts/robot_component/actuator
max_damage = 60
/datum/robot_component/cell
name = "power cell"
max_damage = 60
/datum/robot_component/cell/destroy()
..()
owner.cell = null
/datum/robot_component/radio
name = "radio"
external_type = /obj/item/robot_parts/robot_component/radio
energy_consumption = 3
max_damage = 10
/datum/robot_component/binary_communication
name = "binary communication device"
external_type = /obj/item/robot_parts/robot_component/binary_communication_device
energy_consumption = 0
max_damage = 30
/datum/robot_component/camera
name = "camera"
external_type = /obj/item/robot_parts/robot_component/camera
energy_consumption = 2
max_damage = 20
/datum/robot_component/diagnosis_unit
name = "self-diagnosis unit"
energy_consumption = 1
external_type = /obj/item/robot_parts/robot_component/diagnosis_unit
max_damage = 30
/mob/living/silicon/robot/proc/initialize_components()
// This only initializes the components, it doesn't set them to installed.
components["actuator"] = new/datum/robot_component/actuator(src)
components["radio"] = new/datum/robot_component/radio(src)
components["power cell"] = new/datum/robot_component/cell(src)
components["diagnosis unit"] = new/datum/robot_component/diagnosis_unit(src)
components["camera"] = new/datum/robot_component/camera(src)
components["comms"] = new/datum/robot_component/binary_communication(src)
/mob/living/silicon/robot/proc/is_component_functioning(module_name)
var/datum/robot_component/C = components[module_name]
return C && C.installed == 1 && C.toggled && C.is_powered()
/obj/item/broken_device
name = "broken component"
icon = 'robot_component.dmi'
icon_state = "broken"
/obj/item/robot_parts/robot_component
icon = 'robot_component.dmi'
icon_state = "working"
construction_time = 200
construction_cost = list("metal"=5000)
// TODO: actual icons ;)
/obj/item/robot_parts/robot_component/binary_communication_device
name = "binary communication device"
/obj/item/robot_parts/robot_component/actuator
name = "actuator"
/obj/item/robot_parts/robot_component/camera
name = "camera"
/obj/item/robot_parts/robot_component/diagnosis_unit
name = "diagnosis unit"
/obj/item/robot_parts/robot_component/radio
name = "radio"
+17 -16
View File
@@ -10,7 +10,18 @@
switch(act)
if ("me")
return custom_emote(m_type, message)
if (src.client)
if(client.prefs.muted & MUTE_IC)
src << "You cannot send IC messages (muted)."
return
if (src.client.handle_spam_prevention(message,MUTE_IC))
return
if (stat)
return
if(!(message))
return
else
return custom_emote(m_type, message)
if ("custom")
return custom_emote(m_type, message)
@@ -62,20 +73,6 @@
message = "<B>[src]</B> flaps his wings ANGRILY!"
m_type = 2
if ("me")
if (src.client)
if(client.prefs.muted & MUTE_IC)
src << "You cannot send IC messages (muted)."
return
if (src.client.handle_spam_prevention(message,MUTE_IC))
return
if (stat)
return
if(!(message))
return
else
message = "<B>[src]</B> [message]"
if ("twitch")
message = "<B>[src]</B> twitches violently."
m_type = 1
@@ -207,8 +204,12 @@
m_type = 2
else
src << "You are not security."
if ("help")
src << "salute, bow-(none)/mob, clap, flap, aflap, twitch, twitch_s, nod, deathgasp, glare-(none)/mob, stare-(none)/mob, look, beep, ping, \nbuzz, law, halt"
else
src << text("Invalid Emote: []", act)
src << "\blue Unusable emote '[act]'. Say *help for a list."
if ((message && src.stat == 0))
if (m_type & 1)
for(var/mob/O in viewers(src, null))
+23 -10
View File
@@ -37,23 +37,25 @@
/mob/living/silicon/robot/proc/use_power()
if (src.cell)
if (is_component_functioning("power cell"))
if(src.cell.charge <= 0)
uneq_all()
src.stat = 1
else if (src.cell.charge <= 100)
uneq_all()
src.sight_mode = 0
src.cell.use(1)
else
if(src.module_state_1)
src.cell.use(5)
src.cell.use(3)
if(src.module_state_2)
src.cell.use(5)
src.cell.use(3)
if(src.module_state_3)
src.cell.use(5)
src.cell.use(1)
src.blinded = 0
src.cell.use(3)
for(var/V in components)
var/datum/robot_component/C = components[V]
C.consume_power()
if(!is_component_functioning("actuator"))
Paralyse(3)
src.stat = 0
else
uneq_all()
@@ -128,6 +130,17 @@
src.druggy--
src.druggy = max(0, src.druggy)
if(!is_component_functioning("radio"))
radio.on = 0
else
radio.on = 1
if(is_component_functioning("camera"))
src.blinded = 0
else
src.blinded = 1
return 1
/mob/living/silicon/robot/proc/handle_regular_hud_updates()
+122 -9
View File
@@ -5,6 +5,8 @@
icon_state = "robot"
maxHealth = 300
health = 300
universal_speak = 1
var/sight_mode = 0
var/custom_name = ""
@@ -27,6 +29,9 @@
var/obj/item/weapon/cell/cell = null
var/obj/machinery/camera/camera = null
// Components are basically robot organs.
var/list/components = list()
var/obj/item/device/mmi/mmi = null
var/obj/item/device/pda/ai/rbPDA = null
@@ -58,7 +63,7 @@
var/braintype = "Cyborg"
var/pose
/mob/living/silicon/robot/New(loc,var/syndie = 0)
/mob/living/silicon/robot/New(loc,var/syndie = 0,var/unfinished = 0)
spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
@@ -67,12 +72,10 @@
updatename("Default")
updateicon()
if(!cell)
cell = new /obj/item/weapon/cell(src)
cell.maxcharge = 7500
cell.charge = 7500
if(syndie)
if(!cell)
cell = new /obj/item/weapon/cell(src)
laws = new /datum/ai_laws/antimov()
lawupdate = 0
scrambledcodes = 1
@@ -99,6 +102,25 @@
camera.network = list("SS13")
if(isWireCut(5)) // 5 = BORG CAMERA
camera.status = 0
initialize_components()
if(!unfinished)
// Create all the robot parts.
for(var/V in components) if(V != "power cell")
var/datum/robot_component/C = components[V]
C.installed = 1
C.wrapped = new C.external_type
if(!cell)
cell = new /obj/item/weapon/cell(src)
cell.maxcharge = 7500
cell.charge = 7500
if(cell)
var/datum/robot_component/cell_component = components["power cell"]
cell_component.wrapped = cell
cell_component.installed = 1
..()
playsound(loc, 'sound/voice/liveagain.ogg', 75, 1)
@@ -381,6 +403,53 @@
viewalerts = 1
src << browse(dat, "window=robotalerts&can_close=0")
/mob/living/silicon/robot/proc/self_diagnosis()
if(!is_component_functioning("diagnosis unit"))
return null
var/dat = "<HEAD><TITLE>[src.name] Self-Diagnosis Report</TITLE></HEAD><BODY>\n"
for (var/V in components)
var/datum/robot_component/C = components[V]
dat += "<b>[C.name]</b><br><table><tr><td>Power consumption</td><td>[C.energy_consumption]</td></tr><tr><td>Brute Damage:</td><td>[C.brute_damage]</td></tr><tr><td>Electronics Damage:</td><td>[C.electronics_damage]</td></tr><tr><td>Powered:</td><td>[(!C.energy_consumption || C.is_powered()) ? "Yes" : "No"]</td></tr><tr><td>Toggled:</td><td>[ C.toggled ? "Yes" : "No"]</td></table><br>"
return dat
/mob/living/silicon/robot/verb/self_diagnosis_verb()
set category = "Robot Commands"
set name = "Self Diagnosis"
if(!is_component_functioning("diagnosis unit"))
src << "\red Your self-diagnosis component isn't functioning."
var/dat = self_diagnosis()
src << browse(dat, "window=robotdiagnosis")
/mob/living/silicon/robot/verb/toggle_component()
set category = "Robot Commands"
set name = "Toggle Component"
set desc = "Toggle a component, conserving power."
var/list/installed_components = list()
for(var/V in components)
if(V == "power cell") continue
var/datum/robot_component/C = components[V]
if(C.installed)
installed_components += V
var/toggle = input(src, "Which component do you want to toggle?", "Toggle Component") as null|anything in installed_components
if(!toggle)
return
var/datum/robot_component/C = components[toggle]
if(C.toggled)
C.toggled = 0
src << "\red You disable [C.name]."
else
C.toggled = 1
src << "\red You enable [C.name]."
/mob/living/silicon/robot/blob_act()
if (stat != 2)
adjustBruteLoss(60)
@@ -564,6 +633,20 @@
if (istype(W, /obj/item/weapon/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do
return
if(opened) // Are they trying to insert something?
for(var/V in components)
var/datum/robot_component/C = components[V]
if(!C.installed && istype(W, C.external_type))
C.installed = 1
C.wrapped = W
C.install()
user.drop_item()
W.loc = null
usr << "\blue You install the [W.name]."
return
if (istype(W, /obj/item/weapon/weldingtool))
if (!getBruteLoss())
user << "Nothing to fix here!"
@@ -609,6 +692,27 @@
C.updateicon()
new/obj/item/robot_parts/chest(loc)
src.Del()
else
// Okay we're not removing the cell or an MMI, but maybe something else?
var/list/removable_components = list()
for(var/V in components)
if(V == "power cell") continue
var/datum/robot_component/C = components[V]
if(C.installed == 1)
removable_components += V
var/remove = input(user, "Which component do you want to pry out?", "Remove Component") as null|anything in removable_components
if(!remove)
return
var/datum/robot_component/C = components[remove]
var/obj/item/I = C.wrapped
user << "You remove \the [I]."
I.loc = src.loc
if(C.installed == 1)
C.uninstall()
C.installed = 0
else
if(locked)
user << "The cover is locked and cannot be opened."
@@ -618,17 +722,20 @@
updateicon()
else if (istype(W, /obj/item/weapon/cell) && opened) // trying to put a cell inside
var/datum/robot_component/C = components["power cell"]
if(wiresexposed)
user << "Close the panel first."
else if(cell)
else if(cell || C.installed)
user << "There is a power cell already installed."
else
user.drop_item()
W.loc = src
cell = W
user << "You insert the power cell."
// chargecount = 0
updateicon()
C.installed = 1
C.wrapped = W
C.install()
else if (istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/multitool))
if (wiresexposed)
@@ -901,6 +1008,7 @@
add_fingerprint(user)
if(opened && !wiresexposed && (!istype(user, /mob/living/silicon)))
var/datum/robot_component/cell_component = components["power cell"]
if(cell)
cell.updateicon()
cell.add_fingerprint(user)
@@ -908,6 +1016,11 @@
user << "You remove \the [cell]."
cell = null
updateicon()
else if(cell_component.installed == -1)
cell_component.installed = 0
var/obj/item/broken_device = cell_component.wrapped
user << "You remove \the [broken_device]."
user.put_in_active_hand(broken_device)
if(ishuman(user))
if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining)
@@ -0,0 +1,83 @@
/mob/living/silicon/robot/getBruteLoss()
var/amount = 0
for(var/V in components)
var/datum/robot_component/C = components[V]
if(C.installed == 1) amount += C.brute_damage
return amount
/mob/living/silicon/robot/getFireLoss()
var/amount = 0
for(var/V in components)
var/datum/robot_component/C = components[V]
if(C.installed == 1) amount += C.electronics_damage
return amount
/mob/living/silicon/robot/adjustBruteLoss(var/amount)
if(amount > 0)
take_overall_damage(amount, 0)
else
heal_overall_damage(-amount, 0)
/mob/living/silicon/robot/adjustFireLoss(var/amount)
if(amount > 0)
take_overall_damage(0, amount)
else
heal_overall_damage(0, -amount)
/mob/living/silicon/robot/proc/get_damaged_components(var/brute, var/burn)
var/list/datum/robot_component/parts = list()
for(var/V in components)
var/datum/robot_component/C = components[V]
if(C.installed == 1) if((brute && C.brute_damage) || (burn && C.electronics_damage))
parts += C
return parts
/mob/living/silicon/robot/proc/get_damageable_components()
var/list/rval = new
for(var/V in components)
var/datum/robot_component/C = components[V]
if(C.installed == 1) rval += C
return rval
/mob/living/silicon/robot/heal_organ_damage(var/brute, var/burn)
var/list/datum/robot_component/parts = get_damaged_components(brute,burn)
if(!parts.len) return
var/datum/robot_component/picked = pick(parts)
picked.heal_damage(brute,burn)
/mob/living/silicon/robot/take_organ_damage(var/brute, var/burn, var/sharp = 0)
var/datum/robot_component/C = pick(get_damageable_components())
C.take_damage(brute,burn,sharp)
/mob/living/silicon/robot/heal_overall_damage(var/brute, var/burn)
var/list/datum/robot_component/parts = get_damaged_components(brute,burn)
while(parts.len && (brute>0 || burn>0) )
var/datum/robot_component/picked = pick(parts)
var/brute_was = picked.brute_damage
var/burn_was = picked.electronics_damage
picked.heal_damage(brute,burn)
brute -= (brute_was-picked.brute_damage)
burn -= (burn_was-picked.electronics_damage)
parts -= picked
/mob/living/silicon/robot/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/used_weapon = null)
if(status_flags & GODMODE) return //godmode
var/list/datum/robot_component/parts = get_damageable_components()
while(parts.len && (brute>0 || burn>0) )
var/datum/robot_component/picked = pick(parts)
var/brute_was = picked.brute_damage
var/burn_was = picked.electronics_damage
picked.take_damage(brute,burn)
brute -= (picked.brute_damage - brute_was)
burn -= (picked.electronics_damage - burn_was)
parts -= picked
+8
View File
@@ -24,6 +24,14 @@
return ..(message)
message = copytext(message, 3)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
// TODO: move the component system up to silicon so we don't have to use this ugly hack..
if(istype(src, /mob/living/silicon/robot))
var/mob/living/silicon/robot/R = src
if(!R.is_component_functioning("comms"))
src << "\red Your binary communications component isn't functional."
return
robot_talk(message)
else if (department_radio_keys[prefix] == "department")
if(isAI(src)&&client)//For patching directly into AI holopads.
+12 -12
View File
@@ -2788,7 +2788,7 @@ datum
// make all the beverages work together
for(var/datum/reagent/ethanol/A in holder.reagent_list)
if(A.data) d += A.data
if(isnum(A.data)) d += A.data
M.dizziness +=dizzy_adj.
if(d >= slur_start && d < pass_out)
@@ -3449,14 +3449,14 @@ datum
nutriment_factor = 1 * FOOD_METABOLISM
color = "#2E6671" // rgb: 46, 102, 113
on_mob_life(var/mob/living/M as mob)
if(!data) data = 1
data++
M.dizziness +=10
if(data >= 55 && data <115)
if (!M.stuttering) M.stuttering = 1
M.stuttering += 10
else if(data >= 115 && prob(33))
M.confused = max(M.confused+15,15)
..()
return
on_mob_life(var/mob/living/M as mob)
if(!data) data = 1
data++
M.dizziness +=10
if(data >= 55 && data <115)
if (!M.stuttering) M.stuttering = 1
M.stuttering += 10
else if(data >= 115 && prob(33))
M.confused = max(M.confused+15,15)
..()
return
+290
View File
@@ -0,0 +1,290 @@
/obj/item/weapon/dart_cartridge
name = "dart cartridge"
desc = "A rack of hollow darts."
icon = 'icons/obj/ammo.dmi'
icon_state = "darts-5"
item_state = "rcdammo"
opacity = 0
density = 0
anchored = 0.0
origin_tech = "materials=2"
var/darts = 5
/obj/item/weapon/dart_cartridge/update_icon()
if(!darts)
icon_state = "darts-0"
else if(darts > 5)
icon_state = "darts-5"
else
icon_state = "darts-[darts]"
return 1
/obj/item/weapon/gun/dartgun
name = "dart gun"
desc = "A small gas-powered dartgun, capable of delivering chemical cocktails swiftly across short distances."
icon_state = "dartgun-empty"
var/list/beakers = list() //All containers inside the gun.
var/list/mixing = list() //Containers being used for mixing.
var/obj/item/weapon/dart_cartridge/cartridge = null //Container of darts.
var/max_beakers = 3
var/dart_reagent_amount = 5
var/container_type = /obj/item/weapon/reagent_containers/glass/beaker/vial
var/list/starting_chems = null
/obj/item/weapon/gun/dartgun/update_icon()
if(!cartridge)
icon_state = "dartgun-empty"
return 1
if(!cartridge.darts)
icon_state = "dartgun-0"
else if(cartridge.darts > 5)
icon_state = "dartgun-5"
else
icon_state = "dartgun-[cartridge.darts]"
return 1
/obj/item/weapon/gun/dartgun/New()
..()
if(starting_chems)
for(var/chem in starting_chems)
var/obj/item/weapon/reagent_containers/glass/beaker/vial/B = new(src)
B.reagents.add_reagent(chem, 25)
beakers += B
/obj/item/weapon/gun/dartgun/examine()
set src in view()
update_icon()
..()
if (!(usr in view(2)) && usr!=src.loc)
return
if (beakers.len)
usr << "\blue [src] contains:"
for(var/obj/item/weapon/reagent_containers/glass/beaker/B in beakers)
if(B.reagents && B.reagents.reagent_list.len)
for(var/datum/reagent/R in B.reagents.reagent_list)
usr << "\blue [R.volume] units of [R.name]"
/obj/item/weapon/gun/dartgun/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I, /obj/item/weapon/dart_cartridge))
var/obj/item/weapon/dart_cartridge/D = I
if(!D.darts)
user << "\blue [D] is empty."
return 0
if(cartridge)
if(cartridge.darts <= 0)
src.remove_cartridge()
else
user << "\blue There's already a cartridge in [src]."
return 0
user.drop_item()
cartridge = D
D.loc = src
user << "\blue You slot [D] into [src]."
update_icon()
return
if(istype(I, /obj/item/weapon/reagent_containers/glass))
if(!istype(I, container_type))
user << "\blue [I] doesn't seem to fit into [src]."
return
if(beakers.len >= max_beakers)
user << "\blue [src] already has [max_beakers] vials in it - another one isn't going to fit!"
return
var/obj/item/weapon/reagent_containers/glass/beaker/B = I
user.drop_item()
B.loc = src
beakers += B
user << "\blue You slot [B] into [src]."
src.updateUsrDialog()
/obj/item/weapon/gun/dartgun/can_fire()
if(!cartridge)
return 0
else
return cartridge.darts
/obj/item/weapon/gun/dartgun/proc/has_selected_beaker_reagents()
return 0
/obj/item/weapon/gun/dartgun/proc/remove_cartridge()
if(cartridge)
usr << "\blue You pop the cartridge out of [src]."
var/obj/item/weapon/dart_cartridge/C = cartridge
C.loc = get_turf(src)
C.update_icon()
cartridge = null
src.update_icon()
/obj/item/weapon/gun/dartgun/proc/get_mixed_syringe()
if (!cartridge)
return 0
if(!cartridge.darts)
return 0
var/obj/item/weapon/reagent_containers/syringe/dart = new(src)
if(mixing.len)
var/mix_amount = dart_reagent_amount/mixing.len
for(var/obj/item/weapon/reagent_containers/glass/beaker/B in mixing)
B.reagents.trans_to(dart,mix_amount)
return dart
/obj/item/weapon/gun/dartgun/proc/fire_dart(atom/target, mob/user)
if (locate (/obj/structure/table, src.loc))
return
else
var/turf/trg = get_turf(target)
var/obj/effect/syringe_gun_dummy/D = new/obj/effect/syringe_gun_dummy(get_turf(src))
var/obj/item/weapon/reagent_containers/syringe/S = get_mixed_syringe()
if(!S)
user << "\red There are no darts in [src]!"
return
if(!S.reagents)
user << "\red There are no reagents available!"
return
cartridge.darts--
src.update_icon()
S.reagents.trans_to(D, S.reagents.total_volume)
del(S)
D.icon_state = "syringeproj"
D.name = "syringe"
D.flags |= NOREACT
playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
for(var/i=0, i<6, i++)
if(!D) break
if(D.loc == trg) break
step_towards(D,trg)
if(D)
for(var/mob/living/carbon/M in D.loc)
if(!istype(M,/mob/living/carbon)) continue
if(M == user) continue
//Syringe gun attack logging by Yvarov
var/R
if(D.reagents)
for(var/datum/reagent/A in D.reagents.reagent_list)
R += A.id + " ("
R += num2text(A.volume) + "),"
if (istype(M, /mob))
M.attack_log += "\[[time_stamp()]\] <b>[user]/[user.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>syringegun</b> ([R])"
user.attack_log += "\[[time_stamp()]\] <b>[user]/[user.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>syringegun</b> ([R])"
log_attack("<font color='red'>[user] ([user.ckey]) shot [M] ([M.ckey]) with a syringegun ([R])</font>")
else
M.attack_log += "\[[time_stamp()]\] <b>UNKNOWN SUBJECT (No longer exists)</b> shot <b>[M]/[M.ckey]</b> with a <b>syringegun</b> ([R])"
log_attack("<font color='red'>UNKNOWN shot [M] ([M.ckey]) with a <b>syringegun</b> ([R])</font>")
if(D.reagents)
D.reagents.trans_to(M, 15)
M << "<span class='danger'>You feel a slight prick.</span>"
del(D)
break
if(D)
for(var/atom/A in D.loc)
if(A == user) continue
if(A.density) del(D)
sleep(1)
if (D) spawn(10) del(D)
return
/obj/item/weapon/gun/dartgun/afterattack(obj/target, mob/user , flag)
if(!isturf(target.loc) || target == user) return
..()
/obj/item/weapon/gun/dartgun/can_hit(var/mob/living/target as mob, var/mob/living/user as mob)
return 1
/obj/item/weapon/gun/dartgun/attack_self(user as mob)
var/dat = "<b>[src] mixing control:</b><br><br>"
if (beakers.len)
var/i = 1
for(var/obj/item/weapon/reagent_containers/glass/beaker/B in beakers)
dat += "Beaker [i] contains: "
if(B.reagents && B.reagents.reagent_list.len)
for(var/datum/reagent/R in B.reagents.reagent_list)
dat += "<br> [R.volume] units of [R.name], "
if (check_beaker_mixing(B))
dat += text("<A href='?src=\ref[src];stop_mix=[i]'><font color='green'>Mixing</font></A> ")
else
dat += text("<A href='?src=\ref[src];mix=[i]'><font color='red'>Not mixing</font></A> ")
else
dat += "nothing."
dat += " \[<A href='?src=\ref[src];eject=[i]'>Eject</A>\]<br>"
i++
else
dat += "There are no beakers inserted!<br><br>"
if(cartridge)
if(cartridge.darts)
dat += "The dart cartridge has [cartridge.darts] shots remaining."
else
dat += "<font color='red'>The dart cartridge is empty!</font>"
dat += " \[<A href='?src=\ref[src];eject_cart=1'>Eject</A>\]"
user << browse("[dat]", "window=dartgun_mixing_window")
/obj/item/weapon/gun/dartgun/proc/check_beaker_mixing(var/obj/item/B)
if(!mixing || !beakers)
return 0
for(var/obj/item/M in mixing)
if(M == B)
return 1
return 0
/obj/item/weapon/gun/dartgun/Topic(href, href_list)
src.add_fingerprint(usr)
if(href_list["stop_mix"])
var/index = text2num(href_list["stop_mix"])
if(index <= beakers.len)
for(var/obj/item/M in mixing)
if(M == beakers[index])
mixing -= M
break
else if (href_list["mix"])
var/index = text2num(href_list["mix"])
if(index <= beakers.len)
mixing += beakers[index]
else if (href_list["eject"])
var/index = text2num(href_list["eject"])
if(index <= beakers.len)
if(beakers[index])
var/obj/item/weapon/reagent_containers/glass/beaker/B = beakers[index]
usr << "You remove [B] from [src]."
mixing -= B
beakers -= B
B.loc = get_turf(src)
else if (href_list["eject_cart"])
remove_cartridge()
src.updateUsrDialog()
return
/obj/item/weapon/gun/dartgun/Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params, reflex = 0)
if(cartridge)
spawn(0) fire_dart(target,user)
else
usr << "\red [src] is empty."
/obj/item/weapon/gun/dartgun/vox
name = "alien dart gun"
desc = "A small gas-powered dartgun, fitted for nonhuman hands."
/obj/item/weapon/gun/dartgun/vox/medical
starting_chems = list("kelotane","bicaridine","anti_toxin")
/obj/item/weapon/gun/dartgun/vox/raider
starting_chems = list("space_drugs","stoxin","impedrezene")
@@ -178,6 +178,16 @@
possible_transfer_amounts = list(5,10,15,25,30,50,100)
flags = FPRINT | TABLEPASS | OPENCONTAINER
/obj/item/weapon/reagent_containers/glass/beaker/vial
name = "vial"
desc = "A small glass vial. Can hold up to 25 units."
icon_state = "vial"
g_amt = 250
volume = 25
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25)
flags = FPRINT | TABLEPASS | OPENCONTAINER
/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone
New()
..()
+1 -276
View File
@@ -128,279 +128,4 @@
New()
var/datum/reagents/R = new/datum/reagents(15)
reagents = R
R.my_atom = src
/obj/item/weapon/dart_cartridge
name = "dart cartridge"
desc = "A rack of hollow darts."
icon = 'icons/obj/ammo.dmi'
icon_state = "darts-5"
item_state = "rcdammo"
opacity = 0
density = 0
anchored = 0.0
origin_tech = "materials=2"
var/darts = 5
/obj/item/weapon/dart_cartridge/update_icon()
if(!darts)
icon_state = "darts-0"
else if(darts > 5)
icon_state = "darts-5"
else
icon_state = "darts-[darts]"
return 1
/obj/item/weapon/gun/dartgun
name = "dart gun"
desc = "A small gas-powered dartgun, capable of delivering chemical cocktails swiftly across short distances."
icon_state = "dartgun-empty"
var/list/beakers = list() //All containers inside the gun.
var/list/mixing = list() //Containers being used for mixing.
var/obj/item/weapon/dart_cartridge/cartridge = null //Container of darts.
var/max_beakers = 3
/obj/item/weapon/gun/dartgun/update_icon()
if(!cartridge)
icon_state = "dartgun-empty"
return 1
if(!cartridge.darts)
icon_state = "dartgun-0"
else if(cartridge.darts > 5)
icon_state = "dartgun-5"
else
icon_state = "dartgun-[cartridge.darts]"
return 1
/obj/item/weapon/gun/dartgun/New()
if(beakers.len)
return
// The dartgun has one beaker by default.
var/obj/item/weapon/reagent_containers/glass/beaker/B = new(src)
beakers += B
..()
/obj/item/weapon/gun/dartgun/examine()
set src in view()
update_icon()
..()
if (!(usr in view(2)) && usr!=src.loc)
return
if (beakers.len)
usr << "\blue [src] contains:"
for(var/obj/item/weapon/reagent_containers/glass/beaker/B in beakers)
if(B.reagents && B.reagents.reagent_list.len)
for(var/datum/reagent/R in B.reagents.reagent_list)
usr << "\blue [R.volume] units of [R.name]"
/obj/item/weapon/gun/dartgun/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I, /obj/item/weapon/dart_cartridge))
var/obj/item/weapon/dart_cartridge/D = I
if(!D.darts)
user << "\blue [D] is empty."
return 0
if(cartridge)
if(cartridge.darts <= 0)
src.remove_cartridge()
else
user << "\blue There's already a cartridge in [src]."
return 0
user.drop_item()
cartridge = D
D.loc = src
user << "\blue You slot [D] into [src]."
update_icon()
return
if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker))
if(beakers.len >= max_beakers)
user << "\blue [src] already has [max_beakers] beakers in it - another one isn't going to fit!"
return
var/obj/item/weapon/reagent_containers/glass/beaker/B = I
user.drop_item()
B.loc = src
beakers += B
user << "\blue You slot [B] into [src]."
src.updateUsrDialog()
/obj/item/weapon/gun/dartgun/can_fire()
if(!cartridge)
return 0
else
return cartridge.darts
/obj/item/weapon/gun/dartgun/proc/has_selected_beaker_reagents()
return 0
/obj/item/weapon/gun/dartgun/proc/remove_cartridge()
if(cartridge)
usr << "\blue You pop the cartridge out of [src]."
var/obj/item/weapon/dart_cartridge/C = cartridge
C.loc = get_turf(src)
C.update_icon()
cartridge = null
src.update_icon()
/obj/item/weapon/gun/dartgun/proc/get_mixed_syringe()
if (!cartridge)
return 0
if(!cartridge.darts)
return 0
var/obj/item/weapon/reagent_containers/syringe/dart = new(src)
if(mixing.len)
var/mix_amount = 10/mixing.len
for(var/obj/item/weapon/reagent_containers/glass/beaker/B in mixing)
B.reagents.trans_to(dart,mix_amount)
return dart
/obj/item/weapon/gun/dartgun/proc/fire_dart(atom/target, mob/user)
if (locate (/obj/structure/table, src.loc))
return
else
var/turf/trg = get_turf(target)
var/obj/effect/syringe_gun_dummy/D = new/obj/effect/syringe_gun_dummy(get_turf(src))
var/obj/item/weapon/reagent_containers/syringe/S = get_mixed_syringe()
if(!S)
user << "\red There are no darts in [src]!"
return
if(!S.reagents)
user << "\red There are no reagents available!"
return
cartridge.darts--
src.update_icon()
S.reagents.trans_to(D, S.reagents.total_volume)
del(S)
D.icon_state = "syringeproj"
D.name = "syringe"
playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
for(var/i=0, i<6, i++)
if(!D) break
if(D.loc == trg) break
step_towards(D,trg)
if(D)
for(var/mob/living/carbon/M in D.loc)
if(!istype(M,/mob/living/carbon)) continue
if(M == user) continue
//Syringe gun attack logging by Yvarov
var/R
if(D.reagents)
for(var/datum/reagent/A in D.reagents.reagent_list)
R += A.id + " ("
R += num2text(A.volume) + "),"
if (istype(M, /mob))
M.attack_log += "\[[time_stamp()]\] <b>[user]/[user.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>syringegun</b> ([R])"
user.attack_log += "\[[time_stamp()]\] <b>[user]/[user.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>syringegun</b> ([R])"
log_attack("<font color='red'>[user] ([user.ckey]) shot [M] ([M.ckey]) with a syringegun ([R])</font>")
else
M.attack_log += "\[[time_stamp()]\] <b>UNKNOWN SUBJECT (No longer exists)</b> shot <b>[M]/[M.ckey]</b> with a <b>syringegun</b> ([R])"
log_attack("<font color='red'>UNKNOWN shot [M] ([M.ckey]) with a <b>syringegun</b> ([R])</font>")
if(D.reagents)
D.reagents.trans_to(M, 15)
M << "<span class='danger'>You feel a slight prick.</span>"
del(D)
break
if(D)
for(var/atom/A in D.loc)
if(A == user) continue
if(A.density) del(D)
sleep(1)
if (D) spawn(10) del(D)
return
/obj/item/weapon/gun/dartgun/afterattack(obj/target, mob/user , flag)
if(!isturf(target.loc) || target == user) return
..()
/obj/item/weapon/gun/dartgun/can_hit(var/mob/living/target as mob, var/mob/living/user as mob)
return 1
/obj/item/weapon/gun/dartgun/attack_self(user as mob)
var/dat = "<b>[src] mixing control:</b><br><br>"
if (beakers.len)
var/i = 1
for(var/obj/item/weapon/reagent_containers/glass/beaker/B in beakers)
dat += "Beaker [i] contains: "
if(B.reagents && B.reagents.reagent_list.len)
for(var/datum/reagent/R in B.reagents.reagent_list)
dat += "<br> [R.volume] units of [R.name], "
if (check_beaker_mixing(B))
dat += text("<A href='?src=\ref[src];stop_mix=[i]'><font color='green'>Mixing</font></A> ")
else
dat += text("<A href='?src=\ref[src];mix=[i]'><font color='red'>Not mixing</font></A> ")
else
dat += "nothing."
dat += " \[<A href='?src=\ref[src];eject=[i]'>Eject</A>\]<br>"
i++
else
dat += "There are no beakers inserted!<br><br>"
if(cartridge)
if(cartridge.darts)
dat += "The dart cartridge has [cartridge.darts] shots remaining."
else
dat += "<font color='red'>The dart cartridge is empty!</font>"
dat += " \[<A href='?src=\ref[src];eject_cart=1'>Eject</A>\]"
user << browse("[dat]", "window=dartgun_mixing_window")
/obj/item/weapon/gun/dartgun/proc/check_beaker_mixing(var/obj/item/B)
if(!mixing || !beakers)
return 0
for(var/obj/item/M in mixing)
if(M == B)
return 1
return 0
/obj/item/weapon/gun/dartgun/Topic(href, href_list)
src.add_fingerprint(usr)
if(href_list["stop_mix"])
var/index = text2num(href_list["stop_mix"])
if(index <= beakers.len)
for(var/obj/item/M in mixing)
if(M == beakers[index])
mixing -= M
break
else if (href_list["mix"])
var/index = text2num(href_list["mix"])
if(index <= beakers.len)
mixing += beakers[index]
else if (href_list["eject"])
var/index = text2num(href_list["eject"])
if(index <= beakers.len)
if(beakers[index])
var/obj/item/weapon/reagent_containers/glass/beaker/B = beakers[index]
usr << "You remove [B] from [src]."
mixing -= B
beakers -= B
B.loc = get_turf(src)
else if (href_list["eject_cart"])
remove_cartridge()
src.updateUsrDialog()
return
/obj/item/weapon/gun/dartgun/Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params, reflex = 0)
if(cartridge)
spawn(0) fire_dart(target,user)
else
usr << "\red [src] is empty."
R.my_atom = src
@@ -1,4 +1,6 @@
// This machine shows the age for extremely old finds
obj/machinery/anomaly/accelerator
name = "Accelerator spectrometer"
@@ -23,7 +23,7 @@
var/obj/item/weapon/reagent_containers/glass/held_container
var/obj/item/weapon/tank/fuel_container
var/target_scan_ticks = 60
var/target_scan_ticks = 30
var/report_num = 0
var/scan_process = 0
var/temperature = 273 //measured in kelvin, if this exceeds 1200, the machine is damaged and requires repairs
@@ -50,8 +50,10 @@
if(scan_process)
if(scan_process++ > target_scan_ticks)
FinishScan()
if(temperature > 350 && prob(10))
else if(temperature > 400)
src.visible_message("\blue \icon[src] shuts down from the heat!", 2)
scan_process = 0
else if(temperature > 350 && prob(10))
src.visible_message("\blue \icon[src] bleets plaintively.", 2)
if(temperature > 400)
scan_process = 0
@@ -107,7 +109,7 @@
user.machine = src
var/dat = "<B>[src.name]</B><BR>"
dat += "Module heat level: [temperature] kelvin<br>"
dat += "Safeties set at 300k, shielding failure at 400k. Failure to maintain safe heat levels may result in equipment damage.<br>"
dat += "Safeties set at 350k, shielding failure at 400k. Failure to maintain safe heat levels may result in equipment damage.<br>"
dat += "<hr>"
if(scan_process)
dat += "Scan in progress<br><br><br>"
@@ -178,7 +180,7 @@ obj/machinery/anomaly/Topic(href, href_list)
fuel_container.loc = src.loc
fuel_container = null
if(href_list["begin"])
if(temperature >= 300)
if(temperature >= 350)
var/proceed = input("Unsafe internal temperature detected, enter YES below to continue.","Warning")
if(proceed == "YES" && get_dist(src, usr) <= 1)
scan_process = 1
@@ -1,4 +1,6 @@
// This machine tells the distance to a nearby artifact, if there is one
obj/machinery/anomaly/fourier_transform
name = "Fourier Transform spectroscope"
@@ -1,4 +1,6 @@
// This machine shows the materials that are present
obj/machinery/anomaly/gas_chromatography
name = "Gas Chromatography spectrometer"
@@ -1,4 +1,6 @@
// This machine shows the amount of a certain material that is present
obj/machinery/anomaly/ion_mobility
name = "Ion Mobility Spectrometer"
desc = "A specialised, complex analysis machine."
@@ -1,4 +1,6 @@
// This machine shows the age for newer finds
obj/machinery/anomaly/isotope_ratio
name = "Isotope ratio spectrometer"
desc = "A specialised, complex analysis machine."
@@ -100,6 +100,7 @@
new /obj/item/clothing/glasses/meson(src)
new /obj/item/weapon/pickaxe(src)
new /obj/item/device/measuring_tape(src)
new /obj/item/weapon/pickaxe/hand(src)
return
//---- Isolation room air alarms
@@ -24,4 +24,5 @@
"/obj/item/weapon/anodevice",
"/obj/item/clothing/glasses",
"/obj/item/weapon/wrench",
"/obj/item/weapon/storage/box/excavation",
"/obj/item/weapon/anobattery")
@@ -85,6 +85,7 @@
dat += "Anomaly depth: [current.depth] cm<br>"
dat += "Clearance above anomaly depth: [current.clearance] cm<br>"
dat += "Dissonance spread: [current.dissonance_spread]<br>"
dat += "Anomaly material: [current.material]<br>"
dat += "<A href='?src=\ref[src];clear=[current.record_index]'>clear entry</a><br>"
else
dat += "Select an entry from the list<br>"
@@ -7,7 +7,7 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick_brush"
item_state = "syringe_0"
digspeed = 50
digspeed = 20
desc = "Thick metallic wires for clearing away dust and loose scree (1 centimetre excavation depth)."
excavation_amount = 0.5
drill_sound = 'sound/weapons/thudswoosh.ogg'
@@ -19,7 +19,7 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick1"
item_state = "syringe_0"
digspeed = 50
digspeed = 20
desc = "A miniature excavation tool for precise digging (2 centimetre excavation depth)."
excavation_amount = 1
drill_sound = 'sound/items/Screwdriver.ogg'
@@ -31,7 +31,7 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick2"
item_state = "syringe_0"
digspeed = 50
digspeed = 20
desc = "A miniature excavation tool for precise digging (4 centimetre excavation depth)."
excavation_amount = 2
drill_sound = 'sound/items/Screwdriver.ogg'
@@ -43,7 +43,7 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick3"
item_state = "syringe_0"
digspeed = 50
digspeed = 20
desc = "A miniature excavation tool for precise digging (6 centimetre excavation depth)."
excavation_amount = 3
drill_sound = 'sound/items/Screwdriver.ogg'
@@ -55,7 +55,7 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick4"
item_state = "syringe_0"
digspeed = 50
digspeed = 20
desc = "A miniature excavation tool for precise digging (8 centimetre excavation depth)."
excavation_amount = 4
drill_sound = 'sound/items/Screwdriver.ogg'
@@ -67,7 +67,7 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick5"
item_state = "syringe_0"
digspeed = 50
digspeed = 20
desc = "A miniature excavation tool for precise digging (10 centimetre excavation depth)."
excavation_amount = 5
drill_sound = 'sound/items/Screwdriver.ogg'
@@ -79,7 +79,7 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick6"
item_state = "syringe_0"
digspeed = 50
digspeed = 20
desc = "A miniature excavation tool for precise digging (12 centimetre excavation depth)."
excavation_amount = 6
drill_sound = 'sound/items/Screwdriver.ogg'
@@ -91,7 +91,7 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick_hand"
item_state = "syringe_0"
digspeed = 50
digspeed = 30
desc = "A smaller, more precise version of the pickaxe (30 centimetre excavation depth)."
excavation_amount = 15
drill_sound = 'sound/items/Crowbar.ogg'
@@ -108,16 +108,15 @@
desc = "A set of picks for excavation."
item_state = "syringe_kit"
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
storage_slots = 8
w_class = 3
storage_slots = 7
w_class = 2
can_hold = list("/obj/item/weapon/pickaxe/brush",\
"/obj/item/weapon/pickaxe/one_pick",\
"/obj/item/weapon/pickaxe/two_pick",\
"/obj/item/weapon/pickaxe/three_pick",\
"/obj/item/weapon/pickaxe/four_pick",\
"/obj/item/weapon/pickaxe/five_pick",\
"/obj/item/weapon/pickaxe/six_pick",\
"/obj/item/weapon/pickaxe/hand")
"/obj/item/weapon/pickaxe/six_pick")
max_combined_w_class = 17
max_w_class = 4
use_to_pickup = 1 // for picking up broken bulbs, not that most people will try
@@ -131,4 +130,3 @@
new /obj/item/weapon/pickaxe/four_pick(src)
new /obj/item/weapon/pickaxe/five_pick(src)
new /obj/item/weapon/pickaxe/six_pick(src)
new /obj/item/weapon/pickaxe/hand(src)
+3 -3
View File
@@ -175,8 +175,7 @@ var/MAX_EXPLOSION_RANGE = 14
//FLAGS BITMASK
#define STOPSPRESSUREDMAGE 1 //This flag is used on the flags variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere
//To successfully stop you taking all pressure damage you must have both a suit and head item with this flag.
//To successfully stop you taking all pressure damage you must have both a suit and head item with this flag.
#define TABLEPASS 2 // can pass by a table or rack
#define MASKINTERNALS 8 // mask allows internals
@@ -205,7 +204,8 @@ var/MAX_EXPLOSION_RANGE = 14
#define NOREACT 16384 //Reagents dont' react inside this container.
#define BLOCKHAIR 32768 // temporarily removes the user's hair icon
#define BLOCKHEADHAIR 4 // temporarily removes the user's hair overlay. Leaves facial hair.
#define BLOCKHAIR 32768 // temporarily removes the user's hair, facial and otherwise.
//flags for pass_flags
#define PASSTABLE 1
+29 -2
View File
@@ -40,7 +40,7 @@ Header Section
<tr>
<td valign='top'>
<font size='2'><b>Code:</b> Abi79, Aryn, Cael_Aislinn, Chinsky, cib, CompactNinja, DopeGhoti, Erthilo, Hawk_v3, Head, Ispil, Lexusjjss, Melonstorm, Miniature, Mloc, NerdyBoy1104, SkyMarshal, Spectre, Strumpetplaya, Sunfall, Tastyfish, Uristqwerty<br></font>
<font size='2'><b>Sprites:</b> Apple_Master, Arcalane, Chinsky, CompactNinja, Deus Dactyl, Erthilo, Flashkirby, Miniature, Searif, Xenone<br></font>
<font size='2'><b>Sprites:</b> Apple_Master, Arcalane, Chinsky, CompactNinja, Deus Dactyl, Erthilo, Flashkirby, Miniature, Searif, Xenone, faux<br></font>
<font size='2'><b>Sounds:</b> Aryn<br></font>
<font size='2'><b>Thanks To:</b> /tg/ station, Goonstation, Animus Station, Daedalus, and original Spacestation 13 devs. Skibiliano for the IRC bot.</font>
</td>
@@ -57,6 +57,34 @@ Stuff which is in development and not yet visible to players or just code relate
(ie. code improvements for expandability, etc.) should not be listed here. They
should be listed in the changelog upon commit though. Thanks. -->
<div class="commit sansserif">
<h2 class="date">23.06.2013</h2>
<h3 class="author">Segrain updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Airlocks of various models can be constructed again.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">June 23, 2013</h2>
<h3 class="author">faux updated:</h3>
<ul class="changes bgimages16">
<li class="experiment">There has been a complete medbay renovation spearheaded by Vetinarix. http://baystation12.net/forums/viewtopic.php?f=20&t=7847 <-- Please put any commentary good or bad, here.</li>
<li class="tweak">Some maintenance doors within RnD and Medbay have had their accesses changed. Maintenance doors in the joint areas (leading to the research shuttle, virology, and xenobiology) are now zero access. Which means anyone in those joints can enter the maintenance tunnels. This was done to add additional evacuation locations during radiation storms. Additional maintenance doors were added to the tunnels in these areas to prevent docs and scientists from running about.</li>
<li class="tweak">Starboard emergency storage isn't gone now, it's simply located in the escape wing.</li>
<li class="experiment">An engineering training room has been added to engineering. This location was previously where surgery was located. If you are new to engineering or need to brush up on your skills, please use this area for testing.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">June 22nd 2013</h2>
<h3 class="author">Cael_Aislinn updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">The xenoarchaeology depth scanner will now tell you what energy field is required to safely extract a find.</li>
<li class="tweak">Excavation picks will now dig faster, and xenoarchaeology as a whole should be easier to do.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">21.06.2013</h2>
<h3 class="author">Jupotter updated:</h3>
@@ -65,7 +93,6 @@ should be listed in the changelog upon commit though. Thanks. -->
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">18.06.2013</h2>
<h3 class="author">Segrain updated:</h3>
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 804 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 418 B

View File
+32 -32
View File
@@ -1,8 +1,8 @@
"a" = (/turf/unsimulated/beach/sand{density = 1; opacity = 1},/area/awaymission/beach)
"b" = (/turf/unsimulated/beach/sand,/area/awaymission/beach)
"c" = (/obj/machinery/gateway{dir = 9},/turf/unsimulated/beach/sand,/area/awaymission/beach)
"d" = (/obj/machinery/gateway{dir = 1},/turf/unsimulated/beach/sand,/area/awaymission/beach)
"e" = (/obj/machinery/gateway{dir = 5},/turf/unsimulated/beach/sand,/area/awaymission/beach)
"b" = (/obj/machinery/gateway{dir = 9},/turf/unsimulated/beach/sand,/area/awaymission/beach)
"c" = (/obj/machinery/gateway{dir = 1},/turf/unsimulated/beach/sand,/area/awaymission/beach)
"d" = (/obj/machinery/gateway{dir = 5},/turf/unsimulated/beach/sand,/area/awaymission/beach)
"e" = (/turf/unsimulated/beach/sand,/area/awaymission/beach)
"f" = (/obj/effect/overlay/palmtree_r,/turf/unsimulated/beach/sand,/area/awaymission/beach)
"g" = (/obj/machinery/gateway{dir = 8},/turf/unsimulated/beach/sand,/area/awaymission/beach)
"h" = (/obj/machinery/gateway/centeraway,/turf/unsimulated/beach/sand,/area/awaymission/beach)
@@ -39,35 +39,35 @@
"M" = (/obj/effect/overlay/coconut,/turf/unsimulated/beach/sand,/area/awaymission/beach)
"N" = (/mob/living/simple_animal/crab/Coffee,/turf/unsimulated/beach/sand,/area/awaymission/beach)
"O" = (/obj/structure/stool/bed/chair,/turf/unsimulated/beach/sand,/area/awaymission/beach)
"P" = (/turf/unsimulated/beach/coastline,/area/awaymission/beach)
"Q" = (/turf/unsimulated/beach/coastline{density = 1; opacity = 1},/area/awaymission/beach)
"R" = (/turf/unsimulated/beach/water,/area/awaymission/beach)
"S" = (/turf/unsimulated/beach/water{density = 1; opacity = 1},/area/awaymission/beach)
"P" = (/turf/unsimulated/beach/coastline{density = 1; opacity = 1},/area/awaymission/beach)
"Q" = (/turf/unsimulated/beach/coastline,/area/awaymission/beach)
"R" = (/turf/unsimulated/beach/water{density = 1; opacity = 1},/area/awaymission/beach)
"S" = (/turf/unsimulated/beach/water,/area/awaymission/beach)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bcdebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfba
bghibbbbjbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba
bklmbbbbbbbbnoooooooooopbbqrqrqrqrqrqrqa
bbbbbbbbbbbbstuvwxyzABCsbbbbbbbbbbbbbbba
bbbbbbbbbbbbDEEEEEEEEEEsbbbbbbbbbbbbbbba
bbbbbbbbbbbbFEEEEEEEEEEsbbbbbbbbbGbbbbba
bbfbbbbbbbbbHxIxxxxxxxxDbbbGbbJbbbbbbbba
bbbbbbbbbbbbbKKKKKKKKKKbbbbbbbbbbbbbbbba
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba
bbbLbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbba
bbbbbbGMbbbbbbbbbbbbbbGbbbbbNbbbMbbbbbfa
bbbJbbbbbbLbbObObObObObObbbbbbbbbbObObba
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQ
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
abcdeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefea
aghieeeejeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea
aklmeeeeeeeenoooooooooopeeqrqrqrqrqrqrqa
aeeeeeeeeeeestuvwxyzABCseeeeeeeeeeeeeeea
aeeeeeeeeeeeDEEEEEEEEEEseeeeeeeeeeeeeeea
aeeeeeeeeeeeFEEEEEEEEEEseeeeeeeeeGeeeeea
aefeeeeeeeeeHxIxxxxxxxxDeeeGeeJeeeeeeeea
aeeeeeeeeeeeeKKKKKKKKKKeeeeeeeeeeeeeeeea
aeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea
aeeLeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeea
aeeeeeGMeeeeeeeeeeeeeeGeeeeeNeeeMeeeeefa
aeeJeeeeeeLeeOeOeOeOeOeOeeeeeeeeeeOeOeea
aeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea
PQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQP
RSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR
RSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR
RSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR
RSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR
RSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR
RSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR
RSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR
RSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR
RSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
"}
+283 -284
View File
@@ -395,7 +395,7 @@
"hE" = (/turf/simulated/floor,/area)
"hF" = (/obj/structure/table,/obj/structure/bedsheetbin,/turf/simulated/floor,/area/derelict/storage/equipment)
"hG" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/packageWrap,/obj/item/device/flashlight,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/derelict/storage/equipment)
"hH" = (/obj/structure/table,/obj/item/weapon/storage/gl_kit,/obj/item/device/t_scanner,/turf/simulated/floor,/area/derelict/storage/equipment)
"hH" = (/obj/structure/table,/obj/item/device/t_scanner,/turf/simulated/floor,/area/derelict/storage/equipment)
"hI" = (/obj/item/stack/sheet/metal{amount = 50},/obj/item/weapon/clipboard,/obj/item/weapon/clipboard,/obj/item/weapon/clipboard,/turf/simulated/floor,/area/derelict/storage/equipment)
"hJ" = (/obj/item/stack/sheet/metal{amount = 50},/obj/item/weapon/cable_coil,/turf/simulated/floor,/area/derelict/storage/equipment)
"hK" = (/obj/item/stack/sheet/metal{amount = 50},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/derelict/storage/equipment)
@@ -404,7 +404,7 @@
"hN" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor,/area/crew_quarters/captain)
"hO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/crew_quarters/captain)
"hP" = (/obj/structure/cable{tag = ""; icon_state = "4-8"; step_x = 0; pixel_x = 0; d1 = 4; d2 = 8},/turf/simulated/floor,/area/crew_quarters/captain)
"hQ" = (/obj/item/weapon/storage/handcuff_kit,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/crew_quarters/captain)
"hQ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/crew_quarters/captain)
"hR" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor,/area/derelict/arrival)
"hS" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/derelict/storage/equipment)
"hT" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/crowbar,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor,/area/derelict/storage/equipment)
@@ -559,7 +559,7 @@
"kM" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/computer/scan_consolenew,/turf/simulated/floor,/area/medical/genetics)
"kN" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/dna_scannernew,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/medical/genetics)
"kO" = (/obj/machinery/computer/scan_consolenew,/turf/simulated/floor,/area/medical/genetics)
"kP" = (/obj/structure/table,/obj/item/weapon/storage/diskbox,/turf/simulated/floor,/area/medical/genetics)
"kP" = (/obj/structure/table,/turf/simulated/floor,/area/medical/genetics)
"kQ" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/derelict/storage/equipment)
"kR" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor,/area/derelict/arrival)
"kS" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area)
@@ -818,254 +818,253 @@
"pL" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/atmos)
"pM" = (/obj/machinery/computer/secure_data,/turf/simulated/floor,/area/security/brig)
"pN" = (/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/mask/muzzle,/obj/item/clothing/mask/muzzle,/obj/item/clothing/mask/muzzle,/obj/item/clothing/mask/muzzle,/turf/simulated/floor,/area/security/brig)
"pO" = (/obj/item/weapon/storage/trackimp_kit,/turf/simulated/floor,/area/security/brig)
"pP" = (/obj/item/weapon/paper_bin,/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor,/area/security/brig)
"pQ" = (/obj/item/device/flashlight,/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor,/area/security/brig)
"pR" = (/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/ears/earmuffs,/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor,/area/security/brig)
"pS" = (/obj/structure/window/reinforced{dir = 4},/obj/effect/landmark/start{name = "Warden"},/turf/simulated/floor,/area/security/brig)
"pT" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor,/area/toxins/lab)
"pU" = (/obj/structure/grille,/turf/simulated/floor,/area/toxins/lab)
"pV" = (/obj/machinery/door/window/eastright,/obj/machinery/door/firedoor/border_only{dir = 4},/turf/simulated/floor,/area/crew_quarters)
"pW" = (/obj/structure/stool/bed,/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor,/area/crew_quarters)
"pX" = (/obj/structure/stool/bed,/obj/effect/landmark/start{name = "Quartermaster"},/turf/simulated/floor,/area/crew_quarters)
"pY" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor,/area/crew_quarters)
"pZ" = (/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen,/obj/item/weapon/weldingtool,/obj/item/clothing/gloves/black,/turf/simulated/floor,/area/crew_quarters)
"qa" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Chef"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/crew_quarters)
"qb" = (/obj/item/weapon/storage/backpack,/turf/simulated/floor,/area/crew_quarters)
"qc" = (/obj/structure/grille,/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; icon_state = "on"; on = 1; pixel_y = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor,/area/atmos)
"qd" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor,/area/atmos)
"qe" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/atmos)
"qf" = (/obj/structure/table,/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs,/obj/item/clothing/mask/muzzle,/obj/item/clothing/mask/muzzle,/obj/item/weapon/clipboard,/obj/item/weapon/crowbar,/turf/simulated/floor,/area/security/brig)
"qg" = (/obj/structure/table,/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs,/obj/item/clothing/mask/muzzle,/obj/item/clothing/mask/muzzle,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor,/area/security/brig)
"qh" = (/obj/structure/table,/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs,/obj/item/clothing/mask/muzzle,/obj/item/clothing/mask/muzzle,/obj/item/weapon/storage/firstaid/regular,/obj/machinery/light,/turf/simulated/floor,/area/security/brig)
"qi" = (/obj/machinery/computer/security,/turf/simulated/floor,/area/security/brig)
"qj" = (/obj/machinery/computer/card,/turf/simulated/floor,/area/security/brig)
"qk" = (/obj/structure/closet/wardrobe/red,/turf/simulated/floor,/area/security/brig)
"ql" = (/obj/structure/closet/wardrobe/orange,/obj/machinery/light,/turf/simulated/floor,/area/security/brig)
"qm" = (/obj/machinery/door/poddoor{id = "bd1"; name = "Vent"},/turf/simulated/floor{icon_state = "shiny"},/area/toxins/lab)
"qn" = (/obj/structure/window/reinforced{dir = 5},/turf/simulated/floor/plating,/area/derelict/arrival)
"qo" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/derelict/arrival)
"qp" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/arrival)
"qq" = (/obj/machinery/door/window/eastleft,/turf/simulated/floor,/area/crew_quarters)
"qr" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor,/area/atmos)
"qs" = (/obj/structure/grille,/turf/simulated/floor,/area/atmos)
"qt" = (/obj/machinery/door/poddoor{id = "vent1"; name = "Vent Hatch"},/turf/simulated/floor,/area/atmos)
"qu" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor,/area/atmos)
"qv" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/atmos)
"qw" = (/turf/simulated/wall/r_wall,/area/derelict/hallway/secondary)
"qx" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/derelict/arrival)
"qy" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/derelict/arrival)
"qz" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/derelict/arrival)
"qA" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area)
"qB" = (/obj/structure/grille,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area)
"qC" = (/obj/machinery/door/window/southleft,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/crew_quarters)
"qD" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 5},/turf/simulated/floor,/area/atmos)
"qE" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 10},/turf/simulated/floor,/area/atmos)
"qF" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor,/area/atmos)
"qG" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; icon_state = "on"; on = 1; pixel_y = 1},/turf/simulated/floor,/area/atmos)
"qH" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor,/area/atmos)
"qI" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/atmos)
"qJ" = (/obj/machinery/power/monitor,/turf/simulated/floor,/area/atmos)
"qK" = (/turf/simulated/wall/r_wall,/area/atmos)
"qL" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/atmos)
"qM" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor,/area/atmos)
"qN" = (/obj/item/weapon/extinguisher,/turf/simulated/floor,/area/derelict/hallway/secondary)
"qO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
"qP" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/derelict/hallway/secondary)
"qQ" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor,/area/derelict/storage/storage_access)
"qR" = (/turf/simulated/floor,/area/derelict/storage/storage_access)
"qS" = (/obj/machinery/computer/security,/turf/simulated/floor,/area/derelict/storage/storage_access)
"qT" = (/turf/simulated/wall,/area/derelict/storage/storage_access)
"qU" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/derelict/storage/storage_access)
"qV" = (/obj/structure/rack,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/under/color/black,/obj/item/clothing/mask/gas,/obj/item/device/radio/headset,/obj/item/clothing/gloves/black,/obj/item/clothing/shoes/black,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor,/area/derelict/storage/storage_access)
"qW" = (/obj/item/weapon/extinguisher,/turf/simulated/floor,/area/derelict/storage/storage_access)
"qX" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/derelict/storage/storage_access)
"qY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/storage/storage_access)
"qZ" = (/obj/item/stack/sheet/glass,/obj/item/stack/sheet/glass,/obj/item/stack/sheet/glass,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/derelict/storage/storage_access)
"ra" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/computer/atmos_alert,/turf/simulated/floor,/area/atmos)
"rb" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/atmos)
"rc" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor,/area/atmos)
"rd" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/atmos)
"re" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"rf" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area)
"rg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"rh" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor,/area/derelict/hallway/secondary)
"ri" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rj" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/clipboard,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rk" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/door_control{id = "vent1"; pixel_x = -24},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor,/area/atmos)
"rl" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor,/area/atmos)
"rm" = (/obj/effect/landmark/start{name = "Atmospheric Technician"},/turf/simulated/floor,/area/atmos)
"rn" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor,/area/atmos)
"ro" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor,/area/atmos)
"rp" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor,/area/atmos)
"rq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"rr" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
"rs" = (/obj/machinery/power/monitor,/turf/simulated/floor,/area/derelict/hallway/secondary)
"rt" = (/obj/machinery/door/window/eastleft{req_access_txt = "1"},/turf/simulated/floor,/area/derelict/hallway/secondary)
"ru" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rv" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rw" = (/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rx" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/crowbar,/turf/simulated/floor,/area/derelict/storage/storage_access)
"ry" = (/obj/machinery/door_control{id = "ventintake"; pixel_x = -24},/turf/simulated/floor,/area/atmos)
"rz" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/atmos)
"rA" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor,/area/atmos)
"rB" = (/obj/structure/window/reinforced{dir = 1},/obj/item/clothing/mask/gas,/turf/simulated/floor,/area/atmos)
"rC" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor,/area/atmos)
"rD" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor,/area/atmos)
"rE" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
"rF" = (/obj/machinery/door/window/eastleft,/obj/machinery/door/firedoor/border_only{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
"rG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
"rH" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
"rI" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/light,/turf/simulated/floor,/area/derelict/hallway/secondary)
"rJ" = (/obj/structure/table,/obj/item/weapon/handcuffs,/obj/item/device/multitool,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rK" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rL" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rM" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rN" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rO" = (/obj/structure/closet/emcloset/legacy,/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rP" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/atmos)
"rQ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/atmos)
"rR" = (/obj/item/clothing/shoes/brown,/obj/item/clothing/under/rank/atmospheric_technician,/obj/item/clothing/gloves/yellow,/turf/simulated/floor,/area/atmos)
"rS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"rT" = (/obj/machinery/door/airlock{req_access_txt = "12"},/turf/simulated/floor,/area/derelict/storage/storage_access)
"rU" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rV" = (/obj/machinery/door/window/eastleft,/turf/simulated/floor,/area/atmos)
"rW" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor,/area/atmos)
"rX" = (/obj/item/weapon/paper_bin,/turf/simulated/floor,/area/atmos)
"rY" = (/obj/item/weapon/clipboard,/turf/simulated/floor,/area/atmos)
"rZ" = (/obj/structure/table,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/multitool,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/atmos)
"sa" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor,/area/atmos)
"sb" = (/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/atmos)
"sc" = (/obj/structure/grille,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area)
"sd" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area)
"se" = (/obj/machinery/door/airlock{req_access_txt = "10;13"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor,/area/derelict/hallway/secondary)
"sf" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = "90Curve"},/turf/simulated/floor,/area/derelict/hallway/secondary)
"sg" = (/obj/machinery/door/window/eastleft{req_access_txt = "10"},/turf/simulated/floor,/area/derelict/hallway/secondary)
"sh" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/obj/item/clothing/gloves/yellow,/turf/simulated/floor,/area/derelict/storage/storage_access)
"si" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sj" = (/obj/structure/closet/emcloset/legacy,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sk" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light,/turf/simulated/floor,/area/atmos)
"sl" = (/obj/machinery/atmospherics/valve,/turf/simulated/floor,/area/atmos)
"sm" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor,/area/atmos)
"sn" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor,/area/atmos)
"so" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/obj/item/device/radio,/obj/item/weapon/screwdriver,/obj/item/weapon/crowbar,/turf/simulated/floor,/area/atmos)
"sp" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/obj/item/weapon/screwdriver,/obj/item/weapon/extinguisher,/obj/item/weapon/crowbar,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor,/area/atmos)
"sq" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/light,/turf/simulated/floor,/area/atmos)
"sr" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/obj/item/weapon/screwdriver,/obj/item/device/t_scanner,/obj/item/device/assembly/signaler,/turf/simulated/floor,/area/atmos)
"ss" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/obj/item/weapon/screwdriver,/obj/item/weapon/extinguisher,/turf/simulated/floor,/area/atmos)
"st" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"su" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"sv" = (/obj/machinery/power/solar_control,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor,/area/derelict/hallway/secondary)
"sw" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/derelict/hallway/secondary)
"sx" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/derelict/storage/storage_access)
"sy" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sz" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sA" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 8},/turf/simulated/floor,/area/atmos)
"sB" = (/obj/machinery/atmospherics/valve{dir = 4},/turf/simulated/floor,/area/atmos)
"sC" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor,/area/atmos)
"sD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/space,/area/derelict/hallway/secondary)
"sE" = (/obj/machinery/power/terminal,/obj/structure/cable,/turf/simulated/floor,/area/derelict/hallway/secondary)
"sF" = (/obj/structure/rack,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/under/color/black,/obj/item/clothing/mask/gas,/obj/item/device/radio/headset,/obj/item/clothing/gloves/black,/obj/item/clothing/shoes/black,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sG" = (/obj/structure/rack,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/under/color/black,/obj/item/clothing/mask/gas,/obj/item/device/radio/headset,/obj/item/clothing/gloves/black,/obj/item/clothing/shoes/black,/obj/item/clothing/glasses/sunglasses,/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sH" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/multitool,/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sI" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/t_scanner,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sJ" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sK" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sL" = (/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sM" = (/obj/structure/table,/obj/item/clothing/mask/gas,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sN" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor,/area/atmos)
"sO" = (/obj/machinery/atmospherics/pipe/manifold/general/visible,/obj/machinery/light,/turf/simulated/floor,/area/atmos)
"sP" = (/obj/structure/table,/obj/item/weapon/cell,/obj/item/weapon/cell,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/device/flashlight,/turf/simulated/floor,/area/atmos)
"sQ" = (/obj/structure/table,/obj/item/weapon/cell,/obj/item/weapon/cell,/obj/item/weapon/cell,/obj/item/weapon/cell,/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor,/area/atmos)
"sR" = (/obj/structure/window/reinforced{dir = 5},/turf/space,/area)
"sS" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/derelict/hallway/secondary)
"sT" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/derelict/hallway/secondary)
"sU" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{tag = ""; icon_state = "4-8"; step_x = 0; pixel_x = 0; d1 = 4; d2 = 8},/turf/simulated/floor,/area/derelict/hallway/secondary)
"sV" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable,/turf/simulated/floor,/area/derelict/hallway/secondary)
"sW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"sX" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area)
"sY" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/derelict/hallway/secondary)
"sZ" = (/obj/structure/window/reinforced{dir = 8},/turf/space,/area)
"ta" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
"tb" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
"tc" = (/obj/machinery/door/firedoor/border_only{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
"td" = (/obj/machinery/light{dir = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
"te" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/derelict/hallway/secondary)
"tf" = (/obj/machinery/door/firedoor/border_only{dir = 4},/turf/simulated/floor,/area/derelict/hallway/secondary)
"tg" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/derelict/hallway/secondary)
"th" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"ti" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/derelict/hallway/secondary)
"tj" = (/obj/structure/grille,/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area)
"tk" = (/obj/machinery/door/airlock{req_access_txt = "17"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
"tl" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"tm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"tn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"to" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"tp" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/space,/area)
"tq" = (/turf/simulated/wall/r_wall,/area/derelict/teleporter)
"tr" = (/turf/simulated/floor,/area/derelict/teleporter)
"ts" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/derelict/teleporter)
"tt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
"tu" = (/obj/machinery/light,/turf/simulated/floor,/area/derelict/hallway/secondary)
"tv" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
"tw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
"tx" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
"ty" = (/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
"tz" = (/obj/machinery/door/airlock{req_access_txt = "16"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"tA" = (/obj/structure/closet/emcloset/legacy,/turf/simulated/floor,/area/derelict/hallway/secondary)
"tB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area)
"tC" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/wall/r_wall,/area)
"tD" = (/obj/machinery/computer/teleporter,/turf/simulated/floor{icon_state = "floorgrime"},/area/derelict/teleporter)
"tE" = (/obj/machinery/teleport/station,/turf/simulated/floor{icon_state = "floorgrime"},/area/derelict/teleporter)
"tF" = (/obj/machinery/teleport/hub,/turf/simulated/floor{icon_state = "floorgrime"},/area/derelict/teleporter)
"tG" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/derelict/teleporter)
"tH" = (/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"tI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/derelict/bridge/ai_upload)
"tJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/derelict/bridge/ai_upload)
"tK" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
"tL" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor,/area/derelict/teleporter)
"tM" = (/obj/effect/landmark{name = "tripai"},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
"tN" = (/obj/machinery/turret,/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
"tO" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
"tP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
"tQ" = (/obj/structure/cable{tag = ""; icon_state = "4-8"; step_x = 0; pixel_x = 0; d1 = 4; d2 = 8},/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
"tR" = (/obj/structure/rack,/obj/item/weapon/aiModule/freeform,/obj/item/weapon/aiModule/prototypeEngineOffline,/obj/item/weapon/aiModule/safeguard,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"tS" = (/obj/structure/rack,/obj/item/weapon/aiModule/oneHuman,/obj/item/weapon/aiModule/purge,/obj/item/weapon/aiModule/teleporterOffline,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"tT" = (/obj/structure/rack,/obj/item/weapon/aiModule/oxygen,/obj/item/weapon/aiModule/quarantine,/obj/machinery/light{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"tU" = (/obj/structure/rack,/obj/item/weapon/aiModule/protectStation,/obj/item/weapon/aiModule/reset,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"tV" = (/obj/machinery/turret,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"tW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
"tX" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"tY" = (/obj/machinery/turret{dir = 8},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"tZ" = (/obj/structure/table,/obj/item/device/radio,/turf/simulated/floor,/area/derelict/teleporter)
"ua" = (/obj/machinery/light,/turf/simulated/floor,/area/derelict/teleporter)
"ub" = (/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
"uc" = (/obj/machinery/power/apc{pixel_x = 24},/obj/structure/cable,/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
"ud" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"ue" = (/obj/effect/landmark/start{name = "Cyborg"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"uf" = (/obj/effect/landmark/start{name = "AI"},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
"ug" = (/obj/machinery/computer/aiupload,/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"uh" = (/obj/machinery/door/window/eastleft{req_access_txt = "16"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"ui" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"uj" = (/obj/machinery/power/solar_control,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"uk" = (/obj/machinery/turret{dir = 8},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"ul" = (/obj/machinery/door/window/eastleft{req_access_txt = "16"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"um" = (/obj/machinery/turret{dir = 1},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
"un" = (/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
"uo" = (/obj/structure/rack,/obj/item/weapon/aiModule/asimov,/obj/item/weapon/aiModule/freeformcore,/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"up" = (/obj/machinery/door/airlock{req_access_txt = "16"},/obj/machinery/door/window/eastleft{req_access_txt = "16"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"uq" = (/obj/machinery/light,/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"ur" = (/obj/machinery/turret{dir = 1},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"us" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
"ut" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
"uu" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area)
"uv" = (/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area)
"uw" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area)
"ux" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area)
"uy" = (/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area)
"uz" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area)
"uA" = (/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/obj/structure/cable,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area)
"uB" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
"pO" = (/obj/item/weapon/paper_bin,/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor,/area/security/brig)
"pP" = (/obj/item/device/flashlight,/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor,/area/security/brig)
"pQ" = (/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/ears/earmuffs,/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor,/area/security/brig)
"pR" = (/obj/structure/window/reinforced{dir = 4},/obj/effect/landmark/start{name = "Warden"},/turf/simulated/floor,/area/security/brig)
"pS" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor,/area/toxins/lab)
"pT" = (/obj/structure/grille,/turf/simulated/floor,/area/toxins/lab)
"pU" = (/obj/machinery/door/window/eastright,/obj/machinery/door/firedoor/border_only{dir = 4},/turf/simulated/floor,/area/crew_quarters)
"pV" = (/obj/structure/stool/bed,/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor,/area/crew_quarters)
"pW" = (/obj/structure/stool/bed,/obj/effect/landmark/start{name = "Quartermaster"},/turf/simulated/floor,/area/crew_quarters)
"pX" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor,/area/crew_quarters)
"pY" = (/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen,/obj/item/weapon/weldingtool,/obj/item/clothing/gloves/black,/turf/simulated/floor,/area/crew_quarters)
"pZ" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Chef"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/crew_quarters)
"qa" = (/obj/item/weapon/storage/backpack,/turf/simulated/floor,/area/crew_quarters)
"qb" = (/obj/structure/grille,/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; icon_state = "on"; on = 1; pixel_y = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor,/area/atmos)
"qc" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor,/area/atmos)
"qd" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/atmos)
"qe" = (/obj/structure/table,/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs,/obj/item/clothing/mask/muzzle,/obj/item/clothing/mask/muzzle,/obj/item/weapon/clipboard,/obj/item/weapon/crowbar,/turf/simulated/floor,/area/security/brig)
"qf" = (/obj/structure/table,/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs,/obj/item/clothing/mask/muzzle,/obj/item/clothing/mask/muzzle,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor,/area/security/brig)
"qg" = (/obj/structure/table,/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs,/obj/item/clothing/mask/muzzle,/obj/item/clothing/mask/muzzle,/obj/item/weapon/storage/firstaid/regular,/obj/machinery/light,/turf/simulated/floor,/area/security/brig)
"qh" = (/obj/machinery/computer/security,/turf/simulated/floor,/area/security/brig)
"qi" = (/obj/machinery/computer/card,/turf/simulated/floor,/area/security/brig)
"qj" = (/obj/structure/closet/wardrobe/red,/turf/simulated/floor,/area/security/brig)
"qk" = (/obj/structure/closet/wardrobe/orange,/obj/machinery/light,/turf/simulated/floor,/area/security/brig)
"ql" = (/obj/machinery/door/poddoor{id = "bd1"; name = "Vent"},/turf/simulated/floor{icon_state = "shiny"},/area/toxins/lab)
"qm" = (/obj/structure/window/reinforced{dir = 5},/turf/simulated/floor/plating,/area/derelict/arrival)
"qn" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/derelict/arrival)
"qo" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/arrival)
"qp" = (/obj/machinery/door/window/eastleft,/turf/simulated/floor,/area/crew_quarters)
"qq" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor,/area/atmos)
"qr" = (/obj/structure/grille,/turf/simulated/floor,/area/atmos)
"qs" = (/obj/machinery/door/poddoor{id = "vent1"; name = "Vent Hatch"},/turf/simulated/floor,/area/atmos)
"qt" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor,/area/atmos)
"qu" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/atmos)
"qv" = (/turf/simulated/wall/r_wall,/area/derelict/hallway/secondary)
"qw" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/derelict/arrival)
"qx" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/derelict/arrival)
"qy" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/derelict/arrival)
"qz" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area)
"qA" = (/obj/structure/grille,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area)
"qB" = (/obj/machinery/door/window/southleft,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/crew_quarters)
"qC" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 5},/turf/simulated/floor,/area/atmos)
"qD" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 10},/turf/simulated/floor,/area/atmos)
"qE" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor,/area/atmos)
"qF" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; icon_state = "on"; on = 1; pixel_y = 1},/turf/simulated/floor,/area/atmos)
"qG" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor,/area/atmos)
"qH" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/atmos)
"qI" = (/obj/machinery/power/monitor,/turf/simulated/floor,/area/atmos)
"qJ" = (/turf/simulated/wall/r_wall,/area/atmos)
"qK" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/atmos)
"qL" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor,/area/atmos)
"qM" = (/obj/item/weapon/extinguisher,/turf/simulated/floor,/area/derelict/hallway/secondary)
"qN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
"qO" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/derelict/hallway/secondary)
"qP" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor,/area/derelict/storage/storage_access)
"qQ" = (/turf/simulated/floor,/area/derelict/storage/storage_access)
"qR" = (/obj/machinery/computer/security,/turf/simulated/floor,/area/derelict/storage/storage_access)
"qS" = (/turf/simulated/wall,/area/derelict/storage/storage_access)
"qT" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/derelict/storage/storage_access)
"qU" = (/obj/structure/rack,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/under/color/black,/obj/item/clothing/mask/gas,/obj/item/device/radio/headset,/obj/item/clothing/gloves/black,/obj/item/clothing/shoes/black,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor,/area/derelict/storage/storage_access)
"qV" = (/obj/item/weapon/extinguisher,/turf/simulated/floor,/area/derelict/storage/storage_access)
"qW" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/derelict/storage/storage_access)
"qX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/storage/storage_access)
"qY" = (/obj/item/stack/sheet/glass,/obj/item/stack/sheet/glass,/obj/item/stack/sheet/glass,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/derelict/storage/storage_access)
"qZ" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/computer/atmos_alert,/turf/simulated/floor,/area/atmos)
"ra" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/atmos)
"rb" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor,/area/atmos)
"rc" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/atmos)
"rd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"re" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area)
"rf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"rg" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor,/area/derelict/hallway/secondary)
"rh" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/turf/simulated/floor,/area/derelict/storage/storage_access)
"ri" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/clipboard,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rj" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/door_control{id = "vent1"; pixel_x = -24},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor,/area/atmos)
"rk" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor,/area/atmos)
"rl" = (/obj/effect/landmark/start{name = "Atmospheric Technician"},/turf/simulated/floor,/area/atmos)
"rm" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor,/area/atmos)
"rn" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor,/area/atmos)
"ro" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor,/area/atmos)
"rp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"rq" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
"rr" = (/obj/machinery/power/monitor,/turf/simulated/floor,/area/derelict/hallway/secondary)
"rs" = (/obj/machinery/door/window/eastleft{req_access_txt = "1"},/turf/simulated/floor,/area/derelict/hallway/secondary)
"rt" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor,/area/derelict/storage/storage_access)
"ru" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rv" = (/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rw" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/crowbar,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rx" = (/obj/machinery/door_control{id = "ventintake"; pixel_x = -24},/turf/simulated/floor,/area/atmos)
"ry" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/atmos)
"rz" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor,/area/atmos)
"rA" = (/obj/structure/window/reinforced{dir = 1},/obj/item/clothing/mask/gas,/turf/simulated/floor,/area/atmos)
"rB" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor,/area/atmos)
"rC" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor,/area/atmos)
"rD" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
"rE" = (/obj/machinery/door/window/eastleft,/obj/machinery/door/firedoor/border_only{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
"rF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
"rG" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
"rH" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/light,/turf/simulated/floor,/area/derelict/hallway/secondary)
"rI" = (/obj/structure/table,/obj/item/weapon/handcuffs,/obj/item/device/multitool,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rJ" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rK" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rL" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rM" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rN" = (/obj/structure/closet/emcloset/legacy,/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rO" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/atmos)
"rP" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/atmos)
"rQ" = (/obj/item/clothing/shoes/brown,/obj/item/clothing/under/rank/atmospheric_technician,/obj/item/clothing/gloves/yellow,/turf/simulated/floor,/area/atmos)
"rR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"rS" = (/obj/machinery/door/airlock{req_access_txt = "12"},/turf/simulated/floor,/area/derelict/storage/storage_access)
"rT" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/derelict/storage/storage_access)
"rU" = (/obj/machinery/door/window/eastleft,/turf/simulated/floor,/area/atmos)
"rV" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor,/area/atmos)
"rW" = (/obj/item/weapon/paper_bin,/turf/simulated/floor,/area/atmos)
"rX" = (/obj/item/weapon/clipboard,/turf/simulated/floor,/area/atmos)
"rY" = (/obj/structure/table,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/multitool,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/atmos)
"rZ" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor,/area/atmos)
"sa" = (/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/atmos)
"sb" = (/obj/structure/grille,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area)
"sc" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area)
"sd" = (/obj/machinery/door/airlock{req_access_txt = "10;13"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor,/area/derelict/hallway/secondary)
"se" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = "90Curve"},/turf/simulated/floor,/area/derelict/hallway/secondary)
"sf" = (/obj/machinery/door/window/eastleft{req_access_txt = "10"},/turf/simulated/floor,/area/derelict/hallway/secondary)
"sg" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/obj/item/clothing/gloves/yellow,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sh" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor,/area/derelict/storage/storage_access)
"si" = (/obj/structure/closet/emcloset/legacy,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sj" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light,/turf/simulated/floor,/area/atmos)
"sk" = (/obj/machinery/atmospherics/valve,/turf/simulated/floor,/area/atmos)
"sl" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor,/area/atmos)
"sm" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor,/area/atmos)
"sn" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/obj/item/device/radio,/obj/item/weapon/screwdriver,/obj/item/weapon/crowbar,/turf/simulated/floor,/area/atmos)
"so" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/obj/item/weapon/screwdriver,/obj/item/weapon/extinguisher,/obj/item/weapon/crowbar,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor,/area/atmos)
"sp" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/light,/turf/simulated/floor,/area/atmos)
"sq" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/obj/item/weapon/screwdriver,/obj/item/device/t_scanner,/obj/item/device/assembly/signaler,/turf/simulated/floor,/area/atmos)
"sr" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/obj/item/weapon/screwdriver,/obj/item/weapon/extinguisher,/turf/simulated/floor,/area/atmos)
"ss" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"st" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"su" = (/obj/machinery/power/solar_control,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor,/area/derelict/hallway/secondary)
"sv" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/derelict/hallway/secondary)
"sw" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/derelict/storage/storage_access)
"sx" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sy" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sz" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 8},/turf/simulated/floor,/area/atmos)
"sA" = (/obj/machinery/atmospherics/valve{dir = 4},/turf/simulated/floor,/area/atmos)
"sB" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor,/area/atmos)
"sC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/space,/area/derelict/hallway/secondary)
"sD" = (/obj/machinery/power/terminal,/obj/structure/cable,/turf/simulated/floor,/area/derelict/hallway/secondary)
"sE" = (/obj/structure/rack,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/under/color/black,/obj/item/clothing/mask/gas,/obj/item/device/radio/headset,/obj/item/clothing/gloves/black,/obj/item/clothing/shoes/black,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sF" = (/obj/structure/rack,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/under/color/black,/obj/item/clothing/mask/gas,/obj/item/device/radio/headset,/obj/item/clothing/gloves/black,/obj/item/clothing/shoes/black,/obj/item/clothing/glasses/sunglasses,/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sG" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/multitool,/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sH" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/t_scanner,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sI" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sJ" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sK" = (/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sL" = (/obj/structure/table,/obj/item/clothing/mask/gas,/turf/simulated/floor,/area/derelict/storage/storage_access)
"sM" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor,/area/atmos)
"sN" = (/obj/machinery/atmospherics/pipe/manifold/general/visible,/obj/machinery/light,/turf/simulated/floor,/area/atmos)
"sO" = (/obj/structure/table,/obj/item/weapon/cell,/obj/item/weapon/cell,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/device/flashlight,/turf/simulated/floor,/area/atmos)
"sP" = (/obj/structure/table,/obj/item/weapon/cell,/obj/item/weapon/cell,/obj/item/weapon/cell,/obj/item/weapon/cell,/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor,/area/atmos)
"sQ" = (/obj/structure/window/reinforced{dir = 5},/turf/space,/area)
"sR" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/derelict/hallway/secondary)
"sS" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/derelict/hallway/secondary)
"sT" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{tag = ""; icon_state = "4-8"; step_x = 0; pixel_x = 0; d1 = 4; d2 = 8},/turf/simulated/floor,/area/derelict/hallway/secondary)
"sU" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable,/turf/simulated/floor,/area/derelict/hallway/secondary)
"sV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"sW" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area)
"sX" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/derelict/hallway/secondary)
"sY" = (/obj/structure/window/reinforced{dir = 8},/turf/space,/area)
"sZ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
"ta" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
"tb" = (/obj/machinery/door/firedoor/border_only{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
"tc" = (/obj/machinery/light{dir = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
"td" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/derelict/hallway/secondary)
"te" = (/obj/machinery/door/firedoor/border_only{dir = 4},/turf/simulated/floor,/area/derelict/hallway/secondary)
"tf" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/derelict/hallway/secondary)
"tg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"th" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/derelict/hallway/secondary)
"ti" = (/obj/structure/grille,/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area)
"tj" = (/obj/machinery/door/airlock{req_access_txt = "17"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
"tk" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"tl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"tm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"tn" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"to" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/space,/area)
"tp" = (/turf/simulated/wall/r_wall,/area/derelict/teleporter)
"tq" = (/turf/simulated/floor,/area/derelict/teleporter)
"tr" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/derelict/teleporter)
"ts" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
"tt" = (/obj/machinery/light,/turf/simulated/floor,/area/derelict/hallway/secondary)
"tu" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
"tv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
"tw" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
"tx" = (/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
"ty" = (/obj/machinery/door/airlock{req_access_txt = "16"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"tz" = (/obj/structure/closet/emcloset/legacy,/turf/simulated/floor,/area/derelict/hallway/secondary)
"tA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area)
"tB" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/wall/r_wall,/area)
"tC" = (/obj/machinery/computer/teleporter,/turf/simulated/floor{icon_state = "floorgrime"},/area/derelict/teleporter)
"tD" = (/obj/machinery/teleport/station,/turf/simulated/floor{icon_state = "floorgrime"},/area/derelict/teleporter)
"tE" = (/obj/machinery/teleport/hub,/turf/simulated/floor{icon_state = "floorgrime"},/area/derelict/teleporter)
"tF" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/derelict/teleporter)
"tG" = (/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"tH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/derelict/bridge/ai_upload)
"tI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/derelict/bridge/ai_upload)
"tJ" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
"tK" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor,/area/derelict/teleporter)
"tL" = (/obj/effect/landmark{name = "tripai"},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
"tM" = (/obj/machinery/turret,/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
"tN" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
"tO" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
"tP" = (/obj/structure/cable{tag = ""; icon_state = "4-8"; step_x = 0; pixel_x = 0; d1 = 4; d2 = 8},/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
"tQ" = (/obj/structure/rack,/obj/item/weapon/aiModule/freeform,/obj/item/weapon/aiModule/prototypeEngineOffline,/obj/item/weapon/aiModule/safeguard,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"tR" = (/obj/structure/rack,/obj/item/weapon/aiModule/oneHuman,/obj/item/weapon/aiModule/purge,/obj/item/weapon/aiModule/teleporterOffline,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"tS" = (/obj/structure/rack,/obj/item/weapon/aiModule/oxygen,/obj/item/weapon/aiModule/quarantine,/obj/machinery/light{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"tT" = (/obj/structure/rack,/obj/item/weapon/aiModule/protectStation,/obj/item/weapon/aiModule/reset,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"tU" = (/obj/machinery/turret,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"tV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
"tW" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"tX" = (/obj/machinery/turret{dir = 8},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"tY" = (/obj/structure/table,/obj/item/device/radio,/turf/simulated/floor,/area/derelict/teleporter)
"tZ" = (/obj/machinery/light,/turf/simulated/floor,/area/derelict/teleporter)
"ua" = (/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
"ub" = (/obj/machinery/power/apc{pixel_x = 24},/obj/structure/cable,/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
"uc" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"ud" = (/obj/effect/landmark/start{name = "Cyborg"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"ue" = (/obj/effect/landmark/start{name = "AI"},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
"uf" = (/obj/machinery/computer/aiupload,/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"ug" = (/obj/machinery/door/window/eastleft{req_access_txt = "16"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"uh" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"ui" = (/obj/machinery/power/solar_control,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"uj" = (/obj/machinery/turret{dir = 8},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"uk" = (/obj/machinery/door/window/eastleft{req_access_txt = "16"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"ul" = (/obj/machinery/turret{dir = 1},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
"um" = (/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
"un" = (/obj/structure/rack,/obj/item/weapon/aiModule/asimov,/obj/item/weapon/aiModule/freeformcore,/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"uo" = (/obj/machinery/door/airlock{req_access_txt = "16"},/obj/machinery/door/window/eastleft{req_access_txt = "16"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"up" = (/obj/machinery/light,/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"uq" = (/obj/machinery/turret{dir = 1},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
"ur" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
"us" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
"ut" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area)
"uu" = (/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area)
"uv" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area)
"uw" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area)
"ux" = (/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area)
"uy" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area)
"uz" = (/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/obj/structure/cable,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area)
"uA" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -1148,42 +1147,42 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamvnemQmvnWnXnY
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamvotototmvnLoumvmvmvmvmvmvmvmvmvnHneovowneoxmvoyoyoyoyoyoyozoyoAoynBoBoCojoDoiojoEoioloFojoGnRoHjwlsnjlsoIoJoIoIjwhChChChCnsnshChCmYhCoKimfzaaksjzjTjTkukvmokxbhjkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaamvnInInImvnemQoLoMoNoNoOoPoQnemvneoRoSoToUnemvoVoVoVoVoWoXoYoyoZoVnBoBoCpaojpbojojpbpcpdojpenRoHjwpfpgnjoIoIoIphjwmmhChChChChChCkrhkhCpiimfzaaaanujjnvpjjSjSktjzjAjBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapknenenemvnemQneneneneneneplnemvnepmpnpoppnemvpqprprprpsptoYoyoAoynBoBoCojojojpupupvpwojojpxnRoHjwlslslsoIoIoIpyjwhChChCpzhChChChChkhCpAimfzaaaaaaaanujjjjnvpjjzjUjBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamvpBnInepCnemQpDpEnenIpFnenenemvnHpmnWpGpHoxmvpIpJpJpJpKptpLoyoZprnBpMpNpOpPpQpRojpSpwojojpenRoHjwlspTpUoIoIoIoIjwhChChChChChChChChkhCpAimfzaaaaaaaaaaaaaanujjbhkyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapknenenepVnemQpWpDnepXpWnepYnemvpZnepmqaqbnemvptprqcprqdptqeoyoAoynBqfqgqhqiqjqkqlpbpbojojojnRoHjwjwjwjwqmqmqmqmjwqnqoqnqpqpqpqpqpqpqpqpimfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamvnInInImvnImQpDnInepWnIneneneqqnenenemQnenemvqrqsqrqsqtquproyqvoynBnBnBnBnBnBnBnBnBnBnBnBnBqwomqwaahchchchchchchcqxqyqzhchchchcaaaaaaaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqAbDbDbDbDbDbDbDqBaamvotototmvmvqCmvmvmvmvmvmvmvmvmvmvmvmvqCmvmvmvqDqEqFqGqHprprqIprqJprprprprqKprqLqMqMqMqMqLprqwoHqwaabKaaaabKaaaabKqnqoqnbKaaaabKaaaaaaaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaaaaaaaaaaaaaaaaaaaaaaaanRqNqOoHqPqQqRqSqTqUqRqVqWqWqRqXqYqZqTraquququprprprrbprprprrcprrdqKprrbprprprprprprqwoHreaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzhcaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrfcfaacdrfcfaanRrgrgrgnRoHqOoHrhqRqRriqTqUqRqRqRqRqRqRqRrjqTrkrlprrmprrmprrmprprprprprproAprrnrororororpprqwoHrqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrrcfaacdrrcfaarqrsrhoHnRoHqOoHrtqRqRruqTrvrwqRqRqRqRqRqRrxqTryprprprrmprrmpsrzrArBrBrArAqKprrnrCrCrCrCrDprqwoHrqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzhcaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrrcfaacdrrcfaarqoHrhrErFrGrHoHrIqRrvrJqTrvrKrLrMrNqRrOqRrxqTrArArPrQprprprpsprprprrRprprqKqKqKqKqKqKqKqKqKqwoHrqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaadnaaaaaadnaaaarSoHrhqOnRqTqTrTqTqTqTqTqTqTqTqTqTqTrUqTqTqTqTprprprrVprpqprrVprrWrXrYprprrVprrZsasasasasbsanRomrqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzhcaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaascdGdGsddGdGdGsddGdGsesfsgqOnRqTqWqRqRqRqRqRshsiriqTqWqRqRqRqRsjqTrCrCskpsprslsmsnprsospsqsrssoyprprsasasasasasanRoHstaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaadnaaaaaadnaaaasusvrhswnRqTqWqRqRqRsxqRqRqRsyqTszqRqRqRqRqRqToyoyoyoyprsAsBsCoyoyoyoyoyoyoyprproVoVoVoVoVoVnRnSqwnRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahcfzhcaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrrcfaacdrrcfaasDsErhqOnRqTsFsFsGsFqVqRsHsIsJqTsKqRsLsMqRqRqTaaaaoysNsBsOsBsCoyaaaaaaaaaaoysPsQoVoVoVoVoVoVnRoHoHoHnRaaaaaaaaaaaasRsSsRaaaaaaaaaafzfzaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrrcfaacdrrcfaarqsTsUsVnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRsSnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRoHoHoHoHsWaaaaaaaaaasXsYsZaaaaaaaaaafzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdtacfaacdtacfaarqoHrhtbtcrGrGrGrGtdoHoHoHoHoHoHoHoHoHteoHoHoHoHoHoHoHoHoHteoHoHoHoHoHoHoHoHoHteoHoHoHoHtfoHoHoHtgoHoHthaaaaaaaaaasXsSsZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaaaaaaaaaaaaaaaarqoHrhoHtfoHoHoHoHqOoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHtfoHoHoHoHoHtithaaaabtaaaasXoHsZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatjbDbDbDbDbDbDbDqBaanRrgrgnRrgrgqwqwqwtkqwqwqwtltlnRtltltltltlnRtltltltltlnRtltltltltlnRtltltltltlnRtltltltmtnoHoHoHoHoHoHtolwlwlwlwlwtpoHsZaaaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzfzfzfzfztqtqtrtstttstrtqtqfzfzfzfzfzfzfzfzfzfzfzfzfznRfzfzfzfzfzqwfzfzfzfzfzqwfzfzfzqwqwnSqwoHoHoHoHsStfoHoHoHtuoHoHsZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatqtrtrtrtvtwtwtxtqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatyaaaaaaaaaatyaaaabttytytztytAtAqwtBtCtBtCmpmpmpmpmpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatqtrtrtDtEtFtrtGtqaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaatytytytytytytytytytytytytytytytHtytItJtytKaTtKaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatqtLtrtrtrtrtrtrtqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatytytMtNtOtNtPtQtRtStTtUtVtWtXtytHtHtHtYtytKaTtKaTaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaatqtqtZtruatrtrtqtqaaaaaaaaaabtaaaaaaaaaaaaaaaatytytyubtHubtHuctytHtHtHtHtHtyudtytHuetHtHtytKaTtKaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatqtqtqtqtqtqtqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatytyufugtHtHtHuhuhtHtHuitHtHtyujtytHuetHuktytKaTtKaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaatytytyubtHubtHubtytytytHtHuhuhuluhtHuetHtHtytKaTtKaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatytytMumunumubtyuouptHuqurtyustytHtHtHtYtytKaTtKaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatytytytytytytytytytytytytyustytytytytytyutaTutaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauuaaaaaaaaaadnaaaaaaaaaauuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamvpBnInepCnemQpDpEnenIpFnenenemvnHpmnWpGpHoxmvpIpJpJpJpKptpLoyoZprnBpMpNojpOpPpQojpRpwojojpenRoHjwlspSpToIoIoIoIjwhChChChChChChChChkhCpAimfzaaaaaaaaaaaaaanujjbhkyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapknenenepUnemQpVpDnepWpVnepXnemvpYnepmpZqanemvptprqbprqcptqdoyoAoynBqeqfqgqhqiqjqkpbpbojojojnRoHjwjwjwjwqlqlqlqljwqmqnqmqoqoqoqoqoqoqoqoimfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamvnInInImvnImQpDnInepVnIneneneqpnenenemQnenemvqqqrqqqrqsqtproyquoynBnBnBnBnBnBnBnBnBnBnBnBnBqvomqvaahchchchchchchcqwqxqyhchchchcaaaaaaaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqzbDbDbDbDbDbDbDqAaamvotototmvmvqBmvmvmvmvmvmvmvmvmvmvmvmvqBmvmvmvqCqDqEqFqGprprqHprqIprprprprqJprqKqLqLqLqLqKprqvoHqvaabKaaaabKaaaabKqmqnqmbKaaaabKaaaaaaaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaaaaaaaaaaaaaaaaaaaaaaaanRqMqNoHqOqPqQqRqSqTqQqUqVqVqQqWqXqYqSqZqtqtqtprprprraprprprrbprrcqJprraprprprprprprqvoHrdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzhcaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrecfaacdrecfaanRrfrfrfnRoHqNoHrgqQqQrhqSqTqQqQqQqQqQqQqQriqSrjrkprrlprrlprrlprprprprprproAprrmrnrnrnrnroprqvoHrpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrqcfaacdrqcfaarprrrgoHnRoHqNoHrsqQqQrtqSrurvqQqQqQqQqQqQrwqSrxprprprrlprrlpsryrzrArArzrzqJprrmrBrBrBrBrCprqvoHrpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzhcaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrqcfaacdrqcfaarpoHrgrDrErFrGoHrHqQrurIqSrurJrKrLrMqQrNqQrwqSrzrzrOrPprprprpsprprprrQprprqJqJqJqJqJqJqJqJqJqvoHrpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaadnaaaaaadnaaaarRoHrgqNnRqSqSrSqSqSqSqSqSqSqSqSqSqSrTqSqSqSqSprprprrUprpqprrUprrVrWrXprprrUprrYrZrZrZrZsarZnRomrpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzhcaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasbdGdGscdGdGdGscdGdGsdsesfqNnRqSqVqQqQqQqQqQsgshrhqSqVqQqQqQqQsiqSrBrBsjpsprskslsmprsnsospsqsroyprprrZrZrZrZrZrZnRoHssaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaadnaaaaaadnaaaastsurgsvnRqSqVqQqQqQswqQqQqQsxqSsyqQqQqQqQqQqSoyoyoyoyprszsAsBoyoyoyoyoyoyoyprproVoVoVoVoVoVnRnSqvnRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahcfzhcaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrqcfaacdrqcfaasCsDrgqNnRqSsEsEsFsEqUqQsGsHsIqSsJqQsKsLqQqQqSaaaaoysMsAsNsAsBoyaaaaaaaaaaoysOsPoVoVoVoVoVoVnRoHoHoHnRaaaaaaaaaaaasQsRsQaaaaaaaaaafzfzaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrqcfaacdrqcfaarpsSsTsUnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRsRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRoHoHoHoHsVaaaaaaaaaasWsXsYaaaaaaaaaafzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdsZcfaacdsZcfaarpoHrgtatbrFrFrFrFtcoHoHoHoHoHoHoHoHoHtdoHoHoHoHoHoHoHoHoHtdoHoHoHoHoHoHoHoHoHtdoHoHoHoHteoHoHoHtfoHoHtgaaaaaaaaaasWsRsYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaaaaaaaaaaaaaaaarpoHrgoHteoHoHoHoHqNoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHteoHoHoHoHoHthtgaaaabtaaaasWoHsYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatibDbDbDbDbDbDbDqAaanRrfrfnRrfrfqvqvqvtjqvqvqvtktknRtktktktktknRtktktktktknRtktktktktknRtktktktktknRtktktktltmoHoHoHoHoHoHtnlwlwlwlwlwtooHsYaaaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzfzfzfzfztptptqtrtstrtqtptpfzfzfzfzfzfzfzfzfzfzfzfzfznRfzfzfzfzfzqvfzfzfzfzfzqvfzfzfzqvqvnSqvoHoHoHoHsRteoHoHoHttoHoHsYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatptqtqtqtutvtvtwtpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatxaaaaaaaaaatxaaaabttxtxtytxtztzqvtAtBtAtBmpmpmpmpmpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatptqtqtCtDtEtqtFtpaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaatxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtGtxtHtItxtJaTtJaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatptKtqtqtqtqtqtqtpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatxtxtLtMtNtMtOtPtQtRtStTtUtVtWtxtGtGtGtXtxtJaTtJaTaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaatptptYtqtZtqtqtptpaaaaaaaaaabtaaaaaaaaaaaaaaaatxtxtxuatGuatGubtxtGtGtGtGtGtxuctxtGudtGtGtxtJaTtJaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatptptptptptptpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatxtxueuftGtGtGugugtGtGuhtGtGtxuitxtGudtGujtxtJaTtJaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaatxtxtxuatGuatGuatxtxtxtGtGugugukugtGudtGtGtxtJaTtJaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatxtxtLulumuluatxunuotGupuqtxurtxtGtGtGtXtxtJaTtJaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatxtxtxtxtxtxtxtxtxtxtxtxtxurtxtxtxtxtxtxusaTusaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaautaaaaaaaaaadnaaaaaaaaaautaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaaaaaaaadnaaaaaaaaaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauvuvuvaadnaauvuvuvaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauwuxuxdGuydGuxuxuzaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauAuAuAaadnaauAuAuAaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauuuuuuaadnaauuuuuuaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauvuwuwdGuxdGuwuwuyaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauzuzuzaadnaauzuzuzaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaaaaaaaadnaaaaaaaaaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauvuvuvaadnaauvuvuvaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauwuxuxdGuydGuxuxuzaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauAuAuAaadnaauAuAuAaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauuuuuuaadnaauuuuuuaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauvuwuwdGuxdGuwuwuyaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauzuzuzaadnaauzuzuzaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaaaaaaaadnaaaaaaaaaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatjbDbDbDbDbDuBbDbDbDbDbDfkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatibDbDbDbDbDuAbDbDbDbDbDfkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
File diff suppressed because it is too large Load Diff