diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index aa3a13962a9..d4234b13ddd 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -3595,7 +3595,7 @@ "brg" = (/obj/machinery/door/window/eastright{dir = 4; name = "MiniSat Walkway Access"; req_access_txt = "13;75"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/construction/hallway{name = "\improper MiniSat Exterior"}) "brh" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bri" = (/turf/simulated/wall/r_wall,/area/turret_protected/aisat_interior{name = "\improper MiniSat Central Foyer"}) -"brj" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) +"brj" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/turf/simulated/floor/plating/airless,/area/construction/hallway{name = "\improper MiniSat Exterior"}) "brk" = (/turf/simulated/wall/r_wall,/area/turret_protected/tcomeast{name = "\improper MiniSat East Wing"}) "brl" = (/obj/structure/table/reinforced{tag = "icon-table"; icon_state = "table"},/obj/item/weapon/folder/blue{pixel_x = 5},/obj/item/weapon/pen/multi,/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) "brm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/ai_status_display{pixel_y = -32},/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) @@ -3651,7 +3651,7 @@ "bsk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central) "bsl" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/central) "bsm" = (/turf/simulated/wall,/area/civilian/barber) -"bsn" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) +"bsn" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating/airless,/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bso" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorengglass.dmi'; name = "Barber Shop"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/civilian/barber) "bsp" = (/turf/simulated/wall,/area/crew_quarters/bar) "bsq" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -3684,7 +3684,7 @@ "bsR" = (/obj/structure/transit_tube{icon_state = "E-SW"; tag = "icon-E-NW"},/obj/structure/lattice,/turf/space,/area/space) "bsS" = (/obj/structure/transit_tube{icon_state = "W-SE"},/turf/space,/area/space) "bsT" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/construction/hallway{name = "\improper MiniSat Exterior"}) -"bsU" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) +"bsU" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/plating/airless,/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bsV" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/teleport/station,/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/turret_protected/tcomfoyer{name = "\improper MiniSat Teleporter Foyer"}) "bsW" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/computer/teleporter,/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/turret_protected/tcomfoyer{name = "\improper MiniSat Teleporter Foyer"}) "bsX" = (/obj/machinery/teleport/hub,/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/turret_protected/tcomfoyer{name = "\improper MiniSat Teleporter Foyer"}) diff --git a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm index 0ecb877b78a..5a76cbedb96 100644 --- a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm @@ -100,7 +100,7 @@ "bV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/wall/rust,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "bW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; level = 1},/turf/simulated/wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "bX" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) -"bY" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/obj/effect/landmark/corpse,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) +"bY" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "bZ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "ca" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "cb" = (/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) @@ -1260,30 +1260,30 @@ "yl" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"}) "ym" = (/obj/structure/ore_box,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "yn" = (/obj/structure/closet/crate,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) -"yo" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/structure/stool/bed/nest,/obj/effect/landmark/corpse,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) +"yo" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/structure/stool/bed/nest,/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "yp" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/effect/glowshroom/single,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "yq" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/structure/stool/bed/nest,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "yr" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gib2_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "ys" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) -"yt" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/landmark/corpse,/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) +"yt" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/landmark/corpse/miner/rig,/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "yu" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/glowshroom/single,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "yv" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "yw" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "yx" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "yy" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "yz" = (/obj/structure/alien/resin/membrane,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) -"yA" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/landmark/corpse,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) +"yA" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "yB" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "yC" = (/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gib1_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) -"yD" = (/obj/effect/decal/cleanable/blood/splatter{color = "red"},/obj/effect/landmark/corpse,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) -"yE" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/effect/decal/cleanable/blood/splatter{color = "red"},/obj/effect/landmark/corpse,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) +"yD" = (/obj/effect/decal/cleanable/blood/splatter{color = "red"},/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) +"yE" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/effect/decal/cleanable/blood/splatter{color = "red"},/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "yF" = (/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gibdown1_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "yG" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 4; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "yH" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 5; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "yI" = (/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "yJ" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gibdown1_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) -"yK" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/landmark/corpse,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) -"yL" = (/obj/structure/alien/weeds,/obj/effect/landmark/corpse,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) +"yK" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/landmark/corpse/miner/rig,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) +"yL" = (/obj/structure/alien/weeds,/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index e04b5939ff2..a8cbcffc85e 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -275,8 +275,8 @@ "afo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/security/permabrig) "afp" = (/obj/machinery/flasher{id = "permaflash3"; pixel_x = 28; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "afq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/security/permabrig) -"afr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/item/clothing/mask/gas/clown_hat,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) -"afs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) +"afr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/item/clothing/mask/gas/clown_hat,/turf/simulated/floor/plating/airless,/area/space) +"afs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating/airless,/area/space) "aft" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/holofloor{dir = 10; icon_state = "red"},/area/security/permabrig) "afu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/security/permabrig) "afv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/security/permabrig) @@ -298,7 +298,7 @@ "afL" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) "afM" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "afN" = (/obj/structure/stool/bed,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"afO" = (/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) +"afO" = (/turf/simulated/floor/plating/airless,/area/space) "afP" = (/obj/machinery/door/window{dir = 4; name = "Infirmary"; req_access_txt = "150"},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate) "afQ" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access_txt = "150"},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate) "afR" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/crowbar/red,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate) @@ -307,8 +307,8 @@ "afU" = (/obj/machinery/door/airlock/glass_security{name = "Prison 1"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "afV" = (/obj/machinery/door/airlock/glass_security{name = "Prison 2"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "afW" = (/obj/machinery/door/airlock/glass_security{name = "Prison 3"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"afX" = (/obj/structure/grille,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) -"afY" = (/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) +"afX" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/space) +"afY" = (/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/turf/simulated/floor/plating/airless,/area/space) "afZ" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/vox) "aga" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "vox_west_control"; req_one_access_txt = "152"},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/vox) "agb" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_northwest_lock"; locked = 1; req_access_txt = "152"; req_one_access = null; req_one_access_txt = "0"},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox) @@ -412,7 +412,7 @@ "ahV" = (/obj/structure/stool/bed,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/security/permabrig) "ahW" = (/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/security/permabrig) "ahX" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "Brig Secure Armory Exterior North"; dir = 4; network = list("SS13")},/turf/space,/area/security/permabrig) -"ahY" = (/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = -32},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) +"ahY" = (/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = -32},/turf/simulated/floor/plating/airless,/area/space) "ahZ" = (/obj/machinery/door/airlock/hatch{req_access_txt = "152"},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox) "aia" = (/obj/effect/decal/cleanable/cobweb,/obj/structure/table,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/glasses/sunglasses/blindfold,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) "aib" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) @@ -424,7 +424,7 @@ "aih" = (/turf/simulated/wall/r_wall,/area/security/hos) "aii" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/hos) "aij" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/hos) -"aik" = (/obj/structure/lattice{layer = 2.4},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) +"aik" = (/obj/structure/lattice{layer = 2.4},/turf/simulated/floor/plating/airless,/area/space) "ail" = (/turf/simulated/shuttle/plating/vox,/area/shuttle/vox) "aim" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox) "ain" = (/obj/machinery/camera{c_tag = "Prison Execution Chamber"; dir = 4; network = list("Prison","SS13")},/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = -1; pixel_y = -2},/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) @@ -468,7 +468,7 @@ "aiZ" = (/obj/structure/stool/bed/chair/comfy/black,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "aja" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "ajb" = (/turf/simulated/wall/r_wall,/area/security/podbay) -"ajc" = (/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) +"ajc" = (/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating/airless,/area/space) "ajd" = (/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox) "aje" = (/obj/item/weapon/skeleton/r_arm,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox) "ajf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) @@ -560,7 +560,7 @@ "akN" = (/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel,/area/security/podbay) "akO" = (/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/security/podbay) "akP" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel,/area/security/podbay) -"akQ" = (/obj/structure/grille,/obj/structure/sign/securearea,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) +"akQ" = (/obj/structure/grille,/obj/structure/sign/securearea,/turf/simulated/floor/plating/airless,/area/space) "akR" = (/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 2},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox) "akS" = (/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (NORTH)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 1},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox) "akT" = (/obj/effect/decal/warning_stripes/northwest,/turf/simulated/floor/plasteel,/area/security/range) @@ -1585,7 +1585,7 @@ "aEy" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/security/lobby) "aEz" = (/obj/structure/disposalpipe/segment,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/lobby) "aEA" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/lobby) -"aEB" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor,/area/security/lobby) +"aEB" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/lobby) "aEC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Lobby"; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/security/lobby) "aED" = (/obj/machinery/light_switch{pixel_x = -25},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence) "aEE" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/closet{name = "Evidence Closet"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence) @@ -1960,9 +1960,9 @@ "aLJ" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice) "aLK" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore) "aLL" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint) -"aLM" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) +"aLM" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/cryopod/right,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) "aLN" = (/obj/machinery/cryopod,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) -"aLO" = (/obj/structure/cryofeed,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) +"aLO" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/cryopod/right,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) "aLP" = (/turf/simulated/wall,/area/crew_quarters/sleep) "aLQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 9},/area/crew_quarters/fitness) "aLR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 5},/area/crew_quarters/fitness) @@ -2019,7 +2019,7 @@ "aMQ" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/landmark/start{name = "Internal Affairs Agent"},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice) "aMR" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice) "aMS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/crew_quarters/sleep) -"aMT" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) +"aMT" = (/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/cryopod/right,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) "aMU" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness) "aMV" = (/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "aMW" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) @@ -2062,7 +2062,7 @@ "aNH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "aNI" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "aNJ" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eva_airlock"; name = "exterior access button"; pixel_x = 0; pixel_y = 25; req_access_txt = "13"},/turf/simulated/floor/plating/airless/catwalk,/area/maintenance/fpmaint) -"aNK" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eva_outer"; locked = 1; name = "EVA External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/maintenance/fpmaint) +"aNK" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eva_outer"; locked = 1; name = "EVA External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating/airless,/area/maintenance/fpmaint) "aNL" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eva_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "eva_pump"},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aNM" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "eva_airlock"; name = "EVA Airlock Console"; pixel_y = 25; req_access_txt = "0"; req_one_access_txt = "1;5;11;18;24"; tag_airpump = "eva_pump"; tag_chamber_sensor = "eva_sensor"; tag_exterior_door = "eva_outer"; tag_interior_door = "eva_inner"},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aNN" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eva_inner"; locked = 1; name = "EVA Internal Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint) @@ -2091,7 +2091,7 @@ "aOk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/hallway/primary/fore) "aOl" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint) "aOm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/crew_quarters/sleep) -"aOn" = (/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) +"aOn" = (/obj/machinery/cryopod/right,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) "aOo" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness) "aOp" = (/obj/structure/stool,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "aOq" = (/obj/structure/window/reinforced{dir = 8},/obj/effect/landmark/start{name = "Civilian"},/obj/machinery/door/window/westright{dir = 1; name = "Boxing Ring"},/turf/simulated/floor/wood,/area/crew_quarters/fitness) @@ -2210,7 +2210,7 @@ "aQz" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore) "aQA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/hallway/primary/fore) "aQB" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint) -"aQC" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) +"aQC" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/cryopod/right,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) "aQD" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) "aQE" = (/obj/structure/table/woodentable,/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "aQF" = (/obj/structure/table/woodentable,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) @@ -2328,8 +2328,8 @@ "aSN" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) "aSO" = (/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore) "aSP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint) -"aSQ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) -"aSR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) +"aSQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) +"aSR" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/obj/machinery/cryopod/right,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) "aSS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall,/area/crew_quarters/sleep) "aST" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness) "aSU" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) @@ -2467,7 +2467,7 @@ "aVw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/camera{c_tag = "EVA East"; dir = 8; network = list("SS13")},/obj/structure/table/reinforced,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) "aVx" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) "aVy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint) -"aVz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) +"aVz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/cryopod,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) "aVA" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aVB" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aVC" = (/obj/structure/urinal{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) @@ -7269,8 +7269,8 @@ "cJO" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "RnDChem"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/grille,/obj/structure/window/plasmareinforced,/obj/structure/window/plasmareinforced{dir = 4},/obj/structure/window/plasmareinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/insulated,/turf/simulated/floor/engine,/area/toxins/misc_lab) "cJP" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/toxins/misc_lab) "cJQ" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"cJR" = (/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/engine/mechanic_workshop) -"cJS" = (/obj/structure/grille,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/engine/mechanic_workshop) +"cJR" = (/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating/airless,/area/engine/mechanic_workshop) +"cJS" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/mechanic_workshop) "cJT" = (/obj/machinery/door/airlock/maintenance{name = "Mechanic Workshop Maintenance"; req_access = null; req_access_txt = "70"},/turf/simulated/floor/plating,/area/maintenance/aft) "cJU" = (/obj/structure/rack{dir = 1},/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/electrical,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/radio{pixel_y = 6},/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop) "cJV" = (/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop) @@ -8841,8 +8841,8 @@ "doa" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Foyer"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior) "dob" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/turret_protected/aisat_interior) "doc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/turret_protected/aisat_interior) -"dod" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/turret_protected/aisat_interior) -"doe" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/turret_protected/aisat_interior) +"dod" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/plating/airless,/area/turret_protected/aisat_interior) +"doe" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/turf/simulated/floor/plating/airless,/area/turret_protected/aisat_interior) "dof" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "sci_outer"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "dog" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk4"; icon_state = "catwalk4"},/area/solar/starboard) "doh" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/starboard) @@ -8961,6 +8961,7 @@ "dqq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Chamber Hallway"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"}) "dqr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/aisat{name = "\improper AI Satellite Hallway"}) "dqs" = (/obj/machinery/door/airlock/maintenance_hatch{name = "MiniSat Maintenance"; req_access_txt = "75"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"}) +"dqt" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/cryopod/right,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep) "dqu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"}) "dqv" = (/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"}) "dqw" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"}) @@ -9163,17 +9164,17 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaHQaHRaHQaaaaaaaaaaGnaHSaHTaHSaHUaHVaHWaGnaaaaaaaGjaHXaHYaHZaIaaHSaGnaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEiaEiaEiaIbaIcaIdaIeaIeaIfaIgaIhaIhaIiaIjaIkaIlaImaImaIlaInaIlaIoaIoaIoaIoaIoaIoaIpaIoaIoaIqaIraIsaItaEjaIuaEjaIvaEjaEjayeaIwavqavqavqavqaIxavraDNaIyaFUaIzaDOaIAaGRaGSaERaDPaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaHQaIBaHQaaaaabaGTaICaIDaIEaGTaIFaIFaIFaIFaIFaHNaHNaHNaGXaIGaGYaHOaHPaHaaGYaHaaHaaHaaGXaIHaGXaGXaGXaGXaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaIIaIJaIIaaaaaaaabaGnaIKaILaHSaHSaIMaHSaGnaIIaIIaGjaGjaINaIOaIaaHSaGnaGnaIIaIIaIIaGnaGnaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaIbaIPaIQaIRaISaITaIgaIUaIVaIWaIjaIXaIlaIYaIZaJaaJbaJcaJdaJeaJfaJgaJhaJiaJjaJkaJlaJmaFFaFHaJnaJoaJpaJqaJraJqaJqaJqaJsaJqaJqaJqaJqaJtaJuaJvaJwaJxaJyaJzaJAaJBaJCaJDaDPaabaJEaJFaJFaJFaJFaJFaJGaabaabaaaaaaaaaaaaaHNaJHaHNaaaaIFaGTaGTaJIaJJaGTaJKaGYaGYaGYaHaaJLaGYaJMaGXaGYaGYaGYaJNaHaaGYaGXaJOaJPaGXaGYaJQaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJRaJSaJTaaaaJUaJVaJWaabaabaIIaHSaIIaaaaaaaabaGnaJXaJYaJZaKaaKbaKcaGnaKdaHSaKeaKfaKgaKhaKhaKhaKhaKhaKhaKhaKhaKiaGnaaaaKjaaaaaaaaaaaaaaaaaaaaaaaaaIbaKkaKlaKmaKnaKoaKpaKqaKraKsaIjaIXaIlaKtaKuaKvaJbaJcaKwaKxaKxaKxaKxaKxaJjaKyaJlaFzaFFaFHaEjaKzaKAaKBaKCaKBaKBaKDaKEaKFaKFaKFaKFaKFaKFaKGaKHaKIaKJaKKaKLaKMaKNaDPaDPaKOaKPaKQaKQaKQaKQaKQaKPaKOaabaaaaaaaaaaaaaHNaKRaKSaaaaIFaKTaKUaKVaKWaGYaGYaGYaHaaGYaHaaKXaGYaGYaGXaGYaKYaKZaKXaIHaGYaGXaLaaLbaGXaGYaLcaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLdaLeaLfaLeaLdaLgaLhaLgaLdaabaIIaLiaLjaaaaaaaGnaGnaGnaGnaGnaLkaLlaLmaLnaLoaLpaLpaLqaLraLraLsaLtaGnaHSaGnaGnaGnaLuaGnaaaaabaaaaaaaaaaaaaaaaaaaabaabaIbaLvaLwaLxaLyaLzaLAaLBaLCaKsaIjaIXaIlaLDaLEaLFaJbaLGaLHaKxaLIaKxaLJaLJaJjaKxaJlaFzaFFaLKaEjaLLaKAaLMaLNaLOaLPaLQaLRaLSaLTaLUaLVaLWaLXaLYaLZaMaaMbaMcaMdaMeaMfaMgaMhaKOaKPaKQaKQaKQaKQaKQaKPaKOaabaabaabaabaHNaHNaMiaMjaHNaIFaMkaGYaMlaGYaHbaGYaGXaGXaMmaGXaGXaMnaHaaHaaKXaMoaMpaGYaGXaGYaMqaMqaMqaMqaMqaMqaMqaMqaMqaMraMraMraMraacaMraMraabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaLeaMtaLeaMsaLgaMuaLgaMsaGnaIIaMvaMwaIIaIIaGnaHSaHSaHSaHSaHSaHSaHSaLkaLuaGnaGnaGnaGnaGnaMxaGnaGnaHSaMyaGnaMzaLuaGnaGnaGnaaaaaaaaaaaaaaaaMAaMAaMAaMAaMAaMAaMAaMAaMAaLAaMBaMCaMDaMEaMFaMGaMHaMIaMJaMKaJcaMLaKxaMMaMNaMOaMPaMQaMRaJlaFzaFFaFHaEjaAPaMSaMTaLNaLOaLPaMUaMVaMVaMVaMVaMVaMVaMVaMVaMVaMVaMWaMXaMYaMZaNaaNbaNcaNdaKPaKQaKQaKQaKQaKQaKPaKOaKOaKOaaaaaaaHNaGYaNeaNfaJKaHaaMoaKXaMlaGYaNgaGZaNhaIHaGYaGYaGYaGYaNiaGYaGYaMoaNjaGYaMnaGYaMqaNkaNlaNmaMqaNnaNoaNpaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaNqaNraNsaMsaNtaNuaNvaNwaNxaHSaNyaNzaNAaMyaNBaHSaGnaGnaGnaGnaGnaGnaGnaLuaGnaNCafOaNDaGnaNEaNFaNGaHSaNBaGnaNAaNHaKhaKiaNIaaaaaaaaaaaaaaaaNJaNKaNLaNMaNNaNOaNPaMAaiWaLAaNRaNSaNTaLAaNUaIlaNVaNWaNXaNYaJcaNZaKxaOaaObaOcaOdaOeaOfaOgaOhaOiaOjaOkaOlaOmaOnaLNaLOaLPaOoaMVaOpaOpaOpaMVaMVaOqaOraOraOsaMWaOtaOuaOvaOvaOwaOxaOyaOzaKQaKQaKQaKQaKQaOAaOBaOCaODaaaaaaaHNaGYaGYaOEaGYaHaaOFaGYaOGaOHaOHaOHaOHaOIaOHaOJaGYaGYaGYaGYaGYaGYaGYaGYaHaaGZaMqaOKaOLaOLaMqaOMaONaOOaMqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaOPaOQaORaMsaOPaOQaORaNwaKcaHSaOSaHSaHSaHSaHSaHSaGnaOTaOUaOVaOWaOXaGnaLuaGnafOaOYaNCaOZaPaaPbaGnaPcaGnaGnaGnaGnaPcaLuaNIaaaaHQaHQaHQaHQaPdaNKaPeaPfaPgaPhaPiaPjaMAaLAaPkaPlaPlaPlaPmaPnaPoaPnaPnaPnaPpaPqaPraPsaPtaPtaPtaPtaPuaPvaPwaFFaPxaEjaAPaPyaPzaLNaLOaLPaMUaOpaPAaPAaPBaOpaMVaPCaPDaPDaPEaPFaOtaPGaPHaPIaPJaMVaPKaODaKQaKQaKQaKQaKQaODaPLaPMaODaabaabaGXaGYaGYaHaaHaaHaaHPaHPaGXaGXaGXaHaaHaaHaaGXaPNaPOaGXaHaaHaaGXaHaaHaaGXaGXaPPaPQaPRaPSaPTaPUaPVaOKaPWaMqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPXaPYaLdaMsaPZaQaaLdaMsaPZaQaaLdaGnaLkaGnaGnaGnaGnaGnaHSaGnaHSaQbaQcaHSaHSaGnaLuaGnaQdaabaQdaGnaJYaPbaGnaQeaQfaGnaNAaKcaGnaLuaMAaMAaQgaQgaQgaQgaQgaQgaQgaQgaQgaPiaPiaPjaQhaQiaQjaQkaQlaQmaQnaQoaQpaQpaQpaQpaQqaQraQsaQtaQuaQpaQpaQvaQvaQwaQxaQyaQzaQAaQBaPyaQCaQDaQDaLPaMUaOpaPAaQEaQFaOpaMVaPCaPDaPDaPEaQGaOtaPGaPIaPIaPJaMVaPKaODaKQaKQaKQaKQaKQaODaQHaPMaODaaaaaaaGXaQIaGYaGYaQJaHaaQKaHOaQLaQMaHbaGXaOFaHbaGXaQNaGYaGXaQOaGYaGXaQPaQQaQRaOHaQSaOHaQTaQUaQVaQWaQXaQYaQZaMqaMraMraacaacaMraMraMraMraabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLdaLeaLfaLeaLdaLgaLhaLgaLdaabaIIaLiaLjaaaaaaaGnaGnaGnaGnaGnaLkaLlaLmaLnaLoaLpaLpaLqaLraLraLsaLtaGnaHSaGnaGnaGnaLuaGnaaaaabaaaaaaaaaaaaaaaaaaaabaabaIbaLvaLwaLxaLyaLzaLAaLBaLCaKsaIjaIXaIlaLDaLEaLFaJbaLGaLHaKxaLIaKxaLJaLJaJjaKxaJlaFzaFFaLKaEjaLLaKAaLMaPzaLNaLPaLQaLRaLSaLTaLUaLVaLWaLXaLYaLZaMaaMbaMcaMdaMeaMfaMgaMhaKOaKPaKQaKQaKQaKQaKQaKPaKOaabaabaabaabaHNaHNaMiaMjaHNaIFaMkaGYaMlaGYaHbaGYaGXaGXaMmaGXaGXaMnaHaaHaaKXaMoaMpaGYaGXaGYaMqaMqaMqaMqaMqaMqaMqaMqaMqaMraMraMraMraacaMraMraabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaLeaMtaLeaMsaLgaMuaLgaMsaGnaIIaMvaMwaIIaIIaGnaHSaHSaHSaHSaHSaHSaHSaLkaLuaGnaGnaGnaGnaGnaMxaGnaGnaHSaMyaGnaMzaLuaGnaGnaGnaaaaaaaaaaaaaaaaMAaMAaMAaMAaMAaMAaMAaMAaMAaLAaMBaMCaMDaMEaMFaMGaMHaMIaMJaMKaJcaMLaKxaMMaMNaMOaMPaMQaMRaJlaFzaFFaFHaEjaAPaMSaLOaPzaLNaLPaMUaMVaMVaMVaMVaMVaMVaMVaMVaMVaMVaMWaMXaMYaMZaNaaNbaNcaNdaKPaKQaKQaKQaKQaKQaKPaKOaKOaKOaaaaaaaHNaGYaNeaNfaJKaHaaMoaKXaMlaGYaNgaGZaNhaIHaGYaGYaGYaGYaNiaGYaGYaMoaNjaGYaMnaGYaMqaNkaNlaNmaMqaNnaNoaNpaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaNqaNraNsaMsaNtaNuaNvaNwaNxaHSaNyaNzaNAaMyaNBaHSaGnaGnaGnaGnaGnaGnaGnaLuaGnaNCafOaNDaGnaNEaNFaNGaHSaNBaGnaNAaNHaKhaKiaNIaaaaaaaaaaaaaaaaNJaNKaNLaNMaNNaNOaNPaMAaiWaLAaNRaNSaNTaLAaNUaIlaNVaNWaNXaNYaJcaNZaKxaOaaObaOcaOdaOeaOfaOgaOhaOiaOjaOkaOlaOmaMTaPzaLNaLPaOoaMVaOpaOpaOpaMVaMVaOqaOraOraOsaMWaOtaOuaOvaOvaOwaOxaOyaOzaKQaKQaKQaKQaKQaOAaOBaOCaODaaaaaaaHNaGYaGYaOEaGYaHaaOFaGYaOGaOHaOHaOHaOHaOIaOHaOJaGYaGYaGYaGYaGYaGYaGYaGYaHaaGZaMqaOKaOLaOLaMqaOMaONaOOaMqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaOPaOQaORaMsaOPaOQaORaNwaKcaHSaOSaHSaHSaHSaHSaHSaGnaOTaOUaOVaOWaOXaGnaLuaGnafOaOYaNCaOZaPaaPbaGnaPcaGnaGnaGnaGnaPcaLuaNIaaaaHQaHQaHQaHQaPdaNKaPeaPfaPgaPhaPiaPjaMAaLAaPkaPlaPlaPlaPmaPnaPoaPnaPnaPnaPpaPqaPraPsaPtaPtaPtaPtaPuaPvaPwaFFaPxaEjaAPaPyaOnaPzaLNaLPaMUaOpaPAaPAaPBaOpaMVaPCaPDaPDaPEaPFaOtaPGaPHaPIaPJaMVaPKaODaKQaKQaKQaKQaKQaODaPLaPMaODaabaabaGXaGYaGYaHaaHaaHaaHPaHPaGXaGXaGXaHaaHaaHaaGXaPNaPOaGXaHaaHaaGXaHaaHaaGXaGXaPPaPQaPRaPSaPTaPUaPVaOKaPWaMqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPXaPYaLdaMsaPZaQaaLdaMsaPZaQaaLdaGnaLkaGnaGnaGnaGnaGnaHSaGnaHSaQbaQcaHSaHSaGnaLuaGnaQdaabaQdaGnaJYaPbaGnaQeaQfaGnaNAaKcaGnaLuaMAaMAaQgaQgaQgaQgaQgaQgaQgaQgaQgaPiaPiaPjaQhaQiaQjaQkaQlaQmaQnaQoaQpaQpaQpaQpaQqaQraQsaQtaQuaQpaQpaQvaQvaQwaQxaQyaQzaQAaQBaPyaQCaPzaLNaLPaMUaOpaPAaQEaQFaOpaMVaPCaPDaPDaPEaQGaOtaPGaPIaPIaPJaMVaPKaODaKQaKQaKQaKQaKQaODaQHaPMaODaaaaaaaGXaQIaGYaGYaQJaHaaQKaHOaQLaQMaHbaGXaOFaHbaGXaQNaGYaGXaQOaGYaGXaQPaQQaQRaOHaQSaOHaQTaQUaQVaQWaQXaQYaQZaMqaMraMraacaacaMraMraMraMraabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRaaRbaOQaRbaRcaRcaRcaRdaRcaRcaRcaReaRfaRgaRgaRgaRgaRhaGnaHSaGnaRiaRjaRkaHSaRlaPcaLuaGnaGnaGnaGnaGnaGnaPcaGnaHSaRkaLkaHSaHSaHSaNQaRnaRoaRpaRpaRpaRpaRqaRpaRpaRraRsaRoaRtaRuaRuaRuaRuaRuaRuaRuaRvaRwaRwaRwaRwaRxaRyaRwaRzaRwaRAaRxaRwaRwaRwaRwaRBaRCaRDaREaRFaOmaRGaRHaQDaRIaMUaOpaRJaRKaRLaOpaMVaRMaRNaRNaROaMWaOtaRPaRQaRQaRRaMVaRSaRTaKQaKQaKQaKQaKQaRUaRVaRWaODaaaaaaaGXaGYaGYaGYaGYaGYaGYaQRaOHaOHaOHaOHaOHaOHaOHaKVaGYaGYaGYaGYaMnaGYaGYaMlaGYaRXaRYaRZaSaaSbaOLaOLaOLaScaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPYaPYaSdaSeaSfaSgaShaSiaSjaSkaSlaSjaSmaSnaSjaSjaSoaGnaHSaGnaSpaHSaHSaSqaSraGnaNHaKiaHSaHSaHSaHSaHSaHSaPcaSsaHSaGnaNxaNxaGnaRmaMAaSuaSvaSwaSwaSwaSxaSwaSwaSwaSyaSuaSzaSAaSAaSAaSAaSAaSAaSAaPiaRwaSBaSCaSDaSEaSFaSGaSHaSIaSJaSKaSLaSCaSMaRwaSNaFFaSOaEjaSPaPyaSQaSRaSRaSSaSTaSUaSVaSWaSWaSXaSYaSZaSXaSYaSYaTaaTbaTcaMVaMVaTdaMVaTeaTfaKQaKQaKQaKQaKQaTfaKOaKOaKOaGXaGXaGXaHbaHaaHaaIHaGXaGXaMlaHaaGXaTgaHaaGXaIHaGXaMlaQIaHaaGXaIHaGXaGYaQIaMlaGYaThaMqaTiaQUaTjaTkaTlaQUaTmaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaSdaTnaSdaToaSfaSfaTpaSdaTnaSdaTqaTraTsaTtaGnaHSaPcaPcaGnaGnaGnaTuaTuaTuaIkaTuaTuaTuaTuaTuaHSaGnaGnaGnaGnaGnaGnaGnaRmaKdaStaaaaabaaaaabaaaaabaaaaabaaaaSuaSzaSAaTwaTxaTyaTzaTAaSAaPiaRwaTBaTBaTCaTDaTEaTFaTGaTFaTHaTIaTJaTBaTBaRwaSNaFFaTKaEjaSPaPyaPzaLNaLOaLPaMUaTLaTMaTNaTOaTPaTPaTQaTRaTPaTRaTSaTTaTUaTVaTWaTXaTYaKOaTfaKQaKQaKQaKQaKQaTfaGXaLcaGYaTZaUaaHaaGXaHaaLcaGYaGXaLcaMlaGXaUbaGYaGXaUcaGYaHaaUdaUeaGXaUfaGYaHaaIHaIHaMlaIHaUgaMqaUhaQUaUiaUjaUiaQUaUkaMqaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaUlaLdaUmaOQaSdaUnaUoaUpaUqaSdaOQaUraPYaLdaUsaUtaGnaHSaHSaHSaHSaHSaHSaTuaUuaUvaUwaUxaUyaUzaUuaTuaTvaUBaUAaUAaUAaUAaUAaUAaUCaNxaStaabaUEaUEaUEaUEaUEaUEaUEaabaSuaSzaSAaUFaUGaUHaUIaUFaSAaPiaRwaUJaUJaUJaUKaULaSCaUMaSCaULaUNaUJaUJaUJaRwaSNaFFaUOaEjaSPaPyaOnaLNaLOaLPaOoaUPaUQaUQaUQaUQaUQaUQaUQaURaUQaUSaUSaUSaUSaUSaUTaGXaKOaTfaKQaKQaKQaKQaKQaTfaGXaGXaGYaUUaUaaHaaUVaGXaGYaGYaGXaGYaMlaHaaGYaGYaGXaGYaGYaHaaMlaGZaGXaGYaGYaHaaUWaGYaMlaGYaUXaUYaUYaMqaMqaMqaMqaMqaMqaMqaMraMraMraMraMraabaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPYaTnaSdaSdaSdaSdaSdaSdaTnaPYaUZaLdaVaaVbaVcaVcaVcaVcaVcaVcaVdaTuaUuaVeaUwaVfaVeaVeaUuaTuaVgaUDaViaViaViaViaViaViaViaViaVjaaaaUEaVkaVlaVmaVnaVoaUEaaaaSuaSzaSAaVpaVqaVraVsaUFaSAaPiaRwaVtaVtaTCaVuaVvaTFaTGaTFaVvaVwaVxaTBaTBaRwaSNaFFaSOaEjaVyaKAaVzaLNaLOaLPaMUaUPaUQaVAaVBaVCaVCaUQaVDaVEaVFaUSaVGaVHaVIaUSaVJaGXaaaaVKaVLaVLaVLaVLaVLaVMaaaaGXaGYaVNaVOaHaaHaaGXaGXaHaaHaaVPaVQaHaaGXaHPaGXaGXaHaaHaaVRaVSaGXaGXaGXaQLaUWaGYaMlaGYaUXaHOaHbaOFaYPbcDaVhbcDaYPaYPaYPaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaVWaVXaVWaVWaVYaVZaVWaVWaVXaWaaWbaLdaToaWcaVcaWdaWeaWfaWgaWhaWiaTuaUuaVeaUwaWjaVeaVeaUuaTuaWkaWlaWmaWnaWoaWpaWqaWraWsaWtaVjaabaUEaWuaWvaWwaWxaWyaUEaabaSuaSzaSAaWzaWAaWBaWCaWDaSAaPiaRwaSBaSCaWEaWFaULaSCaWGaSCaULaWHaWIaSCaSMaRwaSNaFFaWJaEjaSPaMSaMTaLNaLOaLPaWKaWLaUQaWMaVEaVEaVEaWNaWOaWPaWQaUSaWRaWSaWTaWUaWVaHPaaaaaaaaaaaaaaaaaaaaaaaaaaaaGXaWWaWXaWYaWZaXaaGXaNgaGYaQIaMlaGYaGXaaaaGXaGYaGYaGYaGYaMlaXbaXcaXdaXdaXdaXdaXeaXfaXgaXhaXiaXjaXiaXkaVTaVTaVUaXmaXlaXnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPYaPYaSdaSeaSfaSgaShaSiaSjaSkaSlaSjaSmaSnaSjaSjaSoaGnaHSaGnaSpaHSaHSaSqaSraGnaNHaKiaHSaHSaHSaHSaHSaHSaPcaSsaHSaGnaNxaNxaGnaRmaMAaSuaSvaSwaSwaSwaSxaSwaSwaSwaSyaSuaSzaSAaSAaSAaSAaSAaSAaSAaPiaRwaSBaSCaSDaSEaSFaSGaSHaSIaSJaSKaSLaSCaSMaRwaSNaFFaSOaEjaSPaPyaSRaSQaVzaSSaSTaSUaSVaSWaSWaSXaSYaSZaSXaSYaSYaTaaTbaTcaMVaMVaTdaMVaTeaTfaKQaKQaKQaKQaKQaTfaKOaKOaKOaGXaGXaGXaHbaHaaHaaIHaGXaGXaMlaHaaGXaTgaHaaGXaIHaGXaMlaQIaHaaGXaIHaGXaGYaQIaMlaGYaThaMqaTiaQUaTjaTkaTlaQUaTmaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaSdaTnaSdaToaSfaSfaTpaSdaTnaSdaTqaTraTsaTtaGnaHSaPcaPcaGnaGnaGnaTuaTuaTuaIkaTuaTuaTuaTuaTuaHSaGnaGnaGnaGnaGnaGnaGnaRmaKdaStaaaaabaaaaabaaaaabaaaaabaaaaSuaSzaSAaTwaTxaTyaTzaTAaSAaPiaRwaTBaTBaTCaTDaTEaTFaTGaTFaTHaTIaTJaTBaTBaRwaSNaFFaTKaEjaSPaPyaOnaPzaLNaLPaMUaTLaTMaTNaTOaTPaTPaTQaTRaTPaTRaTSaTTaTUaTVaTWaTXaTYaKOaTfaKQaKQaKQaKQaKQaTfaGXaLcaGYaTZaUaaHaaGXaHaaLcaGYaGXaLcaMlaGXaUbaGYaGXaUcaGYaHaaUdaUeaGXaUfaGYaHaaIHaIHaMlaIHaUgaMqaUhaQUaUiaUjaUiaQUaUkaMqaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaUlaLdaUmaOQaSdaUnaUoaUpaUqaSdaOQaUraPYaLdaUsaUtaGnaHSaHSaHSaHSaHSaHSaTuaUuaUvaUwaUxaUyaUzaUuaTuaTvaUBaUAaUAaUAaUAaUAaUAaUCaNxaStaabaUEaUEaUEaUEaUEaUEaUEaabaSuaSzaSAaUFaUGaUHaUIaUFaSAaPiaRwaUJaUJaUJaUKaULaSCaUMaSCaULaUNaUJaUJaUJaRwaSNaFFaUOaEjaSPaPyaMTaPzaLNaLPaOoaUPaUQaUQaUQaUQaUQaUQaUQaURaUQaUSaUSaUSaUSaUSaUTaGXaKOaTfaKQaKQaKQaKQaKQaTfaGXaGXaGYaUUaUaaHaaUVaGXaGYaGYaGXaGYaMlaHaaGYaGYaGXaGYaGYaHaaMlaGZaGXaGYaGYaHaaUWaGYaMlaGYaUXaUYaUYaMqaMqaMqaMqaMqaMqaMqaMraMraMraMraMraabaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPYaTnaSdaSdaSdaSdaSdaSdaTnaPYaUZaLdaVaaVbaVcaVcaVcaVcaVcaVcaVdaTuaUuaVeaUwaVfaVeaVeaUuaTuaVgaUDaViaViaViaViaViaViaViaViaVjaaaaUEaVkaVlaVmaVnaVoaUEaaaaSuaSzaSAaVpaVqaVraVsaUFaSAaPiaRwaVtaVtaTCaVuaVvaTFaTGaTFaVvaVwaVxaTBaTBaRwaSNaFFaSOaEjaVyaKAdqtaPzaLNaLPaMUaUPaUQaVAaVBaVCaVCaUQaVDaVEaVFaUSaVGaVHaVIaUSaVJaGXaaaaVKaVLaVLaVLaVLaVLaVMaaaaGXaGYaVNaVOaHaaHaaGXaGXaHaaHaaVPaVQaHaaGXaHPaGXaGXaHaaHaaVRaVSaGXaGXaGXaQLaUWaGYaMlaGYaUXaHOaHbaOFaYPbcDaVhbcDaYPaYPaYPaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaVWaVXaVWaVWaVYaVZaVWaVWaVXaWaaWbaLdaToaWcaVcaWdaWeaWfaWgaWhaWiaTuaUuaVeaUwaWjaVeaVeaUuaTuaWkaWlaWmaWnaWoaWpaWqaWraWsaWtaVjaabaUEaWuaWvaWwaWxaWyaUEaabaSuaSzaSAaWzaWAaWBaWCaWDaSAaPiaRwaSBaSCaWEaWFaULaSCaWGaSCaULaWHaWIaSCaSMaRwaSNaFFaWJaEjaSPaMSaLOaPzaLNaLPaWKaWLaUQaWMaVEaVEaVEaWNaWOaWPaWQaUSaWRaWSaWTaWUaWVaHPaaaaaaaaaaaaaaaaaaaaaaaaaaaaGXaWWaWXaWYaWZaXaaGXaNgaGYaQIaMlaGYaGXaaaaGXaGYaGYaGYaGYaMlaXbaXcaXdaXdaXdaXdaXeaXfaXgaXhaXiaXjaXiaXkaVTaVTaVUaXmaXlaXnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaWaaVWaXqaXraXsaXtaXuaXvaXwaXxaXyaXzaXAaXBaSdaToaXCaVcaXDaXEaXFaXGaXFaXHaTuaXIaVeaXJaXKaXLaXKaXMaXNaXOaXPaXQaXQaXQaXQaXQaXQaXRaXSaVjaaaaUEaXTaWvaXUaWxaXVaUEaaaaSuaSzaSAaXWaXXaXYaXZaYaaSAaPiaRwaYbaYbaTCaYcaVvaTFaYdaTFaVvaYeaTJaYfaYfaRwaYgaIraYhaEjaSPaMSaYiaYiaYiaYiaYjaYkaYlaYmaYnaYoaYoaYoaYpaYoaYqaYraYsaYtaYuaYraYvaYwaHPaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaYxaGXaGXaGXaGXaGYaMlaWWaHNaabaHNaGYaYyaYzaYAaYBaYCaYDaYEaYEaYEaYEaYFaYGaYHaYIaYJaYKaYJaYLaYJaYJaYMaXoaYOaYPaYQaYRaYSaYSaYSaYSaYSaYSaYSaYSaYSafXajcaaaaaaaaaaaaaaaaaaaaaaYTaYUaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXAaYWaYXaYYaXzaYZaXsaYZaXsaYZaXsaYZaXzaZaaZbaSdaToaZcaVcaZdaZeaZfaZgaZhaZiaTuaZjaVeaZkaZlaZmaZnaZoaTuaZpaZqaXQaXQaXQaXQaXQaXQaXRaZraVjaabaUEaZsaZtaZuaZvaZwaUEaabaSuaSzaSAaZxaZyaZzaZAaZBaSAaPiaRwaUJaUJaUJaZCaULaSCaUMaSCaULaZDaUJaUJaUJaRwaZEaZFaZGaEjaVyaZHaZIaZIaZIaZJaZKaZLaZMaZNaZOaZMaZPaZQaZRaZMaZSaZTaZUaZVaZWaUSaZXaZYaZZbaabaaaZYbabbacbacbacbacbacbadbaebacbafbagbahbaibajbakbalbambanbaobanbapbaqaGYaGXbarbasbatbaubavbawbaxbaybazbaAbazbaBbaCbaDbaEbaFbaGbaHbaIbaJbaKbaLaYPbaMbaNbaObaPbaQbaRbaSbaTbaUbaVaaaaaaaaaaaaaaaaaaaaaaYTbaWbaXbaYaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaZaXsaXsaVXaXzaYZaXsaYZbbaaYZaXsaYZaXzaZaaZbaSdaTobbbaVcaVcbbcbbdbbebbdaVcaTuaTuaTuaTubbfbbgbbhbbiaTubbjbbkbblaXQaXQbbmaXQbbnbbobbpaVjaaaaUEaUEbbqbbrbbqaUEaUEaaaaSuaSzaSAbbsbbtbbuaZAbbvaSAaPiaRwaSBaSCbbwaWFaULaSCaUMaSCaULaWHbbxaRwaRwaRwbbybbzbbAbbBbbCbbDatGatGbbEbbFbbGbbHaUQbbIaVEaUQbbJaUQbbKaUQbbLbbMbbNbbObbPbbQbbRbbSbbTbbUbbVbbWbbXbbVbbVbbYbbVbbSbbZbbSaXjbcabbSbcbbccbcdbcebcfbcgbchbcibcjbckbclaXibcmbcnbcobcpbcqbcrbcsbctbaybcubcvbazbcwbcxbcybczbaFbcAbcBbcCbcDbcEbcFaYPbcGbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYTbaWbcJbcKbcLbaYaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm index 9c61f5d3a98..30cd7c1f036 100644 --- a/_maps/map_files/cyberiad/z5.dmm +++ b/_maps/map_files/cyberiad/z5.dmm @@ -1092,12 +1092,12 @@ "uZ" = (/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 6},/area/mine/dangerous/explored) "va" = (/obj/structure/disposalpipe/segment,/turf/simulated/mineral/random,/area/mine/dangerous/unexplored) "vb" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored) -"vc" = (/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/mine/dangerous/explored) +"vc" = (/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating/airless,/area/mine/dangerous/explored) "vd" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/west_outpost) "ve" = (/obj/machinery/camera{c_tag = "Mining Outpost West Outpost Mech Recharge Station"; dir = 1; network = list("Mining Outpost")},/turf/simulated/floor/mech_bay_recharge_floor/airless,/area/mine/west_outpost) "vf" = (/obj/machinery/computer/mech_bay_power_console,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/west_outpost) "vg" = (/obj/structure/disposalpipe/segment,/obj/structure/sign/deathsposal,/turf/simulated/wall,/area/mine/living_quarters) -"vh" = (/obj/structure/grille,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/mine/dangerous/explored) +"vh" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/mine/dangerous/explored) "vi" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "outpost_west_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = null},/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning (EAST)"; icon_state = "asteroidwarning"; dir = 4},/area/mine/dangerous/explored) "vj" = (/obj/machinery/light,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored) "vk" = (/turf/simulated/wall,/area/mine/west_outpost) diff --git a/_maps/map_files/cyberiad/z6.dmm b/_maps/map_files/cyberiad/z6.dmm index b94124d9e4b..f7511eb16bb 100644 --- a/_maps/map_files/cyberiad/z6.dmm +++ b/_maps/map_files/cyberiad/z6.dmm @@ -243,7 +243,7 @@ "eI" = (/obj/structure/table,/obj/item/weapon/stock_parts/cell{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/access) "eJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/access) "eK" = (/obj/structure/girder,/turf/simulated/floor/plating/airless,/area/space) -"eL" = (/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/derelict/singularity_engine) +"eL" = (/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine) "eM" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine) "eN" = (/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/access) "eO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/access) @@ -254,7 +254,7 @@ "eT" = (/obj/item/stack/cable_coil/cut,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/derelict/singularity_engine) "eU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/derelict/singularity_engine) "eV" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/derelict/singularity_engine) -"eW" = (/obj/item/stack/rods,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/derelict/singularity_engine) +"eW" = (/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine) "eX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/access) "eY" = (/turf/simulated/floor/plating/airless,/area/derelict/bridge/access) "eZ" = (/obj/structure/table,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/derelict/singularity_engine) diff --git a/_maps/map_files/debug/smoothing.dmm b/_maps/map_files/debug/smoothing.dmm index 1ee9773589c..b9c65716db5 100644 --- a/_maps/map_files/debug/smoothing.dmm +++ b/_maps/map_files/debug/smoothing.dmm @@ -1,6 +1,6 @@ "a" = (/turf/simulated/floor/plating,/area/centcom) "b" = (/turf/simulated/floor/plating,/area/start) -"c" = (/turf/simulated/floor,/area/centcom) +"c" = (/turf/simulated/floor/plasteel,/area/centcom) "d" = (/turf/simulated/wall/mineral/alien,/area/centcom) "e" = (/obj/structure/falsewall/alien,/turf/simulated/floor/plating,/area/centcom) "f" = (/turf/simulated/wall/mineral/diamond,/area/centcom) diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 6fe2d302e7b..6771d8062fc 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -25,6 +25,7 @@ #define PLANT_TOXIN_HUD "20"// Toxin level #define PLANT_PEST_HUD "21"// Pest level #define PLANT_WEED_HUD "22"// Weed level +#define DIAG_TRACK_HUD "23"// Mech tracking beacon //data HUD (medhud, sechud) defines //Don't forget to update human/New() if you change these! diff --git a/code/datums/mind.dm b/code/datums/mind.dm index fcf1ded97cc..be744b53c34 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -56,6 +56,7 @@ var/miming = 0 // Mime's vow of silence var/datum/faction/faction //associated faction var/datum/changeling/changeling //changeling holder + var/linglink var/datum/vampire/vampire //vampire holder var/datum/nations/nation //nation holder var/datum/abductor/abductor //abductor holder @@ -149,7 +150,7 @@ ) var/text = "" var/mob/living/carbon/human/H = current - if(istype(current, /mob/living/carbon/human)) + if(ishuman(current)) /** Impanted**/ if(isloyal(H)) text = "Mindshield Implant:Remove|Implanted
" @@ -369,7 +370,7 @@ /** SILICON ***/ - if(istype(current, /mob/living/silicon)) + if(issilicon(current)) text = "silicon" var/mob/living/silicon/robot/robot = current if(istype(robot) && robot.emagged) @@ -409,7 +410,7 @@ if(((src in ticker.mode.head_revolutionaries) || \ (src in ticker.mode.traitors) || \ (src in ticker.mode.syndicates)) && \ - istype(current,/mob/living/carbon/human) ) + ishuman(current) ) text = "Uplink: give" var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink() @@ -445,18 +446,21 @@ usr << browse(out, "window=edit_memory[src];size=400x500") /datum/mind/Topic(href, href_list) - if(!check_rights(R_ADMIN)) return + if(!check_rights(R_ADMIN)) + return if(href_list["role_edit"]) var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in joblist - if(!new_role) return + if(!new_role) + return assigned_role = new_role log_admin("[key_name(usr)] has changed [key_name(current)]'s assigned role to [assigned_role]") message_admins("[key_name_admin(usr)] has changed [key_name_admin(current)]'s assigned role to [assigned_role]") else if(href_list["memory_edit"]) var/new_memo = copytext(input("Write new memory", "Memory", memory) as null|message,1,MAX_MESSAGE_LEN) - if(isnull(new_memo)) return + if(isnull(new_memo)) + return memory = new_memo log_admin("[key_name(usr)] has edited [key_name(current)]'s memory") message_admins("[key_name_admin(usr)] has edited [key_name_admin(current)]'s memory") @@ -468,7 +472,8 @@ if(href_list["obj_edit"]) objective = locate(href_list["obj_edit"]) - if(!objective) return + if(!objective) + return objective_pos = objectives.Find(objective) //Text strings are easy to manipulate. Revised for simplicity. @@ -478,7 +483,8 @@ def_value = "custom" var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "blood", "debrain", "protect", "prevent", "brig", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "destroy", "maroon", "identity theft", "custom") - if(!new_obj_type) return + if(!new_obj_type) + return var/datum/objective/new_objective = null @@ -500,7 +506,8 @@ def_target = objective:target.current var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets - if(!new_target) return + if(!new_target) + return var/objective_path = text2path("/datum/objective/[new_obj_type]") if(new_target == "Free objective") @@ -588,7 +595,7 @@ if("identity theft") var/list/possible_targets = list("Free objective") for(var/datum/mind/possible_target in ticker.minds) - if((possible_target != src) && istype(possible_target.current, /mob/living/carbon/human)) + if((possible_target != src) && ishuman(possible_target.current)) possible_targets += possible_target var/new_target = input("Select target:", "Objective target") as null|anything in possible_targets @@ -604,12 +611,14 @@ new_objective.explanation_text = "Escape on the shuttle or an escape pod with the identity of [targ.current.real_name], the [targ.assigned_role] while wearing their identification card." if("custom") var/expl = sanitize(copytext(input("Custom objective:", "Objective", objective ? objective.explanation_text : "") as text|null,1,MAX_MESSAGE_LEN)) - if(!expl) return + if(!expl) + return new_objective = new /datum/objective new_objective.owner = src new_objective.explanation_text = expl - if(!new_objective) return + if(!new_objective) + return if(objective) objectives -= objective @@ -622,7 +631,8 @@ else if(href_list["obj_delete"]) var/datum/objective/objective = locate(href_list["obj_delete"]) - if(!istype(objective)) return + if(!istype(objective)) + return objectives -= objective log_admin("[key_name(usr)] has removed one of [key_name(current)]'s objectives: [objective]") @@ -630,7 +640,8 @@ else if(href_list["obj_completed"]) var/datum/objective/objective = locate(href_list["obj_completed"]) - if(!istype(objective)) return + if(!istype(objective)) + return objective.completed = !objective.completed log_admin("[key_name(usr)] has toggled the completion of one of [key_name(current)]'s objectives") @@ -893,7 +904,7 @@ message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") if("initialdna") - if( !changeling || !changeling.absorbed_dna.len ) + if(!changeling || !changeling.absorbed_dna.len) to_chat(usr, "\red Resetting DNA failed!") else current.dna = changeling.absorbed_dna[1] @@ -924,7 +935,7 @@ ticker.mode.update_vampire_icons_added(src) var/datum/mindslaves/slaved = new() slaved.masters += src - src.som = slaved //we MIGT want to mindslave someone + som = slaved //we MIGT want to mindslave someone special_role = SPECIAL_ROLE_VAMPIRE to_chat(current, "Your powers are awoken. Your lust for blood grows... You are a Vampire!") log_admin("[key_name(usr)] has vampired [key_name(current)]") @@ -1033,7 +1044,7 @@ ticker.mode.traitors += src var/datum/mindslaves/slaved = new() slaved.masters += src - src.som = slaved //we MIGT want to mindslave someone + som = slaved //we MIGT want to mindslave someone special_role = SPECIAL_ROLE_TRAITOR to_chat(current, "You are a traitor!") log_admin("[key_name(usr)] has traitored [key_name(current)]") @@ -1130,7 +1141,7 @@ message_admins("[key_name_admin(usr)] has un-emagged [key_name_admin(current)]") if("unemagcyborgs") - if(istype(current, /mob/living/silicon/ai)) + if(isAI(current)) var/mob/living/silicon/ai/ai = current for(var/mob/living/silicon/robot/R in ai.connected_robots) R.emagged = 0 @@ -1324,7 +1335,7 @@ var/explanation = "Summon [ticker.mode.cultdat.entity_name] via the use of the appropriate rune. It will only work if nine cultists stand on and around it." to_chat(current, "Objective #1: [explanation]") current.memory += "Objective #1: [explanation]
" - + var/mob/living/carbon/human/H = current if(istype(H)) @@ -1453,13 +1464,13 @@ qdel(S) spell_list -= S -/datum/mind/proc/transfer_actions(var/mob/living/new_character) +/datum/mind/proc/transfer_actions(mob/living/new_character) if(current && current.actions) for(var/datum/action/A in current.actions) A.Grant(new_character) transfer_mindbound_actions(new_character) -/datum/mind/proc/transfer_mindbound_actions(var/mob/living/new_character) +/datum/mind/proc/transfer_mindbound_actions(mob/living/new_character) for(var/X in spell_list) var/obj/effect/proc_holder/spell/S = X S.action.Grant(new_character) @@ -1553,13 +1564,15 @@ ticker.minds += mind else error("mind_initialize(): No ticker ready yet! Please inform Carn") - if(!mind.name) mind.name = real_name + if(!mind.name) + mind.name = real_name mind.current = src //HUMAN /mob/living/carbon/human/mind_initialize() ..() - if(!mind.assigned_role) mind.assigned_role = "Civilian" //defualt + if(!mind.assigned_role) + mind.assigned_role = "Civilian" //defualt /mob/proc/sync_mind() mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist) diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 172aaa821f2..59557caea6a 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -44,7 +44,7 @@ hud_icons = list(ID_HUD, IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD, WANTED_HUD) /datum/atom_hud/data/diagnostic - hud_icons = list (DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD) + hud_icons = list (DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_TRACK_HUD) /datum/atom_hud/data/hydroponic hud_icons = list (PLANT_NUTRIENT_HUD, PLANT_WATER_HUD, PLANT_STATUS_HUD, PLANT_HEALTH_HUD, PLANT_TOXIN_HUD, PLANT_PEST_HUD, PLANT_WEED_HUD) @@ -287,6 +287,17 @@ if(internal_damage) holder.icon_state = "hudwarn" +/obj/mecha/proc/diag_hud_set_mechtracking() //Shows tracking beacons on the mech + var/image/holder = hud_list[DIAG_TRACK_HUD] + var/new_icon_state //This var exists so that the holder's icon state is set only once in the event of multiple mech beacons. + for(var/obj/item/mecha_parts/mecha_tracking/T in trackers) + if(T.ai_beacon) //Beacon with AI uplink + new_icon_state = "hudtrackingai" + break //Immediately terminate upon finding an AI beacon to ensure it is always shown over the normal one, as mechs can have several trackers. + else + new_icon_state = "hudtracking" + holder.icon_state = new_icon_state + /*~~~~~~~~~ Bots! ~~~~~~~~~~*/ diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index c25802d38fc..1e67760322c 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -3,7 +3,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" /datum/game_mode var/list/datum/mind/changelings = list() - /datum/game_mode/changeling name = "changeling" config_tag = "changeling" @@ -38,7 +37,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" to_chat(world, "There are alien changelings on the station. Do not let the changelings succeed!") /datum/game_mode/changeling/pre_setup() - if(config.protect_roles_from_antagonist) restricted_jobs += protected_jobs @@ -69,8 +67,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" ..() - -/datum/game_mode/proc/forge_changeling_objectives(var/datum/mind/changeling) +/datum/game_mode/proc/forge_changeling_objectives(datum/mind/changeling) //OBJECTIVES - Always absorb 5 genomes, plus random traitor objectives. //If they have two objectives as well as absorb, they must survive rather than escape //No escape alone because changelings aren't suited for it and it'd probably just lead to rampant robusting @@ -129,7 +126,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" changeling.objectives += identity_theft return -/datum/game_mode/proc/greet_changeling(var/datum/mind/changeling, var/you_are=1) +/datum/game_mode/proc/greet_changeling(datum/mind/changeling, you_are=1) if(you_are) to_chat(changeling.current, "You are a changeling!") to_chat(changeling.current, "Use say \":g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them.") @@ -145,8 +142,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" obj_count++ return - - /datum/game_mode/proc/remove_changeling(datum/mind/changeling_mind) if(changeling_mind in changelings) changelings -= changeling_mind @@ -171,7 +166,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" set_antag_hud(changeling.current, null) /datum/game_mode/proc/grant_changeling_powers(mob/living/carbon/changeling_mob) - if(!istype(changeling_mob)) return + if(!istype(changeling_mob)) + return changeling_mob.make_changeling() /datum/game_mode/proc/auto_declare_completion_changeling() @@ -218,7 +214,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" to_chat(world, text) - return 1 /datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind) @@ -235,6 +230,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" var/changelingID = "Changeling" var/geneticdamage = 0 var/isabsorbing = 0 + var/islinking = 0 var/geneticpoints = 10 var/purchasedpowers = list() var/mimicing = "" @@ -243,11 +239,13 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" var/datum/dna/chosen_dna var/obj/effect/proc_holder/changeling/sting/chosen_sting -/datum/changeling/New(var/gender=FEMALE) +/datum/changeling/New(gender=FEMALE) ..() var/honorific - if(gender == FEMALE) honorific = "Ms." - else honorific = "Mr." + if(gender == FEMALE) + honorific = "Ms." + else + honorific = "Mr." if(possible_changeling_IDs.len) changelingID = pick(possible_changeling_IDs) possible_changeling_IDs -= changelingID @@ -259,25 +257,24 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" chem_charges = min(max(0, chem_charges + chem_recharge_rate - chem_recharge_slowdown), chem_storage) geneticdamage = max(0, geneticdamage-1) - -/datum/changeling/proc/GetDNA(var/dna_owner) +/datum/changeling/proc/GetDNA(dna_owner) for(var/datum/dna/DNA in (absorbed_dna + protected_dna)) if(dna_owner == DNA.real_name) return DNA -/datum/changeling/proc/find_dna(var/datum/dna/tDNA) +/datum/changeling/proc/find_dna(datum/dna/tDNA) for(var/datum/dna/D in (absorbed_dna + protected_dna)) if(tDNA.unique_enzymes == D.unique_enzymes && tDNA.uni_identity == D.uni_identity && tDNA.species == D.species) return D return null -/datum/changeling/proc/has_dna(var/datum/dna/tDNA) +/datum/changeling/proc/has_dna(datum/dna/tDNA) if(find_dna(tDNA)) return 1 return 0 // A changeling's DNA is "stale" if their current form's DNA is the oldest DNA in a full list -/datum/changeling/proc/using_stale_dna(var/mob/living/carbon/user) +/datum/changeling/proc/using_stale_dna(mob/living/carbon/user) var/current_dna = find_dna(user.dna) if(absorbed_dna.len < dna_max) return 0 // Still more room for DNA @@ -292,7 +289,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" if(absorbed_dna.len > dna_max) absorbed_dna.Cut(1, (absorbed_dna.len - dna_max) + 1) -/datum/changeling/proc/can_absorb_dna(var/mob/living/carbon/user, var/mob/living/carbon/target) +/datum/changeling/proc/can_absorb_dna(mob/living/carbon/user, mob/living/carbon/target) if(using_stale_dna(user))//If our current DNA is the stalest, we gotta ditch it. to_chat(user, "We have reached our capacity to store genetic information! We must transform before absorbing more.") return diff --git a/code/game/gamemodes/changeling/powers/linglink.dm b/code/game/gamemodes/changeling/powers/linglink.dm new file mode 100644 index 00000000000..7c198f5e6af --- /dev/null +++ b/code/game/gamemodes/changeling/powers/linglink.dm @@ -0,0 +1,73 @@ +/obj/effect/proc_holder/changeling/linglink + name = "Hivemind Link" + desc = "Link your victim's mind into the hivemind for personal interrogation" + chemical_cost = 0 + dna_cost = 0 + req_human = 1 + max_genetic_damage = 100 + +/obj/effect/proc_holder/changeling/linglink/can_sting(mob/living/carbon/user) + if(!..()) + return + var/datum/changeling/changeling = user.mind.changeling + var/obj/item/weapon/grab/G = user.get_active_hand() + + if(changeling.islinking) + to_chat(user, "We have already formed a link with the victim!") + return + if(!istype(G)) + to_chat(user, "We must be tightly grabbing a creature in our active hand to link with them!") + return + if(G.state <= GRAB_AGGRESSIVE) + to_chat(user, "We must have a tighter grip to link with this creature!") + return + if(iscarbon(G.affecting)) + var/mob/living/carbon/target = G.affecting + if(!target.mind) + to_chat(user, "The victim has no mind to link to!") + return + if(target.stat == DEAD) + to_chat(user, "The victim is dead, you cannot link to a dead mind!") + return + if(target.mind.changeling) + to_chat(user, "The victim is already a part of the hivemind!") + return + return changeling.can_absorb_dna(user,target) + +/obj/effect/proc_holder/changeling/linglink/sting_action(mob/user) + var/datum/changeling/changeling = user.mind.changeling + var/obj/item/weapon/grab/G = user.get_active_hand() + var/mob/living/carbon/target = G.affecting + changeling.islinking = 1 + for(var/stage = 1, stage<=3, stage++) + switch(stage) + if(1) + to_chat(user, "This creature is compatible. We must hold still...") + if(2) + to_chat(user, "We stealthily stab [target] with a minor proboscis...") + to_chat(target, "You experience a stabbing sensation and your ears begin to ring...") + if(3) + to_chat(user, "You mold the [target]'s mind like clay, they can now speak in the hivemind!") + to_chat(target, "A migraine throbs behind your eyes, you hear yourself screaming - but your mouth has not opened!") + for(var/mob/M in mob_list) + if(all_languages["Changeling"] in M.languages) + to_chat(M, "We can sense a foreign presence in the hivemind...") + target.mind.linglink = 1 + target.add_language("Changeling") + target.say(":g AAAAARRRRGGGGGHHHHH!!") + to_chat(target, "You can now communicate in the changeling hivemind, say \":g message\" to communicate!") + target.reagents.add_reagent("salbutamol", 40) // So they don't choke to death while you interrogate them + sleep(1800) + feedback_add_details("changeling_powers","A[stage]") + if(!do_mob(user, target, 20)) + to_chat(user, "Our link with [target] has ended!") + target.remove_language("Changeling") + changeling.islinking = 0 + target.mind.linglink = 0 + return + + target.remove_language("Changeling") + changeling.islinking = 0 + target.mind.linglink = 0 + to_chat(user, "You cannot sustain the connection any longer, your victim fades from the hivemind") + to_chat(target, "The link cannot be sustained any longer, your connection to the hivemind has faded!") diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 0c09bc5f2c5..71aad1085ff 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -39,6 +39,10 @@ name = "Circuit board (Camera Monitor)" build_path = /obj/machinery/computer/security origin_tech = "programming=2" +/obj/item/weapon/circuitboard/xenobiology + name = "Circuit board (Xenobiology Console)" + build_path = /obj/machinery/computer/camera_advanced/xenobio + origin_tech = "programming=3;biotech=3" /obj/item/weapon/circuitboard/aicore name = "Circuit board (AI Core)" origin_tech = "programming=4;biotech=2" diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 1d9e02f52a1..807d3caf261 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -290,6 +290,11 @@ continue O.loc = src + for(var/obj/machinery/computer/cloning/cloner in machines) + for(var/datum/dna2/record/R in cloner.records) + if(occupant.mind == locate(R.mind)) + cloner.records.Remove(R) + //Delete all items not on the preservation list. var/list/items = src.contents items -= occupant // Don't delete the occupant diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 936b18f35c5..476162a27a1 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -74,7 +74,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() ..() announcement.title = "[department] announcement" - announcement.newscast = 1 + announcement.newscast = 0 name = "[department] Requests Console" allConsoles += src diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 12404d0574e..614f4d8f53f 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -203,6 +203,10 @@ var/emotion = "Neutral" +/obj/machinery/ai_status_display/attack_ai(mob/living/silicon/ai/user) + if(isAI(user)) + user.ai_statuschange() + /obj/machinery/ai_status_display/process() if(stat & NOPOWER) overlays.Cut() diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 6e155779aa5..4ec4746a198 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -50,6 +50,7 @@ var/obj/machinery/atmospherics/unary/portables_connector/connected_port = null var/obj/item/device/radio/radio = null + var/list/trackers = list() var/max_temperature = 25000 var/internal_damage_threshold = 50 //health percentage below which internal damage is possible @@ -74,7 +75,7 @@ var/melee_cooldown = 10 var/melee_can_hit = 1 - hud_possible = list (DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD) + hud_possible = list (DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD) /obj/mecha/New() ..() @@ -102,6 +103,7 @@ diag_hud_set_mechhealth() diag_hud_set_mechcell() diag_hud_set_mechstat() + diag_hud_set_mechtracking() //////////////////////// ////// Helpers ///////// @@ -165,7 +167,7 @@ /obj/mecha/proc/drop_item()//Derpfix, but may be useful in future for engineering exosuits. return -/obj/mecha/hear_talk(mob/M as mob, text) +/obj/mecha/hear_talk(mob/M, text) if(M == occupant && radio.broadcasting) radio.talk_into(M, text) @@ -465,7 +467,7 @@ qdel(src) return -/obj/mecha/attack_hand(mob/living/user as mob) +/obj/mecha/attack_hand(mob/living/user) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) log_message("Attack by hand/paw. Attacker - [user].",1) @@ -481,7 +483,7 @@ return -/obj/mecha/attack_alien(mob/living/user as mob) +/obj/mecha/attack_alien(mob/living/user) log_message("Attack by alien. Attacker - [user].",1) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) @@ -500,7 +502,7 @@ return -/obj/mecha/attack_animal(mob/living/simple_animal/user as mob) +/obj/mecha/attack_animal(mob/living/simple_animal/user) log_message("Attack by simple animal. Attacker - [user].",1) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) @@ -513,7 +515,7 @@ take_damage(damage) check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) visible_message("[user] [user.attacktext] [src]!") - user.create_attack_log("attacked [src.name]") + user.create_attack_log("attacked [name]") else log_append_to_last("Armor saved.") playsound(loc, 'sound/weapons/slash.ogg', 50, 1, -1) @@ -798,7 +800,9 @@ to_chat(user, "\the [W] is stuck to your hand, you cannot put it in \the [src]") return W.forceMove(src) + trackers += W user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src].") + diag_hud_set_mechtracking() return else if(istype(W, /obj/item/weapon/paintkit)) @@ -866,20 +870,35 @@ //////////// AI piloting //////////// ///////////////////////////////////// -/obj/mecha/attack_ai(var/mob/living/silicon/ai/user as mob) +/obj/mecha/attack_ai(mob/living/silicon/ai/user) if(!isAI(user)) return //Allows the Malf to scan a mech's status and loadout, helping it to decide if it is a worthy chariot. if(user.can_dominate_mechs) examine(user) //Get diagnostic information! - var/obj/item/mecha_parts/mecha_tracking/B = locate(/obj/item/mecha_parts/mecha_tracking) in src - if(B) //Beacons give the AI more detailed mech information. + for(var/obj/item/mecha_parts/mecha_tracking/B in trackers) to_chat(user, "Warning: Tracking Beacon detected. Enter at your own risk. Beacon Data:") - to_chat(user, "[B.get_mecha_info()]") + to_chat(user, "[B.get_mecha_info_text()]") + break //Nothing like a big, red link to make the player feel powerful! to_chat(user, "ASSUME DIRECT CONTROL?
") + else + examine(user) + if(occupant) + user << "This exosuit has a pilot and cannot be controlled." + return + var/can_control_mech = FALSE + for(var/obj/item/mecha_parts/mecha_tracking/ai_control/A in trackers) + can_control_mech = TRUE + to_chat(user, "[bicon(src)] Status of [name]:\n\ + [A.get_mecha_info_text()]") + break + if(!can_control_mech) + to_chat(user, "You cannot control exosuits without AI control beacons installed.") + return + to_chat(user, "Take control of exosuit?
") -/obj/mecha/transfer_ai(var/interaction, mob/user, var/mob/living/silicon/ai/AI, var/obj/item/device/aicard/card) +/obj/mecha/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/device/aicard/card) if(!..()) return @@ -907,12 +926,13 @@ to_chat(AI, "You have been downloaded to a mobile storage device. Wireless connection offline.") to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) removed from [name] and stored within local memory.") - if(AI_MECH_HACK) //Called by Malf AI mob on the mech. - new /obj/structure/AIcore/deactivated(AI.loc) - if(occupant) //Oh, I am sorry, were you using that? - to_chat(AI, "Pilot detected! Forced ejection initiated!") - to_chat(occupant, "You have been forcibly ejected!") - go_out(1) //IT IS MINE, NOW. SUCK IT, RD! + if(AI_MECH_HACK) //Called by AIs on the mech + AI.linked_core = new /obj/structure/AIcore/deactivated(AI.loc) + if(AI.can_dominate_mechs) + if(occupant) //Oh, I am sorry, were you using that? + to_chat(AI, "Pilot detected! Forced ejection initiated!") + to_chat(occupant, "You have been forcibly ejected!") + go_out(1) //IT IS MINE, NOW. SUCK IT, RD! ai_enter_mech(AI, interaction) if(AI_TRANS_FROM_CARD) //Using an AI card to upload to a mech. @@ -932,7 +952,7 @@ ai_enter_mech(AI, interaction) //Hack and From Card interactions share some code, so leave that here for both to use. -/obj/mecha/proc/ai_enter_mech(var/mob/living/silicon/ai/AI, var/interaction) +/obj/mecha/proc/ai_enter_mech(mob/living/silicon/ai/AI, interaction) AI.aiRestorePowerRoutine = 0 AI.loc = src occupant = AI @@ -945,7 +965,7 @@ AI.remote_control = src AI.canmove = 1 //Much easier than adding AI checks! Be sure to set this back to 0 if you decide to allow an AI to leave a mech somehow. AI.can_shunt = 0 //ONE AI ENTERS. NO AI LEAVES. - to_chat(AI, "[interaction == AI_MECH_HACK ? "Takeover of [name] complete! You are now permanently loaded onto the onboard computer. Do not attempt to leave the station sector!" \ + to_chat(AI, "[AI.can_dominate_mechs ? "Takeover of [name] complete! You are now permanently loaded onto the onboard computer. Do not attempt to leave the station sector!" \ : "You have been uploaded to a mech's onboard computer."]") to_chat(AI, "Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions.") @@ -1172,7 +1192,7 @@ to_chat(user, "You stop inserting the MMI.") return 0 -/obj/mecha/proc/mmi_moved_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob) +/obj/mecha/proc/mmi_moved_inside(obj/item/device/mmi/mmi_as_oc,mob/user) if(mmi_as_oc && user in range(1)) if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client) to_chat(user, "Consciousness matrix not detected.") @@ -1239,7 +1259,7 @@ if(occupant && occupant == M) // The occupant exited the mech without calling go_out() go_out(1, newloc) -/obj/mecha/proc/go_out(var/forced, var/atom/newloc = loc) +/obj/mecha/proc/go_out(forced, atom/newloc = loc) if(!occupant) return var/atom/movable/mob_container @@ -1248,15 +1268,29 @@ if(ishuman(occupant)) mob_container = occupant //RemoveActions(occupant, human_occupant=1) - else if(istype(occupant, /mob/living/carbon/brain)) + else if(isbrain(occupant)) var/mob/living/carbon/brain/brain = occupant //RemoveActions(brain) mob_container = brain.container - else if(isAI(occupant) && forced) //This should only happen if there are multiple AIs in a round, and at least one is Malf. - //RemoveActions(occupant) - occupant.gib() //If one Malf decides to steal a mech from another AI (even other Malfs!), they are destroyed, as they have nowhere to go when replaced. - occupant = null - return + else if(isAI(occupant)) + var/mob/living/silicon/ai/AI = occupant + if(forced)//This should only happen if there are multiple AIs in a round, and at least one is Malf. + //RemoveActions(occupant) + occupant.gib() //If one Malf decides to steal a mech from another AI (even other Malfs!), they are destroyed, as they have nowhere to go when replaced. + occupant = null + return + else + if(!AI.linked_core || qdeleted(AI.linked_core)) + to_chat(AI, "Inactive core destroyed. Unable to return.") + AI.linked_core = null + return + to_chat(AI, "Returning to core...") + AI.controlled_mech = null + AI.remote_control = null + //RemoveActions(occupant, 1) + mob_container = AI + newloc = get_turf(AI.linked_core) + qdel(AI.linked_core) else return var/mob/living/L = occupant @@ -1439,6 +1473,7 @@ diag_hud_set_mechhealth() diag_hud_set_mechcell() diag_hud_set_mechstat() + diag_hud_set_mechtracking() /obj/mecha/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list()) diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index 11c940f7971..2bb73e2c636 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -10,10 +10,10 @@ var/screen = 0 var/stored_data -/obj/machinery/computer/mecha/attack_ai(var/mob/user as mob) +/obj/machinery/computer/mecha/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/computer/mecha/attack_hand(var/mob/user as mob) +/obj/machinery/computer/mecha/attack_hand(mob/user) ui_interact(user) /obj/machinery/computer/mecha/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) @@ -73,11 +73,12 @@ icon_state = "motion2" w_class = 2 origin_tech = "programming=2;magnets=2" + var/ai_beacon = FALSE //If this beacon allows for AI control. Exists to avoid using istype() on checking. /obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info() if(!in_mecha()) - return 0 - var/obj/mecha/M = src.loc + return FALSE + var/obj/mecha/M = loc var/list/answer[0] answer["reference"] = "\ref[src]" answer["name"] = sanitize(replacetext(M.name,"\"","'")) // Double apostrophes break JSON @@ -101,6 +102,25 @@ return answer +/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info_text() + if(!in_mecha()) + return FALSE + var/obj/mecha/M = loc + var/cell_charge = M.get_charge() + var/area/A = get_area(M) + var/answer = {"Name: [M.name] + Integrity: [M.health/initial(M.health)*100]% + Cell charge: [isnull(cell_charge)?"Not found":"[M.cell.percent()]%"] + Airtank: [M.return_pressure()]kPa + Pilot: [M.occupant||"None"] + Location: [sanitize(A.name)||"Unknown"] + Active equipment: [M.selected||"None"]
"} + if(istype(M, /obj/mecha/working/ripley)) + var/obj/mecha/working/ripley/RM = M + answer += "Used cargo space: [RM.cargo.len/RM.cargo_capacity*100]%
" + + return answer + /obj/item/mecha_parts/mecha_tracking/emp_act() qdel(src) return @@ -110,9 +130,9 @@ return /obj/item/mecha_parts/mecha_tracking/proc/in_mecha() - if(istype(src.loc, /obj/mecha)) - return src.loc - return 0 + if(istype(loc, /obj/mecha)) + return loc + return FALSE /obj/item/mecha_parts/mecha_tracking/proc/shock() var/obj/mecha/M = in_mecha() @@ -121,19 +141,26 @@ qdel(src) /obj/item/mecha_parts/mecha_tracking/proc/get_mecha_log() - if(!src.in_mecha()) + if(!in_mecha()) return 0 - var/obj/mecha/M = src.loc + var/obj/mecha/M = loc return M.get_log_html() +/obj/item/mecha_parts/mecha_tracking/ai_control + name = "exosuit AI control beacon" + desc = "A device used to transmit exosuit data. Also allows active AI units to take control of said exosuit." + origin_tech = "programming=3;magnets=2;engineering=2" + ai_beacon = TRUE + /obj/item/weapon/storage/box/mechabeacons name = "Exosuit Tracking Beacons" - New() - ..() - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) + +/obj/item/weapon/storage/box/mechabeacons/New() + ..() + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) diff --git a/code/game/mecha/medical/medical.dm b/code/game/mecha/medical/medical.dm index ce28687a9e6..8aee3ef1f4c 100644 --- a/code/game/mecha/medical/medical.dm +++ b/code/game/mecha/medical/medical.dm @@ -4,4 +4,4 @@ /obj/mecha/medical/New() ..() - new /obj/item/mecha_parts/mecha_tracking(src) + trackers += new /obj/item/mecha_parts/mecha_tracking(src) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index f26e34834fb..bb5e0237c9b 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -110,10 +110,10 @@ //Add ore box to cargo cargo.Add(new /obj/structure/ore_box(src)) - //Attach hydrolic clamp + //Attach hydraulic clamp var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/HC = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp HC.attach(src) - for(var/obj/item/mecha_parts/mecha_tracking/B in contents)//Deletes the beacon so it can't be found easily + for(var/obj/item/mecha_parts/mecha_tracking/B in trackers)//Deletes the beacon so it can't be found easily qdel(B) var/obj/item/mecha_parts/mecha_equipment/mining_scanner/scanner = new /obj/item/mecha_parts/mecha_equipment/mining_scanner diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm index ccbfe2ef21b..e4c001a508a 100644 --- a/code/game/mecha/working/working.dm +++ b/code/game/mecha/working/working.dm @@ -3,4 +3,4 @@ /obj/mecha/working/New() ..() - new /obj/item/mecha_parts/mecha_tracking(src) + trackers += new /obj/item/mecha_parts/mecha_tracking(src) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 12e26827c56..c3facb6ccbe 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -6,18 +6,20 @@ icon = 'icons/obj/weapons.dmi' icon_state = "uglyminearmed" var/triggered = 0 - + /obj/effect/mine/proc/mineEffect(mob/living/victim) to_chat(victim, "*click*") /obj/effect/mine/Crossed(AM as mob|obj) + if(!isliving(AM)) + return if(isanimal(AM)) var/mob/living/simple_animal/SA = AM if(!SA.flying) triggermine(SA) else triggermine(AM) - + /obj/effect/mine/proc/triggermine(mob/living/victim) if(triggered) return @@ -28,17 +30,17 @@ mineEffect(victim) triggered = 1 qdel(src) - + /obj/effect/mine/explosive name = "explosive mine" var/range_devastation = 0 var/range_heavy = 1 var/range_light = 2 var/range_flash = 3 - + /obj/effect/mine/explosive/mineEffect(mob/living/victim) - explosion(loc, range_devastation, range_heavy, range_light, range_flash) - + explosion(loc, range_devastation, range_heavy, range_light, range_flash) + /obj/effect/mine/stun name = "stun mine" var/stun_time = 8 @@ -46,11 +48,11 @@ /obj/effect/mine/stun/mineEffect(mob/living/victim) if(isliving(victim)) victim.Weaken(stun_time) - + /obj/effect/mine/dnascramble name = "Radiation Mine" var/radiation_amount - + /obj/effect/mine/dnascramble/mineEffect(mob/living/victim) victim.apply_effect(radiation_amount, IRRADIATE, 0) randmutb(victim) @@ -81,8 +83,8 @@ /obj/effect/mine/sound/bwoink name = "bwoink mine" - sound = 'sound/effects/adminhelp.ogg' - + sound = 'sound/effects/adminhelp.ogg' + /obj/effect/mine/pickup name = "pickup" desc = "pick me up" @@ -102,7 +104,7 @@ invisibility = 101 mineEffect(victim) qdel(src) - + /obj/effect/mine/pickup/bloodbath name = "Red Orb" desc = "You feel angry just looking at it." diff --git a/code/game/objects/items/weapons/grenades/clowngrenade.dm b/code/game/objects/items/weapons/grenades/clowngrenade.dm index 80121cc8292..a77bd6301b6 100644 --- a/code/game/objects/items/weapons/grenades/clowngrenade.dm +++ b/code/game/objects/items/weapons/grenades/clowngrenade.dm @@ -50,36 +50,28 @@ */ /obj/item/weapon/grown/bananapeel/traitorpeel - name = "banana peel" - desc = "A peel from a banana." - icon = 'icons/obj/items.dmi' - icon_state = "banana_peel" - item_state = "banana_peel" - w_class = 1 - throwforce = 0 - throw_speed = 4 - throw_range = 20 - Crossed(AM as mob|obj) - var/burned = rand(2,5) - if(istype(AM, /mob/living/carbon)) - var/mob/living/carbon/M = AM - if(ishuman(M)) - if(isobj(M:shoes)) - if((M:shoes.flags&NOSLIP) || (M:species.bodyflags & FEET_NOSLIP)) - return - else - to_chat(M, "\red Your feet feel like they're on fire!") - M.take_overall_damage(0, max(0, (burned - 2))) - if(!istype(M, /mob/living/carbon/slime) && !isrobot(M)) - M.slip("banana peel!", 0, 7, 4) - M.take_organ_damage(2) // Was 5 -- TLE - M.take_overall_damage(0, burned) +/obj/item/weapon/grown/bananapeel/traitorpeel/Crossed(AM as mob|obj) + var/burned = rand(2,5) + if(istype(AM, /mob/living/carbon)) + var/mob/living/carbon/M = AM + if(ishuman(M)) + if(isobj(M:shoes)) + if((M:shoes.flags&NOSLIP) || (M:species.bodyflags & FEET_NOSLIP)) + return + else + to_chat(M, "\red Your feet feel like they're on fire!") + M.take_overall_damage(0, max(0, (burned - 2))) - throw_impact(atom/hit_atom) - var/burned = rand(1,3) - if(istype(hit_atom ,/mob/living)) - var/mob/living/M = hit_atom - M.take_organ_damage(0, burned) - return ..() \ No newline at end of file + if(!istype(M, /mob/living/carbon/slime) && !isrobot(M)) + M.slip("banana peel!", 0, 7, 4) + M.take_organ_damage(2) // Was 5 -- TLE + M.take_overall_damage(0, burned) + +/obj/item/weapon/grown/bananapeel/traitorpeel/throw_impact(atom/hit_atom) + var/burned = rand(1,3) + if(istype(hit_atom ,/mob/living)) + var/mob/living/M = hit_atom + M.take_organ_damage(0, burned) + return ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 61d8d4fef91..f2bd9cafedf 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -29,11 +29,6 @@ bcell = null return ..() -/obj/item/weapon/melee/baton/CheckParts(list/parts_list) - ..() - bcell = locate(/obj/item/weapon/stock_parts/cell) in contents - update_icon() - /obj/item/weapon/melee/baton/loaded/New() //this one starts with a cell pre-installed. ..() bcell = new(src) @@ -200,8 +195,18 @@ desc = "An improvised stun baton." icon_state = "stunprod_nocell" item_state = "prod" + w_class = 3 force = 3 throwforce = 5 stunforce = 5 hitcost = 3750 - slot_flags = null + slot_flags = SLOT_BACK + var/obj/item/device/assembly/igniter/sparkler = 0 + +/obj/item/weapon/melee/baton/cattleprod/New() + ..() + sparkler = new (src) + +/obj/item/weapon/melee/baton/cattleprod/baton_stun() + if(sparkler.activate()) + ..() diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index fd8f9bdf97e..3c8a25ca739 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -101,10 +101,10 @@ obj/item/weapon/wirerod force = 9 throwforce = 10 w_class = 3 - materials = list(MAT_METAL=1000) + materials = list(MAT_METAL=1150, MAT_GLASS=75) attack_verb = list("hit", "bludgeoned", "whacked", "bonked") -obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params) +obj/item/weapon/wirerod/attackby(obj/item/I, mob/user, params) ..() if(istype(I, /obj/item/weapon/shard)) var/obj/item/weapon/twohanded/spear/S = new /obj/item/weapon/twohanded/spear @@ -118,7 +118,7 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params) qdel(I) qdel(src) - else if(istype(I, /obj/item/weapon/wirecutters)) + else if(istype(I, /obj/item/device/assembly/igniter) && !(I.flags & NODROP)) var/obj/item/weapon/melee/baton/cattleprod/P = new /obj/item/weapon/melee/baton/cattleprod if(!remove_item_from_storage(user)) @@ -126,7 +126,7 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params) user.unEquip(I) user.put_in_hands(P) - to_chat(user, "You fasten the wirecutters to the top of the rod with the cable, prongs outward.") + to_chat(user, "You fasten [I] to the top of the rod with the cable.") qdel(I) qdel(src) diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm index f5aa6198467..cbb5647f283 100644 --- a/code/game/turfs/simulated/floor/plasteel_floor.dm +++ b/code/game/turfs/simulated/floor/plasteel_floor.dm @@ -10,6 +10,16 @@ if(!broken && !burnt) icon_state = icon_regular_floor +/turf/simulated/floor/plasteel/airless + name = "airless floor" + oxygen = 0.01 + nitrogen = 0.01 + temperature = TCMB + +/turf/simulated/floor/plasteel/airless/New() + ..() + name = "floor" + /turf/simulated/floor/plasteel/goonplaque icon_state = "plaque" name = "Commemorative Plaque" diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index c6b51a05067..e9770536b73 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -76,12 +76,6 @@ ..() name = "plating" -/turf/simulated/floor/plating/airless/catwalk - icon = 'icons/turf/catwalks.dmi' - icon_state = "Floor3" - name = "catwalk" - desc = "Cats really don't like these things." - /turf/simulated/floor/engine name = "reinforced floor" icon_state = "engine" @@ -294,16 +288,6 @@ /turf/simulated/floor/plating/metalfoam/proc/smash() ChangeTurf(/turf/space) -/turf/simulated/floor/plasteel/airless - name = "airless floor" - oxygen = 0.01 - nitrogen = 0.01 - temperature = TCMB - -/turf/simulated/floor/plasteel/airless/New() - ..() - name = "floor" - /turf/simulated/floor/plating/abductor name = "alien floor" icon_state = "alienpod1" diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm index 8f1b11b5ca6..f00c9f5d735 100644 --- a/code/modules/client/preference/preferences_mysql.dm +++ b/code/modules/client/preference/preferences_mysql.dm @@ -266,7 +266,7 @@ //Sanitize metadata = sanitize_text(metadata, initial(metadata)) - real_name = reject_bad_name(real_name) + real_name = reject_bad_name(real_name, 1) if(isnull(species)) species = "Human" if(isnull(language)) language = "None" if(isnull(nanotrasen_relation)) nanotrasen_relation = initial(nanotrasen_relation) diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 4d7e1011686..3269cf146c5 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -10,10 +10,10 @@ species_restricted = list("exclude", "Diona", "Wryn") species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/helmet.dmi', - "Drask" = 'icons/mob/species/drask/helmet.dmi' + "Vox" = 'icons/mob/species/vox/helmet.dmi' ) -/obj/item/clothing/head/helmet/space/capspace/equipped(var/mob/living/carbon/human/user, var/slot) + +/obj/item/clothing/head/helmet/space/capspace/equipped(mob/living/carbon/human/user, slot) if(ishuman(user) && slot == slot_head) if(user.species.name == "Vox") if(flags & BLOCKHAIR) @@ -33,11 +33,9 @@ species_restricted = list("exclude", "Diona", "Wryn") species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi', - "Drask" = 'icons/mob/species/drask/suit.dmi' + "Vox" = 'icons/mob/species/vox/suit.dmi' ) - //Deathsquad space suit, not hardsuits because no flashlight! /obj/item/clothing/head/helmet/space/deathsquad name = "deathsquad helmet" @@ -106,7 +104,6 @@ flags_size = ONESIZEFITSALL allowed = list(/obj/item) //for stuffing exta special presents - //Space pirate outfit /obj/item/clothing/head/helmet/space/pirate name = "pirate hat" @@ -136,12 +133,22 @@ desc = "A paramedic EVA helmet. Used in the recovery of bodies from space." icon_state = "paramedic-eva-helmet" item_state = "paramedic-eva-helmet" + species_restricted = list("exclude","Diona","Wryn") + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/helmet.dmi' + ) /obj/item/clothing/suit/space/eva/paramedic name = "Paramedic EVA suit" icon_state = "paramedic-eva" item_state = "paramedic-eva" desc = "A paramedic EVA suit. Used in the recovery of bodies from space." + species_restricted = list("exclude","Diona","Wryn") + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) /obj/item/clothing/suit/space/eva name = "EVA suit" @@ -207,4 +214,4 @@ armor = list(melee = 20, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100) max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT unacidable = 1 - strip_delay = 130 \ No newline at end of file + strip_delay = 130 diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index de2cfc0eda5..73fa69d297c 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -69,15 +69,6 @@ A.UpdateButtonIcon() // ENGINEERING -/obj/item/clothing/suit/space/eva/plasmaman/assistant - name = "plasmaman assistant suit" - icon_state = "plasmamanAssistant_suit" - -/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant - name = "plasmaman assistant helmet" - icon_state = "plasmamanAssistant_helmet0" - base_state = "plasmamanAssistant_helmet" - /obj/item/clothing/suit/space/eva/plasmaman/atmostech name = "plasmaman atmospheric suit" icon_state = "plasmamanAtmos_suit" @@ -115,6 +106,14 @@ //SERVICE +/obj/item/clothing/suit/space/eva/plasmaman/assistant + name = "plasmaman assistant suit" + icon_state = "plasmamanAssistant_suit" + +/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant + name = "plasmaman assistant helmet" + icon_state = "plasmamanAssistant_helmet0" + base_state = "plasmamanAssistant_helmet" /obj/item/clothing/suit/space/eva/plasmaman/botanist name = "plasmaman botanist suit" @@ -301,6 +300,17 @@ icon_state = "plasmaman_Captain_helmet0" base_state = "plasmaman_Captain_helmet" + +//IAA/LAWYER +/obj/item/clothing/suit/space/eva/plasmaman/lawyer + name = "plasmaman lawyer suit" + icon_state = "plasmamanlawyer_suit" + +/obj/item/clothing/head/helmet/space/eva/plasmaman/lawyer + name = "plasmaman lawyer helmet" + icon_state = "plasmamanlawyer_helmet0" + base_state = "plasmamanlawyer_helmet" + //NUKEOPS /obj/item/clothing/suit/space/eva/plasmaman/nuclear diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 44a2f5b1c49..cae5fbd28f0 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -74,6 +74,10 @@ strip_delay = 70 put_on_delay = 70 burn_state = FIRE_PROOF + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/head.dmi' + ) /obj/item/clothing/suit/bomb_suit name = "bomb suit" @@ -99,17 +103,20 @@ sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) - hide_tail_by_species = list("Vox") /obj/item/clothing/head/bomb_hood/security icon_state = "bombsuitsec" item_state = "bombsuitsec" + species_fit = null + sprite_sheets = null /obj/item/clothing/suit/bomb_suit/security icon_state = "bombsuitsec" item_state = "bombsuitsec" allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs) + species_fit = null + sprite_sheets = null /* * Radiation protection @@ -123,6 +130,10 @@ strip_delay = 60 put_on_delay = 60 burn_state = FIRE_PROOF + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/head.dmi' + ) /obj/item/clothing/suit/radiation name = "Radiation suit" @@ -140,4 +151,8 @@ flags_inv = HIDEJUMPSUIT|HIDETAIL strip_delay = 60 put_on_delay = 60 - burn_state = FIRE_PROOF \ No newline at end of file + burn_state = FIRE_PROOF + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) \ No newline at end of file diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index c75efd74929..d8111a3fed0 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -48,10 +48,8 @@ result = /obj/item/weapon/melee/baton/cattleprod reqs = list(/obj/item/weapon/restraints/handcuffs/cable = 1, /obj/item/stack/rods = 1, - /obj/item/weapon/wirecutters = 1, - /obj/item/weapon/stock_parts/cell = 1) + /obj/item/device/assembly/igniter = 1) time = 40 - parts = list(/obj/item/weapon/stock_parts/cell = 1) category = CAT_WEAPON /datum/crafting_recipe/bola diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 9ff0fed374e..5cf24a394ee 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -10,6 +10,9 @@ pressure_resistance = 5*ONE_ATMOSPHERE /obj/structure/ore_box/attackby(obj/item/weapon/W as obj, mob/user as mob, params) + if(istype(W, /obj/item/device/t_scanner/adv_mining_scanner)) + attack_hand(user) + return if(istype(W, /obj/item/weapon/ore)) if(!user.drop_item()) return diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index be101742dfa..2b495f02062 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -22,7 +22,7 @@ var/english_names = 0 // Do we want English names by default, no matter what? var/list/scramble_cache = list() -/datum/language/proc/get_random_name(var/gender, name_count=2, syllable_count=4) +/datum/language/proc/get_random_name(gender, name_count=2, syllable_count=4) if(!syllables || !syllables.len || english_names) if(gender==FEMALE) return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) @@ -40,7 +40,7 @@ return "[trim(full_name)]" -/datum/language/proc/scramble(var/input) +/datum/language/proc/scramble(input) if(!syllables || !syllables.len) return stars(input) @@ -95,10 +95,11 @@ // if you yell, you'll be heard from two tiles over instead of one return (copytext(message, length(message)) == "!") ? 2 : 1 -/datum/language/proc/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) +/datum/language/proc/broadcast(mob/living/speaker, message, speaker_mask) log_say("[key_name(speaker)]: ([name]) [message]") - if(!speaker_mask) speaker_mask = speaker.name + if(!speaker_mask) + speaker_mask = speaker.name var/msg = "[name], [speaker_mask] [format_message(message, get_spoken_verb(message))]" for(var/mob/player in player_list) @@ -110,10 +111,10 @@ else if(istype(player,/mob/dead) || ((src in player.languages) && check_special_condition(player, speaker))) to_chat(player, msg) -/datum/language/proc/check_special_condition(var/mob/other, var/mob/living/speaker) - return 1 +/datum/language/proc/check_special_condition(mob/other, mob/living/speaker) + return TRUE -/datum/language/proc/get_spoken_verb(var/msg_end) +/datum/language/proc/get_spoken_verb(msg_end) switch(msg_end) if("!") return exclaim_verb @@ -170,8 +171,7 @@ "ka","aasi","far","wa","baq","ara","qara","zir","sam","mak","hrar","nja","rir","khan","jun","dar","rik","kah", \ "hal","ket","jurl","mah","tul","cresh","azu","ragh") -/datum/language/tajaran/get_random_name(var/gender) - +/datum/language/tajaran/get_random_name(gender) var/new_name = ..(gender,1) if(prob(80)) new_name += " [pick(list("Hadii","Kaytam","Zhan-Khazan","Hharar","Njarir'Akhan"))]" @@ -286,13 +286,13 @@ key = "^" flags = RESTRICTED | HIVEMIND -/datum/language/grey/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) +/datum/language/grey/broadcast(mob/living/speaker, message, speaker_mask) ..(speaker,message,speaker.real_name) -/datum/language/grey/check_special_condition(var/mob/living/carbon/human/other, var/mob/living/carbon/human/speaker) +/datum/language/grey/check_special_condition(mob/living/carbon/human/other, mob/living/carbon/human/speaker) if(other in range(7, speaker)) - return 1 - return 0 + return TRUE + return FALSE /datum/language/drask name = "Orluum" @@ -322,7 +322,7 @@ english_names = 1 //TODO flag certain languages to use the mob-type specific say_quote and then get rid of these. -/datum/language/common/get_spoken_verb(var/msg_end) +/datum/language/common/get_spoken_verb(msg_end) switch(msg_end) if("!") return pick("exclaims","shouts","yells") //TODO: make the basic proc handle lists of verbs. @@ -341,7 +341,7 @@ syllables = list("tao","shi","tzu","yi","com","be","is","i","op","vi","ed","lec","mo","cle","te","dis","e") english_names = 1 -/datum/language/human/get_spoken_verb(var/msg_end) +/datum/language/human/get_spoken_verb(msg_end) switch(msg_end) if("!") return pick("exclaims","shouts","yells") //TODO: make the basic proc handle lists of verbs. @@ -396,15 +396,14 @@ key = "y" flags = RESTRICTED | HIVEMIND -/datum/language/wryn/check_special_condition(var/mob/other) - +/datum/language/wryn/check_special_condition(mob/other) var/mob/living/carbon/M = other if(!istype(M)) - return 1 + return TRUE if(locate(/obj/item/organ/internal/wryn/hivenode) in M.internal_organs) - return 1 + return TRUE - return 0 + return FALSE /datum/language/xenocommon name = "Xenomorph" @@ -428,7 +427,6 @@ flags = RESTRICTED | HIVEMIND follow = 1 - /datum/language/terrorspider name = "Spider Hivemind" desc = "Terror spiders have a limited ability to commune over a psychic hivemind, similar to xenomorphs." @@ -440,7 +438,6 @@ flags = RESTRICTED | HIVEMIND follow = 1 - /datum/language/ling name = "Changeling" desc = "Although they are normally wary and suspicious of each other, changelings can commune over a distance." @@ -449,6 +446,14 @@ key = "g" flags = RESTRICTED | HIVEMIND +/datum/language/ling/broadcast(mob/living/speaker, message, speaker_mask) + if(speaker.mind && speaker.mind.changeling) + ..(speaker,message,speaker.mind.changeling.changelingID) + else if(speaker.mind && speaker.mind.linglink) + ..() + else + ..(speaker,message) + /datum/language/shadowling name = "Shadowling Hivemind" desc = "Shadowlings and their thralls are capable of communicating over a psychic hivemind." @@ -457,20 +462,12 @@ key = "8" flags = RESTRICTED | HIVEMIND - -/datum/language/shadowling/broadcast(var/mob/living/speaker, var/message, var/speaker_mask) +/datum/language/shadowling/broadcast(mob/living/speaker, message, speaker_mask) if(speaker.mind && speaker.mind.special_role) ..(speaker, message, "([speaker.mind.special_role]) [speaker]") else ..(speaker, message) -/datum/language/ling/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) - - if(speaker.mind && speaker.mind.changeling) - ..(speaker,message,speaker.mind.changeling.changelingID) - else - ..(speaker,message) - /datum/language/abductor name = "Abductor Mindlink" desc = "Abductors are incapable of speech, but have a psychic link attuned to their own team." @@ -481,14 +478,14 @@ key = "zw" //doesn't matter, this is their default and only language flags = RESTRICTED | HIVEMIND -/datum/language/abductor/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) +/datum/language/abductor/broadcast(mob/living/speaker, message, speaker_mask) ..(speaker,message,speaker.real_name) -/datum/language/abductor/check_special_condition(var/mob/living/carbon/human/other, var/mob/living/carbon/human/speaker) +/datum/language/abductor/check_special_condition(mob/living/carbon/human/other, mob/living/carbon/human/speaker) if(other.mind && other.mind.abductor) if(other.mind.abductor.team == speaker.mind.abductor.team) - return 1 - return 0 + return TRUE + return FALSE /datum/language/corticalborer name = "Cortical Link" @@ -500,11 +497,11 @@ key = "x" flags = RESTRICTED | HIVEMIND -/datum/language/corticalborer/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) +/datum/language/corticalborer/broadcast(mob/living/speaker, message, speaker_mask) var/mob/living/simple_animal/borer/B - if(istype(speaker,/mob/living/carbon)) + if(iscarbon(speaker)) var/mob/living/carbon/M = speaker B = M.has_brain_worms() else if(istype(speaker,/mob/living/simple_animal/borer)) @@ -526,7 +523,7 @@ follow = 1 var/drone_only -/datum/language/binary/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) +/datum/language/binary/broadcast(mob/living/speaker, message, speaker_mask) if(!speaker.binarycheck()) return @@ -538,15 +535,14 @@ var/message_body = "[speaker.say_quote(message)], \"[message]\"
" for(var/mob/M in dead_mob_list) - if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain)) + if(!isnewplayer(M) && !isbrain(M)) var/message_start_dead = "[name], [speaker.name] ([ghost_follow_link(speaker, ghost=M)])" M.show_message("[message_start_dead] [message_body]", 2) for(var/mob/living/S in living_mob_list) - if(drone_only && !istype(S,/mob/living/silicon/robot/drone)) continue - else if(istype(S , /mob/living/silicon/ai)) + else if(isAI(S)) message_start = "[name], [speaker.name]" else if(!S.binarycheck()) continue @@ -557,7 +553,7 @@ listening -= src for(var/mob/living/M in listening) - if(istype(M, /mob/living/silicon) || M.binarycheck()) + if(issilicon(M) || M.binarycheck()) continue M.show_message("synthesised voice beeps, \"beep beep beep\"",2) @@ -596,17 +592,17 @@ follow = 1 // Language handling. -/mob/proc/add_language(var/language) +/mob/proc/add_language(language) var/datum/language/new_language = all_languages[language] if(!istype(new_language) || new_language in languages) - return 0 + return FALSE languages |= new_language - return 1 + return TRUE -/mob/proc/remove_language(var/rem_language) +/mob/proc/remove_language(rem_language) var/datum/language/L = all_languages[rem_language] . = (L in languages) languages.Remove(L) @@ -620,7 +616,7 @@ // Can we speak this language, as opposed to just understanding it? /mob/proc/can_speak_language(datum/language/speaking) - return (universal_speak || (speaking && speaking.flags & INNATE) || speaking in src.languages) + return (universal_speak || (speaking && speaking.flags & INNATE) || speaking in languages) //TBD /mob/verb/check_languages() @@ -661,7 +657,7 @@ if(L) set_default_language(L) check_languages() - return 1 + return TRUE else return ..() diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index 1a79374407c..e76aaa91b02 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -67,6 +67,9 @@ suit=/obj/item/clothing/suit/space/eva/plasmaman/security/ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/ H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_in_backpack) + if("Internal Affairs Agent") + suit=/obj/item/clothing/suit/space/eva/plasmaman/lawyer + helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/lawyer if("Magistrate") suit=/obj/item/clothing/suit/space/eva/plasmaman/magistrate helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/magistrate diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 710f8d8dff1..3235c6899c1 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -99,22 +99,24 @@ var/list/ai_verbs_default = list( var/obj/machinery/camera/portable/builtInCamera + var/obj/structure/AIcore/deactivated/linked_core //For exosuit control + var/arrivalmsg = "$name, $rank, has arrived on the station." /mob/living/silicon/ai/proc/add_ai_verbs() - src.verbs |= ai_verbs_default - src.verbs |= silicon_subsystems + verbs |= ai_verbs_default + verbs |= silicon_subsystems /mob/living/silicon/ai/proc/remove_ai_verbs() - src.verbs -= ai_verbs_default - src.verbs -= silicon_subsystems + verbs -= ai_verbs_default + verbs -= silicon_subsystems /mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/device/mmi/B, var/safety = 0) announcement = new() announcement.title = "A.I. Announcement" announcement.announcement_type = "A.I. Announcement" announcement.announcer = name - announcement.newscast = 1 + announcement.newscast = 0 var/list/possibleNames = ai_names @@ -154,7 +156,7 @@ var/list/ai_verbs_default = list( aiCamera = new/obj/item/device/camera/siliconcam/ai_camera(src) - if(istype(loc, /turf)) + if(isturf(loc)) add_ai_verbs(src) //Languages @@ -226,7 +228,7 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/rename_character(oldname, newname) if(!..(oldname, newname)) - return 0 + return FALSE if(oldname != real_name) announcement.announcer = name @@ -238,7 +240,7 @@ var/list/ai_verbs_default = list( if(aiPDA) aiPDA.set_name_and_job(newname, "AI") - return 1 + return TRUE /mob/living/silicon/ai/Destroy() ai_list -= src @@ -261,7 +263,7 @@ var/list/ai_verbs_default = list( var/mob/living/silicon/ai/powered_ai = null invisibility = 100 -/obj/machinery/ai_powersupply/New(var/mob/living/silicon/ai/ai=null) +/obj/machinery/ai_powersupply/New(mob/living/silicon/ai/ai=null) powered_ai = ai if(isnull(powered_ai)) qdel(src) @@ -307,31 +309,83 @@ var/list/ai_verbs_default = list( //if(icon_state == initial(icon_state)) var/icontype = "" - if(custom_sprite == 1) icontype = ("Custom")//automagically selects custom sprite if one is available - else icontype = input("Select an icon!", "AI", null, null) in list("Monochrome", "Blue", "Clown", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static", "Red October", "Sparkles", "ANIMA", "President", "NT") + if(custom_sprite == 1) + icontype = ("Custom")//automagically selects custom sprite if one is available + else + icontype = input("Select an icon!", "AI", null, null) in list("Monochrome", "Blue", "Clown", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static", "Red October", "Sparkles", "ANIMA", "President", "NT", "NT2", "Rainbow", "Angel", "Heartline", "Hades", "Helios", "Syndicat Meow", "Too Deep", "Goon", "Murica", "Fuzzy", "Glitchman", "House", "Database") switch(icontype) - if("Custom") icon_state = "[ckey]-ai" - if("Clown") icon_state = "ai-clown2" - if("Monochrome") icon_state = "ai-mono" - if("Inverted") icon_state = "ai-u" - if("Firewall") icon_state = "ai-magma" - if("Green") icon_state = "ai-wierd" - if("Red") icon_state = "ai-red" - if("Static") icon_state = "ai-static" - if("Text") icon_state = "ai-text" - if("Smiley") icon_state = "ai-smiley" - if("Matrix") icon_state = "ai-matrix" - if("Angry") icon_state = "ai-angryface" - if("Dorf") icon_state = "ai-dorf" - if("Bliss") icon_state = "ai-bliss" - if("Triumvirate") icon_state = "ai-triumvirate" - if("Triumvirate Static") icon_state = "ai-triumvirate-malf" - if("Red October") icon_state = "ai-redoctober" - if("Sparkles") icon_state = "ai-sparkles" - if("ANIMA") icon_state = "ai-anima" - if("President") icon_state = "ai-president" - if("NT") icon_state = "ai-nt" - else icon_state = "ai" + if("Custom") + icon_state = "[ckey]-ai" + if("Clown") + icon_state = "ai-clown" + if("Monochrome") + icon_state = "ai-mono" + if("Inverted") + icon_state = "ai-u" + if("Firewall") + icon_state = "ai-magma" + if("Green") + icon_state = "ai-weird" + if("Red") + icon_state = "ai-red" + if("Static") + icon_state = "ai-static" + if("Text") + icon_state = "ai-text" + if("Smiley") + icon_state = "ai-smiley" + if("Matrix") + icon_state = "ai-matrix" + if("Angry") + icon_state = "ai-angryface" + if("Dorf") + icon_state = "ai-dorf" + if("Bliss") + icon_state = "ai-bliss" + if("Triumvirate") + icon_state = "ai-triumvirate" + if("Triumvirate Static") + icon_state = "ai-triumvirate-malf" + if("Red October") + icon_state = "ai-redoctober" + if("Sparkles") + icon_state = "ai-sparkles" + if("ANIMA") + icon_state = "ai-anima" + if("President") + icon_state = "ai-president" + if("NT") + icon_state = "ai-nt" + if("NT2") + icon_state = "ai-nanotrasen" + if("Rainbow") + icon_state = "ai-rainbow" + if("Angel") + icon_state = "ai-angel" + if("Heartline") + icon_state = "ai-heartline" + if("Hades") + icon_state = "ai-hades" + if("Helios") + icon_state = "ai-helios" + if("Syndicat Meow") + icon_state = "ai-syndicatmeow" + if("Too Deep") + icon_state = "ai-toodeep" + if("Goon") + icon_state = "ai-goon" + if("Murica") + icon_state = "ai-murica" + if("Fuzzy") + icon_state = "ai-fuzz" + if("Glitchman") + icon_state = "ai-glitchman" + if("House") + icon_state = "ai-house" + if("Database") + icon_state = "ai-database" + else + icon_state = "ai" //else // to_chat(usr, "You can only change your display once!") //return @@ -400,7 +454,7 @@ var/list/ai_verbs_default = list( cancel_call_proc(src) /mob/living/silicon/ai/cancel_camera() - src.view_core() + view_core() /mob/living/silicon/ai/verb/toggle_anchor() set category = "AI Commands" @@ -414,7 +468,7 @@ var/list/ai_verbs_default = list( to_chat(src, "[anchored ? "You are now anchored." : "You are now unanchored."]") /mob/living/silicon/ai/update_canmove() - return 0 + return FALSE /mob/living/silicon/ai/proc/announcement() set name = "Announcement" @@ -426,21 +480,21 @@ var/list/ai_verbs_default = list( ai_announcement() -/mob/living/silicon/ai/check_eye(var/mob/user as mob) +/mob/living/silicon/ai/check_eye(mob/user) if(!current) return null user.reset_perspective(current) - return 1 + return TRUE /mob/living/silicon/ai/blob_act() if(stat != 2) adjustBruteLoss(60) updatehealth() - return 1 - return 0 + return TRUE + return FALSE /mob/living/silicon/ai/restrained() - return 0 + return FALSE /mob/living/silicon/ai/emp_act(severity) if(prob(30)) @@ -516,7 +570,7 @@ var/list/ai_verbs_default = list( if(href_list["callbot"]) //Command a bot to move to a selected location. Bot = locate(href_list["callbot"]) in simple_animal_list - if(!Bot || Bot.remote_disabled || src.control_disabled) + if(!Bot || Bot.remote_disabled || control_disabled) return //True if there is no bot found, the bot is manually emagged, or the AI is carded with wireless off. waypoint_mode = 1 to_chat(src, "Set your waypoint by clicking on a valid location free of obstructions.") @@ -524,7 +578,7 @@ var/list/ai_verbs_default = list( if(href_list["interface"]) //Remotely connect to a bot! Bot = locate(href_list["interface"]) in simple_animal_list - if(!Bot || Bot.remote_disabled || src.control_disabled) + if(!Bot || Bot.remote_disabled || control_disabled) return Bot.attack_ai(src) @@ -535,7 +589,16 @@ var/list/ai_verbs_default = list( if(href_list["ai_take_control"]) //Mech domination var/obj/mecha/M = locate(href_list["ai_take_control"]) if(controlled_mech) - to_chat(src, "You are already loaded into an onboard computer!") + to_chat(src, "You are already loaded into an onboard computer!") + return + if(!cameranet.checkCameraVis(M)) + to_chat(src, "Exosuit is no longer near active cameras.") + return + if(lacks_power()) + to_chat(src, "You're depowered!") + return + if(!isturf(loc)) + to_chat(src, "You aren't in your core!") return if(M) M.transfer_ai(AI_MECH_HACK,src, usr) //Called om the mech itself. @@ -550,7 +613,7 @@ var/list/ai_verbs_default = list( if(usr.machine == null) usr.machine = usr - while(src.cameraFollow == target) + while(cameraFollow == target) to_chat(usr, "Target is not on or near any active cameras on the station. We'll check again in 5 seconds (unless you use the cancel-camera verb).") sleep(40) continue @@ -565,12 +628,12 @@ var/list/ai_verbs_default = list( return 2 -/mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M as mob) +/mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M) if(!ticker) to_chat(M, "You cannot attack people before the game has started.") return - if(istype(loc, /turf) && istype(loc.loc, /area/start)) + if(isturf(loc) && istype(loc.loc, /area/start)) to_chat(M, "No attacking people at spawn, you jackass.") return @@ -595,7 +658,7 @@ var/list/ai_verbs_default = list( return -/mob/living/silicon/ai/attack_animal(mob/living/simple_animal/M as mob) +/mob/living/silicon/ai/attack_animal(mob/living/simple_animal/M) if(M.melee_damage_upper == 0) M.custom_emote(1, "[M.friendly] [src]") else @@ -653,7 +716,7 @@ var/list/ai_verbs_default = list( popup.set_content(d) popup.open() -/mob/living/silicon/ai/proc/set_waypoint(var/atom/A) +/mob/living/silicon/ai/proc/set_waypoint(atom/A) var/turf/turf_check = get_turf(A) //The target must be in view of a camera or near the core. if(turf_check in range(get_turf(src))) @@ -663,7 +726,7 @@ var/list/ai_verbs_default = list( else to_chat(src, "Selected location is not visible.") -/mob/living/silicon/ai/proc/call_bot(var/turf/waypoint) +/mob/living/silicon/ai/proc/call_bot(turf/waypoint) if(!Bot) return @@ -674,22 +737,22 @@ var/list/ai_verbs_default = list( Bot.call_bot(src, waypoint) -/mob/living/silicon/ai/proc/switchCamera(var/obj/machinery/camera/C) +/mob/living/silicon/ai/proc/switchCamera(obj/machinery/camera/C) if(!tracking) cameraFollow = null if(!C || stat == DEAD) //C.can_use()) - return 0 + return FALSE - if(!src.eyeobj) + if(!eyeobj) view_core() return // ok, we're alive, camera is good and in our network... eyeobj.setLoc(get_turf(C)) //machine = src - return 1 + return TRUE //Replaces /mob/living/silicon/ai/verb/change_network() in ai.dm & camera.dm //Adds in /mob/living/silicon/ai/proc/ai_network_change() instead @@ -920,7 +983,7 @@ var/list/ai_verbs_default = list( set category = "Malfunction" set name = "Return to Main Core" - var/obj/machinery/power/apc/apc = src.loc + var/obj/machinery/power/apc/apc = loc if(!istype(apc)) to_chat(src, "\blue You are already in your Main Core.") return @@ -994,7 +1057,7 @@ var/list/ai_verbs_default = list( lit_cameras |= C -/mob/living/silicon/ai/attackby(obj/item/weapon/W as obj, mob/user as mob, params) +/mob/living/silicon/ai/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/wrench)) if(anchored) user.visible_message("\blue \The [user] starts to unbolt \the [src] from the plating...") @@ -1025,14 +1088,15 @@ var/list/ai_verbs_default = list( return to_chat(src, "Accessing Subspace Transceiver control...") - if(src.aiRadio) - src.aiRadio.interact(src) + if(aiRadio) + aiRadio.interact(src) -/mob/living/silicon/ai/proc/open_nearest_door(mob/living/target as mob) - if(!istype(target)) return +/mob/living/silicon/ai/proc/open_nearest_door(mob/living/target) + if(!istype(target)) + return spawn(0) - if(istype(target, /mob/living/carbon/human)) + if(ishuman(target)) var/mob/living/carbon/human/H = target var/obj/item/weapon/card/id/id = H.wear_id if(istype(id) && id.is_untrackable()) @@ -1047,7 +1111,8 @@ var/list/ai_verbs_default = list( var/obj/machinery/door/airlock/tobeopened var/dist = -1 for(var/obj/machinery/door/airlock/D in range(3,target)) - if(!D.density) continue + if(!D.density) + continue if(dist < 0) dist = get_dist(D, target) // to_chat(world, dist) @@ -1073,27 +1138,27 @@ var/list/ai_verbs_default = list( return -/mob/living/silicon/ai/proc/check_unable(var/flags = 0) +/mob/living/silicon/ai/proc/check_unable(flags = 0) if(stat == DEAD) to_chat(usr, "You are dead!") - return 1 + return TRUE if(lacks_power()) to_chat(usr, "Power systems failure!") - return 1 + return TRUE - if((flags & AI_CHECK_WIRELESS) && src.control_disabled) + if((flags & AI_CHECK_WIRELESS) && control_disabled) to_chat(usr, "Wireless control is disabled!") - return 1 - if((flags & AI_CHECK_RADIO) && src.aiRadio.disabledAi) + return TRUE + if((flags & AI_CHECK_RADIO) && aiRadio.disabledAi) to_chat(src, "System Error - Transceiver Disabled!") - return 1 - return 0 + return TRUE + return FALSE /mob/living/silicon/ai/proc/is_in_chassis() - return istype(loc, /turf) + return isturf(loc) -/mob/living/silicon/ai/transfer_ai(var/interaction, var/mob/user, var/mob/living/silicon/ai/AI, var/obj/item/device/aicard/card) +/mob/living/silicon/ai/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/device/aicard/card) if(!..()) return if(interaction == AI_TRANS_TO_CARD)//The only possible interaction. Upload AI mob to a card. @@ -1114,17 +1179,17 @@ var/list/ai_verbs_default = list( set category = "IC" resting = 0 - var/obj/item/weapon/rig/rig = src.get_rig() + var/obj/item/weapon/rig/rig = get_rig() if(rig) rig.force_rest(src) -/mob/living/silicon/ai/switch_to_camera(var/obj/machinery/camera/C) +/mob/living/silicon/ai/switch_to_camera(obj/machinery/camera/C) if(!C.can_use() || !is_in_chassis()) - return 0 + return FALSE eyeobj.setLoc(get_turf(C)) client.eye = eyeobj - return 1 + return TRUE /mob/living/silicon/ai/proc/relay_speech(mob/living/M, text, verb, datum/language/speaking) if(!say_understands(M, speaking))//The AI will be able to understand most mobs talking through the holopad. diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 1c977296a8a..9947e6faeec 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -1,9 +1,13 @@ /mob/living/silicon/ai/death(gibbed) - if(stat == DEAD) return + if(stat == DEAD) + return stat = DEAD - if(src.custom_sprite == 1)//check for custom AI sprite, defaulting to blue screen if no. - icon_state = "[ckey]-ai-crash" - else icon_state = "ai-crash" + if(custom_sprite == 1)//check for custom AI sprite, defaulting to blue screen if no. + icon_state = "[ckey]-ai_dead" + else if("[icon_state]_dead" in icon_states(icon,1)) + icon_state = "[icon_state]_dead" + else + icon_state = "ai_dead" update_canmove() if(eyeobj) eyeobj.setLoc(get_turf(src)) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 7a7cfa45efa..3df660dc117 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -51,7 +51,7 @@ /obj/item/weapon/gripper/verb/drop_item() - set name = "Drop Item" + set name = "Drop Gripped Item" set desc = "Release an item from your magnetic gripper." set category = "Drone" diff --git a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm index c50e2dd2944..517b71a3a6d 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm @@ -113,12 +113,13 @@ feedback_add_details("hivelord_core","[src.type]|used|self") playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1) H.revive() + user.drop_item() qdel(src) ..() - + /obj/item/organ/internal/hivelord_core/prepare_eat() return null - + /mob/living/simple_animal/hostile/asteroid/hivelordbrood name = "hivelord brood" desc = "A fragment of the original Hivelord, rallying behind its original. One isn't much of a threat, but..." @@ -206,7 +207,7 @@ faction = list("\ref[src]", "\ref[H]") // Hostile to everyone except the host. H.vessel.trans_to(src, 30) color = mix_color_from_reagents(reagents.reagent_list) - + // Legion /mob/living/simple_animal/hostile/asteroid/hivelord/legion name = "legion" @@ -240,7 +241,7 @@ else new /obj/effect/landmark/corpse/damaged(T) ..(gibbed) - + /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion name = "legion" diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 7adcc187109..af9b33bbcbd 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -235,7 +235,7 @@ var/global/list/ts_spiderlist = list() notify_ghosts("[src] has appeared in [get_area(src)]. (already player-controlled)", source = src, alert_overlay = alert_overlay) else if(ai_playercontrol_allowingeneral && ai_playercontrol_allowtype) var/image/alert_overlay = image('icons/mob/terrorspider.dmi', icon_state) - notify_ghosts("[src] has appeared in [get_area(src)].", enter_link = "(Click to control)", source = src, alert_overlay = alert_overlay, attack_not_jump = 1) + notify_ghosts("[src] has appeared in [get_area(src)].", enter_link = "(Click to control)", source = src, alert_overlay = alert_overlay, action = NOTIFY_ATTACK) /mob/living/simple_animal/hostile/poison/terror_spider/Destroy() ts_spiderlist -= src diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 4307ec02655..95fce0b9399 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -434,7 +434,7 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM) lname = "[lname] " to_chat(M, "[lname][follow][message]") -/proc/notify_ghosts(message, ghost_sound = null, enter_link = null, atom/source = null, image/alert_overlay = null, attack_not_jump = 0, flashwindow = TRUE, var/action = NOTIFY_JUMP) //Easy notification of ghosts. +/proc/notify_ghosts(message, ghost_sound = null, enter_link = null, atom/source = null, image/alert_overlay = null, flashwindow = TRUE, var/action = NOTIFY_JUMP) //Easy notification of ghosts. for(var/mob/dead/observer/O in player_list) if(O.client) to_chat(O, "[message][(enter_link) ? " [enter_link]" : ""]") diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 25135f7a079..6d3624701b9 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -342,7 +342,7 @@ build_path = /obj/item/weapon/circuitboard/teleporter category = list("Computer Boards") -datum/design/GAC +/datum/design/GAC name = "Console Board (General Air Control)" desc = "Allows for the construction of circuit boards used to build a General Air Control Computer." id = "GAC" @@ -352,7 +352,7 @@ datum/design/GAC build_path = /obj/item/weapon/circuitboard/air_management category = list("Computer Boards") -datum/design/tank_control +/datum/design/tank_control name = "Console Board (Large Tank Control)" desc = "Allows for the construction of circuit boards used to build a Large Tank Control Computer." id = "tankcontrol" @@ -362,7 +362,7 @@ datum/design/tank_control build_path = /obj/item/weapon/circuitboard/large_tank_control category = list("Computer Boards") -datum/design/AAC +/datum/design/AAC name = "Console Board (Atmospheric Automations Console)" desc = "Allows for the construction of circuit boards used to build an Atmospheric Automations Console." id = "AAC" @@ -370,4 +370,14 @@ datum/design/AAC build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/atmos_automation - category = list("Computer Boards") \ No newline at end of file + category = list("Computer Boards") + +/datum/design/xenobiocamera + name = "Console Board (Xenobiology Console)" + desc = "Allows for the construction of circuit boards used to build xenobiology camera computers." + id = "xenobioconsole" + req_tech = list("programming" = 3, "biotech" = 3) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/xenobiology + category = list("Computer Boards") diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index ff5708576cf..85442addb2c 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -1068,6 +1068,16 @@ construction_time = 50 category = list("Misc") +/datum/design/mecha_tracking_ai_control + name = "AI Control Beacon" + id = "mecha_tracking_ai_control" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/mecha_tracking/ai_control + materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_SILVER = 200) + req_tech = list("programming" = 3, "magnets" = 2, "engineering" = 2) + construction_time = 50 + category = list("Misc") + /datum/design/ipc_head name = "IPC Head" id = "ipc_head" diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 7b27642722b..416eac1ba2a 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -3,11 +3,16 @@ visible_icon = 1 icon = 'icons/obj/abductor.dmi' icon_state = "camera_target" + var/allowed_area = null +/mob/camera/aiEye/remote/xenobio/New(loc) + var/area/A = get_area(loc) + allowed_area = A.name + ..() -/mob/camera/aiEye/remote/xenobio/setLoc(var/t) +/mob/camera/aiEye/remote/xenobio/setLoc(t) var/area/new_area = get_area(t) - if(new_area && new_area.name == "Xenobiology Lab" || istype(new_area, /area/toxins/xenobiology )) + if(new_area && new_area.name == allowed_area || istype(new_area, /area/toxins/xenobiology )) return ..() else return @@ -16,6 +21,7 @@ name = "Slime management console" desc = "A computer used for remotely handling slimes." networks = list("SS13") + circuit = /obj/item/weapon/circuitboard/xenobiology off_action = new /datum/action/innate/camera_off/xenobio var/datum/action/innate/slime_place/slime_place_action = new var/datum/action/innate/slime_pick_up/slime_up_action = new @@ -30,8 +36,7 @@ icon_keyboard = "rd_key" /obj/machinery/computer/camera_advanced/xenobio/CreateEye() - eyeobj = new /mob/camera/aiEye/remote/xenobio() - eyeobj.loc = get_turf(src) + eyeobj = new /mob/camera/aiEye/remote/xenobio(get_turf(src)) eyeobj.origin = src eyeobj.visible_icon = 1 eyeobj.icon = 'icons/obj/abductor.dmi' diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index a6bb18bec14..c6b276cf34c 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -279,7 +279,7 @@ else // This isn't an error, per se, but we can't let the shuttle code // attempt to move us where we currently are, it will get weird. - return SHUTTLE_ALREADY_DOCKED + return SHUTTLE_ALREADY_DOCKED return SHUTTLE_CAN_DOCK /obj/docking_port/mobile/proc/check_dock(obj/docking_port/stationary/S) @@ -761,6 +761,7 @@ /obj/machinery/computer/shuttle/ert name = "specops shuttle console" //circuit = /obj/item/weapon/circuitboard/ert + req_access = list(access_cent_general) shuttleId = "specops" possible_destinations = "specops_home;specops_away" @@ -799,13 +800,14 @@ /obj/machinery/computer/shuttle/sst name = "Syndicate Strike Time Shuttle Console" desc = "Used to call and send the SST shuttle." + req_access = list(access_syndicate) shuttleId = "sst" possible_destinations = "sst_home;sst_away" /obj/machinery/computer/shuttle/sit - req_access = list(access_syndicate) name = "Syndicate Infiltration Team Shuttle Console" desc = "Used to call and send the SIT shuttle." + req_access = list(access_syndicate) shuttleId = "sit" possible_destinations = "sit_arrivals;sit_scimaint;sit_engshuttle;sit_away" diff --git a/html/changelog.html b/html/changelog.html index 332bc3e6ddf..3b6740b12a5 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,36 @@ -->
+

06 February 2017

+

Fox McCloud updated:

+
    +
  • Fixes traitor banana peels having no sprite
  • +
  • Stunprods are constructed with igniters instead of wirecutters
  • +
  • Stunprods will spark when you stun someone with them
  • +
  • Expands the amount of cryodorm pods
  • +
+

KasparoVy updated:

+
    +
  • IPC names with numbers now load correctly from SQL.
  • +
+

Kyep updated:

+
    +
  • Autoprocess cloners will no longer clone people who cryo and ghost out, or otherwise deliberately remove themselves from the round.
  • +
  • Dead miners in UO45 away mission are no longer naked.
  • +
  • ERT and SST shuttle consoles now require the appropriate access to use.
  • +
+

uraniummeltdown updated:

+
    +
  • You can interact with an ore box by using an advanced mining scanner on it.
  • +
  • Xenobiology Console is now constructible, board has been added to the Circuit Imprinter.
  • +
  • Plasmaman IAA/Lawyers now have a unique suit.
  • +
  • AI control beacons are a new item created from the exosuit fabricator. When installed into a mech, it allows AIs to jump to and from that mech freely. Note that malfunctioning AIs with the domination power unlocked will instead be forced to dominate the mech.
  • +
  • Changelings have a new default ability: Hivemind Link. This lets you bring a neck-grabbed victim into the hivemind for a few minutes. You can talk to your victims and perhaps persuade them to help you, give you intel, or even a PDA code. Victims in crit will be stabilized.
  • +
  • Added new AI core sprites from TG
  • +
  • Added Vox rad suit, bombsuit hood, paramedic EVA suit sprites from /vg/
  • +
  • You can click AI displays as an AI to change them
  • +
+

05 February 2017

Fethas updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 991f3e1ff7c..f70efadc65a 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -3518,3 +3518,33 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. such as the Nar'Sie spawned message. This has been resolved. uraniummeltdown: - bugfix: Supply ID skin is now selectable in the Agent ID and ID Computer +2017-02-06: + Fox McCloud: + - bugfix: Fixes traitor banana peels having no sprite + - tweak: Stunprods are constructed with igniters instead of wirecutters + - tweak: Stunprods will spark when you stun someone with them + - rscadd: Expands the amount of cryodorm pods + KasparoVy: + - bugfix: IPC names with numbers now load correctly from SQL. + Kyep: + - bugfix: Autoprocess cloners will no longer clone people who cryo and ghost out, + or otherwise deliberately remove themselves from the round. + - tweak: Dead miners in UO45 away mission are no longer naked. + - bugfix: ERT and SST shuttle consoles now require the appropriate access to use. + uraniummeltdown: + - tweak: You can interact with an ore box by using an advanced mining scanner on + it. + - rscadd: Xenobiology Console is now constructible, board has been added to the + Circuit Imprinter. + - rscadd: Plasmaman IAA/Lawyers now have a unique suit. + - rscadd: AI control beacons are a new item created from the exosuit fabricator. + When installed into a mech, it allows AIs to jump to and from that mech freely. + Note that malfunctioning AIs with the domination power unlocked will instead + be forced to dominate the mech. + - rscadd: 'Changelings have a new default ability: Hivemind Link. This lets you + bring a neck-grabbed victim into the hivemind for a few minutes. You can talk + to your victims and perhaps persuade them to help you, give you intel, or even + a PDA code. Victims in crit will be stabilized.' + - rscadd: Added new AI core sprites from TG + - rscadd: Added Vox rad suit, bombsuit hood, paramedic EVA suit sprites from /vg/ + - tweak: You can click AI displays as an AI to change them diff --git a/icons/mob/AI.dmi b/icons/mob/AI.dmi index 4c879d066b1..8146e8c6a86 100644 Binary files a/icons/mob/AI.dmi and b/icons/mob/AI.dmi differ diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 7ea4f58b941..a05e783b307 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 3cc7374f530..93d81f6923e 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index efff252421b..1de6fc4ac1d 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index a9b5aa09fa3..3a6701fab2d 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 95a78da4df2..634e23d2f8f 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi index 21ed6e38001..bca96cddb8f 100644 Binary files a/icons/mob/species/vox/head.dmi and b/icons/mob/species/vox/head.dmi differ diff --git a/icons/mob/species/vox/helmet.dmi b/icons/mob/species/vox/helmet.dmi index 05c31e1e1d6..869d98223cf 100644 Binary files a/icons/mob/species/vox/helmet.dmi and b/icons/mob/species/vox/helmet.dmi differ diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi index 12be5447f34..311bc31623a 100644 Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index b78f7844922..d338612b2ec 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index f09805df40b..1939a6b95d8 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index ebeb79d56b8..ea3b7bf31de 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index d49373de19e..83276e5ec57 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ