diff --git a/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm b/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm new file mode 100644 index 00000000..a89d1422 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm @@ -0,0 +1,970 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/space/basic, +/area/template_noop) +"b" = ( +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"c" = ( +/turf/closed/wall/r_wall/rust, +/area/ruin/space/has_grav/hilbertresearchfacility) +"d" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/hilbertresearchfacility) +"e" = ( +/obj/machinery/porta_turret/syndicate{ + desc = "A ballistic machine gun auto-turret that fires bluespace bullets."; + lethal_projectile = /obj/item/projectile/magic/teleport; + name = "displacement turret"; + stun_projectile = /obj/item/projectile/magic/teleport + }, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"f" = ( +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"g" = ( +/obj/structure/table/glass, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"h" = ( +/obj/structure/table/glass, +/obj/item/stack/sheet/bluespace_crystal{ + amount = 37 + }, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"i" = ( +/obj/structure/table/glass, +/obj/item/bodybag/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"j" = ( +/turf/open/floor/plasteel/stairs/left, +/area/ruin/space/has_grav/hilbertresearchfacility) +"k" = ( +/turf/open/floor/plasteel/stairs/medium, +/area/ruin/space/has_grav/hilbertresearchfacility) +"l" = ( +/turf/open/floor/plasteel/stairs/right, +/area/ruin/space/has_grav/hilbertresearchfacility) +"m" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"n" = ( +/obj/structure/table/glass, +/obj/item/stock_parts/matter_bin/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"o" = ( +/turf/open/floor/plasteel/vaporwave, +/area/ruin/space/has_grav/hilbertresearchfacility) +"p" = ( +/obj/structure/table/glass, +/obj/item/stack/cable_coil/blue, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"q" = ( +/obj/structure/table/glass, +/obj/item/storage/backpack/holding, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"r" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"s" = ( +/obj/structure/table/glass, +/obj/item/stock_parts/subspace/crystal, +/obj/item/stock_parts/subspace/transmitter, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"t" = ( +/obj/structure/displaycase{ + start_showpiece_type = /obj/item/hilbertshotel + }, +/turf/open/floor/plasteel/vaporwave, +/area/ruin/space/has_grav/hilbertresearchfacility) +"u" = ( +/obj/structure/table/glass, +/obj/item/analyzer, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"v" = ( +/obj/structure/table/glass, +/obj/item/stock_parts/subspace/amplifier, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"w" = ( +/obj/item/paper/crumpled/docslogs, +/obj/item/pen, +/turf/open/floor/plasteel/vaporwave, +/area/ruin/space/has_grav/hilbertresearchfacility) +"x" = ( +/obj/structure/table/glass, +/obj/item/assembly/signaler, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"y" = ( +/obj/structure/table/glass, +/obj/item/slimecross/industrial/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"z" = ( +/obj/machinery/door/airlock/vault{ + name = "secured door"; + req_access = 207 + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"A" = ( +/obj/structure/filingcabinet, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"B" = ( +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"C" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"D" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"E" = ( +/obj/structure/chair/office, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"F" = ( +/obj/machinery/door/window/eastleft, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"G" = ( +/obj/structure/table/reinforced, +/obj/item/pen, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"H" = ( +/obj/structure/table/reinforced, +/obj/item/paper/crumpled/robertsworkjournal, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"I" = ( +/obj/machinery/door/airlock/highsecurity{ + req_access = 207 + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"J" = ( +/turf/closed/mineral/random, +/area/ruin/unpowered/no_grav) +"K" = ( +/turf/open/floor/plasteel/stairs/right{ + initial_gas_mix = "TEMP=2.7" + }, +/area/ruin/unpowered/no_grav) +"U" = ( +/turf/open/floor/plasteel/stairs/medium{ + initial_gas_mix = "TEMP=2.7" + }, +/area/ruin/unpowered/no_grav) +"X" = ( +/turf/open/floor/plasteel/stairs/left{ + initial_gas_mix = "TEMP=2.7" + }, +/area/ruin/unpowered/no_grav) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +a +a +a +a +a +a +b +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +"} +(4,1,1) = {" +a +a +a +J +b +J +b +b +a +b +J +b +b +b +b +a +a +a +a +a +a +a +a +a +a +a +"} +(5,1,1) = {" +a +a +b +J +J +J +b +J +b +J +b +b +J +J +J +b +a +a +a +a +a +a +a +a +a +a +"} +(6,1,1) = {" +a +a +b +c +c +c +c +c +d +d +c +d +d +c +d +d +b +a +a +a +a +a +a +a +a +a +"} +(7,1,1) = {" +a +a +b +d +e +f +f +m +r +g +g +f +f +f +e +c +b +a +a +a +a +a +a +a +a +a +"} +(8,1,1) = {" +a +a +b +d +f +f +f +f +f +f +f +f +f +f +f +d +J +b +b +b +b +b +a +a +a +a +"} +(9,1,1) = {" +a +a +J +d +f +f +f +f +f +f +f +f +f +f +f +c +J +b +b +J +b +b +b +a +a +a +"} +(10,1,1) = {" +a +a +J +c +f +f +f +f +f +f +f +f +f +f +f +c +J +b +J +b +b +J +b +a +a +a +"} +(11,1,1) = {" +a +a +J +c +g +f +f +n +s +v +f +f +f +f +f +c +J +J +J +J +J +J +b +a +a +a +"} +(12,1,1) = {" +a +a +J +c +g +f +j +o +o +o +j +f +f +f +c +d +d +c +c +d +c +J +b +a +a +a +"} +(13,1,1) = {" +a +a +J +c +h +f +k +o +t +o +k +f +f +f +c +A +B +C +B +D +c +J +J +a +a +a +"} +(14,1,1) = {" +a +a +J +c +g +f +l +o +o +w +l +f +f +f +d +B +B +G +B +B +c +J +b +b +a +a +"} +(15,1,1) = {" +a +a +J +c +i +f +f +p +u +x +f +f +f +f +d +B +E +H +B +B +c +J +J +J +a +a +"} +(16,1,1) = {" +a +b +J +c +f +f +f +f +f +f +f +f +f +f +c +B +B +C +B +B +c +b +J +b +a +a +"} +(17,1,1) = {" +a +b +J +d +f +f +f +f +f +f +f +f +f +f +c +C +F +C +B +B +c +b +b +b +a +a +"} +(18,1,1) = {" +a +b +J +d +f +f +f +f +f +f +f +f +f +f +d +B +B +B +B +B +d +b +b +b +b +a +"} +(19,1,1) = {" +a +b +J +d +f +f +f +f +f +f +f +f +f +f +z +B +B +B +B +B +d +b +b +b +b +a +"} +(20,1,1) = {" +a +a +b +c +e +f +g +q +g +y +g +f +e +f +c +B +B +B +B +B +d +b +b +b +b +a +"} +(21,1,1) = {" +a +a +b +c +c +c +c +c +c +d +d +c +c +c +d +B +B +B +B +B +d +X +b +b +b +a +"} +(22,1,1) = {" +a +a +b +b +J +J +b +b +J +J +J +J +J +J +d +D +B +B +B +B +I +U +b +b +b +a +"} +(23,1,1) = {" +a +a +a +b +b +J +J +b +b +b +b +J +b +J +c +d +d +c +d +c +d +K +b +b +b +a +"} +(24,1,1) = {" +a +a +a +a +b +b +J +J +J +b +b +b +b +J +b +b +J +J +J +J +b +b +b +b +b +a +"} +(25,1,1) = {" +a +a +a +a +a +b +b +b +J +J +J +J +b +b +b +b +b +b +a +J +J +J +b +J +b +a +"} +(26,1,1) = {" +a +a +a +a +a +a +a +a +b +b +b +a +b +b +b +b +b +a +a +a +J +J +J +J +J +a +"} +(27,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/hilbertshotel.dmm b/_maps/hilbertshotel.dmm new file mode 100644 index 00000000..4e4d8f82 --- /dev/null +++ b/_maps/hilbertshotel.dmm @@ -0,0 +1,545 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/space/bluespace, +/area/hilbertshotel) +"b" = ( +/turf/closed/indestructible/hotelwall, +/area/hilbertshotel) +"c" = ( +/obj/machinery/jukebox{ + req_access = null + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"d" = ( +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"e" = ( +/obj/structure/table/wood, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"f" = ( +/obj/structure/table/wood, +/obj/structure/showcase/machinery/tv, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"g" = ( +/obj/structure/dresser, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"h" = ( +/obj/structure/table/wood/fancy, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"i" = ( +/obj/structure/table/wood/fancy, +/obj/structure/mirror{ + pixel_y = 24 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"j" = ( +/obj/structure/table/wood/fancy, +/obj/item/flashlight/lamp/green, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"k" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"l" = ( +/obj/structure/table/wood/poker, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"m" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"n" = ( +/obj/effect/landmark/xmastree, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"o" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"p" = ( +/obj/structure/mineral_door/wood, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"q" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"r" = ( +/obj/structure/closet/cabinet{ + anchored = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"s" = ( +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"t" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"u" = ( +/obj/structure/mineral_door/paperframe, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"v" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 32 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"w" = ( +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"x" = ( +/obj/structure/curtain, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"y" = ( +/obj/machinery/door/window/northleft, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"z" = ( +/obj/structure/table/reinforced, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"A" = ( +/obj/structure/mirror{ + pixel_x = -32 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"B" = ( +/obj/structure/chair/stool/bar, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"C" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"D" = ( +/obj/machinery/light_switch{ + pixel_x = 32 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"E" = ( +/obj/structure/table/reinforced, +/obj/item/soap/deluxe, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"F" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"G" = ( +/obj/machinery/light_switch{ + pixel_x = -32 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"H" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"I" = ( +/turf/closed/indestructible/hoteldoor, +/area/hilbertshotel) +"J" = ( +/obj/machinery/light/small, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"K" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"L" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"M" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"N" = ( +/obj/structure/table/reinforced, +/obj/item/soap/deluxe, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"O" = ( +/obj/item/bikehorn/rubberducky, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"P" = ( +/obj/machinery/light/small, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"Q" = ( +/obj/machinery/smartfridge/food, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"R" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"S" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"T" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"U" = ( +/obj/structure/table/reinforced, +/obj/structure/sink/kitchen, +/obj/machinery/light/small, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"V" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/lootdrop/three_course_meal, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +b +b +b +b +b +I +b +b +b +b +b +b +b +a +"} +(3,1,1) = {" +a +b +d +d +k +d +d +t +d +y +t +H +z +b +a +"} +(4,1,1) = {" +a +b +e +d +l +o +d +d +B +z +d +d +z +b +a +"} +(5,1,1) = {" +a +b +f +d +l +o +d +d +B +V +d +d +U +b +a +"} +(6,1,1) = {" +a +b +e +d +l +o +d +d +B +z +d +d +z +b +a +"} +(7,1,1) = {" +a +b +c +d +m +d +D +K +v +z +M +Q +z +b +a +"} +(8,1,1) = {" +a +b +b +b +b +p +b +b +b +b +b +b +b +b +a +"} +(9,1,1) = {" +a +b +g +d +t +d +G +u +w +A +N +A +E +b +a +"} +(10,1,1) = {" +a +b +h +d +d +d +d +b +w +w +w +w +w +b +a +"} +(11,1,1) = {" +a +b +i +d +n +d +J +b +L +w +R +w +P +b +a +"} +(12,1,1) = {" +a +b +h +d +d +d +r +b +x +F +S +T +x +b +a +"} +(13,1,1) = {" +a +b +d +d +d +d +d +b +w +w +w +w +w +b +a +"} +(14,1,1) = {" +a +b +d +j +q +q +s +b +w +C +O +C +w +b +a +"} +(15,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(16,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/hilbertshotelempty.dmm b/_maps/hilbertshotelempty.dmm new file mode 100644 index 00000000..a0482c93 --- /dev/null +++ b/_maps/hilbertshotelempty.dmm @@ -0,0 +1,289 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/space/bluespace, +/area/hilbertshotel) +"b" = ( +/turf/closed/indestructible/hotelwall, +/area/hilbertshotel) +"c" = ( +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"d" = ( +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"e" = ( +/turf/closed/indestructible/hoteldoor, +/area/hilbertshotel) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +b +b +b +b +b +e +b +b +b +b +b +b +b +a +"} +(3,1,1) = {" +a +b +c +c +c +c +c +c +c +c +c +c +c +b +a +"} +(4,1,1) = {" +a +b +c +c +c +c +c +c +c +c +c +c +c +b +a +"} +(5,1,1) = {" +a +b +c +c +c +c +c +c +c +c +c +c +c +b +a +"} +(6,1,1) = {" +a +b +c +c +c +c +c +c +c +c +c +c +c +b +a +"} +(7,1,1) = {" +a +b +c +c +c +c +c +c +c +c +c +c +c +b +a +"} +(8,1,1) = {" +a +b +b +b +b +c +b +b +b +b +b +b +b +b +a +"} +(9,1,1) = {" +a +b +c +c +c +c +c +c +d +d +d +d +d +b +a +"} +(10,1,1) = {" +a +b +c +c +c +c +c +b +d +d +d +d +d +b +a +"} +(11,1,1) = {" +a +b +c +c +c +c +c +b +d +d +d +d +d +b +a +"} +(12,1,1) = {" +a +b +c +c +c +c +c +b +d +d +d +d +d +b +a +"} +(13,1,1) = {" +a +b +c +c +c +c +c +b +d +d +d +d +d +b +a +"} +(14,1,1) = {" +a +b +c +c +c +c +c +b +d +d +d +d +d +b +a +"} +(15,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(16,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/hilbertshotellore.dmm b/_maps/hilbertshotellore.dmm new file mode 100644 index 00000000..f6be66bd --- /dev/null +++ b/_maps/hilbertshotellore.dmm @@ -0,0 +1,639 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/space/bluespace, +/area/hilbertshotel) +"ab" = ( +/turf/closed/indestructible/hotelwall, +/area/hilbertshotel) +"ac" = ( +/obj/structure/table/wood/fancy, +/obj/structure/mirror{ + broken = 1; + desc = "Oh no, seven years of bad luck!"; + icon_state = "mirror_broke"; + pixel_y = 24 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ad" = ( +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ae" = ( +/obj/structure/table/wood, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"af" = ( +/obj/structure/table/wood, +/obj/structure/showcase/machinery/tv, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ag" = ( +/obj/structure/dresser, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ah" = ( +/obj/structure/table/wood/fancy, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ai" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aj" = ( +/obj/structure/table/wood/fancy, +/obj/item/flashlight/lamp/green, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ak" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"al" = ( +/obj/structure/table/wood/poker, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"am" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"an" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ap" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aq" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ar" = ( +/obj/structure/mineral_door/wood, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"as" = ( +/turf/closed/indestructible/hoteldoor, +/area/hilbertshotel) +"at" = ( +/obj/effect/decal/cleanable/cobweb, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"au" = ( +/obj/machinery/light_switch{ + pixel_x = -32 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"av" = ( +/obj/machinery/light/small, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aw" = ( +/obj/structure/closet/cabinet{ + anchored = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ax" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ay" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"az" = ( +/obj/structure/mineral_door/paperframe, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aA" = ( +/obj/structure/chair/stool/bar, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aB" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 32 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aC" = ( +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aD" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aE" = ( +/obj/structure/curtain, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aF" = ( +/obj/machinery/door/window/northleft, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aG" = ( +/obj/structure/table/reinforced, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aH" = ( +/obj/structure/table/reinforced, +/obj/item/pen, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aI" = ( +/obj/structure/mirror{ + pixel_x = -32 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aJ" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aK" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aL" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aM" = ( +/obj/structure/table/wood/poker, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aN" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aO" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aP" = ( +/obj/item/bikehorn/rubberducky, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aQ" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aR" = ( +/obj/machinery/smartfridge/food, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aS" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aT" = ( +/obj/structure/table/reinforced, +/obj/structure/sink/kitchen, +/obj/machinery/light/small, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aU" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aV" = ( +/obj/machinery/light/small, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aW" = ( +/obj/machinery/jukebox{ + req_access = null + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aX" = ( +/obj/machinery/light_switch{ + pixel_x = 32 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aY" = ( +/obj/structure/chair/stool/bar, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/vomit, +/obj/effect/mob_spawn/human/doctorhilbert, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aZ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"ba" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"bb" = ( +/obj/structure/mirror{ + pixel_x = -32 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"bc" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"bd" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"be" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"bf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"bg" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"bh" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/item/soap/homemade{ + name = "used soap" + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"bi" = ( +/obj/effect/decal/cleanable/vomit, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"bj" = ( +/obj/structure/table/reinforced, +/obj/item/soap/homemade{ + name = "used soap" + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"bk" = ( +/obj/structure/table/reinforced, +/obj/item/analyzer/hilbertsanalyzer, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"bl" = ( +/obj/structure/table/reinforced, +/obj/item/paper/crumpled/bloody/docsdeathnote, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +ab +ab +ab +ab +ab +as +ab +ab +ab +ab +ab +ab +ab +aa +"} +(3,1,1) = {" +aa +ab +at +aL +ak +ad +aL +an +ad +aF +be +aQ +aG +ab +aa +"} +(4,1,1) = {" +aa +ab +ae +ad +al +aq +ad +ad +aA +aH +ad +aL +aG +ab +aa +"} +(5,1,1) = {" +aa +ab +af +ad +ai +aq +aL +ad +aY +bl +ad +aL +aT +ab +aa +"} +(6,1,1) = {" +aa +ab +ae +ad +aM +aq +ad +ad +aA +bk +bf +bf +aG +ab +aa +"} +(7,1,1) = {" +aa +ab +aW +aL +am +ad +aX +ay +aB +aG +bg +aR +aG +ab +aa +"} +(8,1,1) = {" +aa +ab +ab +ab +ab +ar +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(9,1,1) = {" +aa +ab +ag +ad +an +ad +au +az +aC +bb +bh +aI +bj +ab +aa +"} +(10,1,1) = {" +aa +ab +ah +ad +aL +aL +ad +ab +aZ +aZ +aC +aZ +aZ +ab +aa +"} +(11,1,1) = {" +aa +ab +ac +ad +ad +aL +av +ab +aD +aC +aN +bi +aV +ab +aa +"} +(12,1,1) = {" +aa +ab +ah +ad +aL +ad +aw +ab +aE +aJ +aO +aS +aE +ab +aa +"} +(13,1,1) = {" +aa +ab +ad +ad +aL +ad +ad +ab +aC +bc +aZ +aZ +aC +ab +aa +"} +(14,1,1) = {" +aa +ab +ax +aj +ap +aU +ah +ab +ba +bd +aP +aK +aC +ab +aa +"} +(15,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(16,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/hilbertshotelstorage.dmm b/_maps/hilbertshotelstorage.dmm new file mode 100644 index 00000000..756e2e51 --- /dev/null +++ b/_maps/hilbertshotelstorage.dmm @@ -0,0 +1,23 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/hotelwall, +/area/hilbertshotelstorage) +"b" = ( +/turf/open/indestructible/hotelwood, +/area/hilbertshotelstorage) + +(1,1,1) = {" +a +a +a +"} +(2,1,1) = {" +a +b +a +"} +(3,1,1) = {" +a +a +a +"} diff --git a/_maps/hilbertshoteltestingsite.dmm b/_maps/hilbertshoteltestingsite.dmm new file mode 100644 index 00000000..a89d1422 --- /dev/null +++ b/_maps/hilbertshoteltestingsite.dmm @@ -0,0 +1,970 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/space/basic, +/area/template_noop) +"b" = ( +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"c" = ( +/turf/closed/wall/r_wall/rust, +/area/ruin/space/has_grav/hilbertresearchfacility) +"d" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/hilbertresearchfacility) +"e" = ( +/obj/machinery/porta_turret/syndicate{ + desc = "A ballistic machine gun auto-turret that fires bluespace bullets."; + lethal_projectile = /obj/item/projectile/magic/teleport; + name = "displacement turret"; + stun_projectile = /obj/item/projectile/magic/teleport + }, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"f" = ( +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"g" = ( +/obj/structure/table/glass, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"h" = ( +/obj/structure/table/glass, +/obj/item/stack/sheet/bluespace_crystal{ + amount = 37 + }, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"i" = ( +/obj/structure/table/glass, +/obj/item/bodybag/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"j" = ( +/turf/open/floor/plasteel/stairs/left, +/area/ruin/space/has_grav/hilbertresearchfacility) +"k" = ( +/turf/open/floor/plasteel/stairs/medium, +/area/ruin/space/has_grav/hilbertresearchfacility) +"l" = ( +/turf/open/floor/plasteel/stairs/right, +/area/ruin/space/has_grav/hilbertresearchfacility) +"m" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"n" = ( +/obj/structure/table/glass, +/obj/item/stock_parts/matter_bin/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"o" = ( +/turf/open/floor/plasteel/vaporwave, +/area/ruin/space/has_grav/hilbertresearchfacility) +"p" = ( +/obj/structure/table/glass, +/obj/item/stack/cable_coil/blue, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"q" = ( +/obj/structure/table/glass, +/obj/item/storage/backpack/holding, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"r" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"s" = ( +/obj/structure/table/glass, +/obj/item/stock_parts/subspace/crystal, +/obj/item/stock_parts/subspace/transmitter, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"t" = ( +/obj/structure/displaycase{ + start_showpiece_type = /obj/item/hilbertshotel + }, +/turf/open/floor/plasteel/vaporwave, +/area/ruin/space/has_grav/hilbertresearchfacility) +"u" = ( +/obj/structure/table/glass, +/obj/item/analyzer, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"v" = ( +/obj/structure/table/glass, +/obj/item/stock_parts/subspace/amplifier, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"w" = ( +/obj/item/paper/crumpled/docslogs, +/obj/item/pen, +/turf/open/floor/plasteel/vaporwave, +/area/ruin/space/has_grav/hilbertresearchfacility) +"x" = ( +/obj/structure/table/glass, +/obj/item/assembly/signaler, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"y" = ( +/obj/structure/table/glass, +/obj/item/slimecross/industrial/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"z" = ( +/obj/machinery/door/airlock/vault{ + name = "secured door"; + req_access = 207 + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"A" = ( +/obj/structure/filingcabinet, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"B" = ( +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"C" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"D" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"E" = ( +/obj/structure/chair/office, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"F" = ( +/obj/machinery/door/window/eastleft, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"G" = ( +/obj/structure/table/reinforced, +/obj/item/pen, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"H" = ( +/obj/structure/table/reinforced, +/obj/item/paper/crumpled/robertsworkjournal, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"I" = ( +/obj/machinery/door/airlock/highsecurity{ + req_access = 207 + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"J" = ( +/turf/closed/mineral/random, +/area/ruin/unpowered/no_grav) +"K" = ( +/turf/open/floor/plasteel/stairs/right{ + initial_gas_mix = "TEMP=2.7" + }, +/area/ruin/unpowered/no_grav) +"U" = ( +/turf/open/floor/plasteel/stairs/medium{ + initial_gas_mix = "TEMP=2.7" + }, +/area/ruin/unpowered/no_grav) +"X" = ( +/turf/open/floor/plasteel/stairs/left{ + initial_gas_mix = "TEMP=2.7" + }, +/area/ruin/unpowered/no_grav) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +a +a +a +a +a +a +b +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +"} +(4,1,1) = {" +a +a +a +J +b +J +b +b +a +b +J +b +b +b +b +a +a +a +a +a +a +a +a +a +a +a +"} +(5,1,1) = {" +a +a +b +J +J +J +b +J +b +J +b +b +J +J +J +b +a +a +a +a +a +a +a +a +a +a +"} +(6,1,1) = {" +a +a +b +c +c +c +c +c +d +d +c +d +d +c +d +d +b +a +a +a +a +a +a +a +a +a +"} +(7,1,1) = {" +a +a +b +d +e +f +f +m +r +g +g +f +f +f +e +c +b +a +a +a +a +a +a +a +a +a +"} +(8,1,1) = {" +a +a +b +d +f +f +f +f +f +f +f +f +f +f +f +d +J +b +b +b +b +b +a +a +a +a +"} +(9,1,1) = {" +a +a +J +d +f +f +f +f +f +f +f +f +f +f +f +c +J +b +b +J +b +b +b +a +a +a +"} +(10,1,1) = {" +a +a +J +c +f +f +f +f +f +f +f +f +f +f +f +c +J +b +J +b +b +J +b +a +a +a +"} +(11,1,1) = {" +a +a +J +c +g +f +f +n +s +v +f +f +f +f +f +c +J +J +J +J +J +J +b +a +a +a +"} +(12,1,1) = {" +a +a +J +c +g +f +j +o +o +o +j +f +f +f +c +d +d +c +c +d +c +J +b +a +a +a +"} +(13,1,1) = {" +a +a +J +c +h +f +k +o +t +o +k +f +f +f +c +A +B +C +B +D +c +J +J +a +a +a +"} +(14,1,1) = {" +a +a +J +c +g +f +l +o +o +w +l +f +f +f +d +B +B +G +B +B +c +J +b +b +a +a +"} +(15,1,1) = {" +a +a +J +c +i +f +f +p +u +x +f +f +f +f +d +B +E +H +B +B +c +J +J +J +a +a +"} +(16,1,1) = {" +a +b +J +c +f +f +f +f +f +f +f +f +f +f +c +B +B +C +B +B +c +b +J +b +a +a +"} +(17,1,1) = {" +a +b +J +d +f +f +f +f +f +f +f +f +f +f +c +C +F +C +B +B +c +b +b +b +a +a +"} +(18,1,1) = {" +a +b +J +d +f +f +f +f +f +f +f +f +f +f +d +B +B +B +B +B +d +b +b +b +b +a +"} +(19,1,1) = {" +a +b +J +d +f +f +f +f +f +f +f +f +f +f +z +B +B +B +B +B +d +b +b +b +b +a +"} +(20,1,1) = {" +a +a +b +c +e +f +g +q +g +y +g +f +e +f +c +B +B +B +B +B +d +b +b +b +b +a +"} +(21,1,1) = {" +a +a +b +c +c +c +c +c +c +d +d +c +c +c +d +B +B +B +B +B +d +X +b +b +b +a +"} +(22,1,1) = {" +a +a +b +b +J +J +b +b +J +J +J +J +J +J +d +D +B +B +B +B +I +U +b +b +b +a +"} +(23,1,1) = {" +a +a +a +b +b +J +J +b +b +b +b +J +b +J +c +d +d +c +d +c +d +K +b +b +b +a +"} +(24,1,1) = {" +a +a +a +a +b +b +J +J +J +b +b +b +b +J +b +b +J +J +J +J +b +b +b +b +b +a +"} +(25,1,1) = {" +a +a +a +a +a +b +b +b +J +J +J +J +b +b +b +b +b +b +a +J +J +J +b +J +b +a +"} +(26,1,1) = {" +a +a +a +a +a +a +a +a +b +b +b +a +b +b +b +b +b +a +a +a +J +J +J +J +J +a +"} +(27,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index b0fcc4dc..4c553c8f 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -550,8 +550,8 @@ "akD" = (/obj/structure/cable{icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/security/brig) "akE" = (/obj/machinery/door/airlock/security/glass{name = "Brig Desk"; req_access_txt = "1"},/obj/structure/cable{icon_state = "4-8"},/obj/structure/cable{icon_state = "2-8"},/turf/open/floor/plasteel/dark,/area/security/brig) "akF" = (/obj/structure/cable{icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"},/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/security/brig) -"akG" = (/obj/effect/mapping_helpers/airlock/cyclelink_helper,/obj/machinery/door/airlock/security/glass{id_tag = "innerbrig"; name = "Brig"; req_access_txt = "63"},/obj/structure/cable{icon_state = "4-8"},/obj/effect/turf_decal/tile/red{dir = 1},/obj/effect/turf_decal/tile/red{dir = 4},/obj/effect/turf_decal/tile/red{dir = 8},/turf/open/floor/plasteel,/area/security/brig) -"akH" = (/obj/effect/mapping_helpers/airlock/cyclelink_helper,/obj/machinery/door/airlock/security/glass{id_tag = "innerbrig"; name = "Brig"; req_access_txt = "63"},/obj/structure/cable{icon_state = "4-8"},/obj/effect/turf_decal/tile/red{dir = 1},/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/red{dir = 4},/turf/open/floor/plasteel,/area/security/brig) +"akG" = (/obj/effect/mapping_helpers/airlock/cyclelink_helper,/obj/machinery/door/airlock/security/glass{bound_width = 64; doorOpen = 'sound/machines/bigairlockopen.ogg'; icon = 'icons/obj/doors/airlocks/station/securitydouble.dmi'; id_tag = "innerbrig"; name = "Brig"; note_overlay_file = 'icons/obj/doors/airlocks/station/overlaysdouble.dmi'; overlays_file = 'icons/obj/doors/airlocks/station/overlaysdouble.dmi'; req_access_txt = "63"},/obj/structure/cable{icon_state = "4-8"},/obj/effect/turf_decal/tile/red{dir = 1},/obj/effect/turf_decal/tile/red{dir = 4},/obj/effect/turf_decal/tile/red{dir = 8},/turf/open/floor/plasteel,/area/security/brig) +"akH" = (/obj/effect/mapping_helpers/airlock/cyclelink_helper,/obj/structure/cable{icon_state = "4-8"},/obj/effect/turf_decal/tile/red{dir = 1},/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/red{dir = 4},/turf/open/floor/plasteel,/area/security/brig) "akI" = (/obj/structure/cable{icon_state = "4-8"},/obj/structure/cable{icon_state = "1-8"},/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/security/brig) "akJ" = (/obj/machinery/door/window/brigdoor/security/cell{id = "Cell 4"; name = "Cell 4"},/obj/structure/cable{icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/red{dir = 8},/turf/open/floor/plasteel,/area/security/brig) "akK" = (/obj/structure/cable{icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/security/brig) @@ -647,8 +647,8 @@ "amw" = (/obj/structure/table/reinforced,/obj/machinery/door/poddoor/shutters/preopen{id = "briggate"; name = "security shutters"},/obj/machinery/door/window/southleft{name = "Brig Desk"; req_access_txt = "1"},/obj/structure/cable{icon_state = "4-8"},/obj/structure/cable{icon_state = "1-8"},/turf/open/floor/plasteel/dark,/area/security/brig) "amx" = (/obj/structure/table/reinforced,/obj/machinery/door/poddoor/shutters/preopen{id = "briggate"; name = "security shutters"},/obj/machinery/door/window/southleft{base_state = "right"; icon_state = "right"; name = "Brig Desk"; req_access_txt = "1"},/obj/structure/cable{icon_state = "4-8"},/turf/open/floor/plasteel/dark,/area/security/brig) "amy" = (/obj/machinery/door/poddoor/preopen{id = "briggate"; name = "security blast door"},/obj/structure/cable{icon_state = "0-8"},/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/security/brig) -"amz" = (/obj/machinery/door/firedoor,/obj/effect/mapping_helpers/airlock/cyclelink_helper{dir = 1},/obj/machinery/door/airlock/security/glass{id_tag = "outerbrig"; name = "Brig"; req_access_txt = "63"},/obj/effect/turf_decal/tile/red{dir = 1},/obj/effect/turf_decal/tile/red{dir = 4},/obj/effect/turf_decal/tile/red{dir = 8},/turf/open/floor/plasteel,/area/security/brig) -"amA" = (/obj/machinery/door/firedoor,/obj/effect/mapping_helpers/airlock/cyclelink_helper{dir = 1},/obj/machinery/door/airlock/security/glass{id_tag = "outerbrig"; name = "Brig"; req_access_txt = "63"},/obj/effect/turf_decal/tile/red{dir = 1},/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/red{dir = 4},/turf/open/floor/plasteel,/area/security/brig) +"amz" = (/obj/machinery/door/firedoor,/obj/effect/mapping_helpers/airlock/cyclelink_helper{dir = 1},/obj/machinery/door/airlock/security/glass{bound_width = 64; doorOpen = 'sound/machines/bigairlockopen.ogg'; icon = 'icons/obj/doors/airlocks/station/securitydouble.dmi'; id_tag = "outerbrig"; name = "Brig"; note_overlay_file = 'icons/obj/doors/airlocks/station/overlaysdouble.dmi'; overlays_file = 'icons/obj/doors/airlocks/station/overlaysdouble.dmi'; req_access_txt = "63"},/obj/effect/turf_decal/tile/red{dir = 1},/obj/effect/turf_decal/tile/red{dir = 4},/obj/effect/turf_decal/tile/red{dir = 8},/turf/open/floor/plasteel,/area/security/brig) +"amA" = (/obj/machinery/door/firedoor,/obj/effect/mapping_helpers/airlock/cyclelink_helper{dir = 1},/obj/effect/turf_decal/tile/red{dir = 1},/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/red{dir = 4},/turf/open/floor/plasteel,/area/security/brig) "amB" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/dark,/area/security/courtroom) "amC" = (/obj/structure/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plasteel/dark,/area/security/courtroom) "amD" = (/obj/structure/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel/dark,/area/security/courtroom) @@ -908,11 +908,11 @@ "arx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/closed/wall,/area/crew_quarters/dorms) "ary" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/obj/effect/turf_decal/tile/neutral{dir = 1},/obj/effect/turf_decal/tile/neutral{dir = 4},/obj/effect/turf_decal/tile/neutral{dir = 8},/turf/open/floor/plasteel,/area/crew_quarters/dorms) "arz" = (/obj/machinery/airalarm{pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/turf_decal/tile/neutral{dir = 1},/obj/effect/turf_decal/tile/neutral,/obj/effect/turf_decal/tile/neutral{dir = 4},/turf/open/floor/plasteel,/area/crew_quarters/dorms) -"arA" = (/obj/structure/chair/stool{pixel_y = 8},/obj/effect/decal/cleanable/semen,/turf/open/floor/wood,/area/crew_quarters/dorms) -"arB" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/components/unary/vent_pump/on,/turf/open/floor/wood,/area/crew_quarters/dorms) -"arC" = (/obj/machinery/airalarm{pixel_y = 23},/obj/structure/closet/secure_closet/personal/cabinet,/obj/effect/decal/cleanable/cobweb/cobweb2,/turf/open/floor/wood,/area/crew_quarters/dorms) -"arD" = (/obj/structure/dresser,/turf/open/floor/wood,/area/crew_quarters/dorms) -"arE" = (/obj/machinery/airalarm{pixel_y = 23},/obj/structure/closet/secure_closet/personal/cabinet,/turf/open/floor/wood,/area/crew_quarters/dorms) +"arA" = (/obj/structure/chair/stool{pixel_y = 8},/obj/effect/decal/cleanable/semen,/turf/open/floor/carpet,/area/crew_quarters/dorms) +"arB" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/components/unary/vent_pump/on,/turf/open/floor/carpet,/area/crew_quarters/dorms) +"arC" = (/obj/machinery/airalarm{pixel_y = 23},/obj/structure/closet/secure_closet/personal/cabinet,/obj/effect/decal/cleanable/cobweb/cobweb2,/turf/open/floor/carpet,/area/crew_quarters/dorms) +"arD" = (/obj/structure/dresser,/turf/open/floor/carpet,/area/crew_quarters/dorms) +"arE" = (/obj/machinery/airalarm{pixel_y = 23},/obj/structure/closet/secure_closet/personal/cabinet,/turf/open/floor/carpet,/area/crew_quarters/dorms) "arF" = (/obj/structure/disposalpipe/junction/flip{dir = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{icon_state = "1-2"},/obj/effect/turf_decal/tile/neutral{dir = 1},/obj/effect/turf_decal/tile/neutral{dir = 4},/obj/effect/turf_decal/tile/neutral{dir = 8},/turf/open/floor/plasteel,/area/crew_quarters/fitness) "arG" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal/bin,/obj/effect/turf_decal/tile/neutral{dir = 1},/obj/effect/turf_decal/tile/neutral{dir = 4},/turf/open/floor/plasteel,/area/crew_quarters/fitness) "arH" = (/obj/structure/closet/athletic_mixed,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/effect/turf_decal/tile/neutral{dir = 1},/obj/effect/turf_decal/tile/neutral{dir = 4},/turf/open/floor/plasteel,/area/crew_quarters/fitness) @@ -959,12 +959,12 @@ "asw" = (/obj/machinery/door/airlock{dir = 4; id_tag = "Dorm4"; name = "Dorm 4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel,/area/crew_quarters/dorms) "asx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/turf_decal/tile/neutral{dir = 1},/obj/effect/turf_decal/tile/neutral{dir = 8},/turf/open/floor/plasteel,/area/crew_quarters/dorms) "asy" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/obj/effect/turf_decal/tile/neutral,/obj/effect/turf_decal/tile/neutral{dir = 4},/turf/open/floor/plasteel,/area/crew_quarters/dorms) -"asz" = (/obj/structure/table/wood,/turf/open/floor/wood,/area/crew_quarters/dorms) -"asA" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/wood,/area/crew_quarters/dorms) -"asB" = (/obj/structure/bed,/obj/machinery/button/door{id = "Dorm5"; name = "Cabin Bolt Control"; normaldoorcontrol = 1; pixel_y = -25; specialfunctions = 4},/obj/machinery/atmospherics/components/unary/vent_scrubber/on,/obj/effect/spawner/lootdrop/bedsheet,/turf/open/floor/wood,/area/crew_quarters/dorms) -"asC" = (/turf/open/floor/wood,/area/crew_quarters/dorms) -"asD" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/landmark/event_spawn,/turf/open/floor/wood,/area/crew_quarters/dorms) -"asE" = (/obj/structure/bed,/obj/machinery/button/door{id = "Dorm6"; name = "Cabin Bolt Control"; normaldoorcontrol = 1; pixel_y = -25; specialfunctions = 4},/obj/machinery/atmospherics/components/unary/vent_scrubber/on,/obj/effect/spawner/lootdrop/bedsheet,/turf/open/floor/wood,/area/crew_quarters/dorms) +"asz" = (/obj/structure/table/wood,/turf/open/floor/carpet,/area/crew_quarters/dorms) +"asA" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/carpet,/area/crew_quarters/dorms) +"asB" = (/obj/structure/bed,/obj/machinery/button/door{id = "Dorm5"; name = "Cabin Bolt Control"; normaldoorcontrol = 1; pixel_y = -25; specialfunctions = 4},/obj/machinery/atmospherics/components/unary/vent_scrubber/on,/obj/effect/spawner/lootdrop/bedsheet,/turf/open/floor/carpet,/area/crew_quarters/dorms) +"asC" = (/turf/open/floor/carpet,/area/crew_quarters/dorms) +"asD" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/landmark/event_spawn,/turf/open/floor/carpet,/area/crew_quarters/dorms) +"asE" = (/obj/structure/bed,/obj/machinery/button/door{id = "Dorm6"; name = "Cabin Bolt Control"; normaldoorcontrol = 1; pixel_y = -25; specialfunctions = 4},/obj/machinery/atmospherics/components/unary/vent_scrubber/on,/obj/effect/spawner/lootdrop/bedsheet,/turf/open/floor/carpet,/area/crew_quarters/dorms) "asF" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/obj/structure/cable{icon_state = "1-4"},/obj/effect/turf_decal/tile/neutral{dir = 1},/obj/effect/turf_decal/tile/neutral{dir = 8},/turf/open/floor/plasteel,/area/crew_quarters/fitness) "asG" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1},/obj/structure/cable{icon_state = "2-8"},/turf/open/floor/plasteel,/area/crew_quarters/fitness) "asH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel,/area/crew_quarters/fitness) @@ -1883,7 +1883,7 @@ "aKk" = (/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/blue{dir = 8},/obj/structure/cable{icon_state = "1-2"},/obj/machinery/vending/autodrobe,/turf/open/floor/plasteel,/area/crew_quarters/theatre) "aKl" = (/obj/effect/turf_decal/loading_area{name = "steel pannel"; icon_state = "steel_panel"; dir = 10},/turf/open/floor/plasteel,/area/hallway/primary/central) "aKm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/turf_decal/bot{dir = 2},/obj/structure/cable{icon_state = "1-2"},/turf/closed/wall,/area/maintenance/starboard/fore) -"aKn" = (/obj/structure/cable{icon_state = "1-2"},/turf/open/floor/carpet,/area/crew_quarters/bar) +"aKn" = (/obj/structure/table/reinforced,/obj/item/storage/secure/briefcase,/obj/item/storage/box/PDAs{pixel_x = 4; pixel_y = 4},/obj/item/storage/box/ids,/turf/open/floor/plasteel,/area/bridge) "aKo" = (/obj/machinery/light{dir = 1; pixel_y = 16},/turf/open/floor/wood,/area/crew_quarters/bar) "aKp" = (/obj/machinery/light/small{dir = 8},/obj/structure/dresser,/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/blue{dir = 8},/obj/machinery/airalarm{dir = 4; pixel_x = -22},/turf/open/floor/plasteel,/area/crew_quarters/theatre) "aKq" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 1},/turf/open/floor/wood,/area/crew_quarters/bar) @@ -2229,17 +2229,17 @@ "aQS" = (/obj/structure/cable{icon_state = "1-2"},/obj/effect/spawner/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plating,/area/storage/tools) "aQT" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Auxiliary Tool Storage"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plasteel,/area/storage/tools) "aQU" = (/obj/machinery/light{dir = 8},/obj/effect/turf_decal/loading_area{dir = 8; icon_state = "drain"; name = "drain"},/turf/open/floor/plasteel,/area/hallway/primary/central) -"aQV" = (/obj/structure/table/reinforced,/obj/item/storage/secure/briefcase,/obj/item/storage/box/PDAs{pixel_x = 4; pixel_y = 4},/obj/item/storage/box/ids,/turf/open/floor/plasteel,/area/bridge) -"aQW" = (/obj/machinery/computer/atmos_alert,/obj/effect/turf_decal/tile/yellow{dir = 1},/obj/effect/turf_decal/tile/yellow,/obj/effect/turf_decal/tile/yellow{dir = 8},/turf/open/floor/plasteel,/area/bridge) -"aQX" = (/obj/machinery/computer/station_alert,/obj/effect/turf_decal/tile/yellow,/obj/effect/turf_decal/tile/yellow{dir = 8},/turf/open/floor/plasteel,/area/bridge) -"aQY" = (/obj/machinery/computer/monitor{name = "bridge power monitoring console"},/obj/structure/cable{icon_state = "0-2"},/obj/effect/turf_decal/tile/yellow,/obj/effect/turf_decal/tile/yellow{dir = 4},/obj/effect/turf_decal/tile/yellow{dir = 8},/turf/open/floor/plasteel,/area/bridge) -"aQZ" = (/obj/machinery/computer/shuttle/labor,/obj/effect/turf_decal/tile/blue{dir = 1},/obj/effect/turf_decal/tile/blue,/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel,/area/bridge) -"aRa" = (/obj/machinery/computer/communications,/obj/effect/turf_decal/tile/blue,/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel,/area/bridge) -"aRb" = (/obj/structure/cable{icon_state = "1-2"},/obj/machinery/computer/shuttle/mining,/obj/effect/turf_decal/tile/blue,/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel,/area/bridge) -"aRc" = (/obj/machinery/modular_computer/console/preset/command,/obj/effect/turf_decal/tile/green{dir = 1},/obj/effect/turf_decal/tile/green,/obj/effect/turf_decal/tile/green{dir = 8},/turf/open/floor/plasteel,/area/bridge) -"aRd" = (/obj/machinery/computer/crew,/obj/effect/turf_decal/tile/green,/obj/effect/turf_decal/tile/green{dir = 8},/turf/open/floor/plasteel,/area/bridge) -"aRe" = (/obj/machinery/computer/med_data,/obj/effect/turf_decal/tile/green,/obj/effect/turf_decal/tile/green{dir = 4},/obj/effect/turf_decal/tile/green{dir = 8},/turf/open/floor/plasteel,/area/bridge) -"aRf" = (/obj/structure/table/reinforced,/obj/item/storage/toolbox/emergency,/obj/item/wrench,/obj/item/assembly/timer,/obj/item/assembly/signaler,/obj/item/assembly/signaler,/turf/open/floor/plasteel,/area/bridge) +"aQV" = (/obj/machinery/computer/atmos_alert,/obj/effect/turf_decal/tile/yellow{dir = 1},/obj/effect/turf_decal/tile/yellow,/obj/effect/turf_decal/tile/yellow{dir = 8},/turf/open/floor/plasteel,/area/bridge) +"aQW" = (/obj/machinery/computer/station_alert,/obj/effect/turf_decal/tile/yellow,/obj/effect/turf_decal/tile/yellow{dir = 8},/turf/open/floor/plasteel,/area/bridge) +"aQX" = (/obj/machinery/computer/monitor{name = "bridge power monitoring console"},/obj/structure/cable{icon_state = "0-2"},/obj/effect/turf_decal/tile/yellow,/obj/effect/turf_decal/tile/yellow{dir = 4},/obj/effect/turf_decal/tile/yellow{dir = 8},/turf/open/floor/plasteel,/area/bridge) +"aQY" = (/obj/machinery/computer/shuttle/labor,/obj/effect/turf_decal/tile/blue{dir = 1},/obj/effect/turf_decal/tile/blue,/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel,/area/bridge) +"aQZ" = (/obj/machinery/computer/communications,/obj/effect/turf_decal/tile/blue,/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel,/area/bridge) +"aRa" = (/obj/structure/cable{icon_state = "1-2"},/obj/machinery/computer/shuttle/mining,/obj/effect/turf_decal/tile/blue,/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel,/area/bridge) +"aRb" = (/obj/machinery/modular_computer/console/preset/command,/obj/effect/turf_decal/tile/green{dir = 1},/obj/effect/turf_decal/tile/green,/obj/effect/turf_decal/tile/green{dir = 8},/turf/open/floor/plasteel,/area/bridge) +"aRc" = (/obj/machinery/computer/crew,/obj/effect/turf_decal/tile/green,/obj/effect/turf_decal/tile/green{dir = 8},/turf/open/floor/plasteel,/area/bridge) +"aRd" = (/obj/machinery/computer/med_data,/obj/effect/turf_decal/tile/green,/obj/effect/turf_decal/tile/green{dir = 4},/obj/effect/turf_decal/tile/green{dir = 8},/turf/open/floor/plasteel,/area/bridge) +"aRe" = (/obj/structure/table/reinforced,/obj/item/storage/toolbox/emergency,/obj/item/wrench,/obj/item/assembly/timer,/obj/item/assembly/signaler,/obj/item/assembly/signaler,/turf/open/floor/plasteel,/area/bridge) +"aRf" = (/obj/structure/cable{icon_state = "1-2"},/turf/open/floor/carpet,/area/crew_quarters/bar) "aRg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel/stairs/medium,/area/hallway/primary/central) "aRh" = (/obj/structure/table,/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/cable_coil,/obj/item/assembly/flash/handheld,/obj/item/assembly/flash/handheld,/obj/item/assembly/flash/handheld,/obj/item/assembly/flash/handheld,/obj/item/assembly/flash/handheld,/obj/item/assembly/flash/handheld,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/open/floor/plasteel,/area/science/robotics/lab) "aRi" = (/obj/structure/chair/stool,/turf/open/floor/wood,/area/crew_quarters/bar) @@ -2291,28 +2291,28 @@ "aSc" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/camera{c_tag = "Auxiliary Tool Storage"; dir = 2},/obj/structure/table,/obj/item/stack/sheet/metal/fifty,/obj/item/stack/sheet/metal/fifty,/obj/item/storage/box/lights/mixed,/turf/open/floor/plasteel,/area/storage/tools) "aSd" = (/obj/structure/table,/obj/item/storage/toolbox/emergency,/turf/open/floor/plasteel,/area/storage/tools) "aSe" = (/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/storage/tools) -"aSf" = (/obj/structure/table/reinforced,/obj/item/assembly/flash/handheld,/obj/item/assembly/flash/handheld,/turf/open/floor/plasteel,/area/bridge) -"aSg" = (/obj/effect/turf_decal/tile/yellow{dir = 1},/turf/open/floor/plasteel,/area/bridge) -"aSh" = (/obj/structure/chair{dir = 1; name = "Engineering Station"},/turf/open/floor/plasteel,/area/bridge) -"aSi" = (/obj/structure/cable{icon_state = "1-2"},/obj/effect/turf_decal/tile/yellow{dir = 4},/turf/open/floor/plasteel,/area/bridge) -"aSj" = (/obj/structure/table/reinforced,/obj/item/aicard,/obj/item/multitool,/obj/effect/turf_decal/tile/blue{dir = 1},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel,/area/bridge) -"aSk" = (/obj/structure/chair{dir = 1; name = "Command Station"},/obj/machinery/button/door{id = "bridge blast"; name = "Bridge Blast Door Control"; pixel_x = 28; pixel_y = -2; req_access_txt = "19"},/obj/machinery/keycard_auth{pixel_x = 29; pixel_y = 8},/turf/open/floor/plasteel,/area/bridge) -"aSl" = (/obj/structure/table/reinforced,/obj/structure/cable{icon_state = "1-2"},/obj/effect/turf_decal/tile/blue,/obj/effect/turf_decal/tile/blue{dir = 4},/turf/open/floor/plasteel,/area/bridge) -"aSm" = (/obj/effect/turf_decal/tile/green{dir = 1},/turf/open/floor/plasteel,/area/bridge) -"aSn" = (/obj/structure/chair{dir = 1; name = "Crew Station"},/turf/open/floor/plasteel,/area/bridge) -"aSo" = (/obj/effect/turf_decal/tile/green{dir = 4},/turf/open/floor/plasteel,/area/bridge) -"aSp" = (/obj/structure/table/reinforced,/obj/item/storage/fancy/donut_box,/turf/open/floor/plasteel,/area/bridge) +"aSf" = (/obj/machinery/holopad,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/carpet,/area/crew_quarters/bar) +"aSg" = (/obj/structure/table/reinforced,/obj/item/assembly/flash/handheld,/obj/item/assembly/flash/handheld,/turf/open/floor/plasteel,/area/bridge) +"aSh" = (/obj/effect/turf_decal/tile/yellow{dir = 1},/turf/open/floor/plasteel,/area/bridge) +"aSi" = (/obj/structure/chair{dir = 1; name = "Engineering Station"},/turf/open/floor/plasteel,/area/bridge) +"aSj" = (/obj/structure/cable{icon_state = "1-2"},/obj/effect/turf_decal/tile/yellow{dir = 4},/turf/open/floor/plasteel,/area/bridge) +"aSk" = (/obj/structure/table/reinforced,/obj/item/aicard,/obj/item/multitool,/obj/effect/turf_decal/tile/blue{dir = 1},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel,/area/bridge) +"aSl" = (/obj/structure/chair{dir = 1; name = "Command Station"},/obj/machinery/button/door{id = "bridge blast"; name = "Bridge Blast Door Control"; pixel_x = 28; pixel_y = -2; req_access_txt = "19"},/obj/machinery/keycard_auth{pixel_x = 29; pixel_y = 8},/turf/open/floor/plasteel,/area/bridge) +"aSm" = (/obj/structure/table/reinforced,/obj/structure/cable{icon_state = "1-2"},/obj/effect/turf_decal/tile/blue,/obj/effect/turf_decal/tile/blue{dir = 4},/turf/open/floor/plasteel,/area/bridge) +"aSn" = (/obj/effect/turf_decal/tile/green{dir = 1},/turf/open/floor/plasteel,/area/bridge) +"aSo" = (/obj/structure/chair{dir = 1; name = "Crew Station"},/turf/open/floor/plasteel,/area/bridge) +"aSp" = (/obj/effect/turf_decal/tile/green{dir = 4},/turf/open/floor/plasteel,/area/bridge) "aSq" = (/obj/effect/spawner/structure/window,/obj/machinery/door/poddoor/preopen{id = "barShutters"; name = "privacy shutters"},/turf/open/floor/plating,/area/crew_quarters/bar) "aSr" = (/obj/structure/chair/wood,/turf/open/floor/wood,/area/crew_quarters/bar) "aSs" = (/obj/structure/chair/wood{dir = 4},/turf/open/floor/wood,/area/crew_quarters/bar) "aSt" = (/obj/structure/table/wood,/turf/open/floor/wood,/area/crew_quarters/bar) "aSu" = (/obj/structure/closet/secure_closet/freezer/kitchen,/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/kitchen) -"aSv" = (/obj/structure/table/glass,/obj/item/stock_parts/manipulator,/obj/item/stock_parts/capacitor,/obj/item/stock_parts/capacitor,/obj/item/stock_parts/manipulator,/obj/item/stock_parts/micro_laser,/obj/item/stock_parts/micro_laser,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/stack/cable_coil,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/open/floor/plasteel/white,/area/science/lab) +"aSv" = (/obj/structure/table/reinforced,/obj/item/storage/fancy/donut_box,/turf/open/floor/plasteel,/area/bridge) "aSw" = (/obj/structure/chair/wood{dir = 8},/turf/open/floor/wood,/area/crew_quarters/bar) "aSx" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plasteel/white/corner{dir = 8},/area/science/research) "aSy" = (/obj/structure/table/wood,/obj/item/instrument/guitar{pixel_x = -7},/obj/item/instrument/eguitar{pixel_x = 5},/turf/open/floor/wood,/area/crew_quarters/bar) -"aSz" = (/obj/machinery/holopad,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/carpet,/area/crew_quarters/bar) -"aSA" = (/obj/structure/cable,/turf/open/floor/carpet,/area/crew_quarters/bar) +"aSz" = (/obj/structure/cable,/turf/open/floor/carpet,/area/crew_quarters/bar) +"aSA" = (/obj/effect/landmark/xmastree,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/carpet,/area/crew_quarters/bar) "aSB" = (/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/kitchen) "aSC" = (/obj/machinery/atmospherics/components/unary/vent_pump/on{dir = 4},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/kitchen) "aSD" = (/obj/effect/landmark/start/cook,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/kitchen) @@ -2385,7 +2385,7 @@ "aTS" = (/turf/open/floor/plasteel/stairs/medium,/area/hallway/primary/central) "aTT" = (/obj/structure/table/wood,/obj/item/reagent_containers/food/condiment/peppermill{pixel_x = 5; pixel_y = -2},/turf/open/floor/wood,/area/crew_quarters/bar) "aTU" = (/obj/machinery/light{dir = 4},/obj/machinery/camera{c_tag = "Bar East"; dir = 8},/turf/open/floor/wood,/area/crew_quarters/bar) -"aTV" = (/obj/effect/landmark/xmastree,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/carpet,/area/crew_quarters/bar) +"aTV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/open/floor/carpet,/area/crew_quarters/bar) "aTW" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/turf_decal/tile/yellow{dir = 2},/turf/open/floor/plasteel,/area/hallway/primary/aft) "aTX" = (/obj/structure/table,/obj/item/reagent_containers/food/condiment/enzyme{layer = 5},/obj/item/stack/packageWrap,/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/kitchen) "aTY" = (/obj/structure/table,/obj/item/kitchen/rollingpin,/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/kitchen) @@ -2682,7 +2682,7 @@ "aZD" = (/turf/closed/wall/r_wall,/area/crew_quarters/heads/captain) "aZE" = (/obj/machinery/door/airlock/command{name = "Captain's Office"; req_access_txt = "20"},/obj/structure/cable{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/wood,/area/crew_quarters/heads/captain) "aZF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/closed/wall/r_wall,/area/crew_quarters/heads/captain) -"aZG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/open/floor/carpet,/area/crew_quarters/bar) +"aZG" = (/obj/structure/chair/comfy/brown,/obj/effect/landmark/start/detective,/turf/open/floor/carpet,/area/security/detectives_office) "aZH" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/closet/radiation,/obj/effect/turf_decal/tile/yellow,/obj/effect/turf_decal/tile/yellow{dir = 4},/turf/open/floor/plasteel,/area/engine/engineering) "aZI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/turf_decal/stripes/line{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/open/floor/engine,/area/engine/engineering) "aZJ" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/open/floor/plasteel/dark,/area/engine/engineering) @@ -2729,8 +2729,8 @@ "bay" = (/obj/structure/rack,/obj/item/electronics/apc,/obj/item/stock_parts/cell{maxcharge = 2000},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel,/area/quartermaster/warehouse) "baz" = (/obj/effect/landmark/event_spawn,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plasteel,/area/quartermaster/warehouse) "baA" = (/obj/item/storage/secure/safe{pixel_x = -23},/turf/open/floor/plasteel/grimy,/area/security/detectives_office) -"baB" = (/obj/structure/chair/comfy/brown,/obj/effect/landmark/start/detective,/turf/open/floor/carpet,/area/security/detectives_office) -"baC" = (/obj/structure/table/wood,/obj/item/camera/detective,/turf/open/floor/carpet,/area/security/detectives_office) +"baB" = (/obj/structure/table/wood,/obj/item/camera/detective,/turf/open/floor/carpet,/area/security/detectives_office) +"baC" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk{dir = 4},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) "baD" = (/obj/structure/disposalpipe/segment,/turf/open/floor/plasteel/grimy,/area/security/detectives_office) "baE" = (/obj/machinery/door/airlock{dir = 4; name = "Kitchen"; req_access_txt = "28"},/obj/machinery/door/firedoor,/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/kitchen) "baF" = (/obj/machinery/photocopier,/turf/open/floor/wood,/area/bridge/meeting_room) @@ -2747,14 +2747,14 @@ "baQ" = (/obj/structure/table,/obj/item/folder/blue,/obj/structure/cable{icon_state = "1-2"},/obj/effect/landmark/event_spawn,/turf/open/floor/plasteel/dark,/area/ai_monitored/turret_protected/ai_upload) "baR" = (/obj/structure/table,/obj/machinery/light{dir = 4},/turf/open/floor/plasteel/dark,/area/ai_monitored/turret_protected/ai_upload) "baS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/closed/wall/r_wall,/area/ai_monitored/turret_protected/ai_upload) -"baT" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk{dir = 4},/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"baU" = (/obj/structure/disposalpipe/segment{dir = 9},/obj/structure/cable{icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"baV" = (/obj/machinery/light_switch{pixel_y = 28},/obj/structure/cable{icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"baW" = (/obj/machinery/status_display/ai{pixel_y = 32},/obj/structure/cable{icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/carpet,/area/crew_quarters/heads/captain) -"baX" = (/obj/structure/cable{icon_state = "4-8"},/obj/machinery/computer/security/telescreen/entertainment{pixel_y = 32},/obj/machinery/atmospherics/components/unary/vent_pump/on{dir = 8},/turf/open/floor/carpet,/area/crew_quarters/heads/captain) -"baY" = (/obj/machinery/status_display{pixel_y = 32},/obj/structure/cable{icon_state = "2-8"},/obj/structure/cable{icon_state = "2-4"},/turf/open/floor/carpet,/area/crew_quarters/heads/captain) -"baZ" = (/obj/machinery/power/apc{dir = 1; name = "Captain's Office APC"; areastring = "/area/crew_quarters/heads/captain"; pixel_y = 24},/obj/structure/cable{icon_state = "0-8"},/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bba" = (/turf/open/floor/wood,/area/crew_quarters/heads/captain) +"baT" = (/obj/structure/disposalpipe/segment{dir = 9},/obj/structure/cable{icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"baU" = (/obj/machinery/light_switch{pixel_y = 28},/obj/structure/cable{icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"baV" = (/obj/machinery/power/apc{dir = 1; name = "Captain's Office APC"; areastring = "/area/crew_quarters/heads/captain"; pixel_y = 24},/obj/structure/cable{icon_state = "0-8"},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"baW" = (/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"baX" = (/obj/machinery/status_display/ai{pixel_y = 32},/obj/structure/cable{icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"baY" = (/obj/structure/cable{icon_state = "4-8"},/obj/machinery/computer/security/telescreen/entertainment{pixel_y = 32},/obj/machinery/atmospherics/components/unary/vent_pump/on{dir = 8},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"baZ" = (/obj/structure/table/wood,/obj/machinery/computer/security/wooden_tv,/turf/open/floor/carpet,/area/security/detectives_office) +"bba" = (/obj/structure/table/wood,/obj/item/storage/fancy/cigarettes,/obj/item/clothing/glasses/sunglasses,/turf/open/floor/carpet,/area/security/detectives_office) "bbb" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Diner"},/turf/open/floor/plasteel,/area/crew_quarters/bar) "bbc" = (/obj/structure/sign/barsign,/turf/closed/wall,/area/crew_quarters/bar) "bbd" = (/turf/open/floor/plasteel/white/corner{dir = 1},/area/hallway/primary/starboard) @@ -2779,9 +2779,9 @@ "bbw" = (/obj/structure/closet/crate,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel,/area/quartermaster/warehouse) "bbx" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{dir = 4; name = "Detective's Office"; req_access_txt = "4"},/turf/open/floor/plasteel/grimy,/area/security/detectives_office) "bby" = (/obj/structure/table/wood,/obj/item/reagent_containers/food/drinks/bottle/whiskey{pixel_x = 3},/obj/item/lighter,/turf/open/floor/carpet,/area/security/detectives_office) -"bbz" = (/obj/structure/table/wood,/obj/machinery/computer/security/wooden_tv,/turf/open/floor/carpet,/area/security/detectives_office) -"bbA" = (/obj/structure/table/wood,/obj/item/storage/fancy/cigarettes,/obj/item/clothing/glasses/sunglasses,/turf/open/floor/carpet,/area/security/detectives_office) -"bbB" = (/obj/structure/table/wood,/obj/item/flashlight/lamp/green,/turf/open/floor/carpet,/area/security/detectives_office) +"bbz" = (/obj/machinery/status_display{pixel_y = 32},/obj/structure/cable{icon_state = "2-8"},/obj/structure/cable{icon_state = "2-4"},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bbA" = (/obj/structure/table/wood,/obj/item/flashlight/lamp/green,/turf/open/floor/carpet,/area/security/detectives_office) +"bbB" = (/obj/machinery/vending/cigarette,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) "bbC" = (/obj/effect/spawner/structure/window/reinforced,/obj/machinery/door/poddoor/shutters/preopen{id = "kanyewest"; name = "privacy shutters"},/turf/open/floor/plating,/area/security/detectives_office) "bbD" = (/obj/machinery/door/poddoor/preopen{id = "heads_meeting"; name = "privacy shutters"},/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/bridge/meeting_room) "bbE" = (/obj/machinery/recharger{pixel_y = 4},/obj/structure/table,/turf/open/floor/wood,/area/bridge/meeting_room) @@ -2793,13 +2793,13 @@ "bbK" = (/obj/structure/table,/obj/item/aiModule/supplied/quarantine,/obj/machinery/camera/motion{dir = 4; network = list("aiupload")},/turf/open/floor/plasteel/dark,/area/ai_monitored/turret_protected/ai_upload) "bbL" = (/obj/machinery/holopad,/obj/structure/cable{icon_state = "1-2"},/turf/open/floor/plasteel/dark,/area/ai_monitored/turret_protected/ai_upload) "bbM" = (/obj/structure/table,/obj/item/aiModule/supplied/freeform,/obj/structure/sign/plaques/kiddie{pixel_x = 32},/obj/machinery/camera/motion{dir = 8; network = list("aiupload")},/turf/open/floor/plasteel/dark,/area/ai_monitored/turret_protected/ai_upload) -"bbN" = (/obj/machinery/vending/cigarette,/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bbO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bbP" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bbQ" = (/obj/structure/chair/comfy/brown{dir = 4},/turf/open/floor/carpet,/area/crew_quarters/heads/captain) -"bbR" = (/obj/structure/table/wood,/obj/item/storage/fancy/donut_box,/turf/open/floor/carpet,/area/crew_quarters/heads/captain) -"bbS" = (/obj/structure/chair/comfy/brown{dir = 8},/obj/structure/cable{icon_state = "1-2"},/turf/open/floor/carpet,/area/crew_quarters/heads/captain) -"bbT" = (/obj/structure/displaycase/captain,/turf/open/floor/wood,/area/crew_quarters/heads/captain) +"bbN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bbO" = (/obj/structure/displaycase/captain,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bbP" = (/obj/machinery/computer/arcade,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bbQ" = (/obj/machinery/light{dir = 8},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bbR" = (/obj/structure/chair/comfy/brown{dir = 4},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bbS" = (/obj/structure/table/wood,/obj/item/storage/fancy/donut_box,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bbT" = (/obj/structure/chair,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) "bbU" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Dorm"; location = "HOP2"},/turf/open/floor/plasteel,/area/hallway/primary/central) "bbV" = (/obj/effect/turf_decal/loading_area{dir = 8; icon_state = "drain"; name = "drain"},/turf/open/floor/plasteel,/area/hallway/primary/central) "bbW" = (/obj/machinery/door/firedoor,/turf/open/floor/plasteel,/area/hallway/primary/starboard) @@ -2853,8 +2853,8 @@ "bcS" = (/obj/machinery/airalarm{dir = 4; pixel_x = -23},/obj/machinery/porta_turret/ai{dir = 4},/turf/open/floor/plasteel/dark,/area/ai_monitored/turret_protected/ai_upload) "bcT" = (/obj/effect/turf_decal/bot_white,/obj/effect/turf_decal/tile/neutral{dir = 1},/obj/effect/turf_decal/tile/neutral,/obj/effect/turf_decal/tile/neutral{dir = 4},/obj/effect/turf_decal/tile/neutral{dir = 8},/turf/open/floor/plasteel/dark,/area/ai_monitored/turret_protected/ai_upload) "bcU" = (/obj/structure/cable{icon_state = "1-2"},/turf/open/floor/circuit,/area/ai_monitored/turret_protected/ai_upload) -"bcV" = (/obj/machinery/computer/arcade,/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bcW" = (/obj/structure/table/wood,/turf/open/floor/carpet,/area/crew_quarters/heads/captain) +"bcV" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bcW" = (/obj/structure/chair/comfy/brown{dir = 8},/obj/structure/cable{icon_state = "1-2"},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) "bcX" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 8},/obj/effect/turf_decal/loading_area{dir = 1; icon_state = "drain"; name = "drain"},/turf/open/floor/plasteel,/area/hallway/primary/central) "bcY" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on,/turf/open/floor/plasteel,/area/hallway/primary/starboard) "bcZ" = (/obj/machinery/atmospherics/components/unary/vent_pump/on{dir = 4},/turf/open/floor/plasteel,/area/hallway/primary/starboard) @@ -2902,13 +2902,13 @@ "bdP" = (/obj/machinery/computer/upload/borg{dir = 1},/obj/item/radio/intercom{broadcasting = 1; frequency = 1447; listening = 0; name = "Station Intercom (AI Private)"; pixel_y = -29},/turf/open/floor/circuit,/area/ai_monitored/turret_protected/ai_upload) "bdQ" = (/obj/machinery/light,/obj/machinery/atmospherics/components/unary/vent_pump/on,/turf/open/floor/plasteel/dark,/area/ai_monitored/turret_protected/ai_upload) "bdR" = (/obj/structure/table,/obj/item/aiModule/supplied/oxygen,/obj/item/aiModule/zeroth/oneHuman,/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "High-Risk Modules"; req_access_txt = "20"},/obj/item/aiModule/reset/purge,/obj/structure/window/reinforced,/obj/effect/spawner/lootdrop/aimodule_harmful,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/aiModule/supplied/protectStation,/turf/open/floor/plasteel/dark,/area/ai_monitored/turret_protected/ai_upload) -"bdS" = (/obj/machinery/light{dir = 8},/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bdT" = (/obj/structure/chair,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bdU" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bdV" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/carpet,/area/crew_quarters/heads/captain) -"bdW" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 8},/turf/open/floor/carpet,/area/crew_quarters/heads/captain) -"bdX" = (/obj/structure/cable{icon_state = "1-2"},/turf/open/floor/carpet,/area/crew_quarters/heads/captain) -"bdY" = (/obj/structure/table/wood,/obj/machinery/camera{c_tag = "Captain's Office"; dir = 8},/obj/item/storage/lockbox/medal,/turf/open/floor/wood,/area/crew_quarters/heads/captain) +"bdS" = (/obj/structure/table/wood,/obj/machinery/camera{c_tag = "Captain's Office"; dir = 8},/obj/item/storage/lockbox/medal,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bdT" = (/obj/structure/table/wood,/obj/item/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/pen,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bdU" = (/obj/structure/table/wood,/obj/item/folder/blue,/obj/item/stamp/captain,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bdV" = (/obj/structure/table/wood,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bdW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bdX" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 8},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bdY" = (/obj/structure/table/wood,/obj/item/hand_tele,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) "bdZ" = (/obj/machinery/light{dir = 1; pixel_y = 16},/obj/effect/turf_decal/loading_area{dir = 1; icon_state = "drain"; name = "drain"},/turf/open/floor/plasteel/white/corner{dir = 1},/area/hallway/primary/starboard) "bea" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Stbd"; location = "HOP"},/turf/open/floor/plasteel,/area/hallway/primary/central) "beb" = (/obj/item/twohanded/required/kirbyplants{icon_state = "plant-21"; pixel_x = -3; pixel_y = 3},/turf/open/floor/plasteel,/area/crew_quarters/bar) @@ -2976,13 +2976,13 @@ "bfl" = (/obj/machinery/status_display,/turf/closed/wall/r_wall,/area/ai_monitored/turret_protected/ai_upload) "bfm" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/closed/wall/r_wall,/area/ai_monitored/turret_protected/ai_upload) "bfn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/closed/wall/r_wall,/area/ai_monitored/turret_protected/ai_upload) -"bfo" = (/obj/structure/table/wood,/obj/item/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/pen,/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bfp" = (/obj/structure/table/wood,/obj/item/folder/blue,/obj/item/stamp/captain,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bfq" = (/obj/structure/table/wood,/obj/item/hand_tele,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bfr" = (/obj/structure/table/wood,/obj/item/flashlight/lamp/green,/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bfs" = (/obj/effect/landmark/event_spawn,/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bft" = (/obj/structure/cable{icon_state = "1-2"},/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bfu" = (/obj/structure/table/wood,/obj/item/pinpointer/nuke,/obj/item/disk/nuclear,/obj/item/storage/secure/safe{pixel_x = 35; pixel_y = 5},/obj/machinery/light{dir = 4},/turf/open/floor/wood,/area/crew_quarters/heads/captain) +"bfo" = (/obj/effect/landmark/event_spawn,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bfp" = (/obj/structure/table/wood,/obj/item/pinpointer/nuke,/obj/item/disk/nuclear,/obj/item/storage/secure/safe{pixel_x = 35; pixel_y = 5},/obj/machinery/light{dir = 4},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bfq" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Captain's Desk"; departmentType = 5; name = "Captain RC"; pixel_x = -30},/obj/structure/filingcabinet,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bfr" = (/obj/structure/chair/comfy/brown{dir = 4},/obj/effect/landmark/start/captain,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bfs" = (/obj/machinery/computer/communications{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bft" = (/obj/structure/table/wood,/obj/item/book/manual/wiki/security_space_law,/obj/item/coin/plasma,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bfu" = (/obj/structure/cable{icon_state = "1-2"},/obj/machinery/holopad,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) "bfv" = (/turf/closed/wall,/area/medical/chemistry) "bfw" = (/obj/structure/sign/departments/medbay/alt,/turf/closed/wall,/area/medical/medbay/central) "bfx" = (/obj/effect/spawner/structure/window,/turf/open/floor/plating,/area/medical/medbay/central) @@ -3053,12 +3053,12 @@ "bgK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/closed/wall/r_wall,/area/engine/gravity_generator) "bgL" = (/turf/open/floor/plasteel/dark,/area/engine/gravity_generator) "bgM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/closed/wall/r_wall,/area/engine/gravity_generator) -"bgN" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Captain's Desk"; departmentType = 5; name = "Captain RC"; pixel_x = -30},/obj/structure/filingcabinet,/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bgO" = (/obj/structure/chair/comfy/brown{dir = 4},/obj/effect/landmark/start/captain,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bgP" = (/obj/machinery/computer/communications{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bgQ" = (/obj/structure/table/wood,/obj/item/book/manual/wiki/security_space_law,/obj/item/coin/plasma,/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bgR" = (/obj/structure/cable{icon_state = "1-2"},/obj/machinery/holopad,/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bgS" = (/obj/structure/table/wood,/obj/machinery/airalarm{dir = 8; pixel_x = 24},/obj/item/camera,/obj/item/storage/photo_album{pixel_y = -10},/turf/open/floor/wood,/area/crew_quarters/heads/captain) +"bgN" = (/obj/structure/table/wood,/obj/machinery/airalarm{dir = 8; pixel_x = 24},/obj/item/camera,/obj/item/storage/photo_album{pixel_y = -10},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bgO" = (/obj/item/radio/intercom{dir = 8; freerange = 1; name = "Station Intercom (Command)"; pixel_x = -28},/obj/machinery/suit_storage_unit/captain,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bgP" = (/obj/machinery/computer/card{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bgQ" = (/obj/structure/table/wood,/obj/machinery/recharger,/obj/item/melee/chainofcommand,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bgR" = (/turf/open/floor/plasteel/white,/area/science/lab) +"bgS" = (/obj/structure/chair/stool,/obj/effect/landmark/start/scientist,/turf/open/floor/plasteel/white,/area/science/lab) "bgT" = (/turf/open/floor/plasteel,/area/crew_quarters/bar) "bgU" = (/obj/machinery/door/window/southright{base_state = "left"; dir = 4; icon_state = "left"; name = "Bar Door"; req_one_access_txt = "25;28"},/obj/structure/medkit_cabinet{pixel_y = 27},/turf/open/floor/wood,/area/crew_quarters/bar) "bgV" = (/obj/machinery/power/apc{dir = 1; name = "Chemistry APC"; areastring = "/area/medical/chemistry"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"},/turf/open/floor/plasteel/white,/area/medical/chemistry) @@ -3132,9 +3132,9 @@ "bil" = (/obj/effect/turf_decal/bot_white/right,/obj/effect/turf_decal/tile/neutral{dir = 1},/obj/effect/turf_decal/tile/neutral,/obj/effect/turf_decal/tile/neutral{dir = 4},/obj/effect/turf_decal/tile/neutral{dir = 8},/turf/open/floor/plasteel/dark,/area/engine/gravity_generator) "bim" = (/obj/effect/turf_decal/bot_white,/obj/effect/turf_decal/tile/neutral{dir = 1},/obj/effect/turf_decal/tile/neutral,/obj/effect/turf_decal/tile/neutral{dir = 4},/obj/effect/turf_decal/tile/neutral{dir = 8},/turf/open/floor/plasteel/dark,/area/engine/gravity_generator) "bin" = (/obj/effect/turf_decal/bot_white/left,/obj/effect/turf_decal/tile/neutral{dir = 1},/obj/effect/turf_decal/tile/neutral,/obj/effect/turf_decal/tile/neutral{dir = 4},/obj/effect/turf_decal/tile/neutral{dir = 8},/turf/open/floor/plasteel/dark,/area/engine/gravity_generator) -"bio" = (/obj/item/radio/intercom{dir = 8; freerange = 1; name = "Station Intercom (Command)"; pixel_x = -28},/obj/machinery/suit_storage_unit/captain,/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"bip" = (/obj/machinery/computer/card{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"biq" = (/obj/structure/table/wood,/obj/machinery/recharger,/obj/item/melee/chainofcommand,/turf/open/floor/wood,/area/crew_quarters/heads/captain) +"bio" = (/obj/machinery/camera{c_tag = "Research and Development"; dir = 2; network = list("ss13","rd"); pixel_x = 22},/obj/machinery/button/door{dir = 2; id = "rnd"; name = "Shutters Control Button"; pixel_x = -6; pixel_y = 24; req_access_txt = "47"},/turf/open/floor/plasteel/white,/area/science/lab) +"bip" = (/obj/machinery/newscaster/security_unit{pixel_x = -32},/obj/machinery/keycard_auth{pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"biq" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Captain's Desk Door"; req_access_txt = "20"},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) "bir" = (/obj/machinery/requests_console{department = "Chemistry"; departmentType = 2; pixel_x = -30; receive_ore_updates = 1},/obj/machinery/light{dir = 8},/obj/structure/closet/secure_closet/chemical,/turf/open/floor/plasteel/white,/area/medical/chemistry) "bis" = (/obj/structure/cable{icon_state = "1-2"},/turf/open/floor/plasteel/white,/area/medical/chemistry) "bit" = (/turf/open/floor/plasteel/white,/area/medical/chemistry) @@ -3173,6 +3173,10 @@ "bja" = (/turf/open/floor/wood/cold,/area/crew_quarters/bar) "bjb" = (/obj/structure/chair/wood{dir = 1},/turf/open/floor/wood,/area/crew_quarters/bar) "bjc" = (/obj/structure/table/glass,/obj/item/reagent_containers/glass/beaker/cryoxadone,/obj/item/reagent_containers/glass/beaker/cryoxadone,/turf/open/floor/plasteel,/area/medical/sleeper) +"bjd" = (/obj/structure/cable{icon_state = "1-2"},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bje" = (/obj/structure/cable{icon_state = "1-4"},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bjf" = (/obj/structure/cable{icon_state = "4-8"},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bjg" = (/obj/structure/cable{icon_state = "2-8"},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) "bjh" = (/obj/structure/flora/ausbushes/leafybush,/turf/open/floor/grass,/area/hallway/secondary/exit) "bji" = (/obj/structure/disposalpipe/segment,/obj/effect/turf_decal/loading_area{dir = 8; icon_state = "drain"; name = "drain"},/turf/open/floor/plasteel,/area/hallway/primary/central) "bjj" = (/obj/machinery/vending/cigarette,/turf/open/floor/plasteel,/area/crew_quarters/bar) @@ -3239,10 +3243,10 @@ "bks" = (/obj/structure/closet/emcloset,/obj/effect/turf_decal/stripes/line{dir = 9},/turf/open/floor/plasteel/white,/area/science/research) "bkt" = (/obj/machinery/atmospherics/components/unary/vent_pump/on,/turf/open/floor/plasteel/white,/area/science/research) "bku" = (/obj/machinery/camera{c_tag = "Research Division Access"; dir = 2},/obj/structure/sink{dir = 4; pixel_x = 11},/obj/effect/turf_decal/stripes/line{dir = 5},/turf/open/floor/plasteel/white,/area/science/research) -"bkv" = (/obj/effect/turf_decal/tile/purple{dir = 1},/obj/effect/turf_decal/tile/purple{dir = 4},/turf/open/floor/plasteel/white,/area/science/lab) -"bkw" = (/obj/structure/chair/stool,/obj/effect/landmark/start/scientist,/obj/effect/turf_decal/tile/purple{dir = 1},/obj/effect/turf_decal/tile/purple{dir = 4},/turf/open/floor/plasteel/white,/area/science/lab) -"bkx" = (/obj/machinery/camera{c_tag = "Research and Development"; dir = 2; network = list("ss13","rd"); pixel_x = 22},/obj/machinery/button/door{dir = 2; id = "rnd"; name = "Shutters Control Button"; pixel_x = -6; pixel_y = 24; req_access_txt = "47"},/obj/effect/turf_decal/tile/purple{dir = 1},/turf/open/floor/plasteel/white,/area/science/lab) -"bky" = (/turf/open/floor/plasteel/white,/area/science/lab) +"bkv" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; receive_ore_updates = 1},/turf/open/floor/plasteel/white,/area/science/lab) +"bkw" = (/obj/structure/disposalpipe/segment{dir = 6},/turf/open/floor/plasteel/white,/area/science/lab) +"bkx" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/open/floor/plasteel/white,/area/science/lab) +"bky" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk{dir = 8},/obj/item/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/open/floor/plasteel/white,/area/science/lab) "bkz" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plating,/area/maintenance/starboard) "bkA" = (/obj/docking_port/stationary{dir = 2; dwidth = 11; height = 22; id = "whiteship_home"; name = "SS13: Auxiliary Dock, Station-Port"; width = 35},/turf/open/space/basic,/area/space) "bkB" = (/obj/machinery/conveyor{id = "garbage"},/obj/structure/sign/warning/vacuum{pixel_x = -32},/turf/open/floor/plating,/area/maintenance/disposal) @@ -3283,11 +3287,11 @@ "blk" = (/obj/machinery/power/apc{dir = 1; name = "Central Maintenance APC"; areastring = "/area/maintenance/central"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"},/turf/open/floor/plating,/area/maintenance/central) "bll" = (/obj/structure/closet/wardrobe/black,/turf/open/floor/plating,/area/maintenance/central) "blm" = (/obj/machinery/airalarm{dir = 4; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/wood,/area/bridge/meeting_room) -"bln" = (/obj/machinery/newscaster/security_unit{pixel_x = -32},/obj/machinery/keycard_auth{pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"blo" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Captain's Desk Door"; req_access_txt = "20"},/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"blp" = (/obj/structure/cable{icon_state = "1-4"},/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"blq" = (/obj/structure/cable{icon_state = "4-8"},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/open/floor/wood,/area/crew_quarters/heads/captain) -"blr" = (/obj/structure/cable{icon_state = "2-8"},/turf/open/floor/wood,/area/crew_quarters/heads/captain) +"bln" = (/obj/structure/disposalpipe/segment,/obj/effect/turf_decal/stripes/line{dir = 8},/turf/open/floor/plasteel/white,/area/science/lab) +"blo" = (/obj/machinery/holopad,/turf/open/floor/plasteel/white,/area/science/lab) +"blp" = (/obj/structure/table/glass,/obj/item/reagent_containers/glass/beaker/large{pixel_x = -3; pixel_y = 3},/obj/item/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/reagent_containers/dropper,/obj/machinery/airalarm{dir = 8; pixel_x = 24},/turf/open/floor/plasteel/white,/area/science/lab) +"blq" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/components/unary/vent_pump/on,/obj/effect/turf_decal/stripes/line{dir = 8},/turf/open/floor/plasteel/white,/area/science/lab) +"blr" = (/obj/structure/table/glass,/obj/item/stock_parts/manipulator,/obj/item/stock_parts/capacitor,/obj/item/stock_parts/capacitor,/obj/item/stock_parts/manipulator,/obj/item/stock_parts/micro_laser,/obj/item/stock_parts/micro_laser,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/stack/cable_coil,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/open/floor/plasteel/white,/area/science/lab) "bls" = (/obj/structure/table/glass,/obj/machinery/reagentgrinder,/obj/structure/extinguisher_cabinet{pixel_x = -27},/turf/open/floor/plasteel/white,/area/medical/chemistry) "blt" = (/obj/structure/disposalpipe/segment{dir = 6},/turf/open/floor/plasteel/white,/area/medical/chemistry) "blu" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk{dir = 8},/turf/open/floor/plasteel/white,/area/medical/chemistry) @@ -3316,10 +3320,10 @@ "blR" = (/obj/structure/closet/firecloset,/obj/machinery/light{dir = 8},/obj/effect/turf_decal/stripes/line{dir = 8},/turf/open/floor/plasteel/white,/area/science/research) "blS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel/white,/area/science/research) "blT" = (/obj/machinery/shower{dir = 8},/obj/structure/sign/warning/securearea{pixel_x = 32},/obj/effect/turf_decal/stripes/line{dir = 4},/turf/open/floor/plasteel/white,/area/science/research) -"blU" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; receive_ore_updates = 1},/turf/open/floor/plasteel/white,/area/science/lab) -"blV" = (/obj/structure/disposalpipe/segment{dir = 6},/turf/open/floor/plasteel/white,/area/science/lab) -"blW" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/open/floor/plasteel/white,/area/science/lab) -"blX" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk{dir = 8},/obj/item/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/open/floor/plasteel/white,/area/science/lab) +"blU" = (/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel/white,/area/science/lab) +"blV" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 4},/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel/white,/area/science/lab) +"blW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel/white,/area/science/lab) +"blX" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{icon_state = "2-4"},/obj/effect/turf_decal/stripes/corner{dir = 4},/turf/open/floor/plasteel/white,/area/science/lab) "blY" = (/turf/closed/wall,/area/maintenance/starboard) "blZ" = (/obj/machinery/conveyor{id = "garbage"},/obj/machinery/door/poddoor/preopen{id = "Disposal Exit"; name = "disposal exit vent"},/turf/open/floor/plating,/area/maintenance/disposal) "bma" = (/obj/machinery/button/door{id = "Disposal Exit"; name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 4; req_access_txt = "12"},/obj/machinery/button/massdriver{id = "trash"; pixel_x = -26; pixel_y = -6},/obj/structure/chair/stool,/turf/open/floor/plating,/area/maintenance/disposal) @@ -3393,9 +3397,9 @@ "bnq" = (/obj/machinery/rnd/destructive_analyzer,/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel,/area/science/lab) "bnr" = (/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel,/area/science/lab) "bns" = (/obj/effect/turf_decal/stripes/line{dir = 1},/obj/machinery/rnd/production/protolathe/department/science,/turf/open/floor/plasteel,/area/science/lab) -"bnt" = (/obj/structure/disposalpipe/segment,/obj/effect/turf_decal/stripes/line{dir = 8},/turf/open/floor/plasteel/white,/area/science/lab) -"bnu" = (/obj/machinery/holopad,/turf/open/floor/plasteel/white,/area/science/lab) -"bnv" = (/obj/structure/table/glass,/obj/item/reagent_containers/glass/beaker/large{pixel_x = -3; pixel_y = 3},/obj/item/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/reagent_containers/dropper,/obj/machinery/airalarm{dir = 8; pixel_x = 24},/turf/open/floor/plasteel/white,/area/science/lab) +"bnt" = (/obj/machinery/light/small{dir = 1},/obj/structure/dresser,/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/obj/item/card/id/captains_spare,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bnu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bnv" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/components/unary/vent_pump/on{dir = 8},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) "bnw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plating,/area/maintenance/starboard) "bnx" = (/obj/machinery/light/small{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/open/floor/plating,/area/maintenance/starboard) "bny" = (/obj/effect/mapping_helpers/airlock/cyclelink_helper{dir = 4},/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/open/floor/plating,/area/maintenance/starboard) @@ -3432,9 +3436,9 @@ "bod" = (/obj/effect/turf_decal/loading_area{name = "trim"; icon_state = "trim"; dir = 2},/turf/open/floor/plasteel/dark,/area/engine/gravity_generator) "boe" = (/obj/machinery/light{dir = 4},/obj/effect/turf_decal/loading_area{name = "trim"; icon_state = "trim"; dir = 6},/turf/open/floor/plasteel/dark,/area/engine/gravity_generator) "bof" = (/turf/closed/wall,/area/crew_quarters/heads/captain) -"bog" = (/obj/machinery/light/small{dir = 1},/obj/structure/dresser,/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/obj/item/card/id/captains_spare,/turf/open/floor/carpet,/area/crew_quarters/heads/captain) -"boh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/carpet,/area/crew_quarters/heads/captain) -"boi" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/components/unary/vent_pump/on{dir = 8},/turf/open/floor/carpet,/area/crew_quarters/heads/captain) +"bog" = (/obj/structure/cable{icon_state = "4-8"},/turf/open/floor/plasteel/white,/area/science/lab) +"boh" = (/obj/item/stack/sheet/glass,/obj/structure/table/glass,/obj/item/stack/sheet/glass,/obj/item/stack/sheet/glass,/obj/item/stock_parts/matter_bin,/obj/item/stock_parts/matter_bin,/obj/machinery/light{dir = 4},/obj/item/stock_parts/scanning_module{pixel_x = 2; pixel_y = 3},/obj/item/stock_parts/scanning_module,/obj/machinery/power/apc{dir = 4; name = "Research Lab APC"; areastring = "/area/science/lab"; pixel_x = 26},/obj/structure/cable{icon_state = "0-8"},/turf/open/floor/plasteel/white,/area/science/lab) +"boi" = (/obj/structure/bed,/obj/item/bedsheet/captain,/obj/machinery/airalarm{dir = 4; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) "boj" = (/obj/machinery/door/airlock{dir = 4; name = "Private Restroom"},/turf/open/floor/plasteel/freezer,/area/crew_quarters/heads/captain) "bok" = (/obj/structure/sink{dir = 4; pixel_x = 11},/obj/structure/mirror{pixel_x = 28},/obj/machinery/light/small{dir = 1},/turf/open/floor/plasteel/freezer,/area/crew_quarters/heads/captain) "bol" = (/obj/structure/cable{icon_state = "1-2"},/turf/open/floor/plating,/area/maintenance/central/secondary) @@ -3481,7 +3485,7 @@ "bpa" = (/obj/machinery/computer/rdconsole/core{dir = 4},/turf/open/floor/plasteel,/area/science/lab) "bpb" = (/turf/open/floor/plasteel,/area/science/lab) "bpc" = (/obj/item/reagent_containers/glass/beaker/sulphuric,/obj/machinery/rnd/production/circuit_imprinter/department/science,/turf/open/floor/plasteel,/area/science/lab) -"bpd" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/components/unary/vent_pump/on,/obj/effect/turf_decal/stripes/line{dir = 8},/turf/open/floor/plasteel/white,/area/science/lab) +"bpd" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) "bpe" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment{dir = 5},/obj/structure/cable{icon_state = "1-4"},/turf/open/floor/plating,/area/maintenance/starboard) "bpf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{icon_state = "4-8"},/turf/open/floor/plating,/area/maintenance/starboard) "bpg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 10},/obj/structure/cable{icon_state = "2-8"},/turf/open/floor/plating,/area/maintenance/starboard) @@ -3501,7 +3505,7 @@ "bpu" = (/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/quartermaster/office) "bpv" = (/obj/machinery/computer/cargo/request,/turf/open/floor/plasteel,/area/quartermaster/office) "bpw" = (/turf/open/floor/plasteel,/area/quartermaster/office) -"bpx" = (/obj/machinery/autolathe{name = "public autolathe"},/turf/open/floor/plasteel,/area/quartermaster/office) +"bpx" = (/obj/structure/table/wood,/obj/item/flashlight/lamp/green,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) "bpy" = (/obj/machinery/firealarm{pixel_y = 27},/turf/open/floor/plasteel,/area/quartermaster/office) "bpz" = (/obj/effect/spawner/structure/window,/turf/open/floor/plating,/area/quartermaster/office) "bpA" = (/obj/structure/cable{icon_state = "1-2"},/turf/open/floor/plasteel,/area/hallway/primary/central) @@ -3515,9 +3519,9 @@ "bpI" = (/obj/structure/cable{icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"},/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/engine/gravity_generator) "bpJ" = (/obj/structure/cable{icon_state = "4-8"},/obj/machinery/door/airlock/engineering/glass{name = "Gravity Generator"; req_access_txt = "11"},/turf/open/floor/plasteel/dark,/area/engine/gravity_generator) "bpK" = (/obj/structure/sign/warning/radiation/rad_area{pixel_x = 32},/obj/structure/cable{icon_state = "0-2"},/obj/structure/cable{icon_state = "0-8"},/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/engine/gravity_generator) -"bpL" = (/obj/structure/bed,/obj/item/bedsheet/captain,/obj/machinery/airalarm{dir = 4; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/carpet,/area/crew_quarters/heads/captain) -"bpM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/carpet,/area/crew_quarters/heads/captain) -"bpN" = (/obj/structure/table/wood,/obj/item/flashlight/lamp/green,/turf/open/floor/carpet,/area/crew_quarters/heads/captain) +"bpL" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/hop) +"bpM" = (/obj/structure/disposalpipe/segment{dir = 9},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/hop) +"bpN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/hop) "bpO" = (/obj/structure/toilet{dir = 4},/turf/open/floor/plasteel/freezer,/area/crew_quarters/heads/captain) "bpP" = (/obj/structure/cable{icon_state = "1-2"},/obj/machinery/power/apc{dir = 8; name = "Central Maintenance APC"; areastring = "/area/maintenance/central/secondary"; pixel_x = -24},/obj/structure/cable{icon_state = "0-2"},/turf/open/floor/plating,/area/maintenance/central/secondary) "bpQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/turf_decal/loading_area{dir = 4; icon_state = "drain"; name = "drain"},/turf/open/floor/plasteel,/area/hallway/primary/central) @@ -3550,12 +3554,12 @@ "bqr" = (/obj/machinery/door/firedoor/heavy,/obj/machinery/door/poddoor/preopen{id = "Biohazard"; name = "biohazard containment door"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/turf_decal/bot,/turf/open/floor/plasteel,/area/science/research) "bqs" = (/obj/machinery/door/firedoor/heavy,/obj/machinery/door/poddoor/preopen{id = "Biohazard"; name = "biohazard containment door"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/turf_decal/bot,/turf/open/floor/plasteel,/area/science/research) "bqt" = (/turf/closed/wall,/area/science/lab) -"bqu" = (/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel/white,/area/science/lab) -"bqv" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 4},/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel/white,/area/science/lab) -"bqw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel/white,/area/science/lab) -"bqx" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{icon_state = "2-4"},/obj/effect/turf_decal/stripes/corner{dir = 4},/turf/open/floor/plasteel/white,/area/science/lab) -"bqy" = (/obj/structure/cable{icon_state = "4-8"},/turf/open/floor/plasteel/white,/area/science/lab) -"bqz" = (/obj/item/stack/sheet/glass,/obj/structure/table/glass,/obj/item/stack/sheet/glass,/obj/item/stack/sheet/glass,/obj/item/stock_parts/matter_bin,/obj/item/stock_parts/matter_bin,/obj/machinery/light{dir = 4},/obj/item/stock_parts/scanning_module{pixel_x = 2; pixel_y = 3},/obj/item/stock_parts/scanning_module,/obj/machinery/power/apc{dir = 4; name = "Research Lab APC"; areastring = "/area/science/lab"; pixel_x = 26},/obj/structure/cable{icon_state = "0-8"},/turf/open/floor/plasteel/white,/area/science/lab) +"bqu" = (/obj/item/folder/white,/obj/structure/table,/obj/item/disk/tech_disk,/obj/item/disk/tech_disk,/obj/item/disk/design_disk,/obj/item/disk/design_disk,/turf/open/floor/plasteel/white,/area/science/lab) +"bqv" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/stock_parts/cell/high/plus,/obj/item/stock_parts/cell/high/plus,/turf/open/floor/plasteel/white,/area/science/lab) +"bqw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plasteel/white,/area/science/lab) +"bqx" = (/obj/structure/closet/secure_closet/captains,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 4},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bqy" = (/obj/structure/chair/comfy/brown{dir = 4},/obj/machinery/camera{c_tag = "Captain's Quarters"; dir = 1},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) +"bqz" = (/obj/structure/table/wood,/obj/item/storage/box/matches,/obj/item/razor{pixel_x = -4; pixel_y = 2},/obj/item/clothing/mask/cigarette/cigar,/obj/item/reagent_containers/food/drinks/flask/gold,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/captain) "bqA" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/plasticflaps/opaque,/turf/open/floor/plating,/area/science/lab) "bqB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/closed/wall,/area/science/lab) "bqC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 5},/obj/structure/cable{icon_state = "1-4"},/turf/open/floor/plating,/area/maintenance/starboard) @@ -3580,16 +3584,16 @@ "bqV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel,/area/hallway/primary/central) "bqW" = (/obj/structure/table/reinforced,/obj/machinery/door/window/northleft{dir = 8; icon_state = "left"; name = "Reception Window"},/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 4; icon_state = "rightsecure"; name = "Head of Personnel's Desk"; req_access = null; req_access_txt = "57"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/flasher{id = "hopflash"; pixel_y = 28},/obj/machinery/door/poddoor/shutters/preopen{id = "hop"; name = "Privacy Shutters"},/turf/open/floor/plasteel,/area/crew_quarters/heads/hop) "bqX" = (/obj/structure/chair/office/dark{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 1},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel,/area/crew_quarters/heads/hop) -"bqY" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/open/floor/carpet,/area/crew_quarters/heads/hop) -"bqZ" = (/obj/structure/disposalpipe/segment{dir = 9},/turf/open/floor/carpet,/area/crew_quarters/heads/hop) -"bra" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/carpet,/area/crew_quarters/heads/hop) +"bqY" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{icon_state = "1-2"},/turf/open/floor/plasteel/white,/area/science/lab) +"bqZ" = (/obj/machinery/light_switch{pixel_y = -23},/turf/open/floor/plasteel/white,/area/science/lab) +"bra" = (/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/hop) "brb" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel,/area/crew_quarters/heads/hop) "brc" = (/obj/structure/chair/office/light,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/effect/turf_decal/stripes/line{dir = 9},/turf/open/floor/plasteel,/area/engine/gravity_generator) "brd" = (/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel,/area/engine/gravity_generator) "bre" = (/obj/machinery/airalarm{dir = 8; pixel_x = 24},/obj/structure/cable{icon_state = "1-2"},/obj/effect/turf_decal/stripes/line{dir = 5},/turf/open/floor/plasteel,/area/engine/gravity_generator) -"brf" = (/obj/structure/closet/secure_closet/captains,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 4},/turf/open/floor/carpet,/area/crew_quarters/heads/captain) -"brg" = (/obj/structure/chair/comfy/brown{dir = 4},/obj/machinery/camera{c_tag = "Captain's Quarters"; dir = 1},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/open/floor/carpet,/area/crew_quarters/heads/captain) -"brh" = (/obj/structure/table/wood,/obj/item/storage/box/matches,/obj/item/razor{pixel_x = -4; pixel_y = 2},/obj/item/clothing/mask/cigarette/cigar,/obj/item/reagent_containers/food/drinks/flask/gold,/turf/open/floor/carpet,/area/crew_quarters/heads/captain) +"brf" = (/obj/machinery/holopad,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/hop) +"brg" = (/obj/structure/cable{icon_state = "4-8"},/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/hop) +"brh" = (/obj/structure/cable{icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/carpet/royalblue,/area/crew_quarters/heads/hop) "bri" = (/obj/machinery/shower{dir = 1},/obj/item/soap/deluxe,/obj/item/bikehorn/rubberducky,/obj/structure/curtain,/turf/open/floor/plasteel/freezer,/area/crew_quarters/heads/captain) "brj" = (/obj/structure/closet/wardrobe/chemistry_white,/obj/machinery/light_switch{pixel_x = -23},/turf/open/floor/plasteel/white,/area/medical/chemistry) "brk" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/table,/obj/item/book/manual/wiki/chemistry,/obj/item/book/manual/wiki/chemistry{pixel_x = 3; pixel_y = 3},/turf/open/floor/plasteel/white,/area/medical/chemistry) @@ -3631,11 +3635,11 @@ "brU" = (/obj/machinery/door/poddoor/shutters/preopen{id = "robotics2"; name = "robotics lab shutters"},/obj/effect/spawner/structure/window,/obj/machinery/door/poddoor/shutters/preopen{id = "robotics2"; name = "robotics lab shutters"},/turf/open/floor/plating,/area/science/robotics/lab) "brV" = (/turf/open/floor/plasteel/white/corner{dir = 2},/area/science/research) "brW" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel/white/side{dir = 2},/area/science/research) -"brX" = (/obj/item/folder/white,/obj/structure/table,/obj/item/disk/tech_disk,/obj/item/disk/tech_disk,/obj/item/disk/design_disk,/obj/item/disk/design_disk,/turf/open/floor/plasteel/white,/area/science/lab) -"brY" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/stock_parts/cell/high/plus,/obj/item/stock_parts/cell/high/plus,/turf/open/floor/plasteel/white,/area/science/lab) -"brZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plasteel/white,/area/science/lab) -"bsa" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{icon_state = "1-2"},/turf/open/floor/plasteel/white,/area/science/lab) -"bsb" = (/obj/machinery/light_switch{pixel_y = -23},/obj/effect/turf_decal/loading_area{dir = 8},/turf/open/floor/plasteel/white,/area/science/lab) +"brX" = (/obj/structure/filingcabinet/chestdrawer,/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) +"brY" = (/obj/structure/table,/obj/machinery/computer/security/telescreen/rd,/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) +"brZ" = (/obj/machinery/computer/aifixer{dir = 8},/obj/machinery/requests_console{announcementConsole = 1; department = "Research Director's Desk"; departmentType = 5; name = "Research Director RC"; pixel_x = -2; pixel_y = 30; receive_ore_updates = 1},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) +"bsa" = (/obj/structure/table,/obj/machinery/button/door{id = "Biohazard"; name = "Biohazard Shutter Control"; pixel_x = -5; pixel_y = 5; req_access_txt = "47"},/obj/machinery/button/door{id = "rnd2"; name = "Research Lab Shutter Control"; pixel_x = 5; pixel_y = 5; req_access_txt = "47"},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) +"bsb" = (/obj/structure/chair/office/light{dir = 8},/obj/effect/landmark/start/research_director,/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) "bsc" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Research Division Delivery"; req_access_txt = "47"},/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel,/area/science/lab) "bsd" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; dir = 8; freq = 1400; location = "Research Division"},/obj/effect/turf_decal/bot,/turf/open/floor/plasteel,/area/science/lab) "bse" = (/turf/closed/wall/r_wall,/area/science/explab) @@ -3660,8 +3664,8 @@ "bsx" = (/obj/effect/turf_decal/bot,/turf/open/floor/plasteel,/area/hallway/primary/central) "bsy" = (/obj/structure/cable{icon_state = "0-2"},/obj/machinery/door/poddoor/shutters/preopen{id = "hop"; name = "Privacy Shutters"},/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/crew_quarters/heads/hop) "bsz" = (/obj/machinery/computer/card{dir = 1},/obj/effect/turf_decal/tile/blue{dir = 1},/obj/effect/turf_decal/tile/blue,/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel,/area/crew_quarters/heads/hop) -"bsA" = (/turf/open/floor/carpet,/area/crew_quarters/heads/hop) -"bsB" = (/obj/machinery/holopad,/turf/open/floor/carpet,/area/crew_quarters/heads/hop) +"bsA" = (/obj/machinery/computer/robotics{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) +"bsB" = (/obj/structure/table,/obj/item/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/pen,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/folder/white,/obj/item/stamp/rd{pixel_x = 3; pixel_y = -2},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) "bsC" = (/obj/machinery/airalarm{dir = 8; pixel_x = 24},/obj/structure/cable{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel,/area/crew_quarters/heads/hop) "bsD" = (/obj/structure/cable{icon_state = "0-4"},/obj/machinery/power/apc{dir = 8; name = "Gravity Generator APC"; areastring = "/area/engine/gravity_generator"; pixel_x = -25; pixel_y = 1},/obj/structure/table,/obj/item/paper/guides/jobs/engi/gravity_gen{layer = 3},/obj/item/pen/blue,/obj/item/radio/intercom{name = "Station Intercom (General)"; pixel_y = -35},/turf/open/floor/plasteel,/area/engine/gravity_generator) "bsE" = (/obj/structure/cable{icon_state = "4-8"},/turf/open/floor/plasteel,/area/engine/gravity_generator) @@ -3681,6 +3685,7 @@ "bsS" = (/obj/effect/turf_decal/loading_area{dir = 1; icon_state = "drain"; name = "drain"},/turf/open/floor/plasteel/white,/area/medical/medbay/central) "bsT" = (/obj/effect/turf_decal/loading_area{dir = 1; icon_state = "drain"; name = "drain"},/mob/living/simple_animal/bot/cleanbot{name = "C.L.E.A.N."},/turf/open/floor/plasteel/white,/area/medical/medbay/central) "bsU" = (/obj/effect/turf_decal/loading_area{dir = 1; icon_state = "drain"; name = "drain"},/obj/effect/turf_decal/loading_area{dir = 1; icon_state = "drain"; name = "drain"},/obj/machinery/requests_console{announcementConsole = 0; department = "Medbay"; departmentType = 1; name = "Medbay RC"; pixel_x = 0; pixel_y = 24},/turf/open/floor/plasteel/white,/area/medical/medbay/central) +"bsV" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) "bsW" = (/obj/structure/disposalpipe/segment,/turf/open/floor/plasteel/white,/area/medical/medbay/central) "bsX" = (/obj/structure/table/glass,/obj/item/storage/box/rxglasses,/turf/open/floor/plasteel/white,/area/medical/genetics) "bsY" = (/obj/structure/cable{icon_state = "1-2"},/turf/open/floor/plasteel/white,/area/medical/genetics) @@ -3726,8 +3731,8 @@ "btM" = (/obj/effect/landmark/event_spawn,/obj/effect/turf_decal/bot,/turf/open/floor/plasteel,/area/hallway/primary/central) "btN" = (/obj/structure/sign/warning/electricshock{pixel_y = -32},/obj/structure/cable{icon_state = "0-4"},/obj/structure/cable,/obj/machinery/door/poddoor/shutters/preopen{id = "hop"; name = "Privacy Shutters"},/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/crew_quarters/heads/hop) "btO" = (/obj/structure/cable{icon_state = "4-8"},/obj/machinery/vending/cart,/turf/open/floor/plasteel,/area/crew_quarters/heads/hop) -"btP" = (/obj/structure/cable{icon_state = "4-8"},/turf/open/floor/carpet,/area/crew_quarters/heads/hop) -"btQ" = (/obj/structure/cable{icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/carpet,/area/crew_quarters/heads/hop) +"btP" = (/obj/machinery/computer/mecha{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) +"btQ" = (/obj/structure/cable{icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) "btR" = (/obj/structure/cable{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/structure/cable{icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel,/area/crew_quarters/heads/hop) "btS" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/closed/wall/r_wall,/area/engine/gravity_generator) "btT" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1},/turf/closed/wall/r_wall,/area/engine/gravity_generator) @@ -3969,6 +3974,7 @@ "byv" = (/turf/open/floor/plasteel/white/side{dir = 8},/area/medical/sleeper) "byw" = (/obj/machinery/sleeper{dir = 8},/turf/open/floor/plasteel,/area/medical/sleeper) "byx" = (/obj/structure/sign/warning/nosmoking,/turf/closed/wall,/area/medical/sleeper) +"byy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) "byz" = (/obj/machinery/atmospherics/components/unary/cryo_cell,/turf/open/floor/plasteel,/area/medical/sleeper) "byA" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/open/floor/plasteel,/area/medical/sleeper) "byB" = (/obj/structure/table/glass,/obj/machinery/camera{c_tag = "Medbay Cryogenics"; network = list("ss13","medbay"); dir = 2},/obj/item/reagent_containers/glass/beaker/cryoxadone,/obj/item/reagent_containers/glass/beaker/cryoxadone,/turf/open/floor/plasteel,/area/medical/sleeper) @@ -3995,9 +4001,9 @@ "byW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel/white/side{dir = 5},/area/science/research) "byX" = (/obj/structure/disposalpipe/segment{dir = 9},/obj/structure/cable{icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,/turf/open/floor/plasteel/white,/area/science/research) "byY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/components/unary/vent_pump/on{dir = 8},/turf/open/floor/plasteel/white/side{dir = 9},/area/science/research) -"byZ" = (/obj/structure/filingcabinet/chestdrawer,/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) -"bza" = (/obj/structure/table,/obj/machinery/computer/security/telescreen/rd,/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) -"bzb" = (/obj/machinery/computer/aifixer{dir = 8},/obj/machinery/requests_console{announcementConsole = 1; department = "Research Director's Desk"; departmentType = 5; name = "Research Director RC"; pixel_x = -2; pixel_y = 30; receive_ore_updates = 1},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) +"byZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/components/unary/vent_pump/on{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) +"bza" = (/obj/structure/disposalpipe/segment{dir = 10},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) +"bzb" = (/obj/machinery/airalarm{dir = 8; pixel_x = 24},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) "bzc" = (/obj/structure/rack,/obj/item/circuitboard/aicore{pixel_x = -2; pixel_y = 4},/obj/effect/turf_decal/stripes/line{dir = 9},/turf/open/floor/plasteel/white,/area/crew_quarters/heads/hor) "bzd" = (/obj/machinery/status_display/ai{pixel_y = 32},/obj/effect/landmark/event_spawn,/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel/white,/area/crew_quarters/heads/hor) "bze" = (/obj/effect/landmark/xmastree/rdrod,/obj/effect/turf_decal/stripes/line{dir = 5},/turf/open/floor/plasteel/white,/area/crew_quarters/heads/hor) @@ -4057,9 +4063,9 @@ "bAg" = (/obj/effect/spawner/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plating,/area/security/checkpoint/science) "bAh" = (/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/security/checkpoint/science) "bAi" = (/obj/structure/cable{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel/white,/area/science/research) -"bAj" = (/obj/structure/table,/obj/machinery/button/door{id = "Biohazard"; name = "Biohazard Shutter Control"; pixel_x = -5; pixel_y = 5; req_access_txt = "47"},/obj/machinery/button/door{id = "rnd2"; name = "Research Lab Shutter Control"; pixel_x = 5; pixel_y = 5; req_access_txt = "47"},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) -"bAk" = (/obj/structure/chair/office/light{dir = 8},/obj/effect/landmark/start/research_director,/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) -"bAl" = (/obj/machinery/computer/robotics{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) +"bAj" = (/obj/machinery/suit_storage_unit/cmo,/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) +"bAk" = (/obj/machinery/computer/crew,/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Medical Officer's Desk"; departmentType = 5; name = "Chief Medical Officer RC"; pixel_y = 32},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) +"bAl" = (/obj/machinery/computer/med_data,/obj/machinery/airalarm{pixel_y = 23},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) "bAm" = (/obj/structure/rack,/obj/item/aicard,/obj/effect/turf_decal/stripes/line{dir = 8},/turf/open/floor/plasteel/white,/area/crew_quarters/heads/hor) "bAn" = (/obj/machinery/holopad,/turf/open/floor/plasteel/white,/area/crew_quarters/heads/hor) "bAo" = (/obj/structure/displaycase/labcage,/obj/machinery/light{dir = 4},/obj/effect/turf_decal/stripes/line{dir = 4},/turf/open/floor/plasteel/white,/area/crew_quarters/heads/hor) @@ -4131,9 +4137,9 @@ "bBC" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/effect/turf_decal/tile/red{dir = 1},/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/red{dir = 4},/turf/open/floor/plasteel,/area/security/checkpoint/science) "bBD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/open/floor/plasteel/white/side{dir = 9},/area/science/research) "bBE" = (/obj/effect/spawner/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plating,/area/crew_quarters/heads/hor) -"bBF" = (/obj/structure/table,/obj/item/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/pen,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/folder/white,/obj/item/stamp/rd{pixel_x = 3; pixel_y = -2},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) -"bBG" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) -"bBH" = (/obj/machinery/computer/mecha{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) +"bBF" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk,/obj/machinery/light{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) +"bBG" = (/obj/machinery/power/apc{dir = 8; name = "RD Office APC"; areastring = "/area/crew_quarters/heads/hor"; pixel_x = -25},/obj/structure/cable,/obj/machinery/light_switch{pixel_y = -23},/obj/item/twohanded/required/kirbyplants/dead,/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) +"bBH" = (/obj/machinery/keycard_auth{pixel_y = -24},/obj/machinery/light,/obj/machinery/computer/card/minor/rd{dir = 1},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) "bBI" = (/obj/structure/rack,/obj/item/taperecorder{pixel_x = -3},/obj/item/paicard{pixel_x = 4},/obj/effect/turf_decal/stripes/line{dir = 10},/turf/open/floor/plasteel/white,/area/crew_quarters/heads/hor) "bBJ" = (/obj/effect/turf_decal/stripes/line{dir = 2},/turf/open/floor/plasteel/white,/area/crew_quarters/heads/hor) "bBK" = (/obj/machinery/modular_computer/console/preset/research{dir = 8},/obj/effect/turf_decal/stripes/line{dir = 6},/turf/open/floor/plasteel/white,/area/crew_quarters/heads/hor) @@ -4191,11 +4197,11 @@ "bCK" = (/obj/structure/cable{icon_state = "1-4"},/obj/structure/cable{icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 6},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/effect/landmark/event_spawn,/turf/open/floor/plasteel/white,/area/science/research) "bCL" = (/obj/structure/cable{icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel/white/side{dir = 9},/area/science/research) "bCM" = (/obj/machinery/door/airlock/command/glass{dir = 4; name = "Research Director"; req_access_txt = "30"},/obj/structure/cable{icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) -"bCN" = (/obj/structure/cable{icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) -"bCO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) -"bCP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/components/unary/vent_pump/on{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) -"bCQ" = (/obj/structure/disposalpipe/segment{dir = 10},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) -"bCR" = (/obj/machinery/airalarm{dir = 8; pixel_x = 24},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) +"bCN" = (/obj/structure/table,/obj/item/cartridge/signal/toxins,/obj/item/cartridge/signal/toxins{pixel_x = -4; pixel_y = 2},/obj/item/cartridge/signal/toxins{pixel_x = 4; pixel_y = 6},/obj/machinery/camera{c_tag = "Research Director's Office"; dir = 1; network = list("ss13","rd")},/obj/item/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) +"bCO" = (/obj/structure/closet/secure_closet/RD,/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) +"bCP" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk{dir = 1},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) +"bCQ" = (/obj/machinery/suit_storage_unit/rd,/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) +"bCR" = (/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) "bCS" = (/obj/machinery/rnd/experimentor,/turf/open/floor/engine,/area/science/explab) "bCT" = (/obj/effect/landmark/blobstart,/obj/effect/landmark/xeno_spawn,/turf/open/floor/engine,/area/science/explab) "bCU" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 8},/obj/structure/cable{icon_state = "1-2"},/turf/open/floor/plating,/area/maintenance/starboard) @@ -4248,10 +4254,10 @@ "bDP" = (/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/pen,/obj/machinery/requests_console{announcementConsole = 0; department = "Medbay"; departmentType = 1; name = "Medbay RC"; pixel_y = 30},/turf/open/floor/plasteel/white,/area/medical/medbay/central) "bDQ" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk,/obj/machinery/light{dir = 1; pixel_y = 16},/turf/open/floor/plasteel/white,/area/medical/medbay/central) "bDR" = (/turf/closed/wall,/area/crew_quarters/heads/cmo) -"bDS" = (/obj/machinery/suit_storage_unit/cmo,/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) -"bDT" = (/obj/machinery/computer/crew,/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Medical Officer's Desk"; departmentType = 5; name = "Chief Medical Officer RC"; pixel_y = 32},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) -"bDU" = (/obj/machinery/computer/med_data,/obj/machinery/airalarm{pixel_y = 23},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) -"bDV" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk,/obj/machinery/light{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) +"bDS" = (/obj/structure/chair/office/light,/obj/effect/landmark/start/chief_medical_officer,/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) +"bDT" = (/obj/machinery/keycard_auth{pixel_x = 24},/obj/structure/disposalpipe/segment,/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) +"bDU" = (/obj/structure/table/glass,/obj/item/paper_bin{pixel_x = -2; pixel_y = 5},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) +"bDV" = (/obj/structure/table/glass,/obj/item/folder/white,/obj/item/stamp/cmo,/obj/item/clothing/glasses/hud/health,/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) "bDW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/open/floor/plating,/area/maintenance/aft) "bDX" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plating,/area/maintenance/aft) "bDY" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/open/floor/plating,/area/maintenance/aft) @@ -4267,12 +4273,12 @@ "bEi" = (/obj/structure/table,/obj/item/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/pen,/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/red{dir = 4},/obj/effect/turf_decal/tile/red{dir = 8},/turf/open/floor/plasteel,/area/security/checkpoint/science) "bEj" = (/obj/structure/cable{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/open/floor/plasteel/white,/area/science/research) "bEk" = (/obj/machinery/light{dir = 4},/turf/open/floor/plasteel/white/side{dir = 9},/area/science/research) -"bEl" = (/obj/machinery/power/apc{dir = 8; name = "RD Office APC"; areastring = "/area/crew_quarters/heads/hor"; pixel_x = -25},/obj/structure/cable,/obj/machinery/light_switch{pixel_y = -23},/obj/item/twohanded/required/kirbyplants/dead,/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) -"bEm" = (/obj/machinery/keycard_auth{pixel_y = -24},/obj/machinery/light,/obj/machinery/computer/card/minor/rd{dir = 1},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) -"bEn" = (/obj/structure/table,/obj/item/cartridge/signal/toxins,/obj/item/cartridge/signal/toxins{pixel_x = -4; pixel_y = 2},/obj/item/cartridge/signal/toxins{pixel_x = 4; pixel_y = 6},/obj/machinery/camera{c_tag = "Research Director's Office"; dir = 1; network = list("ss13","rd")},/obj/item/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) -"bEo" = (/obj/structure/closet/secure_closet/RD,/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) -"bEp" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk{dir = 1},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) -"bEq" = (/obj/machinery/suit_storage_unit/rd,/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/hor) +"bEl" = (/obj/structure/table/glass,/obj/item/pen,/obj/item/clothing/neck/stethoscope,/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/mob/living/simple_animal/pet/cat/Runtime,/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) +"bEm" = (/obj/structure/disposalpipe/segment,/obj/item/radio/intercom{pixel_x = 25},/obj/machinery/camera{c_tag = "Chief Medical Office"; network = list("ss13","medbay"); dir = 8; pixel_y = -22},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) +"bEn" = (/obj/machinery/atmospherics/components/unary/vent_pump/on,/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) +"bEo" = (/obj/structure/chair{dir = 1},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) +"bEp" = (/obj/structure/disposalpipe/segment,/obj/machinery/light_switch{pixel_x = 28},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) +"bEq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) "bEr" = (/obj/machinery/camera{c_tag = "Experimentor Lab Chamber"; dir = 1; network = list("ss13","rd")},/obj/machinery/light,/obj/structure/sign/warning/nosmoking{pixel_y = -32},/turf/open/floor/engine,/area/science/explab) "bEs" = (/obj/structure/cable{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/obj/structure/cable{icon_state = "2-4"},/turf/open/floor/plating,/area/maintenance/starboard) "bEt" = (/obj/machinery/door/airlock/maintenance/abandoned{dir = 4; req_one_access_txt = "8;12"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{icon_state = "4-8"},/turf/open/floor/plating,/area/maintenance/starboard) @@ -4304,9 +4310,9 @@ "bET" = (/obj/structure/table,/obj/item/storage/box/bodybags{pixel_x = 3; pixel_y = 3},/obj/item/storage/box/rxglasses,/turf/open/floor/plasteel/white,/area/medical/sleeper) "bEU" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal/bin,/turf/open/floor/plasteel/white,/area/medical/sleeper) "bEV" = (/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/crew_quarters/heads/cmo) -"bEW" = (/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) -"bEX" = (/obj/structure/chair/office/light,/obj/effect/landmark/start/chief_medical_officer,/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) -"bEY" = (/obj/machinery/keycard_auth{pixel_x = 24},/obj/structure/disposalpipe/segment,/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) +"bEW" = (/obj/machinery/holopad,/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) +"bEX" = (/obj/structure/disposalpipe/segment{dir = 5},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) +"bEY" = (/obj/structure/table,/obj/item/cartridge/medical{pixel_x = -2; pixel_y = 6},/obj/item/cartridge/medical{pixel_x = 6; pixel_y = 3},/obj/item/cartridge/medical,/obj/item/cartridge/chemistry{pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) "bEZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plating,/area/maintenance/aft) "bFa" = (/turf/closed/wall/r_wall,/area/science/xenobiology) "bFb" = (/turf/closed/wall,/area/science/storage) @@ -4367,10 +4373,9 @@ "bGe" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel/white,/area/medical/medbay/central) "bGf" = (/obj/structure/disposalpipe/segment{dir = 10},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel/white,/area/medical/medbay/central) "bGg" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/open/floor/plasteel/white,/area/medical/medbay/central) -"bGh" = (/obj/structure/table/glass,/obj/item/paper_bin{pixel_x = -2; pixel_y = 5},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) -"bGi" = (/obj/structure/table/glass,/obj/item/folder/white,/obj/item/stamp/cmo,/obj/item/clothing/glasses/hud/health,/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) -"bGj" = (/obj/structure/table/glass,/obj/item/pen,/obj/item/clothing/neck/stethoscope,/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/mob/living/simple_animal/pet/cat/Runtime,/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) -"bGk" = (/obj/structure/disposalpipe/segment,/obj/item/radio/intercom{pixel_x = 25},/obj/machinery/camera{c_tag = "Chief Medical Office"; network = list("ss13","medbay"); dir = 8; pixel_y = -22},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) +"bGh" = (/obj/machinery/computer/card/minor/cmo{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) +"bGi" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 8},/obj/machinery/computer/security/telescreen/cmo{dir = 1; pixel_y = -24},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) +"bGj" = (/obj/structure/closet/secure_closet/CMO,/obj/machinery/light{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) "bGl" = (/turf/open/floor/engine,/area/science/xenobiology) "bGm" = (/obj/machinery/camera{c_tag = "Xenobiology Test Chamber"; dir = 2; network = list("xeno","rd")},/obj/machinery/light{dir = 1; pixel_y = 16},/turf/open/floor/engine,/area/science/xenobiology) "bGn" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel,/area/science/storage) @@ -4444,9 +4449,6 @@ "bHD" = (/obj/structure/table,/obj/item/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/storage/box/syringes,/obj/item/reagent_containers/glass/bottle/epinephrine{pixel_x = 7; pixel_y = -3},/obj/item/reagent_containers/glass/bottle/morphine{pixel_x = 8; pixel_y = -3},/obj/item/reagent_containers/syringe{pixel_x = 6; pixel_y = -3},/obj/item/radio/intercom{freerange = 0; frequency = 1485; listening = 1; name = "Station Intercom (Medbay)"; pixel_x = 30},/turf/open/floor/plasteel/white,/area/medical/sleeper) "bHE" = (/obj/item/radio/intercom{broadcasting = 0; freerange = 0; frequency = 1485; listening = 1; name = "Station Intercom (Medbay)"; pixel_x = -30},/obj/machinery/camera{c_tag = "Medbay South"; network = list("ss13","medbay"); dir = 4},/turf/open/floor/plasteel/white,/area/medical/medbay/central) "bHF" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/components/unary/vent_scrubber/on,/turf/open/floor/plasteel/white,/area/medical/medbay/central) -"bHG" = (/obj/machinery/atmospherics/components/unary/vent_pump/on,/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) -"bHH" = (/obj/structure/chair{dir = 1},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) -"bHI" = (/obj/structure/disposalpipe/segment,/obj/machinery/light_switch{pixel_x = 28},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) "bHJ" = (/obj/machinery/airalarm{dir = 4; pixel_x = -22},/obj/machinery/light/small{dir = 8},/turf/open/floor/plasteel,/area/science/storage) "bHK" = (/turf/open/floor/plasteel,/area/science/storage) "bHL" = (/obj/effect/decal/cleanable/oil,/obj/item/cigbutt,/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 4},/turf/open/floor/plasteel,/area/science/storage) @@ -4514,9 +4516,6 @@ "bIV" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel/white,/area/medical/medbay/central) "bIW" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,/turf/open/floor/plasteel/white,/area/medical/medbay/central) "bIX" = (/obj/machinery/door/airlock/command/glass{dir = 4; name = "Chief Medical Officer"; req_access_txt = "40"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) -"bIY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) -"bIZ" = (/obj/machinery/holopad,/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) -"bJa" = (/obj/structure/disposalpipe/segment{dir = 5},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) "bJb" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/closed/wall,/area/crew_quarters/heads/cmo) "bJc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plating,/area/maintenance/aft) "bJd" = (/obj/structure/cable{icon_state = "1-2"},/obj/structure/disposalpipe/sorting/mail{sortType = 10},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plating,/area/maintenance/aft) @@ -4591,10 +4590,6 @@ "bKu" = (/obj/structure/disposalpipe/junction/flip{dir = 2},/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,/turf/open/floor/plasteel/white,/area/medical/medbay/central) "bKv" = (/obj/structure/disposalpipe/segment{dir = 9},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel/white,/area/medical/medbay/central) "bKw" = (/obj/effect/spawner/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plating,/area/crew_quarters/heads/cmo) -"bKx" = (/obj/structure/table,/obj/item/cartridge/medical{pixel_x = -2; pixel_y = 6},/obj/item/cartridge/medical{pixel_x = 6; pixel_y = 3},/obj/item/cartridge/medical,/obj/item/cartridge/chemistry{pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) -"bKy" = (/obj/machinery/computer/card/minor/cmo{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) -"bKz" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 8},/obj/machinery/computer/security/telescreen/cmo{dir = 1; pixel_y = -24},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) -"bKA" = (/obj/structure/closet/secure_closet/CMO,/obj/machinery/light{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo) "bKB" = (/obj/structure/sign/warning/electricshock,/turf/closed/wall/r_wall,/area/science/xenobiology) "bKC" = (/obj/structure/disposaloutlet{dir = 1},/obj/structure/disposalpipe/trunk,/turf/open/floor/engine,/area/science/xenobiology) "bKD" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/effect/turf_decal/bot,/turf/open/floor/plasteel,/area/science/storage) @@ -7070,39 +7065,39 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayUayVayUayUayUayUayUayUayVayUaaaauSaBdaMAaKUaMBaMCaMDaMEaMFaweaMGaLbaMHaIkaLdaMIaMJaMKaMLaMLaMMaLeaLeaLeaLeaLeaLeaLeaLiaLeaLdaMNaLeaLeaMOaMPaMQaMQaMQaMRaMSaMQaMTaMQaMUaMQaMVaMWaMXaMYaMZaIPaKlaIPaIPaIPaIPaIPaIPaLzaIPaIPaNaaNbaNcaNdaNeaNfaNgaIPaIPaLzaIPaNhaIPaIPaIPaIPaIPaIPaIPaNiaIPaOCaNoaNpaNqaNraStaNsbiJaOwaOxaOyaBTaNuaOuaOuaHBaOzaJiaNvaKuaNwaNxaNyaJiaHSaHSaNzaHSaHSaHSaNAaNBaNAaHTaHUaFbaNCaMpaMpaNDaMpaNEaFcaFcaFcaFcaFcaFcaFcaNFaFcaFfaFfaFgaDYaNGaNHaCwaNIaNJaRkaNLaNMaMzaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauSaAaauSayUaxyayUaNNaNOaNPaNQayUaxyayUayUauSayWaxBaKUaNRaNSaMDaMEaMFaweaNTaLbaxBaIkaLdaLeaNUaNVaNVaNVaNWaNXaNYaNVaNZaNVaNVaNVaOaaNVaObaNVaNVaNVaOcaOdaOeaOfaOfaOfaOgaOhaOiaOjaOkaOlaOmaOnaOoaOpaIPaOqaOqaOqaOraOqaOqaOqaOqaOsaOqaOqaOqaOqaOqaOqaOtaOqaOqaOqaOqaPPaOqaOqaOqaOqaOqaOqaOtaOqaIPaIPaIPaJdaPLaStaStaStaStaRiaMcaLQaPOaNnaBTaBTaPKaBTaBTaBTaJiaOAaOBaODaWFaOEaJiaHSaOFaOGaOHaOIaOHaOHaOJaOKaHTaHUaFbaOLaOLaOMaONaOOaOOaOPaFbaOQaORaOSaCwaFfaGNaOTaFfaFfaOUaOVaCwaOWaCwaOXaOYaOZaPaaPbaMzaMzaMzaMzaMzaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaweawfaweayUaBcayUayWaxBaxBayXayUaBcayUaPcaPdaPeaxBaKUaPfaPgaKXaPhaKZaweaPiaLbaxBaPjaPjaPjaPkaPlaPlaPlaPlaPlaPlaPmaPnaPlaPoaPlaPlaPlaPpaPqaPraPqaPsaPtaPuaLeaLeaPvaPwaPxaLeaPyaPzaLeaPAaPAaPMaRgaRmaILaILaILaILaILaILaILaILaPCaPDaPEaPFaPEaPEaPEaPGaPEaPHaPEaPIaPCaILaILaILaILaILaILaILaILaPMaTSaUTaJdaVjaRiaRiaRiaRiaKsaMcaLQaRjaKsaRsaKsaKsaVnaJiaRnaJiaJiaPRaJkaJiaJiaJiaJiaOHaPSaPTaPTaPTaPTaPUaOHaHTaHUaFbaPVaMpaOMaONaMpaMpaPWaFbaPXaPYaPZaCwaFfaIiaQaaQbaQbaQcaQdaQeaQfaCwaQgaQhaQiaQjaQjaQkaQlaQlaQmaQlaQnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQoaaaaaaaaaaxwaXfaxyaxzaQpaxBaQqaPeaxBaxBaQraQqaxBaQpaPeaxBaxBaxBaQsaQtaQuaQvaQwaQxaQxaQyaQzaxBaPjaQAaPjaQBaPlaQCbiKaQEaQFaQGaQDaQHaQIaQJaQKaQLaQMaPpaQNaQOaQPaPsaQQaPuaPuaQRaPuaPuaPAaPAaQSaQTaPAaPAaPAaQUbiLbbeaILaaaaaaaaaaaaaaaaaaaaaaPCaQVaQWaQXaQYaQZaRaaRbaRcaRdaReaRfaPCaaaaaaaaaaaaaaaaaaaaaaILaIOaIPaIPbiMaKsaKsaKsaRlaKsaKsaKnaSzaRjaKsaSraKsaKsaKsbaEaSBaRoaRpaRqaRraRtaRuaSuaJiaOHaRvaVsbiNbiNbiOaRxaOHaHTaRyaFbaRzaRzaOMaONaRAaRAaRBaFbaFbaRCaFbaCwaRDaGNaOTaREaRFaOUaOVaCwaCwaCwaMzaRGaRHaMzaMzaMzaMzaMzaMzaMzaRIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaweaRJawgaRKaRLaRLaRLaRLaRLaRLaRLaRLaRKaRLaRMaxBaxBaIkaxBaRNaROaxBaRPaxBaRQaRRaRSaPjaRTaPjaQBaPlaRUaQDaQDaQDaQDaQDaQHaQDaQDaQDaQDaQMaPpaRVaQOaQOaPsaQQaPuaRWaRXaRXaRYaPAaRZaSaaSbaScaSdaSeaIPbiLbbeaILaaaaaaaaaaaaaPCaPCaPCaPCaSfaSgaShaSiaSjaSkaSlaSmaSnaSoaSpaPCaPCaPCaPCaaaaaaaaaaaaaILaIOaIPaIPaSqaKsaKsaSsaStaSwbiPaSAaTVaRjaSsaTTaSwaKsaTUaJiaWKaSCaSDaSEaSFaSGaSHaSBaSIaSJaSKbiQaSLaSMbiRaSNaOHaHTaHUaFbaMpaMpaOMaONaRAaRAaMpaSOaSPaMpaSQaCwaKSaSRaSSaREaREaSTaSUaSVaCwaSWaSXaQhaQiaQjaQjaSYaQlaQlaQlaQlaSZaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauSauSauSauSayUayUayUayUayUayUayUayUauSauSaweaIkaTbaTcaTcaTdaTcaTcaTcaTcaTeaTcaTcaPjaRTaTfaTgaPlaThaQDaTiaTjaTkaTlaTmaTnaToaQDaQDaTpaPpaTqaTraTsaPsaQQaPuaTtaTuaTvaTwaPAaTxaTyaSbaTzaTAaSeaIPaPBbbeaILaILaTBaPCaPCaPCaTCaTDaTEaTFaTGaTHaTIaTJaTHaTKaTHaTLaTMaTNaTOaTPaTQaPCaPCaPCaTBaILaILaLzaLzbbfaJdaKsaKsaSsaVmaSwbiSaWIaZGaKqaSsbiTaSwaKsaKsaVoaSBaSBaWJaTXaTYaTZaUaaSBaUbaUcaUdbiQaUeaUfbiRaUgaUhaHTaHUaFbaUiaUiaOMaONaUjaMpaMpaUkaMpaUlaUmaCwaUnaUoaUpaREaREaUqaUraFfaCwaUsaQjaQhaQiaQjaPbaMzaMzaMzaMzaMzaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQoaaaaaaaaaaxwaXfaxyaxzaQpaxBaQqaPeaxBaxBaQraQqaxBaQpaPeaxBaxBaxBaQsaQtaQuaQvaQwaQxaQxaQyaQzaxBaPjaQAaPjaQBaPlaQCbiKaQEaQFaQGaQDaQHaQIaQJaQKaQLaQMaPpaQNaQOaQPaPsaQQaPuaPuaQRaPuaPuaPAaPAaQSaQTaPAaPAaPAaQUbiLbbeaILaaaaaaaaaaaaaaaaaaaaaaPCaKnaQVaQWaQXaQYaQZaRaaRbaRcaRdaReaPCaaaaaaaaaaaaaaaaaaaaaaILaIOaIPaIPbiMaKsaKsaKsaRlaKsaKsaRfaSfaRjaKsaSraKsaKsaKsbaEaSBaRoaRpaRqaRraRtaRuaSuaJiaOHaRvaVsbiNbiNbiOaRxaOHaHTaRyaFbaRzaRzaOMaONaRAaRAaRBaFbaFbaRCaFbaCwaRDaGNaOTaREaRFaOUaOVaCwaCwaCwaMzaRGaRHaMzaMzaMzaMzaMzaMzaMzaRIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaweaRJawgaRKaRLaRLaRLaRLaRLaRLaRLaRLaRKaRLaRMaxBaxBaIkaxBaRNaROaxBaRPaxBaRQaRRaRSaPjaRTaPjaQBaPlaRUaQDaQDaQDaQDaQDaQHaQDaQDaQDaQDaQMaPpaRVaQOaQOaPsaQQaPuaRWaRXaRXaRYaPAaRZaSaaSbaScaSdaSeaIPbiLbbeaILaaaaaaaaaaaaaPCaPCaPCaPCaSgaShaSiaSjaSkaSlaSmaSnaSoaSpaSvaPCaPCaPCaPCaaaaaaaaaaaaaILaIOaIPaIPaSqaKsaKsaSsaStaSwbiPaSzaSAaRjaSsaTTaSwaKsaTUaJiaWKaSCaSDaSEaSFaSGaSHaSBaSIaSJaSKbiQaSLaSMbiRaSNaOHaHTaHUaFbaMpaMpaOMaONaRAaRAaMpaSOaSPaMpaSQaCwaKSaSRaSSaREaREaSTaSUaSVaCwaSWaSXaQhaQiaQjaQjaSYaQlaQlaQlaQlaSZaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauSauSauSauSayUayUayUayUayUayUayUayUauSauSaweaIkaTbaTcaTcaTdaTcaTcaTcaTcaTeaTcaTcaPjaRTaTfaTgaPlaThaQDaTiaTjaTkaTlaTmaTnaToaQDaQDaTpaPpaTqaTraTsaPsaQQaPuaTtaTuaTvaTwaPAaTxaTyaSbaTzaTAaSeaIPaPBbbeaILaILaTBaPCaPCaPCaTCaTDaTEaTFaTGaTHaTIaTJaTHaTKaTHaTLaTMaTNaTOaTPaTQaPCaPCaPCaTBaILaILaLzaLzbbfaJdaKsaKsaSsaVmaSwbiSaWIaTVaKqaSsbiTaSwaKsaKsaVoaSBaSBaWJaTXaTYaTZaUaaSBaUbaUcaUdbiQaUeaUfbiRaUgaUhaHTaHUaFbaUiaUiaOMaONaUjaMpaMpaUkaMpaUlaUmaCwaUnaUoaUpaREaREaUqaUraFfaCwaUsaQjaQhaQiaQjaPbaMzaMzaMzaMzaMzaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayUaAcazaaUtaTcaUuaUvaUwaUxaUwaUyaUzaUwaTcaRTaRTaUAaUBaPlaUCaUDaUEaUFaUGaUHaUIaUJaUKaULaUMaQMaPpaPpaPpaPpaPsaQQaPuaPuaPuaPuaPuaPAaUNaUOaUPaTzaUQaSeaIPaIPaLyaIRaIRaURaUSaZQaPCaUUaUVaUWaUXaUYaUXaUZaVaaVbaVcaVdaVeaVfaVdaVgaVhaViaPCaZRaUSaVkaVlaIRaIOaIPaxxaJdaSyaKsaSsbiUaSwaKsaZMaZMaKsaSsaStaSwaKsaKsaVoaSBaSBbgZbiVaVpaVpaUaaWLaJiaVraUdbiWbiXbiXbiYaUgaVtaHTaVuaFbaFbaFbaOMaONaVvaVwaMpaVxaVyaKJaVzaCwaFfaSRaSSaREaREaVAaSUaVBaCwaVCaQjaQhaQiaQjaPbaMzaZNaZOaZPaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVDayUayUayWaxBaTcaVEaVFaVGaUuaVHaVIaUzaUwaTcaVJaVKaVLaPjaPlaVMaVNaVOaVPaVQaVQaVRaVQaVQaVQaVSaVTaPlaVUaVVaVWaVXaVYaVZaWaaWbaWcaWdaWdaWdaWdaWdaWdaWdaWdbbVaIPaIPaIPaIPaWeaWfaWgaWhaWiaWjaWkaWlaWmaWnaWoaWpaWqaWraWsaWtaWuaWvaWkaWwaWxaWyaWzaWAaWBaWCaWDaWEaIPaIPbbXbiZaKsaKsaKsaKsbjaaZMaZMaKsaSsaStaSwaKsaKsaVoaSBaSBaSBaSBaSBaSBaUaaYoaJiaOHaUdaRwaRwaRwaRwaUgaOHaHTaWMaWNaWOaWPaWQaWRaWSaWSaWTaOMaOMaOMaOMaWUaREaREaREaREaREaWVaWWaWXaWYaWZaXaaXbaXcaPaaXdaMzaZPaZOaZOaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXeaXgaxybhaaxBaxBaTcaXhaXiaXjaXkaXkaXlaXmaXnaTcaXoaRTaVLaXpaXpaXpaXqaXraXpaXsaXtaXuaXvaXwaXwaXxaXyaPlaXzaXAaXBaXCaXDaXEaXBaXFaXGaXGaXHaXIaXJaXKaXLaXMaWdbbVaIPaXNaXOaXPaXQaXRaXSaPCaXTaXUaXVaXWaXXaXYaXYaXZaYaaYbaYcaYdaYeaYfaXVaYgaXTaPCaXSaXRaYhaYiaXOaYjaIPaIPbebbbXbiZaKsaKsaKsaKsaKsaKsaKsaRlbjbaKsaKsaKsaJiaYpaYqaSBaSBaYraSBaYXbhyaJiaYsaYtaRwaYuaYuaYvaYtaYwaYxaYyaYzaYzaYAaYBaYCaOMaOMaYDaOMaOMaOMaOMaWUaYEaYFaYFaYFaYFaYFaYGaYHaYIaYJaYKaYLaYMaQjaYNaMzbjhaZOaZNaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayUayUayUayWaYOaYPaYQaYRaYSaYSaYSaYSaYTaUuaTcaYUaYVaVLaXpaYWbaKaYYaYZaXpaZaaZbaZcaPlaZdaZeaZfaZgaPlaZhaZiaZjaZkaZjaZlaZmaZnaWdaZoaZpaZpaZqaZraZsaZtaWdbbYaLzaZuaZvaZvaZvaZvaZvaZvaZwaZxaZyaXXaXZaZzaZAaZAaZBaZAaZAaZCaYbaYeaZDaZEaZFaZDaZDaZDaZDaZDaZDbjiaIPaIPbgTbjjbbXbiZbjkaSwbjlaKsaKsaKsaWGaKsaKsbjmaYkaJibjnaJiaZSaYlaZTaZTaJiaJiaJiaZUaRwaRwaZVaZWaZXaZYaZWaHTaZZbaababaFbbacbadbaeaVwaMpbafaUkaVwbagaCwbahaFfbaiaREaREbaiaFfbajaCwbakbalbamaQiaQjaPbaMzaMzaMzaMzaMzaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayUbanaPebaoaTcaUwaVFaUwaUubapaUwbaqaUwaTcbarbasbataXpaXpaXpbaubavaXpaZbbawaZbaPlaZdaZeaZfaZgaPlaZhaZibaxbayaZjbazaZmaZnaWdbaAaZpaZpbaBbaCaZpbaDbbxaIPaIPbbZaZvbaFbaGbaHbaIbaJbcebaLbaMbaNbaOaZAaZAbaPbaQbaPaZAaZAbaRbaSbaTbaUbaVbaWbaXbaYbaZbbaaZDbjoaIPaIPbgTbgTbjpbbXaJdaJdaJdbbbaSqbbbaJdbbcaJdaJdaJdaJibcbbdZbbdbbdbbdbbdbcfbdHaJiaZWbbgbbgaZWbaabaabaabaaaHTaZZbaababaFbaFbaFbbbhaFbbbhaFbbbhaFbaFbaCwaCwbbibbibbibbibbibbiaCwaCwbbjaQjbbkaQiaQjaQjbblaQlaQlaQlaQlaSZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadauSauSayUayUayUayUayUayUayUayUauSauSaweaxBaxBaTcaTcaTdaTcaTcaTcaTcaTeaTcaTcbbmbbnbboaXpaYWbbpbaubbqaXpbbrbbsbbraPlaZdaZeaZfaZgaPlbbtaZiaZjbbubbvbbwaZmaZnbjqaZsbbybbzbbAbbBaZpbaDbbCaIPaIPaXNbbDbbEbaJbbFbbGbbGbbHbbIbbJbaNbbKaZAaZAbaPbbLbaPaZAaZAbbMbaSbbNbbObbPbbQbbRbbSbbabbTaZDbjobbUaIPaIPbaabaabaabecbegbehbaabaabaabeibembembembembeobaabaabaabaabaabaabaabaabehbaabaabaabaabaabaabaabcabepbccbcdbaabesbembembaabembaabembaabembekbeobfObaabaabaabaabaabaabbWbcgaSXaQjbchbcibcjbckaMzaMzaMzaMzaMzaRIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayUawhawiawiawiawiawiawiawiawiawhawibclaxDaxDbcmbcnbcobcpbcpbcpbcqbcrbcsaPjbctbcubcvaXpaXpaXpbcwbcxaXpaPlaPlaPlaPlaZdaZebcybczaPlaZhaZiaZjbcAbcBbcCbcDbcEbcFbcGbcGbcGbcHbcIaZsbcJaWdaQUaNhaXNbcKbcLbaJbcMbcNbcObcPbcQbcRbaNbcSbaPaZAbcTbcUbcTaZAbaPaZCbaSbcVbbObbPbbQbcWbbSbbabbaaZDbjraIPaIPaIPbaabaabaabaabjsbbWbaabaabaabaabcYbaabaabaabaabaabcZaYzaYzaYzaYzbdabaabbWbaabaabaabaabaabaabdbbdcbddbdebdfbdfbdfbdgbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdhbdibdjbdkbdkbdlaQibdmaQjbdnaQlaQlbdoaQlbdpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadayUaxAaxBaxAazaaxBaxBbdqaxAaxBaxAazaaxBaxBaxBbdrbdsbdrbdrbdrbdrbdtbduaPjaPjaPjbdvaVLaXpaYWbdwbdxbbqaXpbdybdzbdyaPlaPlaPlbdAbdBaPlaZhaZibdCbdDbdEbdFaZmaPjaWdaWdaWdaWdaWdaWdaWdbdGaWdbfPaIPaXNbcKbdIbaJbcMbdJbdKbcPbcQbaJbaNbdLbdMaZAbdNbdObdPaZAbdQbdRbaSbdSbdTbdUbdVbdWbdXbbabdYaZDbjobeaaIPbedbgBbgBbgBbiibjsbjtbeebeebeebfAbefbeebeebjubgBbgBbgBbgBbgBbjvbjwbejbjxbjtbgBbgBbaabaabaabelbjybenbjzbjAbeqbeqbeqbaabgBbgDbjBbgBbgBbaabaabaabaabaabaabaabaabaabaabaabbWbetbeubevbewaQiaQjaPbaMzaMzaMzaMzaMzaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaweayUbexayUayWaxBaxBayXayUbeyayUayYbezbeAbeAbdrbeBbeCbeDbeEbeFbdtbeGbeHbeIbeIbeJbeKaXpaXpaXpbeLbeMaXpaPjaPjaPjaPjbeNbeObePbeQbeObeRaZibeSbeTaZjaZlaZmbeUbeVbeWbeXbeXbeXbeXbeYbeZbeVbjCaIPbbZaZvbaJbfbbfcbfdbfebffbcQbfgbfhaXYbfibfjbfkbfkbfkbflbfmaYdbfnbfobfpbfqbfrbfsbftbbabfuaZDbjoaIPbjDbfvbfvbfvbfvbfvbfvbfvbfwbfxbfxbfxbfybfzbfzbfwbjEbjEbjEberberberberberbfBbfBbfBbfCbfBbfBbfBbfBbfBbfGbfHbfIbfJbfJbfJbfKbfLbfLbfLbfLbfLbfMbfNbfNbjFbjGbfNbjHbjIbfNbfNbfRbfSbfSbfSbfSbfTbfUbfVbfWaMzaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAaauSaAbaxyayUaAcaAdbfXbfYayUaxyaAbayUauSaAaawebdrbfZbgabgabgabgbbgcbgdbgebeObeObgfbggaXpaYWbghbeLbgiaXpbgjbgjaRTbgkbglbgmbgnbgmbgmbgobgpbgqaZkbgrbgsaZmaRTbgtbgubeVbgvbgwbgxbgyaPNbgAbjJbgCbjKaZvbgEaZybgFbgGbgHbgIbcQbgJaZvaadbgKbjLbjMbjMbjMbjNbgMaadaZDbgNbgObgPbgQbbabgRbbabgSaZDbjoaIPbjObfvbjPbgVbgWbgXbgYbfvbhfbjQbjQbjQbhbbhcbhcbhdbhebjRbhgbfDbfEbfFbhhberbhlbhibhjbhkbhibhmbhnbfBbfBbhobhpbhqbhrbhsbhtbhubhvbhwbhxbjSbfLbhzbhAbhzbfLbhBbhCbhBbfSbhDbhEbhDbfSbhFbhGbfSbhHbhIaMzaMzaMzaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaadaadaadaadayUbhJayUayUayUayUayUayUbhKayUaadaadaadaaabdrbhLbdrbhMbgabhNbhObdraRTaTfbhPbhQbhRbhSbhSbhSbhSbhSbhSbhTbhUbhVbhWbhXbhYbhYbhYbhYbhYbhYaZmbhZaZiaZmbhYbhYbiabibbicbidbiebifbiebigbihbfaaIPbjTaZvbijaZyaZyaZyaZybgIbcQbikaZvaadbgKbjUbilbimbinbjVbgMaadaZDbiobbObipbiqbbabftbbabbaaZDbjoaIPbjDbfvbirbisbitbitbiubivbhcbiwbhcbhcbhbbjWbhcbhcbhcbhcbixbfDbjXbjYbjZberbkabhibhibkbbkabkcbhibfBbkdbkebfHbkfbkgbkhbkibkjbkkbklbkmbknbkobkpbkqbkrbfLbksbktbkubfSbkvbkwbkvbkxbkybkybfSbkzbhIaaaaadaaaaadaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoBaaabdrbkBbkCbkDbkEbkEbkFbkGbkHbkIaPjbkJbkKbkLbkLbkLbkMbkMbkMbkMbkMbkMbkNbkObhYbkPbkQbkRbkSbkTbkUbkVbkWbhYbkXbkYbkZbeVbeVblablbblcblbbldbleblfblgbbZblhblibljblkbllaZyblmbcQaZvaZvaadbgKbjUbimbgLbimbjVbgMaadaZDaZDblnbbPblobbablpblqblraZDbjoaIPbjDbfvblsbisbltblublvblwbhcblxblyblzblAblBblCblCblDbhcbixbfDblEblFblGberbkabhibhibkbbkabkcblHbfBblIblJbfHblKblLblMblNblKbkkblOblPbkmbkmbkmbkmblQbfLblRblSblTbfSblUbkybkyblVblWblXbfSbkzbhIblYblYblYblYaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdrblZbdrbmabmbbmbbmcbdrbmdbmdaPjbmebmfbmebmebmebmfbmeaPjaPjbhYbhYbmgbmhbhYbmibmibmibmibmibmibmjbmkbmlbmmbmnbmobmpbmqbmrbmqbmsbmtbmubihbfabmvbmwbmxbmybmzbmAbmBaZybgIbcQaZvaadaadbmCbmDbinbmEbilbmFbmGaadaadaZDbmHbmIaZDaZDaZDaZDbmJaZDbmKaIPbmLbfvbmMbmNbmObitbiubmPbhcblxbmQbmRbmSbmTbmUbmVbmWbmXbixberbmYbmZbnaberbkabhibhibkbbkabnbbncbfBbndblJbfHbnebkgbnfbkibngbkkbnhbnibnjbnkbnlbnmbnnbfLbnoblSbnpbfSbnqbnrbnsbntbnubnvbfSbkzbnwbnxbnybnzbnAaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdrbnBbkCbnCbmbbnDbnEbdraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnFbnGbnHbnIbnJbnKbmibmibmibnLbmibmibnMbnNbnObnPbnQbnRbnSbnTbihbnUbeVbeVbeVbnVbnWaLzblhbnXbnYbnYbnYbnYbnZboabobaadaaabgKbocbodbodbodboebgMaaaaadbofbogbohboibojbokaZDbolaZDbjiaIPbombfvbonboobopboqborbfvbosblxbmQbotboubhcbovbotbmWbowboxberboybozboAboBboCboCboDboEboFboGboHboIboJboKbfHboLboMboNboOboPboQboRboSboTboUboVboWaRhbfLboXboYboZbfSbpabpbbpcbpdbkyaSvbfSbpebpfbpgbphbphbphbphbphbphbpiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdrbpjbkCbkCbkCbdrbdrbdraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnFbpkbplbpmbpnbpnbpnbpnbpnbpnbpnbpnbpnbpobppbpqbprbpsbptbpubpvbpwbpxbpybpzbfabpAbpBblhblhbobbpCbpDbpEbpFbpGbobaaaaaabgKbpHbpIbpJbpIbpKbgMaaaaaabofbpLbpMbpNbofbpOaZDbpPaZDbjiaIPbpQbpRbpSboobpTbitbpUbfvbjEbpVbpWbpXbpYbhcbpZbpXbqabqbbjEberberbqcberbqdbqebqfbqfbqfbqgbqhbqibqibqibqjbqkbfIbfIbfIbfIbfIbqlbqmbkmbqnboWboWbqobqpbqlbqqbqrbqsbqtbqubqvbqwbqxbqybqzbfSbqAbqBbqCbqDbqDbqDbqDbqDbqEbhIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqFbnFbnFbqGbplbkVbmibqHbqHbqHbqHbmibmibmibmibqIbqJbqKbqLbqMbqNbqObqPbqQbpwbpwbpzbqRbqSbqTbqUbqVbqWbqXbqYbqZbrabrbbobaadaaabgKbrcbrdbrdbrdbrebgMaaaaadbofbrfbrgbrhbofbriaZDbolaZDbjiaIPbpQbfvbrjboobrkbrlbrmbfvbrnblxbrobpXbjEbrpbjEbpXbrqbrrbrsbrtbrubrvbrwbrxbrybrzbrAbrBbrCbrDbrEbrFbrGblJbrHbrIbrJbrKbrLbrMbrNbrObrPbrQbrRbrSboWbrTbrUbrVbrWaSxbqtbrXbrYbrZbsabkybsbbscbsdbfSbsebsebsebsebsebsebkzbhIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsfbsgbsfbshbsibsjbskbslbmibmibmibmibmibsmbhYbhYbsnbpwbsobspbsqbpubsrbpwbssbpwbstbsubpAbsvbswbsxbsybszbsAbsBbrabsCbobaaaaaabgKbsDbsEbsFbsEbsGbgMaaaaaabsHbsIbsJbsHbsHbsHbsHbsKbsHbsLaLzbsMbfvbfvbsNbsObsPbfvbfvbhcbsQbsRbsSbsTbsSbsUbsSbsWbqbbhcbhcbhcbqbbhcbhbbrybrzbsXbsYbsZbtabtbbtcbrGbtdbtebtfbtgbtgbtgbthbtibtjbtkbtlbtmbtnbtobtpbtqbtrblSbtsbqtbqtbttbtubtvbttbqtbfSbfSbfSbtwbtxbtybtzbtAbsebtBbhIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtCbtDbtEbtFbmibkVbmibqHbqHbtGbqHbmibmibtHbtIbhYbtJbpwbsobspbpwbtKbpwbpwbtLbpwbstbsubpAaIPbswbtMbtNbtObtPbtPbtQbtRbobaadaadbtSbtTbtUbtVbtWbtXbtYaadaadbtZbuabubbucbudbuebufbugbsHbuhaIPbuibujbukbulbumbunbuobupbuqburbusbutbutbutbutbutbuubuvbutbutbutbuwblCbuxbuybrzbuzbuAbuBbuBbuCbuDbrGblJbrHbuEbuFbuGbuHbuIbuJbuKbkmbuLbkmbkmbkmbuMbqlbuNbuObuPbuQbuRbuSbuTbuUbuVbuWbuXbuYbuZbvabvbbvbbvbbvcbvdbvebhIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayUbanaPebaoaTcaUwaVFaUwaUubapaUwbaqaUwaTcbarbasbataXpaXpaXpbaubavaXpaZbbawaZbaPlaZdaZeaZfaZgaPlaZhaZibaxbayaZjbazaZmaZnaWdbaAaZpaZpaZGbaBaZpbaDbbxaIPaIPbbZaZvbaFbaGbaHbaIbaJbcebaLbaMbaNbaOaZAaZAbaPbaQbaPaZAaZAbaRbaSbaCbaTbaUbaXbaYbbzbaVbaWaZDbjoaIPaIPbgTbgTbjpbbXaJdaJdaJdbbbaSqbbbaJdbbcaJdaJdaJdaJibcbbdZbbdbbdbbdbbdbcfbdHaJiaZWbbgbbgaZWbaabaabaabaaaHTaZZbaababaFbaFbaFbbbhaFbbbhaFbbbhaFbaFbaCwaCwbbibbibbibbibbibbiaCwaCwbbjaQjbbkaQiaQjaQjbblaQlaQlaQlaQlaSZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadauSauSayUayUayUayUayUayUayUayUauSauSaweaxBaxBaTcaTcaTdaTcaTcaTcaTcaTeaTcaTcbbmbbnbboaXpaYWbbpbaubbqaXpbbrbbsbbraPlaZdaZeaZfaZgaPlbbtaZiaZjbbubbvbbwaZmaZnbjqaZsbbybaZbbabbAaZpbaDbbCaIPaIPaXNbbDbbEbaJbbFbbGbbGbbHbbIbbJbaNbbKaZAaZAbaPbbLbaPaZAaZAbbMbaSbbBbbNbpdbbRbbSbcWbaWbbOaZDbjobbUaIPaIPbaabaabaabecbegbehbaabaabaabeibembembembembeobaabaabaabaabaabaabaabaabehbaabaabaabaabaabaabaabcabepbccbcdbaabesbembembaabembaabembaabembekbeobfObaabaabaabaabaabaabbWbcgaSXaQjbchbcibcjbckaMzaMzaMzaMzaMzaRIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayUawhawiawiawiawiawiawiawiawiawhawibclaxDaxDbcmbcnbcobcpbcpbcpbcqbcrbcsaPjbctbcubcvaXpaXpaXpbcwbcxaXpaPlaPlaPlaPlaZdaZebcybczaPlaZhaZiaZjbcAbcBbcCbcDbcEbcFbcGbcGbcGbcHbcIaZsbcJaWdaQUaNhaXNbcKbcLbaJbcMbcNbcObcPbcQbcRbaNbcSbaPaZAbcTbcUbcTaZAbaPaZCbaSbbPbbNbpdbbRbdVbcWbaWbaWaZDbjraIPaIPaIPbaabaabaabaabjsbbWbaabaabaabaabcYbaabaabaabaabaabcZaYzaYzaYzaYzbdabaabbWbaabaabaabaabaabaabdbbdcbddbdebdfbdfbdfbdgbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdhbdibdjbdkbdkbdlaQibdmaQjbdnaQlaQlbdoaQlbdpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadayUaxAaxBaxAazaaxBaxBbdqaxAaxBaxAazaaxBaxBaxBbdrbdsbdrbdrbdrbdrbdtbduaPjaPjaPjbdvaVLaXpaYWbdwbdxbbqaXpbdybdzbdyaPlaPlaPlbdAbdBaPlaZhaZibdCbdDbdEbdFaZmaPjaWdaWdaWdaWdaWdaWdaWdbdGaWdbfPaIPaXNbcKbdIbaJbcMbdJbdKbcPbcQbaJbaNbdLbdMaZAbdNbdObdPaZAbdQbdRbaSbbQbbTbcVbdWbdXbjdbaWbdSaZDbjobeaaIPbedbgBbgBbgBbiibjsbjtbeebeebeebfAbefbeebeebjubgBbgBbgBbgBbgBbjvbjwbejbjxbjtbgBbgBbaabaabaabelbjybenbjzbjAbeqbeqbeqbaabgBbgDbjBbgBbgBbaabaabaabaabaabaabaabaabaabaabaabbWbetbeubevbewaQiaQjaPbaMzaMzaMzaMzaMzaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaweayUbexayUayWaxBaxBayXayUbeyayUayYbezbeAbeAbdrbeBbeCbeDbeEbeFbdtbeGbeHbeIbeIbeJbeKaXpaXpaXpbeLbeMaXpaPjaPjaPjaPjbeNbeObePbeQbeObeRaZibeSbeTaZjaZlaZmbeUbeVbeWbeXbeXbeXbeXbeYbeZbeVbjCaIPbbZaZvbaJbfbbfcbfdbfebffbcQbfgbfhaXYbfibfjbfkbfkbfkbflbfmaYdbfnbdTbdUbdYbpxbfobjdbaWbfpaZDbjoaIPbjDbfvbfvbfvbfvbfvbfvbfvbfwbfxbfxbfxbfybfzbfzbfwbjEbjEbjEberberberberberbfBbfBbfBbfCbfBbfBbfBbfBbfBbfGbfHbfIbfJbfJbfJbfKbfLbfLbfLbfLbfLbfMbfNbfNbjFbjGbfNbjHbjIbfNbfNbfRbfSbfSbfSbfSbfTbfUbfVbfWaMzaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAaauSaAbaxyayUaAcaAdbfXbfYayUaxyaAbayUauSaAaawebdrbfZbgabgabgabgbbgcbgdbgebeObeObgfbggaXpaYWbghbeLbgiaXpbgjbgjaRTbgkbglbgmbgnbgmbgmbgobgpbgqaZkbgrbgsaZmaRTbgtbgubeVbgvbgwbgxbgyaPNbgAbjJbgCbjKaZvbgEaZybgFbgGbgHbgIbcQbgJaZvaadbgKbjLbjMbjMbjMbjNbgMaadaZDbfqbfrbfsbftbaWbfubaWbgNaZDbjoaIPbjObfvbjPbgVbgWbgXbgYbfvbhfbjQbjQbjQbhbbhcbhcbhdbhebjRbhgbfDbfEbfFbhhberbhlbhibhjbhkbhibhmbhnbfBbfBbhobhpbhqbhrbhsbhtbhubhvbhwbhxbjSbfLbhzbhAbhzbfLbhBbhCbhBbfSbhDbhEbhDbfSbhFbhGbfSbhHbhIaMzaMzaMzaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaadaadaadaadayUbhJayUayUayUayUayUayUbhKayUaadaadaadaaabdrbhLbdrbhMbgabhNbhObdraRTaTfbhPbhQbhRbhSbhSbhSbhSbhSbhSbhTbhUbhVbhWbhXbhYbhYbhYbhYbhYbhYaZmbhZaZiaZmbhYbhYbiabibbicbidbiebifbiebigbihbfaaIPbjTaZvbijaZyaZyaZyaZybgIbcQbikaZvaadbgKbjUbilbimbinbjVbgMaadaZDbgObbNbgPbgQbaWbjdbaWbaWaZDbjoaIPbjDbfvbirbisbitbitbiubivbhcbiwbhcbhcbhbbjWbhcbhcbhcbhcbixbfDbjXbjYbjZberbkabhibhibkbbkabkcbhibfBbkdbkebfHbkfbkgbkhbkibkjbkkbklbkmbknbkobkpbkqbkrbfLbksbktbkubfSbgRbgSbgRbiobgRbgRbfSbkzbhIaaaaadaaaaadaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoBaaabdrbkBbkCbkDbkEbkEbkFbkGbkHbkIaPjbkJbkKbkLbkLbkLbkMbkMbkMbkMbkMbkMbkNbkObhYbkPbkQbkRbkSbkTbkUbkVbkWbhYbkXbkYbkZbeVbeVblablbblcblbbldbleblfblgbbZblhblibljblkbllaZyblmbcQaZvaZvaadbgKbjUbimbgLbimbjVbgMaadaZDaZDbipbpdbiqbaWbjebjfbjgaZDbjoaIPbjDbfvblsbisbltblublvblwbhcblxblyblzblAblBblCblCblDbhcbixbfDblEblFblGberbkabhibhibkbbkabkcblHbfBblIblJbfHblKblLblMblNblKbkkblOblPbkmbkmbkmbkmblQbfLblRblSblTbfSbkvbgRbgRbkwbkxbkybfSbkzbhIblYblYblYblYaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdrblZbdrbmabmbbmbbmcbdrbmdbmdaPjbmebmfbmebmebmebmfbmeaPjaPjbhYbhYbmgbmhbhYbmibmibmibmibmibmibmjbmkbmlbmmbmnbmobmpbmqbmrbmqbmsbmtbmubihbfabmvbmwbmxbmybmzbmAbmBaZybgIbcQaZvaadaadbmCbmDbinbmEbilbmFbmGaadaadaZDbmHbmIaZDaZDaZDaZDbmJaZDbmKaIPbmLbfvbmMbmNbmObitbiubmPbhcblxbmQbmRbmSbmTbmUbmVbmWbmXbixberbmYbmZbnaberbkabhibhibkbbkabnbbncbfBbndblJbfHbnebkgbnfbkibngbkkbnhbnibnjbnkbnlbnmbnnbfLbnoblSbnpbfSbnqbnrbnsblnbloblpbfSbkzbnwbnxbnybnzbnAaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdrbnBbkCbnCbmbbnDbnEbdraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnFbnGbnHbnIbnJbnKbmibmibmibnLbmibmibnMbnNbnObnPbnQbnRbnSbnTbihbnUbeVbeVbeVbnVbnWaLzblhbnXbnYbnYbnYbnYbnZboabobaadaaabgKbocbodbodbodboebgMaaaaadbofbntbnubnvbojbokaZDbolaZDbjiaIPbombfvbonboobopboqborbfvbosblxbmQbotboubhcbovbotbmWbowboxberboybozboAboBboCboCboDboEboFboGboHboIboJboKbfHboLboMboNboOboPboQboRboSboTboUboVboWaRhbfLboXboYboZbfSbpabpbbpcblqbgRblrbfSbpebpfbpgbphbphbphbphbphbphbpiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdrbpjbkCbkCbkCbdrbdrbdraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnFbpkbplbpmbpnbpnbpnbpnbpnbpnbpnbpnbpnbpobppbpqbprbpsbptbpubpvbpwbpwbpybpzbfabpAbpBblhblhbobbpCbpDbpEbpFbpGbobaaaaaabgKbpHbpIbpJbpIbpKbgMaaaaaabofboibpdbpxbofbpOaZDbpPaZDbjiaIPbpQbpRbpSboobpTbitbpUbfvbjEbpVbpWbpXbpYbhcbpZbpXbqabqbbjEberberbqcberbqdbqebqfbqfbqfbqgbqhbqibqibqibqjbqkbfIbfIbfIbfIbfIbqlbqmbkmbqnboWboWbqobqpbqlbqqbqrbqsbqtblUblVblWblXbogbohbfSbqAbqBbqCbqDbqDbqDbqDbqDbqEbhIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqFbnFbnFbqGbplbkVbmibqHbqHbqHbqHbmibmibmibmibqIbqJbqKbqLbqMbqNbqObqPbqQbpwbpwbpzbqRbqSbqTbqUbqVbqWbqXbpLbpMbpNbrbbobaadaaabgKbrcbrdbrdbrdbrebgMaaaaadbofbqxbqybqzbofbriaZDbolaZDbjiaIPbpQbfvbrjboobrkbrlbrmbfvbrnblxbrobpXbjEbrpbjEbpXbrqbrrbrsbrtbrubrvbrwbrxbrybrzbrAbrBbrCbrDbrEbrFbrGblJbrHbrIbrJbrKbrLbrMbrNbrObrPbrQbrRbrSboWbrTbrUbrVbrWaSxbqtbqubqvbqwbqYbgRbqZbscbsdbfSbsebsebsebsebsebsebkzbhIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsfbsgbsfbshbsibsjbskbslbmibmibmibmibmibsmbhYbhYbsnbpwbsobspbsqbpubsrbpwbssbpwbstbsubpAbsvbswbsxbsybszbrabrfbpNbsCbobaaaaaabgKbsDbsEbsFbsEbsGbgMaaaaaabsHbsIbsJbsHbsHbsHbsHbsKbsHbsLaLzbsMbfvbfvbsNbsObsPbfvbfvbhcbsQbsRbsSbsTbsSbsUbsSbsWbqbbhcbhcbhcbqbbhcbhbbrybrzbsXbsYbsZbtabtbbtcbrGbtdbtebtfbtgbtgbtgbthbtibtjbtkbtlbtmbtnbtobtpbtqbtrblSbtsbqtbqtbttbtubtvbttbqtbfSbfSbfSbtwbtxbtybtzbtAbsebtBbhIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtCbtDbtEbtFbmibkVbmibqHbqHbtGbqHbmibmibtHbtIbhYbtJbpwbsobspbpwbtKbpwbpwbtLbpwbstbsubpAaIPbswbtMbtNbtObrgbrgbrhbtRbobaadaadbtSbtTbtUbtVbtWbtXbtYaadaadbtZbuabubbucbudbuebufbugbsHbuhaIPbuibujbukbulbumbunbuobupbuqburbusbutbutbutbutbutbuubuvbutbutbutbuwblCbuxbuybrzbuzbuAbuBbuBbuCbuDbrGblJbrHbuEbuFbuGbuHbuIbuJbuKbkmbuLbkmbkmbkmbuMbqlbuNbuObuPbuQbuRbuSbuTbuUbuVbuWbuXbuYbuZbvabvbbvbbvbbvcbvdbvebhIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqFbnFbnFbvfbmibkVbmibmibmibmibmibmibmibtHbvgbhYbvhbvibvjbvkbvlbvmbvnbvobpwbvpbpzbvqbpAaIPbswbsxbobbvrbvsbvtbvubvvbobaaaaaaaadbgKbvwbvxbvwbgMaadaaaaaabtZbvybvzbvAbvBbvCbvCbvDbvEbvFbvGaMXbvHbvIbvJbvKbvLbvMbvNbvMbvMbvObvPbvQbvRbvRbvRbvSbvTbhcbhcbvUbvVbvVbvWbrzbrzbrzbvXbvYbvZbtbbuDbrGbwabrHbfLbqlbqlbqlbqlbqlbqlbqlbqlbqlbwbbwcbwbbqlbwdbwebwfbwgbwgbwgbwhbwibwjbwkbwlbwmbwnbwobwpbwqbwrbwsbwtbwubwvblYbwwbwwblYaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwxbtCbtDbtEbpkbwybmjbwzbnKbmibwybmibmibmibtHbwAbhYbwBbpwbsobwCbwDbwEbpwbpwbpwbwFbpzbvqbpAaXNbswbwGbobbwHbwIbwJbwKbpGbobaaaaaaaadbwLbwMbrdbwNbwOaadaaaaaabtZbwPbwQbwRbwSbwTbwUbwVbsHbwWaIPbjDbjEbjEbwXbwYbsWbwZbxabxbbxcbxcbxbbxabxbbxabxbbxabxbbxabfzbfzbvVbxdbuBbxebxfbrzbvXbxgbxhbxibxjbrGbxkbxlbxmbxnbxobwgbwgbxpbwgbwgbxqbxrbxsbxtbxubwgbxvbxwbxxbxybxybxybxzbxzbxzbxzbxzbxAbxBbxCbxDbxCbxEbxCbsebxFbxGbxHbxIbxJblYaadaaaaaaaaaaaaaaaaaaaadaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxKbxLbxKbxMbxNbxMbxMbxMbxMbxMbxObxPbmibtHbxQbhYbxRbxSbxTbxUbxVbxWbxXbxXbxXbxWbxWbxYbpAaKebxZbsxbobbyabybbycbydbyebobaaaaaaaadbyfbygbtVbyhbyiaadaaaaaabtZbyjbykbylbymbwTbwUbwVbsHbynaIPbjDbyobypbyqbwYbyrbysbxabytbyubyvbywbyxbjcbyzbyAbyzbyBbxabhcbyCbvVbyDbuBbyEbyFbyGbyHbyIbyJbyJbyKbyLbyMbyNbyObyPbyQbyRbySbyRbyRbyTbyRbyRbyUbyVbyRbyRbyWbyXbyYbxybyZbzabzbbzcbzdbzebxzbzfbzgbzhbzibzjbzgbzkbsebxFbhIbzlbzmbznblYaaaaaaaaaaaaaaaaaaaaaaadbzoaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqFbnFbnFbnFbhYbnFbnFbnFbzpbzpbzpbzpbzqbzrbzrbzpbzpbzsbztbzubzvbxWbzwbzxbzybzzbxWbzAbpAbbeaTBaTBbobbobbobbobbobbzBbobaILaILaILbtSbzCbzDbzEbtYaILaILaILbsHbsHbsHbsHbsHbsHbsHbsHbsHbzFaIPbzGbxabxabzHbzIbxabxabxabzJbyubzKbyubzLbzMbzNbzObzPbzQbzLbhcbyCbvVbzRbzSbzTbzUbzVbzWbzXbzUbzUbzYbzZbAabAbbAcbAcbAcbAcbAdbAcbAcbAcbAebAebAfbAgbAhbAhbtrbAibtsbxybAjbAkbAlbAmbAnbAobApbsebsebAqbAqbAqbsebArbsebxFbhIbAsbzmbAtblYaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaabzpbAubAvbAwbAxbAybAzbzrbAAbABbACbADbxXbAEbAFbAGbAHbxWbzAbpAaIPaLPbAIbAJbAKaLPbiFbALbAMbANaWDaWDaWDbAObAPbAQbARbASaIPaIPaIPaIPaLOaIPaLzbATaIPaIPbAUaIPbAVaIPbAWbxabAXbAYbAZbBabBbbxabBcbyubBdbyubzLbzMbzMbBebBfbBgbzLbhcbBhbvVbuBbBibBjbBkbBlbBmbBnbBobBpbrGbrGbBqbBrbAcbBsbBtbBubBvbBwbBxbAcbBybBzbBAbBBbBCbAhbtrbAibBDbBEbBFbBGbBHbBIbBJbBKbApbBLbBLbBLbBLbBLbBLbBLbsebxFbhIbBMbBNbBOblYaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoBaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaabzrbBPbBQbBRbBSbBTbBUbBVbBWbBXbBYbBZbCabCbbAGbCcbCdbxWbzAbCeaIPaIPaIPaIPaIPaIPbCfaIPbpAaIPaIPaIPaIPaIPbCgbChbCiaIPaIPaIPaIPaIPaIPaIPaLzaIPaIPaIPaIPaNhbAVbCjbjDbxabCkbClbCmbCnbCobxabCpbyubyvbCqbxabCrbCsbCtbCubCvbxabhcbyCbvVbvVbvVbvVbvVbrGbrGbrGbrGbrGbrGbCwbCxbCybAcbCzbCAbCBbCCbCDbCEbAcbCFbCGbCHbCIbCJbAhbtrbCKbCLbCMbCNbCObCObCPbCQbCRbApbBLbBLbCSbCTbBLbBLbBLbsebxFbhIbCUbzmbCVblYaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzpbCWbCXbCYbCZbDabDbbDcbDdbDebDfbDdbDgbDhbDibDjbDkbxWbDlbDmbDnbfQbDnbDobDnbDnbDpbDnbDqbfQbDrbDsbfQbDtbDubDvbDwbDxbDybDzbDAbDAbDBbDAbDCbDDbDAbDEbDFbDGbDHbfQbDIbxabDJbDKbDLbxbbxbbxabxbbDMbxbbxabxabxabxabxabxabxabxabhcbhcbDNbDObDPbwZbDQbDRbDSbDTbDUbDVbDRbDWbDXbDYbAcbBsbDZbEabEbbEcbEdbAcbEebEfbEgbEhbEibAhbtrbEjbEkbxzbElbEmbEnbEobEpbEqbApbBLbBLbBLbErbBLbBLbBLbsebEsbEtbEubzmbznblYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzpbzpbzrbzrbzrbzrbzpbzpbEvbEwbACaTRbxWbxWbxWbxWbxWbxWbExbEyaITaITaITaITbEzbEzbEzbEzbEzbEzbEzbEzbEzbEzbEAaHpbEBbECbECbECbECbECbEDbECbECbECbECbEEbEFbEEaIUaKfbEGbxabEHbEIbEJbEKbELbxabEMbyubENbEObEPbEQbERbESbETbEUbEOblDbhcbhcbhcbhcbhcbsWbEVbEWbEXbEWbEYbDRbEZbCxbFabFabFabFabFabFabFabFabFabFbbFbbFbbFbbFbbFbbFcbFdbFebxzbxzbxzbxzbxzbxzbxzbApbsebsebsebsebsebsebsebsebxFbhIbFfbFgblYblYaadaadaadaaeaaeaaeaaeaaeaaeaaeaaeaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFhaaaaaaaaaaadaaaaaabzsbFibFjbFkbFlbFlbFmbFnbFobFpbFqbFrbEyaaaaaaaadaaabEzbFsbFtbFubFvbFwbFxbFybFzbEzbFAbFBbFCbECbFDbFEbFFbFGbFHbFIbFJbFKbFLbFMbFNbEEbEEbEEbEEbxabFObFPbFQbFRbFSbFTbFUbFVbFWbFXbFVbFVbFVbFYbyubFZbGabGbbGcbGcbGdbGebGfbGgbEVbGhbGibGjbGkbDRbEZbCxbFabGlbGlbGlbGmbGlbGlbGlbFabGnbGnbGobGnbGnbFbbGpbGqbGrbGsbGtbGubGvbGwbGxbGybGzbGAbGBbGCbGDbGEbGFbGGbGGbGHbGIbGtbGtblYaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaabzsbzsbGJbGKbGLbDdbGMbGNbGObGObGPbGQbGRbGSaadbGTbGUbGVbGWbGXbFzbGYbFzbGZbFzbFzbFzbEzbHabHbbHcbECbHdbHebHfbHgbHhbHibHjbECbECbHkbHlbHmbHnbHobHpbHqbHrbHsbHtbHubHvbHwbHxbHybHzbHAbHBbHCbyubyubyubHDbjEbjEbjEbjEbjEbHEbHFbwYbEVbHGbHHbEWbHIbDRbEZbCxbFabGlbGlbGlbGlbGlbGlbGlbFabHJbHKbHLbHMbHNbHObHPbHQbGrbHRbHSbHTbHTbHTbHTbHTbHTbHUbHVbHWbGDblYbHXbHYbHZbHZbIabIbbIcbGtatJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadbIdbIebIdaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIfbIfbIfbzsbIgbIhbEwbIibIhbIjbzsbEybIkbEybEybIlbImaaabInbIobIpbIqbFzbFzbIrbFzbIsbItbIubFzbEzbHabHbaTWbECbIvbIwbIxbIybIzbIAbIBbECbCwbICbIDbIEbIDbIFbIGbHAbIHbIIbIJbyubIKbxabILbIMbINbxabIObyubyubyubyubIPbjEbIQbIRbISbITbIUbIVbIWbIXbIYbEWbIZbJabJbbJcbJdbFabGlbGlbJebGlbGlbGlbGlbFabJfbJgbJgbJhbJibJjbJkbJlbGrbJmbJnbHTbHTbHTbJobJpbJqbJqbJqbJqbJrbJsbJtbJubJvbJwbJxbJybJzbHSatJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadbIebIdbJAbIdbIeaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIfbJBbJCbzsbJDbIhbJEbIhbJFbIjbzsbJGbJHbJIbEybIlbImaadbInbJJbJKbJLbJMbJNbJMbJMbJObJPbJQbJQbJRbJSbJTbJUbECbECbECbECbECbJVbJWbECbECbJXbJYbJZbKabJZbKbbKcbxabKdbKebKfbKgbKhbxabKibKjbKkbxabKlbKmbKnbKobKpbKqbjEbgzbKrbKsbKtbKsbKubKvbKwbKxbKybKzbKAbDRbEZbCxbFabFabKBbGlbGlbKCbKBbFabFabKDbKEbKFbKFbKGbFbbKHbKIbGrbKJbHSbHTbHTbKKbKLbKMbHTbKNbKObKPbKQbKRbKSbKTbKUbKVbKWbKXbKYbHSatJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadbKZbIebLabLbbLcbIebKZaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxKbxLbxKbxMbxNbxMbxMbxMbxMbxMbxObxPbmibtHbxQbhYbxRbxSbxTbxUbxVbxWbxXbxXbxXbxWbxWbxYbpAaKebxZbsxbobbyabybbycbydbyebobaaaaaaaadbyfbygbtVbyhbyiaadaaaaaabtZbyjbykbylbymbwTbwUbwVbsHbynaIPbjDbyobypbyqbwYbyrbysbxabytbyubyvbywbyxbjcbyzbyAbyzbyBbxabhcbyCbvVbyDbuBbyEbyFbyGbyHbyIbyJbyJbyKbyLbyMbyNbyObyPbyQbyRbySbyRbyRbyTbyRbyRbyUbyVbyRbyRbyWbyXbyYbxybrXbrYbrZbzcbzdbzebxzbzfbzgbzhbzibzjbzgbzkbsebxFbhIbzlbzmbznblYaaaaaaaaaaaaaaaaaaaaaaadbzoaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqFbnFbnFbnFbhYbnFbnFbnFbzpbzpbzpbzpbzqbzrbzrbzpbzpbzsbztbzubzvbxWbzwbzxbzybzzbxWbzAbpAbbeaTBaTBbobbobbobbobbobbzBbobaILaILaILbtSbzCbzDbzEbtYaILaILaILbsHbsHbsHbsHbsHbsHbsHbsHbsHbzFaIPbzGbxabxabzHbzIbxabxabxabzJbyubzKbyubzLbzMbzNbzObzPbzQbzLbhcbyCbvVbzRbzSbzTbzUbzVbzWbzXbzUbzUbzYbzZbAabAbbAcbAcbAcbAcbAdbAcbAcbAcbAebAebAfbAgbAhbAhbtrbAibtsbxybsabsbbsAbAmbAnbAobApbsebsebAqbAqbAqbsebArbsebxFbhIbAsbzmbAtblYaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaabzpbAubAvbAwbAxbAybAzbzrbAAbABbACbADbxXbAEbAFbAGbAHbxWbzAbpAaIPaLPbAIbAJbAKaLPbiFbALbAMbANaWDaWDaWDbAObAPbAQbARbASaIPaIPaIPaIPaLOaIPaLzbATaIPaIPbAUaIPbAVaIPbAWbxabAXbAYbAZbBabBbbxabBcbyubBdbyubzLbzMbzMbBebBfbBgbzLbhcbBhbvVbuBbBibBjbBkbBlbBmbBnbBobBpbrGbrGbBqbBrbAcbBsbBtbBubBvbBwbBxbAcbBybBzbBAbBBbBCbAhbtrbAibBDbBEbsBbsVbtPbBIbBJbBKbApbBLbBLbBLbBLbBLbBLbBLbsebxFbhIbBMbBNbBOblYaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoBaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaabzrbBPbBQbBRbBSbBTbBUbBVbBWbBXbBYbBZbCabCbbAGbCcbCdbxWbzAbCeaIPaIPaIPaIPaIPaIPbCfaIPbpAaIPaIPaIPaIPaIPbCgbChbCiaIPaIPaIPaIPaIPaIPaIPaLzaIPaIPaIPaIPaNhbAVbCjbjDbxabCkbClbCmbCnbCobxabCpbyubyvbCqbxabCrbCsbCtbCubCvbxabhcbyCbvVbvVbvVbvVbvVbrGbrGbrGbrGbrGbrGbCwbCxbCybAcbCzbCAbCBbCCbCDbCEbAcbCFbCGbCHbCIbCJbAhbtrbCKbCLbCMbtQbyybyybyZbzabzbbApbBLbBLbCSbCTbBLbBLbBLbsebxFbhIbCUbzmbCVblYaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzpbCWbCXbCYbCZbDabDbbDcbDdbDebDfbDdbDgbDhbDibDjbDkbxWbDlbDmbDnbfQbDnbDobDnbDnbDpbDnbDqbfQbDrbDsbfQbDtbDubDvbDwbDxbDybDzbDAbDAbDBbDAbDCbDDbDAbDEbDFbDGbDHbfQbDIbxabDJbDKbDLbxbbxbbxabxbbDMbxbbxabxabxabxabxabxabxabxabhcbhcbDNbDObDPbwZbDQbDRbAjbAkbAlbBFbDRbDWbDXbDYbAcbBsbDZbEabEbbEcbEdbAcbEebEfbEgbEhbEibAhbtrbEjbEkbxzbBGbBHbCNbCObCPbCQbApbBLbBLbBLbErbBLbBLbBLbsebEsbEtbEubzmbznblYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzpbzpbzrbzrbzrbzrbzpbzpbEvbEwbACaTRbxWbxWbxWbxWbxWbxWbExbEyaITaITaITaITbEzbEzbEzbEzbEzbEzbEzbEzbEzbEzbEAaHpbEBbECbECbECbECbECbEDbECbECbECbECbEEbEFbEEaIUaKfbEGbxabEHbEIbEJbEKbELbxabEMbyubENbEObEPbEQbERbESbETbEUbEOblDbhcbhcbhcbhcbhcbsWbEVbCRbDSbCRbDTbDRbEZbCxbFabFabFabFabFabFabFabFabFabFbbFbbFbbFbbFbbFbbFcbFdbFebxzbxzbxzbxzbxzbxzbxzbApbsebsebsebsebsebsebsebsebxFbhIbFfbFgblYblYaadaadaadaaeaaeaaeaaeaaeaaeaaeaaeaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFhaaaaaaaaaaadaaaaaabzsbFibFjbFkbFlbFlbFmbFnbFobFpbFqbFrbEyaaaaaaaadaaabEzbFsbFtbFubFvbFwbFxbFybFzbEzbFAbFBbFCbECbFDbFEbFFbFGbFHbFIbFJbFKbFLbFMbFNbEEbEEbEEbEEbxabFObFPbFQbFRbFSbFTbFUbFVbFWbFXbFVbFVbFVbFYbyubFZbGabGbbGcbGcbGdbGebGfbGgbEVbDUbDVbElbEmbDRbEZbCxbFabGlbGlbGlbGmbGlbGlbGlbFabGnbGnbGobGnbGnbFbbGpbGqbGrbGsbGtbGubGvbGwbGxbGybGzbGAbGBbGCbGDbGEbGFbGGbGGbGHbGIbGtbGtblYaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaabzsbzsbGJbGKbGLbDdbGMbGNbGObGObGPbGQbGRbGSaadbGTbGUbGVbGWbGXbFzbGYbFzbGZbFzbFzbFzbEzbHabHbbHcbECbHdbHebHfbHgbHhbHibHjbECbECbHkbHlbHmbHnbHobHpbHqbHrbHsbHtbHubHvbHwbHxbHybHzbHAbHBbHCbyubyubyubHDbjEbjEbjEbjEbjEbHEbHFbwYbEVbEnbEobCRbEpbDRbEZbCxbFabGlbGlbGlbGlbGlbGlbGlbFabHJbHKbHLbHMbHNbHObHPbHQbGrbHRbHSbHTbHTbHTbHTbHTbHTbHUbHVbHWbGDblYbHXbHYbHZbHZbIabIbbIcbGtatJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadbIdbIebIdaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIfbIfbIfbzsbIgbIhbEwbIibIhbIjbzsbEybIkbEybEybIlbImaaabInbIobIpbIqbFzbFzbIrbFzbIsbItbIubFzbEzbHabHbaTWbECbIvbIwbIxbIybIzbIAbIBbECbCwbICbIDbIEbIDbIFbIGbHAbIHbIIbIJbyubIKbxabILbIMbINbxabIObyubyubyubyubIPbjEbIQbIRbISbITbIUbIVbIWbIXbEqbCRbEWbEXbJbbJcbJdbFabGlbGlbJebGlbGlbGlbGlbFabJfbJgbJgbJhbJibJjbJkbJlbGrbJmbJnbHTbHTbHTbJobJpbJqbJqbJqbJqbJrbJsbJtbJubJvbJwbJxbJybJzbHSatJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadbIebIdbJAbIdbIeaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIfbJBbJCbzsbJDbIhbJEbIhbJFbIjbzsbJGbJHbJIbEybIlbImaadbInbJJbJKbJLbJMbJNbJMbJMbJObJPbJQbJQbJRbJSbJTbJUbECbECbECbECbECbJVbJWbECbECbJXbJYbJZbKabJZbKbbKcbxabKdbKebKfbKgbKhbxabKibKjbKkbxabKlbKmbKnbKobKpbKqbjEbgzbKrbKsbKtbKsbKubKvbKwbEYbGhbGibGjbDRbEZbCxbFabFabKBbGlbGlbKCbKBbFabFabKDbKEbKFbKFbKGbFbbKHbKIbGrbKJbHSbHTbHTbKKbKLbKMbHTbKNbKObKPbKQbKRbKSbKTbKUbKVbKWbKXbKYbHSatJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadbKZbIebLabLbbLcbIebKZaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLdbLebIhbIhbLfbJDbIhbLgbIhbIhbIjbzsbLhbJIbLibEybIlbImaaabInbLjbLkbLlbFzbFzbLmbFzbLnbLobLpbLqbEzbLrbLsbLtbLubLvbLvbLvbLvbLwbLxbLvbLvbLybLzbLAbLBbLCbLDbLEbFTbFTbFTbFTbFTbFTbFTbFTbFTbFTbLFbLFbLFbLFbLFbLFbLGbLHbjEbjEbjEbjEbLIbLJblxbDRbDRbDRbDRbDRbDRbEZbCxbFabLKbLLbLMbLNbLObLPbLQbLRbKDbKEbKFbKFbKGbFbbLSbLTbGrbLUbGtbLVbLWbLXbLYbLZbMabHTbHTbMbbGDbMcbMdbMebGtbMfbMgbMgbGtbGtaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadatJaadaadbIebIebMhbMibMibMibMjbIebIeaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIfbMkbMlbMmbMnbIhbMobMpbMqbMrbzsbEybEybEybEybIlbMsaadbMtbGUbMubGWbMvbFzbMwbFzbFzbFzbMxbMybMzbMAbMBbMCbMDbMEbMEbMEbMEbMFbMEbMGbMHbMIbMJbMKbMLbMMbMNbMObMPbMQbMPbMPbMPbMPbMPbMPbMPbMPbMPbMPbMPbMPbMPbMRbMSbLHbMTbMUbMVbMWbIUbIVbMXbMYbMZbMZbNabNbbMJbMKbNcbFabNdbNebNfbNgbNhbNibNjbLRbLRbLRbLRbLRbLRbNkbNlbNmbNnbNobGtbGDbGDbGDbGDbNpbGDbNqbHTbHTbGDbNrbNsbNtbGtbNubNvbNwbNxbNyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNzbNAbNzbMibNBbMibNCbNDbIdaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIfbIfbIfbzsbzsbIfbIfbIfbzsbzsbzsbNEbEyaaabNFbNGbImaaaaaaaadaaabEzbNHbNIbNJbFzbNKbNLbNMbNNbEzbNObNPbNQbNRbNSbNTbNUbNVbNWbNSbNSbNSbNSbNSbNXbNYbNSbNSbNZbNSbOabNSbNSbNSbNSbNSbEEbEEbEEbEEbEEbEEbEEbEEbCxbEZbLHbObbOcbOdbOebKsbOfbOgbOhbOibOibOjbOibOibOkbOlbFabOmbOnbOobOnbOnbOnbOpbOqbOrbOsbOtbOubOvbOwbOxbKIbGrbOyaadbOzbOAbOBbOCbODbOCbOEbOFbOGbGDbOHbOIbOJbGtbGtbGtbGtbGtbGtaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadatJaadaadbIebIebOKbMibMibMibOLbIebIeaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/templates/hilbertshotel.dmm b/_maps/templates/hilbertshotel.dmm new file mode 100644 index 00000000..4e4d8f82 --- /dev/null +++ b/_maps/templates/hilbertshotel.dmm @@ -0,0 +1,545 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/space/bluespace, +/area/hilbertshotel) +"b" = ( +/turf/closed/indestructible/hotelwall, +/area/hilbertshotel) +"c" = ( +/obj/machinery/jukebox{ + req_access = null + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"d" = ( +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"e" = ( +/obj/structure/table/wood, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"f" = ( +/obj/structure/table/wood, +/obj/structure/showcase/machinery/tv, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"g" = ( +/obj/structure/dresser, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"h" = ( +/obj/structure/table/wood/fancy, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"i" = ( +/obj/structure/table/wood/fancy, +/obj/structure/mirror{ + pixel_y = 24 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"j" = ( +/obj/structure/table/wood/fancy, +/obj/item/flashlight/lamp/green, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"k" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"l" = ( +/obj/structure/table/wood/poker, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"m" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"n" = ( +/obj/effect/landmark/xmastree, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"o" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"p" = ( +/obj/structure/mineral_door/wood, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"q" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"r" = ( +/obj/structure/closet/cabinet{ + anchored = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"s" = ( +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"t" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"u" = ( +/obj/structure/mineral_door/paperframe, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"v" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 32 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"w" = ( +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"x" = ( +/obj/structure/curtain, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"y" = ( +/obj/machinery/door/window/northleft, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"z" = ( +/obj/structure/table/reinforced, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"A" = ( +/obj/structure/mirror{ + pixel_x = -32 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"B" = ( +/obj/structure/chair/stool/bar, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"C" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"D" = ( +/obj/machinery/light_switch{ + pixel_x = 32 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"E" = ( +/obj/structure/table/reinforced, +/obj/item/soap/deluxe, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"F" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"G" = ( +/obj/machinery/light_switch{ + pixel_x = -32 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"H" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"I" = ( +/turf/closed/indestructible/hoteldoor, +/area/hilbertshotel) +"J" = ( +/obj/machinery/light/small, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"K" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"L" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"M" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"N" = ( +/obj/structure/table/reinforced, +/obj/item/soap/deluxe, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"O" = ( +/obj/item/bikehorn/rubberducky, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"P" = ( +/obj/machinery/light/small, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"Q" = ( +/obj/machinery/smartfridge/food, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"R" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"S" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"T" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"U" = ( +/obj/structure/table/reinforced, +/obj/structure/sink/kitchen, +/obj/machinery/light/small, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"V" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/lootdrop/three_course_meal, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +b +b +b +b +b +I +b +b +b +b +b +b +b +a +"} +(3,1,1) = {" +a +b +d +d +k +d +d +t +d +y +t +H +z +b +a +"} +(4,1,1) = {" +a +b +e +d +l +o +d +d +B +z +d +d +z +b +a +"} +(5,1,1) = {" +a +b +f +d +l +o +d +d +B +V +d +d +U +b +a +"} +(6,1,1) = {" +a +b +e +d +l +o +d +d +B +z +d +d +z +b +a +"} +(7,1,1) = {" +a +b +c +d +m +d +D +K +v +z +M +Q +z +b +a +"} +(8,1,1) = {" +a +b +b +b +b +p +b +b +b +b +b +b +b +b +a +"} +(9,1,1) = {" +a +b +g +d +t +d +G +u +w +A +N +A +E +b +a +"} +(10,1,1) = {" +a +b +h +d +d +d +d +b +w +w +w +w +w +b +a +"} +(11,1,1) = {" +a +b +i +d +n +d +J +b +L +w +R +w +P +b +a +"} +(12,1,1) = {" +a +b +h +d +d +d +r +b +x +F +S +T +x +b +a +"} +(13,1,1) = {" +a +b +d +d +d +d +d +b +w +w +w +w +w +b +a +"} +(14,1,1) = {" +a +b +d +j +q +q +s +b +w +C +O +C +w +b +a +"} +(15,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(16,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/templates/hilbertshotelempty.dmm b/_maps/templates/hilbertshotelempty.dmm new file mode 100644 index 00000000..a0482c93 --- /dev/null +++ b/_maps/templates/hilbertshotelempty.dmm @@ -0,0 +1,289 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/space/bluespace, +/area/hilbertshotel) +"b" = ( +/turf/closed/indestructible/hotelwall, +/area/hilbertshotel) +"c" = ( +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"d" = ( +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"e" = ( +/turf/closed/indestructible/hoteldoor, +/area/hilbertshotel) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +b +b +b +b +b +e +b +b +b +b +b +b +b +a +"} +(3,1,1) = {" +a +b +c +c +c +c +c +c +c +c +c +c +c +b +a +"} +(4,1,1) = {" +a +b +c +c +c +c +c +c +c +c +c +c +c +b +a +"} +(5,1,1) = {" +a +b +c +c +c +c +c +c +c +c +c +c +c +b +a +"} +(6,1,1) = {" +a +b +c +c +c +c +c +c +c +c +c +c +c +b +a +"} +(7,1,1) = {" +a +b +c +c +c +c +c +c +c +c +c +c +c +b +a +"} +(8,1,1) = {" +a +b +b +b +b +c +b +b +b +b +b +b +b +b +a +"} +(9,1,1) = {" +a +b +c +c +c +c +c +c +d +d +d +d +d +b +a +"} +(10,1,1) = {" +a +b +c +c +c +c +c +b +d +d +d +d +d +b +a +"} +(11,1,1) = {" +a +b +c +c +c +c +c +b +d +d +d +d +d +b +a +"} +(12,1,1) = {" +a +b +c +c +c +c +c +b +d +d +d +d +d +b +a +"} +(13,1,1) = {" +a +b +c +c +c +c +c +b +d +d +d +d +d +b +a +"} +(14,1,1) = {" +a +b +c +c +c +c +c +b +d +d +d +d +d +b +a +"} +(15,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(16,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/templates/hilbertshotellore.dmm b/_maps/templates/hilbertshotellore.dmm new file mode 100644 index 00000000..f6be66bd --- /dev/null +++ b/_maps/templates/hilbertshotellore.dmm @@ -0,0 +1,639 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/space/bluespace, +/area/hilbertshotel) +"ab" = ( +/turf/closed/indestructible/hotelwall, +/area/hilbertshotel) +"ac" = ( +/obj/structure/table/wood/fancy, +/obj/structure/mirror{ + broken = 1; + desc = "Oh no, seven years of bad luck!"; + icon_state = "mirror_broke"; + pixel_y = 24 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ad" = ( +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ae" = ( +/obj/structure/table/wood, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"af" = ( +/obj/structure/table/wood, +/obj/structure/showcase/machinery/tv, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ag" = ( +/obj/structure/dresser, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ah" = ( +/obj/structure/table/wood/fancy, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ai" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aj" = ( +/obj/structure/table/wood/fancy, +/obj/item/flashlight/lamp/green, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ak" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"al" = ( +/obj/structure/table/wood/poker, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"am" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"an" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ap" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aq" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ar" = ( +/obj/structure/mineral_door/wood, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"as" = ( +/turf/closed/indestructible/hoteldoor, +/area/hilbertshotel) +"at" = ( +/obj/effect/decal/cleanable/cobweb, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"au" = ( +/obj/machinery/light_switch{ + pixel_x = -32 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"av" = ( +/obj/machinery/light/small, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aw" = ( +/obj/structure/closet/cabinet{ + anchored = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ax" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ay" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"az" = ( +/obj/structure/mineral_door/paperframe, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aA" = ( +/obj/structure/chair/stool/bar, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aB" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 32 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aC" = ( +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aD" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aE" = ( +/obj/structure/curtain, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aF" = ( +/obj/machinery/door/window/northleft, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aG" = ( +/obj/structure/table/reinforced, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aH" = ( +/obj/structure/table/reinforced, +/obj/item/pen, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aI" = ( +/obj/structure/mirror{ + pixel_x = -32 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aJ" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aK" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aL" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aM" = ( +/obj/structure/table/wood/poker, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aN" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aO" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aP" = ( +/obj/item/bikehorn/rubberducky, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aQ" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aR" = ( +/obj/machinery/smartfridge/food, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aS" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aT" = ( +/obj/structure/table/reinforced, +/obj/structure/sink/kitchen, +/obj/machinery/light/small, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aU" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aV" = ( +/obj/machinery/light/small, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aW" = ( +/obj/machinery/jukebox{ + req_access = null + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aX" = ( +/obj/machinery/light_switch{ + pixel_x = 32 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aY" = ( +/obj/structure/chair/stool/bar, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/vomit, +/obj/effect/mob_spawn/human/doctorhilbert, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aZ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"ba" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"bb" = ( +/obj/structure/mirror{ + pixel_x = -32 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"bc" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"bd" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"be" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"bf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"bg" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"bh" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/item/soap/homemade{ + name = "used soap" + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"bi" = ( +/obj/effect/decal/cleanable/vomit, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"bj" = ( +/obj/structure/table/reinforced, +/obj/item/soap/homemade{ + name = "used soap" + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"bk" = ( +/obj/structure/table/reinforced, +/obj/item/analyzer/hilbertsanalyzer, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"bl" = ( +/obj/structure/table/reinforced, +/obj/item/paper/crumpled/bloody/docsdeathnote, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +ab +ab +ab +ab +ab +as +ab +ab +ab +ab +ab +ab +ab +aa +"} +(3,1,1) = {" +aa +ab +at +aL +ak +ad +aL +an +ad +aF +be +aQ +aG +ab +aa +"} +(4,1,1) = {" +aa +ab +ae +ad +al +aq +ad +ad +aA +aH +ad +aL +aG +ab +aa +"} +(5,1,1) = {" +aa +ab +af +ad +ai +aq +aL +ad +aY +bl +ad +aL +aT +ab +aa +"} +(6,1,1) = {" +aa +ab +ae +ad +aM +aq +ad +ad +aA +bk +bf +bf +aG +ab +aa +"} +(7,1,1) = {" +aa +ab +aW +aL +am +ad +aX +ay +aB +aG +bg +aR +aG +ab +aa +"} +(8,1,1) = {" +aa +ab +ab +ab +ab +ar +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(9,1,1) = {" +aa +ab +ag +ad +an +ad +au +az +aC +bb +bh +aI +bj +ab +aa +"} +(10,1,1) = {" +aa +ab +ah +ad +aL +aL +ad +ab +aZ +aZ +aC +aZ +aZ +ab +aa +"} +(11,1,1) = {" +aa +ab +ac +ad +ad +aL +av +ab +aD +aC +aN +bi +aV +ab +aa +"} +(12,1,1) = {" +aa +ab +ah +ad +aL +ad +aw +ab +aE +aJ +aO +aS +aE +ab +aa +"} +(13,1,1) = {" +aa +ab +ad +ad +aL +ad +ad +ab +aC +bc +aZ +aZ +aC +ab +aa +"} +(14,1,1) = {" +aa +ab +ax +aj +ap +aU +ah +ab +ba +bd +aP +aK +aC +ab +aa +"} +(15,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(16,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/templates/hilbertshotelstorage.dmm b/_maps/templates/hilbertshotelstorage.dmm new file mode 100644 index 00000000..756e2e51 --- /dev/null +++ b/_maps/templates/hilbertshotelstorage.dmm @@ -0,0 +1,23 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/hotelwall, +/area/hilbertshotelstorage) +"b" = ( +/turf/open/indestructible/hotelwood, +/area/hilbertshotelstorage) + +(1,1,1) = {" +a +a +a +"} +(2,1,1) = {" +a +b +a +"} +(3,1,1) = {" +a +a +a +"} diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 39f70246..068a5e3c 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -2,32 +2,45 @@ #define CHECK_DNA_AND_SPECIES(C) if((!(C.dna)) || (!(C.dna.species))) return -//Defines copying names of mutations in all cases, make sure to change this if you change mutation's name -#define HULK "Hulk" -#define XRAY "X Ray Vision" -#define COLDRES "Cold Resistance" -#define TK "Telekinesis" -#define NERVOUS "Nervousness" -#define EPILEPSY "Epilepsy" -#define MUTATE "Unstable DNA" -#define COUGH "Cough" -#define DWARFISM "Dwarfism" -#define CLOWNMUT "Clumsiness" -#define TOURETTES "Tourettes Syndrome" -#define DEAFMUT "Deafness" -#define BLINDMUT "Blindness" -#define RACEMUT "Monkified" -#define BADSIGHT "Near Sightness" -#define LASEREYES "Laser Eyes" -#define CHAMELEON "Chameleon" -#define WACKY "Wacky" -#define MUT_MUTE "Mute" -#define SMILE "Smile" -#define STONER "Stoner" -#define UNINTELLIGIBLE "Unintelligible" -#define SWEDISH "Swedish" -#define CHAV "Chav" -#define ELVIS "Elvis" +//Defines copying names of mutations in all cases, make sure to change this if you change mutation's type +#define HULK /datum/mutation/human/hulk +#define XRAY /datum/mutation/human/thermal/x_ray +#define SPACEMUT /datum/mutation/human/space_adaptation +#define TK /datum/mutation/human/telekinesis +#define NERVOUS /datum/mutation/human/nervousness +#define EPILEPSY /datum/mutation/human/epilepsy +#define MUTATE /datum/mutation/human/bad_dna +#define COUGH /datum/mutation/human/cough +#define DWARFISM /datum/mutation/human/dwarfism +#define CLOWNMUT /datum/mutation/human/clumsy +#define TOURETTES /datum/mutation/human/tourettes +#define DEAFMUT /datum/mutation/human/deaf +#define BLINDMUT /datum/mutation/human/blind +#define RACEMUT /datum/mutation/human/race +#define BADSIGHT /datum/mutation/human/nearsight +#define LASEREYES /datum/mutation/human/laser_eyes +#define CHAMELEON /datum/mutation/human/chameleon +#define WACKY /datum/mutation/human/wacky +#define MUT_MUTE /datum/mutation/human/mute +#define SMILE /datum/mutation/human/smile +#define STONER /datum/mutation/human/stoner +#define UNINTELLIGIBLE /datum/mutation/human/unintelligible +#define SWEDISH /datum/mutation/human/swedish +#define CHAV /datum/mutation/human/chav +#define ELVIS /datum/mutation/human/elvis +#define RADIOACTIVE /datum/mutation/human/radioactive +#define GLOWY /datum/mutation/human/glow +#define TELEPATHY /datum/mutation/human/telepathy +#define FIREBREATH /datum/mutation/human/firebreath +#define VOID /datum/mutation/human/void +#define STRONG /datum/mutation/human/strong +#define FIRESWEAT /datum/mutation/human/fire +#define THERMAL /datum/mutation/human/thermal +#define INSULATED /datum/mutation/human/insulated +#define SHOCKTOUCH /datum/mutation/human/shock +#define ANTENNA /datum/mutation/human/antenna +#define PARANOIA /datum/mutation/human/paranoia +#define MINDREAD /datum/mutation/human/mindreader #define UI_CHANGED "ui changed" #define UE_CHANGED "ue changed" @@ -39,10 +52,13 @@ //Types of usual mutations #define POSITIVE 1 #define NEGATIVE 2 -#define MINOR_NEGATIVE 3 +#define MINOR_NEGATIVE 4 -//Mutations that cant be taken from genetics and are not in SE -#define NON_SCANNABLE -1 + +//Mutation classes. Normal being on them, extra being additional mutations with instability and other being stuff you dont want people to fuck with like wizard mutate +#define MUT_NORMAL 1 +#define MUT_EXTRA 2 +#define MUT_OTHER 3 //DNA - Because fuck you and your magic numbers being all over the codebase. #define DNA_BLOCK_SIZE 3 @@ -63,7 +79,8 @@ #define DNA_MUTANTMARKING_BLOCK 13 #define DNA_TAUR_BLOCK 14 -#define DNA_STRUC_ENZYMES_BLOCKS 18 +#define DNA_SEQUENCE_LENGTH 4 +#define DNA_MUTATION_BLOCKS 8 #define DNA_UNIQUE_ENZYMES_LEN 32 //Transformation proc stuff @@ -126,4 +143,11 @@ ////organ defines #define STANDARD_ORGAN_THRESHOLD 100 #define STANDARD_ORGAN_HEALING 0.001 -#define STANDARD_ORGAN_DECAY 0.00222 //designed to fail organs when left to decay for ~15 minutes \ No newline at end of file +#define STANDARD_ORGAN_DECAY 0.00222 //designed to fail organs when left to decay for ~15 minutes + + + +//used for the can_chromosome var on mutations +#define CHROMOSOME_NEVER 0 +#define CHROMOSOME_NONE 1 +#define CHROMOSOME_USED 2 \ No newline at end of file diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index c7bf018a..f9427409 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -81,3 +81,10 @@ #define SPAM_TRIGGER_WARNING 5 //Number of identical messages required before the spam-prevention will warn you to stfu #define SPAM_TRIGGER_AUTOMUTE 10 //Number of identical messages required before the spam-prevention will automute you + +///Max length of a keypress command before it's considered to be a forged packet/bogus command +#define MAX_KEYPRESS_COMMANDLENGTH 16 +///Max amount of keypress messages per second over two seconds before client is autokicked +#define MAX_KEYPRESS_AUTOKICK 100 +///Length of held key rolling buffer +#define HELD_KEY_BUFFER_LENGTH 15 \ No newline at end of file diff --git a/code/__DEFINES/mecha.dm b/code/__DEFINES/mecha.dm new file mode 100644 index 00000000..bf62e6b6 --- /dev/null +++ b/code/__DEFINES/mecha.dm @@ -0,0 +1,17 @@ +#define MECHA_INT_FIRE (1<<0) +#define MECHA_INT_TEMP_CONTROL (1<<1) +#define MECHA_INT_SHORT_CIRCUIT (1<<2) +#define MECHA_INT_TANK_BREACH (1<<3) +#define MECHA_INT_CONTROL_LOST (1<<4) + +#define MECHA_MELEE (1 << 0) +#define MECHA_RANGED (1 << 1) + +#define MECHA_FRONT_ARMOUR 1 +#define MECHA_SIDE_ARMOUR 2 +#define MECHA_BACK_ARMOUR 3 + +#define MECHA_LOCKED 0 +#define MECHA_SECURE_BOLTS 1 +#define MECHA_LOOSE_BOLTS 2 +#define MECHA_OPEN_HATCH 3 diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 97886591..98d630b7 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -82,7 +82,7 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define HANDS_LAYER 3 #define BODY_FRONT_LAYER 2 #define FIRE_LAYER 1 //If you're on fire -#define TOTAL_LAYERS 30 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; +#define TOTAL_LAYERS 31 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; //Human Overlay Index Shortcuts for alternate_worn_layer, layers //Because I *KNOW* somebody will think layer+1 means "above" diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index fb4718d4..f5256122 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -91,3 +91,5 @@ #define STATUS_EFFECT_RAINBOWPROTECTION /datum/status_effect/rainbow_protection //Invulnerable and pacifistic #define STATUS_EFFECT_SLIMESKIN /datum/status_effect/slimeskin //Increased armor + +#define STATUS_EFFECT_DNA_MELT /datum/status_effect/dna_melt //usually does something horrible to you when you hit 100 genetic instability diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index ed000713..4cb885db 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -153,6 +153,8 @@ #define TRAIT_FRIENDLY "friendly" #define TRAIT_ASSBLASTUSA "assblastusa" #define TRAIT_CULT_EYES "cult_eyes" +#define TRAIT_XRAY_VISION "xray_vision" +#define TRAIT_THERMAL_VISION "thermal_vision" // common trait sources diff --git a/code/__HELPERS/dna.dm b/code/__HELPERS/dna.dm new file mode 100644 index 00000000..b366f9c4 --- /dev/null +++ b/code/__HELPERS/dna.dm @@ -0,0 +1,12 @@ +////////////////////////////////////////////////////////// +//A bunch of helpers to make genetics less of a headache// +////////////////////////////////////////////////////////// + +#define GET_INITIALIZED_MUTATION(A) GLOB.all_mutations[A] +#define GET_GENE_STRING(A, B) (B.mutation_index[A]) +#define GET_SEQUENCE(A) (GLOB.full_sequences[A]) + +#define GET_MUTATION_STABILIZER(A) ((A.stabilizer_coeff < 0) ? 1 : A.stabilizer_coeff) +#define GET_MUTATION_SYNCHRONIZER(A) ((A.synchronizer_coeff < 0) ? 1 : A.synchronizer_coeff) +#define GET_MUTATION_POWER(A) ((A.power_coeff < 0) ? 1 : A.power_coeff) +#define GET_MUTATION_ENERGY(A) ((A.energy_coeff < 0) ? 1 : A.energy_coeff) \ No newline at end of file diff --git a/code/_globalvars/genetics.dm b/code/_globalvars/genetics.dm index 7016415d..3b16a4ad 100644 --- a/code/_globalvars/genetics.dm +++ b/code/_globalvars/genetics.dm @@ -21,8 +21,11 @@ GLOBAL_LIST(op_se_blocks) GLOBAL_VAR(NULLED_SE) GLOBAL_VAR(NULLED_UI) -GLOBAL_LIST_EMPTY(global_mutations) // list of hidden mutation things +GLOBAL_LIST_EMPTY(all_mutations) +GLOBAL_LIST_EMPTY(full_sequences) GLOBAL_LIST_EMPTY(bad_mutations) GLOBAL_LIST_EMPTY(good_mutations) -GLOBAL_LIST_EMPTY(not_good_mutations) \ No newline at end of file +GLOBAL_LIST_EMPTY(not_good_mutations) + +GLOBAL_LIST_EMPTY(mutation_recipes) \ No newline at end of file diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 42094a4b..52f3515d 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -86,7 +86,7 @@ var/widescreenlayout = FALSE //CIT CHANGE - adds support for different hud layouts depending on widescreen pref if(owner.client && owner.client.prefs && owner.client.prefs.widescreenpref) //CIT CHANGE - ditto - widescreenlayout = TRUE // CIT CHANGE - ditto + widescreenlayout = FALSE // CIT CHANGE - ditto var/obj/screen/using var/obj/screen/inventory/inv_box diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index ab6c2fb1..e9caca75 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -351,6 +351,7 @@ switch(user.m_intent) if(MOVE_INTENT_WALK) icon_state = "walking" + if(MOVE_INTENT_RUN) icon_state = "running" diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 12b1ca27..71ef48bb 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -1,12 +1,10 @@ /* Telekinesis - This needs more thinking out, but I might as well. */ /* Telekinetic attack: - By default, emulate the user's unarmed attack */ @@ -45,7 +43,6 @@ /* This is similar to item attack_self, but applies to anything that you can grab with a telekinetic grab. - It is used for manipulating things at range, for example, opening and closing closets. There are not a lot of defaults at this time, add more where appropriate. */ @@ -59,7 +56,6 @@ /* TK Grab Item (the workhorse of old TK) - * If you have not grabbed something, do a normal tk attack * If you have something, throw it at the target. If it is already adjacent, do a normal attackby() * If you click what you are holding, or attack_self(), do an attack_self_tk() on it. @@ -196,4 +192,4 @@ return (OXYLOSS) -#undef TK_MAXRANGE +#undef TK_MAXRANGE \ No newline at end of file diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index d94526e6..3aaa4a11 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -16,7 +16,7 @@ SUBSYSTEM_DEF(atoms) /datum/controller/subsystem/atoms/Initialize(timeofday) GLOB.fire_overlay.appearance_flags = RESET_COLOR - setupGenetics() //to set the mutations' place in structural enzymes, so monkey.initialize() knows where to put the monkey mutation. + setupGenetics() //to set the mutations' sequence initialized = INITIALIZATION_INNEW_MAPLOAD InitializeAtoms() return ..() @@ -108,16 +108,19 @@ SUBSYSTEM_DEF(atoms) BadInitializeCalls = SSatoms.BadInitializeCalls /datum/controller/subsystem/atoms/proc/setupGenetics() - var/list/avnums = new /list(DNA_STRUC_ENZYMES_BLOCKS) - for(var/i=1, i<=DNA_STRUC_ENZYMES_BLOCKS, i++) - avnums[i] = i - CHECK_TICK - - for(var/A in subtypesof(/datum/mutation/human)) - var/datum/mutation/human/B = new A() - if(B.dna_block == NON_SCANNABLE) + var/list/mutations = subtypesof(/datum/mutation/human) + shuffle_inplace(mutations) + for(var/A in subtypesof(/datum/generecipe)) + var/datum/generecipe/GR = A + GLOB.mutation_recipes[initial(GR.required)] = initial(GR.result) + for(var/i in 1 to LAZYLEN(mutations)) + var/path = mutations[i] //byond gets pissy when we do it in one line + var/datum/mutation/human/B = new path () + B.alias = "Mutation #[i]" + GLOB.all_mutations[B.type] = B + GLOB.full_sequences[B.type] = generate_gene_sequence(B.blocks) + if(B.locked) continue - B.dna_block = pick_n_take(avnums) if(B.quality == POSITIVE) GLOB.good_mutations |= B else if(B.quality == NEGATIVE) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index a365405c..345e3bb4 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -33,6 +33,7 @@ SUBSYSTEM_DEF(mapping) var/list/z_list var/datum/space_level/transit var/datum/space_level/empty_space + var/num_of_res_levels = 1 //dlete dis once #39770 is resolved /datum/controller/subsystem/mapping/proc/HACK_LoadMapConfig() @@ -449,6 +450,11 @@ GLOBAL_LIST_EMPTY(the_station_areas) for(var/i in levels_by_trait(ZTRAIT_RESERVED)) if(reserve.Reserve(width, height, i)) return reserve + //If we didn't return at this point, theres a good chance we ran out of room on the exisiting reserved z levels, so lets try a new one + num_of_res_levels += 1 + var/newReserved = add_new_zlevel("Transit/Reserved [num_of_res_levels]", list(ZTRAIT_RESERVED = TRUE)) + if(reserve.Reserve(width, height, newReserved)) + return reserve else if(!level_trait(z, ZTRAIT_RESERVED)) qdel(reserve) @@ -481,6 +487,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) LAZYINITLIST(unused_turfs["[T.z]"]) unused_turfs["[T.z]"] |= T T.flags_1 |= UNUSED_RESERVATION_TURF_1 + GLOB.areas_by_type[world.area].contents += T CHECK_TICK //DO NOT CALL THIS PROC DIRECTLY, CALL wipe_reservations(). diff --git a/code/datums/components/footstep.dm b/code/datums/components/footstep.dm index a8c46e54..fd25f972 100644 --- a/code/datums/components/footstep.dm +++ b/code/datums/components/footstep.dm @@ -3,7 +3,7 @@ var/volume var/e_range -/datum/component/footstep/Initialize(volume_ = 0.5, e_range_ = -1) +/datum/component/footstep/Initialize(volume_ = 0.4, e_range_ = -1) if(!isliving(parent)) return COMPONENT_INCOMPATIBLE volume = volume_ @@ -32,7 +32,7 @@ return if(ishuman(C) && C.m_intent == MOVE_INTENT_WALK) v /= 2 - e -= 5 + e -= 4 steps++ if(steps >= 3) @@ -58,7 +58,7 @@ if(isclawfoot(LM)) if(isalienadult(LM)) //xenos are stealthy and get quieter footsteps v /= 3 - e -= 5 + e -= 4 playsound(T, pick(GLOB.clawfootstep[T.clawfootstep][1]), GLOB.clawfootstep[T.clawfootstep][2] * v, diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 3a2efb9d..8cfb84cb 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -277,7 +277,6 @@ L.fields["sex"] = H.gender L.fields["blood_type"] = H.dna.blood_type L.fields["b_dna"] = H.dna.unique_enzymes - L.fields["enzymes"] = H.dna.struc_enzymes L.fields["identity"] = H.dna.uni_identity L.fields["species"] = H.dna.species.type L.fields["features"] = H.dna.features diff --git a/code/datums/diseases/advance/symptoms/genetics.dm b/code/datums/diseases/advance/symptoms/genetics.dm index 7f21b03d..49b229e5 100644 --- a/code/datums/diseases/advance/symptoms/genetics.dm +++ b/code/datums/diseases/advance/symptoms/genetics.dm @@ -58,12 +58,12 @@ Bonus symptom_delay_max = 60 if(A.properties["resistance"] >= 8) //mutate twice power = 2 - possible_mutations = (GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.mutations_list[RACEMUT] + possible_mutations = (GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.all_mutations[RACEMUT] var/mob/living/carbon/M = A.affected_mob if(M) if(!M.has_dna()) return - archived_dna = M.dna.struc_enzymes + archived_dna = M.dna.mutation_index // Give them back their old DNA when cured. /datum/symptom/genetic_mutation/End(datum/disease/advance/A) @@ -74,5 +74,5 @@ Bonus if(M && archived_dna) if(!M.has_dna()) return - M.dna.struc_enzymes = archived_dna + M.dna.mutation_index = archived_dna M.domutcheck() diff --git a/code/datums/dna.dm b/code/datums/dna.dm index fe4b2dbe..e6f33680 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -2,7 +2,6 @@ /////////////////////////// DNA DATUM /datum/dna var/unique_enzymes - var/struc_enzymes var/uni_identity var/blood_type var/datum/species/species = new /datum/species/human //The type of mutant race the player is if applicable (i.e. potato-man) @@ -11,10 +10,13 @@ var/nameless = FALSE var/custom_species //siiiiigh I guess this is important var/list/mutations = list() //All mutations are from now on here - var/list/temporary_mutations = list() //Timers for temporary mutations + var/list/temporary_mutations = list() //Temporary changes to the UE var/list/previous = list() //For temporary name/ui/ue/blood_type modifications var/mob/living/holder var/delete_species = TRUE //Set to FALSE when a body is scanned by a cloner to fix #38875 + var/mutation_index[DNA_MUTATION_BLOCKS] //List of which mutations this carbon has and its assigned block + var/stability = 100 + var/scrambled = FALSE //Did we take something like mutagen? In that case we cant get our genes scanned to instantly cheese all the powers. /datum/dna/New(mob/living/new_holder) if(istype(new_holder)) @@ -53,11 +55,11 @@ H.give_genitals(TRUE)//This gives the body the genitals of this DNA. Used for any transformations based on DNA destination.flavor_text = destination.dna.features["flavor_text"] //Update the flavor_text to use new dna text if(transfer_SE) - destination.dna.struc_enzymes = struc_enzymes + destination.dna.mutation_index = mutation_index /datum/dna/proc/copy_dna(datum/dna/new_dna) new_dna.unique_enzymes = unique_enzymes - new_dna.struc_enzymes = struc_enzymes + new_dna.mutation_index = mutation_index new_dna.uni_identity = uni_identity new_dna.blood_type = blood_type new_dna.features = features.Copy() @@ -67,26 +69,32 @@ new_dna.custom_species = custom_species new_dna.mutations = mutations.Copy() -/datum/dna/proc/add_mutation(mutation_name) - var/datum/mutation/human/HM = GLOB.mutations_list[mutation_name] - HM.on_acquiring(holder) +//See mutation.dm for what 'class' does. 'time' is time till it removes itself in decimals. 0 for no timer +/datum/dna/proc/add_mutation(mutation, class = MUT_OTHER, time) + var/mutation_type = mutation + if(istype(mutation, /datum/mutation/human)) + var/datum/mutation/human/HM = mutation + mutation_type = HM.type + if(get_mutation(mutation_type)) + return + return force_give(new mutation_type (class, time, copymut = mutation)) -/datum/dna/proc/remove_mutation(mutation_name) - var/datum/mutation/human/HM = GLOB.mutations_list[mutation_name] - HM.on_losing(holder) +/datum/dna/proc/remove_mutation(mutation_type) + return force_lose(get_mutation(mutation_type)) -/datum/dna/proc/check_mutation(mutation_name) - var/datum/mutation/human/HM = GLOB.mutations_list[mutation_name] - return mutations.Find(HM) +/datum/dna/proc/check_mutation(mutation_type) + return get_mutation(mutation_type) -/datum/dna/proc/remove_all_mutations() - remove_mutation_group(mutations) +/datum/dna/proc/remove_all_mutations(list/classes = list(MUT_NORMAL, MUT_EXTRA, MUT_OTHER), mutadone = FALSE) + remove_mutation_group(mutations, classes, mutadone) + scrambled = FALSE -/datum/dna/proc/remove_mutation_group(list/group) +/datum/dna/proc/remove_mutation_group(list/group, list/classes = list(MUT_NORMAL, MUT_EXTRA, MUT_OTHER), mutadone = FALSE) if(!group) return for(var/datum/mutation/human/HM in group) - HM.force_lose(holder) + if((HM.class in classes) && !(HM.mutadone_proof && mutadone)) + force_lose(HM) /datum/dna/proc/generate_uni_identity() . = "" @@ -128,19 +136,49 @@ . += random_string(DNA_BLOCK_SIZE,GLOB.hex_characters) return . -/datum/dna/proc/generate_struc_enzymes() - var/list/sorting = new /list(DNA_STRUC_ENZYMES_BLOCKS) - var/result = "" - for(var/datum/mutation/human/A in GLOB.good_mutations + GLOB.bad_mutations + GLOB.not_good_mutations) - if(A.name == RACEMUT && ismonkey(holder)) - sorting[A.dna_block] = num2hex(A.lowest_value + rand(0, 256 * 6), DNA_BLOCK_SIZE) - mutations |= A - else - sorting[A.dna_block] = random_string(DNA_BLOCK_SIZE, list("0","1","2","3","4","5","6")) +/datum/dna/proc/generate_dna_blocks() + var/bonus + if(species && species.inert_mutation) + bonus = GET_INITIALIZED_MUTATION(species.inert_mutation) + var/list/mutations_temp = GLOB.good_mutations + GLOB.bad_mutations + GLOB.not_good_mutations + bonus + if(!LAZYLEN(mutations_temp)) + return + mutation_index.Cut() + shuffle_inplace(mutations_temp) + if(ismonkey(holder)) + mutations |= new RACEMUT(MUT_NORMAL) + mutation_index[RACEMUT] = GET_SEQUENCE(RACEMUT) + else + mutation_index[RACEMUT] = create_sequence(RACEMUT, FALSE) + for(var/i in 2 to DNA_MUTATION_BLOCKS) + var/datum/mutation/human/M = mutations_temp[i] + mutation_index[M.type] = create_sequence(M.type, FALSE,M.difficulty) + shuffle_inplace(mutation_index) - for(var/B in sorting) - result += B - return result +//Used to generate original gene sequences for every mutation +/proc/generate_gene_sequence(length=4) + var/static/list/active_sequences = list("AT","TA","GC","CG") + var/sequence + for(var/i in 1 to length*DNA_SEQUENCE_LENGTH) + sequence += pick(active_sequences) + return sequence + +//Used to create a chipped gene sequence +/proc/create_sequence(mutation, active, difficulty) + if(!difficulty) + var/datum/mutation/human/A = GET_INITIALIZED_MUTATION(mutation) //leaves the possibility to change difficulty mid-round + if(!A) + return + difficulty = A.difficulty + difficulty += rand(-2,4) + var/sequence = GET_SEQUENCE(mutation) + if(active) + return sequence + while(difficulty) + var/randnum = rand(1, length(sequence)) + sequence = copytext(sequence, 1, randnum) + "X" + copytext(sequence, randnum+1, length(sequence)+1) + difficulty-- + return sequence /datum/dna/proc/generate_unique_enzymes() . = "" @@ -185,12 +223,57 @@ if(DNA_TAUR_BLOCK) construct_block(GLOB.taur_list.Find(features["taur"]), GLOB.taur_list.len) +//Please use add_mutation or activate_mutation instead +/datum/dna/proc/force_give(datum/mutation/human/HM) + if(holder && HM) + if(HM.class == MUT_NORMAL) + set_se(1, HM) + . = HM.on_acquiring(holder) + if(.) + qdel(HM) + update_instability() + +//Use remove_mutation instead +/datum/dna/proc/force_lose(datum/mutation/human/HM) + if(holder && (HM in mutations)) + set_se(0, HM) + . = HM.on_losing(holder) + update_instability(FALSE) + return + /datum/dna/proc/is_same_as(datum/dna/D) - if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name && nameless == D.nameless && custom_species == D.custom_species) + if(uni_identity == D.uni_identity && mutation_index == D.mutation_index && real_name == D.real_name && nameless == D.nameless && custom_species == D.custom_species) if(species.type == D.species.type && features == D.features && blood_type == D.blood_type) return 1 return 0 +/datum/dna/proc/update_instability(alert=TRUE) + stability = 100 + for(var/datum/mutation/human/M in mutations) + if(M.class == MUT_EXTRA) + stability -= M.instability * GET_MUTATION_STABILIZER(M) + if(holder) + var/message + if(alert) + switch(stability) + if(70 to 90) + message = "You shiver." + if(60 to 69) + message = "You feel cold." + if(40 to 59) + message = "You feel sick." + if(20 to 39) + message = "It feels like your skin is moving." + if(1 to 19) + message = "You can feel your cells burning." + if(-INFINITY to 0) + message = "You can feel your DNA exploding, we need to do something fast!" + if(stability <= 0) + holder.apply_status_effect(STATUS_EFFECT_DNA_MELT) + if(message) + to_chat(holder, message) + + //used to update dna UI, UE, and dna.real_name. /datum/dna/proc/update_dna_identity() uni_identity = generate_uni_identity() @@ -201,7 +284,7 @@ blood_type = newblood_type unique_enzymes = generate_unique_enzymes() uni_identity = generate_uni_identity() - struc_enzymes = generate_struc_enzymes() + generate_dna_blocks() features = random_features() @@ -265,7 +348,7 @@ return dna -/mob/living/carbon/human/proc/hardset_dna(ui, se, newreal_name, newblood_type, datum/species/mrace, newfeatures) +/mob/living/carbon/human/proc/hardset_dna(ui, list/mutation_index, newreal_name, newblood_type, datum/species/mrace, newfeatures) if(newfeatures) dna.features = newfeatures @@ -287,8 +370,8 @@ dna.uni_identity = ui updateappearance(icon_update=0) - if(se) - dna.struc_enzymes = se + if(LAZYLEN(mutation_index)) + dna.mutation_index = mutation_index domutcheck() if(mrace || newfeatures || ui) @@ -331,19 +414,63 @@ /mob/proc/domutcheck() return -/mob/living/carbon/domutcheck(force_powers=0) //Set force_powers to 1 to bypass the power chance +/mob/living/carbon/domutcheck() if(!has_dna()) return - for(var/datum/mutation/human/A in GLOB.good_mutations | GLOB.bad_mutations | GLOB.not_good_mutations) - if(ismob(A.check_block(src, force_powers))) + for(var/mutation in dna.mutation_index) + if(ismob(dna.check_block(mutation))) return //we got monkeyized/humanized, this mob will be deleted, no need to continue. update_mutations_overlay() +/datum/dna/proc/check_block(mutation) + var/datum/mutation/human/HM = get_mutation(mutation) + if(check_block_string(mutation)) + if(!HM) + . = add_mutation(mutation, MUT_NORMAL) + return + return force_lose(HM) + +//Return the active mutation of a type if there is one +/datum/dna/proc/get_mutation(A) + for(var/datum/mutation/human/HM in mutations) + if(HM.type == A) + return HM + +/datum/dna/proc/check_block_string(mutation) + if((LAZYLEN(mutation_index) > DNA_MUTATION_BLOCKS) || !(mutation in mutation_index)) + return 0 + return is_gene_active(mutation) + +/datum/dna/proc/is_gene_active(mutation) + return (mutation_index[mutation] == GET_SEQUENCE(mutation)) + +/datum/dna/proc/set_se(on=TRUE, datum/mutation/human/HM) + if(!HM || !(HM.type in mutation_index) || (LAZYLEN(mutation_index) < DNA_MUTATION_BLOCKS)) + return + . = TRUE + if(on) + mutation_index[HM.type] = GET_SEQUENCE(HM.type) + else if(GET_SEQUENCE(HM.type) == mutation_index[HM.type]) + mutation_index[HM.type] = create_sequence(HM.type, FALSE, HM.difficulty) + +/datum/dna/proc/activate_mutation(mutation) //note that this returns a boolean and not a new mob + if(!mutation) + return FALSE + var/mutation_type = mutation + if(istype(mutation, /datum/mutation/human)) + var/datum/mutation/human/M = mutation + mutation_type = M.type + if(!mutation_in_sequence(mutation_type)) //cant activate what we dont have, use add_mutation + return FALSE + add_mutation(mutation, MUT_NORMAL) + return TRUE + /////////////////////////// DNA HELPER-PROCS ////////////////////////////// + /proc/getleftblocks(input,blocknumber,blocksize) if(blocknumber > 1) return copytext(input,1,((blocksize*blocknumber)-(blocksize-1))) @@ -360,29 +487,47 @@ return 0 return getleftblocks(istring, blocknumber, blocksize) + replacement + getrightblocks(istring, blocknumber, blocksize) +/datum/dna/proc/mutation_in_sequence(mutation) + if(!mutation) + return + if(istype(mutation, /datum/mutation/human)) + var/datum/mutation/human/HM = mutation + if(HM.type in mutation_index) + return TRUE + else if(mutation in mutation_index) + return TRUE + /mob/living/carbon/proc/randmut(list/candidates, difficulty = 2) if(!has_dna()) return - var/datum/mutation/human/num = pick(candidates) - . = num.force_give(src) + var/mutation = pick(candidates) + . = dna.add_mutation(mutation) -/mob/living/carbon/proc/randmutb() +/mob/living/carbon/proc/easy_randmut(quality = POSITIVE + NEGATIVE + MINOR_NEGATIVE, scrambled = TRUE, sequence = TRUE, exclude_monkey = TRUE) if(!has_dna()) return - var/datum/mutation/human/HM = pick((GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.mutations_list[RACEMUT]) - . = HM.force_give(src) + var/list/mutations = list() + if(quality & POSITIVE) + mutations += GLOB.good_mutations + if(quality & NEGATIVE) + mutations += GLOB.bad_mutations + if(quality & MINOR_NEGATIVE) + mutations += GLOB.not_good_mutations + var/list/possible = list() + for(var/datum/mutation/human/A in mutations) + if((!sequence || dna.mutation_in_sequence(A.type)) && !dna.get_mutation(A.type)) + possible += A.type + if(exclude_monkey) + possible.Remove(RACEMUT) + if(LAZYLEN(possible)) + var/mutation = pick(possible) + . = dna.activate_mutation(mutation) + if(scrambled) + var/datum/mutation/human/HM = dna.get_mutation(mutation) + if(HM) + HM.scrambled = TRUE + return TRUE -/mob/living/carbon/proc/randmutg() - if(!has_dna()) - return - var/datum/mutation/human/HM = pick(GLOB.good_mutations) - . = HM.force_give(src) - -/mob/living/carbon/proc/randmutvg() - if(!has_dna()) - return - var/datum/mutation/human/HM = pick((GLOB.good_mutations) - GLOB.mutations_list[HULK] - GLOB.mutations_list[DWARFISM]) - . = HM.force_give(src) /mob/living/carbon/proc/randmuti() if(!has_dna()) @@ -405,9 +550,9 @@ if(!M.has_dna()) return 0 if(se) - for(var/i=1, i<=DNA_STRUC_ENZYMES_BLOCKS, i++) + for(var/i=1, i<=DNA_MUTATION_BLOCKS, i++) if(prob(probability)) - M.dna.struc_enzymes = setblock(M.dna.struc_enzymes, i, random_string(DNA_BLOCK_SIZE, GLOB.hex_characters)) + M.dna.generate_dna_blocks() M.domutcheck() if(ui) for(var/i=1, i<=DNA_UNI_IDENTITY_BLOCKS, i++) @@ -434,3 +579,41 @@ return value /////////////////////////// DNA HELPER-PROCS + +/mob/living/carbon/human/proc/something_horrible() + if(!has_dna()) //shouldn't ever happen anyway so it's just in really weird cases + return + if(dna.stability > 0) + return + var/instability = -dna.stability + dna.remove_all_mutations() + dna.stability = 100 + if(prob(max(70-instability,0))) + switch(rand(0,3)) //not complete and utter death + if(0) + monkeyize() + if(1) + gain_trauma(/datum/brain_trauma/severe/paralysis) + if(2) + corgize() + if(3) + to_chat(src, "Oh, we actually feel quite alright!") + else + switch(rand(0,3)) + if(0) + gib() + if(1) + dust() + + if(2) + death() + petrify(INFINITY) + if(3) + if(prob(90)) + var/obj/item/bodypart/BP = get_bodypart(pick(BODY_ZONE_CHEST,BODY_ZONE_HEAD)) + if(BP) + BP.dismember() + else + gib() + else + set_species(/datum/species/dullahan) \ No newline at end of file diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index efa248b4..9234e124 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -1,58 +1,55 @@ -GLOBAL_LIST_EMPTY(mutations_list) - /datum/mutation var/name -/datum/mutation/New() - GLOB.mutations_list[name] = src - /datum/mutation/human - var/dna_block + name = "mutation" + var/desc = "A mutation." + var/locked var/quality var/get_chance = 100 var/lowest_value = 256 * 8 var/text_gain_indication = "" var/text_lose_indication = "" var/list/mutable_appearance/visual_indicators = list() + var/obj/effect/proc_holder/spell/power var/layer_used = MUTATIONS_LAYER //which mutation layer to use var/list/species_allowed = list() //to restrict mutation to only certain species var/health_req //minimum health required to acquire the mutation var/limb_req //required limbs to acquire this mutation var/time_coeff = 1 //coefficient for timed mutations + var/datum/dna/dna + var/mob/living/carbon/human/owner + var/instability = 0 //instability the holder gets when the mutation is not native + var/blocks = 4 //Amount of those big blocks with gene sequences + var/difficulty = 8 //Amount of missing sequences. Sometimes it removes an entire pair for 2 points + var/timed = FALSE //Boolean to easily check if we're going to self destruct + var/alias //'Mutation #49', decided every round to get some form of distinction between undiscovered mutations + var/scrambled = FALSE //Wheter we can read it if it's active. To avoid cheesing with mutagen + var/class //Decides player accesibility, sorta + //MUT_NORMAL - A mutation that can be activated and deactived by completing a sequence + //MUT_EXTRA - A mutation that is in the mutations tab, and can be given and taken away through though the DNA console. Has a 0 before it's name in the mutation section of the dna console + //MUT_OTHER Cannot be interacted with by players through normal means. I.E. wizards mutate -/datum/mutation/human/proc/force_give(mob/living/carbon/human/owner) - set_block(owner) - . = on_acquiring(owner) + var/can_chromosome = CHROMOSOME_NONE //can we take chromosomes? 0: CHROMOSOME_NEVER never, 1:CHROMOSOME_NONE yeah, 2: CHROMOSOME_USED no, already have one + var/chromosome_name //purely cosmetic + var/modified = FALSE //ugly but we really don't want chromosomes and on_acquiring to overlap and apply double the powers + var/mutadone_proof = FALSE -/datum/mutation/human/proc/force_lose(mob/living/carbon/human/owner) - set_block(owner, 0) - . = on_losing(owner) + //Chromosome stuff - set to -1 to prevent people from changing it. Example: It'd be a waste to decrease cooldown on mutism + var/stabilizer_coeff = 1 //genetic stability coeff + var/synchronizer_coeff = -1 //makes the mutation hurt the user less + var/power_coeff = -1 //boosts mutation strength + var/energy_coeff = -1 //lowers mutation cooldown -/datum/mutation/human/proc/set_se(se_string, on = 1) - if(!se_string || lentext(se_string) < DNA_STRUC_ENZYMES_BLOCKS * DNA_BLOCK_SIZE) - return - var/before = copytext(se_string, 1, ((dna_block - 1) * DNA_BLOCK_SIZE) + 1) - var/injection = num2hex(on ? rand(lowest_value, (256 * 16) - 1) : rand(0, lowest_value - 1), DNA_BLOCK_SIZE) - var/after = copytext(se_string, (dna_block * DNA_BLOCK_SIZE) + 1, 0) - return before + injection + after - -/datum/mutation/human/proc/set_block(mob/living/carbon/owner, on = 1) - if(owner && owner.has_dna()) - owner.dna.struc_enzymes = set_se(owner.dna.struc_enzymes, on) - -/datum/mutation/human/proc/check_block_string(se_string) - if(!se_string || lentext(se_string) < DNA_STRUC_ENZYMES_BLOCKS * DNA_BLOCK_SIZE) - return 0 - if(hex2num(getblock(se_string, dna_block)) >= lowest_value) - return 1 - -/datum/mutation/human/proc/check_block(mob/living/carbon/human/owner, force_powers=0) - if(check_block_string(owner.dna.struc_enzymes)) - if(prob(get_chance)||force_powers) - . = on_acquiring(owner) - else - . = on_losing(owner) +/datum/mutation/human/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) + . = ..() + class = class_ + if(timer) + addtimer(CALLBACK(src, .proc/remove), timer) + timed = TRUE + if(copymut && istype(copymut, /datum/mutation/human)) + copy_mutation(copymut) /datum/mutation/human/proc/on_acquiring(mob/living/carbon/human/owner) if(!owner || !istype(owner) || owner.stat == DEAD || (src in owner.dna.mutations)) @@ -63,7 +60,8 @@ GLOBAL_LIST_EMPTY(mutations_list) return TRUE if(limb_req && !owner.get_bodypart(limb_req)) return TRUE - owner.dna.mutations.Add(src) + dna = owner.dna + dna.mutations += src if(text_gain_indication) to_chat(owner, text_gain_indication) if(visual_indicators.len) @@ -75,6 +73,10 @@ GLOBAL_LIST_EMPTY(mutations_list) owner.overlays_standing[layer_used] = mut_overlay owner.apply_overlay(layer_used) + grant_spell(owner) + if(!modified) + addtimer(CALLBACK(src, .proc/modify, 5)) //gonna want children calling ..() to run first + /datum/mutation/human/proc/get_visual_indicator(mob/living/carbon/human/owner) return @@ -102,26 +104,80 @@ GLOBAL_LIST_EMPTY(mutations_list) mut_overlay.Remove(get_visual_indicator(owner)) owner.overlays_standing[layer_used] = mut_overlay owner.apply_overlay(layer_used) + if(power) + owner.RemoveSpell(power) + qdel(src) return 0 return 1 +/datum/mutation/human/proc/say_mod(message) + if(message) + return message + +/datum/mutation/human/proc/get_spans() + return list() + /mob/living/carbon/proc/update_mutations_overlay() return /mob/living/carbon/human/update_mutations_overlay() for(var/datum/mutation/human/CM in dna.mutations) if(CM.species_allowed.len && !CM.species_allowed.Find(dna.species.id)) - CM.force_lose(src) //shouldn't have that mutation at all + dna.force_lose(CM) //shouldn't have that mutation at all continue if(CM.visual_indicators.len) var/list/mut_overlay = list() if(overlays_standing[CM.layer_used]) mut_overlay = overlays_standing[CM.layer_used] - var/mutable_appearance/V = CM.get_visual_indicator(src) + var/mutable_appearance/V = CM.get_visual_indicator() if(!mut_overlay.Find(V)) //either we lack the visual indicator or we have the wrong one remove_overlay(CM.layer_used) - for(var/mutable_appearance/MA in CM.visual_indicators) + for(var/mutable_appearance/MA in CM.visual_indicators[CM.type]) mut_overlay.Remove(MA) mut_overlay |= V overlays_standing[CM.layer_used] = mut_overlay apply_overlay(CM.layer_used) + + +/datum/mutation/human/proc/modify() //called when a genome is applied so we can properly update some stats without having to remove and reapply the mutation from someone + if(modified || !power || !owner) + return + power.charge_max *= GET_MUTATION_ENERGY(src) + power.charge_counter *= GET_MUTATION_ENERGY(src) + modified = TRUE + +/datum/mutation/human/proc/copy_mutation(datum/mutation/human/HM) + if(!HM) + return + chromosome_name = HM.chromosome_name + stabilizer_coeff = HM.stabilizer_coeff + synchronizer_coeff = HM.synchronizer_coeff + power_coeff = HM.power_coeff + energy_coeff = HM.energy_coeff + mutadone_proof = HM.mutadone_proof + can_chromosome = HM.can_chromosome + +/datum/mutation/human/proc/remove_chromosome() + stabilizer_coeff = initial(stabilizer_coeff) + synchronizer_coeff = initial(synchronizer_coeff) + power_coeff = initial(power_coeff) + energy_coeff = initial(energy_coeff) + mutadone_proof = initial(mutadone_proof) + can_chromosome = initial(can_chromosome) + chromosome_name = null + +/datum/mutation/human/proc/remove() + if(dna) + dna.force_lose(src) + else + qdel(src) + +/datum/mutation/human/proc/grant_spell(mob/living/carbon/human/owner) + if(!ispath(power) || !owner) + return FALSE + + power = new power() + power.action_background_icon_state = "bg_tech_blue_on" + power.panel = "Genetic" + owner.AddSpell(power) + return TRUE \ No newline at end of file diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm new file mode 100644 index 00000000..44187cc9 --- /dev/null +++ b/code/datums/mutations/actions.dm @@ -0,0 +1,169 @@ +/datum/mutation/human/telepathy + name = "Telepathy" + desc = "A rare mutation that allows the user to telepathically communicate to others." + quality = POSITIVE + text_gain_indication = "You can hear your own voice echoing in your mind!" + text_lose_indication = "You don't hear your mind echo anymore." + difficulty = 12 + power = /obj/effect/proc_holder/spell/targeted/telepathy/genetic + instability = 10 + energy_coeff = 1 + +/datum/mutation/human/telepathy/on_acquiring(mob/living/carbon/human/owner) + . = ..() + +/datum/mutation/human/telepathy/on_losing(mob/living/carbon/human/owner) + . = ..() + +/obj/effect/proc_holder/spell/targeted/telepathy/genetic + magic_check = FALSE + +/datum/mutation/human/firebreath + name = "Fire Breath" + desc = "An ancient mutation that gives lizards breath of fire." + quality = POSITIVE + difficulty = 12 + locked = TRUE + text_gain_indication = "Your throat is burning!" + text_lose_indication = "Your throat is cooling down." + power = /obj/effect/proc_holder/spell/aimed/firebreath + instability = 30 + energy_coeff = 1 + power_coeff = 1 + +/datum/mutation/human/firebreath/modify() + if(power) + var/obj/effect/proc_holder/spell/aimed/firebreath/S = power + S.strength = GET_MUTATION_POWER(src) + +/obj/effect/proc_holder/spell/aimed/firebreath + name = "Fire Breath" + desc = "You can breathe fire at a target." + school = "evocation" + charge_max = 1200 + clothes_req = FALSE + range = 20 + projectile_type = /obj/item/projectile/magic/aoe/fireball/firebreath + base_icon_state = "fireball" + action_icon_state = "fireball0" + sound = 'sound/magic/demon_dies.ogg' //horrifying lizard noises + active_msg = "You built up heat in your mouth." + deactive_msg = "You swallow the flame." + var/strength = 1 + +/obj/effect/proc_holder/spell/aimed/firebreath/before_cast(list/targets) + . = ..() + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + if(C.is_mouth_covered()) + C.adjust_fire_stacks(2) + C.IgniteMob() + to_chat(C,"Something in front of your mouth caught fire!") + return FALSE + +/obj/effect/proc_holder/spell/aimed/firebreath/ready_projectile(obj/item/projectile/P, atom/target, mob/user, iteration) + if(!istype(P, /obj/item/projectile/magic/aoe/fireball)) + return + var/obj/item/projectile/magic/aoe/fireball/F = P + switch(strength) + if(1 to 3) + F.exp_light = strength-1 + if(4 to INFINITY) + F.exp_heavy = strength-3 + F.exp_fire += strength + + +/obj/item/projectile/magic/aoe/fireball/firebreath + name = "fire breath" + exp_heavy = 0 + exp_light = 0 + exp_flash = 0 + exp_fire= 4 + +/datum/mutation/human/void + name = "Void Magnet" + desc = "A rare genome that attracts odd forces not usually observed." + quality = MINOR_NEGATIVE //upsides and downsides + text_gain_indication = "You feel a heavy, dull force just beyond the walls watching you." + instability = 30 + power = /obj/effect/proc_holder/spell/self/void + energy_coeff = 1 + synchronizer_coeff = 1 + +/datum/mutation/human/void/on_life(mob/living/carbon/human/owner) + if(!isturf(owner.loc)) + return + if(prob((0.5+((100-dna.stability)/20))) * GET_MUTATION_SYNCHRONIZER(src)) //very rare, but enough to annoy you hopefully. +0.5 probability for every 10 points lost in stability + new /obj/effect/immortality_talisman/void(get_turf(owner), owner) + +/obj/effect/proc_holder/spell/self/void + name = "Convoke Void" //magic the gathering joke here + desc = "A rare genome that attracts odd forces not usually observed. May sometimes pull you in randomly." + school = "evocation" + clothes_req = FALSE + charge_max = 600 + invocation = "DOOOOOOOOOOOOOOOOOOOOM!!!" + invocation_type = "shout" + action_icon_state = "void_magnet" + var/in_use = FALSE //so it doesnt cast while you are already deep innit + +/obj/effect/proc_holder/spell/self/void/can_cast(mob/user = usr) + . = ..() + if(!isturf(user.loc)) + return FALSE + +/obj/effect/proc_holder/spell/self/void/cast(mob/user = usr) + . = ..() + new /obj/effect/immortality_talisman/void(get_turf(user), user) + +/datum/mutation/human/shock + name = "Shock Touch" + desc = "The affected can channel excess electricity through their hands without shocking themselves, allowing them to shock others." + quality = POSITIVE + locked = TRUE + difficulty = 16 + text_gain_indication = "You feel power flow through your hands." + text_lose_indication = "The energy in your hands subsides." + power = /obj/effect/proc_holder/spell/targeted/touch/shock + instability = 30 + +/obj/effect/proc_holder/spell/targeted/touch/shock + name = "Shock Touch" + desc = "Channel electricity to your hand to shock people with." + drawmessage = "You channel electricity into your hand." + dropmessage = "You let the electricity from your hand dissipate." + hand_path = /obj/item/melee/touch_attack/shock + charge_max = 400 + clothes_req = FALSE + action_icon_state = "zap" + +/obj/item/melee/touch_attack/shock + name = "\improper shock touch" + desc = "This is kind of like when you rub your feet on a shag rug so you can zap your friends, only a lot less safe." + catchphrase = null + on_use_sound = 'sound/weapons/zapbang.ogg' + icon_state = "zapper" + item_state = "zapper" + +/obj/item/melee/touch_attack/shock/afterattack(atom/target, mob/living/carbon/user, proximity) + if(!proximity || !isliving(target)) + return + if(iscarbon(target)) + var/mob/living/carbon/C = target + if(C.electrocute_act(15, user, 1, stun = 0))//doesnt stun. never let this stun + C.dropItemToGround(C.get_active_held_item()) + C.dropItemToGround(C.get_inactive_held_item()) + C.confused += 10 + C.visible_message("[user] electrocutes [target]!","[user] electrocutes you!") + return ..() + else + user.visible_message("[user] fails to electrocute [target]!") + return ..() + else if(isliving(target)) + var/mob/living/L = target + L.electrocute_act(15, user, 1, stun = 0) + L.visible_message("[user] electrocutes [target]!","[user] electrocutes you!") + return ..() + else + to_chat(user,"The electricity doesn't seem to affect [target]...") + return ..() \ No newline at end of file diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm new file mode 100644 index 00000000..7e06a917 --- /dev/null +++ b/code/datums/mutations/antenna.dm @@ -0,0 +1,107 @@ +/datum/mutation/human/antenna + name = "Antenna" + desc = "The affected person sprouts an antenna. This is known to allow them to access common radio channels passively." + quality = POSITIVE + text_gain_indication = "You feel an antenna sprout from your forehead." + text_lose_indication = "Your antenna shrinks back down." + instability = 5 + difficulty = 8 + var/obj/item/implant/radio/antenna/linked_radio + +/obj/item/implant/radio/antenna + name = "internal antenna organ" + desc = "The internal organ part of the antenna. Science has not yet given it a good name." + icon = 'icons/obj/radio.dmi'//maybe make a unique sprite later. not important + icon_state = "walkietalkie" + +/obj/item/implant/radio/antenna/Initialize(mapload) + ..() + radio.name = "internal antenna" + +/datum/mutation/human/antenna/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + linked_radio = new(owner) + linked_radio.implant(owner, null, TRUE, TRUE) + +/datum/mutation/human/antenna/on_losing(mob/living/carbon/human/owner) + if(..()) + return + if(linked_radio) + linked_radio.Destroy() + +/datum/mutation/human/antenna/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) + ..() + if(!(type in visual_indicators)) + visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "antenna", -FRONT_MUTATIONS_LAYER+1))//-MUTATIONS_LAYER+1 + +/datum/mutation/human/antenna/get_visual_indicator(mob/living/carbon/human/owner) + return visual_indicators[type][1] + +/datum/mutation/human/mindreader + name = "Mind Reader" + desc = "The affected person can look into the recent memories of others." + quality = POSITIVE + text_gain_indication = "You hear distant voices at the corners of your mind." + text_lose_indication = "The distant voices fade." + power = /obj/effect/proc_holder/spell/targeted/mindread + instability = 40 + difficulty = 8 + locked = TRUE + +/obj/effect/proc_holder/spell/targeted/mindread + name = "Mindread" + desc = "Read the target's mind." + charge_max = 300 + range = 7 + clothes_req = FALSE + action_icon_state = "mindread" + +/obj/effect/proc_holder/spell/targeted/mindread/cast(list/targets, mob/living/carbon/human/user = usr) + for(var/mob/living/M in targets) + if(usr.anti_magic_check(FALSE, FALSE, TRUE, 0) || M.anti_magic_check(FALSE, FALSE, TRUE, 0)) + to_chat(usr, "As you reach out with your mind, you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled.") + return + if(M.stat == DEAD) + to_chat(user, "[M] is dead!") + return + if(M.mind) + to_chat(user, "You plunge into [M]'s mind...") + if(prob(20)) + to_chat(M, "You feel something foreign enter your mind.")//chance to alert the read-ee + var/list/recent_speech = list() + var/list/say_log = list() + var/log_source = M.logging + for(var/log_type in log_source)//this whole loop puts the read-ee's say logs into say_log in an easy to access way + var/nlog_type = text2num(log_type) + if(nlog_type & LOG_SAY) + var/list/reversed = log_source[log_type] + if(islist(reversed)) + say_log = reverseRange(reversed.Copy()) + break + if(LAZYLEN(say_log)) + for(var/spoken_memory in say_log) + if(recent_speech.len >= 3)//up to 3 random lines of speech, favoring more recent speech + break + if(prob(50)) + recent_speech[spoken_memory] = say_log[spoken_memory] + if(recent_speech.len) + to_chat(user, "You catch some drifting memories of their past conversations...") + for(var/spoken_memory in recent_speech) + to_chat(user, "[recent_speech[spoken_memory]]") + if(iscarbon(M)) + var/mob/living/carbon/human/H = M + to_chat(user, "You find that their intent is to [H.a_intent]...") + var/datum/dna/the_dna = H.has_dna() + if(the_dna) + to_chat(user, "You uncover that [H.p_their()] true identity is [the_dna.real_name].") + else + to_chat(user, "You can't find a mind to read inside of [M]!") + +/datum/mutation/human/mindreader/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) + ..() + if(!(type in visual_indicators)) + visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "antenna", -FRONT_MUTATIONS_LAYER+1)) + +/datum/mutation/human/mindreader/get_visual_indicator(mob/living/carbon/human/owner) + return visual_indicators[type][1] \ No newline at end of file diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index a32220aa..a64f4afd 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -3,16 +3,19 @@ //Epilepsy gives a very small chance to have a seizure every life tick, knocking you unconscious. /datum/mutation/human/epilepsy name = "Epilepsy" + desc = "A genetic defect that sporadically causes seizures." quality = NEGATIVE text_gain_indication = "You get a headache." + synchronizer_coeff = 1 + power_coeff = 1 /datum/mutation/human/epilepsy/on_life(mob/living/carbon/human/owner) - if(prob(1) && owner.stat == CONSCIOUS) + if(prob(1 * GET_MUTATION_SYNCHRONIZER(src)) && owner.stat == CONSCIOUS) owner.visible_message("[owner] starts having a seizure!", "You have a seizure!") - owner.Unconscious(200) - owner.Jitter(1000) + owner.Unconscious(200 * GET_MUTATION_POWER(src)) + owner.Jitter(1000 * GET_MUTATION_POWER(src)) SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "epilepsy", /datum/mood_event/epilepsy) - addtimer(CALLBACK(src, .proc/jitter_less, owner), 90) + addtimer(CALLBACK(src, .proc/jitter_less), 90) /datum/mutation/human/epilepsy/proc/jitter_less(mob/living/carbon/human/owner) if(owner) @@ -22,19 +25,23 @@ //Unstable DNA induces random mutations! /datum/mutation/human/bad_dna name = "Unstable DNA" + desc = "Strange mutation that causes the holder to randomly mutate." quality = NEGATIVE text_gain_indication = "You feel strange." + locked = TRUE /datum/mutation/human/bad_dna/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return to_chat(owner, text_gain_indication) var/mob/new_mob if(prob(95)) if(prob(50)) - new_mob = owner.randmutb() + new_mob = owner.easy_randmut(NEGATIVE + MINOR_NEGATIVE) else new_mob = owner.randmuti() else - new_mob = owner.randmutg() + new_mob = owner.easy_randmut(POSITIVE) if(new_mob && ismob(new_mob)) owner = new_mob . = owner @@ -44,21 +51,31 @@ //Cough gives you a chronic cough that causes you to drop items. /datum/mutation/human/cough name = "Cough" + desc = "A chronic cough." quality = MINOR_NEGATIVE text_gain_indication = "You start coughing." + synchronizer_coeff = 1 + power_coeff = 1 /datum/mutation/human/cough/on_life(mob/living/carbon/human/owner) - if(prob(5) && owner.stat == CONSCIOUS) + if(prob(5 * GET_MUTATION_SYNCHRONIZER(src)) && owner.stat == CONSCIOUS) owner.drop_all_held_items() owner.emote("cough") + if(GET_MUTATION_POWER(src) > 1) + var/cough_range = GET_MUTATION_POWER(src) * 4 + var/turf/target = get_ranged_target_turf(owner, turn(owner.dir, 180), cough_range) + owner.throw_at(target, cough_range, GET_MUTATION_POWER(src)) + //Dwarfism shrinks your body and lets you pass tables. /datum/mutation/human/dwarfism name = "Dwarfism" + desc = "A mutation believed to be the cause of dwarfism." quality = POSITIVE - get_chance = 15 - lowest_value = 256 * 12 + difficulty = 16 + instability = 5 + locked = TRUE // Default intert species for now, so locked from regular pool. /datum/mutation/human/dwarfism/on_acquiring(mob/living/carbon/human/owner) if(..()) @@ -78,6 +95,7 @@ //Clumsiness has a very large amount of small drawbacks depending on item. /datum/mutation/human/clumsy name = "Clumsiness" + desc = "A genome that inhibits certain brain functions, causing the holder to appear clumsy. Honk" quality = MINOR_NEGATIVE text_gain_indication = "You feel lightheaded." @@ -95,11 +113,13 @@ //Tourettes causes you to randomly stand in place and shout. /datum/mutation/human/tourettes name = "Tourette's Syndrome" + desc = "A chronic twitch that forces the user to use colorful language." quality = NEGATIVE text_gain_indication = "You twitch." + synchronizer_coeff = 1 /datum/mutation/human/tourettes/on_life(mob/living/carbon/human/owner) - if(prob(10) && owner.stat == CONSCIOUS && !owner.IsStun()) + if(prob(10 * GET_MUTATION_SYNCHRONIZER(src)) && owner.stat == CONSCIOUS && !owner.IsStun()) owner.Stun(200) switch(rand(1, 3)) if(1) @@ -117,6 +137,7 @@ //Deafness makes you deaf. /datum/mutation/human/deaf name = "Deafness" + desc = "The holder of this genome is completely deaf." quality = NEGATIVE text_gain_indication = "You can't seem to hear anything." @@ -134,8 +155,10 @@ //Monified turns you into a monkey. /datum/mutation/human/race name = "Monkified" + desc = "A strange genome, believing to be what differentiates monkeys from humans." quality = NEGATIVE time_coeff = 2 + locked = TRUE //Species specific, keep out of actual gene pool /datum/mutation/human/race/on_acquiring(mob/living/carbon/human/owner) if(..()) @@ -145,3 +168,95 @@ /datum/mutation/human/race/on_losing(mob/living/carbon/monkey/owner) if(owner && istype(owner) && owner.stat != DEAD && (owner.dna.mutations.Remove(src))) . = owner.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) + + +/datum/mutation/human/glow + name = "Glowy" + desc = "You permanently emit a light with a random color and intensity." + quality = POSITIVE + text_gain_indication = "Your skin begins to glow softly." + instability = 5 + var/obj/effect/dummy/luminescent_glow/glowth //shamelessly copied from luminescents + var/glow = 1.5 + power_coeff = 1 + +/datum/mutation/human/glow/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + glowth = new(owner) + glowth.set_light(glow, glow, dna.features["mcolor"]) + +/datum/mutation/human/glow/modify(mob/living/carbon/human/owner) + if(glowth) + glowth.set_light(glow + GET_MUTATION_POWER(src) , glow + GET_MUTATION_POWER(src), dna.features["mcolor"]) + +/datum/mutation/human/glow/on_losing(mob/living/carbon/human/owner) + if(..()) + return + qdel(glowth) + +/datum/mutation/human/strong + name = "Strength" + desc = "The user's muscles slightly expand." + quality = POSITIVE + text_gain_indication = "You feel strong." + difficulty = 16 + +/datum/mutation/human/fire + name = "Fiery Sweat" + desc = "The user's skin will randomly combust, but is generally alot more resilient to burning." + quality = NEGATIVE + text_gain_indication = "You feel hot." + text_lose_indication = "You feel a lot cooler." + difficulty = 14 + synchronizer_coeff = 1 + power_coeff = 1 + +/datum/mutation/human/fire/on_life(mob/living/carbon/human/owner) + if(prob((1+(100-dna.stability)/10)) * GET_MUTATION_SYNCHRONIZER(src)) + owner.adjust_fire_stacks(2 * GET_MUTATION_POWER(src)) + owner.IgniteMob() + +/datum/mutation/human/fire/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + owner.physiology.burn_mod *= 0.5 + +/datum/mutation/human/fire/on_losing(mob/living/carbon/human/owner) + if(..()) + return + owner.physiology.burn_mod *= 2 + +/datum/mutation/human/insulated + name = "Insulated" + desc = "The affected person does not conduct electricity." + quality = POSITIVE + text_gain_indication = "Your fingertips go numb." + text_lose_indication = "Your fingertips regain feeling." + difficulty = 16 + instability = 25 + +/datum/mutation/human/insulated/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, "genetics") + +/datum/mutation/human/insulated/on_losing(mob/living/carbon/human/owner) + if(..()) + return + REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "genetics") + +/datum/mutation/human/paranoia + name = "Paranoia" + desc = "Subject is easily terrified, and may suffer from hallucinations." + quality = NEGATIVE + text_gain_indication = "You feel screams echo through your mind..." + text_lose_indication = "The screaming in your mind fades." + +/datum/mutation/human/paranoia/on_life(mob/living/carbon/human/owner) + if(prob(5) && owner.stat == CONSCIOUS) + owner.emote("scream") + owner.jitteriness = min(max(0, owner.jitteriness + 5), 30) + if(prob(25)) + to_chat(owner,"You feel someone creeping in on you...") + owner.hallucination += 20 \ No newline at end of file diff --git a/code/datums/mutations/chameleon.dm b/code/datums/mutations/chameleon.dm index da105109..7682351e 100644 --- a/code/datums/mutations/chameleon.dm +++ b/code/datums/mutations/chameleon.dm @@ -1,12 +1,13 @@ //Chameleon causes the owner to slowly become transparent when not moving. /datum/mutation/human/chameleon name = "Chameleon" + desc = "A genome that causes the holder's skin to become transparent over time." quality = POSITIVE - get_chance = 20 - lowest_value = 256 * 12 + difficulty = 16 text_gain_indication = "You feel one with your surroundings." text_lose_indication = "You feel oddly exposed." time_coeff = 5 + instability = 25 /datum/mutation/human/chameleon/on_acquiring(mob/living/carbon/human/owner) if(..()) diff --git a/code/datums/mutations/cold_resistance.dm b/code/datums/mutations/cold_resistance.dm index 3d8fbaba..4b6beb7b 100644 --- a/code/datums/mutations/cold_resistance.dm +++ b/code/datums/mutations/cold_resistance.dm @@ -1,32 +1,29 @@ //Cold Resistance gives your entire body an orange halo, and makes you immune to the effects of vacuum and cold. -/datum/mutation/human/cold_resistance - name = "Cold Resistance" +/datum/mutation/human/space_adaptation + name = "Space Adaptation" + desc = "A strange mutation that renders the host immune to the vacuum if space. Will still need an oxygen supply." quality = POSITIVE - get_chance = 25 - lowest_value = 256 * 12 + difficulty = 16 text_gain_indication = "Your body feels warm!" time_coeff = 5 + instability = 30 -/datum/mutation/human/cold_resistance/New() +/datum/mutation/human/space_adaptation/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) ..() - visual_indicators |= mutable_appearance('icons/effects/genetics.dmi', "fire", -MUTATIONS_LAYER) + if(!(type in visual_indicators)) + visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "fire", -MUTATIONS_LAYER)) -/datum/mutation/human/cold_resistance/get_visual_indicator(mob/living/carbon/human/owner) - return visual_indicators[1] +/datum/mutation/human/space_adaptation/get_visual_indicator(mob/living/carbon/human/owner) + return visual_indicators[type][1] -/datum/mutation/human/cold_resistance/on_acquiring(mob/living/carbon/human/owner) +/datum/mutation/human/space_adaptation/on_acquiring(mob/living/carbon/human/owner) if(..()) return ADD_TRAIT(owner, TRAIT_RESISTCOLD, "cold_resistance") -// ADD_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, "cold_resistance") CITADEL CHANGE + ADD_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, "cold_resistance") -/datum/mutation/human/cold_resistance/on_losing(mob/living/carbon/human/owner) +/datum/mutation/human/space_adaptation/on_losing(mob/living/carbon/human/owner) if(..()) return REMOVE_TRAIT(owner, TRAIT_RESISTCOLD, "cold_resistance") -// REMOVE_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, "cold_resistance") CITADEL CHANGE - -/datum/mutation/human/cold_resistance/on_life(mob/living/carbon/human/owner) - if(owner.getFireLoss()) - if(prob(1)) - owner.heal_bodypart_damage(0,1) //Is this really needed? + REMOVE_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, "cold_resistance") diff --git a/code/datums/mutations/combined.dm b/code/datums/mutations/combined.dm new file mode 100644 index 00000000..c166b013 --- /dev/null +++ b/code/datums/mutations/combined.dm @@ -0,0 +1,24 @@ +/datum/generecipe + var/required = "" //it hurts so bad but initial is not compatible with lists + var/result = null + +/proc/get_mixed_mutation(mutation1, mutation2) + if(!mutation1 || !mutation2) + return FALSE + if(mutation1 == mutation2) //this could otherwise be bad + return FALSE + for(var/A in GLOB.mutation_recipes) + if(findtext(A, "[mutation1]") && findtext(A, "[mutation2]")) + return GLOB.mutation_recipes[A] + +/datum/generecipe/x_ray + required = "/datum/mutation/human/thermal; /datum/mutation/human/radioactive" + result = /datum/mutation/human/thermal/x_ray + +/datum/generecipe/shock + required = "/datum/mutation/human/insulated; /datum/mutation/human/radioactive" + result = SHOCKTOUCH + +/datum/generecipe/mindread + required = "/datum/mutation/human/antenna; /datum/mutation/human/paranoia" + result = MINDREAD \ No newline at end of file diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index 85cecca4..b6987959 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -1,12 +1,15 @@ //Hulk turns your skin green, and allows you to punch through walls. /datum/mutation/human/hulk name = "Hulk" + desc = "A poorly understood genome that causes the holder's muscles to expand, inhibit speech and gives the person a bad skin condition." quality = POSITIVE - get_chance = 15 - lowest_value = 256 * 12 + locked = TRUE + difficulty = 16 text_gain_indication = "Your muscles hurt!" species_allowed = list("human") //no skeleton/lizard hulk health_req = 25 + instability = 40 + locked = TRUE /datum/mutation/human/hulk/on_acquiring(mob/living/carbon/human/owner) if(..()) @@ -17,11 +20,11 @@ SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "hulk", /datum/mood_event/hulk) RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech) -/datum/mutation/human/hulk/on_attack_hand(mob/living/carbon/human/owner, atom/target, proximity) +/datum/mutation/human/hulk/on_attack_hand(atom/target, proximity) if(proximity) //no telekinetic hulk attack return target.attack_hulk(owner) -/datum/mutation/human/hulk/on_life(mob/living/carbon/human/owner) +/datum/mutation/human/hulk/on_life() if(owner.health < 0) on_losing(owner) to_chat(owner, "You suddenly feel very weak.") diff --git a/code/datums/mutations/radioactive.dm b/code/datums/mutations/radioactive.dm new file mode 100644 index 00000000..88b276a8 --- /dev/null +++ b/code/datums/mutations/radioactive.dm @@ -0,0 +1,19 @@ +/datum/mutation/human/radioactive + name = "Radioactivity" + desc = "A volatile mutation that causes the host to sent out deadly beta radiation. This affects both the hosts and their surroundings." + quality = NEGATIVE + text_gain_indication = "You can feel it in your bones!" + time_coeff = 5 + instability = 5 + difficulty = 8 + +/datum/mutation/human/radioactive/on_life(mob/living/carbon/human/owner) + radiation_pulse(owner, 20) + +/datum/mutation/human/radioactive/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) + ..() + if(!(type in visual_indicators)) + visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "radiation", -MUTATIONS_LAYER)) + +/datum/mutation/human/radioactive/get_visual_indicator() + return visual_indicators[type][1] \ No newline at end of file diff --git a/code/datums/mutations/sight.dm b/code/datums/mutations/sight.dm index 1f23a929..c8bc1a15 100644 --- a/code/datums/mutations/sight.dm +++ b/code/datums/mutations/sight.dm @@ -1,6 +1,7 @@ //Nearsightedness restricts your vision by several tiles. /datum/mutation/human/nearsight name = "Near Sightness" + desc = "The holder of this mutation has poor eyesight." quality = MINOR_NEGATIVE text_gain_indication = "You can't see very well." @@ -18,6 +19,7 @@ //Blind makes you blind. Who knew? /datum/mutation/human/blind name = "Blindness" + desc = "Renders the subject completely blind." quality = NEGATIVE text_gain_indication = "You can't seem to see anything." @@ -32,43 +34,58 @@ owner.cure_blind(GENETIC_MUTATION) -//X-ray Vision lets you see through walls. -/datum/mutation/human/x_ray - name = "X Ray Vision" +///Thermal Vision lets you see mobs through walls +/datum/mutation/human/thermal + name = "Thermal Vision" + desc = "The user of this genome can visually percieve the unique human thermal signature." quality = POSITIVE - get_chance = 25 - lowest_value = 256 * 12 - text_gain_indication = "The walls suddenly disappear!" + difficulty = 18 + text_gain_indication = "You can see the heat rising off of your skin..." time_coeff = 2 + instability = 25 + var/visionflag = TRAIT_THERMAL_VISION -/datum/mutation/human/x_ray/on_acquiring(mob/living/carbon/human/owner) +/datum/mutation/human/thermal/on_acquiring(mob/living/carbon/human/owner) if(..()) return + ADD_TRAIT(owner, visionflag, GENETIC_MUTATION) owner.update_sight() -/datum/mutation/human/x_ray/on_losing(mob/living/carbon/human/owner) +/datum/mutation/human/thermal/on_losing(mob/living/carbon/human/owner) if(..()) return + REMOVE_TRAIT(owner, visionflag, GENETIC_MUTATION) owner.update_sight() +///X-ray Vision lets you see through walls. +/datum/mutation/human/thermal/x_ray + name = "X Ray Vision" + desc = "A strange genome that allows the user to see between the spaces of walls." //actual x-ray would mean you'd constantly be blasting rads, wich might be fun for later //hmb + text_gain_indication = "The walls suddenly disappear!" + instability = 35 + locked = TRUE + visionflag = TRAIT_XRAY_VISION + //Laser Eyes lets you shoot lasers from your eyes! /datum/mutation/human/laser_eyes name = "Laser Eyes" + desc = "Reflects concentrated light back from the eyes." quality = POSITIVE - dna_block = NON_SCANNABLE + locked = TRUE + difficulty = 16 text_gain_indication = "You feel pressure building up behind your eyes." layer_used = FRONT_MUTATIONS_LAYER limb_req = BODY_ZONE_HEAD -/datum/mutation/human/laser_eyes/New() +/datum/mutation/human/laser_eyes/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) ..() visual_indicators |= mutable_appearance('icons/effects/genetics.dmi', "lasereyes", -FRONT_MUTATIONS_LAYER) -/datum/mutation/human/laser_eyes/get_visual_indicator(mob/living/carbon/human/owner) +/datum/mutation/human/laser_eyes/get_visual_indicator() return visual_indicators[1] -/datum/mutation/human/laser_eyes/on_ranged_attack(mob/living/carbon/human/owner, atom/target, mouseparams) +/datum/mutation/human/laser_eyes/on_ranged_attack(atom/target, mouseparams) if(owner.a_intent == INTENT_HARM) owner.LaserEyes(target, mouseparams) diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm index f02b7f18..5716b259 100644 --- a/code/datums/mutations/speech.dm +++ b/code/datums/mutations/speech.dm @@ -3,6 +3,7 @@ /datum/mutation/human/nervousness name = "Nervousness" + desc = "Causes the holder to stutter." quality = MINOR_NEGATIVE text_gain_indication = "You feel nervous." @@ -13,6 +14,7 @@ /datum/mutation/human/wacky name = "Wacky" + desc = "Unknown." quality = MINOR_NEGATIVE text_gain_indication = "You feel an off sensation in your voicebox." text_lose_indication = "The off sensation passes." @@ -34,6 +36,7 @@ /datum/mutation/human/mute name = "Mute" + desc = "Completely inhibits the vocal section of the brain." quality = NEGATIVE text_gain_indication = "You feel unable to express yourself at all." text_lose_indication = "You feel able to speak freely again." @@ -53,8 +56,8 @@ /datum/mutation/human/smile name = "Smile" + desc = "Causes the user to be in constant mania." quality = MINOR_NEGATIVE - dna_block = NON_SCANNABLE text_gain_indication = "You feel so happy. Nothing can be wrong with anything. :)" text_lose_indication = "Everything is terrible again. :(" @@ -120,8 +123,8 @@ /datum/mutation/human/unintelligible name = "Unintelligible" + desc = "Partially inhibits the vocal center of the brain, severely distorting speech." quality = NEGATIVE - dna_block = NON_SCANNABLE text_gain_indication = "You can't seem to form any coherent thoughts!" text_lose_indication = "Your mind feels more clear." @@ -140,8 +143,9 @@ /datum/mutation/human/swedish name = "Swedish" + desc = "A horrible mutation originating from the distant past. Thought to be eradicated after the incident in 2037." quality = MINOR_NEGATIVE - dna_block = NON_SCANNABLE + locked = TRUE text_gain_indication = "You feel Swedish, however that works." text_lose_indication = "The feeling of Swedishness passes." @@ -172,8 +176,8 @@ /datum/mutation/human/chav name = "Chav" + desc = "Unknown" quality = MINOR_NEGATIVE - dna_block = NON_SCANNABLE text_gain_indication = "Ye feel like a reet prat like, innit?" text_lose_indication = "You no longer feel like being rude and sassy." @@ -219,12 +223,13 @@ /datum/mutation/human/elvis name = "Elvis" + desc = "A terrifying mutation named after its 'patient-zero'." quality = MINOR_NEGATIVE - dna_block = NON_SCANNABLE + locked = TRUE text_gain_indication = "You feel pretty good, honeydoll." text_lose_indication = "You feel a little less conversation would be great." -/datum/mutation/human/elvis/on_life(mob/living/carbon/human/owner) +/datum/mutation/human/elvis/on_life() switch(pick(1,2)) if(1) if(prob(15)) @@ -265,8 +270,9 @@ /datum/mutation/human/stoner name = "Stoner" + desc = "A common mutation that severely decreases intelligence." quality = NEGATIVE - dna_block = NON_SCANNABLE + locked = TRUE text_gain_indication = "You feel...totally chill, man!" text_lose_indication = "You feel like you have a better sense of time." diff --git a/code/datums/mutations/telekinesis.dm b/code/datums/mutations/telekinesis.dm index a5b15eac..b03ac040 100644 --- a/code/datums/mutations/telekinesis.dm +++ b/code/datums/mutations/telekinesis.dm @@ -1,18 +1,20 @@ //Telekinesis lets you interact with objects from range, and gives you a light blue halo around your head. /datum/mutation/human/telekinesis name = "Telekinesis" + desc = "A strange mutation that allows the holder to interact with objects through thought." quality = POSITIVE - get_chance = 20 - lowest_value = 256 * 12 + difficulty = 18 text_gain_indication = "You feel smarter!" limb_req = BODY_ZONE_HEAD + instability = 30 -/datum/mutation/human/telekinesis/New() +/datum/mutation/human/telekinesis/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) ..() - visual_indicators |= mutable_appearance('icons/effects/genetics.dmi', "telekinesishead", -MUTATIONS_LAYER) + if(!(type in visual_indicators)) + visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "telekinesishead", -MUTATIONS_LAYER)) /datum/mutation/human/telekinesis/get_visual_indicator(mob/living/carbon/human/owner) - return visual_indicators[1] + return visual_indicators[type][1] /datum/mutation/human/telekinesis/on_ranged_attack(mob/living/carbon/human/owner, atom/target) - target.attack_tk(owner) + target.attack_tk(owner) \ No newline at end of file diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index 97624266..3d4f6ade 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -282,6 +282,12 @@ name = "Ancient Cloning Lab" description = "An experimental cloning lab snapped off from an ancient ship. The cloner model inside lacks many modern functionalities and security measures." +/datum/map_template/ruin/space/hilbertresearchfacility + id = "hilbert_facility" + suffix = "hilbertshoteltestingsite.dmm" + name = "Hilbert Research Facility" + description = "A research facility of great bluespace discoveries. Long since abandoned, willingly or not..." + /datum/map_template/ruin/space/augmentation id = "augmentationfacility" suffix = "augmentationfacility.dmm" diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index a470f814..c4a80c19 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -643,3 +643,26 @@ datum/status_effect/pacify addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message), 10) addtimer(CALLBACK(C, /mob/living.proc/Stun, 60, TRUE, TRUE), 15) //Take some time to think about it qdel(src) + +/datum/status_effect/dna_melt + id = "dna_melt" + duration = 600 + status_type = STATUS_EFFECT_REPLACE + alert_type = /obj/screen/alert/status_effect/dna_melt + var/kill_either_way = FALSE //no amount of removing mutations is gonna save you now + +/datum/status_effect/dna_melt/on_creation(mob/living/new_owner, set_duration, updating_canmove) + . = ..() + to_chat(new_owner, "My body can't handle the mutations! I need to get my mutations removed fast!") + +/datum/status_effect/dna_melt/on_remove() + if(!ishuman(owner)) + owner.gib() //fuck you in particular + return + var/mob/living/carbon/human/H = owner + H.something_horrible(kill_either_way) + +/obj/screen/alert/status_effect/dna_melt + name = "Genetic Breakdown" + desc = "I don't feel so good. Your body can't handle the mutations! You have one minute to remove your mutations, or you will be met with a horrible fate." + icon_state = "dna_melt" \ No newline at end of file diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index f3b81180..d0fff8da 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -38,9 +38,9 @@ H.randmuti() if(prob(50)) if(prob(90)) - H.randmutb() + H.easy_randmut(NEGATIVE+MINOR_NEGATIVE) else - H.randmutg() + H.easy_randmut(POSITIVE) H.domutcheck() L.rad_act(20) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 0e01be99..67d4789e 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -24,7 +24,7 @@ var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move var/list/client_mobs_in_contents // This contains all the client mobs within this container var/list/acted_explosions //for explosion dodging - glide_size = 14 + glide_size = 13 appearance_flags = TILE_BOUND|PIXEL_SCALE var/datum/forced_movement/force_moving = null //handled soley by forced_movement.dm var/floating = FALSE diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index cc796fdc..5b7eff2b 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -80,6 +80,8 @@ name = "cloning data disk" icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk. var/list/fields = list() + var/list/mutations = list() + var/max_mutations = 6 var/read_only = 0 //Well,it's still a floppy disk //Disk stuff. @@ -127,7 +129,7 @@ return examine(user) //Start growing a human clone in the pod! -/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, se, mindref, datum/species/mrace, list/features, factions, list/quirks) +/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, mutation_index, mindref, datum/species/mrace, list/features, factions, list/quirks) if(panel_open) return FALSE if(mess || attempting) @@ -161,10 +163,10 @@ var/mob/living/carbon/human/H = new /mob/living/carbon/human(src) - H.hardset_dna(ui, se, H.real_name, null, mrace, features) + H.hardset_dna(ui, mutation_index, H.real_name, null, mrace, features) if(prob(50 - efficiency*10)) //Chance to give a bad mutation. - H.randmutb() //100% bad mutation. Can be cured with mutadone. + H.easy_randmut(NEGATIVE+MINOR_NEGATIVE) //100% bad mutation. Can be cured with mutadone. H.silent = 20 //Prevents an extreme edge case where clones could speak if they said something at exactly the right moment. occupant = H diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 47556c09..eceb6042 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -486,7 +486,7 @@ R.fields["id"] = copytext(md5(mob_occupant.real_name), 2, 6) R.fields["UE"] = dna.unique_enzymes R.fields["UI"] = dna.uni_identity - R.fields["SE"] = dna.struc_enzymes + R.fields["SE"] = dna.mutation_index R.fields["blood_type"] = dna.blood_type R.fields["features"] = dna.features R.fields["factions"] = mob_occupant.faction diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 9d495743..59c96299 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -1,14 +1,16 @@ #define INJECTOR_TIMEOUT 100 -#define REJUVENATORS_INJECT 15 -#define REJUVENATORS_MAX 90 #define NUMBER_OF_BUFFERS 3 +#define SCRAMBLE_TIMEOUT 600 +#define JOKER_TIMEOUT 12000 //20 minutes +#define JOKER_UPGRADE 1800 #define RADIATION_STRENGTH_MAX 15 -#define RADIATION_STRENGTH_MULTIPLIER 1 //larger has a more range +#define RADIATION_STRENGTH_MULTIPLIER 1 //larger has more range #define RADIATION_DURATION_MAX 30 #define RADIATION_ACCURACY_MULTIPLIER 3 //larger is less accurate + #define RADIATION_IRRADIATION_MULTIPLIER 1 //multiplier for how much radiation a test subject receives #define SCANNER_ACTION_SE 1 @@ -23,22 +25,33 @@ icon_keyboard = "med_key" density = TRUE circuit = /obj/item/circuitboard/computer/scan_consolenew - var/radduration = 2 - var/radstrength = 1 - var/list/buffer[NUMBER_OF_BUFFERS] - - var/injectorready = 0 //world timer cooldown var - var/current_screen = "mainmenu" - var/obj/machinery/dna_scannernew/connected = null - var/obj/item/disk/data/diskette = null - var/list/delayed_action = null use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 400 - light_color = LIGHT_COLOR_BLUE + var/datum/techweb/stored_research + var/max_storage = 6 + var/combine + var/radduration = 2 + var/radstrength = 1 + var/max_chromosomes = 6 + + var/list/buffer[NUMBER_OF_BUFFERS] + var/list/stored_mutations = list() + var/list/stored_chromosomes = list() + + var/injectorready = 0 //world timer cooldown var + var/jokerready = 0 + var/scrambleready = 0 + var/current_screen = "mainmenu" + var/current_mutation //what block are we inspecting? only used when screen = "info" + var/current_storage //what storage block are we looking at? + var/obj/machinery/dna_scannernew/connected = null + var/obj/item/disk/data/diskette = null + var/list/delayed_action = null + /obj/machinery/computer/scan_consolenew/attackby(obj/item/I, mob/user, params) if (istype(I, /obj/item/disk/data)) //INSERT SOME DISKETTES if (!src.diskette) @@ -48,6 +61,28 @@ to_chat(user, "You insert [I].") src.updateUsrDialog() return + if (istype(I, /obj/item/chromosome)) + if(LAZYLEN(stored_chromosomes) < max_chromosomes) + I.forceMove(src) + stored_chromosomes += I + to_chat(user, "You insert [I].") + else + to_chat(user, "You cannot store any more chromosomes!") + return + if(istype(I, /obj/item/dnainjector/activator)) + var/obj/item/dnainjector/activator/A = I + if(A.used) + to_chat(user,"Recycled [I].") + if(A.research) + var/c_typepath = generate_chromosome() + var/obj/item/chromosome/CM = new c_typepath (drop_location()) + to_chat(user,"Recycled [I].") + if((LAZYLEN(stored_chromosomes) < max_chromosomes) && prob(60)) + CM.forceMove(src) + stored_chromosomes += CM + to_chat(user,"[capitalize(CM.name)] added to storage.") + qdel(I) + return else return ..() @@ -58,12 +93,26 @@ if(!isnull(connected)) break injectorready = world.time + INJECTOR_TIMEOUT + scrambleready = world.time + SCRAMBLE_TIMEOUT + jokerready = world.time + JOKER_TIMEOUT + + stored_research = SSresearch.science_tech + +/obj/machinery/computer/scan_consolenew/examine(mob/user) + ..() + if(jokerready < world.time) + to_chat(user, "JOKER algorithm available.") + else + to_chat(user, "JOKER algorithm available in about [round(0.00166666667 * (jokerready - world.time))] minutes.") /obj/machinery/computer/scan_consolenew/ui_interact(mob/user, last_change) . = ..() if(!user) return var/datum/browser/popup = new(user, "scannernew", "DNA Modifier Console", 800, 630) // Set up the popup browser window + if(user.client) + var/datum/asset/simple/assets = get_asset_datum(/datum/asset/simple/genetics) + assets.send(user.client) if(!(in_range(src, user) || issilicon(user))) popup.close() return @@ -88,8 +137,6 @@ occupant_status += "" occupant_status += "
Health:
[viable_occupant.health] %
" occupant_status += "
Radiation Level:
[viable_occupant.radiation/(RAD_MOB_SAFE/100)] %
" - var/rejuvenators = viable_occupant.reagents.get_reagent_amount("potass_iodide") - occupant_status += "
Rejuvenators:
[rejuvenators] units
" occupant_status += "
Unique Enzymes :
[viable_occupant.dna.unique_enzymes]
" occupant_status += "
Last Operation:
[last_change ? last_change : "----"]
" else @@ -147,28 +194,53 @@ buttons += "[connected.locked ? "Unlock" : "Lock"] Scanner" else buttons += "Open Scanner Lock Scanner" - if(viable_occupant) - buttons += "Inject Rejuvenators" + if(viable_occupant && (scrambleready < world.time)) + buttons += "Scramble DNA" else - buttons += "Inject Rejuvenators" + buttons += "Scramble DNA" if(diskette) - buttons += "Eject Disk" + buttons += "Disk" else - buttons += "Eject Disk" - if(current_screen == "buffer") - buttons += "Radiation Emitter Menu" + buttons += "Disk" + if(current_screen == "mutations") + buttons += "Mutations" else - buttons += "Buffer Menu" + buttons += "Mutations" + if((current_screen == "mainmenu") || !current_screen) + buttons += "Genetic Sequencer" + else + buttons += "Genetic Sequencer" + if(current_screen == "ui") + buttons += "Unique Identifiers" + else + buttons += "Unique Identifiers" switch(current_screen) if("working") temp_html += status temp_html += "

System Busy

" temp_html += "Working ... Please wait ([DisplayTimeText(radduration*10)])" - if("buffer") + if("ui") temp_html += status temp_html += buttons - temp_html += "

Buffer Menu

" + temp_html += "

Unique Identifiers

" + temp_html += "-- Output Level ++" + temp_html += "
-- Pulse Duration ++" + temp_html += "

Irradiate Subject

" + temp_html += "
Unique Identifier:
" + var/max_line_len = 7*DNA_BLOCK_SIZE + if(viable_occupant) + temp_html += "
1
" + var/len = length(viable_occupant.dna.uni_identity) + for(var/i=1, i<=len, i++) + temp_html += "[copytext(viable_occupant.dna.uni_identity,i,i+1)]" + if ((i % max_line_len) == 0) + temp_html += "
" + if((i % DNA_BLOCK_SIZE) == 0 && i < len) + temp_html += "
[(i / DNA_BLOCK_SIZE) + 1]
" + else + temp_html += "---------" + temp_html += "

Buffer Menu

" if(istype(buffer)) for(var/i=1, i<=buffer.len, i++) @@ -188,7 +260,6 @@ temp_html += "Save to Disk" else var/ui = buffer_slot["UI"] - var/se = buffer_slot["SE"] var/ue = buffer_slot["UE"] var/name = buffer_slot["name"] var/label = buffer_slot["label"] @@ -234,19 +305,6 @@ temp_html += "UI+UE Injector" else temp_html += "UI+UE Injector" - if(se) - temp_html += "
\tSE: [se] " - if(viable_occupant) - temp_html += "Occupant" - else - temp_html += "Occupant" - temp_html += "Occupant:Delayed" - if(injectorready < world.time ) - temp_html += "Injector" - else - temp_html += "Injector" - else - temp_html += "
\tSE: No Data" if(viable_occupant) temp_html += "
Save to Buffer" else @@ -260,48 +318,197 @@ temp_html += "Save to Disk" else temp_html += "Save to Disk" + if("disk") + temp_html += status + temp_html += buttons + if(diskette) + temp_html += "

[diskette.name]


" + temp_html += "Eject Disk
" + if(LAZYLEN(diskette.mutations)) + temp_html += "" + for(var/datum/mutation/human/A in diskette.mutations) + temp_html += "" + temp_html += "" + if(LAZYLEN(stored_mutations) < max_storage) + temp_html += "" + else + temp_html += "" + temp_html += "" + temp_html += "
[A.name]DeleteImportImport
" + else + temp_html += "
Load diskette to start ----------" + if("info") + if(LAZYLEN(stored_mutations)) + if(LAZYLEN(stored_mutations) >= current_storage) + var/datum/mutation/human/HM = stored_mutations[current_storage] + if(HM) + temp_html += display_sequence(HM.type, current_storage) + else + current_screen = "mainmenu" + if("mutations") + temp_html += status + temp_html += buttons + temp_html += "

Mutation Storage:

" + temp_html += "" + for(var/datum/mutation/human/HM in stored_mutations) + var/i = stored_mutations.Find(HM) + temp_html += "" + temp_html += "" + temp_html += "" + if(combine == HM.type) + temp_html += "" + else + temp_html += "" + temp_html += "
[HM.name]ExportDeleteCombine
Combine

" + temp_html += "

Chromosome Storage:

" + temp_html += "" + for(var/i in 1 to stored_chromosomes.len) + var/obj/item/chromosome/CM = stored_chromosomes[i] + temp_html += "
" + temp_html += "
[CM.name]
" else temp_html += status temp_html += buttons - temp_html += "

Radiation Emitter Menu

" - - temp_html += "-- Output Level ++" - temp_html += "
-- Pulse Duration ++" - - temp_html += "

Irradiate Subject

" - temp_html += "
Unique Identifier:
" - - var/max_line_len = 7*DNA_BLOCK_SIZE + temp_html += "
Genetic Sequence:

" if(viable_occupant) - temp_html += "
1
" - var/len = length(viable_occupant.dna.uni_identity) - for(var/i=1, i<=len, i++) - temp_html += "[copytext(viable_occupant.dna.uni_identity,i,i+1)]" - if ((i % max_line_len) == 0) - temp_html += "
" - if((i % DNA_BLOCK_SIZE) == 0 && i < len) - temp_html += "
[(i / DNA_BLOCK_SIZE) + 1]
" + if(viable_occupant) + for(var/A in get_mutation_list()) + temp_html += display_inactive_sequence(A) + temp_html += "
" + else + temp_html += "----" + if(viable_occupant && (current_mutation in get_mutation_list(viable_occupant))) + temp_html += display_sequence(current_mutation) + temp_html += "

" else - temp_html += "----" - temp_html += "

" - - temp_html += "
Structural Enzymes:
" - if(viable_occupant) - temp_html += "
1
" - var/len = length(viable_occupant.dna.struc_enzymes) - for(var/i=1, i<=len, i++) - temp_html += "[copytext(viable_occupant.dna.struc_enzymes,i,i+1)]" - if ((i % max_line_len) == 0) - temp_html += "
" - if((i % DNA_BLOCK_SIZE) == 0 && i < len) - temp_html += "
[(i / DNA_BLOCK_SIZE) + 1]
" - else - temp_html += "----" - temp_html += "
" + temp_html += "----------" popup.set_content(temp_html.Join()) popup.open() +/obj/machinery/computer/scan_consolenew/proc/display_inactive_sequence(mutation) + var/temp_html = "" + var/class = "unselected" + var/mob/living/carbon/viable_occupant = get_viable_occupant() + if(!viable_occupant) + return + + var/location = viable_occupant.dna.mutation_index.Find(mutation) //We do this because we dont want people using sysexp or similair tools to just read the mutations. + + if(!location) //Do this only when needed, dont make a list with mutations for every iteration if you dont need to + var/list/mutations = get_mutation_list(TRUE) + if(mutation in mutations) + location = mutations.Find(mutation) + if(mutation == current_mutation) + class = "selected" + if(location > DNA_MUTATION_BLOCKS) + temp_html += "Extra Mutation" + else if(mutation in stored_research.discovered_mutations) + temp_html += "Discovered Mutation" + else + temp_html += "Undiscovered" + return temp_html + +/obj/machinery/computer/scan_consolenew/proc/display_sequence(mutation, storage_slot) //Storage slot is for when viewing from the stored mutations + var/temp_html = "" + if(!mutation) + temp_html += "ERR-" + return + var/mut_name = "Unknown gene" + var/mut_desc = "No information available." + var/alias + var/discovered = FALSE + var/active = FALSE + var/scrambled = FALSE + var/instability + var/mob/living/carbon/viable_occupant = get_viable_occupant() + var/datum/mutation/human/HM = get_valid_mutation(mutation) + + if(viable_occupant) + var/datum/mutation/human/M = viable_occupant.dna.get_mutation(mutation) + if(M) + scrambled = M.scrambled + active = TRUE + var/datum/mutation/human/A = GET_INITIALIZED_MUTATION(mutation) + alias = A.alias + if(active && !scrambled) + discover(mutation) + if(stored_research && (mutation in stored_research.discovered_mutations)) + mut_name = A.name + mut_desc = A.desc + discovered = TRUE + instability = A.instability + var/extra + if(viable_occupant && !(storage_slot || viable_occupant.dna.mutation_in_sequence(mutation))) + extra = TRUE + + if(discovered && !scrambled) + var/mutcolor + switch(A.quality) + if(POSITIVE) + mutcolor = "good" + if(MINOR_NEGATIVE) + mutcolor = "average" + if(NEGATIVE) + mutcolor = "bad" + if(HM) + instability *= GET_MUTATION_STABILIZER(HM) + temp_html += "
[mut_name] ([alias])
" + temp_html += "
Instability : [round(instability)]
" + else + temp_html += "
[alias]
" + temp_html += "
[mut_desc]
" + if(active && !storage_slot) + if(HM?.can_chromosome && (HM in viable_occupant.dna.mutations)) + var/i = viable_occupant.dna.mutations.Find(HM) + var/chromosome_name = "----" + if(HM.chromosome_name) + chromosome_name = HM.chromosome_name + temp_html += "
Chromosome status: [chromosome_name]
" + temp_html += "
Sequence:

" + if(!scrambled) + for(var/block in 1 to A.blocks) + var/whole_sequence = get_valid_gene_string(mutation) + var/sequence = copytext(whole_sequence, 1+(block-1)*(DNA_SEQUENCE_LENGTH*2),(DNA_SEQUENCE_LENGTH*2*block+1)) + temp_html += "
" + for(var/i in 1 to DNA_SEQUENCE_LENGTH) + var/num = 1+(i-1)*2 + var/genenum = num+(DNA_SEQUENCE_LENGTH*2*(block-1)) + temp_html += "" + temp_html += "" + for(var/i in 1 to DNA_SEQUENCE_LENGTH) + temp_html += "" + temp_html += "" + for(var/i in 1 to DNA_SEQUENCE_LENGTH) + var/num = i*2 + var/genenum = num+(DNA_SEQUENCE_LENGTH*2*(block-1)) + temp_html += "" + temp_html += "
|
" + temp_html += "




" + else + temp_html = "
Sequence unreadable due to unpredictable mutation.
" + if((active || storage_slot) && (injectorready < world.time) && !scrambled) + temp_html += "Print Activator" + temp_html += "Print Mutator" + else + temp_html += "Print Activator" + temp_html += "Print Mutator" + temp_html += "
" + if(storage_slot) + temp_html += "Delete" + if((LAZYLEN(stored_mutations) < max_storage) && diskette && !diskette.read_only) + temp_html += "Export" + else + temp_html += "Export" + temp_html += "Back" + else if(active && !scrambled) + temp_html += "Store" + if(extra || scrambled) + temp_html += "Nullify" + else + temp_html += "Nullify" + temp_html += "
" + return temp_html /obj/machinery/computer/scan_consolenew/Topic(href, href_list) if(..()) @@ -340,13 +547,16 @@ radstrength = WRAP(num, 1, RADIATION_STRENGTH_MAX+1) if("screen") current_screen = href_list["text"] - if("rejuv") - if(viable_occupant && viable_occupant.reagents) - var/potassiodide_amount = viable_occupant.reagents.get_reagent_amount("potass_iodide") - var/can_add = max(min(REJUVENATORS_MAX - potassiodide_amount, REJUVENATORS_INJECT), 0) - viable_occupant.reagents.add_reagent("potass_iodide", can_add) + if("scramble") + if(viable_occupant && (scrambleready < world.time)) + viable_occupant.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA)) + viable_occupant.dna.generate_dna_blocks() + scrambleready = world.time + SCRAMBLE_TIMEOUT + to_chat(usr,"DNA scrambled.") + viable_occupant.radiation += RADIATION_STRENGTH_MULTIPLIER*50/(connected.damage_coeff ** 2) + if("setbufferlabel") - var/text = sanitize(input(usr, "Input a new label:", "Input an Text", null) as text|null) + var/text = sanitize(input(usr, "Input a new label:", "Input a Text", null) as text|null) if(num && text) num = CLAMP(num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[num] @@ -358,7 +568,6 @@ buffer[num] = list( "label"="Buffer[num]:[viable_occupant.real_name]", "UI"=viable_occupant.dna.uni_identity, - "SE"=viable_occupant.dna.struc_enzymes, "UE"=viable_occupant.dna.unique_enzymes, "name"=viable_occupant.real_name, "blood_type"=viable_occupant.dna.blood_type @@ -372,8 +581,6 @@ if("transferbuffer") if(num && viable_occupant) switch(href_list["text"]) //Numbers are this high because other way upgrading laser is just not worth the hassle, and i cant think of anything better to inmrove - if("se") - apply_buffer(SCANNER_ACTION_SE,num) if("ui") apply_buffer(SCANNER_ACTION_UI,num) if("ue") @@ -387,28 +594,6 @@ if(istype(buffer_slot)) var/obj/item/dnainjector/timed/I switch(href_list["text"]) - if("se") - if(buffer_slot["SE"]) - I = new /obj/item/dnainjector/timed(loc) - var/powers = 0 - for(var/datum/mutation/human/HM in GLOB.good_mutations + GLOB.bad_mutations + GLOB.not_good_mutations) - if(HM.check_block_string(buffer_slot["SE"])) - I.add_mutations.Add(HM) - if(HM in GLOB.good_mutations) - powers += 1 - if(HM in GLOB.bad_mutations + GLOB.not_good_mutations) - powers -= 1 //To prevent just unlocking everything to get all powers to a syringe for max tech - else - I.remove_mutations.Add(HM) - var/time_coeff - for(var/datum/mutation/human/HM in I.add_mutations) - if(!time_coeff) - time_coeff = HM.time_coeff - continue - time_coeff = min(time_coeff,HM.time_coeff) - if(connected) - I.duration = I.duration * time_coeff * connected.damage_coeff - I.damage_coeff = connected.damage_coeff if("ui") if(buffer_slot["UI"]) I = new /obj/item/dnainjector/timed(loc) @@ -447,7 +632,7 @@ if("setdelayed") if(num) delayed_action = list("action"=text2num(href_list["delayaction"]),"buffer"=num) - if("pulseui","pulsese") + if("pulseui") if(num && viable_occupant && connected) radduration = WRAP(radduration, 1, RADIATION_DURATION_MAX+1) radstrength = WRAP(radstrength, 1, RADIATION_STRENGTH_MAX+1) @@ -459,7 +644,7 @@ ui_interact(usr) sleep(radduration*10) - current_screen = "mainmenu" + current_screen = "ui" if(viable_occupant && connected && connected.occupant==viable_occupant) viable_occupant.radiation += (RADIATION_IRRADIATION_MULTIPLIER*radduration*radstrength)/(connected.damage_coeff ** 2) //Read comment in "transferbuffer" section above for explanation @@ -480,35 +665,173 @@ viable_occupant.dna.uni_identity = copytext(viable_occupant.dna.uni_identity, 1, num) + hex + copytext(viable_occupant.dna.uni_identity, num+1, 0) viable_occupant.updateappearance(mutations_overlay_update=1) - if("pulsese") - var/len = length(viable_occupant.dna.struc_enzymes) - num = WRAP(num, 1, len+1) - num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len) - - var/block = round((num-1)/DNA_BLOCK_SIZE)+1 - var/subblock = num - block*DNA_BLOCK_SIZE - last_change = "SE #[block]-[subblock]; " - - var/hex = copytext(viable_occupant.dna.struc_enzymes, num, num+1) - last_change += "[hex]" - hex = scramble(hex, radstrength, radduration) - last_change += "->[hex]" - - viable_occupant.dna.struc_enzymes = copytext(viable_occupant.dna.struc_enzymes, 1, num) + hex + copytext(viable_occupant.dna.struc_enzymes, num+1, 0) - viable_occupant.domutcheck() else current_screen = "mainmenu" if(connected) connected.locked = locked_state + if("inspect") + if(viable_occupant) + var/list/mutations = get_mutation_list(TRUE) + if(current_mutation == mutations[num]) + current_mutation = null + else + current_mutation = mutations[num] + + if("inspectstorage") + current_storage = num + current_screen = "info" + if("savemut") + if(viable_occupant) + var/succes + if(LAZYLEN(stored_mutations) < max_storage) + var/mutation = text2path(href_list["path"]) + if(ispath(mutation, /datum/mutation/human)) //sanity checks + var/datum/mutation/human/HM = viable_occupant.dna.get_mutation(mutation) + if(HM) + var/datum/mutation/human/A = new HM.type() + A.copy_mutation(HM) + succes = TRUE + stored_mutations += A + to_chat(usr,"Mutation succesfully stored.") + if(!succes) //we can exactly return here + to_chat(usr,"Mutation storage is full.") + if("deletemut") + var/datum/mutation/human/HM = stored_mutations[num] + if(HM) + stored_mutations.Remove(HM) + qdel(HM) + current_screen = "mutations" + if("activator") + if(injectorready < world.time) + var/mutation = text2path(href_list["path"]) + if(ispath(mutation, /datum/mutation/human)) + var/datum/mutation/human/HM = get_valid_mutation(mutation) + if(HM) + var/obj/item/dnainjector/activator/I = new /obj/item/dnainjector/activator(loc) + I.add_mutations += new HM.type (copymut = HM) + I.name = "[HM.name] activator" + I.research = TRUE + if(connected) + I.damage_coeff = connected.damage_coeff*4 + injectorready = world.time + INJECTOR_TIMEOUT * (1 - 0.1 * connected.precision_coeff) //precision_coeff being the matter bin rating + else + injectorready = world.time + INJECTOR_TIMEOUT + if("mutator") + if(injectorready < world.time) + var/mutation = text2path(href_list["path"]) + if(ispath(mutation, /datum/mutation/human)) + var/datum/mutation/human/HM = get_valid_mutation(mutation) + if(HM) + var/obj/item/dnainjector/activator/I = new /obj/item/dnainjector/activator(loc) + I.add_mutations += new HM.type (copymut = HM) + I.doitanyway = TRUE + I.name = "[HM.name] injector" + if(connected) + I.damage_coeff = connected.damage_coeff + injectorready = world.time + INJECTOR_TIMEOUT * 5 * (1 - 0.1 * connected.precision_coeff) + else + injectorready = world.time + INJECTOR_TIMEOUT * 5 + if("nullify") + if(viable_occupant) + var/datum/mutation/human/A = viable_occupant.dna.get_mutation(current_mutation) + if(A && (!viable_occupant.dna.mutation_in_sequence(current_mutation) || A.scrambled)) + viable_occupant.dna.remove_mutation(current_mutation) + current_screen = "mainmenu" + current_mutation = null + if("pulsegene") + if(current_screen != "info") + var/path = text2path(href_list["path"]) + if(viable_occupant && num && (path in viable_occupant.dna.mutation_index)) + var/list/genes = list("A","T","G","C","X") + if(jokerready < world.time) + genes += "JOKER" + var/sequence = GET_GENE_STRING(path, viable_occupant.dna) + var/original = sequence[num] + var/new_gene = input("From [original] to-", "New block", original) as null|anything in genes + if(!new_gene) + new_gene = original + if(viable_occupant == get_viable_occupant()) //No cheesing + if((new_gene == "JOKER") && (jokerready < world.time)) + var/true_genes = GET_SEQUENCE(current_mutation) + new_gene = true_genes[num] + jokerready = world.time + JOKER_TIMEOUT - (JOKER_UPGRADE * (connected.precision_coeff-1)) + sequence = copytext(sequence, 1, num) + new_gene + copytext(sequence, num+1, length(sequence)+1) + viable_occupant.dna.mutation_index[path] = sequence + viable_occupant.radiation += RADIATION_STRENGTH_MULTIPLIER/connected.damage_coeff + viable_occupant.domutcheck() + if("exportdiskmut") + if(diskette && !diskette.read_only) + var/path = text2path(href_list["path"]) + if(ispath(path, /datum/mutation/human)) + var/datum/mutation/human/A = get_valid_mutation(path) + if(A && diskette && (LAZYLEN(diskette.mutations) < diskette.max_mutations)) + var/datum/mutation/human/HM = new A.type() + diskette.mutations += HM + HM.copy_mutation(A) + to_chat(usr, "Succesfully written [A.name] to [diskette.name].") + if("deletediskmut") + if(diskette && !diskette.read_only) + if(num && (LAZYLEN(diskette.mutations) >= num)) + var/datum/mutation/human/A = diskette.mutations[num] + diskette.mutations.Remove(A) + qdel(A) + if("importdiskmut") + if(diskette && (LAZYLEN(diskette.mutations) >= num)) + if(LAZYLEN(stored_mutations) < max_storage) + var/datum/mutation/human/A = diskette.mutations[num] + var/datum/mutation/human/HM = new A.type() + HM.copy_mutation(A) + stored_mutations += HM + to_chat(usr,"Succesfully written [A.name] to storage.") + if("combine") + if(num && (LAZYLEN(stored_mutations) >= num)) + if(LAZYLEN(stored_mutations) < max_storage) + var/datum/mutation/human/A = stored_mutations[num] + var/path = A.type + if(combine) + var/result_path = get_mixed_mutation(combine, path) + if(result_path) + stored_mutations += new result_path() + to_chat(usr, "Succes! New mutation has been added to storage") + discover(result_path) + combine = null + else + to_chat(usr, "Failed. No mutation could be created.") + combine = null + else + combine = path + to_chat(usr,"Selected [A.name] for combining") + else + to_chat(usr, "Not enough space to store potential mutation.") + if("ejectchromosome") + if(LAZYLEN(stored_chromosomes) <= num) + var/obj/item/chromosome/CM = stored_chromosomes[num] + CM.forceMove(drop_location()) + adjust_item_drop_location(CM) + stored_chromosomes -= CM + if("applychromosome") + if(viable_occupant && (LAZYLEN(viable_occupant.dna.mutations) <= num)) + var/datum/mutation/human/HM = viable_occupant.dna.mutations[num] + var/list/chromosomes = list() + for(var/obj/item/chromosome/CM in stored_chromosomes) + if(CM.can_apply(HM)) + chromosomes += CM + if(chromosomes.len) + var/obj/item/chromosome/CM = input("Select a chromosome to apply", "Apply Chromosome") as null|anything in sortNames(chromosomes) + if(CM) + to_chat(usr, "You apply [CM] to [HM.name].") + stored_chromosomes -= CM + CM.apply(HM) + ui_interact(usr,last_change) -/obj/machinery/computer/scan_consolenew/proc/scramble(input,rs,rd) +/obj/machinery/computer/scan_consolenew/proc/scramble(input,rs,rd) //hexadecimal genetics. dont confuse with scramble button var/length = length(input) var/ran = gaussian(0, rs*RADIATION_STRENGTH_MULTIPLIER) if(ran == 0) - ran = pick(-1,1) //hacky, statistically should almost never happen. 0-change makes people mad though + ran = pick(-1,1) //hacky, statistically should almost never happen. 0-chance makes people mad though else if(ran < 0) ran = round(ran) //negative, so floor it else @@ -537,10 +860,6 @@ //Each laser level reduces damage by lvl^2, so no effect on 1 lvl, 4 times less damage on 2 and 9 times less damage on 3 //Numbers are this high because other way upgrading laser is just not worth the hassle, and i cant think of anything better to inmrove switch(action) - if(SCANNER_ACTION_SE) - if(buffer_slot["SE"]) - viable_occupant.dna.struc_enzymes = buffer_slot["SE"] - viable_occupant.domutcheck() if(SCANNER_ACTION_UI) if(buffer_slot["UI"]) viable_occupant.dna.uni_identity = buffer_slot["UI"] @@ -562,15 +881,54 @@ viable_occupant.dna.blood_type = buffer_slot["blood_type"] /obj/machinery/computer/scan_consolenew/proc/on_scanner_close() - if(delayed_action && connected) + if(delayed_action && get_viable_occupant()) to_chat(connected.occupant, "[src] activates!") apply_buffer(delayed_action["action"],delayed_action["buffer"]) delayed_action = null //or make it stick + reset button ? +/obj/machinery/computer/scan_consolenew/proc/get_valid_mutation(mutation) + var/mob/living/carbon/C = get_viable_occupant() + if(C) + var/datum/mutation/human/HM = C.dna.get_mutation(mutation) + if(HM) + return HM + for(var/datum/mutation/human/A in stored_mutations) + if(A.type == mutation) + return A + + +/obj/machinery/computer/scan_consolenew/proc/get_mutation_list(include_storage) //Returns a list of the mutation index types and any extra mutations + var/mob/living/carbon/viable_occupant = get_viable_occupant() + var/list/paths = list() + if(viable_occupant) + for(var/A in viable_occupant.dna.mutation_index) + paths += A + for(var/datum/mutation/human/A in viable_occupant.dna.mutations) + if(A.class == MUT_EXTRA) + paths += A.type + if(include_storage) + for(var/datum/mutation/human/A in stored_mutations) + paths += A.type + return paths + +/obj/machinery/computer/scan_consolenew/proc/get_valid_gene_string(mutation) + var/mob/living/carbon/C = get_viable_occupant() + if(C && (mutation in C.dna.mutation_index)) + return GET_GENE_STRING(mutation, C.dna) + else if(C && (LAZYLEN(C.dna.mutations))) + for(var/datum/mutation/human/A in C.dna.mutations) + if(A.type == mutation) + return GET_SEQUENCE(mutation) + for(var/datum/mutation/human/A in stored_mutations) + if(A.type == mutation) + return GET_SEQUENCE(mutation) + +/obj/machinery/computer/scan_consolenew/proc/discover(mutation) + if(stored_research && !(mutation in stored_research.discovered_mutations)) + stored_research.discovered_mutations += mutation + return TRUE /////////////////////////// DNA MACHINES #undef INJECTOR_TIMEOUT -#undef REJUVENATORS_INJECT -#undef REJUVENATORS_MAX #undef NUMBER_OF_BUFFERS #undef RADIATION_STRENGTH_MAX diff --git a/code/game/machinery/exp_cloner.dm b/code/game/machinery/exp_cloner.dm index e8364d22..ffe66e68 100644 --- a/code/game/machinery/exp_cloner.dm +++ b/code/game/machinery/exp_cloner.dm @@ -26,9 +26,9 @@ var/list/unclean_mutations = (GLOB.not_good_mutations|GLOB.bad_mutations) H.dna.remove_mutation_group(unclean_mutations) if(efficiency > 5 && prob(20)) - H.randmutvg() + H.easy_randmut(POSITIVE) if(efficiency < 3 && prob(50)) - var/mob/M = H.randmutb() + var/mob/M = H.easy_randmut(NEGATIVE+MINOR_NEGATIVE) if(ismob(M)) H = M @@ -292,6 +292,6 @@ temp = "Cloning cycle already in progress." playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) else - pod.growclone(null, mob_occupant.real_name, dna.uni_identity, dna.struc_enzymes, clone_species, dna.features, mob_occupant.faction) + pod.growclone(null, mob_occupant.real_name, dna.uni_identity, dna.mutation_index, clone_species, dna.features, mob_occupant.faction) temp = "[mob_occupant.real_name] => Cloning data sent to pod." playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) diff --git a/code/game/machinery/stasis.dm b/code/game/machinery/stasis.dm index f24b2f4f..720e3e61 100644 --- a/code/game/machinery/stasis.dm +++ b/code/game/machinery/stasis.dm @@ -134,4 +134,9 @@ /obj/machinery/stasis/crowbar_act(mob/living/user, obj/item/I) return default_deconstruction_crowbar(I) +/obj/machinery/stasis/attack_robot(mob/user) + if(Adjacent(user) && occupant) + unbuckle_mob(occupant) + else + ..() #undef STASIS_TOGGLE_COOLDOWN \ No newline at end of file diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index b5a579f3..ef9a1374 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -11,7 +11,8 @@ var/equip_ready = 1 //whether the equipment is ready for use. (or deactivated/activated for static stuff) var/energy_drain = 0 var/obj/mecha/chassis = null - var/range = MELEE //bitFflags + ///Bitflag. Determines the range of the equipment. + var/range = MECHA_MELEE var/salvageable = 1 var/selectable = 1 // Set to 0 for passive equipment such as mining scanner or armor plates var/harmful = FALSE //Controls if equipment can be used to attack by a pacifist. @@ -59,10 +60,10 @@ return txt /obj/item/mecha_parts/mecha_equipment/proc/is_ranged()//add a distance restricted equipment. Why not? - return range&RANGED + return range&MECHA_RANGED /obj/item/mecha_parts/mecha_equipment/proc/is_melee() - return range&MELEE + return range&MECHA_MELEE /obj/item/mecha_parts/mecha_equipment/proc/action_checks(atom/target) diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 29a5100b..a2f8bb57 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -34,7 +34,7 @@ icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper" energy_drain = 20 - range = MELEE + range = MECHA_MELEE equip_cooldown = 20 var/mob/living/carbon/patient = null var/inject_amount = 10 @@ -252,7 +252,7 @@ var/synth_speed = 5 //[num] reagent units per cycle energy_drain = 10 var/mode = 0 //0 - fire syringe, 1 - analyze reagents. - range = MELEE|RANGED + range = MECHA_MELEE|MECHA_RANGED equip_cooldown = 10 /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Initialize() @@ -527,7 +527,7 @@ desc = "Equipment for medical exosuits. Generates a focused beam of medical nanites." icon_state = "mecha_medigun" energy_drain = 10 - range = MELEE|RANGED + range = MECHA_MELEE|MECHA_RANGED equip_cooldown = 0 var/obj/item/gun/medbeam/mech/medigun materials = list(MAT_METAL = 15000, MAT_GLASS = 8000, MAT_PLASMA = 3000, MAT_GOLD = 8000, MAT_DIAMOND = 2000) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index a8ba9850..f152b651 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -10,7 +10,7 @@ icon_state = "mecha_teleport" equip_cooldown = 150 energy_drain = 1000 - range = RANGED + range = MECHA_RANGED /obj/item/mecha_parts/mecha_equipment/teleporter/action(atom/target) if(!action_checks(target) || is_centcom_level(loc.z)) @@ -30,7 +30,7 @@ icon_state = "mecha_wholegen" equip_cooldown = 50 energy_drain = 300 - range = RANGED + range = MECHA_RANGED /obj/item/mecha_parts/mecha_equipment/wormhole_generator/action(atom/target) @@ -73,7 +73,7 @@ icon_state = "mecha_teleport" equip_cooldown = 10 energy_drain = 100 - range = MELEE|RANGED + range = MECHA_MELEE|MECHA_RANGED var/atom/movable/locked var/mode = 1 //1 - gravsling 2 - gravpush @@ -284,12 +284,12 @@ if(equip_ready) //disabled return var/area/A = get_area(chassis) - var/pow_chan = get_power_channel(A) + var/pow_chan = GET_MUTATION_POWER_channel(A) if(pow_chan) return 1000 //making magic -/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/proc/get_power_channel(var/area/A) +/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/proc/GET_MUTATION_POWER_channel(var/area/A) var/pow_chan if(A) for(var/c in use_channels) @@ -350,7 +350,7 @@ name = "exosuit plasma converter" desc = "An exosuit module that generates power using solid plasma as fuel. Pollutes the environment." icon_state = "tesla" - range = MELEE + range = MECHA_MELEE var/coeff = 100 var/obj/item/stack/sheet/fuel var/max_fuel = 150000 diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index ea946518..9ffd40b1 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -164,7 +164,7 @@ icon_state = "mecha_exting" equip_cooldown = 5 energy_drain = 0 - range = MELEE|RANGED + range = MECHA_MELEE|MECHA_RANGED /obj/item/mecha_parts/mecha_equipment/extinguisher/Initialize() . = ..() @@ -231,7 +231,7 @@ icon_state = "mecha_rcd" equip_cooldown = 10 energy_drain = 250 - range = MELEE|RANGED + range = MECHA_MELEE|MECHA_RANGED item_flags = NO_MAT_REDEMPTION var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock. diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index c0c3795e..bce75278 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -1,6 +1,6 @@ /obj/item/mecha_parts/mecha_equipment/weapon name = "mecha weapon" - range = RANGED + range = MECHA_RANGED var/projectile var/fire_sound var/projectiles_per_shot = 1 @@ -154,7 +154,7 @@ icon_state = "mecha_honker" energy_drain = 200 equip_cooldown = 150 - range = MELEE|RANGED + range = MECHA_MELEE|MECHA_RANGED kickback = FALSE /obj/item/mecha_parts/mecha_equipment/weapon/honker/can_attach(obj/mecha/combat/honker/M) @@ -405,7 +405,7 @@ icon_state = "mecha_punching_glove" energy_drain = 250 equip_cooldown = 20 - range = MELEE|RANGED + range = MECHA_MELEE|MECHA_RANGED missile_range = 5 projectile = /obj/item/punching_glove fire_sound = 'sound/items/bikehorn.ogg' diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index caac0739..2d182516 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1,17 +1,3 @@ -#define MECHA_INT_FIRE (1<<0) -#define MECHA_INT_TEMP_CONTROL (1<<1) -#define MECHA_INT_SHORT_CIRCUIT (1<<2) -#define MECHA_INT_TANK_BREACH (1<<3) -#define MECHA_INT_CONTROL_LOST (1<<4) - -#define MELEE 1 -#define RANGED 2 - -#define FRONT_ARMOUR 1 -#define SIDE_ARMOUR 2 -#define BACK_ARMOUR 3 - - /obj/mecha name = "mecha" desc = "Exosuit" @@ -35,9 +21,9 @@ max_integrity = 300 //max_integrity is base health var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. armor = list("melee" = 20, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) - var/list/facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.5) + var/list/facing_modifiers = list(MECHA_FRONT_ARMOUR = 1.5, MECHA_SIDE_ARMOUR = 1, MECHA_BACK_ARMOUR = 0.5) var/obj/item/stock_parts/cell/cell - var/state = 0 + var/construction_state = MECHA_LOCKED var/list/log = new var/last_message = 0 var/add_req_access = 1 @@ -436,7 +422,7 @@ return if(user.incapacitated()) return - if(state) + if(construction_state) occupant_message("Maintenance protocols in effect.") return if(!get_charge()) @@ -519,7 +505,7 @@ occupant_message("Unable to move while connected to the air system port!") last_message = world.time return 0 - if(state) + if(construction_state) occupant_message("Maintenance protocols in effect.") return return domove(direction) @@ -689,7 +675,7 @@ //Transfer from core or card to mech. Proc is called by mech. switch(interaction) if(AI_TRANS_TO_CARD) //Upload AI from mech to AI card. - if(!state) //Mech must be in maint mode to allow carding. + if(construction_state) //Mech must be in maint mode to allow carding. to_chat(user, "[name] must have maintenance protocols active in order to allow a transfer.") return AI = occupant diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index 071fe184..ee7be296 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -116,7 +116,7 @@ //9 list( - "key" = /obj/item/stock_parts/cell, + "key" = /obj/item/stock_parts/scanning_module, "action" = ITEM_MOVE_INSIDE, "back_key" = TOOL_SCREWDRIVER, "desc" = "Peripherals control module is secured." @@ -126,10 +126,40 @@ list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed." + "desc" = "Scanner module is installed." ), //11 + list( + "key" = /obj/item/stock_parts/capacitor, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Scanner module is secured." + ), + + //12 + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Capacitor is installed." + ), + + //13 + list( + "key" = /obj/item/stock_parts/cell, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Capacitor is secured." + ), + + //14 + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "The power cell is installed." + ), + + //15 list( "key" = /obj/item/stack/sheet/metal, "amount" = 5, @@ -137,21 +167,21 @@ "desc" = "The power cell is secured." ), - //12 + //16 list( "key" = TOOL_WRENCH, "back_key" = TOOL_CROWBAR, "desc" = "Internal armor is installed." ), - //13 + //17 list( "key" = TOOL_WELDER, "back_key" = TOOL_WRENCH, "desc" = "Internal armor is wrenched." ), - //14 + //18 list( "key" = /obj/item/stack/sheet/plasteel, "amount" = 5, @@ -159,14 +189,14 @@ "desc" = "Internal armor is welded." ), - //15 + //19 list( "key" = TOOL_WRENCH, "back_key" = TOOL_CROWBAR, "desc" = "External armor is installed." ), - //16 + //20 list( "key" = TOOL_WELDER, "back_key" = TOOL_WRENCH, @@ -222,36 +252,56 @@ else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") if(10) + if(diff==FORWARD) + user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") + else + user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") + if(11) + if(diff==FORWARD) + user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + else + user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") + if(12) + if(diff==FORWARD) + user.visible_message("[user] secures [I].", "You secure [I].") + else + user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") + if(13) + if(diff==FORWARD) + user.visible_message("[user] installs [I].", "You install [I].") + else + user.visible_message("[user] unsecures the capacitor from [parent].", "You unsecure the capacitor from [parent].") + if(14) if(diff==FORWARD) user.visible_message("[user] secures the power cell.", "You secure the power cell.") else user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") - if(11) + if(15) if(diff==FORWARD) user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") else user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") - if(12) + if(16) if(diff==FORWARD) user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") else user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") - if(13) + if(17) if(diff==FORWARD) user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") else user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") - if(14) + if(18) if(diff==FORWARD) user.visible_message("[user] installs the external reinforced armor layer to [parent].", "You install the external reinforced armor layer to [parent].") else user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") - if(15) + if(19) if(diff==FORWARD) user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") else user.visible_message("[user] pries external armor layer from [parent].", "You pry external armor layer from [parent].") - if(16) + if(20) if(diff==FORWARD) user.visible_message("[user] welds the external armor layer to [parent].", "You weld the external armor layer to [parent].") else @@ -629,7 +679,7 @@ //9 list( - "key" = /obj/item/stock_parts/cell, + "key" = /obj/item/stock_parts/scanning_module, "action" = ITEM_MOVE_INSIDE, "back_key" = TOOL_SCREWDRIVER, "desc" = "Peripherals control module is secured." @@ -639,10 +689,40 @@ list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed." + "desc" = "Scanner module is installed." ), //11 + list( + "key" = /obj/item/stock_parts/capacitor, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Scanner module is secured." + ), + + //12 + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Capacitor is installed." + ), + + //13 + list( + "key" = /obj/item/stock_parts/cell, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Capacitor is secured." + ), + + //14 + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "The power cell is installed." + ), + + //15 list( "key" = /obj/item/stack/sheet/plasteel, "amount" = 5, @@ -650,21 +730,21 @@ "desc" = "The power cell is secured." ), - //12 + //16 list( "key" = TOOL_WRENCH, "back_key" = TOOL_CROWBAR, "desc" = "Internal armor is installed." ), - //13 + //17 list( "key" = TOOL_WELDER, "back_key" = TOOL_WRENCH, "desc" = "Internal armor is wrenched." ), - //14 + //18 list( "key" = /obj/item/stack/sheet/plasteel, "amount" = 5, @@ -672,7 +752,7 @@ "desc" = "Internal armor is welded." ), - //15 + //19 list( "key" = /obj/item/stack/sheet/plasteel, "amount" = 5, @@ -680,14 +760,14 @@ "desc" = "External armor is being installed." ), - //16 + //20 list( "key" = TOOL_WRENCH, "back_key" = TOOL_CROWBAR, "desc" = "External armor is installed." ), - //17 + //21 list( "key" = TOOL_WELDER, "back_key" = TOOL_WRENCH, @@ -744,41 +824,61 @@ else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") if(10) + if(diff==FORWARD) + user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") + else + user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") + if(12) + if(diff==FORWARD) + user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + else + user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") + if(13) + if(diff==FORWARD) + user.visible_message("[user] secures the capacitor.", "You secure the capacitor.") + else + user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") + if(14) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the capacitor.", "You unfasten the capacitor.") + if(15) if(diff==FORWARD) user.visible_message("[user] secures the power cell.", "You secure the power cell.") else user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") - if(11) + if(16) if(diff==FORWARD) user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") else user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") - if(12) + if(17) if(diff==FORWARD) user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") else user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") - if(13) + if(18) if(diff==FORWARD) user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") else user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") - if(14) + if(19) if(diff==FORWARD) user.visible_message("[user] starts to install the external armor layer to [parent].", "You install the external armor layer to [parent].") else user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") - if(15) + if(20) if(diff==FORWARD) user.visible_message("[user] installs the external reinforced armor layer to [parent].", "You install the external reinforced armor layer to [parent].") else user.visible_message("[user] removes the external armor from [parent].", "You remove the external armor from [parent].") - if(16) + if(21) if(diff==FORWARD) user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") else user.visible_message("[user] pries external armor layer from [parent].", "You pry external armor layer from [parent].") - if(17) + if(22) if(diff==FORWARD) user.visible_message("[user] welds the external armor layer to [parent].", "You weld the external armor layer to [parent].") else @@ -825,47 +925,63 @@ list( "key" = /obj/item/bikehorn ), - //6 list( "key" = /obj/item/circuitboard/mecha/honker/targeting, "action" = ITEM_DELETE ), - //7 list( "key" = /obj/item/bikehorn ), - //8 list( - "key" = /obj/item/stock_parts/cell, + "key" = /obj/item/stock_parts/scanning_module, "action" = ITEM_MOVE_INSIDE ), - //9 list( "key" = /obj/item/bikehorn ), - //10 list( - "key" = /obj/item/clothing/mask/gas/clown_hat, - "action" = ITEM_DELETE + "key" = /obj/item/stock_parts/capacitor, + "action" = ITEM_MOVE_INSIDE ), - //11 list( "key" = /obj/item/bikehorn ), //12 + list( + "key" = /obj/item/stock_parts/cell, + "action" = ITEM_MOVE_INSIDE + ), + + //13 + list( + "key" = /obj/item/bikehorn + ), + + //14 + list( + "key" = /obj/item/clothing/mask/gas/clown_hat, + "action" = ITEM_DELETE + ), + + //15 + list( + "key" = /obj/item/bikehorn + ), + + //16 list( "key" = /obj/item/clothing/shoes/clown_shoes, "action" = ITEM_DELETE ), - //13 + //17 list( "key" = /obj/item/bikehorn ), @@ -898,8 +1014,12 @@ if(8) user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") if(10) - user.visible_message("[user] puts [I] on [parent].", "You put [I] on [parent].") + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") if(12) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + if(14) + user.visible_message("[user] puts [I] on [parent].", "You put [I] on [parent].") + if(16) user.visible_message("[user] puts [I] on [parent].", "You put [I] on [parent].") return TRUE @@ -1629,7 +1749,7 @@ //9 list( - "key" = /obj/item/stock_parts/cell, + "key" = /obj/item/stock_parts/scanning_module, "action" = ITEM_MOVE_INSIDE, "back_key" = TOOL_SCREWDRIVER, "desc" = "Peripherals control module is secured." @@ -1639,32 +1759,60 @@ list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed." + "desc" = "Scanner module is installed." ), //11 + list( + "key" = /obj/item/stock_parts/capacitor, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Scanner module is secured." + ), + + //12 + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Capacitor is installed." + ), + + //13 + list( + "key" = /obj/item/stock_parts/cell, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Capacitor is secured." + ), + + //14 list( "key" = /obj/item/stack/sheet/metal, "amount" = 5, "back_key" = TOOL_SCREWDRIVER, "desc" = "The power cell is secured." ), - - //12 + //15 + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "The power cell is installed." + ), + //16 list( "key" = TOOL_WRENCH, "back_key" = TOOL_CROWBAR, "desc" = "Internal armor is installed." ), - //13 + //17 list( "key" = TOOL_WELDER, "back_key" = TOOL_WRENCH, "desc" = "Internal armor is wrenched." ), - //14 + //18 list( "key" = /obj/item/stack/sheet/plasteel, "amount" = 5, @@ -1672,14 +1820,14 @@ "desc" = "Internal armor is welded." ), - //15 + //19 list( "key" = TOOL_WRENCH, "back_key" = TOOL_CROWBAR, "desc" = "External armor is installed." ), - //16 + //20 list( "key" = TOOL_WELDER, "back_key" = TOOL_WRENCH, @@ -1736,36 +1884,56 @@ else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") if(10) + if(diff==FORWARD) + user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") + else + user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") + if(11) + if(diff==FORWARD) + user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + else + user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") + if(12) + if(diff==FORWARD) + user.visible_message("[user] secures the capacitor.", "You secure the capacitor.") + else + user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") + if(13) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the capacitor.", "You unfasten the capacitor.") + if(14) if(diff==FORWARD) user.visible_message("[user] secures the power cell.", "You secure the power cell.") else user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") - if(11) + if(15) if(diff==FORWARD) user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") else user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") - if(12) + if(16) if(diff==FORWARD) user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") else user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") - if(13) + if(17) if(diff==FORWARD) user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") else user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") - if(14) + if(18) if(diff==FORWARD) user.visible_message("[user] installs the external armor layer to [parent].", "You install the external reinforced armor layer to [parent].") else user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") - if(15) + if(19) if(diff==FORWARD) user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") else user.visible_message("[user] pries the external armor layer from [parent].", "You pry the external armor layer from [parent].") - if(16) + if(20) if(diff==FORWARD) user.visible_message("[user] welds the external armor layer to [parent].", "You weld the external armor layer to [parent].") else diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index 62a62b56..b7d59c6a 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -1,11 +1,11 @@ /obj/mecha/proc/get_armour_facing(relative_dir) switch(relative_dir) if(0) // BACKSTAB! - return facing_modifiers[BACK_ARMOUR] + return facing_modifiers[MECHA_BACK_ARMOUR] if(45, 90, 270, 315) - return facing_modifiers[SIDE_ARMOUR] + return facing_modifiers[MECHA_SIDE_ARMOUR] if(225, 180, 135) - return facing_modifiers[FRONT_ARMOUR] + return facing_modifiers[MECHA_FRONT_ARMOUR] return 1 //always return non-0 /obj/mecha/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) @@ -199,23 +199,23 @@ else to_chat(user, "Maintenance protocols disabled by operator.") else if(istype(W, /obj/item/wrench)) - if(state==1) - state = 2 + if(construction_state==1) + construction_state = 2 to_chat(user, "You undo the securing bolts.") - else if(state==2) - state = 1 + else if(construction_state==2) + construction_state = 1 to_chat(user, "You tighten the securing bolts.") return else if(istype(W, /obj/item/crowbar)) - if(state==2) - state = 3 + if(construction_state==2) + construction_state = 3 to_chat(user, "You open the hatch to the power unit.") - else if(state==3) - state=2 + else if(construction_state==3) + construction_state=2 to_chat(user, "You close the hatch to the power unit.") return else if(istype(W, /obj/item/stack/cable_coil)) - if(state == 3 && (internal_damage & MECHA_INT_SHORT_CIRCUIT)) + if(construction_state == 3 && (internal_damage & MECHA_INT_SHORT_CIRCUIT)) var/obj/item/stack/cable_coil/CC = W if(CC.use(2)) clearInternalDamage(MECHA_INT_SHORT_CIRCUIT) @@ -227,19 +227,19 @@ if(internal_damage & MECHA_INT_TEMP_CONTROL) clearInternalDamage(MECHA_INT_TEMP_CONTROL) to_chat(user, "You repair the damaged temperature controller.") - else if(state==3 && cell) + else if(construction_state==3 && cell) cell.forceMove(loc) cell = null - state = 4 + construction_state = 4 to_chat(user, "You unscrew and pry out the powercell.") log_message("Powercell removed") - else if(state==4 && cell) - state=3 + else if(construction_state==4 && cell) + construction_state=3 to_chat(user, "You screw the cell in place.") return else if(istype(W, /obj/item/stock_parts/cell)) - if(state==4) + if(construction_state==4) if(!cell) if(!user.transferItemToLoc(W, src)) return diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 79ee7435..0bab48da 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -199,8 +199,8 @@ [add_req_access?"Edit operation keycodes":null] - [maint_access?"[(state>0) ? "Terminate" : "Initiate"] maintenance protocol":null] - [(state>0) ?"Set Cabin Air Pressure":null] + [maint_access?"[(construction_state > MECHA_LOCKED) ? "Terminate" : "Initiate"] maintenance protocol":null] + [(construction_state > MECHA_LOCKED) ?"Set Cabin Air Pressure":null] "} user << browse(., "window=exosuit_maint_console") @@ -231,15 +231,15 @@ if(href_list["maint_access"] && maint_access) var/mob/user = afilter.getMob("user") if(user) - if(state==0) - state = 1 + if(construction_state == MECHA_LOCKED) + construction_state = MECHA_SECURE_BOLTS to_chat(user, "The securing bolts are now exposed.") - else if(state==1) - state = 0 + else if(construction_state == MECHA_SECURE_BOLTS) + construction_state = MECHA_LOCKED to_chat(user, "The securing bolts are now hidden.") output_maintenance_dialog(afilter.getObj("id_card"),user) - if(href_list["set_internal_tank_valve"] && state >=1) + if(href_list["set_internal_tank_valve"] && construction_state) var/mob/user = afilter.getMob("user") if(user) var/new_pressure = input(user,"Input new output pressure","Pressure setting",internal_tank_valve) as num @@ -305,7 +305,7 @@ send_byjax(src.occupant,"exosuit.browser","t_id_upload","[add_req_access?"L":"Unl"]ock ID upload panel") if(href_list["toggle_maint_access"]) - if(state) + if(construction_state) occupant_message("Maintenance protocols in effect") return maint_access = !maint_access diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 699efaac..a0537a66 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -153,6 +153,8 @@ /area/centcom, /area/asteroid, /area/tdome, + /area/hilbertshotel, + /area/hilbertshotelstorage, /area/wizard_station ) for (var/type in SPECIALS) diff --git a/code/game/objects/items/chromosome.dm b/code/game/objects/items/chromosome.dm new file mode 100644 index 00000000..01c22bb4 --- /dev/null +++ b/code/game/objects/items/chromosome.dm @@ -0,0 +1,92 @@ +/obj/item/chromosome + name = "blank chromosome" + icon = 'icons/obj/chromosomes.dmi' + icon_state = "" + desc = "A tube holding chromosomic data." + force = 0 + w_class = WEIGHT_CLASS_SMALL + + var/stabilizer_coeff = 1 //lower is better, affects genetic stability + var/synchronizer_coeff = 1 //lower is better, affects chance to backfire + var/power_coeff = 1 //higher is better, affects "strength" + var/energy_coeff = 1 //lower is better. affects recharge time + + var/weight = 5 + +/obj/item/chromosome/proc/can_apply(datum/mutation/human/HM) + if(!HM || !(HM.can_chromosome == CHROMOSOME_NONE)) + return FALSE + if((stabilizer_coeff != 1) && (HM.stabilizer_coeff != -1)) //if the chromosome is 1, we dont change anything. If the mutation is -1, we cant change it. sorry + return TRUE + if((synchronizer_coeff != 1) && (HM.synchronizer_coeff != -1)) + return TRUE + if((power_coeff != 1) && (HM.power_coeff != -1)) + return TRUE + if((energy_coeff != 1) && (HM.energy_coeff != -1)) + return TRUE + +/obj/item/chromosome/proc/apply(datum/mutation/human/HM) + if(HM.stabilizer_coeff != -1) + HM.stabilizer_coeff = stabilizer_coeff + if(HM.synchronizer_coeff != -1) + HM.synchronizer_coeff = synchronizer_coeff + if(HM.power_coeff != -1) + HM.power_coeff = power_coeff + if(HM.energy_coeff != -1) + HM.energy_coeff = energy_coeff + HM.can_chromosome = 2 + HM.chromosome_name = name + HM.modify() + qdel(src) + +/proc/generate_chromosome() + var/static/list/chromosomes + if(!chromosomes) + chromosomes = list() + for(var/A in subtypesof(/obj/item/chromosome)) + var/obj/item/chromosome/CM = A + if(!initial(CM.weight)) + break + chromosomes[A] = initial(CM.weight) + return pickweight(chromosomes) + + +/obj/item/chromosome/stabilizer + name = "stabilizer chromosome" + desc = "A chromosome that adjusts to the body to reduce genetic damage by 20%." + icon_state = "stabilizer" + stabilizer_coeff = 0.8 + weight = 1 + +/obj/item/chromosome/synchronizer + name = "synchronizer chromosome" + desc = "A chromosome that gives the mind more controle over the mutation, reducing knockback and downsides by 50%." + icon_state = "synchronizer" + synchronizer_coeff = 0.5 + +/obj/item/chromosome/power + name = "power chromosome" + desc = "A power chromosome for boosting certain mutation's power by 50%." + icon_state = "power" + power_coeff = 1.5 + +/obj/item/chromosome/energy + name = "energetic chromosome" + desc = "A chromosome that reduces cooldown on action based mutations by 50%." + icon_state = "energy" + energy_coeff = 0.5 + +/obj/item/chromosome/reinforcer + name = "reinforcement chromosome" + desc = "Renders the mutation immune to mutadone." + icon_state = "reinforcer" + weight = 3 + +/obj/item/chromosome/reinforcer/can_apply(datum/mutation/human/HM) + if(!HM || !(HM.can_chromosome == CHROMOSOME_NONE)) + return FALSE + return !HM.mutadone_proof + +/obj/item/chromosome/reinforcer/apply(datum/mutation/human/HM) + HM.mutadone_proof = TRUE + ..() \ No newline at end of file diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 0496b282..dcf3cd12 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -65,7 +65,7 @@ build_path = /obj/machinery/dna_scannernew req_components = list( /obj/item/stock_parts/scanning_module = 1, - /obj/item/stock_parts/manipulator = 1, + /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/micro_laser = 1, /obj/item/stack/sheet/glass = 1, /obj/item/stack/cable_coil = 2) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 5bc03ab5..fb6eda84 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -6,6 +6,8 @@ T-RAY HEALTH ANALYZER GAS ANALYZER SLIME SCANNER +NANITE SCANNER +GENE SCANNER */ /obj/item/t_scanner @@ -291,7 +293,8 @@ SLIME SCANNER var/ldamage = H.return_liver_damage() if(ldamage > 10) msg += "\t[ldamage > 45 ? "Severe" : "Minor"] liver damage detected.\n" - + if(advanced && H.has_dna()) + to_chat(user, "\tGenetic Stability: [H.dna.stability]%.") // Body part damage report if(iscarbon(M) && mode == 1) var/mob/living/carbon/C = M @@ -757,3 +760,62 @@ SLIME SCANNER var/response = SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, TRUE) if(!response) to_chat(user, "No nanites detected in the subject.") + +/obj/item/sequence_scanner + name = "genetic sequence scanner" + icon = 'icons/obj/device.dmi' + icon_state = "gene" + item_state = "healthanalyzer" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + desc = "A hand-held scanner able to swiftly scan someone for potential mutations. Hold near a DNA console to update from their database." + flags_1 = CONDUCT_1 + item_flags = NOBLUDGEON + slot_flags = ITEM_SLOT_BELT + throwforce = 3 + w_class = WEIGHT_CLASS_TINY + throw_speed = 3 + throw_range = 7 + materials = list(MAT_METAL=200) + var/list/discovered = list() //hit a dna console to update the scanners database + +/obj/item/sequence_scanner/attack(mob/living/M, mob/living/carbon/human/user) + user.visible_message("[user] has analyzed [M]'s genetic sequence.") + + add_fingerprint(user) + + gene_scan(M, user, src) + +/obj/item/sequence_scanner/afterattack(obj/O, mob/user, proximity) + . = ..() + if(!istype(O) || !proximity) + return + + if(istype(O, /obj/machinery/computer/scan_consolenew)) + var/obj/machinery/computer/scan_consolenew/C = O + if(C.stored_research) + to_chat(user, "[name] database updated.") + discovered = C.stored_research.discovered_mutations + else + to_chat(user,"No database to update from.") + +/proc/gene_scan(mob/living/carbon/C, mob/living/user, obj/item/sequence_scanner/G) + if(!iscarbon(C) || !C.has_dna()) + return + to_chat(user, "[C.name]'s potential mutations.") + for(var/A in C.dna.mutation_index) + var/datum/mutation/human/HM = GET_INITIALIZED_MUTATION(A) + var/mut_name + if(G && (A in G.discovered)) + mut_name = "[HM.name] ([HM.alias])" + else + mut_name = HM.alias + var/temp = GET_GENE_STRING(HM.type, C.dna) + var/display + for(var/i in 0 to length(temp) / DNA_MUTATION_BLOCKS-1) + if(i) + display += "-" + display += copytext(temp, 1 + i*DNA_MUTATION_BLOCKS, DNA_MUTATION_BLOCKS*(1+i) + 1) + + + to_chat(user, "- [mut_name] > [display]") \ No newline at end of file diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index a03447c0..8849ac51 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -14,33 +14,25 @@ var/list/add_mutations = list() var/list/remove_mutations = list() - var/list/add_mutations_static = list() - var/list/remove_mutations_static = list() - var/used = 0 /obj/item/dnainjector/attack_paw(mob/user) return attack_hand(user) -/obj/item/dnainjector/proc/prepare() - for(var/mut_key in add_mutations_static) - add_mutations.Add(GLOB.mutations_list[mut_key]) - for(var/mut_key in remove_mutations_static) - remove_mutations.Add(GLOB.mutations_list[mut_key]) - /obj/item/dnainjector/proc/inject(mob/living/carbon/M, mob/user) - prepare() - if(M.has_dna() && !HAS_TRAIT(M, TRAIT_RADIMMUNE) && !HAS_TRAIT(M, TRAIT_NOCLONE)) M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2)) var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]" - for(var/datum/mutation/human/HM in remove_mutations) - HM.force_lose(M) - for(var/datum/mutation/human/HM in add_mutations) - if(HM.name == RACEMUT) + for(var/HM in remove_mutations) + M.dna.remove_mutation(HM) + for(var/HM in add_mutations) + if(HM == RACEMUT) message_admins("[ADMIN_LOOKUPFLW(user)] injected [key_name_admin(M)] with the [name] (MONKEY)") log_msg += " (MONKEY)" - HM.force_give(M) + if(M.dna.mutation_in_sequence(HM)) + M.dna.activate_mutation(HM) + else + M.dna.add_mutation(HM, MUT_EXTRA) if(fields) if(fields["name"] && fields["UE"] && fields["blood_type"]) M.real_name = fields["name"] @@ -90,123 +82,123 @@ /obj/item/dnainjector/antihulk name = "\improper DNA injector (Anti-Hulk)" desc = "Cures green skin." - remove_mutations_static = list(HULK) + remove_mutations = list(HULK) /obj/item/dnainjector/hulkmut name = "\improper DNA injector (Hulk)" desc = "This will make you big and strong, but give you a bad skin condition." - add_mutations_static = list(HULK) + add_mutations = list(HULK) /obj/item/dnainjector/xraymut name = "\improper DNA injector (X-ray)" desc = "Finally you can see what the Captain does." - add_mutations_static = list(XRAY) + add_mutations = list(XRAY) /obj/item/dnainjector/antixray name = "\improper DNA injector (Anti-X-ray)" desc = "It will make you see harder." - remove_mutations_static = list(XRAY) + remove_mutations = list(XRAY) ///////////////////////////////////// /obj/item/dnainjector/antiglasses name = "\improper DNA injector (Anti-Glasses)" desc = "Toss away those glasses!" - remove_mutations_static = list(BADSIGHT) + remove_mutations = list(BADSIGHT) /obj/item/dnainjector/glassesmut name = "\improper DNA injector (Glasses)" desc = "Will make you need dorkish glasses." - add_mutations_static = list(BADSIGHT) + add_mutations = list(BADSIGHT) /obj/item/dnainjector/epimut name = "\improper DNA injector (Epi.)" desc = "Shake shake shake the room!" - add_mutations_static = list(EPILEPSY) + add_mutations = list(EPILEPSY) /obj/item/dnainjector/antiepi name = "\improper DNA injector (Anti-Epi.)" desc = "Will fix you up from shaking the room." - remove_mutations_static = list(EPILEPSY) + remove_mutations = list(EPILEPSY) //////////////////////////////////// /obj/item/dnainjector/anticough name = "\improper DNA injector (Anti-Cough)" desc = "Will stop that awful noise." - remove_mutations_static = list(COUGH) + remove_mutations = list(COUGH) /obj/item/dnainjector/coughmut name = "\improper DNA injector (Cough)" desc = "Will bring forth a sound of horror from your throat." - add_mutations_static = list(COUGH) + add_mutations = list(COUGH) /obj/item/dnainjector/antidwarf name = "\improper DNA injector (Anti-Dwarfism)" desc = "Helps you grow big and strong." - remove_mutations_static = list(DWARFISM) + remove_mutations = list(DWARFISM) /obj/item/dnainjector/dwarf name = "\improper DNA injector (Dwarfism)" desc = "It's a small world after all." - add_mutations_static = list(DWARFISM) + add_mutations = list(DWARFISM) /obj/item/dnainjector/clumsymut name = "\improper DNA injector (Clumsy)" desc = "Makes clown minions." - add_mutations_static = list(CLOWNMUT) + add_mutations = list(CLOWNMUT) /obj/item/dnainjector/anticlumsy name = "\improper DNA injector (Anti-Clumsy)" desc = "Apply this for Security Clown." - remove_mutations_static = list(CLOWNMUT) + remove_mutations = list(CLOWNMUT) /obj/item/dnainjector/antitour name = "\improper DNA injector (Anti-Tour.)" desc = "Will cure Tourette's." - remove_mutations_static = list(TOURETTES) + remove_mutations = list(TOURETTES) /obj/item/dnainjector/tourmut name = "\improper DNA injector (Tour.)" desc = "Gives you a nasty case of Tourette's." - add_mutations_static = list(TOURETTES) + add_mutations = list(TOURETTES) /obj/item/dnainjector/stuttmut name = "\improper DNA injector (Stutt.)" desc = "Makes you s-s-stuttterrr." - add_mutations_static = list(NERVOUS) + add_mutations = list(NERVOUS) /obj/item/dnainjector/antistutt name = "\improper DNA injector (Anti-Stutt.)" desc = "Fixes that speaking impairment." - remove_mutations_static = list(NERVOUS) + remove_mutations = list(NERVOUS) /obj/item/dnainjector/antifire name = "\improper DNA injector (Anti-Fire)" desc = "Cures fire." - remove_mutations_static = list(COLDRES) + remove_mutations = list(SPACEMUT) /obj/item/dnainjector/firemut name = "\improper DNA injector (Fire)" desc = "Gives you fire." - add_mutations_static = list(COLDRES) + add_mutations = list(SPACEMUT) /obj/item/dnainjector/blindmut name = "\improper DNA injector (Blind)" desc = "Makes you not see anything." - add_mutations_static = list(BLINDMUT) + add_mutations = list(BLINDMUT) /obj/item/dnainjector/antiblind name = "\improper DNA injector (Anti-Blind)" desc = "IT'S A MIRACLE!!!" - remove_mutations_static = list(BLINDMUT) + remove_mutations = list(BLINDMUT) /obj/item/dnainjector/antitele name = "\improper DNA injector (Anti-Tele.)" desc = "Will make you not able to control your mind." - remove_mutations_static = list(TK) + remove_mutations = list(TK) /obj/item/dnainjector/telemut name = "\improper DNA injector (Tele.)" desc = "Super brain man!" - add_mutations_static = list(TK) + add_mutations = list(TK) /obj/item/dnainjector/telemut/darkbundle name = "\improper DNA injector" @@ -215,100 +207,171 @@ /obj/item/dnainjector/deafmut name = "\improper DNA injector (Deaf)" desc = "Sorry, what did you say?" - add_mutations_static = list(DEAFMUT) + add_mutations = list(DEAFMUT) /obj/item/dnainjector/antideaf name = "\improper DNA injector (Anti-Deaf)" desc = "Will make you hear once more." - remove_mutations_static = list(DEAFMUT) + remove_mutations = list(DEAFMUT) /obj/item/dnainjector/h2m name = "\improper DNA injector (Human > Monkey)" desc = "Will make you a flea bag." - add_mutations_static = list(RACEMUT) + add_mutations = list(RACEMUT) /obj/item/dnainjector/m2h name = "\improper DNA injector (Monkey > Human)" desc = "Will make you...less hairy." - remove_mutations_static = list(RACEMUT) + remove_mutations = list(RACEMUT) /obj/item/dnainjector/antichameleon name = "\improper DNA injector (Anti-Chameleon)" - remove_mutations_static = list(CHAMELEON) + remove_mutations = list(CHAMELEON) /obj/item/dnainjector/chameleonmut name = "\improper DNA injector (Chameleon)" - add_mutations_static = list(CHAMELEON) + add_mutations = list(CHAMELEON) /obj/item/dnainjector/antiwacky name = "\improper DNA injector (Anti-Wacky)" - remove_mutations_static = list(WACKY) + remove_mutations = list(WACKY) /obj/item/dnainjector/wackymut name = "\improper DNA injector (Wacky)" - add_mutations_static = list(WACKY) + add_mutations = list(WACKY) /obj/item/dnainjector/antimute name = "\improper DNA injector (Anti-Mute)" - remove_mutations_static = list(MUT_MUTE) + remove_mutations = list(MUT_MUTE) /obj/item/dnainjector/mutemut name = "\improper DNA injector (Mute)" - add_mutations_static = list(MUT_MUTE) + add_mutations = list(MUT_MUTE) /obj/item/dnainjector/antismile name = "\improper DNA injector (Anti-Smile)" - remove_mutations_static = list(SMILE) + remove_mutations = list(SMILE) /obj/item/dnainjector/smilemut name = "\improper DNA injector (Smile)" - add_mutations_static = list(SMILE) + add_mutations = list(SMILE) /obj/item/dnainjector/unintelligiblemut name = "\improper DNA injector (Unintelligible)" - add_mutations_static = list(UNINTELLIGIBLE) + add_mutations = list(UNINTELLIGIBLE) /obj/item/dnainjector/antiunintelligible name = "\improper DNA injector (Anti-Unintelligible)" - remove_mutations_static = list(UNINTELLIGIBLE) + remove_mutations = list(UNINTELLIGIBLE) /obj/item/dnainjector/swedishmut name = "\improper DNA injector (Swedish)" - add_mutations_static = list(SWEDISH) + add_mutations = list(SWEDISH) /obj/item/dnainjector/antiswedish name = "\improper DNA injector (Anti-Swedish)" - remove_mutations_static = list(SWEDISH) + remove_mutations = list(SWEDISH) /obj/item/dnainjector/chavmut name = "\improper DNA injector (Chav)" - add_mutations_static = list(CHAV) + add_mutations = list(CHAV) /obj/item/dnainjector/antichav name = "\improper DNA injector (Anti-Chav)" - remove_mutations_static = list(CHAV) + remove_mutations = list(CHAV) /obj/item/dnainjector/elvismut name = "\improper DNA injector (Elvis)" - add_mutations_static = list(ELVIS) + add_mutations = list(ELVIS) /obj/item/dnainjector/antielvis name = "\improper DNA injector (Anti-Elvis)" - remove_mutations_static = list(ELVIS) + remove_mutations = list(ELVIS) /obj/item/dnainjector/lasereyesmut name = "\improper DNA injector (Laser Eyes)" - add_mutations_static = list(LASEREYES) + add_mutations = list(LASEREYES) /obj/item/dnainjector/antilasereyes name = "\improper DNA injector (Anti-Laser Eyes)" - remove_mutations_static = list(LASEREYES) + remove_mutations = list(LASEREYES) + +/obj/item/dnainjector/thermalmut + name = "\improper DNA injector (Thermal Vision)" + add_mutations = list(THERMAL) + +/obj/item/dnainjector/antithermal + name = "\improper DNA injector (Anti-Thermal Vision)" + remove_mutations = list(THERMAL) + +/obj/item/dnainjector/telepathymut + name = "\improper DNA injector (Telepathy)" + add_mutations = list(TELEPATHY) + +/obj/item/dnainjector/antitelepathy + name = "\improper DNA injector (Anti-Telepathy)" + remove_mutations = list(TELEPATHY) + +/obj/item/dnainjector/voidmut + name = "\improper DNA injector (Void Magnet)" + add_mutations = list(VOID) + +/obj/item/dnainjector/antivoid + name = "\improper DNA injector (Anti-Void Magnet)" + remove_mutations = list(VOID) + +/obj/item/dnainjector/firebreathmut + name = "\improper DNA injector (Firebreath)" + add_mutations = list(FIREBREATH) + +/obj/item/dnainjector/antifirebreath + name = "\improper DNA injector (Anti-Firebreath)" + remove_mutations = list(FIREBREATH) + +/obj/item/dnainjector/insulatedmut + name = "\improper DNA injector (Insulated)" + add_mutations = list(INSULATED) + +/obj/item/dnainjector/antiinsulated + name = "\improper DNA injector (Anti-Insulated)" + remove_mutations = list(INSULATED) + +/obj/item/dnainjector/shocktouchmut + name = "\improper DNA injector (Shock Touch)" + add_mutations = list(SHOCKTOUCH) + +/obj/item/dnainjector/antishocktouch + name = "\improper DNA injector (Anti-Shock Touch)" + remove_mutations = list(SHOCKTOUCH) + +/obj/item/dnainjector/antenna + name = "\improper DNA injector (Antenna)" + add_mutations = list(ANTENNA) + +/obj/item/dnainjector/antiantenna + name = "\improper DNA injector (Anti-Antenna)" + remove_mutations = list(ANTENNA) + +/obj/item/dnainjector/paranoia + name = "\improper DNA injector (Paranoia)" + add_mutations = list(PARANOIA) + +/obj/item/dnainjector/antiparanoia + name = "\improper DNA injector (Anti-Paranoia)" + remove_mutations = list(PARANOIA) + +/obj/item/dnainjector/mindread + name = "\improper DNA injector (Mindread)" + add_mutations = list(MINDREAD) + +/obj/item/dnainjector/antimindread + name = "\improper DNA injector (Anti-Mindread)" + remove_mutations = list(MINDREAD) /obj/item/dnainjector/timed var/duration = 600 /obj/item/dnainjector/timed/inject(mob/living/carbon/M, mob/user) - prepare() if(M.stat == DEAD) //prevents dead people from having their DNA changed to_chat(user, "You can't modify [M]'s DNA while [M.p_theyre()] dead.") return FALSE @@ -317,23 +380,22 @@ M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2)) var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]" var/endtime = world.time+duration - for(var/datum/mutation/human/HM in remove_mutations) - if(HM.name == RACEMUT) + for(var/mutation in remove_mutations) + if(mutation == RACEMUT) if(ishuman(M)) continue - M = HM.force_lose(M) + M = M.dna.remove_mutation(mutation) else - HM.force_lose(M) - for(var/datum/mutation/human/HM in add_mutations) - if((HM in M.dna.mutations) && !(M.dna.temporary_mutations[HM.name])) + M.dna.remove_mutation(mutation) + for(var/mutation in add_mutations) + if(M.dna.get_mutation(mutation)) continue //Skip permanent mutations we already have. - if(HM.name == RACEMUT && ishuman(M)) + if(mutation == RACEMUT && ishuman(M)) message_admins("[ADMIN_LOOKUPFLW(user)] injected [key_name_admin(M)] with the [name] (MONKEY)") log_msg += " (MONKEY)" - M = HM.force_give(M) + M = M.dna.add_mutation(mutation, MUT_OTHER, endtime) else - HM.force_give(M) - M.dna.temporary_mutations[HM.name] = endtime + M.dna.add_mutation(mutation, MUT_OTHER, endtime) if(fields) if(fields["name"] && fields["UE"] && fields["blood_type"]) if(!M.dna.previous["name"]) @@ -361,9 +423,41 @@ /obj/item/dnainjector/timed/hulk name = "\improper DNA injector (Hulk)" desc = "This will make you big and strong, but give you a bad skin condition." - add_mutations_static = list(HULK) + add_mutations = list(HULK) /obj/item/dnainjector/timed/h2m name = "\improper DNA injector (Human > Monkey)" desc = "Will make you a flea bag." - add_mutations_static = list(RACEMUT) + add_mutations = list(RACEMUT) + +/obj/item/dnainjector/activator + name = "\improper DNA activator" + desc = "Activates the current mutation on injection, if the subject has it." + var/doitanyway = FALSE + var/research = FALSE //Set to true to get expended and filled injectors for chromosomes + var/filled = FALSE + +/obj/item/dnainjector/activator/inject(mob/living/carbon/M, mob/user) + if(M.has_dna() && !HAS_TRAIT(M, TRAIT_RADIMMUNE) && !HAS_TRAIT(M,TRAIT_NOCLONE)) + M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2)) + var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]" + for(var/mutation in add_mutations) + var/datum/mutation/human/HM = mutation + if(istype(HM, /datum/mutation/human)) + mutation = HM.type + if(!M.dna.activate_mutation(HM)) + if(!doitanyway) + log_msg += "(FAILED)" + else + M.dna.add_mutation(HM, MUT_EXTRA) + name = "expended [name]" + else if(research && M.client) + filled = TRUE + name = "filled [name]" + else + name = "expended [name]" + log_msg += "([mutation])" + log_attack("[log_msg] [loc_name(user)]") + return TRUE + return FALSE + diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 44b39265..83b14a1a 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -25,6 +25,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ merge_type = /obj/item/stack/sheet/glass grind_results = list("silicon" = 20) point_value = 1 + tableVariant = /obj/structure/table/glass /obj/item/stack/sheet/glass/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins to slice [user.p_their()] neck with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index c8e4a33e..6ae73099 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -155,6 +155,7 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \ new/datum/stack_recipe("wallet", /obj/item/storage/wallet, 1), \ new/datum/stack_recipe("muzzle", /obj/item/clothing/mask/muzzle, 2), \ new/datum/stack_recipe("botany gloves", /obj/item/clothing/gloves/botanic_leather, 3), \ + new/datum/stack_recipe("botany belt", /obj/item/storage/belt/botany, 4), \ new/datum/stack_recipe("toolbelt", /obj/item/storage/belt/utility, 4), \ new/datum/stack_recipe("leather satchel", /obj/item/storage/backpack/satchel/leather, 5), \ new/datum/stack_recipe("bandolier", /obj/item/storage/belt/bandolier, 5), \ diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 7df16546..46c0d473 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -232,6 +232,7 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \ grind_results = list("silver" = 20) point_value = 20 merge_type = /obj/item/stack/sheet/mineral/silver + tableVariant = /obj/structure/table/optable GLOBAL_LIST_INIT(silver_recipes, list ( \ new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, one_per_turf = 1, on_floor = 1), \ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 8c808d0e..e1f82e4a 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -107,6 +107,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ merge_type = /obj/item/stack/sheet/metal grind_results = list("iron" = 20) point_value = 2 + tableVariant = /obj/structure/table /obj/item/stack/sheet/metal/ratvar_act() new /obj/item/stack/tile/brass(loc, amount) @@ -168,6 +169,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ merge_type = /obj/item/stack/sheet/plasteel grind_results = list("iron" = 20, "plasma" = 20) point_value = 23 + tableVariant = /obj/structure/table/reinforced /obj/item/stack/sheet/plasteel/Initialize(mapload, new_amount, merge = TRUE) recipes = GLOB.plasteel_recipes @@ -206,6 +208,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\ new/datum/stack_recipe("tiki mask", /obj/item/clothing/mask/gas/tiki_mask, 2), \ new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\ + new/datum/stack_recipe("cross", /obj/structure/kitchenspike/cross, 10, time = 10),\ new/datum/stack_recipe("ore box", /obj/structure/ore_box, 4, time = 50, one_per_turf = TRUE, on_floor = TRUE),\ new/datum/stack_recipe("wooden crate", /obj/structure/closet/crate/wooden, 6, time = 50, one_per_turf = TRUE, on_floor = TRUE),\ new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15),\ @@ -474,6 +477,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \ novariants = FALSE grind_results = list("iron" = 5, "teslium" = 15, "holyoil" = 1) merge_type = /obj/item/stack/tile/brass + tableVariant = /obj/structure/table/reinforced/brass /obj/item/stack/tile/brass/narsie_act() new /obj/item/stack/sheet/runed_metal(loc, amount) @@ -526,6 +530,7 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ novariants = FALSE grind_results = list("iron" = 5, "copper" = 3) //we have no "tin" reagent so this is the closest thing merge_type = /obj/item/stack/tile/bronze + tableVariant = /obj/structure/table/bronze /obj/item/stack/tile/bronze/attack_self(mob/living/user) if(is_servant_of_ratvar(user)) //still lets them build with it, just gives a message diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 4217a58f..155d1f16 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -22,6 +22,7 @@ var/full_w_class = WEIGHT_CLASS_NORMAL //The weight class the stack should have at amount > 2/3rds max_amount var/novariants = TRUE //Determines whether the item should update it's sprites based on amount. //NOTE: When adding grind_results, the amounts should be for an INDIVIDUAL ITEM - these amounts will be multiplied by the stack size in on_grind() + var/obj/structure/table/tableVariant // we tables now (stores table variant to be built from this stack) /obj/item/stack/on_grind() for(var/i in 1 to grind_results.len) //This should only call if it's ground, so no need to check if grind_results exists diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 3b28c304..b98c4f79 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -99,34 +99,118 @@ icon_state = "tile-carpet" turf_type = /turf/open/floor/carpet resistance_flags = FLAMMABLE - -/obj/item/stack/tile/carpet/fifty - amount = 50 + tableVariant = /obj/structure/table/wood/fancy /obj/item/stack/tile/carpet/black name = "black carpet" icon_state = "tile-carpet-black" turf_type = /turf/open/floor/carpet/black + tableVariant = /obj/structure/table/wood/fancy/black + +/obj/item/stack/tile/carpet/blackred + name = "red carpet" + icon_state = "tile-carpet-blackred" + turf_type = /turf/open/floor/carpet/blackred + tableVariant = /obj/structure/table/wood/fancy/blackred + +/obj/item/stack/tile/carpet/monochrome + name = "monochrome carpet" + icon_state = "tile-carpet-monochrome" + turf_type = /turf/open/floor/carpet/monochrome + tableVariant = /obj/structure/table/wood/fancy/monochrome + +/obj/item/stack/tile/carpet/blue + name = "blue carpet" + icon_state = "tile-carpet-blue" + item_state = "tile-carpet-blue" + turf_type = /turf/open/floor/carpet/blue + tableVariant = /obj/structure/table/wood/fancy/blue + +/obj/item/stack/tile/carpet/cyan + name = "cyan carpet" + icon_state = "tile-carpet-cyan" + item_state = "tile-carpet-cyan" + turf_type = /turf/open/floor/carpet/cyan + tableVariant = /obj/structure/table/wood/fancy/cyan + +/obj/item/stack/tile/carpet/green + name = "green carpet" + icon_state = "tile-carpet-green" + item_state = "tile-carpet-green" + turf_type = /turf/open/floor/carpet/green + tableVariant = /obj/structure/table/wood/fancy/green + +/obj/item/stack/tile/carpet/orange + name = "orange carpet" + icon_state = "tile-carpet-orange" + item_state = "tile-carpet-orange" + turf_type = /turf/open/floor/carpet/orange + tableVariant = /obj/structure/table/wood/fancy/orange + +/obj/item/stack/tile/carpet/purple + name = "purple carpet" + icon_state = "tile-carpet-purple" + item_state = "tile-carpet-purple" + turf_type = /turf/open/floor/carpet/purple + tableVariant = /obj/structure/table/wood/fancy/purple + +/obj/item/stack/tile/carpet/red + name = "red carpet" + icon_state = "tile-carpet-red" + item_state = "tile-carpet-red" + turf_type = /turf/open/floor/carpet/red + tableVariant = /obj/structure/table/wood/fancy/red + +/obj/item/stack/tile/carpet/royalblack + name = "royal black carpet" + icon_state = "tile-carpet-royalblack" + item_state = "tile-carpet-royalblack" + turf_type = /turf/open/floor/carpet/royalblack + tableVariant = /obj/structure/table/wood/fancy/royalblack + +/obj/item/stack/tile/carpet/royalblue + name = "royal blue carpet" + icon_state = "tile-carpet-royalblue" + item_state = "tile-carpet-royalblue" + turf_type = /turf/open/floor/carpet/royalblue + tableVariant = /obj/structure/table/wood/fancy/royalblue + +/obj/item/stack/tile/carpet/fifty + amount = 50 /obj/item/stack/tile/carpet/black/fifty amount = 50 -/obj/item/stack/tile/carpet/blackred - name = "red carpet" - icon_state = "tile-carpet-blackred" - turf_type = /turf/open/floor/carpet/blackred - /obj/item/stack/tile/carpet/blackred/fifty amount = 50 -/obj/item/stack/tile/carpet/monochrome - name = "monochrome carpet" - icon_state = "tile-carpet-monochrome" - turf_type = /turf/open/floor/carpet/monochrome - /obj/item/stack/tile/carpet/monochrome/fifty amount = 50 +/obj/item/stack/tile/carpet/blue/fifty + amount = 50 + +/obj/item/stack/tile/carpet/cyan/fifty + amount = 50 + +/obj/item/stack/tile/carpet/green/fifty + amount = 50 + +/obj/item/stack/tile/carpet/orange/fifty + amount = 50 + +/obj/item/stack/tile/carpet/purple/fifty + amount = 50 + +/obj/item/stack/tile/carpet/red/fifty + amount = 50 + +/obj/item/stack/tile/carpet/royalblack/fifty + amount = 50 + +/obj/item/stack/tile/carpet/royalblue/fifty + amount = 50 + /obj/item/stack/tile/fakespace name = "astral carpet" singular_name = "astral carpet" diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 7ab85084..c95e93ec 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -397,3 +397,24 @@ GET_COMPONENT(STR, /datum/component/storage) STR.max_combined_w_class = INFINITY STR.max_items = 100 + +/* + * Construction bag (for engineering, holds stock parts and electronics) + */ + +/obj/item/storage/bag/construction + name = "construction bag" + icon = 'icons/obj/tools.dmi' + icon_state = "construction_bag" + desc = "A bag for storing small construction components." + w_class = WEIGHT_CLASS_TINY + resistance_flags = FLAMMABLE + +/obj/item/storage/bag/construction/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_combined_w_class = 100 + STR.max_items = 50 + STR.max_w_class = WEIGHT_CLASS_SMALL + STR.insert_preposition = "in" + STR.can_hold = typecacheof(list(/obj/item/stack/ore/bluespace_crystal, /obj/item/assembly, /obj/item/stock_parts, /obj/item/reagent_containers/glass/beaker, /obj/item/stack/cable_coil, /obj/item/circuitboard, /obj/item/electronics)) \ No newline at end of file diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 41da716c..1f68d476 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -166,8 +166,6 @@ /obj/item/clothing/glasses, /obj/item/wrench/medical, /obj/item/clothing/mask/muzzle, - /obj/item/storage/bag/chemistry, - /obj/item/storage/bag/bio, /obj/item/reagent_containers/blood, /obj/item/tank/internals/emergency_oxygen, /obj/item/gun/syringe/syndicate, @@ -270,7 +268,6 @@ /obj/item/kitchen/knife, /obj/item/reagent_containers/hypospray, /obj/item/gps, - /obj/item/storage/bag/ore, /obj/item/survivalcapsule, /obj/item/t_scanner/adv_mining_scanner, /obj/item/reagent_containers/pill, @@ -279,7 +276,6 @@ /obj/item/reagent_containers/food/drinks, /obj/item/organ/regenerative_core, /obj/item/wormhole_jaunter, - /obj/item/storage/bag/plants, /obj/item/stack/marker_beacon )) @@ -599,7 +595,7 @@ icon_state = "bandolier-durathread" item_state = "bandolier-durathread" resistance_flags = FIRE_PROOF - + /obj/item/storage/belt/bandolier/durathread/ComponentInitialize() . = ..() GET_COMPONENT(STR, /datum/component/storage) @@ -776,3 +772,27 @@ if(attack_type == PROJECTILE_ATTACK) final_block_chance = 0 //To thin to block bullets return ..() + +/obj/item/storage/belt/botany + name = "botany belt" + desc = "A belt used to hold most janitorial supplies." + icon_state = "grenadebeltold" //reusing the old grenade belt sprite, can't go wrong. + item_state = "grenadebeltold" + +/obj/item/storage/belt/botany/ComponentInitialize() + . = ..() + GET_COMPONENT(STR, /datum/component/storage) + STR.max_items = 8 + STR.max_w_class = WEIGHT_CLASS_NORMAL + STR.can_hold = typecacheof(list( + /obj/item/reagent_containers/glass/beaker, + /obj/item/reagent_containers/glass/bottle, + /obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/spray, + /obj/item/disk/plantgene, + /obj/item/seeds, + /obj/item/shovel/spade, + /obj/item/cultivator, + /obj/item/hatchet, + /obj/item/plant_analyzer + )) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index e10e3b20..96afe90b 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -80,6 +80,7 @@ new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/glasses/meson/engine(src) new /obj/item/storage/box/emptysandbags(src) + new /obj/item/storage/bag/construction(src) /obj/structure/closet/secure_closet/atmospherics diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 21622519..a717f7f1 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -153,4 +153,91 @@ new /obj/item/stack/rods(loc, 4) qdel(src) -#undef VIABLE_MOB_CHECK +/obj/structure/kitchenspike/cross + name = "cross" + icon = 'icons/obj/cross.dmi' + icon_state = "cross" + desc = "Degenerates like you belong on one of these." + anchored = TRUE + bound_height = 64 + +/obj/structure/kitchenspike/cross/crowbar_act(mob/living/user, obj/item/I) + if(has_buckled_mobs()) + to_chat(user, "You can't do that while something's on the cross!") + return FALSE + if(I.use_tool(src, user, 20, volume=100)) + deconstruct() + return TRUE + +/obj/structure/kitchenspike/cross/deconstruct() + new /obj/item/stack/sheet/mineral/wood(src.loc, 10) + qdel(src) + +/obj/structure/kitchenspike/cross/attack_hand(mob/user) + if(VIABLE_MOB_CHECK(user.pulling) && user.a_intent == INTENT_GRAB && !has_buckled_mobs()) + var/mob/living/L = user.pulling + if(do_mob(user, src, 120)) + if(has_buckled_mobs()) //to prevent spam/queing up attacks + return + if(L.buckled) + return + if(user.pulling != L) + return + playsound(src.loc, "sound/effects/crossed.ogg", 20, 1) // thanks hippie + L.visible_message("[user] ties [L] to the cross!", "[user] ties you to the cross!") + L.forceMove(drop_location()) + L.setDir(2) + buckle_mob(L, force=1) + L.pixel_y = 26 + L.overlays += image('icons/obj/cross.dmi', "lashing") + to_chat(user, "You can't use that on the cross!") + else if (has_buckled_mobs()) + for(var/mob/living/L in buckled_mobs) + user_unbuckle_mob(L, user) + else + ..() + +/obj/structure/kitchenspike/cross/user_unbuckle_mob(mob/living/buckled_mob, mob/living/carbon/human/user) + if(buckled_mob && buckled_mob.buckled == src) + var/mob/living/M = buckled_mob + if(M != user) + M.visible_message(\ + "[user] tries to pull [M] free of the [src]!",\ + "[user.name] is trying to pull you off the [src], opening up fresh wounds!",\ + "You hear rope being unraveled.") + if(!do_after(user, 300, target = src)) + if(M && M.buckled) + M.visible_message(\ + "[user] fails to free [M]!",\ + "[user] fails to pull you off of the [src].") + return + + else + M.visible_message(\ + "[M] struggles to break free from the [src]!",\ + "You struggle to break free from the [src], exacerbating your wounds! (Stay still for two minutes.)",\ + "You hear violent scraping and struggling.") + M.adjustBruteLoss(20) + if(!do_after(M, 1200, target = src)) + if(M && M.buckled) + to_chat(M, "You fail to free yourself!") + return + if(!M.buckled) + return + untie_mob(M) + +/obj/structure/kitchenspike/cross/proc/untie_mob(mob/living/M) + M.pixel_y = M.get_standard_pixel_y_offset() + M.adjustBruteLoss(15) + src.visible_message(text("[M] falls free of [src]!")) + unbuckle_mob(M,force=1) + M.emote("collapse") + M.overlays -= image('icons/obj/cross.dmi', "lashing") + +/obj/structure/kitchenspike/cross/Destroy() + if(has_buckled_mobs()) + for(var/mob/living/L in buckled_mobs) + untie_mob(L) + return ..() + +#undef VIABLE_MOB_CHECK \ No newline at end of file diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm index e979d4f1..f62bed87 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/game/objects/structures/table_frames.dm @@ -22,84 +22,22 @@ var/framestackamount = 2 /obj/structure/table_frame/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench)) + if(I.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start disassembling [src]...") I.play_tool_sound(src) if(I.use_tool(src, user, 30)) - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) deconstruct(TRUE) - else if(istype(I, /obj/item/stack/sheet/plasteel)) - var/obj/item/stack/sheet/plasteel/P = I - if(P.get_amount() < 1) - to_chat(user, "You need one plasteel sheet to do this!") + return + + var/obj/item/stack/material = I + if (istype(I, /obj/item/stack) && material?.tableVariant) + if(material.get_amount() < 1) + to_chat(user, "You need one [material.name] sheet to do this!") return - to_chat(user, "You start adding [P] to [src]...") - if(do_after(user, 50, target = src) && P.use(1)) - make_new_table(/obj/structure/table/reinforced) - else if(istype(I, /obj/item/stack/sheet/metal)) - var/obj/item/stack/sheet/metal/M = I - if(M.get_amount() < 1) - to_chat(user, "You need one metal sheet to do this!") - return - to_chat(user, "You start adding [M] to [src]...") - if(do_after(user, 20, target = src) && M.use(1)) - make_new_table(/obj/structure/table) - else if(istype(I, /obj/item/stack/sheet/glass)) - var/obj/item/stack/sheet/glass/G = I - if(G.get_amount() < 1) - to_chat(user, "You need one glass sheet to do this!") - return - to_chat(user, "You start adding [G] to [src]...") - if(do_after(user, 20, target = src) && G.use(1)) - make_new_table(/obj/structure/table/glass) - else if(istype(I, /obj/item/stack/sheet/mineral/silver)) - var/obj/item/stack/sheet/mineral/silver/S = I - if(S.get_amount() < 1) - to_chat(user, "You need one silver sheet to do this!") - return - to_chat(user, "You start adding [S] to [src]...") - if(do_after(user, 20, target = src) && S.use(1)) - make_new_table(/obj/structure/table/optable) - else if(istype(I, /obj/item/stack/tile/carpet/black)) - var/obj/item/stack/tile/carpet/black/C = I - if(C.get_amount() < 1) - to_chat(user, "You need one black carpet sheet to do this!") - return - to_chat(user, "You start adding [C] to [src]...") - if(do_after(user, 20, target = src) && C.use(1)) - make_new_table(/obj/structure/table/wood/fancy/black) - else if(istype(I, /obj/item/stack/tile/carpet/blackred)) - var/obj/item/stack/tile/carpet/blackred/C = I - if(C.get_amount() < 1) - to_chat(user, "You need one red carpet sheet to do this!") - return - to_chat(user, "You start adding [C] to [src]...") - if(do_after(user, 20, target = src) && C.use(1)) - make_new_table(/obj/structure/table/wood/fancy/blackred) - else if(istype(I, /obj/item/stack/tile/carpet/monochrome)) - var/obj/item/stack/tile/carpet/monochrome/C = I - if(C.get_amount() < 1) - to_chat(user, "You need one monochrome carpet sheet to do this!") - return - to_chat(user, "You start adding [C] to [src]...") - if(do_after(user, 20, target = src) && C.use(1)) - make_new_table(/obj/structure/table/wood/fancy/monochrome) - else if(istype(I, /obj/item/stack/tile/carpet)) - var/obj/item/stack/tile/carpet/C = I - if(C.get_amount() < 1) - to_chat(user, "You need one carpet sheet to do this!") - return - to_chat(user, "You start adding [C] to [src]...") - if(do_after(user, 20, target = src) && C.use(1)) - make_new_table(/obj/structure/table/wood/fancy) - else if(istype(I, /obj/item/stack/tile/bronze)) - var/obj/item/stack/tile/bronze/B = I - if(B.get_amount() < 1) - to_chat(user, "You need one bronze sheet to do this!") - return - to_chat(user, "You start adding [B] to [src]...") - if(do_after(user, 20, target = src) && B.use(1)) - make_new_table(/obj/structure/table/bronze) + to_chat(user, "You start adding [material] to [src]...") + if(do_after(user, 20, target = src) && material.use(1)) + make_new_table(material.tableVariant) else return ..() @@ -135,23 +73,21 @@ resistance_flags = FLAMMABLE /obj/structure/table_frame/wood/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/stack/sheet/mineral/wood)) - var/obj/item/stack/sheet/mineral/wood/W = I - if(W.get_amount() < 1) - to_chat(user, "You need one wood sheet to do this!") - return - to_chat(user, "You start adding [W] to [src]...") - if(do_after(user, 20, target = src) && W.use(1)) - make_new_table(/obj/structure/table/wood) - return - else if(istype(I, /obj/item/stack/tile/carpet)) - var/obj/item/stack/tile/carpet/C = I - if(C.get_amount() < 1) - to_chat(user, "You need one carpet sheet to do this!") - return - to_chat(user, "You start adding [C] to [src]...") - if(do_after(user, 20, target = src) && C.use(1)) - make_new_table(/obj/structure/table/wood/poker) + if (istype(I, /obj/item/stack)) + var/obj/item/stack/material = I + var/toConstruct // stores the table variant + if(istype(I, /obj/item/stack/sheet/mineral/wood)) + toConstruct = /obj/structure/table/wood + else if(istype(I, /obj/item/stack/tile/carpet)) + toConstruct = /obj/structure/table/wood/poker + + if (toConstruct) + if(material.get_amount() < 1) + to_chat(user, "You need one [material.name] sheet to do this!") + return + to_chat(user, "You start adding [material] to [src]...") + if(do_after(user, 20, target = src) && material.use(1)) + make_new_table(toConstruct) else return ..() diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index e262c5cf..bec51dce 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -115,6 +115,9 @@ log_combat(user, pushed_mob, "placed") /obj/structure/table/proc/tablepush(mob/living/user, mob/living/pushed_mob) + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + to_chat(user, "Throwing [pushed_mob] onto the table might hurt them!") + return var/added_passtable = FALSE if(!pushed_mob.pass_flags & PASSTABLE) added_passtable = TRUE @@ -125,14 +128,25 @@ if(pushed_mob.loc != loc) //Something prevented the tabling return pushed_mob.Knockdown(40) - pushed_mob.visible_message("[user] pushes [pushed_mob] onto [src].", \ - "[user] pushes [pushed_mob] onto [src].") - log_combat(user, pushed_mob, "pushed") + pushed_mob.visible_message("[user] slams [pushed_mob] onto [src]!", \ + "[user] slams you onto [src]!") + log_combat(user, pushed_mob, "tabled", null, "onto [src]") if(!ishuman(pushed_mob)) return var/mob/living/carbon/human/H = pushed_mob SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table) +/* You don't shove people onto a table frame. +/obj/structure/table/shove_act(mob/living/target, mob/living/user) + if(!target.resting) + target.Knockdown(SHOVE_KNOCKDOWN_TABLE) + user.visible_message("[user.name] shoves [target.name] onto \the [src]!", + "You shove [target.name] onto \the [src]!", null, COMBAT_MESSAGE_RANGE) + target.forceMove(src.loc) + log_combat(user, target, "shoved", "onto [src] (table)") + return TRUE +*/ + /obj/structure/table/attackby(obj/item/I, mob/user, params) if(!(flags_1 & NODECONSTRUCT_1)) if(istype(I, /obj/item/screwdriver) && deconstruction_ready) @@ -258,6 +272,52 @@ for(var/obj/item/shard/S in debris) S.color = NARSIE_WINDOW_COLOUR +/* + * Plasmaglass tables + */ +/obj/structure/table/plasmaglass + name = "plasmaglass table" + desc = "A glasstable, but it's pink and more sturdy. What will Nanotrasen design next with plasma?" + icon = 'icons/obj/smooth_structures/plasmaglass_table.dmi' + icon_state = "plasmaglass_table" + climbable = TRUE + buildstack = /obj/item/stack/sheet/plasmaglass + canSmoothWith = null + max_integrity = 270 + resistance_flags = ACID_PROOF + armor = list("melee" = 10, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) + var/list/debris = list() + +/obj/structure/table/plasmaglass/New() + . = ..() + debris += new frame + +/obj/structure/table/plasmaglass/Destroy() + QDEL_LIST(debris) + . = ..() + +/obj/structure/table/plasmaglass/proc/check_break(mob/living/M) + return + +/obj/structure/table/plasmaglass/deconstruct(disassembled = TRUE, wrench_disassembly = 0) + if(!(flags_1 & NODECONSTRUCT_1)) + if(disassembled) + ..() + return + else + var/turf/T = get_turf(src) + playsound(T, "shatter", 50, 1) + for(var/X in debris) + var/atom/movable/AM = X + AM.forceMove(T) + debris -= AM + qdel(src) + +/obj/structure/table/plasmaglass/narsie_act() + color = NARSIE_WINDOW_COLOUR + for(var/obj/item/shard/S in debris) + S.color = NARSIE_WINDOW_COLOUR + /* * Wooden tables */ @@ -298,44 +358,83 @@ frame = /obj/structure/table_frame framestack = /obj/item/stack/rods buildstack = /obj/item/stack/tile/carpet - canSmoothWith = list(/obj/structure/table/wood/fancy, /obj/structure/table/wood/fancy/black, /obj/structure/table/wood/fancy/blackred, /obj/structure/table/wood/fancy/monochrome) + canSmoothWith = list(/obj/structure/table/wood/fancy, + /obj/structure/table/wood/fancy/black, + /obj/structure/table/wood/fancy/blackred, + /obj/structure/table/wood/fancy/monochrome, + /obj/structure/table/wood/fancy/blue, + /obj/structure/table/wood/fancy/cyan, + /obj/structure/table/wood/fancy/green, + /obj/structure/table/wood/fancy/orange, + /obj/structure/table/wood/fancy/purple, + /obj/structure/table/wood/fancy/red, + /obj/structure/table/wood/fancy/royalblack, + /obj/structure/table/wood/fancy/royalblue) + var/smooth_icon = 'icons/obj/smooth_structures/fancy_table.dmi' // see Initialize() -/obj/structure/table/wood/fancy/New() - // New() is used so that the /black subtype can override `icon` easily and - // the correct value will be used by the smoothing subsystem. +/obj/structure/table/wood/fancy/Initialize() . = ..() // Needs to be set dynamically because table smooth sprites are 32x34, // which the editor treats as a two-tile-tall object. The sprites are that // size so that the north/south corners look nice - examine the detail on // the sprites in the editor to see why. - icon = 'icons/obj/smooth_structures/fancy_table.dmi' + icon = smooth_icon /obj/structure/table/wood/fancy/black icon_state = "fancy_table_black" buildstack = /obj/item/stack/tile/carpet/black + smooth_icon = 'icons/obj/smooth_structures/fancy_table_black.dmi' /obj/structure/table/wood/fancy/blackred - icon = 'icons/obj/structures.dmi' - icon_state = "fancy_table_blackred" - buildstack = /obj/item/stack/tile/carpet/blackred - -/obj/structure/table/wood/fancy/blackred/New() - . = ..() - icon = 'icons/obj/smooth_structures/fancy_table_blackred.dmi' + icon_state = "fancy_table_blackred" + buildstack = /obj/item/stack/tile/carpet/blackred + smooth_icon = 'icons/obj/smooth_structures/fancy_table_blackred.dmi' /obj/structure/table/wood/fancy/monochrome - icon = 'icons/obj/structures.dmi' - icon_state = "fancy_table_monochrome" - buildstack = /obj/item/stack/tile/carpet/monochrome + icon_state = "fancy_table_monochrome" + buildstack = /obj/item/stack/tile/carpet/monochrome + smooth_icon = 'icons/obj/smooth_structures/fancy_table_monochrome.dmi' -/obj/structure/table/wood/fancy/monochrome/New() - . = ..() - icon = 'icons/obj/smooth_structures/fancy_table_monochrome.dmi' +/obj/structure/table/wood/fancy/blue + icon_state = "fancy_table_blue" + buildstack = /obj/item/stack/tile/carpet/blue + smooth_icon = 'icons/obj/smooth_structures/fancy_table_blue.dmi' + +/obj/structure/table/wood/fancy/cyan + icon_state = "fancy_table_cyan" + buildstack = /obj/item/stack/tile/carpet/cyan + smooth_icon = 'icons/obj/smooth_structures/fancy_table_cyan.dmi' + +/obj/structure/table/wood/fancy/green + icon_state = "fancy_table_green" + buildstack = /obj/item/stack/tile/carpet/green + smooth_icon = 'icons/obj/smooth_structures/fancy_table_green.dmi' + +/obj/structure/table/wood/fancy/orange + icon_state = "fancy_table_orange" + buildstack = /obj/item/stack/tile/carpet/orange + smooth_icon = 'icons/obj/smooth_structures/fancy_table_orange.dmi' + +/obj/structure/table/wood/fancy/purple + icon_state = "fancy_table_purple" + buildstack = /obj/item/stack/tile/carpet/purple + smooth_icon = 'icons/obj/smooth_structures/fancy_table_purple.dmi' + +/obj/structure/table/wood/fancy/red + icon_state = "fancy_table_red" + buildstack = /obj/item/stack/tile/carpet/red + smooth_icon = 'icons/obj/smooth_structures/fancy_table_red.dmi' + +/obj/structure/table/wood/fancy/royalblack + icon_state = "fancy_table_royalblack" + buildstack = /obj/item/stack/tile/carpet/royalblack + smooth_icon = 'icons/obj/smooth_structures/fancy_table_royalblack.dmi' + +/obj/structure/table/wood/fancy/royalblue + icon_state = "fancy_table_royalblue" + buildstack = /obj/item/stack/tile/carpet/royalblue + smooth_icon = 'icons/obj/smooth_structures/fancy_table_royalblue.dmi' -/obj/structure/table/wood/fancy/black/New() - . = ..() - // Ditto above. - icon = 'icons/obj/smooth_structures/fancy_table_black.dmi' /* * Reinforced tables */ diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 7b45aa1f..ed6e2790 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -209,6 +209,46 @@ icon_state = "tile-carpet-monochrome" canSmoothWith = list(/turf/open/floor/carpet/black, /turf/open/floor/carpet/blackred, /turf/open/floor/carpet/monochrome) +/turf/open/floor/carpet/blue + icon = 'icons/turf/floors/carpet_blue.dmi' + floor_tile = /obj/item/stack/tile/carpet/blue + canSmoothWith = list(/turf/open/floor/carpet/blue) + +/turf/open/floor/carpet/cyan + icon = 'icons/turf/floors/carpet_cyan.dmi' + floor_tile = /obj/item/stack/tile/carpet/cyan + canSmoothWith = list(/turf/open/floor/carpet/cyan) + +/turf/open/floor/carpet/green + icon = 'icons/turf/floors/carpet_green.dmi' + floor_tile = /obj/item/stack/tile/carpet/green + canSmoothWith = list(/turf/open/floor/carpet/green) + +/turf/open/floor/carpet/orange + icon = 'icons/turf/floors/carpet_orange.dmi' + floor_tile = /obj/item/stack/tile/carpet/orange + canSmoothWith = list(/turf/open/floor/carpet/orange) + +/turf/open/floor/carpet/purple + icon = 'icons/turf/floors/carpet_purple.dmi' + floor_tile = /obj/item/stack/tile/carpet/purple + canSmoothWith = list(/turf/open/floor/carpet/purple) + +/turf/open/floor/carpet/red + icon = 'icons/turf/floors/carpet_red.dmi' + floor_tile = /obj/item/stack/tile/carpet/red + canSmoothWith = list(/turf/open/floor/carpet/red) + +/turf/open/floor/carpet/royalblack + icon = 'icons/turf/floors/carpet_royalblack.dmi' + floor_tile = /obj/item/stack/tile/carpet/royalblack + canSmoothWith = list(/turf/open/floor/carpet/royalblack) + +/turf/open/floor/carpet/royalblue + icon = 'icons/turf/floors/carpet_royalblue.dmi' + floor_tile = /obj/item/stack/tile/carpet/royalblue + canSmoothWith = list(/turf/open/floor/carpet/royalblue) + /turf/open/floor/carpet/narsie_act(force, ignore_mobs, probability = 20) . = (prob(probability) || force) for(var/I in src) diff --git a/code/modules/antagonists/changeling/powers/chameleon_skin.dm b/code/modules/antagonists/changeling/powers/chameleon_skin.dm index b7545353..03f3aab4 100644 --- a/code/modules/antagonists/changeling/powers/chameleon_skin.dm +++ b/code/modules/antagonists/changeling/powers/chameleon_skin.dm @@ -13,17 +13,14 @@ var/mob/living/carbon/human/H = user //SHOULD always be human, because req_human = 1 if(!istype(H)) // req_human could be done in can_sting stuff. return - var/datum/mutation/human/HM = GLOB.mutations_list[CHAMELEON] - if(HM in H.dna.mutations) - HM.force_lose(H) + if(H.dna.get_mutation(CHAMELEON)) + H.dna.remove_mutation(CHAMELEON) else - HM.force_give(H) + H.dna.add_mutation(CHAMELEON) return TRUE /obj/effect/proc_holder/changeling/chameleon_skin/on_refund(mob/user) action.Remove(user) if(user.has_dna()) var/mob/living/carbon/C = user - var/datum/mutation/human/HM = GLOB.mutations_list[CHAMELEON] - if(HM in C.dna.mutations) - HM.force_lose(C) \ No newline at end of file + C.dna.remove_mutation(CHAMELEON) \ No newline at end of file diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index 87794993..8da0546b 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -69,7 +69,7 @@ /mob/living/simple_animal/revenant/Initialize(mapload) . = ..() AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null)) - AddSpell(new /obj/effect/proc_holder/spell/targeted/revenant_transmit(null)) + AddSpell(new /obj/effect/proc_holder/spell/targeted/telepathy/revenant(null)) AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/defile(null)) AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/overload(null)) AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/blight(null)) diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index 112a31f4..0cbe3102 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -104,35 +104,14 @@ action_background_icon_state = "bg_revenant" //Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob -/obj/effect/proc_holder/spell/targeted/revenant_transmit - name = "Transmit" - desc = "Telepathically transmits a message to the target." +/obj/effect/proc_holder/spell/targeted/telepathy/revenant + name = "Revenant Transmit" panel = "Revenant Abilities" - charge_max = 0 - clothes_req = 0 - range = 7 - include_user = 0 action_icon = 'icons/mob/actions/actions_revenant.dmi' action_icon_state = "r_transmit" action_background_icon_state = "bg_revenant" - -/obj/effect/proc_holder/spell/targeted/revenant_transmit/cast(list/targets, mob/living/simple_animal/revenant/user = usr) - for(var/mob/living/M in targets) - var/msg = stripped_input(usr, "What do you wish to tell [M]?", null, "") - if(!msg) - charge_counter = charge_max - return - log_directed_talk(user, M, msg, LOG_SAY, "revenant whisper") - to_chat(user, "You transmit to [M]: [msg]") - if(!M.anti_magic_check(FALSE, TRUE)) //hear no evil - to_chat(M, "You hear something behind you talking... [msg]") - for(var/ded in GLOB.dead_mob_list) - if(!isobserver(ded)) - continue - var/follow_rev = FOLLOW_LINK(ded, user) - var/follow_whispee = FOLLOW_LINK(ded, M) - to_chat(ded, "[follow_rev] [user] Revenant Transmit: \"[msg]\" to [follow_whispee] [M]") - + notice = "revennotice" + boldnotice = "revenboldnotice" /obj/effect/proc_holder/spell/aoe_turf/revenant diff --git a/code/modules/antagonists/wishgranter/wishgranter.dm b/code/modules/antagonists/wishgranter/wishgranter.dm index 318de51e..196ce955 100644 --- a/code/modules/antagonists/wishgranter/wishgranter.dm +++ b/code/modules/antagonists/wishgranter/wishgranter.dm @@ -26,5 +26,5 @@ return H.dna.add_mutation(HULK) H.dna.add_mutation(XRAY) - H.dna.add_mutation(COLDRES) + H.dna.add_mutation(SPACEMUT) H.dna.add_mutation(TK) \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index ac1a4077..505b9a1e 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -94,7 +94,7 @@ to_chat(user, "Your wish is granted, but at a terrible cost...") to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart.") user.dna.add_mutation(LASEREYES) - user.dna.add_mutation(COLDRES) + user.dna.add_mutation(SPACEMUT) user.dna.add_mutation(XRAY) user.set_species(/datum/species/shadow) if("Wealth") diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 1087f1eb..fa28da74 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1762,15 +1762,31 @@ /obj/item/stack/tile/carpet/black/fifty) crate_name = "premium carpet crate" -/datum/supply_pack/service/carpet2 - name = "Premium Carpet Crate #2" - desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains red, and monochrome" - cost = 1000 - contains = list(/obj/item/stack/tile/carpet/blackred/fifty, +/datum/supply_pack/service/carpet_exotic + name = "Exotic Carpet Crate" + desc = "Exotic carpets straight from Space Russia, for all your decorating needs. Contains 100 tiles each of 10 different flooring patterns." + cost = 4000 + contains = list(/obj/item/stack/tile/carpet/blue/fifty, + /obj/item/stack/tile/carpet/blue/fifty, + /obj/item/stack/tile/carpet/cyan/fifty, + /obj/item/stack/tile/carpet/cyan/fifty, + /obj/item/stack/tile/carpet/green/fifty, + /obj/item/stack/tile/carpet/green/fifty, + /obj/item/stack/tile/carpet/orange/fifty, + /obj/item/stack/tile/carpet/orange/fifty, + /obj/item/stack/tile/carpet/purple/fifty, + /obj/item/stack/tile/carpet/purple/fifty, + /obj/item/stack/tile/carpet/red/fifty, + /obj/item/stack/tile/carpet/red/fifty, + /obj/item/stack/tile/carpet/royalblue/fifty, + /obj/item/stack/tile/carpet/royalblue/fifty, + /obj/item/stack/tile/carpet/royalblack/fifty, + /obj/item/stack/tile/carpet/royalblack/fifty, + /obj/item/stack/tile/carpet/blackred/fifty, /obj/item/stack/tile/carpet/blackred/fifty, /obj/item/stack/tile/carpet/monochrome/fifty, /obj/item/stack/tile/carpet/monochrome/fifty) - crate_name = "premium carpet crate #2" + crate_name = "exotic carpet crate" /datum/supply_pack/service/lightbulbs name = "Replacement Lights" diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 0ff87c03..0b83304f 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -677,3 +677,11 @@ GLOBAL_LIST_EMPTY(asset_datums) Insert(initial(D.id), I) return ..() + + +/datum/asset/simple/genetics + assets = list( + "dna_discovered.gif" = 'html/dna_discovered.gif', + "dna_undiscovered.gif" = 'html/dna_undiscovered.gif', + "dna_extra.gif" = 'html/dna_extra.gif' +) \ No newline at end of file diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 4106862c..4e7ec45b 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -75,3 +75,9 @@ var/datum/player_details/player_details //these persist between logins/logouts during the same round. var/list/char_render_holders //Should only be a key-value list of north/south/east/west = obj/screen. + + + var/client_keysend_amount = 0 + var/next_keysend_reset = 0 + var/next_keysend_trip_reset = 0 + var/keysend_tripped = FALSE \ No newline at end of file diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index ab732ab4..83c2910a 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -88,8 +88,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) //H13 var/body_size = 100 //Body Size in percent - var/body_size_alt = 0 - + var/can_get_preg = 0 //Body Size in percent var/datum/species/pref_species = new /datum/species/human() //Mutant race var/list/features = list("mcolor" = "FFF", @@ -867,7 +866,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Ghosts of Others: [button_name]
" dat += "
" - dat += "FPS: [clientfps]
" + //dat += "FPS: [clientfps]
" dat += "Parallax (Fancy Space): " switch (parallax) if (PARALLAX_LOW) @@ -2119,8 +2118,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["has_vag"] = !features["has_vag"] if(features["has_vag"] == FALSE) features["has_womb"] = FALSE + features["can_get_preg"] = FALSE if("has_womb") features["has_womb"] = !features["has_womb"] + if("can_get_preg") + features["can_get_preg"] = !features["can_get_preg"] if("exhibitionist") features["exhibitionist"] = !features["exhibitionist"] if("widescreenpref") @@ -2331,6 +2333,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) //h13 character custom body size, make sure to set to 100% if the player hasn't choosen one yet. character.custom_body_size = body_size + character.breedable = 0 character.gender = gender character.age = age diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index ba2faac9..72ae039c 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -120,7 +120,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["cit_toggles"] >> cit_toggles S["lewdchem"] >> lewdchem - //try to fix any outdated data if necessary + //try to fix any outdated data if necessfary if(needs_update >= 0) update_preferences(needs_update, S) //needs_update = savefile_version if we need an update (positive integer) @@ -137,6 +137,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car toggles = sanitize_integer(toggles, 0, 65535, initial(toggles)) clientfps = sanitize_integer(clientfps, 0, 1000, 0) body_size = sanitize_integer(body_size, 90, 110, 0) + can_get_preg = sanitize_integer(body_size, 0, 1, 0) parallax = sanitize_integer(parallax, PARALLAX_INSANE, PARALLAX_DISABLE, null) ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion)) auto_fit_viewport = sanitize_integer(auto_fit_viewport, 0, 1, initial(auto_fit_viewport)) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 96b5c8e2..4800b61f 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -57,7 +57,7 @@ var/datum/disease/dnaspread/DS = D DS.strain_data["name"] = H.real_name DS.strain_data["UI"] = H.dna.uni_identity - DS.strain_data["SE"] = H.dna.struc_enzymes + DS.strain_data["SE"] = H.dna.mutation_index else D = new virus_type() else diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index 4ffc10f9..c7719dcb 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -111,6 +111,11 @@ if(A) load_program(A) if("safety") + if(!issilicon(usr) && !IsAdminGhost(usr)) + var/msg = "[key_name(usr)] attempted to emag the holodeck using a href they shouldn't have!" + message_admins(msg) + log_admin(msg) + return obj_flags ^= EMAGGED if((obj_flags & EMAGGED) && program && emag_programs[program.name]) emergency_shutdown() diff --git a/code/modules/jobs/job_types/medical.dm b/code/modules/jobs/job_types/medical.dm index 9373b5ad..d57615d2 100644 --- a/code/modules/jobs/job_types/medical.dm +++ b/code/modules/jobs/job_types/medical.dm @@ -164,6 +164,7 @@ Geneticist shoes = /obj/item/clothing/shoes/sneakers/white suit = /obj/item/clothing/suit/toggle/labcoat/genetics suit_store = /obj/item/flashlight/pen + l_pocket = /obj/item/sequence_scanner backpack = /obj/item/storage/backpack/genetics satchel = /obj/item/storage/backpack/satchel/gen diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm index 548a734f..0b1e526d 100644 --- a/code/modules/keybindings/bindings_client.dm +++ b/code/modules/keybindings/bindings_client.dm @@ -3,8 +3,42 @@ /client/verb/keyDown(_key as text) set instant = TRUE set hidden = TRUE + client_keysend_amount += 1 + var/cache = client_keysend_amount + + if(keysend_tripped && next_keysend_trip_reset <= world.time) + keysend_tripped = FALSE + + if(next_keysend_reset <= world.time) + client_keysend_amount = 0 + next_keysend_reset = world.time + (1 SECONDS) + + //The "tripped" system is to confirm that flooding is still happening after one spike + //not entirely sure how byond commands interact in relation to lag + //don't want to kick people if a lag spike results in a huge flood of commands being sent + if(cache >= MAX_KEYPRESS_AUTOKICK) + if(!keysend_tripped) + keysend_tripped = TRUE + next_keysend_trip_reset = world.time + (2 SECONDS) + else + log_admin("Client [ckey] was just autokicked for flooding keysends; likely abuse but potentially lagspike.") + message_admins("Client [ckey] was just autokicked for flooding keysends; likely abuse but potentially lagspike.") + QDEL_IN(src, 1) + return + + ///Check if the key is short enough to even be a real key + if(LAZYLEN(_key) > MAX_KEYPRESS_COMMANDLENGTH) + to_chat(src, "Invalid KeyDown detected! You have been disconnected from the server automatically.") + log_admin("Client [ckey] just attempted to send an invalid keypress. Keymessage was over [MAX_KEYPRESS_COMMANDLENGTH] characters, autokicking due to likely abuse.") + message_admins("Client [ckey] just attempted to send an invalid keypress. Keymessage was over [MAX_KEYPRESS_COMMANDLENGTH] characters, autokicking due to likely abuse.") + QDEL_IN(src, 1) + return + //offset by 1 because the buffer address is 0 indexed because the math was simpler + keys_held[current_key_address + 1] = _key + //the time a key was pressed isn't actually used anywhere (as of 2019-9-10) but this allows easier access usage/checking keys_held[_key] = world.time + current_key_address = ((current_key_address + 1) % HELD_KEY_BUFFER_LENGTH) var/movement = SSinput.movement_keys[_key] if(!(next_move_dir_sub & movement) && !keys_held["Ctrl"]) next_move_dir_add |= movement @@ -35,7 +69,11 @@ set instant = TRUE set hidden = TRUE - keys_held -= _key + //Can't just do a remove because it would alter the length of the rolling buffer, instead search for the key then null it out if it exists + for(var/i in 1 to HELD_KEY_BUFFER_LENGTH) + if(keys_held[i] == _key) + keys_held[i] = null + break var/movement = SSinput.movement_keys[_key] if(!(next_move_dir_add & movement)) next_move_dir_sub |= movement diff --git a/code/modules/keybindings/setup.dm b/code/modules/keybindings/setup.dm index 54df252f..a83e7241 100644 --- a/code/modules/keybindings/setup.dm +++ b/code/modules/keybindings/setup.dm @@ -1,9 +1,14 @@ /client - var/list/keys_held = list() // A list of any keys held currently - // These next two vars are to apply movement for keypresses and releases made while move delayed. - // Because discarding that input makes the game less responsive. - var/next_move_dir_add // On next move, add this dir to the move that would otherwise be done - var/next_move_dir_sub // On next move, subtract this dir from the move that would otherwise be done + /// A rolling buffer of any keys held currently + var/list/keys_held = list() + ///used to keep track of the current rolling buffer position + var/current_key_address = 0 + /// These next two vars are to apply movement for keypresses and releases made while move delayed. + /// Because discarding that input makes the game less responsive. + /// On next move, add this dir to the move that would otherwise be done + var/next_move_dir_add + /// On next move, subtract this dir from the move that would otherwise be done + var/next_move_dir_sub // Set a client's focus to an object and override these procs on that object to let it handle keypresses @@ -31,6 +36,12 @@ /client/proc/set_macros() set waitfor = FALSE + + //Reset and populate the rolling buffer + keys_held.Cut() + for(var/i in 1 to HELD_KEY_BUFFER_LENGTH) + keys_held += null + erase_all_macros() var/list/macro_sets = SSinput.macro_sets diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index f12b6b7e..a25ce336 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -453,7 +453,7 @@ /obj/item/immortality_talisman/Initialize() . = ..() - AddComponent(/datum/component/anti_magic, TRUE, TRUE) + AddComponent(/datum/component/anti_magic, TRUE, TRUE, TRUE) /datum/action/item_action/immortality name = "Immortality" @@ -462,30 +462,45 @@ if(cooldown < world.time) SSblackbox.record_feedback("amount", "immortality_talisman_uses", 1) cooldown = world.time + 600 - user.visible_message("[user] vanishes from reality, leaving a hole in [user.p_their()] place!") - var/obj/effect/immortality_talisman/Z = new(get_turf(src.loc)) - Z.name = "hole in reality" - Z.desc = "It's shaped an awful lot like [user.name]." - Z.setDir(user.dir) - user.forceMove(Z) - user.notransform = 1 - user.status_flags |= GODMODE - addtimer(CALLBACK(src, .proc/return_to_reality, user, Z), 100) + new /obj/effect/immortality_talisman(get_turf(user), user) else to_chat(user, "[src] is not ready yet!") -/obj/item/immortality_talisman/proc/return_to_reality(mob/user, obj/effect/immortality_talisman/Z) - user.status_flags &= ~GODMODE - user.notransform = 0 - user.forceMove(get_turf(Z)) - user.visible_message("[user] pops back into reality!") - Z.can_destroy = TRUE - qdel(Z) - /obj/effect/immortality_talisman + name = "hole in reality" + desc = "It's shaped an awful lot like a person." icon_state = "blank" icon = 'icons/effects/effects.dmi' - var/can_destroy = FALSE + var/vanish_description = "vanishes from reality" + var/can_destroy = TRUE + +/obj/effect/immortality_talisman/Initialize(mapload, mob/new_user) + . = ..() + if(new_user) + vanish(new_user) + +/obj/effect/immortality_talisman/proc/vanish(mob/user) + user.visible_message("[user] [vanish_description], leaving a hole in [user.p_their()] place!") + + desc = "It's shaped an awful lot like [user.name]." + setDir(user.dir) + + user.forceMove(src) + user.notransform = TRUE + user.status_flags |= GODMODE + + can_destroy = FALSE + + addtimer(CALLBACK(src, .proc/unvanish, user), 10 SECONDS) + +/obj/effect/immortality_talisman/proc/unvanish(mob/user) + user.status_flags &= ~GODMODE + user.notransform = FALSE + user.forceMove(get_turf(src)) + + user.visible_message("[user] pops back into reality!") + can_destroy = TRUE + qdel(src) /obj/effect/immortality_talisman/attackby() return @@ -502,6 +517,10 @@ else . = ..() +/obj/effect/immortality_talisman/void + vanish_description = "is dragged into the void" + + //Shared Bag diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 4be2dd1c..47fd657c 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -141,6 +141,13 @@ ViewManifest() if(href_list["SelectedJob"]) + if(!SSticker || !SSticker.IsRoundInProgress()) + var/msg = "[key_name(usr)] attempted to join the round using a href that shouldn't be available at this moment!" + log_admin(msg) + message_admins(msg) + to_chat(usr, "The round is either not ready, or has already finished...") + return + if(!GLOB.enter_allowed) to_chat(usr, "There is an administrative lock on entering the game!") @@ -576,9 +583,10 @@ //h13 assign your characters custom height. if (H.custom_body_size > 0) H.resize = (H.custom_body_size * 0.01) - //Move large characters up slightly. small character dont really need this. - H.pixel_y = min(((H.custom_body_size-100) * 0.25), 0) + //h13 give your starting impregchance (30%) + if (H.breedable == TRUE) + H.impregchance = 30 . = H new_character = . diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index a118dc78..89a7ec25 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -603,6 +603,14 @@ sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) see_in_dark = max(see_in_dark, 8) + if(HAS_TRAIT(src, TRAIT_THERMAL_VISION)) + sight |= (SEE_MOBS) + lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) + + if(HAS_TRAIT(src, TRAIT_XRAY_VISION)) + sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) + see_in_dark = max(see_in_dark, 8) + if(see_override) see_invisible = see_override . = ..() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 2c757c6e..1dbf6b69 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -317,6 +317,40 @@ else return + + else if(check_zone(M.zone_selected) == "mouth") + var/mob/living/carbon/human/H = src + var/datum/species/pref_species = H.dna.species + + M.visible_message("[M] gives [H] a boop on the nose.", \ + "You give [H] a boop on the nose!") + + if(H.dna.species.can_wag_tail(H)) + if("tail_human" in pref_species.default_features) + if(H.dna.features["tail_human"] == "None") + return + else + if(!H.dna.species.is_wagging_tail()) + H.emote("wag") + + if("tail_lizard" in pref_species.default_features) + if(H.dna.features["tail_lizard"] == "None") + return + else + if(!H.dna.species.is_wagging_tail()) + H.emote("wag") + + if("mam_tail" in pref_species.default_features) + if(H.dna.features["mam_tail"] == "None") + return + else + if(!H.dna.species.is_wagging_tail()) + H.emote("wag") + + else + return + + else M.visible_message("[M] hugs [src] to make [p_them()] feel better!", \ "You hug [src] to make [p_them()] feel better!") diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index b7d013c8..1bfff1a9 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -163,6 +163,8 @@ missing -= BP.body_zone for(var/obj/item/I in BP.embedded_objects) msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!\n" + if(BP.broken) + msg += "[t_He] [t_has] \a [I] broken [BP.name]!\n" for(var/X in disabled) var/obj/item/bodypart/BP = X diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 2a9a60f3..82a241ef 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -673,6 +673,7 @@ var/status = "" var/brutedamage = LB.brute_dam var/burndamage = LB.burn_dam + var/broken = LB.broken if(hallucination) if(prob(30)) brutedamage += rand(30,40) @@ -700,7 +701,8 @@ status += LB.medium_burn_msg else if(burndamage > 0) status += LB.light_burn_msg - + if(broken == 1) + status = "broken" if(status == "") status = "OK" var/no_damage @@ -711,6 +713,7 @@ for(var/obj/item/I in LB.embedded_objects) to_send += "\t There is \a [I] embedded in your [LB.name]!\n" + for(var/t in missing) for(var/t in missing) to_send += "Your [parse_zone(t)] is missing!\n" diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 911c1111..a4a2aba2 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -25,11 +25,11 @@ var/age = 30 //Player's age var/underwear = "Nude" //Which underwear the player wants - var/undie_color = "#FFFFFF" + var/undie_color = "FFFFFF" var/undershirt = "Nude" //Which undershirt the player wants - var/shirt_color = "#FFFFFF" + var/shirt_color = "FFFFFF" var/socks = "Nude" //Which socks the player wants - var/socks_color = "#FFFFFF" + var/socks_color = "FFFFFF" var/backbag = DBACKPACK //Which backpack type the player has chosen. var/jumpsuit_style = PREF_SUIT //suit/skirt diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 33b419de..b79979e2 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -44,6 +44,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/siemens_coeff = 1 //base electrocution coefficient var/damage_overlay_type = "human" //what kind of damage overlays (if any) appear on our species when wounded? var/fixed_mut_color = "" //to use MUTCOLOR with a fixed color that's independent of dna.feature["mcolor"] + var/inert_mutation = DWARFISM //special mutation that can be found in the genepool. Dont leave empty or changing species will be a headache var/list/special_step_sounds //Sounds to override barefeet walkng var/grab_sound //Special sound for grabbing @@ -317,6 +318,14 @@ GLOBAL_LIST_EMPTY(roundstart_races) for(var/X in inherent_traits) REMOVE_TRAIT(C, X, SPECIES_TRAIT) + //If their inert mutation is not the same, swap it out + if((inert_mutation != new_species.inert_mutation) && LAZYLEN(C.dna.mutation_index) && (inert_mutation in C.dna.mutation_index)) + C.dna.remove_mutation(inert_mutation) + //keep it at the right spot, so we can't have people taking shortcuts + var/location = C.dna.mutation_index.Find(inert_mutation) + C.dna.mutation_index[location] = new_species.inert_mutation + C.dna.mutation_index[new_species.inert_mutation] = create_sequence(new_species.inert_mutation) + SEND_SIGNAL(C, COMSIG_SPECIES_LOSS, src) /datum/species/proc/handle_hair(mob/living/carbon/human/H, forced_colour) @@ -529,7 +538,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/digilegs = (DIGITIGRADE in species_traits) ? "_d" : "" var/mutable_appearance/MA = mutable_appearance(S.icon, "[S.icon_state][digilegs]", -BODY_LAYER) if(UNDIE_COLORABLE(S)) - MA.color = "[H.socks_color]" + MA.color = "#[H.socks_color]" standing += MA if(standing.len) @@ -1270,7 +1279,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(radiation > RAD_MOB_MUTATE) if(prob(1)) to_chat(H, "You mutate!") - H.randmutb() + H.easy_randmut(NEGATIVE+MINOR_NEGATIVE) H.emote("gasp") H.domutcheck() diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 9b2e2ad5..8d448592 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -20,6 +20,7 @@ exotic_bloodtype = "L" disliked_food = GRAIN | DAIRY liked_food = GROSS | MEAT + inert_mutation = FIREBREATH /datum/species/lizard/after_equip_job(datum/job/J, mob/living/carbon/human/H) H.grant_language(/datum/language/draconic) diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 0da4073f..fbe18a6c 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -60,9 +60,9 @@ H.Knockdown(100) H.visible_message("[H] writhes in pain as [H.p_their()] vacuoles boil.", "You writhe in pain as your vacuoles boil!", "You hear the crunching of leaves.") if(prob(80)) - H.randmutb() + H.easy_randmut(NEGATIVE+MINOR_NEGATIVE) else - H.randmutg() + H.easy_randmut(POSITIVE) H.domutcheck() else H.adjustFireLoss(rand(5,15)) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index de542754..1c2234bb 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -419,7 +419,6 @@ /mob/living/carbon/handle_mutations_and_radiation() if(dna && dna.temporary_mutations.len) - var/datum/mutation/human/HM for(var/mut in dna.temporary_mutations) if(dna.temporary_mutations[mut] < world.time) if(mut == UI_CHANGED) @@ -442,9 +441,9 @@ dna.previous.Remove("blood_type") dna.temporary_mutations.Remove(mut) continue - HM = GLOB.mutations_list[mut] - HM.force_lose(src) - dna.temporary_mutations.Remove(mut) + for(var/datum/mutation/human/HM in dna.mutations) + if(HM && HM.timed) + dna.remove_mutation(HM.type) radiation -= min(radiation, RAD_LOSS_PER_TICK) if(radiation > RAD_MOB_SAFE) diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index e0386bcd..be7d90c1 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -38,7 +38,7 @@ if(radiation > RAD_MOB_MUTATE) if(prob(1)) to_chat(src, "You mutate!") - randmutb() + easy_randmut(NEGATIVE+MINOR_NEGATIVE) emote("gasp") domutcheck() diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index c89c2cc9..b6e2c16a 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -53,8 +53,10 @@ var/mob_size = MOB_SIZE_HUMAN -//H13 custom body size +//H13 custom body size and impregnation var/custom_body_size = 1 + var/breedable = 0 + var/impregchance = 0 var/list/mob_biotypes = list(MOB_ORGANIC) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 1ccdf1a1..68995702 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -809,9 +809,16 @@ Pass a positive integer as an argument to override a bot's default speed. if("patrol") auto_patrol = !auto_patrol bot_reset() + if(!issilicon(usr) && !IsAdminGhost(usr) && !(bot_core.allowed(usr) || !locked)) + return TRUE if("remote") remote_disabled = !remote_disabled if("hack") + if(!issilicon(usr) && !IsAdminGhost(usr)) + var/msg = "[key_name(usr)] attempted to hack a bot with a href that shouldn't be available!" + message_admins(msg) + log_admin(msg) + return TRUE if(emagged != 2) emagged = 2 hacked = TRUE diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 2f4e1eea..4af79c1f 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -132,6 +132,9 @@ Auto Patrol: []"}, if(..()) return 1 + if(!issilicon(usr) && !IsAdminGhost(usr) && !(bot_core.allowed(usr) || !locked)) + return TRUE + switch(href_list["operation"]) if("idcheck") idcheck = !idcheck diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm index 2e783d84..0846b695 100644 --- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm +++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm @@ -78,7 +78,7 @@ var/do_ranged = 0 for(var/equip in mecha.equipment) var/obj/item/mecha_parts/mecha_equipment/ME = equip - if(ME.range & RANGED) + if(ME.range & MECHA_RANGED) do_ranged = 1 break if(do_ranged) @@ -144,7 +144,7 @@ ME.rearm() -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/get_mecha_equip_by_flag(flag = RANGED) +/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/get_mecha_equip_by_flag(flag = MECHA_RANGED) . = list() if(mecha) for(var/equip in mecha.equipment) @@ -160,7 +160,7 @@ if(mecha) mecha_reload() mecha_face_target(A) - var/list/possible_weapons = get_mecha_equip_by_flag(RANGED) + var/list/possible_weapons = get_mecha_equip_by_flag(MECHA_RANGED) if(possible_weapons.len) var/obj/item/mecha_parts/mecha_equipment/ME = pick(possible_weapons) //so we don't favor mecha.equipment[1] forever if(ME.action(A)) @@ -173,7 +173,7 @@ /mob/living/simple_animal/hostile/syndicate/mecha_pilot/AttackingTarget() if(mecha) - var/list/possible_weapons = get_mecha_equip_by_flag(MELEE) + var/list/possible_weapons = get_mecha_equip_by_flag(MECHA_MELEE) if(possible_weapons.len) var/obj/item/mecha_parts/mecha_equipment/ME = pick(possible_weapons) mecha_face_target(target) diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index 07985215..29b46893 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -69,7 +69,7 @@ if(Target.Adjacent(src)) Target.attack_slime(src) - return + break if(!Target.lying && prob(80)) if(Target.client && Target.health >= 20) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index e6f79198..65947711 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -50,9 +50,8 @@ O.updateappearance(icon_update=0) if(tr_flags & TR_KEEPSE) - O.dna.struc_enzymes = dna.struc_enzymes - var/datum/mutation/human/race/R = GLOB.mutations_list[RACEMUT] - O.dna.struc_enzymes = R.set_se(O.dna.struc_enzymes, on=1)//we don't want to keep the race block inactive + O.dna.mutation_index = dna.mutation_index + O.dna.set_se(1, GET_INITIALIZED_MUTATION(RACEMUT)) if(suiciding) O.suiciding = suiciding @@ -210,9 +209,8 @@ O.name = O.real_name if(tr_flags & TR_KEEPSE) - O.dna.struc_enzymes = dna.struc_enzymes - var/datum/mutation/human/race/R = GLOB.mutations_list[RACEMUT] - O.dna.struc_enzymes = R.set_se(O.dna.struc_enzymes, on=0)//we don't want to keep the race block active + O.dna.mutation_index = dna.mutation_index + O.dna.set_se(0, GET_INITIALIZED_MUTATION(RACEMUT)) O.domutcheck() if(suiciding) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 0ad83652..d6bf0c13 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -913,7 +913,7 @@ /datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/M) M.jitteriness = 0 if(M.has_dna()) - M.dna.remove_all_mutations() + M.dna.remove_all_mutations(mutadone = TRUE) if(!QDELETED(M)) //We were a monkey, now a human ..() @@ -1103,10 +1103,10 @@ ..() /datum/reagent/medicine/tricordrazine/overdose_process(mob/living/M) - M.adjustToxLoss(2*REM, 0) - M.adjustOxyLoss(2*REM, 0) - M.adjustBruteLoss(2*REM, 0) - M.adjustFireLoss(2*REM, 0) + M.adjustToxLoss(0.5*REM, 0) + M.adjustOxyLoss(0.5*REM, 0) + M.adjustBruteLoss(0.5*REM, 0) + M.adjustFireLoss(0.5*REM, 0) ..() . = 1 diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index fe309b42..b97e0e62 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1537,20 +1537,6 @@ taste_description = "metal" pH = 4.5 -/datum/reagent/carpet - name = "Carpet" - id = "carpet" - description = "For those that need a more creative way to roll out a red carpet." - reagent_state = LIQUID - color = "#b51d05" - taste_description = "carpet" // Your tounge feels furry. - -/datum/reagent/carpet/reaction_turf(turf/T, reac_volume) - if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) - var/turf/open/floor/F = T - F.PlaceOnTop(/turf/open/floor/carpet) - ..() - /datum/reagent/bromine name = "Bromine" id = "bromine" @@ -1704,6 +1690,142 @@ qdel(O) new /obj/item/clothing/shoes/galoshes/dry(t_loc) +// Liquid Carpets +/datum/reagent/carpet + name = "Liquid Carpet" + id = "carpet" + description = "For those that need a more creative way to roll out a carpet." + reagent_state = LIQUID + color = "#b51d05" + taste_description = "carpet" // Your tounge feels furry. + +/datum/reagent/carpet/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet) + ..() + +/datum/reagent/carpet/black + name = "Liquid Black Carpet" + id = "blackcarpet" + color = "#363636" + +/datum/reagent/carpet/black/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/black) + ..() + +/datum/reagent/carpet/blackred + name = "Liquid Red Black Carpet" + id = "blackredcarpet" + color = "#342125" + +/datum/reagent/carpet/blackred/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/blackred) + ..() + +/datum/reagent/carpet/monochrome + name = "Liquid Monochrome Carpet" + id = "monochromecarpet" + color = "#b4b4b4" + +/datum/reagent/carpet/monochrome/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/monochrome) + ..() + +/datum/reagent/carpet/blue + name = "Liquid Blue Carpet" + id = "bluecarpet" + color = "#1256ff" + +/datum/reagent/carpet/blue/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/blue) + ..() + +/datum/reagent/carpet/cyan + name = "Liquid Cyan Carpet" + id = "cyancarpet" + color = "#3acfb9" + +/datum/reagent/carpet/cyan/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/cyan) + ..() + +/datum/reagent/carpet/green + name = "Liquid Green Carpet" + id = "greencarpet" + color = "#619b62" + +/datum/reagent/carpet/green/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/green) + ..() + +/datum/reagent/carpet/orange + name = "Liquid Orange Carpet" + id = "orangecarpet" + color = "#cc7900" + +/datum/reagent/carpet/orange/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/orange) + ..() + +/datum/reagent/carpet/purple + name = "Liquid Purple Carpet" + id = "purplecarpet" + color = "#6d3392" + +/datum/reagent/carpet/purple/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/purple) + ..() + +/datum/reagent/carpet/red + name = "Liquid Red Carpet" + id = "redcarpet" + color = "#871515" + +/datum/reagent/carpet/red/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/red) + ..() + +/datum/reagent/carpet/royalblack + name = "Liquid Royal Black Carpet" + id = "royalblackcarpet" + color = "#483d05" + +/datum/reagent/carpet/royalblack/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/royalblack) + ..() + +/datum/reagent/carpet/royalblue + name = "Liquid Royal Blue Carpet" + id = "royalbluecarpet" + color = "#24227e" + +/datum/reagent/carpet/royalblue/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/royalblue) + ..() + // Virology virus food chems. /datum/reagent/toxin/mutagen/mutagenvirusfood diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 2b50ecc0..c38bbfed 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -43,9 +43,9 @@ if((method==VAPOR && prob(min(33, reac_volume))) || method==INGEST || method==PATCH || method==INJECT) M.randmuti() if(prob(98)) - M.randmutb() + M.easy_randmut(NEGATIVE+MINOR_NEGATIVE) else - M.randmutg() + M.easy_randmut(POSITIVE) M.updateappearance() M.domutcheck() ..() diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index e34f3467..a1e17e51 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -488,12 +488,6 @@ results = list("acetone" = 3) required_reagents = list("oil" = 1, "welding_fuel" = 1, "oxygen" = 1) -/datum/chemical_reaction/carpet - name = "carpet" - id = "carpet" - results = list("carpet" = 2) - required_reagents = list("space_drugs" = 1, "blood" = 1) - /datum/chemical_reaction/oil name = "Oil" id = "oil" @@ -635,3 +629,77 @@ results = list("shadowmutationtoxin" = 1) required_reagents = list("liquid_dark_matter" = 5, "synaptizine" = 10, "oculine" = 10, "stablemutationtoxin" = 1) required_temp = 600 + +// Liquid Carpets + +/datum/chemical_reaction/carpet + name = "carpet" + id = "carpet" + results = list("carpet" = 2) + required_reagents = list("space_drugs" = 1, "blood" = 1) + +/datum/chemical_reaction/carpet/black + name = "liquid black carpet" + id = "blackcarpet" + results = list("blackcarpet" = 2) + required_reagents = list("carpet" = 1, "carbon" = 1) + +/datum/chemical_reaction/carpet/blackred + name = "liquid red black carpet" + id = "blackredcarpet" + results = list("blackredcarpet" = 2) + required_reagents = list("carpet" = 1, "charcoal" = 1) + +/datum/chemical_reaction/carpet/monochrome + name = "liquid monochrome carpet" + id = "monochromecarpet" + results = list("monochromecarpet" = 2) + required_reagents = list("carpet" = 1, "oil" = 1) + +/datum/chemical_reaction/carpet/blue + name = "liquid blue carpet" + id = "bluecarpet" + results = list("bluecarpet" = 2) + required_reagents = list("carpet" = 1, "tonic" = 1) + +/datum/chemical_reaction/carpet/cyan + name = "liquid cyan carpet" + id = "cyancarpet" + results = list("cyancarpet" = 2) + required_reagents = list("carpet" = 1, "ice" = 1) + +/datum/chemical_reaction/carpet/green + name = "liquid green carpet" + id = "greencarpet" + results = list("greencarpet" = 2) + required_reagents = list("carpet" = 1, "sacid" = 1) + +/datum/chemical_reaction/carpet/orange + name = "liquid orange carpet" + id = "orangecarpet" + results = list("orangecarpet" = 2) + required_reagents = list("carpet" = 1, "orangejuice" = 1) + +/datum/chemical_reaction/carpet/purple + name = "liquid purple carpet" + id = "purplecarpet" + results = list("purplecarpet" = 2) + required_reagents = list("carpet" = 1, "stable_plasma" = 1) + +/datum/chemical_reaction/carpet/red + name = "liquid red carpet" + id = "redcarpet" + results = list("redcarpet" = 2) + required_reagents = list("carpet" = 1, "welding_fuel" = 1) + +/datum/chemical_reaction/carpet/royalblack + name = "liquid royal black carpet" + id = "royalblackcarpet" + results = list("royalblackcarpet" = 2) + required_reagents = list("carpet" = 1, "blackpepper" = 1) + +/datum/chemical_reaction/carpet/royalblue + name = "liquid royal blue carpet" + id = "royalbluecarpet" + results = list("royalbluecarpet" = 2) + required_reagents = list("carpet" = 1, "clonexadone" = 1) \ No newline at end of file diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 580f9c87..5a8fc03d 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -162,6 +162,16 @@ category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL +/datum/design/genescanner + name = "Genetic Sequence Analyzer" + desc = "A handy hand-held analyzers for quickly determining mutations and collecting the full sequence." + id = "genescanner" + build_path = /obj/item/sequence_scanner + build_type = PROTOLATHE + materials = list(MAT_METAL = 1000, MAT_GLASS = 500) + category = list("Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + /datum/design/healthanalyzer_advanced name = "Advanced Health Analyzer" desc = "A hand-held body scanner able to distinguish vital signs of the subject with high accuracy." diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm index da3fec61..42cd5ff1 100644 --- a/code/modules/research/techweb/_techweb.dm +++ b/code/modules/research/techweb/_techweb.dm @@ -19,6 +19,7 @@ var/largest_bomb_value = 0 var/organization = "Third-Party" //Organization name, used for display. var/list/last_bitcoins = list() //Current per-second production, used for display only. + var/list/discovered_mutations = list() //Mutations discovered by genetics, this way they are shared and cant be destroyed by destroying a single console var/list/tiers = list() //Assoc list, datum = number, 1 is available, 2 is all reqs are 1, so on /datum/techweb/New() diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 5f848ce8..1349fd23 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -60,7 +60,7 @@ display_name = "Biological Technology" description = "What makes us tick." //the MC, silly! prereq_ids = list("base") - design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag") + design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag","genescanner") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm new file mode 100644 index 00000000..0d4d2b6a --- /dev/null +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -0,0 +1,529 @@ +GLOBAL_VAR_INIT(hhStorageTurf, null) +GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) + +/obj/item/hilbertshotel + name = "Hilbert's Hotel" + desc = "A sphere of what appears to be an intricate network of bluespace. Observing it in detail seems to give you a headache as you try to comprehend the infinite amount of infinitesimally distinct points on its surface." + icon_state = "hilbertshotel" + w_class = WEIGHT_CLASS_SMALL + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + var/datum/map_template/hilbertshotel/hotelRoomTemp + var/datum/map_template/hilbertshotel/empty/hotelRoomTempEmpty + var/datum/map_template/hilbertshotel/lore/hotelRoomTempLore + var/list/activeRooms = list() + var/list/storedRooms = list() + var/storageTurf + //Lore Stuff + var/ruinSpawned = FALSE + var/mysteryRoom + +/obj/item/hilbertshotel/Initialize() + . = ..() + //Load templates + hotelRoomTemp = new() + hotelRoomTempEmpty = new() + hotelRoomTempLore = new() + var/area/currentArea = get_area(src) + if(currentArea.type == /area/ruin/space/has_grav/hilbertresearchfacility) + ruinSpawned = TRUE + +/obj/item/hilbertshotel/Destroy() + ejectRooms() + return ..() + +/obj/item/hilbertshotel/attack(mob/living/M, mob/living/user) + if(M.mind) + to_chat(user, "You invite [M] to the hotel.") + promptAndCheckIn(M) + else + to_chat(user, "[M] is not intelligent enough to understand how to use this device!") + +/obj/item/hilbertshotel/attack_self(mob/user) + . = ..() + promptAndCheckIn(user) + +/obj/item/hilbertshotel/proc/promptAndCheckIn(mob/user) + var/chosenRoomNumber = input(user, "What number room will you be checking into?", "Room Number") as null|num + if(!chosenRoomNumber) + return + if(chosenRoomNumber > SHORT_REAL_LIMIT) + to_chat(user, "You have to check out the first [SHORT_REAL_LIMIT] rooms before you can go to a higher numbered one!") + return + if((chosenRoomNumber < 1) || (chosenRoomNumber != round(chosenRoomNumber))) + to_chat(user, "That is not a valid room number!") + return + if(ismob(loc)) + if(user == loc) //Not always the same as user + forceMove(get_turf(user)) + if(!storageTurf) //Blame subsystems for not allowing this to be in Initialize + if(!GLOB.hhStorageTurf) + var/datum/map_template/hilbertshotelstorage/storageTemp = new() + var/datum/turf_reservation/storageReservation = SSmapping.RequestBlockReservation(3, 3) + storageTemp.load(locate(storageReservation.bottom_left_coords[1], storageReservation.bottom_left_coords[2], storageReservation.bottom_left_coords[3])) + GLOB.hhStorageTurf = locate(storageReservation.bottom_left_coords[1]+1, storageReservation.bottom_left_coords[2]+1, storageReservation.bottom_left_coords[3]) + else + storageTurf = GLOB.hhStorageTurf + if(tryActiveRoom(chosenRoomNumber, user)) + return + if(tryStoredRoom(chosenRoomNumber, user)) + return + sendToNewRoom(chosenRoomNumber, user) + + +/obj/item/hilbertshotel/proc/tryActiveRoom(var/roomNumber, var/mob/user) + if(activeRooms["[roomNumber]"]) + var/datum/turf_reservation/roomReservation = activeRooms["[roomNumber]"] + do_sparks(3, FALSE, get_turf(user)) + user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3])) + return TRUE + else + return FALSE + +/obj/item/hilbertshotel/proc/tryStoredRoom(var/roomNumber, var/mob/user) + if(storedRooms["[roomNumber]"]) + var/datum/turf_reservation/roomReservation = SSmapping.RequestBlockReservation(hotelRoomTemp.width, hotelRoomTemp.height) + hotelRoomTempEmpty.load(locate(roomReservation.bottom_left_coords[1], roomReservation.bottom_left_coords[2], roomReservation.bottom_left_coords[3])) + var/turfNumber = 1 + for(var/i=0, iAs the sphere breaks apart, you're suddenly ejected into the depths of space!
") + var/max = world.maxx-TRANSITIONEDGE + var/min = 1+TRANSITIONEDGE + var/list/possible_transtitons = list() + for(var/AZ in SSmapping.z_list) + var/datum/space_level/D = AZ + if (D.linkage == CROSSLINKED) + possible_transtitons += D.z_value + var/_z = pick(possible_transtitons) + var/_x = rand(min,max) + var/_y = rand(min,max) + var/turf/T = locate(_x, _y, _z) + A.forceMove(T) + qdel(room) + + if(storedRooms.len) + for(var/x in storedRooms) + var/list/atomList = storedRooms[x] + for(var/atom/movable/A in atomList) + var/max = world.maxx-TRANSITIONEDGE + var/min = 1+TRANSITIONEDGE + var/list/possible_transtitons = list() + for(var/AZ in SSmapping.z_list) + var/datum/space_level/D = AZ + if (D.linkage == CROSSLINKED) + possible_transtitons += D.z_value + var/_z = pick(possible_transtitons) + var/_x = rand(min,max) + var/_y = rand(min,max) + var/turf/T = locate(_x, _y, _z) + A.forceMove(T) + +//Template Stuff +/datum/map_template/hilbertshotel + name = "Hilbert's Hotel Room" + mappath = '_maps/templates/hilbertshotel.dmm' + var/landingZoneRelativeX = 2 + var/landingZoneRelativeY = 8 + +/datum/map_template/hilbertshotel/empty + name = "Empty Hilbert's Hotel Room" + mappath = '_maps/templates/hilbertshotelempty.dmm' + +/datum/map_template/hilbertshotel/lore + name = "Doctor Hilbert's Deathbed" + mappath = '_maps/templates/hilbertshotellore.dmm' + +/datum/map_template/hilbertshotelstorage + name = "Hilbert's Hotel Storage" + mappath = '_maps/templates/hilbertshotelstorage.dmm' + + +//Turfs and Areas +/turf/closed/indestructible/hotelwall + name = "hotel wall" + desc = "A wall designed to protect the security of the hotel's guests." + icon_state = "hotelwall" + canSmoothWith = list(/turf/closed/indestructible/hotelwall) + explosion_block = INFINITY + +/turf/open/indestructible/hotelwood + desc = "Stylish dark wood with extra reinforcement. Secured firmly to the floor to prevent tampering." + icon_state = "wood" + footstep = FOOTSTEP_WOOD + tiled_dirt = FALSE + +/turf/open/indestructible/hoteltile + desc = "Smooth tile with extra reinforcement. Secured firmly to the floor to prevent tampering." + icon_state = "showroomfloor" + footstep = FOOTSTEP_FLOOR + tiled_dirt = FALSE + +/turf/open/space/bluespace + name = "\proper bluespace hyperzone" + icon_state = "bluespace" + baseturfs = /turf/open/space/bluespace + flags_1 = NOJAUNT_1 + explosion_block = INFINITY + var/obj/item/hilbertshotel/parentSphere + +/turf/open/space/bluespace/Entered(atom/movable/A) + . = ..() + A.forceMove(get_turf(parentSphere)) + +/turf/closed/indestructible/hoteldoor + name = "Hotel Door" + icon_state = "hoteldoor" + explosion_block = INFINITY + var/obj/item/hilbertshotel/parentSphere + +/turf/closed/indestructible/hoteldoor/proc/promptExit(mob/living/user) + if(!isliving(user)) + return + if(!user.mind) + return + if(!parentSphere) + to_chat(user, "The door seems to be malfunctioning and refuses to operate!") + return + if(alert(user, "Hilbert's Hotel would like to remind you that while we will do everything we can to protect the belongings you leave behind, we make no guarantees of their safety while you're gone, especially that of the health of any living creatures. With that in mind, are you ready to leave?", "Exit", "Leave", "Stay") == "Leave") + if(!user.canmove || (get_dist(get_turf(src), get_turf(user)) > 1)) //no teleporting around if they're dead or moved away during the prompt. + return + user.forceMove(get_turf(parentSphere)) + do_sparks(3, FALSE, get_turf(user)) + +/turf/closed/indestructible/hoteldoor/attack_ghost(mob/dead/observer/user) + if(!isobserver(user) || !parentSphere) + return ..() + user.forceMove(get_turf(parentSphere)) + +//If only this could be simplified... +/turf/closed/indestructible/hoteldoor/attack_tk(mob/user) + return //need to be close. + +/turf/closed/indestructible/hoteldoor/attack_hand(mob/user) + promptExit(user) + +/turf/closed/indestructible/hoteldoor/attack_animal(mob/user) + promptExit(user) + +/turf/closed/indestructible/hoteldoor/attack_paw(mob/user) + promptExit(user) + +/turf/closed/indestructible/hoteldoor/attack_hulk(mob/living/carbon/human/user, does_attack_animation) + promptExit(user) + +/turf/closed/indestructible/hoteldoor/attack_larva(mob/user) + promptExit(user) + +/turf/closed/indestructible/hoteldoor/attack_slime(mob/user) + promptExit(user) + +/turf/closed/indestructible/hoteldoor/attack_robot(mob/user) + if(get_dist(get_turf(src), get_turf(user)) <= 1) + promptExit(user) + +/turf/closed/indestructible/hoteldoor/AltClick(mob/user) + . = ..() + if(get_dist(get_turf(src), get_turf(user)) <= 1) + to_chat(user, "You peak through the door's bluespace peephole...") + user.reset_perspective(parentSphere) + user.set_machine(src) + var/datum/action/peepholeCancel/PHC = new + user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) + PHC.Grant(user) + +/turf/closed/indestructible/hoteldoor/check_eye(mob/user) + if(get_dist(get_turf(src), get_turf(user)) >= 2) + user.unset_machine() + for(var/datum/action/peepholeCancel/PHC in user.actions) + PHC.Trigger() + +/datum/action/peepholeCancel + name = "Cancel View" + desc = "Stop looking through the bluespace peephole." + button_icon_state = "cancel_peephole" + +/datum/action/peepholeCancel/Trigger() + . = ..() + to_chat(owner, "You move away from the peephole.") + owner.reset_perspective() + owner.clear_fullscreen("remote_view", 0) + qdel(src) + +/area/hilbertshotel + name = "Hilbert's Hotel Room" + icon_state = "hilbertshotel" + requires_power = FALSE + has_gravity = TRUE + noteleport = TRUE + hidden = TRUE + unique = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + ambientsounds = list('sound/ambience/servicebell.ogg') + var/roomnumber = 0 + var/obj/item/hilbertshotel/parentSphere + var/datum/turf_reservation/reservation + var/turf/storageTurf + +/area/hilbertshotel/Entered(atom/movable/AM) + . = ..() + if(istype(AM, /obj/item/hilbertshotel)) + relocate(AM) + var/list/obj/item/hilbertshotel/hotels = AM.GetAllContents(/obj/item/hilbertshotel) + for(var/obj/item/hilbertshotel/H in hotels) + if(parentSphere == H) + relocate(H) + +/area/hilbertshotel/proc/relocate(obj/item/hilbertshotel/H) + if(prob(0.135685)) //Because screw you + qdel(H) + return + var/turf/targetturf = find_safe_turf() + if(!targetturf) + if(GLOB.blobstart.len > 0) + targetturf = get_turf(pick(GLOB.blobstart)) + else + CRASH("Unable to find a blobstart landmark") + var/turf/T = get_turf(H) + var/area/A = T.loc + log_game("[H] entered itself. Moving it to [loc_name(targetturf)].") + message_admins("[H] entered itself. Moving it to [ADMIN_VERBOSEJMP(targetturf)].") + for(var/mob/M in A) + to_chat(M, "[H] almost implodes in upon itself, but quickly rebounds, shooting off into a random point in space!") + H.forceMove(targetturf) + +/area/hilbertshotel/Exited(atom/movable/AM) + . = ..() + if(ismob(AM)) + var/mob/M = AM + if(M.mind) + var/stillPopulated = FALSE + var/list/currentLivingMobs = GetAllContents(/mob/living) //Got to catch anyone hiding in anything + for(var/mob/living/L in currentLivingMobs) //Check to see if theres any sentient mobs left. + if(L.mind) + stillPopulated = TRUE + break + if(!stillPopulated) + storeRoom() + +/area/hilbertshotel/proc/storeRoom() + var/roomSize = (reservation.top_right_coords[1]-reservation.bottom_left_coords[1]+1)*(reservation.top_right_coords[2]-reservation.bottom_left_coords[2]+1) + var/storage[roomSize] + var/turfNumber = 1 + var/obj/item/abstracthotelstorage/storageObj = new(storageTurf) + storageObj.roomNumber = roomnumber + storageObj.parentSphere = parentSphere + storageObj.name = "Room [roomnumber] Storage" + for(var/i=0, i
") + return + var/obj/item/hilbertshotel/sphere = target + if(sphere.activeRooms.len) + to_chat(user, "Currently Occupied Rooms:") + for(var/roomnumber in sphere.activeRooms) + to_chat(user, roomnumber) + else + to_chat(user, "No currenty occupied rooms.") + if(sphere.storedRooms.len) + to_chat(user, "Vacated Rooms:") + for(var/roomnumber in sphere.storedRooms) + to_chat(user, roomnumber) + else + to_chat(user, "No vacated rooms.") + +/obj/effect/mob_spawn/human/doctorhilbert + name = "Doctor Hilbert" + mob_name = "Doctor Hilbert" + mob_gender = "male" + assignedrole = null + ghost_usable = FALSE + oxy_damage = 500 + mob_species = /datum/species/skeleton + id_job = "Head Researcher" + id_access = ACCESS_RESEARCH + id_access_list = list(ACCESS_AWAY_GENERIC3, ACCESS_RESEARCH) + instant = TRUE + id = /obj/item/card/id/silver + uniform = /obj/item/clothing/under/rank/research_director + shoes = /obj/item/clothing/shoes/sneakers/brown + back = /obj/item/storage/backpack/satchel/leather + suit = /obj/item/clothing/suit/toggle/labcoat + +/obj/item/paper/crumpled/docslogs + name = "Research Logs" + +/obj/item/paper/crumpled/docslogs/Initialize() + . = ..() + GLOB.hhmysteryRoomNumber = rand(1, SHORT_REAL_LIMIT) + info = {"

Research Logs

+ I might just be onto something here!
+ The strange space-warping properties of bluespace have been known about for awhile now, but I might be on the verge of discovering a new way of harnessing it.
+ It's too soon to say for sure, but this might be the start of something quite important!
+ I'll be sure to log any major future breakthroughs. This might be a lot more than I can manage on my own, perhaps I should hire that secretary after all...
+

Breakthrough!

+ I can't believe it, but I did it! Just when I was certain it couldn't be done, I made the final necessary breakthrough.
+ Exploiting the effects of space dilation caused by specific bluespace structures combined with a precise use of geometric calculus, I've discovered a way to correlate an infinite amount of space within a finite area!
+ While the potential applications are endless, I utilized it in quite a nifty way so far by designing a system that recursively constructs subspace rooms and spatially links them to any of the infinite infinitesimally distinct points on the spheres surface.
+ I call it: Hilbert's Hotel!
+

Goodbye

+ I can't take this anymore. I know what happens next, and the fear of what is coming leaves me unable to continue working.
+ Any fool in my field has heard the stories. It's not that I didn't believe them, it's just... I guess I underestimated the importance of my own research...
+ Robert has reported a further increase in frequency of the strange, prying visitors who ask questions they have no business asking. I've requested him to keep everything on strict lockdown and have permanently dismissed all other assistants.
+ I've also instructed him to use the encryption method we discussed for any important quantitative data. The poor lad... I don't think he truly understands what he's gotten himself into...
+ It's clear what happens now. One day they'll show up uninvited, and claim my research as their own, leaving me as nothing more than a bullet ridden corpse floating in space.
+ I can't stick around to the let that happen.
+ I'm escaping into the very thing that brought all this trouble to my doorstep in the first place - my hotel.
+ I'll be in [uppertext(num2hex(GLOB.hhmysteryRoomNumber, 0))] (That will make sense to anyone who should know)
+ I'm sorry that I must go like this. Maybe one day things will be different and it will be safe to return... maybe...
+ Goodbye
+
+ Doctor Hilbert"} + +/obj/item/paper/crumpled/robertsworkjournal + name = "Work Journal" + info = {"

First Week!

+ First week on the new job. It's a secretarial position, but hey, whatever pays the bills. Plus it seems like some interesting stuff goes on here.
+ Doc says its best that I don't openly talk about his research with others, I guess he doesn't want it getting out or something. I've caught myself slipping a few times when talking to others, it's hard not to brag about something this cool!
+ I'm not really sure why I'm choosing to journal this. Doc seems to log everything. He says it's incase he discovers anything important.
+ I guess that's why I'm doing it too, I've always wanted to be a part of something important.
+ Here's to a new job and to becoming a part of something important!
+

Weird times...

+ Things are starting to get a little strange around here. Just weeks after Doc's amazing breakthrough, weird visitors have began showing up unannounced, asking strange things about Doc's work.
+ I knew Doc wasn't a big fan of company, but even he seemed strangely unnerved when I told him about the visitors.
+ He said it's important that from here on out we keep tight security on everything, even other staff members.
+ He also said something about securing data, something about hexes. What's that mean? Some sort of curse? Doc never struck me as the magic type...
+ He often uses a lot of big sciencey words that I don't really understand, but I kinda dig it, it makes me feel like I'm witnessing something big.
+ I hope things go back to normal soon, but I guess that's the price you pay for being a part of something important.
+

Last day I guess?

+ Things are officially starting to get too strange for me.
+ The visitors have been coming a lot more often, and they all seem increasingly aggressive and nosey. I'm starting to see why they made Doc so nervous, they're certainly starting to creep me out too.
+ Awhile ago Doc started having me keep the place on strict lockdown and requested I refuse entry to anyone else, including previous staff.
+ But the weirdest part?
+ I haven't seen Doc in days. It's not unusual for him to work continuously for long periods of time in the lab, but when I took a peak in their yesterday - he was nowhere to be seen! I didn't risk prying much further, Doc had a habit of leaving the defense systems on these last few weeks.
+ I'm thinking it might be time to call it quits. Can't work much without a boss, plus things are starting to get kind of shady. I wanted to be a part of something important, but you gotta know when to play it safe.
+ As my dad always said, "The smart get famous, but the wise survive..."
+
+ Robert P."} + +/obj/item/paper/crumpled/bloody/docsdeathnote + name = "note" + info = {"This is it isn't it?
+ No one's coming to help, that much has become clear.
+ Sure, it's lonely, but do I have much choice? At least I brought the analyzer with me, they shouldn't be able to find me without it.
+ Who knows who's waiting for me out there. Its either die out there in their hands, or die a slower, slightly more comfortable death in here.
+ Everyday I can feel myself slipping away more and more, both physically and mentally. Who knows what happens now...
+ Heh, so it's true then, this must be the inescapable path of all great minds... so be it then.
+
+
+
+ Choose a room, and enter the sphere
+ Lay your head to rest, it soon becomes clear
+ There's always more room around every bend
+ Not all that's countable has an end..."} diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 2249f5f1..3bd031cc 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -24,6 +24,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /obj/effect/portal, /obj/item/shared_storage, /obj/structure/extraction_point, + /obj/item/hilbertshotel, /obj/machinery/syndicatebomb ))) diff --git a/code/modules/spells/spell_types/genetic.dm b/code/modules/spells/spell_types/genetic.dm index b670d93f..c3bdc74e 100644 --- a/code/modules/spells/spell_types/genetic.dm +++ b/code/modules/spells/spell_types/genetic.dm @@ -4,7 +4,7 @@ var/list/active_on = list() var/list/traits = list() //disabilities - var/list/mutations = list() //mutation strings + var/list/mutations = list() //mutation defines var/duration = 100 //deciseconds /* Disabilities diff --git a/code/modules/spells/spell_types/summonitem.dm b/code/modules/spells/spell_types/summonitem.dm index 6d46c53a..7d9823e2 100644 --- a/code/modules/spells/spell_types/summonitem.dm +++ b/code/modules/spells/spell_types/summonitem.dm @@ -61,6 +61,10 @@ organ.Remove(organ.owner) else while(!isturf(item_to_retrieve.loc) && infinite_recursion < 10) //if it's in something you get the whole thing. + if(isitem(item_to_retrieve.loc)) + var/obj/item/I = item_to_retrieve.loc + if(I.item_flags & ABSTRACT) //Being able to summon abstract things because your item happened to get placed there is a no-no + break if(ismob(item_to_retrieve.loc)) //If its on someone, properly drop it var/mob/M = item_to_retrieve.loc diff --git a/code/modules/spells/spell_types/telepathy.dm b/code/modules/spells/spell_types/telepathy.dm new file mode 100644 index 00000000..db7e284e --- /dev/null +++ b/code/modules/spells/spell_types/telepathy.dm @@ -0,0 +1,30 @@ +/obj/effect/proc_holder/spell/targeted/telepathy + name = "Telepathy" + desc = "Telepathically transmits a message to the target." + charge_max = 0 + clothes_req = 0 + range = 7 + include_user = 0 + action_icon = 'icons/mob/actions/actions_revenant.dmi' + action_icon_state = "r_transmit" + action_background_icon_state = "bg_spell" + var/notice = "notice" + var/boldnotice = "boldnotice" + var/magic_check = TRUE + +/obj/effect/proc_holder/spell/targeted/telepathy/cast(list/targets, mob/living/simple_animal/revenant/user = usr) + for(var/mob/living/M in targets) + var/msg = stripped_input(usr, "What do you wish to tell [M]?", null, "") + if(!msg) + charge_counter = charge_max + return + log_directed_talk(user, M, msg, LOG_SAY, "[name]") + to_chat(user, "You transmit to [M]: [msg]") + if(!magic_check || !M.anti_magic_check(FALSE, TRUE)) //hear no evil + to_chat(M, "You hear something behind you talking... [msg]") + for(var/ded in GLOB.dead_mob_list) + if(!isobserver(ded)) + continue + var/follow_rev = FOLLOW_LINK(ded, user) + var/follow_whispee = FOLLOW_LINK(ded, M) + to_chat(ded, "[follow_rev] [user] [name]: \"[msg]\" to [follow_whispee] [M]") \ No newline at end of file diff --git a/code/modules/spells/spell_types/touch_attacks.dm b/code/modules/spells/spell_types/touch_attacks.dm index 0ffe02ce..f0a9735c 100644 --- a/code/modules/spells/spell_types/touch_attacks.dm +++ b/code/modules/spells/spell_types/touch_attacks.dm @@ -1,6 +1,8 @@ /obj/effect/proc_holder/spell/targeted/touch var/hand_path = /obj/item/melee/touch_attack var/obj/item/melee/touch_attack/attached_hand = null + var/drawmessage = "You channel the power of the spell to your hand." + var/dropmessage = "You draw the power out of your hand." invocation_type = "none" //you scream on connecting, not summoning include_user = 1 range = -1 @@ -21,7 +23,7 @@ /obj/effect/proc_holder/spell/targeted/touch/cast(list/targets,mob/user = usr) if(!QDELETED(attached_hand)) remove_hand(TRUE) - to_chat(user, "You draw the power out of your hand.") + to_chat(user, "[dropmessage]") return for(var/mob/living/carbon/C in targets) @@ -43,7 +45,7 @@ remove_hand(TRUE) to_chat(user, "Your hands are full!") return FALSE - to_chat(user, "You channel the power of the spell to your hand.") + to_chat(user, "[drawmessage]") return TRUE diff --git a/code/modules/surgery/advanced/toxichealing.dm b/code/modules/surgery/advanced/toxichealing.dm index 998ca47b..ae43b3d5 100644 --- a/code/modules/surgery/advanced/toxichealing.dm +++ b/code/modules/surgery/advanced/toxichealing.dm @@ -17,7 +17,7 @@ /datum/surgery_step/toxichealing name = "rejuvenate body" - implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15) + implements = list(/obj/item/hemostat = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15) repeatable = TRUE time = 25 diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 81b491e6..7c6d8e08 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -21,6 +21,8 @@ var/held_index = 0 //are we a hand? if so, which one! var/is_pseudopart = FALSE //For limbs that don't really exist, eg chainsaws + var/broken = FALSE //Broken bones + var/disabled = BODYPART_NOT_DISABLED //If disabled, limb is as good as missing var/body_damage_coeff = 1 //Multiplier of the limb's damage that gets applied to the mob var/stam_damage_coeff = 0.5 @@ -75,6 +77,8 @@ to_chat(user, "This limb has [brute_dam > 30 ? "severe" : "minor"] bruising.") if(burn_dam > DAMAGE_PRECISION) to_chat(user, "This limb has [burn_dam > 30 ? "severe" : "minor"] burns.") + if(broken == TRUE) + to_chat(user, "This limb is broken.") /obj/item/bodypart/blob_act() take_damage(max_damage) diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 9341fb6c..4e2b81dc 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -108,7 +108,7 @@ for(var/X in C.dna.mutations) //some mutations require having specific limbs to be kept. var/datum/mutation/human/MT = X if(MT.limb_req && MT.limb_req == body_zone) - MT.force_lose(C) + C.dna.force_lose(MT) for(var/X in C.internal_organs) //internal organs inside the dismembered limb are dropped. var/obj/item/organ/O = X diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm index 5aeeb322..a98f419a 100644 --- a/code/modules/surgery/coronary_bypass.dm +++ b/code/modules/surgery/coronary_bypass.dm @@ -15,7 +15,7 @@ //an incision but with greater bleed, and a 90% base success chance /datum/surgery_step/incise_heart name = "incise heart" - implements = list(TOOL_SCALPEL = 90, /obj/item/melee/transforming/energy/sword = 45, /obj/item/kitchen/knife = 45, + implements = list(/obj/item/scalpel = 100, /obj/item/melee/transforming/energy/sword = 45, /obj/item/kitchen/knife = 45, /obj/item/shard = 25) time = 16 diff --git a/code/modules/surgery/embalming.dm b/code/modules/surgery/embalming.dm index d65abc9d..45f02af5 100644 --- a/code/modules/surgery/embalming.dm +++ b/code/modules/surgery/embalming.dm @@ -11,9 +11,9 @@ /datum/surgery_step/embalming name = "embalming body" - implements = list(/obj/item/reagent_containers/syringe = 100, /obj/item/pen = 30) + implements = list(/obj/item/hemostat = 100) time = 10 - chems_needed = list("drying_agent", "sterilizine") + chems_needed = list("drying_agent","formaldehyde") require_all_chems = FALSE /datum/surgery_step/embalming/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 5fea801b..0f9017fb 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -61,6 +61,7 @@ return S /obj/item/organ/heart/on_life() + ..() if(owner.client && beating) failed = FALSE var/sound/slowbeat = sound('sound/health/slowbeat.ogg', repeat = TRUE) diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index 4cb2cd21..93210fe3 100644 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -17,6 +17,7 @@ low_threshold_cleared = "The last bouts of pain in your stomach have died out." /obj/item/organ/stomach/on_life() + ..() var/datum/reagent/consumable/nutriment/Nutri if(ishuman(owner)) var/mob/living/carbon/human/H = owner diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 3dd5c7b2..914c8cad 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -23,6 +23,9 @@ /datum/language/aphasia, /datum/language/slime, )) + healing_factor = STANDARD_ORGAN_HEALING*5 //Fast!! + decay_factor = STANDARD_ORGAN_DECAY/2 + /obj/item/organ/tongue/Initialize(mapload) . = ..() diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index c5845f82..e8f423aa 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -81,6 +81,8 @@ propability = 1 else if(locate(/obj/structure/table, T)) propability = 0.8 + else if(locate(/obj/machinery/stasis, T)) + propability = 0.9 else if(locate(/obj/structure/bed, T)) propability = 0.7 @@ -98,7 +100,7 @@ var/datum/species/abductor/S = H.dna.species if(S.scientist) return TRUE - + if(iscyborg(user)) var/mob/living/silicon/robot/R = user var/obj/item/surgical_processor/SP = locate() in R.module.modules @@ -106,7 +108,7 @@ return FALSE if(type in SP.advanced_surgeries) return TRUE - + var/turf/T = get_turf(target) var/obj/structure/table/optable/table = locate(/obj/structure/table/optable, T) if(!table || !table.computer) diff --git a/code/modules/vending/engivend.dm b/code/modules/vending/engivend.dm index 9358d165..10ffdad9 100644 --- a/code/modules/vending/engivend.dm +++ b/code/modules/vending/engivend.dm @@ -5,6 +5,7 @@ icon_deny = "engivend-deny" req_access = list(ACCESS_ENGINE_EQUIP) products = list(/obj/item/clothing/glasses/meson/engine = 5, + /obj/item/storage/bag/construction = 5, /obj/item/clothing/glasses/welding = 5, /obj/item/multitool = 5, /obj/item/construction/rcd/loaded = 3, diff --git a/config/spaceRuinBlacklist.txt b/config/spaceRuinBlacklist.txt index deafa479..edf16cc1 100644 --- a/config/spaceRuinBlacklist.txt +++ b/config/spaceRuinBlacklist.txt @@ -50,3 +50,4 @@ #_maps/RandomRuins/SpaceRuins/arcade.dmm #_maps/RandomRuins/SpaceRuins/spacehermit.dmm #_maps/RandomRuins/SpaceRuins/advancedlab.dmm +#_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm diff --git a/html/browser/scannernew.css b/html/browser/scannernew.css index 0e809a67..6746a61a 100644 --- a/html/browser/scannernew.css +++ b/html/browser/scannernew.css @@ -16,3 +16,24 @@ float: left; } +img.selected +{ + border: 1px solid blue; +} +img.unselected +{ + border: 2px solid black; +} +div>table { + float: left; +} +td +{ + text-align: center; +} +a.clean +{ + background: none; + border: none; + marging: none; +} \ No newline at end of file diff --git a/html/dna_discovered.gif b/html/dna_discovered.gif new file mode 100644 index 00000000..bc6b75f2 Binary files /dev/null and b/html/dna_discovered.gif differ diff --git a/html/dna_extra.gif b/html/dna_extra.gif new file mode 100644 index 00000000..c92218a6 Binary files /dev/null and b/html/dna_extra.gif differ diff --git a/html/dna_undiscovered.gif b/html/dna_undiscovered.gif new file mode 100644 index 00000000..a3c182a4 Binary files /dev/null and b/html/dna_undiscovered.gif differ diff --git a/hyperstation/code/obj/pregnancytester.dm b/hyperstation/code/obj/pregnancytester.dm index dcf12cff..6b751747 100644 --- a/hyperstation/code/obj/pregnancytester.dm +++ b/hyperstation/code/obj/pregnancytester.dm @@ -1,6 +1,6 @@ /obj/item/pregnancytest name = "pregnancy test" - desc = "a one time use small device, used to determine if someone is pregnant or not. Also comes with a force feature to freak out your ex (alt click)." + desc = "a one time use small device, used to determine if someone is pregnant or not." icon = 'hyperstation/icons/obj/pregnancytest.dmi' throwforce = 0 icon_state = "ptest" @@ -22,34 +22,22 @@ return //Already been used once, pregnancy tests only work once. test(user) - -/obj/item/pregnancytest/AltClick(mob/living/user) - if(QDELETED(src)) - return - if(!isliving(user)) - return - if(isAI(user)) - return - if(user.stat > 0)//unconscious or dead - return //Already been used once, pregnancy tests only work once. - if(status == 1) - return - force(user) - /obj/item/pregnancytest/proc/force(mob/living/user) - //just for fun or roleplay, force it. - results = "positive" - icon_state = "positive" - status = 1 - name = "[results] pregnancy test" - to_chat(user, "You force the device to read possive.") - - - -/obj/item/pregnancytest/proc/test(mob/living/user) -//This is where the pregancy checker would be, if and when pregnancy is coded. SO we can always assume the person is not pregnant because there is no code for it. - results = "negative" + //Force it negative icon_state = "negative" name = "[results] pregnancy test" status = 1 - to_chat(user, "You use the pregnancy test, after a pause one pink line lights up on the display, reading negative.") + to_chat(user, "You use the pregnancy test, the display reads positive!") + + +/obj/item/pregnancytest/proc/test(mob/living/user) + + var/obj/item/organ/genital/womb/W = user.getorganslot("womb") + if(W.pregnant == 1) + results = "positive" + icon_state = "positive" + name = "[results] pregnancy test" + status = 1 + to_chat(user, "You use the pregnancy test, the display reads positive!") + else + force(user) \ No newline at end of file diff --git a/icons/effects/genetics.dmi b/icons/effects/genetics.dmi index a9f5f433..373a9de6 100644 Binary files a/icons/effects/genetics.dmi and b/icons/effects/genetics.dmi differ diff --git a/icons/mecha/mech_construction.dmi b/icons/mecha/mech_construction.dmi index 42cc8eeb..cdb07215 100644 Binary files a/icons/mecha/mech_construction.dmi and b/icons/mecha/mech_construction.dmi differ diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index 4e23c102..f0f283cd 100644 Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ diff --git a/icons/mob/actions/actions_genetic.dmi b/icons/mob/actions/actions_genetic.dmi new file mode 100644 index 00000000..72bd87f9 Binary files /dev/null and b/icons/mob/actions/actions_genetic.dmi differ diff --git a/icons/mob/actions/actions_spells.dmi b/icons/mob/actions/actions_spells.dmi index 30927d36..5617e228 100644 Binary files a/icons/mob/actions/actions_spells.dmi and b/icons/mob/actions/actions_spells.dmi differ diff --git a/icons/mob/alienqueen.dmi b/icons/mob/alienqueen.dmi index 1176f43e..4c04e0e4 100644 Binary files a/icons/mob/alienqueen.dmi and b/icons/mob/alienqueen.dmi differ diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 6843bac6..ad4ffaef 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi index 6cce82b5..141a0d07 100644 Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index 7f10d992..97aeea4e 100644 Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ diff --git a/icons/mob/inhands/misc/tiles_lefthand.dmi b/icons/mob/inhands/misc/tiles_lefthand.dmi new file mode 100644 index 00000000..d7903fcd Binary files /dev/null and b/icons/mob/inhands/misc/tiles_lefthand.dmi differ diff --git a/icons/mob/inhands/misc/tiles_righthand.dmi b/icons/mob/inhands/misc/tiles_righthand.dmi new file mode 100644 index 00000000..9295ac73 Binary files /dev/null and b/icons/mob/inhands/misc/tiles_righthand.dmi differ diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index 019ae095..c88b7eb8 100644 Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index e6c2d111..6c917354 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi index 192c66ad..4bee50f5 100644 Binary files a/icons/obj/chairs.dmi and b/icons/obj/chairs.dmi differ diff --git a/icons/obj/chromosomes.dmi b/icons/obj/chromosomes.dmi new file mode 100644 index 00000000..a8ff6186 Binary files /dev/null and b/icons/obj/chromosomes.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index e329720c..121d2220 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index 4ec45666..f34fe3be 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/cross.dmi b/icons/obj/cross.dmi new file mode 100644 index 00000000..de147177 Binary files /dev/null and b/icons/obj/cross.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index d604d02e..a01cb364 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/doors/airlocks/station/command.dmi b/icons/obj/doors/airlocks/station/command.dmi index bc930c4f..1a82b9ca 100644 Binary files a/icons/obj/doors/airlocks/station/command.dmi and b/icons/obj/doors/airlocks/station/command.dmi differ diff --git a/icons/obj/doors/airlocks/station/engineering.dmi b/icons/obj/doors/airlocks/station/engineering.dmi index 45d51e32..8da95366 100644 Binary files a/icons/obj/doors/airlocks/station/engineering.dmi and b/icons/obj/doors/airlocks/station/engineering.dmi differ diff --git a/icons/obj/doors/airlocks/station/security.dmi b/icons/obj/doors/airlocks/station/security.dmi index fac22fbd..d949ed5d 100644 Binary files a/icons/obj/doors/airlocks/station/security.dmi and b/icons/obj/doors/airlocks/station/security.dmi differ diff --git a/icons/obj/doors/airlocks/station/securitydouble.dmi b/icons/obj/doors/airlocks/station/securitydouble.dmi new file mode 100644 index 00000000..d60b41d1 Binary files /dev/null and b/icons/obj/doors/airlocks/station/securitydouble.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index 8788567b..3a6d8023 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/icons/obj/smooth_structures/fancy_table_blue.dmi b/icons/obj/smooth_structures/fancy_table_blue.dmi new file mode 100644 index 00000000..07e13e99 Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_blue.dmi differ diff --git a/icons/obj/smooth_structures/fancy_table_cyan.dmi b/icons/obj/smooth_structures/fancy_table_cyan.dmi new file mode 100644 index 00000000..4f1a90e3 Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_cyan.dmi differ diff --git a/icons/obj/smooth_structures/fancy_table_green.dmi b/icons/obj/smooth_structures/fancy_table_green.dmi new file mode 100644 index 00000000..ea7f8daa Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_green.dmi differ diff --git a/icons/obj/smooth_structures/fancy_table_orange.dmi b/icons/obj/smooth_structures/fancy_table_orange.dmi new file mode 100644 index 00000000..fe0375dd Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_orange.dmi differ diff --git a/icons/obj/smooth_structures/fancy_table_purple.dmi b/icons/obj/smooth_structures/fancy_table_purple.dmi new file mode 100644 index 00000000..c404a9eb Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_purple.dmi differ diff --git a/icons/obj/smooth_structures/fancy_table_red.dmi b/icons/obj/smooth_structures/fancy_table_red.dmi new file mode 100644 index 00000000..8bca0ca8 Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_red.dmi differ diff --git a/icons/obj/smooth_structures/fancy_table_royalblack.dmi b/icons/obj/smooth_structures/fancy_table_royalblack.dmi new file mode 100644 index 00000000..064b7c19 Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_royalblack.dmi differ diff --git a/icons/obj/smooth_structures/fancy_table_royalblue.dmi b/icons/obj/smooth_structures/fancy_table_royalblue.dmi new file mode 100644 index 00000000..9d0eba72 Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_royalblue.dmi differ diff --git a/icons/obj/smooth_structures/plasmaglass_table.dmi b/icons/obj/smooth_structures/plasmaglass_table.dmi new file mode 100644 index 00000000..808e79aa Binary files /dev/null and b/icons/obj/smooth_structures/plasmaglass_table.dmi differ diff --git a/icons/obj/sofa.dmi b/icons/obj/sofa.dmi index dafe06a7..08d6976e 100644 Binary files a/icons/obj/sofa.dmi and b/icons/obj/sofa.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index 2e1fdfa7..8650e7be 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index 9305e4b7..3aa6912d 100644 Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index c983201d..23a138d5 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi index 01cb909d..992b37cc 100644 Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ diff --git a/icons/turf/floors/carpet_blue.dmi b/icons/turf/floors/carpet_blue.dmi new file mode 100644 index 00000000..f797be97 Binary files /dev/null and b/icons/turf/floors/carpet_blue.dmi differ diff --git a/icons/turf/floors/carpet_cyan.dmi b/icons/turf/floors/carpet_cyan.dmi new file mode 100644 index 00000000..feca351c Binary files /dev/null and b/icons/turf/floors/carpet_cyan.dmi differ diff --git a/icons/turf/floors/carpet_green.dmi b/icons/turf/floors/carpet_green.dmi new file mode 100644 index 00000000..fdd1f071 Binary files /dev/null and b/icons/turf/floors/carpet_green.dmi differ diff --git a/icons/turf/floors/carpet_orange.dmi b/icons/turf/floors/carpet_orange.dmi new file mode 100644 index 00000000..ddf239b6 Binary files /dev/null and b/icons/turf/floors/carpet_orange.dmi differ diff --git a/icons/turf/floors/carpet_purple.dmi b/icons/turf/floors/carpet_purple.dmi new file mode 100644 index 00000000..c1f40ec7 Binary files /dev/null and b/icons/turf/floors/carpet_purple.dmi differ diff --git a/icons/turf/floors/carpet_red.dmi b/icons/turf/floors/carpet_red.dmi new file mode 100644 index 00000000..92665568 Binary files /dev/null and b/icons/turf/floors/carpet_red.dmi differ diff --git a/icons/turf/floors/carpet_royalblack.dmi b/icons/turf/floors/carpet_royalblack.dmi new file mode 100644 index 00000000..bc5cef1c Binary files /dev/null and b/icons/turf/floors/carpet_royalblack.dmi differ diff --git a/icons/turf/floors/carpet_royalblue.dmi b/icons/turf/floors/carpet_royalblue.dmi new file mode 100644 index 00000000..841e49e9 Binary files /dev/null and b/icons/turf/floors/carpet_royalblue.dmi differ diff --git a/icons/turf/space.dmi b/icons/turf/space.dmi index d32279e7..33e3fab9 100644 Binary files a/icons/turf/space.dmi and b/icons/turf/space.dmi differ diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi index 3290e3f9..0df70e9e 100644 Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ diff --git a/icons/turf/walls/reinforced_wall.dmi b/icons/turf/walls/reinforced_wall.dmi index e0d128fa..5fd9a851 100644 Binary files a/icons/turf/walls/reinforced_wall.dmi and b/icons/turf/walls/reinforced_wall.dmi differ diff --git a/icons/turf/walls/wall.dmi b/icons/turf/walls/wall.dmi index d4f44c1e..894caf0f 100644 Binary files a/icons/turf/walls/wall.dmi and b/icons/turf/walls/wall.dmi differ diff --git a/interface/menu.dm b/interface/menu.dm index 0d1313b0..224d933f 100644 --- a/interface/menu.dm +++ b/interface/menu.dm @@ -81,17 +81,53 @@ GLOBAL_LIST_EMPTY(menulist) default = /datum/verbs/menu/Settings/FPS/verb/high /datum/verbs/menu/Settings/FPS/verb/low() - set name = "LowFPS" + set name = "Low-end FPS" set desc = "&20 fps" + set category = "Preferences" + set hidden = 1 usr.client.prefs.clientfps = 20 usr.client.prefs.parent.fps = 20 + /datum/verbs/menu/Settings/FPS/verb/high() - set name = "HighFPS" - set desc = "&30 fps (High-end machines)" + set name = "High-end FPS" + set desc = "&25 fps" + set category = "Preferences" + set hidden = 1 + usr.client.prefs.clientfps = 25 + usr.client.prefs.parent.fps = 25 + + +/datum/verbs/menu/Settings/FPS/verb/vhigh() + set name = "Higher-end FPS" + set desc = "&30 fps" + set category = "Preferences" + set hidden = 1 usr.client.prefs.clientfps = 30 usr.client.prefs.parent.fps = 30 + +/datum/verbs/menu/Settings/ChatOutput + checkbox = CHECKBOX_GROUP + default = /datum/verbs/menu/Settings/ChatOutput/verb/newchat + +/datum/verbs/menu/Settings/ChatOutput/verb/oldchat() + set name = "Old Chat" + set desc = "&Old Chat (Faster)" + set hidden = 1 + set category = "Preferences" + winset(src, "output", "is-visible=true;is-disabled=false") + winset(src, "browseroutput", "is-visible=false") + +/datum/verbs/menu/Settings/ChatOutput/verb/newchat() + set name = "Fancy Chat" + set desc = "&Fancy Chat (Slower)" + set hidden = 1 + set category = "Preferences" + winset(src, "output", "is-visible=false") + winset(src, "browseroutput", "is-disabled=false;is-visible=true") + + /datum/verbs/menu/Icon/Size checkbox = CHECKBOX_GROUP default = /datum/verbs/menu/Icon/Size/verb/iconstretchtofit @@ -133,4 +169,3 @@ GLOBAL_LIST_EMPTY(menulist) /datum/verbs/menu/Icon/Scaling/verb/BL() set name = "@.winset \"mapwindow.map.zoom-mode=blur\"" set desc = "Bilinear" - diff --git a/modular_citadel/code/game/machinery/wishgranter.dm b/modular_citadel/code/game/machinery/wishgranter.dm index f24062a1..6121893c 100644 --- a/modular_citadel/code/game/machinery/wishgranter.dm +++ b/modular_citadel/code/game/machinery/wishgranter.dm @@ -17,7 +17,7 @@ to_chat(user, "Your head pounds for a moment, before your vision clears. The Wish Granter, sensing the darkness in your heart, has given you limitless power, and it's all yours!") user.dna.add_mutation(HULK) user.dna.add_mutation(XRAY) - user.dna.add_mutation(COLDRES) + user.dna.add_mutation(SPACEMUT) user.dna.add_mutation(TK) user.next_move_modifier *= 0.5 //half the delay between attacks! to_chat(user, "Things around you feel slower!") diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm index 27f7576e..58db9c4e 100644 --- a/modular_citadel/code/modules/arousal/arousal.dm +++ b/modular_citadel/code/modules/arousal/arousal.dm @@ -301,7 +301,7 @@ setArousalLoss(min_arousal) -/mob/living/carbon/human/proc/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage = TRUE, mb_time = 30) //Used for climaxing with any living thing +/mob/living/carbon/human/proc/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage = TRUE, impreg = FALSE, mb_time = 30) //Used for climaxing with any living thing var/total_fluids = 0 var/datum/reagents/fluid_source = null @@ -329,8 +329,11 @@ "You have climaxed with someone[spillage ? ", spilling out of them":""], using your [G.name].") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + if(G.can_climax) + setArousalLoss(min_arousal) + else //knots and other non-spilling orgasms if(do_after(src, mb_time, target = src) && in_range(src, L)) fluid_source.trans_to(L, total_fluids) @@ -340,9 +343,17 @@ "You have climaxed inside someone, your [G.name] spilling nothing.") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + if(G.can_climax) setArousalLoss(min_arousal) + if(impreg) + //Role them odds, only people with the dicks can send the chance to the person with the settings enabled at the momment. + if (rand(0,100) < L.impregchance && L.breedable == 1) + log_game("Debug: [L] has been impregnated by [src]") + var/obj/item/organ/genital/womb/W = L.getorganslot("womb") + W.pregnant = 1 + /mob/living/carbon/human/proc/mob_fill_container(obj/item/organ/genital/G, obj/item/reagent_containers/container, mb_time = 30) //For beaker-filling, beware the bartender var/total_fluids = 0 @@ -555,12 +566,30 @@ if(picked_organ) var/mob/living/partner = pick_partner() //Get someone if(partner) - var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No") - if(spillage == "Yes") - mob_climax_partner(picked_organ, partner, TRUE) - else - mob_climax_partner(picked_organ, partner, FALSE) - return + if(partner.breedable == 1 && picked_organ.name == "penis") + var/impreg = input(src, "Would this action carry the risk of pregnancy?", "Choose a option", "Yes") as anything in list("Yes", "No") + if(impreg == "Yes") //If we are impregging + var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No") + if(spillage == "Yes") + mob_climax_partner(picked_organ, partner, TRUE, TRUE) + else + mob_climax_partner(picked_organ, partner, FALSE, TRUE) + else + var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No") + if(spillage == "Yes") + mob_climax_partner(picked_organ, partner, TRUE, FALSE) + else + mob_climax_partner(picked_organ, partner, FALSE, FALSE) //Wow, im trash at coding, I need to find a better way of coding this, ill rewrite it later.-quote + return + + else //If we arent impregging + var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No") + if(spillage == "Yes") + mob_climax_partner(picked_organ, partner, TRUE, FALSE) + else + mob_climax_partner(picked_organ, partner, FALSE, FALSE) + return + else to_chat(src, "You cannot do this alone.") return diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 3abe7ecb..5b4f0929 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -145,6 +145,8 @@ give_vagina() if(dna.features["has_womb"]) give_womb() + if(dna.features["can_get_preg"]) + make_breedable() //hyperstation set up the pregnancy stuff if(dna.features["has_balls"]) give_balls() if(dna.features["has_breasts"]) // since we have multi-boobs as a thing, we'll want to at least draw over these. but not over the pingas. @@ -266,6 +268,10 @@ if(W) W.update() +/mob/living/carbon/human/proc/make_breedable() + //Hyperstation, This makes the character able to use the impreg features of the game + breedable = 1 + impregchance = 30 //30% is a good base chance /datum/species/proc/genitals_layertext(layer) switch(layer) diff --git a/modular_citadel/code/modules/arousal/organs/womb.dm b/modular_citadel/code/modules/arousal/organs/womb.dm index 3f190b72..c8dbfed0 100644 --- a/modular_citadel/code/modules/arousal/organs/womb.dm +++ b/modular_citadel/code/modules/arousal/organs/womb.dm @@ -8,6 +8,8 @@ internal = TRUE fluid_id = "femcum" producing = TRUE + var/pregnant = FALSE //this is for pregnancy code + /obj/item/organ/genital/womb/on_life() if(QDELETED(src)) diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm index c3cbf791..43527174 100644 --- a/modular_citadel/code/modules/client/preferences_savefile.dm +++ b/modular_citadel/code/modules/client/preferences_savefile.dm @@ -72,6 +72,7 @@ WRITE_FILE(S["feature_vag_color"], features["vag_color"]) //womb features WRITE_FILE(S["feature_has_womb"], features["has_womb"]) + //pregnancy features WRITE_FILE(S["feature_can_get_preg"], features["can_get_preg"]) //flavor text WRITE_FILE(S["feature_flavor_text"], features["flavor_text"]) diff --git a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm index 07e8f11f..a8056b01 100644 --- a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -765,6 +765,12 @@ name = "Panda" icon_state = "hpanda" +/datum/sprite_accessory/mam_snouts/skulldog + name = "Skulldog" + icon_state = "skulldog" + extra = TRUE + extra_color_src = MATRIXED + /datum/sprite_accessory/mam_snouts/lcanid name = "Mammal, Long" icon_state = "lcanid" diff --git a/modular_citadel/icons/mob/mam_snouts.dmi b/modular_citadel/icons/mob/mam_snouts.dmi index d62b7dd0..87b96c11 100644 Binary files a/modular_citadel/icons/mob/mam_snouts.dmi and b/modular_citadel/icons/mob/mam_snouts.dmi differ diff --git a/modular_citadel/icons/mob/mask.dmi b/modular_citadel/icons/mob/mask.dmi index 788bfc04..93c02666 100644 Binary files a/modular_citadel/icons/mob/mask.dmi and b/modular_citadel/icons/mob/mask.dmi differ diff --git a/modular_citadel/icons/mob/muzzled_mask.dmi b/modular_citadel/icons/mob/muzzled_mask.dmi index 59c669ea..9e8ac12e 100644 Binary files a/modular_citadel/icons/mob/muzzled_mask.dmi and b/modular_citadel/icons/mob/muzzled_mask.dmi differ diff --git a/modular_citadel/interface/skin.dmf b/modular_citadel/interface/skin.dmf index f476ab50..3c766db6 100644 --- a/modular_citadel/interface/skin.dmf +++ b/modular_citadel/interface/skin.dmf @@ -98,7 +98,6 @@ window "mapwindow" size = 640x480 anchor1 = none anchor2 = none - background-color = none saved-params = "pos;size;is-minimized;is-maximized" is-pane = true elem "map" @@ -275,8 +274,8 @@ window "statwindow" window "preferences_window" elem "preferences_window" type = MAIN - pos = 435,99 - size = 1000x600 + pos = 281,0 + size = 1600x980 anchor1 = none anchor2 = none background-color = none @@ -285,8 +284,8 @@ window "preferences_window" statusbar = false elem "preferences_browser" type = BROWSER - pos = 250,0 - size = 750x618 + pos = 399,0 + size = 1200x980 anchor1 = 25,0 anchor2 = 100,100 background-color = none @@ -294,7 +293,7 @@ window "preferences_window" elem "character_preview_map" type = MAP pos = 0,0 - size = 250x618 + size = 400x998 anchor1 = 0,0 anchor2 = 25,100 right-click = true diff --git a/sound/ambience/servicebell.ogg b/sound/ambience/servicebell.ogg new file mode 100644 index 00000000..f55c7d5a Binary files /dev/null and b/sound/ambience/servicebell.ogg differ diff --git a/sound/effects/crossed.ogg b/sound/effects/crossed.ogg new file mode 100644 index 00000000..276d7f25 Binary files /dev/null and b/sound/effects/crossed.ogg differ diff --git a/sound/effects/footstep/floor1.ogg b/sound/effects/footstep/floor1.ogg index 1e3e1558..a2133513 100644 Binary files a/sound/effects/footstep/floor1.ogg and b/sound/effects/footstep/floor1.ogg differ diff --git a/sound/effects/footstep/floor2.ogg b/sound/effects/footstep/floor2.ogg index cce5a25d..38d06a82 100644 Binary files a/sound/effects/footstep/floor2.ogg and b/sound/effects/footstep/floor2.ogg differ diff --git a/sound/effects/footstep/floor3.ogg b/sound/effects/footstep/floor3.ogg index 16ab67f7..81d2d953 100644 Binary files a/sound/effects/footstep/floor3.ogg and b/sound/effects/footstep/floor3.ogg differ diff --git a/sound/effects/footstep/floor4.ogg b/sound/effects/footstep/floor4.ogg index 9ef15430..9ceb18aa 100644 Binary files a/sound/effects/footstep/floor4.ogg and b/sound/effects/footstep/floor4.ogg differ diff --git a/sound/effects/footstep/floor5.ogg b/sound/effects/footstep/floor5.ogg index 0f6a6605..a2f354cd 100644 Binary files a/sound/effects/footstep/floor5.ogg and b/sound/effects/footstep/floor5.ogg differ diff --git a/sound/machines/AirlockClose.ogg b/sound/machines/AirlockClose.ogg index 061eda4a..81a1dc1f 100644 Binary files a/sound/machines/AirlockClose.ogg and b/sound/machines/AirlockClose.ogg differ diff --git a/sound/machines/BoltsDown.ogg b/sound/machines/BoltsDown.ogg index c7320a04..b5fe8e2c 100644 Binary files a/sound/machines/BoltsDown.ogg and b/sound/machines/BoltsDown.ogg differ diff --git a/sound/machines/BoltsUp.ogg b/sound/machines/BoltsUp.ogg index bc422e28..72898337 100644 Binary files a/sound/machines/BoltsUp.ogg and b/sound/machines/BoltsUp.ogg differ diff --git a/sound/machines/airlock.ogg b/sound/machines/airlock.ogg index 6e6231e4..73618807 100644 Binary files a/sound/machines/airlock.ogg and b/sound/machines/airlock.ogg differ diff --git a/sound/machines/airlockforced.ogg b/sound/machines/airlockforced.ogg index 8f46a89f..9f2fc486 100644 Binary files a/sound/machines/airlockforced.ogg and b/sound/machines/airlockforced.ogg differ diff --git a/config/title_music/klaytheme.ogg b/sound/music/klaymen.ogg similarity index 98% rename from config/title_music/klaytheme.ogg rename to sound/music/klaymen.ogg index 562e28b2..b8c68a17 100644 Binary files a/config/title_music/klaytheme.ogg and b/sound/music/klaymen.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 641379d1..abff4adf 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -14,6 +14,7 @@ // BEGIN_INCLUDE #include "_maps\_basemap.dm" +#include "_maps\map_files\HyperStation\hyperstation.dmm" #include "code\_compile_options.dm" #include "code\world.dm" #include "code\__DEFINES\_globals.dm" @@ -61,6 +62,7 @@ #include "code\__DEFINES\maps.dm" #include "code\__DEFINES\maths.dm" #include "code\__DEFINES\MC.dm" +#include "code\__DEFINES\mecha.dm" #include "code\__DEFINES\medal.dm" #include "code\__DEFINES\melee.dm" #include "code\__DEFINES\menu.dm" @@ -115,6 +117,7 @@ #include "code\__HELPERS\AStar.dm" #include "code\__HELPERS\cmp.dm" #include "code\__HELPERS\dates.dm" +#include "code\__HELPERS\dna.dm" #include "code\__HELPERS\files.dm" #include "code\__HELPERS\game.dm" #include "code\__HELPERS\global_lists.dm" @@ -468,10 +471,14 @@ #include "code\datums\mood_events\generic_positive_events.dm" #include "code\datums\mood_events\mood_event.dm" #include "code\datums\mood_events\needs_events.dm" +#include "code\datums\mutations\actions.dm" +#include "code\datums\mutations\antenna.dm" #include "code\datums\mutations\body.dm" #include "code\datums\mutations\chameleon.dm" #include "code\datums\mutations\cold_resistance.dm" +#include "code\datums\mutations\combined.dm" #include "code\datums\mutations\hulk.dm" +#include "code\datums\mutations\radioactive.dm" #include "code\datums\mutations\sight.dm" #include "code\datums\mutations\speech.dm" #include "code\datums\mutations\telekinesis.dm" @@ -784,6 +791,7 @@ #include "code\game\objects\items\cardboard_cutouts.dm" #include "code\game\objects\items\cards_ids.dm" #include "code\game\objects\items\charter.dm" +#include "code\game\objects\items\chromosome.dm" #include "code\game\objects\items\chrono_eraser.dm" #include "code\game\objects\items\cigs_lighters.dm" #include "code\game\objects\items\clown_items.dm" @@ -2635,6 +2643,7 @@ #include "code\modules\ruins\spaceruin_code\crashedship.dm" #include "code\modules\ruins\spaceruin_code\deepstorage.dm" #include "code\modules\ruins\spaceruin_code\DJstation.dm" +#include "code\modules\ruins\spaceruin_code\hilbertshotel.dm" #include "code\modules\ruins\spaceruin_code\listeningstation.dm" #include "code\modules\ruins\spaceruin_code\miracle.dm" #include "code\modules\ruins\spaceruin_code\oldstation.dm" @@ -2695,6 +2704,7 @@ #include "code\modules\spells\spell_types\spacetime_distortion.dm" #include "code\modules\spells\spell_types\summonitem.dm" #include "code\modules\spells\spell_types\taeclowndo.dm" +#include "code\modules\spells\spell_types\telepathy.dm" #include "code\modules\spells\spell_types\the_traps.dm" #include "code\modules\spells\spell_types\touch_attacks.dm" #include "code\modules\spells\spell_types\trigger.dm"