diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_shuttlecrash.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_shuttlecrash.dmm new file mode 100644 index 000000000000..1b2c987bc85f --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_shuttlecrash.dmm @@ -0,0 +1,1440 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"bm" = ( +/obj/effect/landmark/burnturf, +/obj/effect/spawner/random_spawners/dirt_maybe, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"bF" = ( +/obj/machinery/door/airlock/public, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"bK" = ( +/obj/machinery/economy/vending/snack, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"cl" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dD" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dS" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/unpowered/misc_lavaruin) +"en" = ( +/obj/effect/landmark/burnturf, +/obj/effect/spawner/random_spawners/dirt_maybe, +/obj/item/reagent_containers/hypospray/autoinjector{ + name = "emergency autoinjector"; + icon_state = "autoinjector0" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"eo" = ( +/obj/structure/table_frame, +/obj/effect/decal/cleanable/ash, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"eG" = ( +/obj/effect/landmark/burnturf, +/obj/effect/decal/cleanable/glass, +/obj/item/stack/rods, +/obj/item/airlock_electronics, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"fU" = ( +/obj/structure/table_frame, +/obj/item/stack/sheet/metal, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"ge" = ( +/obj/effect/landmark/burnturf, +/obj/effect/decal/cleanable/blood, +/obj/item/cigbutt, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"gY" = ( +/obj/machinery/computer/nonfunctional{ + dir = 4 + }, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/unpowered/misc_lavaruin) +"hb" = ( +/obj/effect/spawner/random_spawners/blood_maybe, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"hK" = ( +/turf/simulated/floor/lava/mapping_lava, +/area/lavaland/surface/outdoors) +"hW" = ( +/obj/item/stack/sheet/metal, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface{ + icon_state = "basalt_dug" + }, +/area/lavaland/surface/outdoors) +"jU" = ( +/obj/item/stack/sheet/metal, +/obj/structure/closet/firecloset, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"kk" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"kv" = ( +/obj/effect/landmark/damageturf, +/obj/item/flashlight/flare, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"ma" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mA" = ( +/obj/effect/mob_spawn/human/corpse/skeleton, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"mN" = ( +/obj/effect/spawner/random_spawners/blood_maybe, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface{ + icon_state = "basalt_dug" + }, +/area/lavaland/surface/outdoors) +"ng" = ( +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"nG" = ( +/obj/machinery/door/airlock/public, +/turf/simulated/floor/mineral/titanium/airless, +/area/ruin/unpowered/misc_lavaruin) +"oD" = ( +/obj/effect/spawner/random_spawners/blood_maybe, +/obj/item/storage/briefcase{ + pixel_x = 3; + pixel_y = -5 + }, +/obj/item/storage/briefcase{ + pixel_y = 0; + pixel_x = -3 + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"oF" = ( +/obj/structure/largecrate, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"oV" = ( +/obj/effect/decal/cleanable/generic, +/obj/machinery/light/built, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"qG" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface{ + icon_state = "basalt_dug" + }, +/area/lavaland/surface/outdoors) +"rw" = ( +/turf/simulated/floor/mineral/titanium, +/area/ruin/unpowered/misc_lavaruin) +"rx" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/mob/living/simple_animal/hostile/asteroid/hivelord/legion, +/obj/effect/spawner/random_spawners/dirt_maybe, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"sa" = ( +/obj/effect/landmark/damageturf, +/obj/effect/spawner/random_spawners/blood_maybe, +/obj/effect/decal/cleanable/molten_object, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"sf" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"sx" = ( +/obj/structure/bonfire, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"sJ" = ( +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"sY" = ( +/obj/machinery/light_construct{ + dir = 4 + }, +/obj/item/stack/cable_coil{ + amount = 1 + }, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/unpowered/misc_lavaruin) +"tp" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/spawner/random_spawners/dirt_maybe, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"tH" = ( +/obj/structure/shuttle/engine/heater{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"tN" = ( +/mob/living/simple_animal/hostile/asteroid/hivelord/legion, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"uQ" = ( +/obj/effect/landmark/burnturf, +/obj/effect/spawner/random_spawners/dirt_maybe, +/turf/simulated/floor/mineral/titanium, +/area/ruin/unpowered/misc_lavaruin) +"vA" = ( +/obj/effect/spawner/random_spawners/oil_maybe, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/item/storage/briefcase{ + pixel_x = -2; + pixel_y = -4 + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"wf" = ( +/obj/item/stack/rods, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"wD" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/effect/decal/cleanable/ash, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"xc" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/mob_spawn/human/corpse/skeleton, +/obj/effect/spawner/random_spawners/dirt_maybe, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"xd" = ( +/obj/item/stack/rods, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"xJ" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"yo" = ( +/obj/machinery/light/built{ + dir = 4 + }, +/obj/item/light/tube{ + status = 2 + }, +/obj/effect/decal/cleanable/cobweb2, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/unpowered/misc_lavaruin) +"zo" = ( +/obj/machinery/door/airlock/public, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/unpowered/misc_lavaruin) +"zv" = ( +/obj/machinery/light/built, +/obj/item/light/tube{ + status = 2 + }, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"zG" = ( +/obj/structure/toilet{ + dir = 2 + }, +/turf/simulated/floor/mineral/titanium/airless, +/area/ruin/unpowered/misc_lavaruin) +"zM" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/largecrate, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"zX" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/decal/cleanable/ash, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Aj" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface{ + icon_state = "basalt_dug" + }, +/area/lavaland/surface/outdoors) +"Ax" = ( +/obj/effect/spawner/random_spawners/blood_maybe, +/obj/structure/closet/crate/can, +/obj/item/paper/crumpled, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"AC" = ( +/obj/structure/sink{ + pixel_x = 12; + dir = 4 + }, +/obj/item/mounted/mirror{ + icon_state = "mirror_broke"; + pixel_y = -32 + }, +/turf/simulated/floor/mineral/titanium/airless, +/area/ruin/unpowered/misc_lavaruin) +"AO" = ( +/obj/machinery/economy/vending/cigarette, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"Bf" = ( +/obj/structure/closet/firecloset, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"BX" = ( +/obj/effect/decal/cleanable/glass, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"Ca" = ( +/obj/effect/landmark/burnturf, +/obj/effect/spawner/random_spawners/dirt_maybe, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"Dt" = ( +/obj/effect/spawner/window/shuttle, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"DM" = ( +/obj/item/stack/rods/ten, +/turf/simulated/floor/mineral/titanium, +/area/ruin/unpowered/misc_lavaruin) +"Et" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface{ + icon_state = "basalt_dug" + }, +/area/lavaland/surface/outdoors) +"Fy" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"FO" = ( +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/unpowered/misc_lavaruin) +"FY" = ( +/obj/structure/table, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"Gt" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"HF" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/spawner/random_spawners/dirt_maybe, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"HJ" = ( +/mob/living/simple_animal/hostile/asteroid/hivelord/legion, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"It" = ( +/turf/simulated/wall/mineral/titanium, +/area/ruin/unpowered/misc_lavaruin) +"Iu" = ( +/obj/effect/mob_spawn/human/corpse/skeleton, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface{ + icon_state = "basalt_dug" + }, +/area/lavaland/surface/outdoors) +"IL" = ( +/obj/effect/spawner/random_spawners/blood_maybe, +/obj/structure/window/reinforced, +/obj/item/c_tube, +/obj/item/flashlight, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"IQ" = ( +/obj/item/stack/sheet/metal, +/obj/effect/spawner/random_spawners/dirt_maybe, +/obj/effect/decal/cleanable/ash, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"Ks" = ( +/obj/effect/mob_spawn/human/corpse/skeleton, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"Kx" = ( +/obj/effect/mob_spawn/human/corpse/skeleton, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/unpowered/misc_lavaruin) +"KT" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/mob_spawn/human/corpse/skeleton, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/unpowered/misc_lavaruin) +"LJ" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -32 + }, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"Mb" = ( +/obj/item/shard{ + icon_state = "medium"; + pixel_x = 3; + pixel_y = 7 + }, +/obj/item/shard{ + icon_state = "small"; + pixel_y = -6; + pixel_x = -7 + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"Mf" = ( +/obj/effect/landmark/damageturf, +/turf/simulated/floor/mineral/titanium, +/area/ruin/unpowered/misc_lavaruin) +"My" = ( +/obj/machinery/door/airlock/public, +/obj/effect/landmark/damageturf, +/obj/effect/spawner/random_spawners/oil_maybe, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"MC" = ( +/obj/machinery/economy/vending/wallmed{ + name = "Emergency NanoMed"; + pixel_y = 28 + }, +/obj/machinery/door/window/reinforced/normal{ + name = "Luggage Storage" + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"MS" = ( +/obj/effect/spawner/random_spawners/dirt_maybe, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"NE" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"NG" = ( +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"Oe" = ( +/turf/simulated/wall/mineral/titanium/nodiagonal, +/area/ruin/unpowered/misc_lavaruin) +"Oq" = ( +/obj/effect/landmark/burnturf, +/obj/structure/reagent_dispensers/fueltank, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"Oz" = ( +/obj/effect/landmark/damageturf, +/obj/structure/largecrate, +/obj/structure/window/reinforced, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"OT" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"QD" = ( +/obj/machinery/light{ + dir = 2; + brightness_color = "#FF3232"; + emergency_mode = 1; + fire_mode = 1 + }, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"RH" = ( +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/mineral/titanium, +/area/ruin/unpowered/misc_lavaruin) +"RK" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 2 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface{ + icon_state = "basalt_dug" + }, +/area/lavaland/surface/outdoors) +"RP" = ( +/obj/machinery/door/airlock/public, +/obj/effect/spawner/random_spawners/dirt_maybe, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/misc_lavaruin) +"Sd" = ( +/obj/effect/spawner/random_spawners/dirt_maybe, +/obj/effect/decal/cleanable/ash, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"SH" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface{ + icon_state = "basalt_dug" + }, +/area/lavaland/surface/outdoors) +"Tb" = ( +/obj/effect/landmark/burnturf, +/obj/effect/decal/cleanable/ash, +/obj/item/storage/box/survival, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"Tm" = ( +/obj/effect/decal/cleanable/ash, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"Ts" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/mob_spawn/human/corpse/skeleton, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"TU" = ( +/obj/machinery/light{ + dir = 1; + brightness_color = "#FF3232"; + emergency_mode = 1; + fire_mode = 1 + }, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"Ua" = ( +/obj/structure/table/reinforced, +/obj/item/paper/crumpled, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/unpowered/misc_lavaruin) +"Uw" = ( +/obj/structure/closet/walllocker/emerglocker/north, +/obj/effect/decal/cleanable/cobweb, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"Uz" = ( +/obj/effect/landmark/burnturf, +/turf/simulated/floor/mineral/titanium/blue, +/area/ruin/unpowered/misc_lavaruin) +"UV" = ( +/obj/effect/landmark/burnturf, +/obj/item/stack/rods, +/obj/effect/spawner/random_spawners/dirt_maybe, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"Vs" = ( +/mob/living/simple_animal/hostile/asteroid/hivelord/legion, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"WF" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/molten_object/large, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"WI" = ( +/obj/item/stack/sheet/metal, +/obj/item/light/tube{ + status = 2 + }, +/turf/simulated/floor/mineral/titanium, +/area/ruin/unpowered/misc_lavaruin) +"Yf" = ( +/obj/effect/decal/cleanable/ash, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface{ + icon_state = "basalt_dug" + }, +/area/lavaland/surface/outdoors) +"Yg" = ( +/obj/effect/landmark/damageturf, +/turf/simulated/floor/plating, +/area/ruin/unpowered/misc_lavaruin) +"Yi" = ( +/obj/effect/decal/cleanable/ash, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +"} +(2,1,1) = {" +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +NG +"} +(3,1,1) = {" +NG +NG +NG +NG +NG +NG +dD +Gt +Gt +dD +dD +dD +Gt +Gt +NG +NG +NG +NG +NG +"} +(4,1,1) = {" +NG +NG +NG +NG +NG +NG +dD +Gt +It +Dt +Dt +Dt +It +Gt +NG +NG +NG +NG +NG +"} +(5,1,1) = {" +NG +NG +NG +NG +NG +dD +dD +dD +It +gY +Ua +gY +It +dD +dD +NG +NG +NG +NG +"} +(6,1,1) = {" +NG +NG +NG +NG +NG +dD +dD +dD +Dt +dS +FO +KT +Dt +dD +dD +NG +NG +NG +NG +"} +(7,1,1) = {" +NG +NG +NG +NG +dD +dD +Gt +Gt +Dt +yo +Kx +sY +Dt +Gt +Gt +dD +NG +NG +NG +"} +(8,1,1) = {" +NG +NG +NG +NG +dD +Gt +Gt +It +It +It +zo +It +It +It +Gt +Gt +NG +NG +NG +"} +(9,1,1) = {" +NG +NG +NG +NG +dD +Gt +It +It +fU +Tm +rw +ng +FY +It +It +Gt +NG +NG +NG +"} +(10,1,1) = {" +NG +NG +NG +NG +dD +dD +It +TU +ng +ng +rw +ng +ng +zv +It +dD +dD +NG +NG +"} +(11,1,1) = {" +NG +NG +NG +NG +dD +Gt +Dt +kk +ng +kk +DM +kk +ng +Ts +Dt +dD +dD +NG +NG +"} +(12,1,1) = {" +NG +NG +NG +NG +dD +Gt +Dt +kk +Ks +kk +rw +kk +ng +Ts +Dt +dD +SH +NG +NG +"} +(13,1,1) = {" +NG +NG +NG +dD +Gt +Gt +Dt +kk +ng +Ts +Mf +IQ +ng +kk +Dt +dD +dD +dD +NG +"} +(14,1,1) = {" +NG +NG +Gt +Vs +Gt +Gt +Dt +ng +ng +Ts +Mf +Ts +ng +Ts +Dt +dD +dD +dD +NG +"} +(15,1,1) = {" +NG +NG +Vs +sx +Vs +xJ +OT +rx +MS +xc +Mf +kk +ng +kk +Dt +dD +It +dD +NG +"} +(16,1,1) = {" +Gt +Gt +Gt +Gt +Gt +zX +OT +tp +Sd +HF +sa +bm +Uz +kk +Dt +dD +dD +dD +Fy +"} +(17,1,1) = {" +NG +dD +dD +hK +dD +Gt +Gt +en +Ca +UV +uQ +bm +Uz +ge +Et +SH +dD +It +Gt +"} +(18,1,1) = {" +NG +dD +hK +hK +dD +It +Gt +Aj +Aj +Aj +Aj +hW +Aj +mN +Et +Gt +Gt +Gt +Gt +"} +(19,1,1) = {" +dD +hK +hK +hK +hK +dD +hK +qG +Aj +hW +hK +Iu +hK +Aj +hK +dD +hK +dD +Gt +"} +(20,1,1) = {" +dD +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +Aj +hK +hK +hK +hK +It +"} +(21,1,1) = {" +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +"} +(22,1,1) = {" +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +"} +(23,1,1) = {" +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +hK +"} +(24,1,1) = {" +hK +hK +hK +hK +hK +hK +hK +hK +dD +Mf +dD +hK +xd +Yi +dD +hK +dD +hK +dD +"} +(25,1,1) = {" +hK +dD +hK +dD +Gt +Gt +wf +Gt +Gt +Gt +Gt +wf +Gt +cl +Gt +cl +Gt +Gt +Gt +"} +(26,1,1) = {" +Gt +Gt +Gt +Gt +wf +It +It +bF +It +It +RP +Gt +It +bF +It +It +It +Gt +dD +"} +(27,1,1) = {" +NG +dD +It +Gt +cl +ng +tN +ng +It +Uw +RH +ng +It +ng +ng +tN +It +dD +NG +"} +(28,1,1) = {" +NG +dD +dD +Gt +It +TU +ng +LJ +It +tN +WI +oV +It +NE +sJ +QD +It +dD +NG +"} +(29,1,1) = {" +NG +dD +It +Gt +cl +WF +mA +hb +It +bK +Mf +AO +It +eo +ng +ng +It +dD +NG +"} +(30,1,1) = {" +NG +dD +SH +Gt +wD +HJ +BX +It +It +It +My +It +It +It +Ax +Ks +It +dD +NG +"} +(31,1,1) = {" +It +dD +SH +Aj +It +ng +sJ +It +IL +sf +Yg +Oq +Tb +It +It +nG +It +dD +NG +"} +(32,1,1) = {" +NG +dD +dD +Aj +It +jU +Bf +It +MC +Yg +Yg +Mb +eG +It +zG +AC +It +dD +NG +"} +(33,1,1) = {" +NG +dD +dD +Aj +Oe +It +It +It +Oz +kv +hb +sJ +vA +It +It +It +Oe +dD +NG +"} +(34,1,1) = {" +NG +dD +dD +Gt +Oe +tH +tH +It +oF +zM +zM +zM +oD +It +tH +tH +Oe +dD +NG +"} +(35,1,1) = {" +NG +dD +dD +Gt +Aj +ma +ma +Oe +Oe +It +It +It +Oe +Oe +ma +Aj +Yf +dD +NG +"} +(36,1,1) = {" +NG +NG +dD +dD +SH +Aj +Aj +Oe +tH +tH +tH +tH +tH +Oe +Aj +SH +SH +dD +NG +"} +(37,1,1) = {" +NG +NG +dD +dD +SH +SH +SH +SH +ma +ma +ma +ma +ma +SH +SH +SH +RK +dD +NG +"} +(38,1,1) = {" +NG +NG +dD +dD +dD +SH +SH +dD +dD +dD +dD +dD +dD +dD +SH +SH +SH +dD +NG +"} +(39,1,1) = {" +NG +NG +dD +dD +SH +dD +Yf +SH +dD +SH +SH +SH +dD +SH +dD +SH +SH +NG +NG +"} +(40,1,1) = {" +NG +NG +NG +dD +SH +SH +SH +SH +SH +SH +SH +SH +SH +SH +SH +dD +SH +NG +NG +"} diff --git a/_maps/map_files/RandomZLevels/beach.dmm b/_maps/map_files/RandomZLevels/beach.dmm deleted file mode 100644 index ccfb284c8eac..000000000000 --- a/_maps/map_files/RandomZLevels/beach.dmm +++ /dev/null @@ -1,5436 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/space, -/area/space) -"bc" = ( -/obj/structure/flora/ausbushes/leafybush, -/obj/effect/decal/snow/sand/edge{ - dir = 9; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bd" = ( -/obj/structure/flora/grass/brown, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"be" = ( -/obj/effect/decal/snow/sand/edge{ - dir = 5; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bf" = ( -/obj/structure/flora/ausbushes/genericbush, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bg" = ( -/obj/effect/decal/snow/sand/edge{ - dir = 8; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bh" = ( -/obj/structure/flora/ausbushes/leafybush, -/obj/effect/decal/snow/sand/edge{ - dir = 4; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bi" = ( -/obj/effect/decal/snow/sand/edge{ - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bj" = ( -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bk" = ( -/obj/effect/decal/snow/sand/surround{ - dir = 1; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bl" = ( -/obj/effect/decal/snow/sand/edge{ - dir = 4; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bm" = ( -/obj/effect/decal/snow/sand/edge{ - dir = 9; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bn" = ( -/obj/effect/decal/snow/sand/edge{ - name = "rough sand" - }, -/turf/simulated/floor/grass, -/area/awaymission/beach) -"bo" = ( -/obj/effect/decal/snow/sand/edge{ - dir = 10; - name = "rough sand" - }, -/turf/simulated/floor/grass, -/area/awaymission/beach) -"bp" = ( -/obj/effect/decal/snow/sand/surround{ - name = "rough sand" - }, -/turf/simulated/floor/grass, -/area/awaymission/beach) -"bq" = ( -/obj/effect/decal/snow/sand/edge{ - dir = 6; - name = "rough sand" - }, -/turf/simulated/floor/grass, -/area/awaymission/beach) -"br" = ( -/obj/effect/decal/snow/sand/edge{ - dir = 6; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bs" = ( -/obj/effect/decal/snow/sand/edge{ - dir = 10; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bt" = ( -/obj/structure/flora/ausbushes/lavendergrass, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bu" = ( -/obj/structure/flora/ausbushes/leafybush, -/obj/effect/decal/snow/sand/edge{ - dir = 9; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"bv" = ( -/obj/effect/decal/snow/sand/edge{ - dir = 5; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"bw" = ( -/obj/effect/overlay/palmtree_r, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"bx" = ( -/obj/effect/overlay/palmtree_r, -/obj/effect/decal/snow/sand/edge{ - dir = 9; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"by" = ( -/obj/effect/decal/snow/sand/edge{ - dir = 1; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bz" = ( -/obj/effect/overlay/palmtree_r, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bA" = ( -/obj/structure/flora/ausbushes/genericbush, -/obj/effect/decal/snow/sand/edge{ - dir = 1; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bB" = ( -/obj/effect/overlay/palmtree_r, -/obj/effect/decal/snow/sand/edge{ - dir = 1; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bC" = ( -/obj/effect/overlay/palmtree_r, -/obj/effect/decal/snow/sand/edge{ - dir = 4; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bD" = ( -/obj/effect/overlay/palmtree_r, -/obj/effect/overlay/coconut, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bE" = ( -/obj/structure/flora/bush, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bF" = ( -/obj/effect/overlay/palmtree_l, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bG" = ( -/obj/structure/flora/ausbushes/sunnybush, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"bH" = ( -/obj/effect/overlay/palmtree_r, -/obj/effect/decal/snow/sand/edge{ - dir = 8; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bI" = ( -/obj/effect/decal/snow/sand/edge{ - dir = 4; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"bJ" = ( -/obj/effect/overlay/palmtree_l, -/obj/effect/decal/snow/sand/edge{ - dir = 1; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bK" = ( -/obj/effect/overlay/palmtree_l, -/obj/effect/overlay/coconut, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bL" = ( -/obj/structure/flora/ausbushes/sunnybush, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bM" = ( -/obj/structure/flora/ausbushes/sunnybush, -/obj/effect/decal/snow/sand/edge{ - dir = 1; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bN" = ( -/obj/structure/flora/ausbushes/leafybush, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bO" = ( -/obj/structure/flora/grass/brown, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bP" = ( -/obj/structure/flora/rock/pile, -/obj/effect/overlay/palmtree_l, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bQ" = ( -/obj/structure/flora/ausbushes/grassybush, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bR" = ( -/obj/structure/flora/ausbushes/reedbush, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bS" = ( -/obj/structure/flora/grass/green, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"bT" = ( -/obj/structure/flora/rock/pile, -/obj/structure/flora/ausbushes/palebush, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"bU" = ( -/obj/structure/flora/rock/pile, -/obj/structure/flora/ausbushes/genericbush, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"bV" = ( -/obj/structure/flora/rock/pile, -/obj/structure/flora/ausbushes/sunnybush, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"bW" = ( -/obj/structure/flora/rock/pile, -/obj/structure/flora/ausbushes/leafybush, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"bX" = ( -/obj/structure/flora/rock, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"bY" = ( -/obj/structure/flora/ausbushes/palebush, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"bZ" = ( -/obj/structure/flora/rock/pile, -/obj/structure/flora/ausbushes/lavendergrass, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"ca" = ( -/obj/structure/flora/rock/pile, -/obj/effect/overlay/palmtree_r, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"cb" = ( -/obj/structure/flora/rock/pile, -/obj/effect/overlay/palmtree_l, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"cc" = ( -/obj/structure/flora/rock/pile, -/obj/structure/flora/ausbushes/fernybush, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"cd" = ( -/obj/structure/flora/rock/pile, -/obj/structure/flora/ausbushes/sunnybush, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"ce" = ( -/obj/structure/flora/rock/pile, -/obj/structure/flora/ausbushes/leafybush, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"cf" = ( -/obj/structure/flora/rock/pile, -/obj/structure/flora/ausbushes/fernybush, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"cg" = ( -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"ch" = ( -/obj/structure/flora/rock, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"ci" = ( -/obj/effect/overlay/palmtree_r, -/obj/effect/overlay/coconut, -/obj/effect/decal/snow/sand/edge{ - dir = 1; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"cm" = ( -/obj/structure/flora/rock/pile, -/obj/structure/flora/ausbushes/palebush, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"cq" = ( -/obj/effect/decal/snow/sand/edge{ - name = "rough sand" - }, -/obj/structure/closet/crate/internals, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"cr" = ( -/obj/effect/decal/snow/sand/edge{ - name = "rough sand" - }, -/obj/structure/dispenser/oxygen, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"cs" = ( -/obj/structure/flora/ausbushes/reedbush, -/obj/effect/decal/snow/sand/edge{ - dir = 5; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"ct" = ( -/obj/effect/overlay/palmtree_r, -/obj/effect/overlay/coconut, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"cu" = ( -/obj/structure/flora/ausbushes/lavendergrass, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"cv" = ( -/obj/structure/flora/bush, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"cx" = ( -/obj/structure/flora/ausbushes/genericbush, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"cB" = ( -/obj/effect/decal/snow/sand/edge{ - dir = 4; - name = "rough sand" - }, -/obj/effect/overlay/palmtree_r, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"cC" = ( -/obj/structure/flora/ausbushes/leafybush, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"cE" = ( -/turf/simulated/wall/mineral/sandstone, -/area/awaymission/beach) -"cG" = ( -/obj/structure/flora/ausbushes/ppflowers, -/obj/effect/decal/snow/sand/edge{ - dir = 8; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"cJ" = ( -/obj/effect/decal/snow/sand/edge{ - dir = 4; - name = "rough sand" - }, -/obj/structure/closet/athletic_mixed, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"cK" = ( -/obj/effect/decal/snow/sand/edge{ - dir = 8; - name = "rough sand" - }, -/obj/effect/overlay/palmtree_l, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"cL" = ( -/obj/structure/mineral_door/wood, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"cN" = ( -/obj/effect/decal/snow/sand/edge{ - dir = 4; - name = "rough sand" - }, -/obj/item/clothing/shoes/sandal, -/obj/item/clothing/shoes/sandal, -/obj/item/clothing/shoes/sandal, -/obj/structure/closet/crate, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"cO" = ( -/obj/structure/chair/stool, -/turf/simulated/floor/wood, -/area/awaymission/beach) -"cQ" = ( -/turf/simulated/wall/mineral/titanium, -/area/awaymission/beach) -"cS" = ( -/obj/structure/closet/gmcloset{ - name = "formal wardrobe" - }, -/turf/simulated/floor/wood, -/area/awaymission/beach) -"cT" = ( -/obj/structure/closet/crate, -/obj/item/gun/energy/laser/retro, -/obj/item/gun/energy/laser/retro, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"cU" = ( -/obj/structure/closet/secure_closet/bar, -/turf/simulated/floor/wood, -/area/awaymission/beach) -"cV" = ( -/obj/structure/table/wood, -/turf/simulated/floor/wood, -/area/awaymission/beach) -"cW" = ( -/obj/structure/table/wood, -/obj/item/book/manual/barman_recipes, -/turf/simulated/floor/wood, -/area/awaymission/beach) -"cX" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/drinks/shaker, -/turf/simulated/floor/wood, -/area/awaymission/beach) -"cY" = ( -/obj/structure/flora/rock/pile, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"cZ" = ( -/obj/machinery/economy/vending/boozeomat{ - emagged = 1 - }, -/turf/simulated/floor/wood, -/area/awaymission/beach) -"da" = ( -/obj/structure/table/wood, -/obj/item/clothing/glasses/sunglasses, -/turf/simulated/floor/wood, -/area/awaymission/beach) -"db" = ( -/obj/machinery/economy/vending/cola, -/turf/simulated/floor/wood, -/area/awaymission/beach) -"dc" = ( -/obj/structure/flora/ausbushes/palebush, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"dd" = ( -/mob/living/simple_animal/crab, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"de" = ( -/obj/effect/overlay/coconut, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"df" = ( -/mob/living/simple_animal/crab/Coffee, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"dg" = ( -/obj/structure/chair, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"dh" = ( -/obj/structure/flora/ausbushes/reedbush, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"di" = ( -/obj/structure/flora/rock/pile, -/obj/structure/flora/ausbushes/stalkybush, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"dj" = ( -/turf/simulated/floor/beach/away/coastline, -/area/awaymission/beach) -"dk" = ( -/turf/simulated/floor/beach/away/coastline/dense, -/area/awaymission/beach) -"dl" = ( -/obj/machinery/economy/vending/cigarette, -/turf/simulated/floor/wood, -/area/awaymission/beach) -"dm" = ( -/obj/machinery/economy/vending/snack, -/turf/simulated/floor/wood, -/area/awaymission/beach) -"dn" = ( -/obj/structure/curtain/open, -/turf/simulated/floor/wood, -/area/awaymission/beach) -"do" = ( -/obj/effect/decal/snow/sand/edge{ - dir = 1; - name = "rough sand" - }, -/obj/structure/flora/ausbushes/sunnybush, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"dq" = ( -/turf/simulated/floor/wood, -/area/awaymission/beach) -"dr" = ( -/turf/simulated/floor/beach/away/water, -/area/awaymission/beach) -"ds" = ( -/turf/simulated/floor/beach/away/water/dense, -/area/awaymission/beach) -"dt" = ( -/turf/simulated/floor/beach/away/water/drop, -/area/awaymission/beach) -"du" = ( -/turf/simulated/floor/beach/away/water/deep, -/area/awaymission/beach) -"dw" = ( -/turf/simulated/floor/beach/away/water/deep/dense, -/area/awaymission/beach) -"dx" = ( -/turf/simulated/floor/beach/away/water/drop/dense, -/area/awaymission/beach) -"dy" = ( -/turf/simulated/floor/beach/away/water/edge_drop, -/area/awaymission/beach) -"dz" = ( -/obj/effect/overlay/palmtree_r, -/obj/effect/decal/snow/sand/edge{ - dir = 10; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"dA" = ( -/obj/structure/mineral_door/wood, -/turf/simulated/floor/wood, -/area/awaymission/beach) -"dB" = ( -/obj/structure/flora/grass/green, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"dC" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/soda, -/turf/simulated/floor/wood, -/area/awaymission/beach) -"dE" = ( -/obj/effect/decal/snow/sand/edge{ - name = "rough sand" - }, -/obj/structure/flora/ausbushes/leafybush, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"dF" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/beer, -/turf/simulated/floor/wood, -/area/awaymission/beach) -"dG" = ( -/obj/structure/flora/grass/green, -/obj/structure/flora/ausbushes/leafybush, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"dH" = ( -/obj/effect/decal/snow/sand/edge{ - dir = 1; - name = "rough sand" - }, -/obj/structure/chair/stool/bar, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"dI" = ( -/obj/structure/table/wood, -/obj/item/clothing/glasses/eyepatch, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"dJ" = ( -/obj/structure/table/wood, -/obj/item/clothing/head/bandana, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"dK" = ( -/obj/item/ship_in_a_bottle, -/obj/structure/table/wood, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"dL" = ( -/mob/living/simple_animal/hostile/pirate/ranged{ - loot = list(/obj/effect/mob_spawn/human/corpse/pirate/ranged) - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"dM" = ( -/obj/structure/table/wood, -/obj/item/clothing/head/collectable/pirate, -/obj/item/stack/sheet/mineral/diamond{ - amount = 2 - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"dN" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/mineral/uranium{ - amount = 20 - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"dO" = ( -/obj/structure/chair/office/light, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"dP" = ( -/obj/effect/overlay/palmtree_r, -/obj/effect/decal/snow/sand/edge{ - dir = 6; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"dQ" = ( -/obj/structure/chair/office/light, -/mob/living/simple_animal/hostile/pirate/ranged{ - loot = list(/obj/effect/mob_spawn/human/corpse/pirate/ranged) - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"dR" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/turf/simulated/floor/mineral/titanium/blue, -/area/awaymission/beach) -"dS" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/turf/simulated/floor/mineral/titanium/blue, -/area/awaymission/beach) -"dT" = ( -/obj/effect/overlay/palmtree_l, -/obj/effect/decal/snow/sand/edge{ - dir = 8; - name = "rough sand" - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"dU" = ( -/obj/effect/spawner/window/shuttle, -/turf/simulated/floor/plating, -/area/awaymission/beach) -"dV" = ( -/obj/structure/flora/rock, -/obj/structure/flora/ausbushes/leafybush, -/turf/simulated/floor/beach/away/sand/dense, -/area/awaymission/beach) -"dX" = ( -/obj/item/paper, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"dZ" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/turf/simulated/floor/mineral/titanium/blue, -/area/awaymission/beach) -"eb" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/turf/simulated/floor/mineral/titanium/blue, -/area/awaymission/beach) -"ec" = ( -/obj/machinery/computer/nonfunctional, -/turf/simulated/floor/mineral/titanium/blue, -/area/awaymission/beach) -"ed" = ( -/obj/structure/closet/crate, -/obj/item/clothing/under/costume/pirate, -/obj/item/clothing/under/costume/pirate, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"ee" = ( -/obj/structure/closet/crate, -/obj/item/clothing/suit/pirate_brown, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"ef" = ( -/obj/effect/overlay/palmtree_r, -/obj/structure/flora/ausbushes/sunnybush, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"eg" = ( -/mob/living/simple_animal/hostile/pirate{ - loot = list(/obj/effect/mob_spawn/human/corpse/pirate) - }, -/turf/simulated/floor/mineral/titanium/blue, -/area/awaymission/beach) -"eh" = ( -/turf/simulated/floor/mineral/titanium/blue, -/area/awaymission/beach) -"ei" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/simulated/floor/mineral/titanium/blue, -/area/awaymission/beach) -"ej" = ( -/obj/structure/table/wood, -/obj/item/clothing/suit/pirate_black, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"ek" = ( -/obj/effect/decal/snow/sand/edge{ - name = "rough sand" - }, -/obj/structure/flora/ausbushes/sunnybush, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"el" = ( -/obj/machinery/door/airlock/titanium, -/turf/simulated/floor/mineral/titanium/blue, -/area/awaymission/beach) -"em" = ( -/obj/item/beach_ball, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"en" = ( -/mob/living/simple_animal/hostile/pirate{ - loot = list(/obj/effect/mob_spawn/human/corpse/pirate) - }, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"eo" = ( -/obj/effect/waterfall{ - dir = 1; - water_frequency = 75 - }, -/turf/simulated/floor/beach/away/coastline, -/area/awaymission/beach) -"ep" = ( -/obj/effect/decal/cleanable/blood, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"eq" = ( -/obj/effect/waterfall{ - dir = 1; - water_frequency = 192 - }, -/turf/simulated/floor/beach/away/coastline, -/area/awaymission/beach) -"er" = ( -/obj/effect/waterfall{ - dir = 1; - water_frequency = 104 - }, -/turf/simulated/floor/beach/away/coastline, -/area/awaymission/beach) -"es" = ( -/obj/structure/chair/stool, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"et" = ( -/obj/structure/shuttle/engine/heater, -/turf/simulated/floor/plating, -/area/awaymission/beach) -"eu" = ( -/obj/structure/table/wood, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"ev" = ( -/obj/structure/table/wood, -/obj/item/food/snacks/pie, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"ew" = ( -/obj/effect/waterfall{ - dir = 1; - water_frequency = 44 - }, -/turf/simulated/floor/beach/away/coastline, -/area/awaymission/beach) -"ex" = ( -/obj/structure/shuttle/engine/propulsion{ - icon_state = "propulsion_l" - }, -/turf/simulated/floor/plating, -/area/awaymission/beach) -"ey" = ( -/obj/effect/waterfall{ - dir = 1; - water_frequency = 97 - }, -/turf/simulated/floor/beach/away/coastline, -/area/awaymission/beach) -"ez" = ( -/obj/structure/shuttle/engine/propulsion{ - icon_state = "propulsion_r" - }, -/turf/simulated/floor/plating, -/area/awaymission/beach) -"eA" = ( -/obj/structure/shuttle/engine/propulsion, -/turf/simulated/floor/plating, -/area/awaymission/beach) -"eB" = ( -/obj/effect/waterfall{ - dir = 1; - water_frequency = 94 - }, -/turf/simulated/floor/beach/away/coastline, -/area/awaymission/beach) -"eC" = ( -/obj/structure/table/wood, -/obj/effect/decal/cleanable/blood, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"eD" = ( -/obj/structure/closet/crate/can, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"eE" = ( -/obj/structure/closet/crate, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"kX" = ( -/turf/simulated/wall/indestructible/sandstone, -/area/awaymission/beach) -"nL" = ( -/turf/simulated/wall/indestructible/sandstone, -/area/space) -"sF" = ( -/obj/effect/baseturf_helper/beach/away/sand, -/turf/simulated/floor/beach/away/sand, -/area/awaymission/beach) -"LZ" = ( -/obj/machinery/poolcontroller/invisible, -/turf/simulated/floor/beach/away/water/deep, -/area/awaymission/beach) - -(1,1,1) = {" -nL -cg -cg -bw -cu -dh -cg -bw -cg -bw -by -bS -bj -bF -dz -dB -dh -cg -bB -bj -bF -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dy -du -du -du -du -du -"} -(2,1,1) = {" -nL -cg -bw -bx -bH -bg -bH -bg -bH -cG -bj -bz -bR -bj -bz -bg -bg -dT -bD -bj -bE -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dt -du -du -du -du -du -"} -(3,1,1) = {" -nL -bX -cg -bJ -bj -bD -bj -bz -bz -bj -bj -bD -bj -bN -bQ -bO -bz -bz -bj -bD -bF -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dt -du -du -du -du -du -"} -(4,1,1) = {" -nL -bd -bm -bj -bD -bj -bK -bD -bj -bz -bQ -bj -bz -bN -bF -bj -bK -bj -bz -bj -bz -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dt -du -du -du -du -du -"} -(5,1,1) = {" -nL -bc -bt -bj -bz -bD -bj -bS -bj -bz -bj -bF -bj -bz -bz -bj -bz -bj -bz -bj -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dt -du -du -du -du -du -"} -(6,1,1) = {" -nL -be -bl -bD -bE -bj -bz -bf -bj -bL -cm -ch -bj -bL -bj -bf -bf -bj -dc -bL -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dt -du -du -du -du -du -"} -(7,1,1) = {" -nL -cg -bw -by -bz -bN -bf -bT -bX -bW -bV -bX -bW -bV -bW -cc -bX -bW -bX -bV -bW -dh -dk -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -dt -du -du -du -du -du -"} -(8,1,1) = {" -nL -cg -bw -bB -bj -bt -bj -bU -cd -bj -bj -bj -bj -bj -bj -cd -cY -bj -bj -bj -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(9,1,1) = {" -nL -cg -bw -bB -bF -bz -bN -bV -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -eo -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(10,1,1) = {" -nL -cg -bx -bj -bz -bz -bj -bW -bj -bj -bj -bj -bj -bj -bj -bz -bj -bj -bj -bj -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(11,1,1) = {" -nL -bg -bj -bE -bj -bD -bL -bX -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -dd -bj -em -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(12,1,1) = {" -nL -bf -bj -bz -bz -bj -bz -bU -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(13,1,1) = {" -nL -bh -bj -bz -bz -bj -bj -bV -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -eq -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(14,1,1) = {" -nL -cg -bA -bD -bt -bE -bf -bW -bj -bj -bj -bj -sF -bj -bj -bj -bj -bj -bj -bF -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(15,1,1) = {" -nL -bX -by -bF -bj -bz -bj -bT -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -de -bj -bj -er -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(16,1,1) = {" -nL -cg -bB -bj -bF -bF -bf -bU -bj -bj -bK -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(17,1,1) = {" -nL -cg -bB -bj -bz -bz -bz -bX -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(18,1,1) = {" -nL -cg -by -bE -bj -bj -bj -bY -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -dd -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(19,1,1) = {" -nL -bk -bj -bz -bj -bt -bj -bV -bj -bj -bj -bl -bl -bl -bl -bl -bj -bj -bj -bj -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(20,1,1) = {" -nL -cg -by -bz -bD -bj -bN -bW -bj -bj -bi -cE -cE -cE -dA -cE -by -bj -bj -bj -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(21,1,1) = {" -nL -bg -bC -bj -bF -bF -bj -bT -bj -bj -bi -cE -cS -dq -dq -dC -dH -bj -bj -bj -dg -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(22,1,1) = {" -nL -bi -bw -by -bj -bF -bj -bV -bj -bj -cq -cE -cU -dq -dq -dF -dH -bj -bj -bj -bj -bj -ew -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(23,1,1) = {" -nL -bj -bg -bz -bF -bK -bL -bX -bj -bj -cr -cE -cW -dq -dq -cV -dH -bj -bj -bj -dg -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(24,1,1) = {" -nL -bj -bj -bj -bz -bD -bj -bW -bj -bj -cq -cE -cX -dq -dq -cV -dH -bj -bj -bj -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(25,1,1) = {" -nL -bl -bz -bE -bj -bj -bj -bV -bj -bj -bi -cE -cV -dq -dq -cV -dH -bj -bj -bj -dg -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(26,1,1) = {" -nL -cg -bB -bj -bz -bj -bP -bX -bj -bj -bi -cE -da -dq -dq -cV -dH -bj -bj -bj -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(27,1,1) = {" -nL -cg -by -bj -bj -bz -bj -bT -bj -bj -bi -cE -cZ -dq -dq -cV -dH -bj -bj -bj -dg -bj -ey -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(28,1,1) = {" -nL -bm -bz -bz -bK -bj -bL -bZ -ce -bj -bi -cE -dl -dq -dq -cV -dH -bj -bj -bj -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -dt -du -du -du -du -"} -(29,1,1) = {" -nL -bj -bj -bz -bj -bK -bj -ca -bj -bj -bi -cE -db -dq -dq -cV -dH -bj -bj -bj -dg -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dt -dx -dt -du -du -dt -dt -du -"} -(30,1,1) = {" -nL -bl -bl -bF -bj -bz -bj -bX -cf -bj -bi -cE -dm -dq -dq -cV -dH -bj -bj -bF -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dt -dt -dw -du -du -du -du -dt -du -"} -(31,1,1) = {" -nL -cg -bw -by -bE -bj -bQ -bT -cd -bj -bi -cE -cE -cE -cE -cE -by -bj -bj -bj -dg -bj -er -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dt -du -dw -du -du -du -du -dt -du -"} -(32,1,1) = {" -nL -cg -cg -bJ -bj -bD -bj -cb -bj -bj -bj -bg -bg -bg -bg -bg -bj -bj -bj -bj -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dt -du -dw -du -du -du -du -dt -du -"} -(33,1,1) = {" -nL -cg -cg -by -bj -bF -bf -bV -bj -bj -cJ -cN -bl -bj -bj -bj -bj -bj -bj -bj -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dt -dt -dw -du -du -dt -du -du -du -"} -(34,1,1) = {" -nL -cg -bw -by -bD -bL -bj -cc -bj -bi -cE -cE -cE -by -bj -bj -bj -bj -bj -bj -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dt -dx -du -du -du -du -du -du -"} -(35,1,1) = {" -nL -cg -bX -by -bz -bj -bN -bX -bj -bi -cE -cO -dn -by -bj -bF -bj -bj -bj -bj -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dx -dt -du -du -du -du -du -"} -(36,1,1) = {" -nL -bo -bd -bB -bE -bz -bj -bW -bj -bi -cE -cE -cE -by -bj -bj -bj -bj -bj -df -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(37,1,1) = {" -nL -bn -cg -bM -bj -bj -bN -ca -bj -bj -bg -bg -bg -bj -bj -bj -bj -bj -bj -bj -bj -bj -ey -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(38,1,1) = {" -nL -bn -cg -ci -bf -bL -bj -cc -bj -bj -cJ -cN -bl -bj -bj -em -bj -bj -bj -bj -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(39,1,1) = {" -nL -bq -bw -by -bj -bz -bf -bX -bj -bi -cE -cE -cE -by -bj -bj -bj -bj -bz -bj -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(40,1,1) = {" -nL -cg -bG -by -bz -bj -bj -bT -bj -bi -cE -cO -dn -by -bj -bj -bj -bj -bj -de -bj -bj -eB -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(41,1,1) = {" -nL -bp -cg -by -bL -bj -bN -bV -bj -bi -cE -cE -cE -by -bF -bj -bj -bj -bj -bj -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(42,1,1) = {" -nL -cg -cg -bB -bj -bz -bj -bW -bj -bj -bg -bg -bg -bj -bj -bj -bj -bj -bj -bj -dg -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(43,1,1) = {" -nL -cg -cg -bB -bj -bD -bj -cc -bj -bj -cJ -cN -bl -bj -bj -bj -bj -bj -bj -bj -bj -bj -ey -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(44,1,1) = {" -nL -bg -bH -bj -bz -bz -bL -bX -bj -bi -cE -cE -cE -by -bj -bj -bj -bj -bj -bj -dg -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(45,1,1) = {" -nL -bj -bj -bj -bz -bj -bR -cb -bf -bi -cE -cO -dn -by -bj -bj -bj -bj -bj -bj -bj -bj -eq -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(46,1,1) = {" -nL -bj -bl -bC -bj -bz -bf -bX -bz -bi -cE -cE -cE -by -bj -bj -bj -bj -bj -bz -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(47,1,1) = {" -nL -br -bw -cg -by -bj -bN -bT -cf -bj -cK -bg -bg -bj -bj -bj -bj -bj -bj -bj -bj -bz -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -ds -dt -du -du -du -du -du -"} -(48,1,1) = {" -nL -cg -bX -cg -bB -bL -bj -ca -cg -bW -bV -bW -bX -cc -bV -bW -bX -cc -bV -bX -bW -di -dk -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -dt -du -du -du -du -du -"} -(49,1,1) = {" -nL -cg -cg -cg -ci -bE -bj -bj -ch -bD -bf -ch -bL -bj -bz -bf -bz -bL -bz -bj -bN -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dt -du -du -du -du -du -"} -(50,1,1) = {" -nL -cg -cg -bx -bz -bj -bL -bL -bj -bj -bz -bz -bQ -bj -bz -bj -bR -bj -bK -bE -bj -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dt -du -du -du -du -du -"} -(51,1,1) = {" -nL -bs -cg -by -bj -bz -bj -bz -bK -bj -bz -bO -bK -bL -bj -bz -bj -bO -bz -bS -bz -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dt -du -du -du -du -du -"} -(52,1,1) = {" -nL -br -bw -cs -bj -bj -bj -bR -cB -bl -bl -bl -bz -bz -bz -bj -bD -bj -bD -bj -bz -bj -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dt -du -du -du -du -du -"} -(53,1,1) = {" -nL -cg -cg -cg -bB -bO -bj -bi -bw -bw -cv -cg -bJ -bR -bj -bl -dP -bG -be -bz -bS -bz -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dt -du -du -du -du -du -"} -(54,1,1) = {" -nL -cg -cg -cg -by -bj -bz -dE -cC -bX -bG -cC -do -ef -ek -dG -cC -bw -dV -bD -bj -bz -dj -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dr -dy -du -du -du -du -LZ -"} -(55,1,1) = {" -nL -cg -bw -by -bE -bj -bQ -bT -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -be -bC -bF -bJ -bj -bD -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -"} -(56,1,1) = {" -nL -cg -cg -bJ -bj -bD -bj -cb -bj -bj -bj -cQ -cQ -cQ -el -el -cQ -cQ -cQ -bj -bj -cb -by -bj -bF -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(57,1,1) = {" -nL -cg -cg -by -bj -bF -bf -bV -bj -bj -bj -cQ -dZ -eg -eh -eh -dR -et -ex -bj -bf -bV -by -bD -bL -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(58,1,1) = {" -nL -cg -bw -by -bD -bL -bj -cc -bj -bj -bj -dU -ec -ei -eh -eh -eh -et -eA -bj -bj -cc -by -bz -bj -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(59,1,1) = {" -nL -cg -bX -by -bz -bj -bN -bX -bj -bj -bj -cQ -eb -eh -eh -eh -dS -et -ez -bj -bN -bX -bB -bE -bz -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(60,1,1) = {" -nL -bo -bd -bB -bE -bz -bj -bW -bj -bj -bj -cQ -cQ -cQ -el -el -cQ -cQ -cQ -bj -bj -bW -bM -bj -bj -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(61,1,1) = {" -nL -bn -cg -bM -bj -bj -bN -ca -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bN -ca -ci -bf -bL -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(62,1,1) = {" -nL -bn -cg -ci -bf -bL -bj -cc -cE -cE -cE -cE -cE -cE -bj -bj -bj -bj -bj -bj -bj -cc -by -bj -bz -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(63,1,1) = {" -nL -bq -bw -by -bj -bz -bf -bX -cE -dr -dr -dr -dr -dr -bj -bj -bj -bj -bj -bj -bf -bX -by -bz -bj -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(64,1,1) = {" -nL -cg -bG -by -bz -bj -bj -bT -cE -dr -dr -dr -dr -dr -bj -ep -bj -es -es -bj -bj -bT -by -bL -bj -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(65,1,1) = {" -nL -bp -cg -by -bL -bj -bN -bV -cE -dr -dr -dr -dr -dr -dL -bj -es -eu -eu -bj -bN -bV -bB -bj -bz -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(66,1,1) = {" -nL -cg -cg -bB -bj -bz -bj -bW -cE -dr -dr -dr -dr -dr -dX -bj -es -ev -eC -bj -bj -bW -bB -bj -bD -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(67,1,1) = {" -nL -cg -cg -bB -bj -bD -bj -cc -cE -dr -dr -dr -dr -dr -bj -bj -bj -es -es -bj -bj -cc -bj -bz -bz -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(68,1,1) = {" -nL -bg -bH -bj -bz -bz -bL -bX -cE -cE -cE -cE -cE -cE -bj -bj -bj -ep -bj -bj -bL -bX -bj -bz -bj -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(69,1,1) = {" -nL -bj -bj -bj -bz -bj -bR -cb -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bR -cb -bC -bj -bz -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(70,1,1) = {" -nL -bj -bl -bC -bj -bz -bf -bX -kX -kX -kX -kX -kX -kX -kX -kX -kX -cL -cL -kX -bf -bX -cg -by -bj -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(71,1,1) = {" -nL -br -bw -cg -by -bj -bN -bT -kX -dI -dO -kX -bj -dL -bj -cL -bj -bj -bj -kX -bN -bT -cg -bB -bL -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(72,1,1) = {" -nL -cg -bX -cg -bB -bL -bj -ca -kX -dK -bj -kX -bj -bj -bj -kX -bj -bj -bj -kX -bj -ca -cg -ci -bE -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(73,1,1) = {" -nL -cg -cg -cg -ci -bE -bj -bj -kX -dJ -bj -kX -ed -bj -bj -kX -bj -en -bj -kX -bj -bj -bx -bz -bj -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(74,1,1) = {" -nL -cg -cg -bx -bz -bj -bL -bL -kX -bj -bj -kX -ee -bj -bj -cL -bj -bj -bj -kX -bL -bL -by -bj -bz -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(75,1,1) = {" -nL -bs -cg -by -bj -bz -bj -bz -kX -kX -cL -kX -kX -kX -kX -kX -kX -bj -bj -kX -bj -bz -bJ -bj -bD -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(76,1,1) = {" -nL -bX -cg -bJ -bj -bD -bj -bz -kX -dL -bj -bj -cL -bj -bj -bj -bj -bj -bj -kX -bj -bz -bj -bD -bj -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(77,1,1) = {" -nL -bd -bm -bj -bD -bj -bK -bj -kX -bj -bj -bj -cL -bj -en -bj -bj -bj -bj -kX -bK -bj -bJ -bj -bD -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(78,1,1) = {" -nL -bX -cg -bJ -bj -bD -bj -bz -kX -dL -bj -bj -cL -bj -bj -bj -bj -bj -bj -kX -bj -bz -bj -bD -bj -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(79,1,1) = {" -nL -bd -bm -bj -bD -bj -bK -bD -kX -kX -kX -cL -kX -kX -kX -kX -kX -bj -bj -kX -bK -bD -bj -bz -bD -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(80,1,1) = {" -nL -bc -bt -bj -bz -bD -bj -bS -kX -dN -bj -bj -kX -ej -bj -bj -cL -bj -bj -eE -bf -bX -bj -bD -bj -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(81,1,1) = {" -nL -be -bl -bD -bE -bj -bz -bf -kX -dM -dQ -cT -kX -bj -dL -bj -cL -bj -bj -eD -bN -bT -bD -bj -bD -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(82,1,1) = {" -nL -cg -bw -by -bz -bN -bf -bT -kX -kX -kX -kX -kX -kX -kX -kX -kX -kX -kX -kX -bj -ca -bj -bD -bj -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(83,1,1) = {" -nL -cg -cg -bw -cu -dh -cg -bw -cg -bw -by -bS -bj -bF -dz -dB -dh -cg -bB -bj -bF -bj -bD -bj -bD -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(84,1,1) = {" -nL -cg -bw -bx -bH -bg -bH -bg -bH -cG -bj -bz -bR -bj -bz -bg -bg -dT -bD -bj -bE -bj -bz -bD -bj -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(85,1,1) = {" -nL -bX -cg -bJ -bj -bD -bj -bz -bz -bj -bj -bD -bj -bN -bQ -bO -bz -bz -bj -bD -bF -bj -by -bz -bD -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(86,1,1) = {" -nL -bd -bm -bj -bD -bj -bK -bD -bj -bz -bQ -bj -bz -bN -bF -bj -bK -bj -bz -bj -bz -bj -bB -by -bj -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(87,1,1) = {" -nL -bu -bt -bj -bz -bD -bj -bS -bj -bz -bj -bF -bj -bz -bz -bj -bz -bj -bz -bj -bj -bj -ci -bB -bL -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(88,1,1) = {" -nL -bv -bI -ct -cv -bj -bw -cx -bj -bG -bT -ch -cg -bG -cg -cx -bf -cg -dc -bL -cg -cg -cg -ci -bE -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(89,1,1) = {" -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -nL -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} diff --git a/_maps/map_files/generic/centcomm.dmm b/_maps/map_files/generic/centcomm.dmm index a5a7a216fc88..21d26a44f026 100644 --- a/_maps/map_files/generic/centcomm.dmm +++ b/_maps/map_files/generic/centcomm.dmm @@ -725,6 +725,7 @@ dir = 6; color = "#63009c" }, +/obj/effect/landmark/spawner/roundstart_observer, /turf/simulated/floor/wood, /area/wizard_station) "cO" = ( @@ -1369,6 +1370,7 @@ dir = 4; color = "#63009c" }, +/obj/effect/landmark/spawner/roundstart_observer, /turf/simulated/floor/wood, /area/wizard_station) "fp" = ( @@ -1432,6 +1434,7 @@ /obj/structure/chair/sofa/right{ color = "#63009c" }, +/obj/effect/landmark/spawner/roundstart_observer, /turf/simulated/floor/wood, /area/wizard_station) "fx" = ( @@ -5407,7 +5410,6 @@ /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/assault_pod) "sh" = ( -/obj/effect/spawner/window/reinforced, /obj/machinery/door/poddoor/shutters{ density = 0; dir = 2; @@ -5416,6 +5418,7 @@ name = "Privacy Shutters"; opacity = 0 }, +/obj/effect/spawner/window/shuttle, /turf/simulated/floor/mineral/titanium/blue, /area/shuttle/trade/sol) "sj" = ( @@ -8159,6 +8162,7 @@ name = "wizard council throne"; dir = 1 }, +/obj/effect/landmark/spawner/roundstart_observer, /turf/simulated/floor/carpet/red, /area/wizard_station) "CY" = ( @@ -12077,6 +12081,7 @@ /obj/structure/chair/sofa{ color = "#63009c" }, +/obj/effect/landmark/spawner/roundstart_observer, /turf/simulated/floor/wood, /area/wizard_station) "Qm" = ( @@ -14263,6 +14268,7 @@ /obj/structure/chair/comfy/purp{ name = "wizard council throne" }, +/obj/effect/landmark/spawner/roundstart_observer, /turf/simulated/floor/carpet/red, /area/wizard_station) "Yp" = ( @@ -40673,63 +40679,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -40930,81 +40936,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -"} -(103,1,1) = {" -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck ck ck ck @@ -41031,24 +40995,66 @@ ck ck aN aN -oc -oc -oc -oc -oc -oc -oc -oc -oc -oc -oc -oc -oc -oc -oc -oc -oc -oc +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +"} +(103,1,1) = {" +aN +aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +aN +aN +oc +oc +oc +oc +oc +oc +oc +oc +oc +oc +oc +oc +oc +oc +oc +oc +oc +oc aN ck ck @@ -41187,63 +41193,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -41444,63 +41450,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -41701,63 +41707,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -41958,63 +41964,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -42215,63 +42221,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -42472,63 +42478,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -42729,63 +42735,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -42986,63 +42992,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -43243,63 +43249,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -43500,63 +43506,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -43757,63 +43763,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -44014,63 +44020,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -44271,63 +44277,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -44528,63 +44534,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -44785,63 +44791,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -45042,63 +45048,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -45299,63 +45305,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -45556,63 +45562,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -45813,63 +45819,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -46070,63 +46076,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -46327,63 +46333,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -46584,63 +46590,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN @@ -46841,63 +46847,63 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck +ck aN aN aN diff --git a/_maps/map_files/shuttles/emergency_lance.dmm b/_maps/map_files/shuttles/emergency_lance.dmm new file mode 100644 index 000000000000..ad94624ae311 --- /dev/null +++ b/_maps/map_files/shuttles/emergency_lance.dmm @@ -0,0 +1,2168 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ae" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Cockpit" + }, +/obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/machinery/door/poddoor/preopen{ + id = "ravenbridgeblast"; + name = "Cockpit Blast Door"; + id_tag = "ravenbridgeblast" + }, +/turf/simulated/floor/plasteel{ + icon_state = "darkbluefull" + }, +/area/shuttle/escape) +"av" = ( +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/escape) +"bm" = ( +/obj/structure/shuttle/engine/propulsion/burst/left, +/turf/simulated/floor/plating/airless, +/area/shuttle/escape) +"bo" = ( +/obj/structure/chair/comfy/shuttle, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"bA" = ( +/obj/structure/chair/comfy/shuttle, +/turf/simulated/floor/plasteel{ + icon_state = "darkblue" + }, +/area/shuttle/escape) +"bO" = ( +/obj/structure/shuttle/engine/propulsion/burst/right{ + dir = 1 + }, +/turf/simulated/floor/plating/airless, +/area/shuttle/escape) +"bQ" = ( +/obj/machinery/sleeper, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"bV" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/effect/turf_decal/blue_corner{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "darkbluecorners" + }, +/area/shuttle/escape) +"cn" = ( +/obj/structure/table/reinforced, +/obj/item/rcd/preloaded, +/obj/item/rcd_ammo, +/turf/simulated/floor/plasteel{ + icon_state = "darkyellow" + }, +/area/shuttle/escape) +"cF" = ( +/obj/structure/closet/crate/freezer/iv_storage, +/turf/simulated/floor/plasteel{ + icon_state = "darkbluecorners" + }, +/area/shuttle/escape) +"dq" = ( +/obj/machinery/door/airlock/highsecurity, +/turf/simulated/floor/plasteel{ + icon_state = "darkbluefull" + }, +/area/shuttle/escape) +"dP" = ( +/obj/structure/shuttle/engine/propulsion/burst/right, +/turf/simulated/floor/plating/airless, +/area/shuttle/escape) +"eh" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"ek" = ( +/obj/machinery/door/airlock/engineering{ + name = "Emergency Shutle Engineering" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"ew" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"eL" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"eP" = ( +/obj/structure/chair/comfy/shuttle, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"fE" = ( +/turf/simulated/wall/mineral/plastitanium, +/area/shuttle/escape) +"fG" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/delivery/white/hollow, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"fH" = ( +/obj/structure/table/reinforced, +/obj/item/storage/firstaid/doctor, +/turf/simulated/floor/plasteel{ + icon_state = "darkbluecorners" + }, +/area/shuttle/escape) +"fL" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"fR" = ( +/obj/machinery/turretid/lethal{ + req_access = list(18); + check_access = 0; + check_arrest = 0; + check_records = 0; + pixel_y = -32 + }, +/turf/simulated/floor/plasteel{ + icon_state = "darkblue" + }, +/area/shuttle/escape) +"gs" = ( +/obj/structure/sign/lifestar, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/escape) +"gN" = ( +/obj/machinery/economy/vending/wallmed{ + name = "Emergency NanoMed"; + pixel_y = 28 + }, +/obj/structure/chair/comfy/shuttle, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "darkbluecorners" + }, +/area/shuttle/escape) +"gS" = ( +/obj/structure/fans/tiny/invisible, +/obj/machinery/door/airlock/external/glass, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"gU" = ( +/obj/structure/extinguisher_cabinet{ + name = "north bump"; + pixel_y = 30 + }, +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/turf/simulated/floor/plasteel{ + icon_state = "darkblue" + }, +/area/shuttle/escape) +"gX" = ( +/obj/structure/closet/crate/freezer/iv_storage, +/obj/item/reagent_containers/hypospray/autoinjector/survival, +/obj/item/reagent_containers/hypospray/autoinjector/survival, +/obj/item/reagent_containers/hypospray/autoinjector/survival, +/obj/item/reagent_containers/hypospray/autoinjector/survival, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"gZ" = ( +/obj/effect/spawner/window/plastitanium, +/turf/simulated/floor/plating, +/area/shuttle/escape) +"hs" = ( +/obj/structure/extinguisher_cabinet{ + name = "south bump"; + pixel_y = -30 + }, +/turf/simulated/floor/plasteel{ + icon_state = "darkyellow"; + dir = 1 + }, +/area/shuttle/escape) +"hv" = ( +/obj/machinery/door/airlock/external{ + id_tag = "s_docking_airlock" + }, +/obj/structure/fans/tiny/invisible, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"ii" = ( +/obj/machinery/door/airlock/medical{ + id_tag = "mental_health"; + name = "Mental Health Crisis Room" + }, +/turf/simulated/floor/mineral/silver, +/area/shuttle/escape) +"it" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"iJ" = ( +/turf/template_noop, +/area/template_noop) +"iY" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"jn" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/item/toy/plushie/lizardplushie{ + name = "Calms-Thy-Panic" + }, +/turf/simulated/floor/mineral/silver, +/area/shuttle/escape) +"jp" = ( +/obj/structure/chair/office/dark, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/shuttle/escape) +"jr" = ( +/obj/machinery/economy/vending/wallmed{ + name = "Emergency NanoMed"; + pixel_x = -28 + }, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"jK" = ( +/obj/machinery/porta_turret/ai_turret, +/turf/simulated/wall/mineral/plastitanium, +/area/shuttle/escape) +"jZ" = ( +/obj/machinery/computer/aifixer{ + dir = 4 + }, +/obj/effect/turf_decal/delivery/white/hollow, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"kg" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/floor/plasteel{ + dir = 10; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"kr" = ( +/obj/structure/chair/office/dark, +/turf/simulated/floor/plasteel{ + icon_state = "darkbluefull" + }, +/area/shuttle/escape) +"ku" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"kO" = ( +/obj/structure/window/reinforced, +/obj/structure/shuttle/engine/heater{ + dir = 1 + }, +/turf/simulated/floor/plating/airless, +/area/shuttle/escape) +"kZ" = ( +/obj/machinery/computer/crew, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "darkbluecorners" + }, +/area/shuttle/escape) +"lj" = ( +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 1 + }, +/turf/simulated/floor/plating/airless, +/area/shuttle/escape) +"lH" = ( +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"mS" = ( +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"mV" = ( +/mob/living/simple_animal/bot/medbot, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "darkbluecorners" + }, +/area/shuttle/escape) +"nP" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "darkbluecorners" + }, +/area/shuttle/escape) +"nX" = ( +/obj/structure/chair/comfy/shuttle, +/turf/simulated/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"ob" = ( +/obj/structure/chair/office/dark, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"of" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"ok" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/simulated/floor/plasteel{ + icon_state = "darkyellowcorners" + }, +/area/shuttle/escape) +"pV" = ( +/turf/simulated/floor/plasteel{ + icon_state = "darkyellow"; + dir = 1 + }, +/area/shuttle/escape) +"qb" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/simulated/floor/plating/airless, +/area/shuttle/escape) +"qk" = ( +/obj/structure/marker_beacon/dock_marker, +/turf/simulated/floor/catwalk, +/area/shuttle/escape) +"qS" = ( +/obj/machinery/optable, +/obj/structure/extinguisher_cabinet{ + name = "west bump"; + pixel_x = -27 + }, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"rd" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"rg" = ( +/obj/structure/rack, +/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/metalfoam, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/simulated/floor/plating, +/area/shuttle/escape) +"rp" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"rX" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "darkbluecorners" + }, +/area/shuttle/escape) +"sx" = ( +/obj/machinery/shieldgen/raven, +/obj/effect/turf_decal/delivery/white/hollow, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/simulated/floor/plating, +/area/shuttle/escape) +"sE" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/delivery/white/hollow, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"sT" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"tW" = ( +/obj/structure/chair/comfy/shuttle, +/obj/item/radio/intercom{ + name = "west bump"; + pixel_x = -28 + }, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"uc" = ( +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"ul" = ( +/turf/simulated/floor/catwalk, +/area/shuttle/escape) +"ut" = ( +/obj/structure/table/reinforced, +/obj/item/storage/firstaid/doctor, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"uW" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/windoor/access/all/command{ + dir = 4 + }, +/obj/machinery/door/window/reinforced/normal{ + name = "Last Resort"; + dir = 4 + }, +/obj/structure/rack, +/obj/item/gun/energy/gun/mini{ + pixel_y = 6 + }, +/obj/item/gun/energy/gun/mini{ + pixel_y = -6 + }, +/obj/item/gun/energy/gun/mini, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"vk" = ( +/obj/structure/table/reinforced, +/obj/item/flash, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"vF" = ( +/obj/structure/shuttle/engine/propulsion/burst/left{ + dir = 1 + }, +/turf/simulated/floor/plating/airless, +/area/shuttle/escape) +"wu" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/reagent_dispensers/watertank/high, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/shuttle/escape) +"ww" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/storage/surgical_tray, +/obj/item/stack/nanopaste, +/obj/item/reagent_containers/glass/bottle/reagent/hydrocodone, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"wx" = ( +/obj/machinery/computer/emergency_shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/delivery/white/hollow, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"wz" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Holding Area" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/turf/simulated/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"wF" = ( +/obj/machinery/atmospherics/portable/canister/oxygen, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/shuttle/escape) +"wS" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + name = "west bump"; + pixel_x = -27 + }, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "darkbluecorners" + }, +/area/shuttle/escape) +"xj" = ( +/obj/machinery/economy/vending/wallmed{ + name = "Emergency NanoMed"; + pixel_x = -28 + }, +/obj/effect/turf_decal/blue_corner{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "darkbluecorners" + }, +/area/shuttle/escape) +"xv" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/machinery/door_control{ + id = "ravenbridgeblast"; + name = "Cockpick Airlock Blastdoor Control"; + pixel_x = 5; + req_access = list(19); + pixel_y = 10 + }, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"xI" = ( +/obj/machinery/optable, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"yg" = ( +/turf/simulated/floor/plasteel{ + dir = 5; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"yA" = ( +/obj/item/defibrillator/loaded, +/obj/structure/table/reinforced, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "darkbluecorners" + }, +/area/shuttle/escape) +"yD" = ( +/obj/docking_port/mobile/emergency{ + height = 50; + width = 19; + timid = 1; + dir = 2; + lance_docking = 1; + shuttle_speed_factor = 1.5 + }, +/obj/machinery/door/airlock/external{ + id_tag = "s_docking_airlock" + }, +/obj/structure/fans/tiny/invisible, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"yM" = ( +/obj/machinery/computer/crew{ + dir = 4 + }, +/obj/effect/turf_decal/delivery/white/hollow, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"zb" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"AK" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/delivery/blue/partial{ + dir = 4 + }, +/obj/effect/turf_decal/delivery/blue/partial{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"AS" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/table/reinforced, +/obj/item/stack/sheet/mineral/plasma/fifty, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/assembly/signaler, +/obj/item/assembly/signaler, +/turf/simulated/floor/plating, +/area/shuttle/escape) +"Bi" = ( +/obj/structure/rack, +/obj/item/flashlight/flare, +/obj/item/flashlight/flare, +/obj/item/flashlight/flare, +/obj/item/flashlight/flare, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/shuttle/escape) +"Bn" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"Bx" = ( +/obj/structure/table/reinforced, +/obj/item/radio, +/obj/effect/turf_decal/blue_corner{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "darkbluecorners" + }, +/area/shuttle/escape) +"Cl" = ( +/obj/effect/turf_decal/blue_corner{ + dir = 4 + }, +/obj/machinery/hologram/holopad, +/obj/effect/turf_decal/box/white, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "darkbluecorners" + }, +/area/shuttle/escape) +"CL" = ( +/obj/item/radio/intercom{ + name = "north bump"; + pixel_y = 28 + }, +/turf/simulated/floor/plasteel{ + icon_state = "darkbluefull" + }, +/area/shuttle/escape) +"DD" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/shieldgen/raven, +/obj/effect/turf_decal/delivery/white/hollow, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"DU" = ( +/turf/simulated/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"DZ" = ( +/obj/structure/closet/fireaxecabinet{ + pixel_y = -32 + }, +/turf/simulated/floor/plasteel{ + dir = 6; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"Ek" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/item/radio/intercom{ + name = "east bump"; + pixel_x = 28 + }, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"EV" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"FP" = ( +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medical Supplies" + }, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"Hk" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/storage/box/handcuffs, +/turf/simulated/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"HE" = ( +/obj/machinery/light/small, +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/storage/firstaid/doctor, +/turf/simulated/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"HK" = ( +/obj/structure/extinguisher_cabinet{ + name = "north bump"; + pixel_y = 30 + }, +/obj/structure/chair/comfy/shuttle, +/turf/simulated/floor/plasteel{ + icon_state = "darkbluecorners" + }, +/area/shuttle/escape) +"HL" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/donkpockets, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"Id" = ( +/obj/structure/chair/comfy/shuttle, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"If" = ( +/obj/structure/table/reinforced, +/obj/item/storage/firstaid/regular, +/obj/effect/turf_decal/blue_corner{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "darkbluecorners" + }, +/area/shuttle/escape) +"Iu" = ( +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"IF" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/delivery/white/hollow, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"IJ" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"IN" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/simulated/floor/plating/airless, +/area/shuttle/escape) +"Jb" = ( +/obj/machinery/light/small, +/obj/machinery/computer/operating{ + dir = 1 + }, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"Jd" = ( +/turf/simulated/floor/plasteel{ + dir = 9; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"Je" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/shuttle/engine/heater, +/turf/simulated/floor/plating/airless, +/area/shuttle/escape) +"Kg" = ( +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "darkbluecorners" + }, +/area/shuttle/escape) +"Ko" = ( +/obj/machinery/computer/security{ + dir = 8; + network = list("SS13","Research Outpost","Mining Outpost") + }, +/turf/simulated/floor/plasteel{ + dir = 5; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"Ky" = ( +/obj/machinery/light/small, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"KB" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/shieldgen/raven, +/obj/effect/turf_decal/delivery/white/hollow, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"KL" = ( +/obj/machinery/economy/vending/medical, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"KQ" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/chair/comfy/shuttle, +/turf/simulated/floor/plasteel{ + icon_state = "darkblue" + }, +/area/shuttle/escape) +"KT" = ( +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/shuttle/escape) +"KY" = ( +/obj/machinery/light, +/turf/simulated/floor/plasteel{ + icon_state = "darkbluefull" + }, +/area/shuttle/escape) +"Mb" = ( +/obj/machinery/shieldgen/raven, +/obj/effect/turf_decal/delivery/white/hollow, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"Nc" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/chair/comfy/shuttle, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"Nd" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "darkbluecorners" + }, +/area/shuttle/escape) +"Nt" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/item/radio/intercom{ + name = "east bump"; + pixel_x = 28 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"Nu" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/power/tesla_coil{ + anchored = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/shuttle/escape) +"NK" = ( +/obj/structure/table/reinforced, +/obj/machinery/kitchen_machine/microwave, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"NW" = ( +/obj/machinery/light/small{ + dir = 4; + pixel_y = 8 + }, +/obj/structure/closet/emcloset, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"Oq" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/plasteel{ + icon_state = "darkbluefull" + }, +/area/shuttle/escape) +"OD" = ( +/obj/machinery/computer/secure_data{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 9; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"PK" = ( +/obj/machinery/power/port_gen/pacman/upgraded{ + anchored = 1 + }, +/obj/structure/cable{ + d2 = 2; + icon_state = "0-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/simulated/floor/plating, +/area/shuttle/escape) +"Qh" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/door_control{ + id = "mental_health"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/turf/simulated/floor/mineral/silver, +/area/shuttle/escape) +"Qs" = ( +/turf/simulated/floor/plasteel{ + dir = 9; + icon_state = "darkyellowfull" + }, +/area/shuttle/escape) +"QM" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/storage/firstaid/regular{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/storage/firstaid/regular{ + pixel_x = 6; + pixel_y = -5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/shuttle/escape) +"Rc" = ( +/obj/structure/table/reinforced, +/obj/item/storage/surgical_tray, +/obj/item/stack/nanopaste, +/obj/item/reagent_containers/glass/bottle/reagent/hydrocodone, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"Rh" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/turf/simulated/floor/plasteel{ + icon_state = "darkblue" + }, +/area/shuttle/escape) +"SQ" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/electrical, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 5 + }, +/obj/item/multitool, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/simulated/floor/plating, +/area/shuttle/escape) +"Tc" = ( +/obj/machinery/sleeper{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + icon_state = "darkblue" + }, +/area/shuttle/escape) +"UY" = ( +/obj/effect/turf_decal/blue_corner{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "darkbluecorners" + }, +/area/shuttle/escape) +"Vf" = ( +/obj/effect/spawner/window/plastitanium, +/obj/machinery/door/poddoor/preopen{ + id = "ravenbridgeblast"; + name = "Cockpit Blast Door"; + id_tag = "ravenbridgeblast" + }, +/turf/simulated/floor/plating, +/area/shuttle/escape) +"VM" = ( +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"Wk" = ( +/turf/simulated/floor/plasteel{ + dir = 10; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"Wo" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"Wq" = ( +/obj/effect/turf_decal/delivery/blue/partial{ + dir = 4 + }, +/obj/effect/turf_decal/delivery/blue/partial{ + dir = 8 + }, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"WJ" = ( +/obj/machinery/recharge_station, +/turf/simulated/floor/plasteel/dark, +/area/shuttle/escape) +"WU" = ( +/turf/simulated/floor/plasteel{ + icon_state = "darkbluefull" + }, +/area/shuttle/escape) +"Xz" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/simulated/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"XB" = ( +/obj/structure/closet/crate/internals, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/simulated/floor/plating, +/area/shuttle/escape) +"XO" = ( +/obj/structure/closet/secure_closet/engineering_welding, +/turf/simulated/floor/plasteel{ + icon_state = "darkyellow" + }, +/area/shuttle/escape) +"Yi" = ( +/turf/simulated/floor/plasteel{ + icon_state = "darkyellowcorners"; + dir = 4 + }, +/area/shuttle/escape) +"YC" = ( +/turf/simulated/floor/plasteel{ + dir = 6; + icon_state = "darkblue" + }, +/area/shuttle/escape) +"Zg" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/simulated/floor/plating/airless, +/area/shuttle/escape) + +(1,1,1) = {" +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +jK +av +Vf +Vf +Vf +Vf +av +jK +iJ +iJ +iJ +fE +hv +av +av +iJ +iJ +iJ +iJ +iJ +"} +(2,1,1) = {" +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +av +DD +ut +jZ +yM +uW +DD +av +ul +qk +ul +gZ +VM +IF +Je +bm +iJ +iJ +iJ +iJ +"} +(3,1,1) = {" +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +bO +kO +OD +zb +zb +zb +Iu +Wk +Vf +ul +ul +ul +gZ +VM +NW +Je +dP +iJ +iJ +iJ +iJ +"} +(4,1,1) = {" +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +lj +kO +rd +UY +UY +UY +Cl +fR +av +av +av +av +av +gS +av +av +av +jK +iJ +iJ +iJ +"} +(5,1,1) = {" +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +vF +kO +Ko +lH +lH +lH +iY +DZ +av +jn +av +fH +IJ +lH +IJ +wS +av +av +iJ +iJ +iJ +"} +(6,1,1) = {" +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +jK +av +av +gZ +av +av +av +gZ +av +jK +iJ +iJ +iJ +av +av +ae +av +xv +wx +vk +av +Qh +av +Tc +WU +WU +WU +yg +nP +av +iJ +iJ +iJ +"} +(7,1,1) = {" +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +jK +av +av +av +av +av +av +hv +av +av +eP +UY +eL +av +tW +UY +eL +av +av +gZ +av +av +eP +WU +av +av +Vf +av +av +ii +av +bA +Wk +WU +WU +WU +Jb +av +dP +iJ +iJ +"} +(8,1,1) = {" +iJ +iJ +iJ +jK +av +av +av +gZ +av +av +av +SQ +wu +wF +XB +av +sT +Bn +av +Id +UY +rp +av +Id +UY +rp +av +fL +WJ +fL +av +eP +WU +fL +fL +fL +fL +av +VM +av +KQ +KT +Wk +WU +kr +xI +av +Zg +dP +iJ +"} +(9,1,1) = {" +jK +gZ +hv +av +av +ww +qS +fL +mS +fG +av +lH +lH +lH +lH +av +gS +av +av +HK +WU +lH +eh +lH +WU +nP +av +Oq +WU +WU +av +Nc +WU +lH +lH +lH +lH +jr +YC +dq +WU +Jd +Iu +Iu +Wk +Rc +av +av +IN +dP +"} +(10,1,1) = {" +yD +Wq +Wq +AK +Wq +Wq +Wq +Wq +Wq +Wq +dq +UY +UY +UY +UY +xj +UY +UY +dq +WU +UY +If +Bx +bV +UY +WU +dq +UY +UY +UY +dq +WU +UY +UY +UY +UY +UY +UY +uc +gs +bA +WU +yg +Wk +WU +ob +KL +av +IN +dP +"} +(11,1,1) = {" +jK +gZ +hv +av +av +KB +mS +ku +gX +sE +av +av +gS +av +Iu +Iu +Iu +Iu +av +gN +WU +Iu +EV +Iu +WU +rX +av +CL +WU +KY +av +eP +WU +Nt +NK +HL +Iu +EV +kg +dq +WU +yg +lH +lH +YC +Rc +av +av +IN +dP +"} +(12,1,1) = {" +iJ +iJ +iJ +jK +av +av +av +gZ +av +av +av +Bn +Ky +av +rg +Bi +QM +sx +av +bo +UY +ew +av +bo +UY +ew +av +ku +WJ +ku +av +eP +WU +av +gZ +av +wz +av +gZ +av +Rh +WU +WU +yg +jp +xI +av +qb +dP +iJ +"} +(13,1,1) = {" +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +jK +av +av +hv +av +av +av +av +av +av +eP +UY +Ek +av +eP +UY +eL +av +av +gZ +av +av +eP +WU +av +nX +DU +DU +DU +Xz +av +gU +WU +WU +WU +yg +Jb +av +dP +iJ +iJ +"} +(14,1,1) = {" +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +jK +av +av +gZ +av +av +av +gZ +av +jK +iJ +iJ +iJ +av +av +ek +av +nX +DU +DU +DU +Xz +av +bQ +WU +WU +WU +Jd +rX +av +iJ +iJ +iJ +"} +(15,1,1) = {" +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +bO +kO +ok +Yi +av +Hk +it +it +it +HE +av +kZ +of +of +Iu +Nd +av +av +iJ +iJ +iJ +"} +(16,1,1) = {" +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +lj +kO +XO +hs +av +av +av +av +av +av +av +av +av +gZ +FP +av +av +jK +iJ +iJ +iJ +"} +(17,1,1) = {" +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +vF +kO +cn +Qs +Qs +pV +gS +Wo +hv +ul +ul +ul +gZ +cF +Kg +Je +bm +iJ +iJ +iJ +iJ +"} +(18,1,1) = {" +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +av +Mb +PK +AS +Nu +av +IF +av +ul +qk +ul +gZ +yA +mV +Je +dP +iJ +iJ +iJ +iJ +"} +(19,1,1) = {" +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +iJ +jK +av +gZ +gZ +av +av +av +jK +iJ +iJ +iJ +gZ +gZ +gZ +gZ +iJ +iJ +iJ +iJ +iJ +"} diff --git a/_maps/map_files/stations/boxstation.dmm b/_maps/map_files/stations/boxstation.dmm index 412826b1377c..473def6e1647 100644 --- a/_maps/map_files/stations/boxstation.dmm +++ b/_maps/map_files/stations/boxstation.dmm @@ -258,6 +258,10 @@ /obj/item/target, /obj/item/target, /obj/item/target, +/obj/item/target/syndicate, +/obj/item/target/syndicate, +/obj/item/target/syndicate, +/obj/item/target/syndicate, /turf/simulated/floor/plasteel, /area/station/security/range) "acD" = ( @@ -453,7 +457,6 @@ /obj/machinery/camera{ c_tag = "Firing Range" }, -/obj/machinery/syndicatebomb/training, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/station/security/range) @@ -466,7 +469,7 @@ name = "east bump"; pixel_x = 24 }, -/turf/simulated/floor/plating, +/turf/simulated/floor/plasteel, /area/station/security/range) "adn" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -522,9 +525,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/item/radio/intercom/department/security{ - pixel_y = -28 - }, +/obj/machinery/nuclearbomb/training, +/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/station/security/range) "adE" = ( @@ -537,13 +539,34 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/syndicatebomb/training, /turf/simulated/floor/plasteel, /area/station/security/range) "adG" = ( +/obj/item/disk/nuclear/training{ + pixel_y = -2; + pixel_x = -7 + }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 }, /obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/item/paper/nuclear_guide_spacing{ + pixel_x = 10; + pixel_y = 7 + }, +/obj/item/paper/nuclear_guide_defusing{ + pixel_x = 9; + pixel_y = 4 + }, +/obj/item/disk/nuclear/training{ + pixel_x = -5 + }, +/obj/item/paper/nuclear_guide_operating{ + pixel_x = 8; + pixel_y = 1 + }, /turf/simulated/floor/plasteel, /area/station/security/range) "adH" = ( @@ -1696,10 +1719,22 @@ /area/station/command/office/hos) "aij" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/target/syndicate, -/obj/item/target/syndicate, -/obj/item/target/syndicate, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 3; + pixel_y = 6 + }, +/obj/item/multitool{ + pixel_y = -5; + pixel_x = 5 + }, +/obj/item/clothing/head/welding{ + pixel_y = -2; + pixel_x = -6 + }, +/obj/structure/table/reinforced, +/obj/item/radio/intercom/department/security{ + pixel_x = 28 + }, /turf/simulated/floor/plasteel, /area/station/security/range) "aio" = ( @@ -11923,7 +11958,6 @@ /area/station/hallway/secondary/entry/north) "aMC" = ( /obj/structure/table, -/obj/machinery/computer/mob_healer_terminal, /turf/simulated/floor/carpet/arcade, /area/station/public/arcade) "aMD" = ( @@ -14876,9 +14910,6 @@ /area/station/medical/reception) "aVy" = ( /obj/machinery/economy/vending/coffee, -/obj/machinery/computer/mob_healer_terminal{ - pixel_x = 28 - }, /obj/structure/sign/poster/official/random{ pixel_y = 32 }, @@ -35301,13 +35332,14 @@ /obj/machinery/door/airlock/engineering/glass{ name = "Laser Room" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/mapping_helpers/airlock/access/any/engineering/atmos, /turf/simulated/floor/plating, /area/station/engineering/control) "cmd" = ( @@ -38903,13 +38935,14 @@ /obj/machinery/door/airlock/engineering/glass{ name = "Laser Room" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/access/any/engineering/atmos, /turf/simulated/floor/plating, /area/station/engineering/control) "cyS" = ( @@ -55778,13 +55811,6 @@ icon_state = "darkgreen" }, /area/station/medical/medbay3) -"fes" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/machinery/computer/mob_battle_terminal/red, -/turf/simulated/floor/plasteel, -/area/station/public/dorms) "feN" = ( /turf/simulated/floor/plasteel, /area/station/hallway/secondary/entry/north) @@ -65342,12 +65368,6 @@ /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, /area/station/supply/lobby) -"jPN" = ( -/obj/machinery/computer/mob_battle_terminal/blue{ - pixel_x = -32 - }, -/turf/simulated/floor/plasteel, -/area/station/public/dorms) "jPZ" = ( /obj/structure/sign/poster/official/cleanliness{ pixel_x = 32 @@ -76992,10 +77012,6 @@ }, /turf/simulated/floor/plating, /area/station/security/permabrig) -"pwU" = ( -/obj/effect/landmark/battle_mob_point, -/turf/simulated/floor/engine, -/area/holodeck/alphadeck) "pxv" = ( /obj/machinery/atmospherics/unary/outlet_injector/on{ dir = 8; @@ -82089,7 +82105,7 @@ id = "engsm"; name = "Radiation Shutters Control"; pixel_y = -24; - req_access_txt = "10" + req_access_txt = "32" }, /obj/effect/turf_decal/stripes/line, /turf/simulated/floor/engine, @@ -132341,7 +132357,7 @@ nXr aKQ fRL aPm -jPN +aPm lkw fho aPm @@ -132590,7 +132606,7 @@ awE ayf azn arR -fes +tbC tbC tbC aPm @@ -133621,10 +133637,10 @@ atG sHt sHt sHt -pwU sHt sHt -pwU +sHt +sHt sHt sHt sHt diff --git a/_maps/map_files/stations/cerestation.dmm b/_maps/map_files/stations/cerestation.dmm index 817cd6ed17c9..b23ff7503b78 100644 --- a/_maps/map_files/stations/cerestation.dmm +++ b/_maps/map_files/stations/cerestation.dmm @@ -2486,13 +2486,6 @@ /obj/machinery/ai_status_display, /turf/simulated/wall/r_wall, /area/station/turret_protected/aisat/interior) -"apu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/lootdrop/maintenance, -/turf/simulated/floor/plating{ - icon_state = "asteroidplating" - }, -/area/station/maintenance/fore2) "apw" = ( /obj/structure/table, /obj/item/storage/toolbox/emergency, @@ -2752,37 +2745,41 @@ /turf/simulated/floor/plating/asteroid/ancient, /area/station/maintenance/fpmaint) "ard" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small, -/turf/simulated/floor/plating{ - icon_state = "asteroidplating" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 }, -/area/station/security/permabrig) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/syndicatebomb/training, +/obj/machinery/light, +/turf/simulated/floor/plasteel, +/area/station/security/defusal) "arh" = ( -/obj/item/vending_refill/cola, -/obj/item/multitool, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/grouped_spawner{ - group_id = "tunnelbats"; - max_per_spawner = 1; - name = "bat spawner"; - path_to_spawn = /mob/living/simple_animal/hostile/scarybat; - total_amount = 20 +/obj/item/disk/nuclear/training{ + pixel_y = -2; + pixel_x = -7 }, -/turf/simulated/floor/plating{ - icon_state = "asteroidplating" +/obj/structure/table/reinforced, +/obj/item/paper/nuclear_guide_spacing{ + pixel_x = 10; + pixel_y = 7 }, -/area/station/maintenance/fore2) -"ark" = ( -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating{ - icon_state = "asteroidplating" +/obj/item/paper/nuclear_guide_defusing{ + pixel_x = 9; + pixel_y = 4 }, -/area/station/maintenance/fore2) -"arl" = ( -/obj/structure/closet/emcloset, -/turf/simulated/floor/plating, -/area/station/maintenance/fore2) +/obj/item/disk/nuclear/training{ + pixel_x = -5 + }, +/obj/item/paper/nuclear_guide_operating{ + pixel_x = 8; + pixel_y = 1 + }, +/turf/simulated/floor/plasteel{ + icon_state = "redcorner" + }, +/area/station/security/defusal) "arm" = ( /obj/machinery/door/airlock/maintenance{ name = "Fore Asteroid Maintenance Access" @@ -5829,6 +5826,13 @@ "aMC" = ( /turf/simulated/mineral/ancient, /area/station/medical/break_room) +"aME" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating{ + icon_state = "asteroidplating" + }, +/area/station/security/permabrig) "aMJ" = ( /obj/machinery/firealarm{ dir = 1; @@ -11253,7 +11257,7 @@ /obj/machinery/door/airlock/engineering/glass{ name = "Laser Room" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/atmos, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -11261,6 +11265,7 @@ }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -12062,20 +12067,22 @@ pixel_x = -3; pixel_y = -2 }, -/obj/item/clothing/glasses/sunglasses, -/obj/item/clothing/glasses/sunglasses{ - pixel_x = 3; - pixel_y = 3 - }, /turf/simulated/floor/plasteel, /area/station/security/range) "bsP" = ( -/obj/machinery/syndicatebomb/training, -/obj/structure/closet/bombclosetsecurity, /obj/item/radio/intercom{ pixel_y = -28; name = "custom placement" }, +/obj/structure/table/reinforced, +/obj/item/clothing/glasses/sunglasses{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/glasses/sunglasses, +/obj/item/storage/box/flashbangs{ + pixel_x = -16 + }, /turf/simulated/floor/plasteel, /area/station/security/range) "bsQ" = ( @@ -25812,13 +25819,16 @@ /turf/simulated/floor/wood, /area/station/legal/magistrate) "cKZ" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/security/general, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating{ - icon_state = "asteroidplating" +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/item/radio/intercom{ + name = "custom placement"; + pixel_y = 28 }, -/area/station/maintenance/fore2) +/obj/machinery/camera{ + c_tag = "Defusal Workshop" + }, +/turf/simulated/floor/plasteel, +/area/station/security/defusal) "cLa" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -28999,6 +29009,23 @@ icon_state = "darkyellow" }, /area/station/engineering/atmos) +"cZi" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/structure/cable/orange{ + d2 = 2; + icon_state = "0-2" + }, +/obj/machinery/power/apc/directional/west, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "redcorner" + }, +/area/station/security/defusal) "cZr" = ( /obj/structure/chair{ dir = 8 @@ -29371,13 +29398,11 @@ /area/station/security/prison/cell_block/A) "ddl" = ( /obj/effect/spawner/window/reinforced/grilled, +/obj/machinery/door/firedoor, /obj/structure/cable/orange{ - d1 = 1; d2 = 4; - icon_state = "1-4" + icon_state = "0-4" }, -/obj/structure/cable/orange, -/obj/machinery/door/firedoor, /turf/simulated/floor/plating, /area/station/security/permabrig) "ddn" = ( @@ -33148,9 +33173,10 @@ /obj/machinery/door/airlock/engineering/glass{ name = "Laser Room" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/atmos, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -33955,6 +33981,17 @@ icon_state = "yellowcorner" }, /area/station/hallway/primary/central/east) +"dEa" = ( +/obj/machinery/light_switch{ + name = "north bump"; + pixel_y = 24 + }, +/obj/machinery/alarm/directional/west, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "redcorner" + }, +/area/station/security/defusal) "dEi" = ( /obj/structure/table/wood, /obj/item/ammo_box/shotgun/beanbag, @@ -34819,6 +34856,24 @@ icon_state = "bluered" }, /area/station/hallway/secondary/entry/west) +"dQG" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Defusal Workshop" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/machinery/door/firedoor, +/obj/structure/cable/orange{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "red" + }, +/area/station/security/defusal) "dQR" = ( /obj/machinery/door/airlock/maintenance{ name = "Aft Asteroid Maintenance" @@ -36720,15 +36775,6 @@ /obj/machinery/hologram/holopad, /turf/simulated/floor/plasteel, /area/station/hallway/secondary/exit) -"eAn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/firecloset, -/obj/item/crowbar/red, -/obj/machinery/light{ - dir = 1 - }, -/turf/simulated/floor/plating, -/area/station/maintenance/fore2) "eAu" = ( /obj/effect/turf_decal/delivery, /obj/machinery/recharge_station, @@ -41487,6 +41533,25 @@ /obj/effect/spawner/random_spawners/dirt_often, /turf/simulated/floor/transparent/glass/reinforced, /area/station/maintenance/apmaint) +"gmV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/structure/table/reinforced, +/obj/item/clothing/head/welding{ + pixel_x = 12; + pixel_y = 6 + }, +/obj/item/multitool{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -3; + pixel_y = -2 + }, +/turf/simulated/floor/plasteel, +/area/station/security/defusal) "gmZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 @@ -42842,6 +42907,21 @@ icon_state = "whitebluecorner" }, /area/station/medical/surgery/secondary) +"gLb" = ( +/obj/item/vending_refill/cola, +/obj/item/multitool, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/grouped_spawner{ + group_id = "tunnelbats"; + max_per_spawner = 1; + name = "bat spawner"; + path_to_spawn = /mob/living/simple_animal/hostile/scarybat; + total_amount = 20 + }, +/turf/simulated/floor/plating{ + icon_state = "asteroidplating" + }, +/area/station/security/permabrig) "gLj" = ( /obj/structure/table/wood, /obj/effect/spawner/lootdrop/maintenance/eight, @@ -43849,6 +43929,15 @@ icon_state = "red" }, /area/station/security/storage) +"hcm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/firecloset, +/obj/item/crowbar/red, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/station/security/permabrig) "hco" = ( /obj/structure/cable/orange{ d1 = 4; @@ -44431,6 +44520,14 @@ /obj/effect/spawner/window/reinforced/grilled, /turf/simulated/floor/plating, /area/station/turret_protected/aisat/interior/secondary) +"hnL" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/machinery/firealarm{ + name = "north bump"; + pixel_y = 24 + }, +/turf/simulated/floor/plasteel, +/area/station/security/defusal) "hoa" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -50739,12 +50836,12 @@ /turf/simulated/floor/plating, /area/station/hallway/primary/central/west) "jjh" = ( +/obj/effect/decal/cleanable/dirt, /obj/structure/cable/orange{ - d1 = 2; + d1 = 4; d2 = 8; - icon_state = "2-8" + icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/station/security/permabrig) "jjp" = ( @@ -53865,20 +53962,6 @@ temperature = 80 }, /area/station/science/xenobiology) -"khV" = ( -/obj/effect/spawner/window/reinforced/grilled, -/obj/structure/cable/orange{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/structure/cable/orange{ - d2 = 8; - icon_state = "0-8" - }, -/obj/machinery/door/firedoor, -/turf/simulated/floor/plating, -/area/station/security/brig) "kic" = ( /obj/structure/closet/wardrobe/grey, /turf/simulated/floor/mineral/titanium/blue, @@ -59525,6 +59608,15 @@ icon_state = "cafeteria" }, /area/station/service/kitchen) +"lQa" = ( +/obj/effect/spawner/window/reinforced/grilled, +/obj/machinery/door/firedoor, +/obj/structure/cable/orange{ + d2 = 8; + icon_state = "0-8" + }, +/turf/simulated/floor/plating, +/area/station/security/permabrig) "lQy" = ( /obj/machinery/optable, /obj/machinery/light{ @@ -60954,11 +61046,6 @@ /obj/effect/spawner/random_spawners/dirt_often, /turf/simulated/floor/plating, /area/station/maintenance/disposal/external/southwest) -"moQ" = ( -/obj/effect/spawner/lootdrop/maintenance, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/station/maintenance/fore2) "moY" = ( /obj/structure/closet/secure_closet/medical3, /obj/machinery/light, @@ -62522,15 +62609,6 @@ }, /turf/simulated/floor/plating, /area/station/security/brig) -"mSf" = ( -/obj/effect/spawner/window/reinforced/grilled, -/obj/structure/cable/orange{ - d2 = 8; - icon_state = "0-8" - }, -/obj/machinery/door/firedoor, -/turf/simulated/floor/plating, -/area/station/security/permabrig) "mSh" = ( /obj/structure/girder, /turf/simulated/floor/plating, @@ -62825,13 +62903,12 @@ /turf/simulated/floor/plating, /area/station/maintenance/maintcentral) "mVr" = ( -/obj/item/clothing/shoes/orange, -/obj/item/clothing/under/color/orange/prison, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating{ - icon_state = "asteroidplating" +/obj/machinery/nuclearbomb/training, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "redcorner" }, -/area/station/maintenance/fore2) +/area/station/security/defusal) "mVs" = ( /obj/structure/disposalpipe/segment/corner{ dir = 8; @@ -63272,6 +63349,16 @@ /obj/structure/sign/securearea, /turf/simulated/wall, /area/station/engineering/tech_storage) +"nde" = ( +/obj/structure/cable/orange{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/turf/simulated/floor/plasteel{ + icon_state = "floorgrime" + }, +/area/station/security/permabrig) "ndl" = ( /obj/effect/spawner/window/reinforced/polarized/grilled{ id = "rd" @@ -65368,6 +65455,11 @@ icon_state = "neutralcorner" }, /area/station/hallway/primary/fore/east) +"nNB" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/station/security/permabrig) "nNF" = ( /obj/machinery/door/airlock/maintenance{ name = "Service SMES Access" @@ -65403,6 +65495,10 @@ }, /turf/simulated/floor/plating, /area/station/hallway/primary/port/north) +"nOr" = ( +/obj/structure/closet/emcloset, +/turf/simulated/floor/plating, +/area/station/security/permabrig) "nOu" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/disposalpipe/segment, @@ -69524,6 +69620,9 @@ icon_state = "dark" }, /area/station/turret_protected/ai) +"peU" = ( +/turf/simulated/wall/r_wall, +/area/station/security/defusal) "pfe" = ( /obj/structure/chair/wood{ dir = 1 @@ -77318,6 +77417,30 @@ }, /turf/simulated/floor/plasteel, /area/station/public/locker) +"rGv" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/orange{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/station/security/brig) "rGw" = ( /obj/structure/disposalpipe/segment/corner, /obj/machinery/atmospherics/pipe/simple/hidden/cyan{ @@ -82602,12 +82725,6 @@ icon_state = "whitegreen" }, /area/station/medical/virology) -"tpw" = ( -/obj/effect/landmark/battle_mob_point, -/turf/simulated/floor/engine{ - name = "Holodeck Projector Floor" - }, -/area/holodeck/alphadeck) "tpA" = ( /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -83579,16 +83696,18 @@ /area/station/maintenance/port) "tFL" = ( /obj/effect/spawner/window/reinforced/grilled, +/obj/machinery/door/firedoor, /obj/structure/cable/orange{ - d2 = 8; - icon_state = "0-8" + d1 = 1; + d2 = 4; + icon_state = "1-4" }, /obj/structure/cable/orange{ - d1 = 4; + d1 = 1; d2 = 8; - icon_state = "4-8" + icon_state = "1-8" }, -/obj/machinery/door/firedoor, +/obj/structure/cable/orange, /turf/simulated/floor/plating, /area/station/security/permabrig) "tFY" = ( @@ -91624,6 +91743,14 @@ icon_state = "darkyellow" }, /area/station/engineering/control) +"weh" = ( +/obj/item/clothing/shoes/orange, +/obj/item/clothing/under/color/orange/prison, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating{ + icon_state = "asteroidplating" + }, +/area/station/security/permabrig) "weN" = ( /obj/structure/cable{ d1 = 4; @@ -92008,6 +92135,13 @@ }, /turf/simulated/floor/plasteel, /area/station/hallway/primary/aft/west) +"wiU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/lootdrop/maintenance, +/turf/simulated/floor/plating{ + icon_state = "asteroidplating" + }, +/area/station/security/permabrig) "wiV" = ( /obj/structure/mirror{ pixel_x = -28 @@ -95268,7 +95402,7 @@ id = "engsm"; name = "Radiation Shutters Control"; pixel_y = 24; - req_access_txt = "10" + req_access_txt = "32" }, /obj/machinery/camera{ c_tag = "SM South"; @@ -98581,6 +98715,7 @@ /obj/machinery/light/small{ dir = 4 }, +/obj/structure/closet/bombclosetsecurity, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -116641,10 +116776,10 @@ bEM pDn pDn pDn -tpw pDn pDn -tpw +pDn +pDn pDn pDn pDn @@ -118894,7 +119029,7 @@ rHj cDb rHj aQL -aQL +nde tFL rNK rNK @@ -119152,10 +119287,10 @@ gLk cVR amO myY -tFL +lQa rNK rNK -khV +lPn yfX fOj awv @@ -119409,11 +119544,11 @@ dpC rHj adc rHj -mSf -rNK -rNK -lPn -yfX +peU +peU +peU +peU +wGz uaJ awB uqz @@ -119666,12 +119801,12 @@ rHj rHj vNP sFU -afd -afd -afd -afd -wGz -uaJ +peU +dEa +cZi +dQG +dsy +rGv dtr uqz aLp @@ -119923,10 +120058,10 @@ rHj cgX tkn dqz -tkn -rHj +peU +hnL ard -afd +peU daG sVX daG @@ -120176,13 +120311,13 @@ aTz afd aTz aTz -rHj -aTz -aTz afd afd -cKZ +aME mYJ +peU +cKZ +gmV fqh eBm krP @@ -120433,11 +120568,11 @@ afd afd aTz aTz -aTz -aTz -aTz afd -vXM +tkn +weh +gLb +peU mVr arh fqh @@ -120690,13 +120825,13 @@ abW abW afd aTz -aTz -aTz -aTz afd -eAn -moQ -ark +hcm +nNB +adc +peU +peU +peU fqh xax pZs @@ -120945,15 +121080,15 @@ rNK cRv abW abW -abW afd aTz +afd +vNP +wiU +nOr +afd aTz aTz -afd -vrQ -apu -arl asu atc eZh @@ -121202,15 +121337,15 @@ rNK cRv cRv cRv -abW afd aTz aTz -aTz -aTz afd afd aTz +afd +aTz +aTz fqh bOR gyQ diff --git a/_maps/map_files/stations/deltastation.dmm b/_maps/map_files/stations/deltastation.dmm index 33cd237861ef..2c1a42832b33 100644 --- a/_maps/map_files/stations/deltastation.dmm +++ b/_maps/map_files/stations/deltastation.dmm @@ -28019,6 +28019,34 @@ icon_state = "neutralfull" }, /area/station/hallway/primary/port/north) +"bDD" = ( +/obj/item/disk/nuclear/training{ + pixel_y = -2; + pixel_x = -7 + }, +/obj/structure/table/reinforced, +/obj/item/paper/nuclear_guide_spacing{ + pixel_x = 10; + pixel_y = 7 + }, +/obj/item/paper/nuclear_guide_defusing{ + pixel_x = 9; + pixel_y = 4 + }, +/obj/item/disk/nuclear/training{ + pixel_x = -5 + }, +/obj/item/paper/nuclear_guide_operating{ + pixel_x = 8; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/alarm/directional/south, +/turf/simulated/floor/plasteel, +/area/station/security/range) "bDE" = ( /obj/item/kirbyplants, /obj/machinery/status_display{ @@ -35212,7 +35240,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/table, -/obj/machinery/syndicatebomb/training, +/obj/item/toy/figure/crew/secofficer, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -40235,6 +40263,16 @@ /turf/simulated/floor/plasteel, /area/station/security/range) "cju" = ( +/obj/machinery/syndicatebomb/training, +/turf/simulated/floor/plasteel, +/area/station/security/range) +"cjv" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/station/security/range) +"cjw" = ( /obj/structure/table/reinforced, /obj/machinery/recharger{ pixel_x = -6; @@ -40247,27 +40285,8 @@ pixel_x = 7; pixel_y = 3 }, -/obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/plasteel, /area/station/security/range) -"cjv" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/simulated/floor/plating, -/area/station/security/range) -"cjw" = ( -/obj/structure/sign/securearea{ - pixel_y = 32 - }, -/turf/simulated/floor/plating, -/area/station/security/range) -"cjx" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/simulated/floor/plating, -/area/station/security/range) "cjy" = ( /obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/plating, @@ -40863,9 +40882,6 @@ icon_state = "4-8" }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -40901,10 +40917,13 @@ d2 = 8; icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/station/security/range) "clf" = ( @@ -41413,7 +41432,6 @@ icon_state = "1-2" }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, /turf/simulated/floor/plasteel, /area/station/security/range) "cmC" = ( @@ -41437,18 +41455,8 @@ /turf/simulated/floor/plating, /area/station/security/range) "cmF" = ( -/obj/structure/table/reinforced, -/obj/machinery/alarm/directional/south, -/obj/item/gun/energy/laser/practice, -/obj/item/gun/energy/laser/practice, -/obj/item/clothing/ears/earmuffs, -/obj/item/clothing/ears/earmuffs, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, +/obj/machinery/nuclearbomb/training, +/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/station/security/range) "cmG" = ( @@ -44275,13 +44283,6 @@ icon_state = "neutralfull" }, /area/station/hallway/primary/starboard/south) -"cut" = ( -/obj/machinery/light, -/obj/structure/sign/securearea{ - pixel_y = -32 - }, -/turf/simulated/floor/plating, -/area/station/security/range) "cuu" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -59862,6 +59863,14 @@ icon_state = "whitebluefull" }, /area/station/maintenance/starboard) +"dxV" = ( +/obj/structure/table/reinforced, +/obj/item/gun/energy/laser/practice, +/obj/item/gun/energy/laser/practice, +/obj/item/clothing/ears/earmuffs, +/obj/item/clothing/ears/earmuffs, +/turf/simulated/floor/plasteel, +/area/station/security/range) "dyb" = ( /turf/simulated/floor/plating, /area/station/maintenance/theatre) @@ -67079,6 +67088,23 @@ /obj/structure/cable, /turf/simulated/floor/plasteel/white, /area/station/science/explab) +"eOg" = ( +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/item/clothing/head/welding{ + pixel_x = 9; + pixel_y = 10 + }, +/obj/item/multitool{ + pixel_x = -6; + pixel_y = 8 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_y = -2; + pixel_x = -3 + }, +/turf/simulated/floor/plasteel, +/area/station/security/range) "eOt" = ( /obj/structure/table/glass, /obj/structure/cable{ @@ -69896,6 +69922,19 @@ dir = 5 }, /area/space/nearstation) +"gAP" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/station/security/range) "gAR" = ( /obj/structure/closet/wardrobe/pjs, /obj/structure/cable{ @@ -79593,19 +79632,6 @@ icon_state = "dark" }, /area/station/security/prison/cell_block) -"mBa" = ( -/obj/effect/spawner/window/reinforced, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/structure/cable{ - d2 = 8; - icon_state = "0-8" - }, -/turf/simulated/floor/plating, -/area/station/engineering/smes) "mBy" = ( /obj/structure/bed, /obj/item/bedsheet/green, @@ -80612,7 +80638,6 @@ "ngl" = ( /obj/structure/table, /obj/item/storage/fancy/donut_box, -/obj/item/toy/figure/crew/secofficer, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -92514,7 +92539,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/plating, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, /area/station/security/range) "tVV" = ( /turf/simulated/floor/plasteel{ @@ -127352,7 +127378,7 @@ bwP fsO oNV ucB -mBa +fsO clv bQr bQr @@ -152283,9 +152309,9 @@ cgr hFc cgr jIs -cjv -iCU -cjv +eOg +gAP +bDD cjr brS bHF @@ -152542,7 +152568,7 @@ ccL jIs cjw tVO -cjz +dxV cjr eeN lnU @@ -152797,9 +152823,9 @@ ccM ceC cgo jIs -cjx -tVO -cut +cjv +iCU +cjv cjr cpa cqI diff --git a/_maps/map_files/stations/metastation.dmm b/_maps/map_files/stations/metastation.dmm index ca66c423b305..44f5f507aeab 100644 --- a/_maps/map_files/stations/metastation.dmm +++ b/_maps/map_files/stations/metastation.dmm @@ -806,9 +806,6 @@ /turf/simulated/wall, /area/station/public/arcade) "ajb" = ( -/obj/machinery/computer/mob_battle_terminal/red{ - pixel_y = 30 - }, /obj/item/kirbyplants/plant20, /turf/simulated/floor/plasteel{ icon_state = "darkgrey" @@ -3389,9 +3386,6 @@ name = "east bump"; pixel_x = 27 }, -/obj/machinery/computer/mob_battle_terminal/blue{ - pixel_y = -30 - }, /turf/simulated/floor/plasteel{ icon_state = "darkgrey" }, @@ -8848,7 +8842,7 @@ id = "engsm"; name = "Radiation Shutters Control"; pixel_x = 24; - req_access_txt = "10" + req_access_txt = "32" }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -47045,13 +47039,25 @@ /turf/simulated/floor/wood, /area/station/service/bar) "exm" = ( -/obj/effect/spawner/window/reinforced/grilled, +/obj/machinery/door/airlock/security/glass, +/obj/effect/mapping_helpers/airlock/autoname, +/obj/effect/mapping_helpers/airlock/access/any/security/general, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /obj/structure/cable{ + d1 = 4; d2 = 8; - icon_state = "0-8" + icon_state = "4-8" }, -/turf/simulated/floor/plating, -/area/station/security/main) +/turf/simulated/floor/plasteel{ + icon_state = "redfull" + }, +/area/station/security/defusal) "exI" = ( /obj/structure/table/glass, /obj/item/hand_labeler, @@ -48607,6 +48613,37 @@ }, /turf/simulated/floor/carpet, /area/station/legal/lawoffice) +"ffH" = ( +/obj/item/disk/nuclear/training{ + pixel_y = -2; + pixel_x = -7 + }, +/obj/item/paper/nuclear_guide_spacing{ + pixel_x = 10; + pixel_y = 7 + }, +/obj/item/paper/nuclear_guide_defusing{ + pixel_x = 9; + pixel_y = 4 + }, +/obj/item/disk/nuclear/training{ + pixel_x = -5 + }, +/obj/item/paper/nuclear_guide_operating{ + pixel_x = 8; + pixel_y = 1 + }, +/obj/structure/table, +/obj/machinery/camera{ + c_tag = "Defusal Workshop" + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24; + name = "east bump" + }, +/turf/simulated/floor/plasteel, +/area/station/security/defusal) "fga" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ @@ -49977,6 +50014,24 @@ /obj/effect/decal/cleanable/blood, /turf/simulated/floor/bluegrid, /area/station/maintenance/starboard) +"fFo" = ( +/obj/structure/table, +/obj/item/radio/intercom{ + name = "south bump"; + pixel_y = -28 + }, +/obj/item/clothing/head/welding{ + pixel_x = -4; + pixel_y = 19 + }, +/obj/item/multitool{ + pixel_x = 7; + pixel_y = 13 + }, +/obj/item/storage/toolbox/mechanical, +/obj/machinery/alarm/directional/east, +/turf/simulated/floor/plasteel, +/area/station/security/defusal) "fFL" = ( /obj/machinery/atmospherics/meter, /obj/machinery/atmospherics/pipe/simple/visible/yellow, @@ -50222,12 +50277,12 @@ /area/station/hallway/primary/central/north) "fJr" = ( /obj/machinery/disposal, +/obj/structure/disposalpipe/trunk, /obj/structure/cable{ - d1 = 4; + d1 = 1; d2 = 8; - icon_state = "4-8" + icon_state = "1-8" }, -/obj/structure/disposalpipe/trunk, /turf/simulated/floor/plasteel{ icon_state = "darkred" }, @@ -53400,9 +53455,6 @@ /obj/structure/table, /obj/item/stack/medical/bruise_pack, /obj/item/stack/medical/ointment, -/obj/machinery/computer/mob_healer_terminal{ - pixel_y = 30 - }, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whiteblue" @@ -59778,6 +59830,23 @@ "jKj" = ( /turf/simulated/wall/r_wall, /area/station/engineering/ai_transit_tube) +"jKG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "red" + }, +/area/station/security/defusal) "jKP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -60579,6 +60648,14 @@ }, /turf/simulated/floor/plating, /area/station/medical/virology) +"jXY" = ( +/obj/machinery/nuclearbomb/training, +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "red" + }, +/area/station/security/defusal) "jYj" = ( /obj/machinery/atmospherics/pipe/manifold/visible/cyan{ dir = 8; @@ -66792,7 +66869,7 @@ name = "Supermatter Engine Room" }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -66801,6 +66878,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/atmos, /turf/simulated/floor/plating, /area/station/engineering/control) "mCX" = ( @@ -69551,6 +69629,9 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/simulated/floor/plating, /area/station/engineering/control) +"nEV" = ( +/turf/simulated/wall/r_wall, +/area/station/security/defusal) "nFf" = ( /obj/structure/table/glass, /obj/item/reagent_containers/dropper, @@ -72815,7 +72896,6 @@ name = "Supermatter Engine Room" }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -72824,6 +72904,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/atmos, /turf/simulated/floor/plating, /area/station/engineering/control) "pgs" = ( @@ -79389,6 +79471,21 @@ icon_state = "dark" }, /area/station/security/permabrig) +"rOj" = ( +/obj/machinery/syndicatebomb/training, +/obj/machinery/light_switch{ + dir = 4; + name = "west bump"; + pixel_x = -24 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "red" + }, +/area/station/security/defusal) "rOp" = ( /obj/machinery/door/airlock/tranquillite{ name = "Old Mime's Storage" @@ -79617,6 +79714,22 @@ icon_state = "whitebluefull" }, /area/station/medical/exam_room) +"rUg" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 4 + }, +/obj/item/book/manual/wiki/hacking{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/machinery/power/apc/directional/east, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/turf/simulated/floor/plasteel, +/area/station/security/defusal) "rUl" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ @@ -83836,10 +83949,6 @@ icon_state = "cafeteria" }, /area/station/service/kitchen) -"tNe" = ( -/obj/effect/spawner/random_spawners/wall_rusted_probably, -/turf/simulated/wall/r_wall, -/area/station/maintenance/fore) "tNg" = ( /obj/machinery/door/firedoor, /turf/simulated/floor/plasteel{ @@ -88708,15 +88817,6 @@ }, /area/station/medical/surgery/observation) "vVR" = ( -/obj/structure/table, -/obj/item/screwdriver{ - pixel_x = -2; - pixel_y = 18 - }, -/obj/item/wirecutters{ - pixel_y = 5 - }, -/obj/machinery/syndicatebomb/training, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "red" @@ -124925,7 +125025,7 @@ aaa aaa laH aaa -apO +sRw fJr hwP vgv @@ -125183,11 +125283,11 @@ aaa laH abq apO -jSU -apO +nEV +nEV exm -apO -apO +nEV +nEV xyP apO apO @@ -125440,11 +125540,11 @@ aaa aaa aaa laH -aaa -aaa -aaa -aaa -tNe +nEV +jXY +jKG +rOj +nEV oQV ajg jiR @@ -125697,11 +125797,11 @@ aaa aaa aaa laH -aaa -aaa -aaa -aaa -ahH +nEV +ffH +rUg +fFo +nEV alW akR aDY @@ -125954,11 +126054,11 @@ aaa aaa aaa laH -aaa -aaa -aaa -aaa -ahH +nEV +nEV +nEV +nEV +nEV aDY wLB cnV @@ -126216,8 +126316,8 @@ abq abq abq ajg -ajg -aVY +ahH +ahH ajg aWv cXu diff --git a/_maps/map_files220/stations/boxstation.dmm b/_maps/map_files220/stations/boxstation.dmm index 60da758af248..c4440afb4ccd 100644 --- a/_maps/map_files220/stations/boxstation.dmm +++ b/_maps/map_files220/stations/boxstation.dmm @@ -9825,9 +9825,6 @@ /obj/structure/chair/comfy/black{ dir = 1 }, -/obj/machinery/computer/mob_healer_terminal{ - pixel_x = -30 - }, /obj/effect/landmark/start/artist, /turf/simulated/floor/carpet/arcade, /area/station/public/arcade) @@ -11507,9 +11504,6 @@ /area/space/nearstation) "aQV" = ( /obj/structure/table/glass, -/obj/machinery/computer/mob_healer_terminal{ - pixel_y = 30 - }, /obj/item/reagent_containers/drinks/britcup{ list_reagents = list("tea"=15); pixel_x = 4; @@ -49439,7 +49433,6 @@ /obj/structure/chair{ dir = 4 }, -/obj/machinery/computer/mob_battle_terminal/red, /turf/simulated/floor/plasteel, /area/station/public/dorms) "feA" = ( @@ -62206,11 +62199,6 @@ /turf/simulated/floor/plating, /area/station/maintenance/asmaint) "jPN" = ( -/obj/machinery/computer/mob_battle_terminal/blue{ - dir = 2; - pixel_y = 0; - pixel_x = -32 - }, /turf/simulated/floor/plasteel, /area/station/public/dorms) "jPW" = ( diff --git a/_maps/map_files220/stations/metastation.dmm b/_maps/map_files220/stations/metastation.dmm index 4adfe22375af..877fc9fd715e 100644 --- a/_maps/map_files220/stations/metastation.dmm +++ b/_maps/map_files220/stations/metastation.dmm @@ -878,9 +878,6 @@ /turf/simulated/wall, /area/station/public/arcade) "ajb" = ( -/obj/machinery/computer/mob_battle_terminal/red{ - pixel_y = 30 - }, /obj/item/kirbyplants/plant20, /turf/simulated/floor/plasteel{ icon_state = "darkneutralfull" @@ -3486,9 +3483,6 @@ "avJ" = ( /obj/machinery/economy/vending/cigarette, /obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/computer/mob_battle_terminal/blue{ - pixel_y = -30 - }, /turf/simulated/floor/plasteel{ icon_state = "darkneutralfull" }, @@ -52555,9 +52549,6 @@ /obj/structure/table, /obj/item/stack/medical/bruise_pack, /obj/item/stack/medical/ointment, -/obj/machinery/computer/mob_healer_terminal{ - pixel_y = 30 - }, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whiteblue" diff --git a/code/__DEFINES/bots.dm b/code/__DEFINES/bots.dm index 83485ff54a2a..ff3712ed9c02 100644 --- a/code/__DEFINES/bots.dm +++ b/code/__DEFINES/bots.dm @@ -28,12 +28,13 @@ #define BOT_EAT_TILE 19 // adding said tiles to inventory (floorbots) //Bot types -#define SEC_BOT (1<<0) // Secutritrons (Beepsky) and ED-209s -#define MULE_BOT (1<<1) // MULEbots -#define FLOOR_BOT (1<<2) // Floorbots -#define CLEAN_BOT (1<<3) // Cleanbots -#define MED_BOT (1<<4) // Medibots -#define HONK_BOT (1<<5) // Honkbots +#define SEC_BOT "Security" // Secutritrons (Beepsky) and ED-209s +#define MULE_BOT "Mule" // MULEbots +#define FLOOR_BOT "Floorbot" // Floorbots +#define CLEAN_BOT "Cleanbot" // Cleanbots +#define MED_BOT "Medibot" // Medibots +#define HONK_BOT "Honkbot" // Honkbots +#define GRIEF_BOT "Grief" // Griefsky //Sentience types #define SENTIENCE_ORGANIC 1 diff --git a/code/__DEFINES/combat_defines.dm b/code/__DEFINES/combat_defines.dm index 01e0c8990c74..368e1cb2df4f 100644 --- a/code/__DEFINES/combat_defines.dm +++ b/code/__DEFINES/combat_defines.dm @@ -1,7 +1,5 @@ //Damage things //TODO: merge these down to reduce on defines //Way to waste perfectly good damagetype names (BRUTE) on this... If you were really worried about case sensitivity, you could have just used lowertext(damagetype) in the proc... -#define CUT "cut" -#define BRUISE "bruise" #define BRUTE "brute" #define BURN "fire" #define TOX "tox" diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 1d4d33ac2644..ea134741bec4 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -717,9 +717,12 @@ // /obj/item/gun signals -/// called in /obj/item/gun/process_fire (user, target, params, zone_override) -#define COMSIG_MOB_FIRED_GUN "mob_fired_gun" -/// called in /obj/item/gun/process_fire (user, target) +///called in /obj/item/gun/fire_gun (user, target, flag, params) +#define COMSIG_GUN_TRY_FIRE "gun_try_fire" + #define COMPONENT_CANCEL_GUN_FIRE (1<<0) +///called in /obj/item/gun/afterattack (user, target, flag, params) +#define COMSIG_MOB_TRY_FIRE "mob_fired_gun" +///called in /obj/item/gun/process_fire (user, target) #define COMSIG_GUN_FIRED "gun_fired" /// called in /datum/component/automatic_fire/proc/on_mouse_down: (client/clicker, atom/target, turf/location, control, params) #define COMSIG_AUTOFIRE_ONMOUSEDOWN "autofire_onmousedown" diff --git a/code/__DEFINES/mob_defines.dm b/code/__DEFINES/mob_defines.dm index 5d57157cfb43..5c1d026c3aec 100644 --- a/code/__DEFINES/mob_defines.dm +++ b/code/__DEFINES/mob_defines.dm @@ -298,6 +298,7 @@ #define HEALTH_HUD_OVERRIDE_HEALTHY 3 // Eye protection #define FLASH_PROTECTION_VERYVUNERABLE -4 +#define FLASH_PROTECTION_EXTRA_SENSITIVE -2 #define FLASH_PROTECTION_SENSITIVE -1 #define FLASH_PROTECTION_NONE 0 #define FLASH_PROTECTION_FLASH 1 diff --git a/code/__DEFINES/nanomob_defines.dm b/code/__DEFINES/nanomob_defines.dm deleted file mode 100644 index 0e3510e62c3e..000000000000 --- a/code/__DEFINES/nanomob_defines.dm +++ /dev/null @@ -1,17 +0,0 @@ -#define NANOMOB_TYPE_FIRE /datum/mob_type/fire -#define NANOMOB_TYPE_WATER /datum/mob_type/water -#define NANOMOB_TYPE_GRASS /datum/mob_type/grass -#define NANOMOB_TYPE_ELECTRIC /datum/mob_type/electric -#define NANOMOB_TYPE_GROUND /datum/mob_type/ground -#define NANOMOB_TYPE_ROCK /datum/mob_type/rock -#define NANOMOB_TYPE_BUG /datum/mob_type/bug -#define NANOMOB_TYPE_POISON /datum/mob_type/poison -#define NANOMOB_TYPE_NORMAL /datum/mob_type/normal -#define NANOMOB_TYPE_FIGHTING /datum/mob_type/fighting -#define NANOMOB_TYPE_PSYCHIC /datum/mob_type/psychic -#define NANOMOB_TYPE_GHOST /datum/mob_type/ghost -#define NANOMOB_TYPE_ICE /datum/mob_type/ice -#define NANOMOB_TYPE_FLYING /datum/mob_type/flying -#define NANOMOB_TYPE_BLUESPACE /datum/mob_type/bluespace -#define NANOMOB_TYPE_DARK /datum/mob_type/dark -#define NANOMOB_TYPE_STEEL /datum/mob_type/steel diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 335ac141fc8f..b213db5ac2dc 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -91,7 +91,6 @@ // If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child) #define FIRE_PRIORITY_PING 10 -#define FIRE_PRIORITY_NANOMOB 10 #define FIRE_PRIORITY_NIGHTSHIFT 10 #define FIRE_PRIORITY_IDLE_NPC 10 #define FIRE_PRIORITY_CLEANUP 10 diff --git a/code/__DEFINES/wires_defines.dm b/code/__DEFINES/wires_defines.dm index ef149154212b..c1d1160bbb00 100644 --- a/code/__DEFINES/wires_defines.dm +++ b/code/__DEFINES/wires_defines.dm @@ -46,9 +46,11 @@ #define WIRE_BOMB_ACTIVATE "Activate" // Will start a bombs timer if pulsed, will hint if pulsed while already active, will stop a timer a bomb on cut. // Nuclear bomb -#define WIRE_BOMB_LIGHT "Bomb Light" -#define WIRE_BOMB_TIMING "Bomb Timing" -#define WIRE_BOMB_SAFETY "Bomb Safety" +#define WIRE_NUKE_SAFETY "Safety" +#define WIRE_NUKE_DETONATOR "Detonator" +#define WIRE_NUKE_DISARM "Disarm" +#define WIRE_NUKE_LIGHT "Lights" +#define WIRE_NUKE_CONTROL "Control Panel" // Particle accelerator #define WIRE_PARTICLE_POWER "Power Toggle" // Toggles whether the PA is on or not. diff --git a/code/__DEFINES/zoom.dm b/code/__DEFINES/zoom.dm new file mode 100644 index 000000000000..f36a97019aa2 --- /dev/null +++ b/code/__DEFINES/zoom.dm @@ -0,0 +1,5 @@ +///How the scope component is toggled. +/// Wielding the object with both hands toggles the zoom. Requires the two-handed component to work. +#define ZOOM_METHOD_WIELD 1 +/// Activated by clicking an item action button specified by the `item_action_type` var. +#define ZOOM_METHOD_ITEM_ACTION 2 diff --git a/code/__HELPERS/iconprocs.dm b/code/__HELPERS/iconprocs.dm index 533d66d52d30..e3e948f64f1f 100644 --- a/code/__HELPERS/iconprocs.dm +++ b/code/__HELPERS/iconprocs.dm @@ -445,9 +445,9 @@ GLOBAL_LIST_EMPTY(bicon_cache) * * frame - what frame of the icon_state's animation for the icon being used * * moving - whether or not to use a moving state for the given icon * * sourceonly - if TRUE, only generate the asset and send back the asset url, instead of tags that display the icon to players - * * extra_clases - string of extra css classes to use when returning the icon string + * * extra_classes - string of extra css classes to use when returning the icon string */ -/proc/icon2html(atom/thing, client/target, icon_state, dir = SOUTH, frame = 1, moving = FALSE, sourceonly = FALSE, extra_classes = null) +/proc/icon2asset(atom/thing, client/target, icon_state, dir = SOUTH, frame = 1, moving = FALSE, sourceonly = FALSE, extra_classes = null) if(!thing) return @@ -516,17 +516,15 @@ GLOBAL_LIST_EMPTY(bicon_cache) SSassets.transport.register_asset(key, rsc_ref, file_hash, icon_path) for(var/client_target in targets) SSassets.transport.send_assets(client_target, key) - if(sourceonly) - return SSassets.transport.get_asset_url(key) - return "" + return key -/// Costlier version of icon2html() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs. -/proc/costly_icon2html(thing, target, sourceonly = FALSE) +/// Costlier version of icon2asset() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs. +/proc/costly_icon2asset(thing, target, sourceonly = FALSE) if(!thing) return if(isicon(thing)) - return icon2html(thing, target) + return icon2asset(thing, target) var/icon/I = getFlatIcon(thing) - return icon2html(I, target, sourceonly = sourceonly) + return icon2asset(I, target) diff --git a/code/__HELPERS/trait_helpers.dm b/code/__HELPERS/trait_helpers.dm index aeb341bc7ea8..3cb5928179a1 100644 --- a/code/__HELPERS/trait_helpers.dm +++ b/code/__HELPERS/trait_helpers.dm @@ -223,6 +223,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_CAN_VIEW_HEALTH "can_view_health" // Also used for /Stat #define TRAIT_MAGPULSE "magnetificent" // Used for anything that is magboot related #define TRAIT_NOSLIP "noslip" +#define TRAIT_SCOPED "user_scoped" #define TRAIT_MEPHEDRONE_ADAPTED "mephedrone_adapted" // Trait that changes the ending effects of twitch leaving your system #define TRAIT_NOKNOCKDOWNSLOWDOWN "noknockdownslowdown" //If this person has this trait, they are not slowed via knockdown, but they can be hit by bullets like a self knockdown #define TRAIT_CAN_STRIP "can_strip" // This mob can strip other mobs. diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 7d9cf49c61f8..f918fe47277f 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -35,6 +35,9 @@ GLOBAL_LIST_EMPTY(beacons) GLOBAL_LIST_EMPTY(shuttle_caller_list) //list of all communication consoles, comms consoles circuit and AIs, for automatic shuttle calls when there are none. GLOBAL_LIST_EMPTY(tracked_implants) //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented... GLOBAL_LIST_EMPTY(pinpointer_list) //list of all pinpointers. Used to change stuff they are pointing to all at once. +GLOBAL_LIST_EMPTY(nuke_list) //list of (real) nukes +GLOBAL_LIST_EMPTY(syndi_nuke_list) //list of syndicate nukes +GLOBAL_LIST_EMPTY(nad_list) //list of (real) nuclear authentication disks GLOBAL_LIST_EMPTY(nuclear_uplink_list) //list of all existing nuke ops uplinks GLOBAL_LIST_EMPTY(abductor_equipment) //list of all abductor equipment GLOBAL_LIST_EMPTY(global_intercoms) //list of all intercomms, across all z-levels diff --git a/code/_globalvars/mapping_vars.dm b/code/_globalvars/mapping_vars.dm index ee12fedfde9b..1bca34c67944 100644 --- a/code/_globalvars/mapping_vars.dm +++ b/code/_globalvars/mapping_vars.dm @@ -38,6 +38,7 @@ GLOBAL_LIST_EMPTY(nukedisc_respawn) GLOBAL_LIST_EMPTY(ninjastart) GLOBAL_LIST_EMPTY(carplist) //list of all carp-spawn landmarks GLOBAL_LIST_EMPTY(syndicateofficer) +GLOBAL_LIST_EMPTY(roundstart_observer_start) // Away missions GLOBAL_LIST_EMPTY(awaydestinations) // SS220 EDIT - ADDITION diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 4bd180b82225..2e1fc13f5db9 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -88,6 +88,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_FORCED_STANDING" = TRAIT_FORCED_STANDING, "TRAIT_NOSLIP" = TRAIT_NOSLIP, "TRAIT_MAGPULSE" = TRAIT_MAGPULSE, + "TRAIT_SCOPED" = TRAIT_SCOPED, "TRAIT_MEPHEDRONE_ADAPTED" = TRAIT_MEPHEDRONE_ADAPTED, "TRAIT_NOKNOCKDOWNSLOWDOWN" = TRAIT_NOKNOCKDOWNSLOWDOWN, "TRAIT_CAN_STRIP" = TRAIT_CAN_STRIP diff --git a/code/controllers/subsystem/SSnano_mob_hunter.dm b/code/controllers/subsystem/SSnano_mob_hunter.dm deleted file mode 100644 index 93e622f3ae1b..000000000000 --- a/code/controllers/subsystem/SSnano_mob_hunter.dm +++ /dev/null @@ -1,155 +0,0 @@ -SUBSYSTEM_DEF(mob_hunt) - name = "Nano-Mob Hunter GO Server" - priority = FIRE_PRIORITY_NANOMOB // Low priority, no need for MC_TICK_CHECK due to extremely low performance impact. - flags = SS_NO_INIT - offline_implications = "Nano-Mob Hunter will no longer spawn mobs. No immediate action is needed." - cpu_display = SS_CPUDISPLAY_LOW - var/max_normal_spawns = 15 //change this to adjust the number of normal spawns that can exist at one time. trapped spawns (from traitors) don't count towards this - var/list/normal_spawns = list() - var/max_trap_spawns = 15 //change this to adjust the number of trap spawns that can exist at one time. traps spawned beyond this point clear the oldest traps - var/list/trap_spawns = list() - var/list/connected_clients = list() - var/server_status = 1 //1 is online, 0 is offline - var/reset_cooldown = 0 //number of controller cycles before the manual_reboot proc can be used again (ignored if server is offline so you can always boot back up) - var/obj/machinery/computer/mob_battle_terminal/red_terminal - var/obj/machinery/computer/mob_battle_terminal/blue_terminal - var/battle_turn = null - -/datum/controller/subsystem/mob_hunt/fire(resumed = FALSE) - if(reset_cooldown) //if reset_cooldown is set (we are on cooldown, duh), reduce the remaining cooldown every cycle - reset_cooldown-- - if(!server_status) - return - client_mob_update() - if(length(normal_spawns) < max_normal_spawns) - spawn_mob() - -//leaving this here in case admins want to use it for a random mini-event or something -/datum/controller/subsystem/mob_hunt/proc/server_crash(recover_time = 3000) - server_status = 0 - for(var/datum/data/pda/app/mob_hunter_game/client in connected_clients) - client.disconnect("Server Crash") - for(var/obj/effect/nanomob/N in trap_spawns) - N.despawn() - for(var/obj/effect/nanomob/N in normal_spawns) - N.despawn() - //just in case - normal_spawns.Cut() - trap_spawns.Cut() - connected_clients.Cut() - if(!isnum(recover_time)) - recover_time = 3000 - if(recover_time > 0) //when provided with a negative or zero valued recover_time argument, the server won't auto-restart but can be manually rebooted still - //set a timer to automatically recover after recover_time has passed (can be manually restarted if you get impatient too) - addtimer(CALLBACK(src, PROC_REF(auto_recover)), recover_time, TIMER_UNIQUE) - -/datum/controller/subsystem/mob_hunt/proc/client_mob_update() - var/list/ex_players = list() - for(var/datum/data/pda/app/mob_hunter_game/client in connected_clients) - var/mob/living/carbon/human/H = client.get_player() - if(connected_clients[client]) - if(!H || H != connected_clients[client]) - ex_players |= connected_clients[client] - connected_clients[client] = H - if(length(ex_players)) //to make sure we don't do this if we didn't lose any player since the last update - for(var/obj/effect/nanomob/N in (normal_spawns + trap_spawns)) - N.conceal(ex_players) - -/datum/controller/subsystem/mob_hunt/proc/auto_recover() - if(server_status != 0) - return - server_status = 1 - while(length(normal_spawns) < max_normal_spawns) //repopulate the server's spawns completely if we auto-recover from crash - spawn_mob() - -/datum/controller/subsystem/mob_hunt/proc/manual_reboot() - if(server_status && reset_cooldown) - return 0 - for(var/obj/effect/nanomob/N in trap_spawns) - N.despawn() - for(var/obj/effect/nanomob/N in normal_spawns) - N.despawn() - server_status = 1 - reset_cooldown = 25 //25 controller cycle cooldown for manual restarts - return 1 - -/datum/controller/subsystem/mob_hunt/proc/spawn_mob() - var/list/nanomob_types = subtypesof(/datum/mob_hunt) - var/datum/mob_hunt/mob_info = pick(nanomob_types) - new mob_info() - -/datum/controller/subsystem/mob_hunt/proc/register_spawn(datum/mob_hunt/mob_info) - if(!mob_info) - return 0 - var/obj/effect/nanomob/new_mob = new /obj/effect/nanomob(mob_info.spawn_point, mob_info) - normal_spawns += new_mob - new_mob.reveal() - return 1 - -/datum/controller/subsystem/mob_hunt/proc/register_trap(datum/mob_hunt/mob_info) - if(!mob_info) - return 0 - if(!mob_info.is_trap) - return register_spawn(mob_info) - var/obj/effect/nanomob/new_mob = new /obj/effect/nanomob(mob_info.spawn_point, mob_info) - trap_spawns += new_mob - new_mob.reveal() - if(length(trap_spawns) > max_trap_spawns) - var/obj/effect/nanomob/old_trap = trap_spawns[1] - old_trap.despawn() - return 1 - -/datum/controller/subsystem/mob_hunt/proc/start_check() - if(battle_turn) //somehow we got called mid-battle, so lets just stop now - return - if(red_terminal && red_terminal.ready && blue_terminal && blue_terminal.ready) - battle_turn = pick("Red", "Blue") - red_terminal.atom_say("Battle starting!") - blue_terminal.atom_say("Battle starting!") - if(battle_turn == "Red") - red_terminal.atom_say("Red Player's Turn!") - else if(battle_turn == "Blue") - blue_terminal.atom_say("Blue Player's Turn!") - -/datum/controller/subsystem/mob_hunt/proc/launch_attack(team, raw_damage, datum/mob_type/attack_type) - if(!team || !raw_damage) - return - var/obj/machinery/computer/mob_battle_terminal/target = null - if(team == "Red") - target = blue_terminal - else if(team == "Blue") - target = red_terminal - else - return - target.receive_attack(raw_damage, attack_type) - -/datum/controller/subsystem/mob_hunt/proc/end_battle(loser, surrender = 0) - var/obj/machinery/computer/mob_battle_terminal/winner_terminal = null - var/obj/machinery/computer/mob_battle_terminal/loser_terminal = null - if(loser == "Red") - loser_terminal = red_terminal - winner_terminal = blue_terminal - else if(loser == "Blue") - loser_terminal = blue_terminal - winner_terminal = red_terminal - battle_turn = null - winner_terminal.ready = FALSE - loser_terminal.ready = FALSE - if(surrender) //surrender doesn't give exp, to avoid people just farming exp without actually doing a battle - winner_terminal.atom_say("Your rival surrendered!") - else - var/progress_message = winner_terminal.mob_info.gain_exp() - winner_terminal.atom_say("[winner_terminal.team] Player wins!") - winner_terminal.atom_say(progress_message) - -/datum/controller/subsystem/mob_hunt/proc/end_turn() - red_terminal.updateUsrDialog() - blue_terminal.updateUsrDialog() - if(!battle_turn) - return - if(battle_turn == "Red") - battle_turn = "Blue" - blue_terminal.atom_say("Blue's turn.") - else if(battle_turn == "Blue") - battle_turn = "Red" - blue_terminal.atom_say("Red's turn.") diff --git a/code/controllers/subsystem/SSshuttles.dm b/code/controllers/subsystem/SSshuttles.dm index 5e5a92bdb05a..c8492e22ee5c 100644 --- a/code/controllers/subsystem/SSshuttles.dm +++ b/code/controllers/subsystem/SSshuttles.dm @@ -38,6 +38,8 @@ SUBSYSTEM_DEF(shuttle) var/custom_escape_shuttle_loading = FALSE /// Whether or not a shuttle is currently being loaded at the template landmark, if it exists. var/loading_shuttle_at_preview_template = FALSE + /// Have we locked in the emergency shuttle, to prevent people from breaking things / wasting player money? + var/emergency_locked_in = FALSE /datum/controller/subsystem/shuttle/Initialize() if(!emergency) @@ -316,6 +318,8 @@ SUBSYSTEM_DEF(shuttle) if(loading_shuttle_at_preview_template) CRASH("A shuttle was already loading at the preview template when another was loaded") + S.preload() + loading_shuttle_at_preview_template = TRUE var/turf/landmark_turf = get_turf(locate("landmark*Shuttle Import")) S.load(landmark_turf, centered = TRUE) @@ -377,6 +381,8 @@ SUBSYSTEM_DEF(shuttle) timer = emergency.timer mode = emergency.mode dock = emergency.get_docked() + if(!dock) //lance moment + dock = getDock("emergency_away") else dock = loaded_shuttle.findRoundstartDock() diff --git a/code/controllers/subsystem/SSstatpanel.dm b/code/controllers/subsystem/SSstatpanel.dm index e584162e5660..08840da95412 100644 --- a/code/controllers/subsystem/SSstatpanel.dm +++ b/code/controllers/subsystem/SSstatpanel.dm @@ -112,11 +112,10 @@ SUBSYSTEM_DEF(statpanels) /// Set the atoms we're meant to display var/datum/object_window_info/obj_window = istype(target.obj_window) ? target.obj_window : new(target) obj_window.atoms_to_show = atoms_to_display - START_PROCESSING(SSobj_tab_items, obj_window) - refresh_client_obj_view(target) + refresh_client_obj_view(target, obj_window.min_index, obj_window.max_index) -/datum/controller/subsystem/statpanels/proc/refresh_client_obj_view(client/refresh) - var/list/turf_items = return_object_images(refresh) +/datum/controller/subsystem/statpanels/proc/refresh_client_obj_view(client/refresh, min_index = 0, max_index = 30) + var/list/turf_items = return_object_images(refresh, min_index, max_index) if(!length(turf_items) || !refresh.mob?.listed_turf) return refresh.stat_panel.send_message("update_listedturf", turf_items) @@ -125,7 +124,7 @@ SUBSYSTEM_DEF(statpanels) /// Returns all our ready object tab images /// Returns a list in the form list(list(object_name, object_ref, loaded_image), ...) -/datum/controller/subsystem/statpanels/proc/return_object_images(client/load_from) +/datum/controller/subsystem/statpanels/proc/return_object_images(client/load_from, min_index, max_index) // You might be inclined to think that this is a waste of cpu time, since we // A: Double iterate over atoms in the build case, or // B: Generate these lists over and over in the refresh case @@ -137,10 +136,18 @@ SUBSYSTEM_DEF(statpanels) return list() var/datum/object_window_info/obj_window = load_from.obj_window + if(!obj_window) + return list() var/list/already_seen = obj_window.atoms_to_images var/list/to_make = obj_window.atoms_to_imagify var/list/turf_items = list() + var/i = 0 for(var/atom/turf_item as anything in obj_window.atoms_to_show) + // Limit what we send to the client's rendered section. + i++ + if(i <= min_index || i > max_index) + continue + // First, we fill up the list of refs to display // If we already have one, just use that var/existing_image = already_seen[turf_item] @@ -148,12 +155,17 @@ SUBSYSTEM_DEF(statpanels) continue // We already have it. Success! if(existing_image) - turf_items[++turf_items.len] = list("[turf_item.name]", turf_item.UID(), existing_image) + turf_items["[i]"] = list("[turf_item.name]", turf_item.UID(), SSassets.transport.get_asset_url(existing_image), existing_image) continue // Now, we're gonna queue image generation out of those refs to_make += turf_item already_seen[turf_item] = OBJ_IMAGE_LOADING obj_window.RegisterSignal(turf_item, COMSIG_PARENT_QDELETING, TYPE_PROC_REF(/datum/object_window_info, viewing_atom_deleted), override = TRUE) // we reset cache if anything in it gets deleted + turf_items["total"] = i + obj_window.min_index = min_index + obj_window.max_index = max_index + if(length(to_make)) + START_PROCESSING(SSobj_tab_items, obj_window) return turf_items #undef OBJ_IMAGE_LOADING @@ -219,6 +231,10 @@ SUBSYSTEM_DEF(statpanels) var/client/parent /// Are we currently tracking a turf? var/actively_tracking = FALSE + /// The minimum index currently sent to the client. + var/min_index = 0 + /// The maximum index currently sent to the client. + var/max_index = 30 /datum/object_window_info/New(client/parent) . = ..() @@ -245,9 +261,9 @@ SUBSYSTEM_DEF(statpanels) var/generated_string if(ismob(thing) || length(thing.overlays) > 2) - generated_string = costly_icon2html(thing, parent, sourceonly=TRUE) + generated_string = costly_icon2asset(thing, parent) else - generated_string = icon2html(thing, parent, sourceonly=TRUE) + generated_string = icon2asset(thing, parent) newly_seen[thing] = generated_string if(TICK_CHECK) @@ -257,7 +273,7 @@ SUBSYSTEM_DEF(statpanels) // If we've not cut yet, do it now if(index) to_make.Cut(1, index + 1) - SSstatpanels.refresh_client_obj_view(parent) + SSstatpanels.refresh_client_obj_view(parent, min_index, max_index) if(!length(to_make)) return PROCESS_KILL @@ -302,6 +318,9 @@ SUBSYSTEM_DEF(statpanels) if(listed_turf) client.stat_panel.send_message("create_listedturf", listed_turf.name) client.obj_window.start_turf_tracking() + client.obj_window.min_index = 0 + client.obj_window.max_index = 30 + SSstatpanels.set_turf_examine_tab(client, src) else client.stat_panel.send_message("remove_listedturf") client.obj_window.stop_turf_tracking() diff --git a/code/datums/action.dm b/code/datums/action.dm index eb6a1a19005f..0a099de316c6 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -78,6 +78,8 @@ /datum/action/proc/Trigger(left_click = TRUE) if(!IsAvailable()) return FALSE + if(SEND_SIGNAL(src, COMSIG_ACTION_TRIGGER, src) & COMPONENT_ACTION_BLOCK_TRIGGER) + return FALSE return TRUE /datum/action/proc/AltTrigger() @@ -570,7 +572,6 @@ var/obj/item/clothing/shoes/magboots/gravity/G = target G.dash(usr) - ///prset for organ actions /datum/action/item_action/organ_action check_flags = AB_CHECK_CONSCIOUS diff --git a/code/datums/components/debris.dm b/code/datums/components/debris.dm index 908c966a9e16..fd1f058fa798 100644 --- a/code/datums/components/debris.dm +++ b/code/datums/components/debris.dm @@ -74,7 +74,7 @@ smoke_visuals.particles.position = list(position_offset, position_offset) smoke_visuals.particles.velocity = list(x_component_smoke, y_component_smoke) - if(debris && !(P.damage_type == BURN)) + if(debris && P.damage_type == BRUTE) debris_visuals = new(parent, /particles/debris) debris_visuals.particles.position = generator("circle", position_offset, position_offset) debris_visuals.particles.velocity = list(x_component, y_component) diff --git a/code/datums/components/fullauto.dm b/code/datums/components/fullauto.dm index cfd4da69ce12..d5c479bd945d 100644 --- a/code/datums/components/fullauto.dm +++ b/code/datums/components/fullauto.dm @@ -262,6 +262,9 @@ current_windup_reduction = (current_windup_reduction + round(autofire_shot_delay * windup_autofire_reduction_multiplier)) timerid = addtimer(CALLBACK(src, PROC_REF(windup_reset), FALSE), windup_spindown, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) + if(shooter.next_move_modifier) //DNA vault, mephemdrone, bluespace slowness debuff. + next_delay = round(next_delay * shooter.next_move_modifier, SSprojectiles.wait) + COOLDOWN_START(src, next_shot_cd, next_delay) if(SEND_SIGNAL(parent, COMSIG_AUTOFIRE_SHOT, target, shooter, allow_akimbo, mouse_parameters) & COMPONENT_AUTOFIRE_SHOT_SUCCESS) diff --git a/code/datums/components/scope.dm b/code/datums/components/scope.dm new file mode 100644 index 000000000000..0763330d7525 --- /dev/null +++ b/code/datums/components/scope.dm @@ -0,0 +1,273 @@ +///A component that allows players to use the item to zoom out. Mainly intended for firearms, but now works with other items too. +/datum/component/scope + /// How far the view can be moved from the player. At 1, it can be moved by the player's view distance; other values scale linearly. + var/range_modifier = 1 + /// Fullscreen object we use for tracking. + var/atom/movable/screen/fullscreen/stretch/cursor_catcher/scope/tracker + /// The owner of the tracker's ckey. For comparing with the current owner mob, in case the client has left it (e.g. ghosted). + var/tracker_owner_ckey + /// The method which we zoom in and out + var/zoom_method = ZOOM_METHOD_ITEM_ACTION + /// if not null, an item action will be added. Redundant if the mode is ZOOM_METHOD_RIGHT_CLICK or ZOOM_METHOD_WIELD. + var/item_action_type + /// Time to scope up, if you want the scope to take time to boot up. Used by the LWAP + var/time_to_scope + /// Do we let the user scope and click on the middle of their screen? + var/allow_middle_click = FALSE + /// Do we have the scope cancel on move? + var/movement_cancels_scope = FALSE + +/datum/component/scope/Initialize(range_modifier = 1, zoom_method = ZOOM_METHOD_ITEM_ACTION, item_action_type = /datum/action/zoom, time_to_scope = 0, allow_middle_click = FALSE, movement_cancels_scope = FALSE) + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + src.range_modifier = range_modifier + src.zoom_method = zoom_method + src.item_action_type = item_action_type + src.time_to_scope = time_to_scope + src.allow_middle_click = allow_middle_click + src.movement_cancels_scope = movement_cancels_scope + + +/datum/component/scope/Destroy(force) + if(is_zoomed_in()) + stop_zooming(tracker.owner) + return ..() + +/datum/component/scope/RegisterWithParent() + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) //Checks for being removed for person, not mob movement + if(zoom_method == ZOOM_METHOD_WIELD) + RegisterSignal(parent, SIGNAL_ADDTRAIT(TRAIT_WIELDED), PROC_REF(on_wielded)) + RegisterSignal(parent, SIGNAL_REMOVETRAIT(TRAIT_WIELDED), PROC_REF(on_unwielded)) + if(item_action_type) + var/obj/item/parent_item = parent + var/datum/action/scope = new item_action_type(parent) + parent_item.actions += scope + RegisterSignal(scope, COMSIG_ACTION_TRIGGER, PROC_REF(on_action_trigger)) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine)) + if(istype(parent, /obj/item/gun)) + RegisterSignal(parent, COMSIG_GUN_TRY_FIRE, PROC_REF(on_gun_fire)) + +/datum/component/scope/UnregisterFromParent() + if(item_action_type) + var/obj/item/parent_item = parent + var/datum/action/scope = locate(item_action_type) in parent_item.actions + parent_item.actions -= scope + UnregisterSignal(parent, list( + COMSIG_MOVABLE_MOVED, + SIGNAL_ADDTRAIT(TRAIT_WIELDED), + SIGNAL_REMOVETRAIT(TRAIT_WIELDED), + COMSIG_GUN_TRY_FIRE, + COMSIG_PARENT_EXAMINE, + )) + +/datum/component/scope/process() + var/mob/user_mob = tracker.owner + var/client/user_client = user_mob.client + if(!user_client) + stop_zooming(user_mob) + return + tracker.calculate_params() + animate(user_client, world.tick_lag, pixel_x = tracker.given_x, pixel_y = tracker.given_y) + +/datum/component/scope/proc/on_move(atom/movable/source, atom/oldloc, dir, forced) + SIGNAL_HANDLER // COMSIG_MOVABLE_MOVED + + if(!is_zoomed_in()) + return + if(source.loc != tracker.owner) //Dropped. + to_chat(tracker.owner, "[parent]'s scope is overloaded by movement and shuts down!") + stop_zooming(tracker.owner) + +/datum/component/scope/proc/on_action_trigger(datum/action/source) + SIGNAL_HANDLER // COMSIG_ACTION_TRIGGER + var/obj/item/item = source.target + var/mob/living/user = item.loc + if(is_internal_organ(item)) + var/obj/item/organ/internal/O = item + user = O.owner + if(is_zoomed_in()) + stop_zooming(user) + else + INVOKE_ASYNC(src, PROC_REF(zoom), user) + +/datum/component/scope/proc/on_wielded(obj/item/source, trait) + SIGNAL_HANDLER // SIGNAL_ADDTRAIT(TRAIT_WIELDED) + var/mob/living/user = source.loc + INVOKE_ASYNC(src, PROC_REF(zoom), user) + +/datum/component/scope/proc/on_unwielded(obj/item/source, trait) + SIGNAL_HANDLER // SIGNAL_REMOVETRAIT(TRAIT_WIELDED) + var/mob/living/user = source.loc + stop_zooming(user) + +/datum/component/scope/proc/on_gun_fire(obj/item/gun/source, mob/living/user, atom/target, flag, params) + SIGNAL_HANDLER // COMSIG_GUN_TRY_FIRE + if(!tracker?.given_turf || target == get_target(tracker.given_turf)) + return NONE + INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item, afterattack), get_target(tracker.given_turf), user) + return COMPONENT_CANCEL_GUN_FIRE + +/datum/component/scope/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER // COMSIG_PARENT_EXAMINE + + var/scope = istype(parent, /obj/item/gun) ? "scope in" : "zoom out" + switch(zoom_method) + if(ZOOM_METHOD_WIELD) + examine_list += "You can [scope] by wielding it with both hands." + +/** + * We find and return the best target to hit on a given turf. + * + * Arguments: + * * target_turf: The turf we are looking for targets on. +*/ +/datum/component/scope/proc/get_target(turf/target_turf) + var/list/non_dense_targets = list() + for(var/atom/movable/possible_target in target_turf) + if(possible_target.layer <= PROJECTILE_HIT_THRESHHOLD_LAYER) + continue + if(possible_target.invisibility > tracker.owner.see_invisible) + continue + if(!possible_target.mouse_opacity) + continue + if(iseffect(possible_target)) + continue + if(ismob(possible_target)) + if(possible_target == tracker.owner) + continue + return possible_target + if(!possible_target.density) + non_dense_targets += possible_target + continue + return possible_target + if(length(non_dense_targets)) + return non_dense_targets[1] + return target_turf + +/** + * We start zooming by adding our tracker overlay and starting our processing. + * + * Arguments: + * * user: The mob we are starting zooming on. +*/ +/datum/component/scope/proc/zoom(mob/user) + if(isnull(user.client)) + return + if(HAS_TRAIT(user, TRAIT_SCOPED)) + to_chat(user, "You are already zoomed in!") + return + if(time_to_scope) + if(!do_after_once(user, time_to_scope, target = parent)) + return + user.playsound_local(parent, 'sound/weapons/scope.ogg', 75, TRUE) + tracker = user.overlay_fullscreen("scope", /atom/movable/screen/fullscreen/stretch/cursor_catcher/scope, istype(parent, /obj/item/gun)) + tracker.assign_to_mob(user, range_modifier) + if(movement_cancels_scope) + RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + if(allow_middle_click) + RegisterSignal(tracker, COMSIG_CLICK, PROC_REF(generic_click)) + tracker_owner_ckey = user.ckey + if(user.is_holding(parent)) + RegisterSignals(user, list(COMSIG_CARBON_SWAP_HANDS, COMSIG_PARENT_QDELETING), PROC_REF(stop_zooming)) + else // The item is likely worn. + RegisterSignal(user, COMSIG_PARENT_QDELETING, PROC_REF(stop_zooming)) + var/static/list/capacity_signals = list( + COMSIG_LIVING_STATUS_PARALYSE, + COMSIG_LIVING_STATUS_STUN, + ) + RegisterSignals(user, capacity_signals, PROC_REF(on_incapacitated)) + START_PROCESSING(SSprojectiles, src) + ADD_TRAIT(user, TRAIT_SCOPED, "[UID(src)]") + if(istype(parent, /obj/item/gun)) + var/obj/item/gun/G = parent + G.on_scope_success(user) + return TRUE + +/datum/component/scope/proc/on_incapacitated(mob/living/source, amount = 0, ignore_canstun = FALSE) + SIGNAL_HANDLER // COMSIG_LIVING_STATUS_PARALYSE, COMSIG_LIVING_STATUS_STUN + + if(amount > 0) + stop_zooming(source) + +/datum/component/scope/proc/generic_click(/obj/source, location, control, params) + SIGNAL_HANDLER // COMSIG_CLICK + INVOKE_ASYNC(tracker.owner, TYPE_PROC_REF(/mob, ClickOn), get_target(tracker.given_turf), params) + +/** + * We stop zooming, canceling processing, resetting stuff back to normal and deleting our tracker. + * + * Arguments: + * * user: The mob we are canceling zooming on. +*/ +/datum/component/scope/proc/stop_zooming(mob/user) + SIGNAL_HANDLER // COMSIG_CARBON_SWAP_HANDS, COMSIG_PARENT_QDELETING + + if(!HAS_TRAIT(user, TRAIT_SCOPED)) + return + + STOP_PROCESSING(SSprojectiles, src) + UnregisterSignal(user, list( + COMSIG_LIVING_STATUS_PARALYSE, + COMSIG_LIVING_STATUS_STUN, + COMSIG_CARBON_SWAP_HANDS, + COMSIG_PARENT_QDELETING, + )) + REMOVE_TRAIT(user, TRAIT_SCOPED, "[UID(src)]") + + user.playsound_local(parent, 'sound/weapons/scope.ogg', 75, TRUE, frequency = -1) + user.clear_fullscreen("scope") + + // if the client has ended up in another mob, find that mob so we can fix their cursor + var/mob/true_user + if(user.ckey != tracker_owner_ckey) + true_user = get_mob_by_ckey(tracker_owner_ckey) + + if(!isnull(true_user)) + user = true_user + + if(user.client) + animate(user.client, 0.2 SECONDS, pixel_x = 0, pixel_y = 0) + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) + QDEL_NULL(tracker) + tracker_owner_ckey = null + if(istype(parent, /obj/item/gun)) + var/obj/item/gun/G = parent + G.on_scope_end(user) + +/datum/component/scope/proc/is_zoomed_in() + return !!tracker + +/atom/movable/screen/fullscreen/stretch/cursor_catcher/scope + icon = 'icons/mob/screen_scope.dmi' + icon_state = "scope" + /// Multiplier for given_X an given_y. + var/range_modifier = 1 + +/atom/movable/screen/fullscreen/stretch/cursor_catcher/scope/assign_to_mob(mob/new_owner, range_modifier) + src.range_modifier = range_modifier + return ..() + +/atom/movable/screen/fullscreen/stretch/cursor_catcher/scope/Click(location, control, params) + if(usr == owner) + calculate_params() + SEND_SIGNAL(src, COMSIG_CLICK, location, control, params) + + return ..() + +/atom/movable/screen/fullscreen/stretch/cursor_catcher/scope/calculate_params() + var/list/modifiers = params2list(mouse_params) + var/icon_x = text2num(LAZYACCESS(modifiers, "vis-x")) + if(isnull(icon_x)) + icon_x = text2num(LAZYACCESS(modifiers, "icon-x")) + var/icon_y = text2num(LAZYACCESS(modifiers, "vis-y")) + if(isnull(icon_y)) + icon_y = text2num(LAZYACCESS(modifiers, "icon-y")) + given_x = round(range_modifier * (icon_x - view_list[1] * world.icon_size / 2)) + given_y = round(range_modifier * (icon_y - view_list[2] * world.icon_size / 2)) + given_turf = locate(owner.x + round(given_x / world.icon_size, 1), owner.y + round(given_y / world.icon_size, 1), owner.z) + + +/datum/action/zoom + name = "Toggle Scope" + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING + button_icon_state = "sniper_zoom" diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index 239a71da0a7d..98ccb16f1ea7 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -224,3 +224,11 @@ suffix = "lavaland_surface_watcher_grave.dmm" cost = 5 allow_duplicates = FALSE + +/datum/map_template/ruin/lavaland/shuttlecrash + name = "Crashed Passenger Shuttle" + id = "shuttlecrash" + description = "A passenger shuttle crashsite of indeterminate origin." + suffix = "lavaland_surface_shuttlecrash.dmm" + cost = 5 + allow_duplicates = FALSE diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index a848d94a8bc3..c8f79bfcf12e 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -8,6 +8,9 @@ var/description var/admin_notes +/datum/map_template/shuttle/proc/preload() + return + /datum/map_template/shuttle/New() if(port_id && suffix) shuttle_id = "[port_id]_[suffix]" @@ -125,6 +128,43 @@ description = "Guaranteed to get you somewhere FAST. With a custom-built plasma engine, this bad boy will put more distance between you and certain danger than any other!" admin_notes = "The aft of the ship has a plasma tank that starts ignited. May get released by crew. The plasma windows next to the engine heaters will also erupt into flame, and also risk getting released by crew." +/datum/map_template/shuttle/emergency/lance + suffix = "lance" + name = "The Lance Crew Evacuation System" + description = "A brand new shuttle by Nanotrasen's finest in shuttle-engineering, it's designed to tactically slam into a destroyed station, \ + dispatching threats and saving crew at the same time! \ + Be careful to stay out of it's path. Comes with a beacon to choose where it docks!" + admin_notes = "WARNING: This shuttle is designed to crash into the station. It has turrets, similar to the raven. Place down the beacon please. Once the shuttle is loaded, it cannot be unloaded." + +/datum/map_template/shuttle/emergency/lance/preload() + message_admins("Preloading [name]!") + var/obj/docking_port/stationary/CCport + CCport = SSshuttle.getDock("emergency_away") + CCport.setDir(4) + CCport.forceMove(locate(136, 107, 1)) + CCport.height = 50 + CCport.dheight = 0 + CCport.width = 19 + CCport.dwidth = 9 + var/obj/docking_port/stationary/CCtransit + CCtransit = SSshuttle.getDock("emergency_transit") + CCtransit.setDir(2) + CCtransit.forceMove(locate(113, 68, 1)) + CCtransit.height = 50 + CCtransit.dheight = 0 + CCtransit.width = 19 + CCtransit.dwidth = 9 + var/obj/docking_port/stationary/syndicate + syndicate = SSshuttle.getDock("emergency_syndicate") + syndicate.setDir(8) + syndicate.forceMove(locate(202, 199, 1)) + syndicate.height = 50 + syndicate.dheight = 0 + syndicate.width = 19 + syndicate.dwidth = 9 + qdel(SSshuttle.getDock("emergency_home"), TRUE) + SSshuttle.emergency_locked_in = TRUE + /datum/map_template/shuttle/ferry/base suffix = "base" name = "transport ferry" diff --git a/code/datums/spell_handler/vampire.dm b/code/datums/spell_handler/vampire.dm index d22a4576beed..837976a61308 100644 --- a/code/datums/spell_handler/vampire.dm +++ b/code/datums/spell_handler/vampire.dm @@ -36,8 +36,8 @@ return var/datum/antagonist/vampire/vampire = user.mind.has_antag_datum(/datum/antagonist/vampire) - - vampire.bloodusable -= calculate_blood_cost(vampire) + var/blood_cost = calculate_blood_cost(vampire) + vampire.subtract_usable_blood(blood_cost) /datum/spell_handler/vampire/proc/calculate_blood_cost(datum/antagonist/vampire/vampire) var/blood_cost_modifier = 1 + vampire.nullified / 100 diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index 3e952b8ef7f5..8920b4d44f00 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -218,26 +218,11 @@ tick_interval = 4 /// The number of people the gun has locked on to. Caps at 10 for sanity. var/locks = 0 - /// What direction the owner was in when using the scope. - var/owner_dir = 0 - -/datum/status_effect/lwap_scope/on_creation(mob/living/new_owner, stored_dir = 0) - owner_dir = stored_dir - return ..() /datum/status_effect/lwap_scope/tick() locks = 0 - var/turf/owner_turf = get_turf(owner) - var/scope_turf - for(var/turf/T in RANGE_EDGE_TURFS(7, owner_turf)) - if(get_dir(owner, T) != owner_dir) - continue - if(T in range(owner, 6)) - continue - scope_turf = T - break - if(scope_turf) - for(var/mob/living/L in range(10, scope_turf)) + for(var/atom/movable/screen/fullscreen/stretch/cursor_catcher/scope/our_scope in owner.client.screen) + for(var/mob/living/L in range(10, our_scope.given_turf)) if(locks >= LWAP_LOCK_CAP) return if(L == owner || L.stat == DEAD || isslime(L) || ismonkeybasic(L)) //xenobio moment diff --git a/code/datums/uplink_items/uplink_general.dm b/code/datums/uplink_items/uplink_general.dm index a58bbf324dd7..c55eefdd2077 100644 --- a/code/datums/uplink_items/uplink_general.dm +++ b/code/datums/uplink_items/uplink_general.dm @@ -133,11 +133,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) if(limited_stock > 0) limited_stock-- log_game("[key_name(user)] purchased [name]. [name] was discounted to [cost].") + user.create_log(MISC_LOG, "Uplink purchase: [name] was discounted to [cost]tc") if(!user.mind.special_role) message_admins("[key_name_admin(user)] purchased [name] (discounted to [cost]), as a non antagonist.") else log_game("[key_name(user)] purchased [name].") + user.create_log(MISC_LOG, "Uplink purchase: [name] for [cost]tc") if(!user.mind.special_role) message_admins("[key_name_admin(user)] purchased [name], as a non antagonist.") @@ -388,7 +390,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/explosives/plastic_explosives name = "Composition C-4" - desc = "C-4 is plastic explosive of the common variety Composition C. Reliably destroys the object it's placed on, assuming it isn't bomb resistant. Does not stick to crewmembers. Will only destroy station floors if placed directly on it. It has a modifiable timer with a minimum setting of 10 seconds." + desc = "C-4 is plastic explosive of the common variety Composition C. Reliably destroys the object it's placed on, assuming it isn't bomb resistant. Remarkably good for disposing bodies, or tired crewmates. Will only destroy station floors if placed directly on it. It has a modifiable timer with a minimum setting of 10 seconds." reference = "C4" item = /obj/item/grenade/plastic/c4 cost = 5 @@ -853,6 +855,16 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/autosurgeon/organ/syndicate/razorwire cost = 20 +/datum/uplink_item/cyber_implants/scope_eyes + name = "Hardened Kaleido Optics Eyes Autoimplanter" + desc = "These cybernetic eye implants will let you zoom in on far away objects. \ + Many users find it disorienting, and find it hard to interact with things near them when active. \ + This pair has been hardened for special operations personnel." + reference = "KOE" + item = /obj/item/autosurgeon/organ/syndicate/scope_eyes + cost = 20 + + // POINTLESS BADASSERY /datum/uplink_item/badass diff --git a/code/datums/wires/nuclearbomb_wires.dm b/code/datums/wires/nuclearbomb_wires.dm index c997e183d7cf..0fe19c82952a 100644 --- a/code/datums/wires/nuclearbomb_wires.dm +++ b/code/datums/wires/nuclearbomb_wires.dm @@ -1,11 +1,12 @@ /datum/wires/nuclearbomb holder_type = /obj/machinery/nuclearbomb + labelled = TRUE randomize = TRUE - wire_count = 7 // 3 actual, 4 duds. + wire_count = 5 proper_name = "Nuclear bomb" /datum/wires/nuclearbomb/New(atom/_holder) - wires = list(WIRE_BOMB_LIGHT, WIRE_BOMB_TIMING, WIRE_BOMB_SAFETY) + wires = list(WIRE_NUKE_SAFETY, WIRE_NUKE_DETONATOR, WIRE_NUKE_DISARM, WIRE_NUKE_LIGHT, WIRE_NUKE_CONTROL) return ..() /datum/wires/nuclearbomb/interactable(mob/user) @@ -18,39 +19,64 @@ . = ..() var/obj/machinery/nuclearbomb/N = holder . += "The device is [N.timing ? "shaking!" : "still."]" - . += "The device is [N.safety ? "quiet" : "whirring"]." - . += "The lights are [N.lighthack ? "static" : "functional"]." + . += "The control panel is [is_cut(WIRE_NUKE_CONTROL) ? "turned off" : "functional"]." + . += "The disarm controls are [is_cut(WIRE_NUKE_DISARM) || is_cut(WIRE_NUKE_CONTROL) ? "disabled" : "functional"]." + . += "The safety controls are [is_cut(WIRE_NUKE_SAFETY) || is_cut(WIRE_NUKE_CONTROL) ? "disabled" : "functional"]." + . += "The lights are [is_cut(WIRE_NUKE_LIGHT) ? "static" : "functional"]." /datum/wires/nuclearbomb/on_pulse(wire) var/obj/machinery/nuclearbomb/N = holder switch(wire) - if(WIRE_BOMB_LIGHT) - N.lighthack = !N.lighthack - addtimer(CALLBACK(N, TYPE_PROC_REF(/obj/machinery/nuclearbomb, reset_lighthack_callback)), 10 SECONDS) + if(WIRE_NUKE_SAFETY) + if(!is_cut(WIRE_NUKE_CONTROL)) + N.audible_message("The safety controls flicker.", hearing_distance = 1) - if(WIRE_BOMB_TIMING) + if(WIRE_NUKE_DETONATOR) if(N.timing) - message_admins("[key_name_admin(usr)] pulsed a nuclear bomb's detonation wire, causing it to explode (JMP)") + if(!N.training) + message_admins("[key_name_admin(usr)] pulsed a nuclear bomb's detonator wire, causing it to explode (JMP)") N.explode() + else + N.audible_message("[N] whirrs ominously.", hearing_distance = 1) - if(WIRE_BOMB_SAFETY) - N.safety = !N.safety - addtimer(CALLBACK(N, TYPE_PROC_REF(/obj/machinery/nuclearbomb, reset_safety_callback)), 10 SECONDS) + if(WIRE_NUKE_DISARM) + if(N.timing && is_cut(WIRE_NUKE_CONTROL)) + if(!is_cut(WIRE_NUKE_LIGHT)) + N.icon_state = N.sprite_prefix + "nuclearbomb1" + N.timing = FALSE + N.audible_message("The timer on [N] stops!", hearing_distance = 1) + N.update_icon(UPDATE_OVERLAYS) + if(!N.training) + GLOB.bomb_set = FALSE + if(!N.is_syndicate && !N.training) + SSsecurity_level.set_level(N.previous_level) + else if(N.timing && !is_cut(WIRE_NUKE_CONTROL)) + N.audible_message("The disarm controls flash with an error. You need to disable the control panel first!", hearing_distance = 1) + else if(!is_cut(WIRE_NUKE_CONTROL)) + N.audible_message("The disarm controls flicker.", hearing_distance = 1) + + if(WIRE_NUKE_LIGHT) + N.audible_message("The lights on [N] flicker.", hearing_distance = 1) + flick(N.sprite_prefix + "nuclearbombc", N) + + if(WIRE_NUKE_CONTROL) + N.audible_message("[N]'s control panel flickers.", hearing_distance = 1) /datum/wires/nuclearbomb/on_cut(wire, mend) var/obj/machinery/nuclearbomb/N = holder switch(wire) - if(WIRE_BOMB_SAFETY) - if(N.timing) - message_admins("[key_name_admin(usr)] cut a nuclear bomb's timing wire, causing it to explode (JMP)") + if(WIRE_NUKE_DETONATOR) + if(N.timing && !mend) + if(!N.training) + message_admins("[key_name_admin(usr)] cut a nuclear bomb's detonator wire, causing it to explode (JMP)") N.explode() - if(WIRE_BOMB_TIMING) - if(!N.lighthack) - if(N.icon_state == "nuclearbomb2") - N.icon_state = "nuclearbomb1" - N.timing = FALSE - GLOB.bomb_set = FALSE - - if(WIRE_BOMB_LIGHT) - N.lighthack = !N.lighthack + if(WIRE_NUKE_LIGHT) + if(!mend) + N.icon_state = N.sprite_prefix + "nuclearbomb0" + if(mend) + if(N.timing) + N.icon_state = N.sprite_prefix + "nuclearbomb2" + else + N.icon_state = N.sprite_prefix + "nuclearbomb1" + N.update_icon(UPDATE_OVERLAYS) diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 58fc524c8c0a..3584e4089787 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -2,6 +2,8 @@ /datum/wires /// TRUE if the wires will be different every time a new wire datum is created. var/randomize = FALSE + /// TRUE if the wires are labelled for every user + var/labelled = FALSE /// The atom the wires belong too. For example: an airlock. var/atom/holder /// The holder type; used to make sure that the holder is the correct type. @@ -281,6 +283,8 @@ var/can_probably_see_wires = FALSE var/obj/item/held_item = user.get_active_hand() var/obj/item/offhand = user.get_inactive_hand() + if(labelled) + can_probably_see_wires = TRUE if(istype(held_item) && HAS_TRAIT(held_item, TRAIT_SHOW_WIRE_INFO)) can_probably_see_wires = TRUE if(istype(offhand) && HAS_TRAIT(offhand, TRAIT_SHOW_WIRE_INFO)) diff --git a/code/game/area/ss13_areas/security_areas.dm b/code/game/area/ss13_areas/security_areas.dm index 097827059de0..9e6c4668a299 100644 --- a/code/game/area/ss13_areas/security_areas.dm +++ b/code/game/area/ss13_areas/security_areas.dm @@ -106,6 +106,10 @@ name = "Стрельбище" icon_state = "firingrange" +/area/station/security/defusal + name = "\improper Defusal Workshop" + icon_state = "defusal" + // Checkpoints /area/station/security/checkpoint diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 29bc7c1900a1..67973ec313b7 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -199,7 +199,8 @@ Moved(old_loc, direction, TRUE) /atom/movable/Move(atom/newloc, direct = 0, movetime) - if(!loc || !newloc) return 0 + if(!loc || !newloc) + return FALSE var/atom/oldloc = loc if(loc != newloc) @@ -321,7 +322,7 @@ Moved(old_loc, NONE) - return 1 + return TRUE /atom/movable/proc/onTransitZ(old_z,new_z) for(var/item in src) // Notify contents of Z-transition. This can be overridden if we know the items contents do not care. @@ -348,36 +349,36 @@ //Called whenever an object moves and by mobs when they attempt to move themselves through space //And when an object or action applies a force on src, see newtonian_move() below -//Return 0 to have src start/keep drifting in a no-grav area and 1 to stop/not start drifting -//Mobs should return 1 if they should be able to move of their own volition, see client/Move() in mob_movement.dm +//return FALSE to have src start/keep drifting in a no-grav area and TRUE to stop/not start drifting +//Mobs should return TRUE if they should be able to move of their own volition, see client/Move() in mob_movement.dm //movement_dir == 0 when stopping or any dir when trying to move /atom/movable/proc/Process_Spacemove(movement_dir = 0) if(has_gravity(src)) - return 1 + return TRUE if(pulledby && !pulledby.pulling) - return 1 + return TRUE if(throwing) - return 1 + return TRUE if(locate(/obj/structure/lattice) in range(1, get_turf(src))) //Not realistic but makes pushing things in space easier - return 1 + return TRUE - return 0 + return FALSE /atom/movable/proc/newtonian_move(direction) //Only moves the object if it's under no gravity if(!loc || Process_Spacemove(0)) inertia_dir = 0 - return 0 + return FALSE inertia_dir = direction if(!direction) - return 1 + return TRUE inertia_last_loc = loc SSspacedrift.processing[src] = src - return 1 + return TRUE //called when src is thrown into hit_atom /atom/movable/proc/throw_impact(atom/hit_atom, throwingdatum) @@ -397,7 +398,7 @@ /atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, dodgeable = TRUE, block_movement = TRUE) if(!target || (flags & NODROP) || speed <= 0) - return 0 + return FALSE if(pulledby) pulledby.stop_pulling() @@ -500,8 +501,8 @@ last_move = buckled_mob.last_move inertia_dir = last_move buckled_mob.inertia_dir = last_move - return 0 - return 1 + return FALSE + return TRUE /atom/movable/proc/force_pushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) return FALSE @@ -521,7 +522,7 @@ /atom/movable/CanPass(atom/movable/mover, turf/target, height=1.5) if(mover in buckled_mobs) - return 1 + return TRUE return ..() /atom/movable/proc/get_spacemove_backup() diff --git a/code/game/dna/mutations/mutation_powers.dm b/code/game/dna/mutations/mutation_powers.dm index 0c974c59d64b..da930664a2ce 100644 --- a/code/game/dna/mutations/mutation_powers.dm +++ b/code/game/dna/mutations/mutation_powers.dm @@ -394,6 +394,9 @@ return var/atom/movable/the_item = targets[1] + if(!user.Adjacent(the_item)) + to_chat(user, "You need to be next to [the_item] for this!") + return FALSE if(ishuman(the_item)) var/mob/living/carbon/human/H = the_item var/obj/item/organ/external/limb = H.get_organ(user.zone_selected) @@ -412,15 +415,14 @@ revert_cast() return FALSE user.visible_message("[user] begins stuffing [the_item]'s [limb.name] into [user.p_their()] gaping maw!") - var/oldloc = H.loc - if(!do_mob(user,H,EAT_MOB_DELAY)) + if(!do_mob(user, H, EAT_MOB_DELAY)) to_chat(user, "You were interrupted before you could eat [the_item]!") else if(!limb || !H) return - if(H.loc != oldloc) - to_chat(user, "\The [limb] moved away from your mouth!") - return + if(!user.Adjacent(the_item)) + to_chat(user, "You need to be next to [the_item] for this!") + return FALSE user.visible_message("[user] [pick("chomps","bites")] off [the_item]'s [limb]!") playsound(user.loc, 'sound/items/eatfood.ogg', 50, 0) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 8d4b34139fa8..921040d015df 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -15,7 +15,7 @@ GLOBAL_VAR(bomb_set) name = "\improper Nuclear Fission Explosive" desc = "Uh oh. RUN!!!!" icon = 'icons/obj/nuclearbomb.dmi' - icon_state = "nuclearbomb0" + icon_state = "nuclearbomb1" density = TRUE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF flags_2 = NO_MALF_EFFECT_2 | CRITICAL_ATOM_2 @@ -25,8 +25,6 @@ GLOBAL_VAR(bomb_set) /// Are our bolts *supposed* to be in the floor, may not actually cause anchoring if the bolts are cut var/extended = TRUE - /// If true, prevents the lights on the nuke - var/lighthack = FALSE /// Countdown to boom var/timeleft = 120 /// Are we counting down? @@ -55,6 +53,10 @@ GLOBAL_VAR(bomb_set) var/core_stage = NUKE_CORE_EVERYTHING_FINE ///How many sheets of various metals we need to fix it var/sheets_to_fix = 5 + /// Is this a training bomb? + var/training = FALSE + /// Prefix to add, if any, on icon states for this bomb + var/sprite_prefix = "" ///Bombs Internal Radio var/obj/item/radio/radio @@ -70,9 +72,10 @@ GLOBAL_VAR(bomb_set) . = ..() r_code = rand(10000, 99999) // Creates a random code upon object spawn. wires = new/datum/wires/nuclearbomb(src) - ADD_TRAIT(src, TRAIT_OBSCURED_WIRES, ROUNDSTART_TRAIT) previous_level = SSsecurity_level.get_current_level_as_text() - GLOB.poi_list |= src + if(!training) + GLOB.poi_list |= src + GLOB.nuke_list |= src core = new /obj/item/nuke_core/plutonium(src) STOP_PROCESSING(SSobj, core) //Let us not irradiate the vault by default. update_icon(UPDATE_OVERLAYS) @@ -81,14 +84,26 @@ GLOBAL_VAR(bomb_set) radio.follow_target = src radio.config(list("Special Ops" = 0)) +/obj/machinery/nuclearbomb/syndicate/Initialize() + . = ..() + wires.labelled = FALSE + ADD_TRAIT(src, TRAIT_OBSCURED_WIRES, ROUNDSTART_TRAIT) + GLOB.syndi_nuke_list |= src + /obj/machinery/nuclearbomb/Destroy() SStgui.close_uis(wires) QDEL_NULL(wires) QDEL_NULL(core) QDEL_NULL(radio) - GLOB.poi_list.Remove(src) + if(!training) + GLOB.poi_list.Remove(src) + GLOB.nuke_list.Remove(src) return ..() +/obj/machinery/nuclearbomb/syndicate/Destroy() + GLOB.syndi_nuke_list.Remove(src) + . = ..() + /obj/machinery/nuclearbomb/process() if(timing) GLOB.bomb_set = TRUE // So long as there is one nuke timing, it means one nuke is armed. @@ -99,6 +114,8 @@ GLOBAL_VAR(bomb_set) /obj/machinery/nuclearbomb/examine(mob/user) . = ..() + if(training) + . += "Alt-Click to reset the bomb." if(!panel_open) . += "The outer panel is screwed shut." switch(removal_stage) @@ -126,15 +143,15 @@ GLOBAL_VAR(bomb_set) underlays.Cut() set_light(0) - if(!lighthack) - underlays += emissive_appearance(icon, "nuclearbomb_lightmask") + if(!wires.is_cut(WIRE_NUKE_LIGHT)) + underlays += emissive_appearance(icon, sprite_prefix + "nukelights_lightmask") set_light(1, LIGHTING_MINIMUM_POWER) if(panel_open) - . += "hackpanel_open" + . += sprite_prefix + "hackpanel_open" if(anchored) // Using anchored due to removal_stage deanchoring having multiple steps - . += "nukebolts" + . += sprite_prefix + "nukebolts" // Selected stage lets us show the open core, even if the front panel is closed var/selected_stage = removal_stage @@ -151,6 +168,12 @@ GLOBAL_VAR(bomb_set) /obj/machinery/nuclearbomb/attackby(obj/item/O as obj, mob/user as mob, params) if(istype(O, /obj/item/disk/nuclear)) if(extended) + if(auth) + to_chat(user, "There's already a disk in the slot!") + return + if((istype(O, /obj/item/disk/nuclear/training) && !training) || (training && !istype(O, /obj/item/disk/nuclear/training))) + to_chat(user, "[O] doesn't fit into [src]!") + return if(!user.drop_item()) to_chat(user, "[O] is stuck to your hand!") return @@ -212,12 +235,15 @@ GLOBAL_VAR(bomb_set) if(!I.tool_use_check(user, 0)) return if(removal_stage == NUKE_COVER_OFF) - user.visible_message("[user] starts forcing open the bolt covers on [src].", "You start forcing open the anchoring bolt covers with [I]...") + user.visible_message("[user] starts forcing open the bolt covers on [src].", "You start forcing open the anchoring bolt covers with [I]...") if(!I.use_tool(src, user, 15, volume = I.tool_volume) || removal_stage != NUKE_COVER_OFF) return - user.visible_message("[user] forces open the bolt covers on [src].", "You force open the bolt covers.") + user.visible_message("[user] forces open the bolt covers on [src].", "You force open the bolt covers.") removal_stage = NUKE_COVER_OPEN if(removal_stage == NUKE_CORE_EVERYTHING_FINE) + if(training) + to_chat(user, "This is where you'd take off the plate to access the internal core, but this training bomb doesn't have one.") + return user.visible_message("[user] starts removing [src]'s outer core plate...", "You start removing [src]'s outer core plate...") if(!I.use_tool(src, user, 4 SECONDS, volume = I.tool_volume) || removal_stage != NUKE_CORE_EVERYTHING_FINE) return @@ -235,10 +261,10 @@ GLOBAL_VAR(bomb_set) if(core) START_PROCESSING(SSobj, core) if(removal_stage == NUKE_UNWRENCHED) - user.visible_message("[user] begins lifting [src] off of the anchors.", "You begin lifting the device off the anchors...") + user.visible_message("[user] begins lifting [src] off of the anchors.", "You begin lifting the device off the anchors...") if(!I.use_tool(src, user, 8 SECONDS, volume = I.tool_volume) || removal_stage != NUKE_UNWRENCHED) return - user.visible_message("[user] crowbars [src] off of the anchors. It can now be moved.", "You jam the crowbar under the nuclear device and lift it off its anchors. You can now move it!") + user.visible_message("[user] crowbars [src] off of the anchors. It can now be moved.", "You jam the crowbar under the nuclear device and lift it off its anchors. You can now move it!") anchored = FALSE removal_stage = NUKE_MOBILE update_icon(UPDATE_OVERLAYS) @@ -251,10 +277,10 @@ GLOBAL_VAR(bomb_set) . = TRUE if(!I.tool_use_check(user, 0)) return - user.visible_message("[user] begins unwrenching the anchoring bolts on [src].", "You begin unwrenching the anchoring bolts...") + user.visible_message("[user] begins unwrenching the anchoring bolts on [src].", "You begin unwrenching the anchoring bolts...") if(!I.use_tool(src, user, 50, volume = I.tool_volume) || removal_stage != NUKE_SEALANT_OPEN) return - user.visible_message("[user] unwrenches the anchoring bolts on [src].", "You unwrench the anchoring bolts.") + user.visible_message("[user] unwrenches the anchoring bolts on [src].", "You unwrench the anchoring bolts.") removal_stage = NUKE_UNWRENCHED update_icon(UPDATE_OVERLAYS) @@ -273,23 +299,23 @@ GLOBAL_VAR(bomb_set) if(auth || (istype(I, /obj/item/screwdriver/nuke) && !is_syndicate)) if(!panel_open) panel_open = TRUE - to_chat(user, "You unscrew the control panel of [src].") + to_chat(user, "You unscrew the control panel of [src].") anchor_stage = removal_stage removal_stage = core_stage else panel_open = FALSE - to_chat(user, "You screw the control panel of [src] back on.") + to_chat(user, "You screw the control panel of [src] back on.") core_stage = removal_stage removal_stage = anchor_stage else if(!panel_open) - to_chat(user, "[src] emits a buzzing noise, the panel staying locked in.") + to_chat(user, "[src] emits a buzzing noise, the panel staying locked in.") if(panel_open) panel_open = FALSE - to_chat(user, "You screw the control panel of [src] back on.") + to_chat(user, "You screw the control panel of [src] back on.") core_stage = removal_stage removal_stage = anchor_stage - flick("nuclearbombc", src) + flick(sprite_prefix + "nuclearbombc", src) update_icon(UPDATE_OVERLAYS) /obj/machinery/nuclearbomb/wirecutter_act(mob/user, obj/item/I) @@ -397,6 +423,8 @@ GLOBAL_VAR(bomb_set) /obj/machinery/nuclearbomb/proc/is_auth(mob/user) if(auth) + if(istype(auth, /obj/item/disk/nuclear/training) && !training) + return FALSE return TRUE else if(user.can_admin_interact()) return TRUE @@ -409,6 +437,9 @@ GLOBAL_VAR(bomb_set) . = TRUE if(exploded) return + if(wires.is_cut(WIRE_NUKE_CONTROL)) + to_chat(usr, "The control panel isn't responding! Something must be wrong with its wiring!") + return FALSE switch(action) if("deploy") if(removal_stage != NUKE_MOBILE) @@ -416,9 +447,9 @@ GLOBAL_VAR(bomb_set) visible_message("With a steely snap, bolts slide out of [src] and anchor it to the flooring!") else visible_message("[src] makes a highly unpleasant crunching noise. It looks like the anchoring bolts have been cut.") - if(!lighthack) - flick("nuclearbombc", src) - icon_state = "nuclearbomb1" + if(!wires.is_cut(WIRE_NUKE_LIGHT)) + flick(sprite_prefix + "nuclearbombc", src) + icon_state = sprite_prefix + "nuclearbomb1" update_icon(UPDATE_OVERLAYS) extended = TRUE return @@ -433,6 +464,8 @@ GLOBAL_VAR(bomb_set) else var/obj/item/I = usr.get_active_hand() if(istype(I, /obj/item/disk/nuclear)) + if((istype(I, /obj/item/disk/nuclear/training) && !training) || (training && !istype(I, /obj/item/disk/nuclear/training))) + return usr.drop_item() I.forceMove(src) auth = I @@ -491,43 +524,57 @@ GLOBAL_VAR(bomb_set) return timeleft = time if("toggle_safety") + if(wires.is_cut(WIRE_NUKE_SAFETY)) + to_chat(usr, "The safety isn't responding! Something must be wrong with its wiring!") + return FALSE safety = !(safety) if(safety) - if(!is_syndicate) + if(!is_syndicate && !training) SSsecurity_level.set_level(previous_level) timing = FALSE - GLOB.bomb_set = FALSE + if(!training) + GLOB.bomb_set = FALSE if("toggle_armed") if(safety) to_chat(usr, "The safety is still on.") return - if(!core) + if(!core && !training) to_chat(usr, "[src]'s screen blinks red! There is no plutonium core in [src]!") return - timing = !(timing) - if(timing) - if(!lighthack) - icon_state = "nuclearbomb2" + if(!timing) + if(wires.is_cut(WIRE_NUKE_DETONATOR)) + to_chat(usr, "[src] isn't arming! Something must be wrong with its wiring!") + return FALSE + timing = TRUE + if(!wires.is_cut(WIRE_NUKE_LIGHT)) + icon_state = sprite_prefix + "nuclearbomb2" update_icon(UPDATE_OVERLAYS) - if(!safety) + if(!safety && !training) message_admins("[key_name_admin(usr)] engaged a nuclear bomb [ADMIN_JMP(src)]") if(!is_syndicate && SSsecurity_level.get_current_level_as_number() != SEC_LEVEL_EPSILON) SSsecurity_level.set_level(SEC_LEVEL_DELTA) GLOB.bomb_set = TRUE // There can still be issues with this resetting when there are multiple bombs. Not a big deal though for Nuke if(SSsecurity_level.get_current_level_as_number() == SEC_LEVEL_EPSILON) radio.autosay("The Nuclear Bomb has been armed, retreat from the station immediately!", name, "Special Ops") - else + else if(!training) GLOB.bomb_set = TRUE else - if(!is_syndicate) + if(wires.is_cut(WIRE_NUKE_DISARM)) + to_chat(usr, "[src] isn't disarming! Something must be wrong with its wiring!") + return FALSE + timing = FALSE + if(!is_syndicate && !training) SSsecurity_level.set_level(previous_level) - GLOB.bomb_set = FALSE - if(!lighthack) - icon_state = "nuclearbomb1" + if(!training) + GLOB.bomb_set = FALSE + if(!wires.is_cut(WIRE_NUKE_LIGHT)) + icon_state = sprite_prefix + "nuclearbomb1" update_icon(UPDATE_OVERLAYS) - /obj/machinery/nuclearbomb/blob_act(obj/structure/blob/B) + if(training) + qdel(src) + return if(exploded) return if(timing) //boom @@ -567,16 +614,19 @@ GLOBAL_VAR(bomb_set) /obj/machinery/nuclearbomb/proc/explode() + if(training) + atom_say("You've triggered the detonate wire. You are dead.") + return if(safety) timing = FALSE return exploded = TRUE yes_code = FALSE safety = TRUE - if(!lighthack) - icon_state = "nuclearbomb3" + if(!wires.is_cut(WIRE_NUKE_LIGHT)) + icon_state = sprite_prefix + "nuclearbomb3" update_icon(UPDATE_OVERLAYS) - playsound(src,'sound/machines/alarm.ogg',100,0,5) + playsound(src, 'sound/machines/alarm.ogg', 100, FALSE, 5) if(SSticker && SSticker.mode) SSticker.mode.explosion_in_progress = TRUE SSticker.event_blackbox(outcome = ROUND_END_NUCLEAR) @@ -618,23 +668,6 @@ GLOBAL_VAR(bomb_set) return return -/obj/machinery/nuclearbomb/proc/reset_lighthack_callback() - lighthack = !lighthack - -/obj/machinery/nuclearbomb/proc/reset_safety_callback() - safety = !safety - if(safety == 1) - if(!is_syndicate) - SSsecurity_level.set_level(previous_level) - visible_message("[src] quiets down.") - if(!lighthack) - if(icon_state == "nuclearbomb2") - icon_state = "nuclearbomb1" - update_icon(UPDATE_OVERLAYS) - - else - visible_message("[src] emits a quiet whirling noise!") - //==========DAT FUKKEN DISK=============== /obj/item/disk/nuclear name = "nuclear authentication disk" @@ -645,6 +678,8 @@ GLOBAL_VAR(bomb_set) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF /// Is the disk restricted to the station? If true, also respawns the disk when deleted var/restricted_to_station = TRUE + /// Is this a training disk? + var/training = FALSE /obj/item/disk/nuclear/unrestricted name = "unrestricted nuclear authentication disk" @@ -655,7 +690,9 @@ GLOBAL_VAR(bomb_set) ..() if(restricted_to_station) START_PROCESSING(SSobj, src) - GLOB.poi_list |= src + if(!training) + GLOB.poi_list |= src + GLOB.nad_list |= src /obj/item/disk/nuclear/process() if(!restricted_to_station) @@ -682,26 +719,32 @@ GLOBAL_VAR(bomb_set) /obj/item/disk/nuclear/Destroy(force) var/turf/diskturf = get_turf(src) + if(training) + return ..() + if(force) - message_admins("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - JMP":"nonexistent location"]).") + message_admins("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - JMP":"nonexistent location"]).") log_game("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z]":"nonexistent location"]).") GLOB.poi_list.Remove(src) + GLOB.nad_list.Remove(src) STOP_PROCESSING(SSobj, src) return ..() if(!restricted_to_station) // Non-restricted NADs should be allowed to be deleted, otherwise it becomes a restricted NAD when teleported - message_admins("[src] (unrestricted) has been deleted in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - JMP":"nonexistent location"]). It will not respawn.") + message_admins("[src] (unrestricted) has been deleted in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - JMP":"nonexistent location"]). It will not respawn.") log_game("[src] (unrestricted) has been deleted in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z]":"nonexistent location"]). It will not respawn.") GLOB.poi_list.Remove(src) + GLOB.nad_list.Remove(src) STOP_PROCESSING(SSobj, src) return ..() var/turf/new_spawn = find_respawn() if(new_spawn) GLOB.poi_list.Remove(src) + GLOB.nad_list.Remove(src) var/obj/item/disk/nuclear/NEWDISK = new(new_spawn) transfer_fingerprints_to(NEWDISK) - message_admins("[src] has been destroyed at ([diskturf.x], [diskturf.y], [diskturf.z] - JMP). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z] - JMP).") + message_admins("[src] has been destroyed at ([diskturf.x], [diskturf.y], [diskturf.z] - JMP). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z] - JMP).") log_game("[src] has been destroyed in ([diskturf.x], [diskturf.y], [diskturf.z]). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z]).") ..() return QDEL_HINT_HARDDEL_NOW // We want this to be deleted ASAP, but we want refs properly cleared too @@ -720,6 +763,54 @@ GLOBAL_VAR(bomb_set) if(length(open_turfs)) return pick(open_turfs) +/// MARK: TRAINING NUKE + +/obj/machinery/nuclearbomb/training + name = "training nuclear bomb" + desc = "A fake nuke used to practice nuclear device operations. \ + The '1' key on the keypad appears to be significantly more worn than the other keys." + icon_state = "t_nuclearbomb1" + resistance_flags = null + training = TRUE + sprite_prefix = "t_" + +/obj/machinery/nuclearbomb/training/Initialize() + . = ..() + r_code = 11111 //Uuh.. one! + qdel(core) + +/obj/machinery/nuclearbomb/training/process() + if(timing) + timeleft = max(timeleft - 2, 0) // 2 seconds per process() + if(timeleft <= 0) + INVOKE_ASYNC(src, PROC_REF(training_detonation)) + +/obj/machinery/nuclearbomb/training/blob_act(obj/structure/blob/B) + qdel(src) + +/obj/machinery/nuclearbomb/training/AltClick(mob/user) + . = ..() + to_chat(user, "You hit the reset button on [src].") + training_reset() + +/obj/machinery/nuclearbomb/training/proc/training_detonation() + atom_say("Nuclear device detonated. Resetting...") + training_reset() + +/obj/machinery/nuclearbomb/training/proc/training_reset() + if(auth) + auth.forceMove(get_turf(src)) + new /obj/machinery/nuclearbomb/training(get_turf(src)) + qdel(src) + +/obj/item/disk/nuclear/training + name = "training authentication disk" + desc = "The code is 11111." + icon_state = "trainingdisk" + resistance_flags = null + restricted_to_station = FALSE + training = TRUE + #undef NUKE_INTACT #undef NUKE_COVER_OFF #undef NUKE_COVER_OPEN diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 6ed2761e5c43..f5f8487e1b2d 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -96,15 +96,15 @@ /obj/item/pinpointer/proc/scandisk() if(!the_disk) - the_disk = locate() + the_disk = locate() in GLOB.nad_list /obj/item/pinpointer/proc/scanbomb() if(!syndicate) if(!the_bomb) - the_bomb = locate() + the_bomb = locate() in GLOB.nuke_list else if(!the_s_bomb) - the_s_bomb = locate() + the_s_bomb = locate() in GLOB.syndi_nuke_list /obj/item/pinpointer/proc/point_at_target(atom/target) if(!target) diff --git a/code/game/gamemodes/steal_items.dm b/code/game/gamemodes/steal_items.dm index ca40f18d0bc5..daf721682359 100644 --- a/code/game/gamemodes/steal_items.dm +++ b/code/game/gamemodes/steal_items.dm @@ -106,6 +106,11 @@ protected_jobs = list("Captain") location_override = "the Captain's Office" +/datum/theft_objective/nukedisc/check_special_completion(obj/item/I) + if(istype(I, /obj/item/disk/nuclear/training)) //Haha no + return FALSE + return TRUE + /datum/theft_objective/reactive name = "any type of reactive armor" typepath = /obj/item/clothing/suit/armor/reactive diff --git a/code/game/gamemodes/wizard/magic_tarot.dm b/code/game/gamemodes/wizard/magic_tarot.dm index e3efcfa81286..5d4cdd5603fc 100644 --- a/code/game/gamemodes/wizard/magic_tarot.dm +++ b/code/game/gamemodes/wizard/magic_tarot.dm @@ -389,11 +389,9 @@ card_icon = "wheel_of_fortune" /datum/tarot/wheel_of_fortune/activate(mob/living/target) - var/list/static/bad_vendors = list( - /obj/machinery/economy/vending/liberationstation, - /obj/machinery/economy/vending/toyliberationstation, - /obj/machinery/economy/vending/wallmed - ) + var/list/static/bad_vendors = typesof(/obj/machinery/economy/vending/liberationstation)\ + + typesof(/obj/machinery/economy/vending/toyliberationstation)\ + + typesof(/obj/machinery/economy/vending/wallmed) // Future proofing in case we add more subtypes of disallowed vendors var/turf/target_turf = get_turf(target) var/vendorpath = pick(subtypesof(/obj/machinery/economy/vending) - bad_vendors) new vendorpath(target_turf) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index d175fcbf6ad7..d56cf4ad2265 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -65,8 +65,7 @@ return FALSE /datum/spellbook_entry/proc/Refund(mob/living/carbon/human/user, obj/item/spellbook/book) //return point value or -1 for failure - var/area/wizard_station/A = locate() - if(!(user in A.contents)) + if(!istype(get_area(user), /area/wizard_station)) to_chat(user, "You can only refund spells at the wizard lair.") return -1 if(!S) //This happens when the spell's source is from another spellbook, from loadouts, or adminery, this create a new template temporary spell @@ -1152,7 +1151,7 @@ /obj/item/spellbook/oneuse/random/initialize() . = ..() - var/static/banned_spells = list(/obj/item/spellbook/oneuse/mime, /obj/item/spellbook/oneuse/mime/fingergun, /obj/item/spellbook/oneuse/mime/fingergun/fake, /obj/item/spellbook/oneuse/mime/greaterwall) + var/static/list/banned_spells = typesof(/obj/item/spellbook/oneuse/mime, /obj/item/spellbook/oneuse/emp) var/real_type = pick(subtypesof(/obj/item/spellbook/oneuse) - banned_spells) new real_type(loc) qdel(src) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index cc08556f00c3..b1b0d0505df5 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -300,20 +300,7 @@ emagged = FALSE setMenuState(ui.user, COMM_SCREEN_MAIN) - if("RestartNanoMob") - if(SSmob_hunt) - if(SSmob_hunt.manual_reboot()) - var/loading_msg = pick("Respawning spawns", "Reticulating splines", "Flipping hat", - "Capturing all of them", "Fixing minor text issues", "Being the very best", - "Nerfing this", "Not communicating with playerbase", "Coding a ripoff in a 2D spaceman game") - to_chat(ui.user, "Restarting Nano-Mob Hunter GO! game server. [loading_msg]...") - else - to_chat(ui.user, "Nano-Mob Hunter GO! game server reboot failed due to recent restart. Please wait before re-attempting.") - else - to_chat(ui.user, "Nano-Mob Hunter GO! game server is offline for extended maintenance. Contact your Central Command administrators for more info if desired.") - // ADMIN CENTCOMM ONLY STUFF - if("send_to_cc_announcement_page") if(!ADMIN_CHECK(ui.user)) return diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 70a8a6e387f4..0b34829a4398 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -301,8 +301,9 @@ if(occupant_typecache) occupant_typecache = typecacheof(occupant_typecache) -/obj/machinery/suit_storage_unit/Destroy() - dump_contents() +/obj/machinery/suit_storage_unit/Destroy(force) + if(!force) + dump_contents() SStgui.close_uis(wires) QDEL_NULL(wires) return ..() diff --git a/code/game/machinery/vendors/generic_vendors.dm b/code/game/machinery/vendors/generic_vendors.dm index 816cd1f9214e..157f2f5725ea 100644 --- a/code/game/machinery/vendors/generic_vendors.dm +++ b/code/game/machinery/vendors/generic_vendors.dm @@ -1300,7 +1300,6 @@ icon_panel = "wide_vendor" category = VENDOR_TYPE_SUPPLIES products = list(/obj/item/pda =10, - /obj/item/cartridge/mob_hunt_game = 25, /obj/item/cartridge/medical = 10, /obj/item/cartridge/chemistry = 10, /obj/item/cartridge/engineering = 10, @@ -1313,7 +1312,6 @@ /obj/item/cartridge/mime = 1) prices = list(/obj/item/pda = 300, - /obj/item/cartridge/mob_hunt_game = 50, /obj/item/cartridge/medical = 200, /obj/item/cartridge/chemistry = 150, /obj/item/cartridge/engineering = 100, diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 4dced61d7c94..80b8263d2e13 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -45,6 +45,9 @@ ME = new /obj/item/mecha_parts/mecha_equipment/thrusters ME.attach(src) +/obj/mecha/combat/marauder/add_cell() + cell = new /obj/item/stock_parts/cell/bluespace(src) + /obj/mecha/combat/marauder/ares name = "Ares" desc = "Heavy-duty, combat exosuit, adapted from rejected early versions of the Marauder to serve as a biohazard containment exosuit. This model, albeit rare, can be found among civilian populations." @@ -85,9 +88,6 @@ force = 80 max_equip = 8 -/obj/mecha/combat/marauder/seraph/add_cell() - cell = new /obj/item/stock_parts/cell/bluespace(src) - /obj/mecha/combat/marauder/seraph/loaded/Initialize(mapload) . = ..() //Let it equip whatever is needed. var/obj/item/mecha_parts/mecha_equipment/ME diff --git a/code/game/objects/effects/decals/turfdecals/markings.dm b/code/game/objects/effects/decals/turfdecals/markings.dm index 433e4ef94c79..8ee39dae4a2b 100644 --- a/code/game/objects/effects/decals/turfdecals/markings.dm +++ b/code/game/objects/effects/decals/turfdecals/markings.dm @@ -228,3 +228,6 @@ /obj/effect/turf_decal/raven/nine icon_state = "RAVEN9" + +/obj/effect/turf_decal/blue_corner + icon_state = "darkbluecorners" diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 2a7267b881d3..cbf3f46175af 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -159,7 +159,7 @@ ///typepath of the last location we're in, if it's different when moved then we need to update vis contents var/last_attached_location_type /// The main item we're attached to at the moment, particle holders hold particles for something - var/atom/parent + var/atom/movable/parent /// The mob that is holding our item var/mob/holding_parent @@ -181,6 +181,7 @@ if(parent) UnregisterSignal(parent, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING)) QDEL_NULL(particles) + parent.vis_contents -= src return ..() ///signal called when parent is moved @@ -192,6 +193,7 @@ ///signal called when parent is deleted /obj/effect/abstract/particle_holder/proc/on_qdel(atom/movable/attached, force) SIGNAL_HANDLER + attached.vis_contents -= src qdel(src)//our parent is gone and we need to be as well ///logic proc for particle holders, aka where they move. diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index a977b08c7268..374a2fb1114d 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -235,6 +235,14 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/newplayer_start) //Without this you sp /obj/effect/landmark/spawner/nuke_code name = "nukecode" +/obj/effect/landmark/spawner/roundstart_observer + name = "Roundstart Observer" + icon_state = "spooky" + +/obj/effect/landmark/spawner/roundstart_observer/Initialize(mapload) + spawner_list = GLOB.roundstart_observer_start + return ..() + /obj/effect/landmark/Destroy() GLOB.landmarks_list -= src ..() @@ -414,7 +422,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/newplayer_start) //Without this you sp name = "Warden" icon_state = "Warden" - /obj/effect/landmark/start/set_tag() tag = "start*[name]" @@ -671,8 +678,5 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/newplayer_start) //Without this you sp var/turf/simulated/T = get_turf(src) T.burn_tile() -/obj/effect/landmark/battle_mob_point - name = "Nanomob Battle Avatar Spawn Point" - /obj/effect/landmark/free_golem_spawn name = "Free Golem Spawn Point" diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index f549f5f8cd3b..3720150cd1df 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -1,5 +1,3 @@ -//TODO: Flash range does nothing currently - #define CREAK_DELAY 5 SECONDS //Time taken for the creak to play after explosion, if applicable. #define DEVASTATION_PROB 30 //The probability modifier for devistation, maths! #define HEAVY_IMPACT_PROB 5 //ditto @@ -74,6 +72,10 @@ var/turf/M_turf = get_turf(M) if(M_turf && M_turf.z == z0) var/dist = get_dist(M_turf, epicenter) + if(isliving(M) && dist <= flash_range) + var/mob/living/to_flash = M + var/is_very_close_to_the_explosion = flash_range > (dist * 2) + to_flash.flash_eyes(is_very_close_to_the_explosion * 2, is_very_close_to_the_explosion, is_very_close_to_the_explosion) // Gets past sunglasses var/baseshakeamount if(orig_max_distance - dist > 0) baseshakeamount = sqrt((orig_max_distance - dist) * 0.1) diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index dd5df9c4122c..2306002dc48f 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -63,25 +63,25 @@ det_time = newtime to_chat(user, "Timer set for [det_time] seconds.") -/obj/item/grenade/plastic/afterattack(atom/movable/AM, mob/user, flag) +/obj/item/grenade/plastic/afterattack(mob/AM, mob/user, flag) if(!flag) return - if(iscarbon(AM)) - to_chat(user, "You can't get the [src] to stick to [AM]!") + if(ismob(AM) && AM.stat == CONSCIOUS) + to_chat(user, "You can't get the [src] to stick to [AM]! Perhaps if [AM] was asleep or dead you could attach it?") return if(isobserver(AM)) to_chat(user, "Your hand just phases through [AM]!") return to_chat(user, "You start planting [src].[isnull(nadeassembly) ? " The timer is set to [det_time]..." : ""]") - if(do_after(user, 50 * toolspeed, target = AM)) + if(do_after(user, 5 SECONDS * toolspeed, target = AM)) if(!user.unEquip(src)) return target = AM loc = null if(notify_admins) - message_admins("[ADMIN_LOOKUPFLW(user)] planted [src.name] on [target.name] at ([target.x],[target.y],[target.z] - JMP) with [det_time] second fuse", 0, 1) + message_admins("[ADMIN_LOOKUPFLW(user)] planted [name] on [target.name] at ([target.x],[target.y],[target.z] - JMP) with [det_time] second fuse", 0, 1) log_game("[key_name(user)] planted [name] on [target.name] at ([target.x],[target.y],[target.z]) with [det_time] second fuse") AddComponent(/datum/component/persistent_overlay, image_overlay, target) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 151e2c226922..d7b37140b43d 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -57,8 +57,9 @@ break // Fix for #383 - C4 deleting fridges with corpses -/obj/structure/closet/Destroy() - dump_contents() +/obj/structure/closet/Destroy(force) + if(!force) + dump_contents() return ..() /obj/structure/closet/CanPass(atom/movable/mover, turf/target, height=0) diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 0be43090cc96..9d177ce35766 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -20,6 +20,7 @@ L.unbuckle_mob() L.forceMove(src) ADD_TRAIT(L, TRAIT_MUTE, STATUE_MUTE) + ADD_TRAIT(L, TRAIT_EMOTE_MUTE, STATUE_MUTE) max_integrity = max(L.health + 100, 100) //stoning damaged mobs will result in easier to shatter statues intialTox = L.getToxLoss() intialFire = L.getFireLoss() @@ -50,6 +51,7 @@ M.adjustFireLoss(intialFire - M.getFireLoss()) M.adjustBruteLoss(intialBrute - M.getBruteLoss()) M.setOxyLoss(intialOxy) + M.Stun(2.5 SECONDS) // No using items inside a statue if(timer <= 0) dump_contents() STOP_PROCESSING(SSobj, src) @@ -69,6 +71,7 @@ for(var/mob/living/M in src) M.forceMove(loc) REMOVE_TRAIT(M, TRAIT_MUTE, STATUE_MUTE) + REMOVE_TRAIT(M, TRAIT_EMOTE_MUTE, STATUE_MUTE) M.take_overall_damage((M.health - obj_integrity - 100),0) //any new damage the statue incurred is transfered to the mob ..() @@ -120,7 +123,7 @@ /obj/structure/closet/statue/indestructible resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - timer = 240 SECONDS_TO_LIFE_CYCLES + timer = 120 SECONDS_TO_LIFE_CYCLES /obj/structure/closet/statue/indestructible/ex_act(severity) return //No delimbing them diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm index e667cfb2314c..fd8502e8ef13 100644 --- a/code/game/turfs/simulated/walls_mineral.dm +++ b/code/game/turfs/simulated/walls_mineral.dm @@ -1,6 +1,6 @@ /turf/simulated/wall/mineral name = "mineral wall" - desc = "This shouldn't exist" + desc = "If you can see this, please make an issue report on GitHub." icon_state = "" smoothing_flags = SMOOTH_BITMASK canSmoothWith = null @@ -310,6 +310,9 @@ /turf/simulated/wall/mineral/titanium/nodecon/welder_act() return +/turf/simulated/wall/mineral/titanium/nodecon/try_destroy() + return + /////////////////////Plastitanium walls///////////////////// /turf/simulated/wall/mineral/plastitanium diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 0b9abc3abf31..baf89390823d 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -169,7 +169,8 @@ GLOBAL_LIST_INIT(admin_verbs_debug, list( /client/proc/debug_timers, /client/proc/force_verb_bypass, /client/proc/show_gc_queues, - /client/proc/debug_global_variables + /client/proc/debug_global_variables, + /client/proc/profile_code )) GLOBAL_LIST_INIT(admin_verbs_possess, list( /proc/possess, @@ -236,7 +237,8 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( /client/proc/debug_global_variables, /client/proc/visualise_active_turfs, /client/proc/debug_timers, - /client/proc/timer_log + /client/proc/timer_log, + /client/proc/profile_code )) /client/proc/add_admin_verbs() @@ -955,6 +957,12 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( src.stat_panel.send_message("create_debug") +/client/proc/profile_code() + set name = "Profile Code" + set category = "Debug" + + winset(usr, null, "command=.profile") + /client/proc/export_current_character() set name = "Export Character DMI/JSON" set category = "Admin" diff --git a/code/modules/antagonists/changeling/evolution_menu.dm b/code/modules/antagonists/changeling/evolution_menu.dm index 1013712bc953..150ea34343ec 100644 --- a/code/modules/antagonists/changeling/evolution_menu.dm +++ b/code/modules/antagonists/changeling/evolution_menu.dm @@ -88,6 +88,7 @@ return FALSE cling.give_power(new power_type) + SSblackbox.record_feedback("nested tally", "changeling_powers_purchased", 1, list("[initial(power.name)]")) return TRUE /datum/action/changeling/evolution_menu/proc/get_ability_tabs() diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index f3e98d67d270..56a88a97e769 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -36,6 +36,7 @@ RegisterSignal(user, COMSIG_MOB_WILLINGLY_DROP, PROC_REF(retract), override = TRUE) RegisterSignal(user, COMSIG_MOB_WEAPON_APPEARS, PROC_REF(retract), override = TRUE) playsound(owner.loc, 'sound/effects/bone_break_1.ogg', 100, TRUE) + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[W.name]")) return W /datum/action/changeling/weapon/proc/retract(atom/target, any_hand = FALSE) diff --git a/code/modules/antagonists/changeling/powers/shriek.dm b/code/modules/antagonists/changeling/powers/shriek.dm index 7fd6c4ec3a01..5372ffb8c1c2 100644 --- a/code/modules/antagonists/changeling/powers/shriek.dm +++ b/code/modules/antagonists/changeling/powers/shriek.dm @@ -54,6 +54,8 @@ L.on = TRUE L.break_light_tube() empulse(get_turf(user), 3, 5, 1) + + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE /// A more expensive version, used during rounds with cyber rev station trait for balance reasons. diff --git a/code/modules/antagonists/changeling/powers/summon_spiders.dm b/code/modules/antagonists/changeling/powers/summon_spiders.dm index 3ef00c46c0ba..abbd67db1b46 100644 --- a/code/modules/antagonists/changeling/powers/summon_spiders.dm +++ b/code/modules/antagonists/changeling/powers/summon_spiders.dm @@ -51,6 +51,7 @@ venom_per_bite = 3 speak_chance = 0 wander = 0 + gold_core_spawnable = NO_SPAWN /// To check and gib the spider when dead, then remove only one of the counter for the changeling owner var/gibbed = FALSE diff --git a/code/modules/antagonists/vampire/vamp_datum.dm b/code/modules/antagonists/vampire/vamp_datum.dm index d0846411bffc..dea34b67cade 100644 --- a/code/modules/antagonists/vampire/vamp_datum.dm +++ b/code/modules/antagonists/vampire/vamp_datum.dm @@ -228,7 +228,7 @@ RESTRICT_TYPE(/datum/antagonist/vampire) return if(bloodusable >= 10) //burn through your blood to tank the light for a little while to_chat(owner.current, "The starlight saps your strength!") - bloodusable -= 10 + subtract_usable_blood(10) vamp_burn(10) else //You're in trouble, get out of the sun NOW to_chat(owner.current, "Your body is turning to ash, get out of the light now!") @@ -278,6 +278,13 @@ RESTRICT_TYPE(/datum/antagonist/vampire) REMOVE_TRAIT(owner.current, TRAIT_GOTTAGONOTSOFAST, VAMPIRE_TRAIT) owner.current.alpha = 204 // 255 * 0.80 +/** + * Handles unique drain ID checks and increases vampire's total and usable blood by blood_amount. Checks for ability upgrades. + * + * Arguments: + ** C: victim [/mob/living/carbon] that is being drained form. + ** blood_amount: amount of blood to add to vampire's usable and total pools. + */ /datum/antagonist/vampire/proc/adjust_blood(mob/living/carbon/C, blood_amount = 0) if(C) var/unique_suck_id = C.UID() @@ -293,6 +300,15 @@ RESTRICT_TYPE(/datum/antagonist/vampire) if(S.action) S.action.UpdateButtons() +/** + * Safely subtract vampire's bloodusable. Clamped between 0 and bloodtotal. + * + * Arguments: + ** blood_amount: amount of blood to subtract. + */ +/datum/antagonist/vampire/proc/subtract_usable_blood(blood_amount) + bloodusable = clamp(bloodusable - blood_amount, 0, bloodtotal) + /datum/antagonist/vampire/proc/vamp_burn(burn_chance) if(prob(burn_chance) && owner.current.health >= 50) switch(owner.current.health) diff --git a/code/modules/antagonists/vampire/vampire_powers/dantalion_powers.dm b/code/modules/antagonists/vampire/vampire_powers/dantalion_powers.dm index 39b7869ec86a..3aeda9ce3f02 100644 --- a/code/modules/antagonists/vampire/vampire_powers/dantalion_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/dantalion_powers.dm @@ -33,7 +33,7 @@ handle_enthrall(user, target) var/datum/spell_handler/vampire/V = custom_handler var/blood_cost = V.calculate_blood_cost(vampire) - vampire.bloodusable -= blood_cost //we take the blood after enthralling, not before + vampire.subtract_usable_blood(blood_cost) //we take the blood after enthralling, not before else revert_cast(user) to_chat(user, "You or your target moved.") diff --git a/code/modules/antagonists/vampire/vampire_powers/hemomancer_powers.dm b/code/modules/antagonists/vampire/vampire_powers/hemomancer_powers.dm index 220ba634df79..d0e39dff30f1 100644 --- a/code/modules/antagonists/vampire/vampire_powers/hemomancer_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/hemomancer_powers.dm @@ -199,7 +199,7 @@ var/datum/spell_handler/vampire/V = custom_handler var/datum/antagonist/vampire/vampire = user.mind.has_antag_datum(/datum/antagonist/vampire) var/blood_cost = V.calculate_blood_cost(vampire) - vampire.bloodusable -= blood_cost + vampire.subtract_usable_blood(blood_cost) start_turf = null should_recharge_after_cast = FALSE diff --git a/code/modules/antagonists/vampire/vampire_powers/umbrae_powers.dm b/code/modules/antagonists/vampire/vampire_powers/umbrae_powers.dm index 0b1473ee8d88..691eed6ece64 100644 --- a/code/modules/antagonists/vampire/vampire_powers/umbrae_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/umbrae_powers.dm @@ -181,7 +181,7 @@ var/datum/spell_handler/vampire/V = custom_handler var/datum/antagonist/vampire/vampire = user.mind.has_antag_datum(/datum/antagonist/vampire) var/blood_cost = V.calculate_blood_cost(vampire) - vampire.bloodusable = clamp(vampire.bloodusable - blood_cost, 0, vampire.bloodusable)// Vampires get a coupon if they have less than the normal blood cost + vampire.subtract_usable_blood(blood_cost)// Vampires get a coupon if they have less than the normal blood cost /proc/shadow_to_animation(turf/start_turf, turf/end_turf, mob/user) var/x_difference = end_turf.x - start_turf.x diff --git a/code/modules/arcade/mob_hunt/battle_computer.dm b/code/modules/arcade/mob_hunt/battle_computer.dm deleted file mode 100644 index 228686fa951c..000000000000 --- a/code/modules/arcade/mob_hunt/battle_computer.dm +++ /dev/null @@ -1,309 +0,0 @@ - -/obj/machinery/computer/mob_battle_terminal - name = "Nano-Mob Hunter GO! Battle Terminal" - desc = "Insert a mob card to partake in life-like Nano-Mob Battle Action!" - icon_state = "mob_battle_empty" - icon_screen = null - icon_keyboard = null - density = FALSE - anchored = TRUE - var/obj/item/nanomob_card/card - var/datum/mob_hunt/mob_info - var/obj/effect/landmark/battle_mob_point/avatar_point - var/obj/effect/nanomob/battle/avatar - var/ready = FALSE - var/team = "Grey" - -/obj/machinery/computer/mob_battle_terminal/red - pixel_y = 24 - dir = SOUTH - team = "Red" - -/obj/machinery/computer/mob_battle_terminal/blue - pixel_y = -24 - dir = NORTH - team = "Blue" - -/obj/machinery/computer/mob_battle_terminal/red/Initialize() - ..() - check_connection() - -/obj/machinery/computer/mob_battle_terminal/blue/Initialize() - ..() - check_connection() - -/obj/machinery/computer/mob_battle_terminal/update_icon_state() - if(card) - icon_state = "mob_battle_loaded" - else - icon_state = "mob_battle_empty" - -/obj/machinery/computer/mob_battle_terminal/Destroy() - eject_card(1) - if(SSmob_hunt) - if(SSmob_hunt.battle_turn) - SSmob_hunt.battle_turn = null - if(SSmob_hunt.red_terminal == src) - SSmob_hunt.red_terminal = null - if(SSmob_hunt.blue_terminal == src) - SSmob_hunt.blue_terminal = null - QDEL_NULL(avatar) - return ..() - -/obj/machinery/computer/mob_battle_terminal/attackby(obj/item/O, mob/user) - if(istype(O, /obj/item/nanomob_card)) - insert_card(O, user) - return - return ..() - -/obj/machinery/computer/mob_battle_terminal/proc/insert_card(obj/item/nanomob_card/new_card, mob/user) - if(!new_card) - return - if(card) - to_chat(user, "The card slot is currently filled.") - return - if(!new_card.mob_data) - to_chat(user, "This is a blank mob card.") - return - if(new_card.mob_data && !new_card.mob_data.cur_health) - to_chat(user, "This mob is incapacitated! Heal it before attempting to use it in battle!") - return - user.unEquip(new_card) - new_card.forceMove(src) - card = new_card - mob_info = card.mob_data - update_icon() - update_avatar() - updateUsrDialog() - -/obj/machinery/computer/mob_battle_terminal/proc/eject_card(override = 0) - if(!override) - if(ready && SSmob_hunt.battle_turn != team) - atom_say("You can't recall on your rival's turn!") - return - if(!card) - return - card.mob_data = mob_info - mob_info = null - card.forceMove(get_turf(src)) - card = null - update_avatar() - update_icon() - updateUsrDialog() - -/obj/machinery/computer/mob_battle_terminal/proc/update_avatar() - //if we don't have avatars yet, spawn them - if(!avatar) - if(!avatar_point) - log_debug("[src] attempted to spawn a battle mob avatar without a spawn point!") - return - else - avatar = new(get_turf(avatar_point)) - //update avatar info from card - if(mob_info) - avatar.mob_info = mob_info - else - avatar.mob_info = null - //tell the avatar to update themself with the new info - avatar.update_self() - -/obj/machinery/computer/mob_battle_terminal/attack_hand(mob/user) - add_fingerprint(user) - interact(user) - -/obj/machinery/computer/mob_battle_terminal/attack_ai(mob/user) - to_chat(user, "You cannot interface with this portion of the simulation.") - return - -/obj/machinery/computer/mob_battle_terminal/interact(mob/user) - check_connection() - var/datum/asset/mob_hunt_asset = get_asset_datum(/datum/asset/simple/mob_hunt) - mob_hunt_asset.send(user) - - var/dat = "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - if(ready && SSmob_hunt.battle_turn) //offer the surrender option if they are in a battle (ready), but don't have a card loaded - dat += "" - dat += "" - dat += "" - else - dat += "
" - dat += "[team] PLAYER" - dat += "
" - if(!card) - dat += "

No Nano-Mob card loaded.

" - dat += "
Surrender!
" - dat += "" - dat += "" - if(mob_info.nickname) - dat += "" - dat += "" - if(mob_info.nickname) - dat += "" - dat += "" - dat += "" - dat += "
" - dat += "

[mob_info.mob_name]

" - dat += "
" - else - dat += "" - var/img_src = SSassets.transport.get_asset_url("[mob_info.icon_state_normal].png") - if(mob_info.is_shiny) - dat += SSassets.transport.get_asset_url("[mob_info.icon_state_shiny].png") - dat += "" - dat += "
" - dat += "

[mob_info.nickname]

" - dat += "
" - dat += "
" - dat += "Health: [mob_info.cur_health] / [mob_info.max_health]
" - dat += "" - dat += "" - if(mob_info.cur_health) - dat += "" - else - dat += "" - dat += "" - dat += "" - dat += "
Attack!Incapacitated!Recall!
" - dat += "" - dat += "" - if(!ready) - dat += "" - dat += "Battle!" - dat += "" - if(ready && !SSmob_hunt.battle_turn) - dat += "" - dat += "Cancel Battle!" - dat += "" - dat += "" - - var/datum/browser/popup = new(user, "mob_battle_terminal", "Nano-Mob Hunter GO! Battle Terminal", 575, 400) - popup.set_content(dat) - popup.open() - -/obj/machinery/computer/mob_battle_terminal/Topic(href, href_list) - if(..()) - return 1 - - if(href_list["attack"]) - do_attack() - - if(href_list["eject"]) - eject_card() - - if(href_list["surrender"]) - surrender() - - if(href_list["ready"]) - var/option = text2num(href_list["ready"]) - if(option == 1) - start_battle() - else if(option == 2) - ready = FALSE - atom_say("[team] Player cancels their battle challenge.") - - updateUsrDialog() - -/obj/machinery/computer/mob_battle_terminal/proc/check_connection() - if(team == "Red") - if(SSmob_hunt && !SSmob_hunt.red_terminal) - SSmob_hunt.red_terminal = src - else if(team == "Blue") - if(SSmob_hunt && !SSmob_hunt.blue_terminal) - SSmob_hunt.blue_terminal = src - - find_avatar_spawn_point() - -/obj/machinery/computer/mob_battle_terminal/proc/find_avatar_spawn_point() - if(avatar_point) - return - var/obj/effect/landmark/battle_mob_point/closest - for(var/obj/effect/landmark/battle_mob_point/bmp in GLOB.landmarks_list) - if(!istype(bmp, /obj/effect/landmark/battle_mob_point)) - continue - if(bmp.z != z) //only match with points on the same z-level) - continue - if(!closest || isnull(closest)) - closest = bmp - continue - if(closest == bmp) - continue - if((abs(x-bmp.x)+abs(y-bmp.y)) < (abs(x-closest.x)+abs(y-closest.y))) //get_dist would be preferable if it didn't count diagonals as 1 distance, so we have to rely on actual x/y distances in this janky way. - closest = bmp - if(closest) - avatar_point = closest - else - log_debug("[src] was unable to locate a nearby mob battle landmark! Unable to spawn battle avatars!") - -/obj/machinery/computer/mob_battle_terminal/proc/do_attack() - if(!ready) //no attacking if you arent ready to fight (duh) - return - if(!SSmob_hunt || team != SSmob_hunt.battle_turn) //don't attack unless it is actually our turn - return - else - var/message = "[mob_info.mob_name] attacks!" - if(mob_info.nickname) - message = "[mob_info.nickname] attacks!" - atom_say(message) - SSmob_hunt.launch_attack(team, mob_info.get_raw_damage(), mob_info.get_attack_type()) - -/obj/machinery/computer/mob_battle_terminal/proc/start_battle() - if(ready) //don't do anything if we are still ready - return - if(!card) //don't do anything if there isn't a card inserted - return - ready = TRUE - atom_say("[team] Player is ready for battle! Waiting for rival...") - SSmob_hunt.start_check() - -/obj/machinery/computer/mob_battle_terminal/proc/receive_attack(raw_damage, datum/mob_type/attack_type) - var/message = mob_info.take_damage(raw_damage, attack_type) - avatar.audible_message(message, null, 5) - if(!mob_info.cur_health) - SSmob_hunt.end_battle(team) - eject_card(1) //force the card out, they were defeated - else - SSmob_hunt.end_turn() - -/obj/machinery/computer/mob_battle_terminal/proc/surrender() - atom_say("[team] Player surrenders the battle!") - SSmob_hunt.end_battle(team, 1) - -////////////////////////////// -// Mob Healing Terminal // -// (Pokemon Center) // -////////////////////////////// - -/obj/machinery/computer/mob_healer_terminal - name = "Nano-Mob Hunter GO! Restoration Terminal" - desc = "Swipe a mob card to instantly restore it to full health!" - icon_state = "mob_battle_loaded" - icon_screen = null - icon_keyboard = null - density = FALSE - anchored = TRUE - dir = EAST - -/obj/machinery/computer/mob_healer_terminal/attackby(obj/item/O, mob/user) - if(istype(O, /obj/item/nanomob_card)) - heal_card(O, user) - return - return ..() - -/obj/machinery/computer/mob_healer_terminal/proc/heal_card(obj/item/nanomob_card/patient, mob/user) - if(!patient) - return - if(!patient.mob_data) - to_chat(user, "This is a blank mob card.") - return - if(patient.mob_data && patient.mob_data.cur_health == patient.mob_data.max_health) - to_chat(user, "This mob is already at maximum health!") - return - patient.mob_data.cur_health = patient.mob_data.max_health - to_chat(user, "[patient.mob_data.nickname ? patient.mob_data.nickname : patient.mob_data.mob_name] has been restored to full health!") diff --git a/code/modules/arcade/mob_hunt/mob_avatar.dm b/code/modules/arcade/mob_hunt/mob_avatar.dm deleted file mode 100644 index ecab58523dbf..000000000000 --- a/code/modules/arcade/mob_hunt/mob_avatar.dm +++ /dev/null @@ -1,168 +0,0 @@ -/obj/effect/nanomob - name = "Nano-Mob Avatar" //will be overridden by the mob datum name value when created - desc = "A wild Nano-Mob appeared! Hit it with your PDA with the game open to attempt to capture it!" - invisibility = 101 - alpha = 128 - anchored = TRUE //just in case - density = FALSE - icon = 'icons/effects/mob_hunt.dmi' - var/state_name - var/datum/mob_hunt/mob_info = null - var/list/clients_encountered = list() //tracks who has already interacted with us, so they can't attempt a second capture - var/image/avatar - -/obj/effect/nanomob/Initialize(mapload, datum/mob_hunt/new_info) - . = ..() - if(!new_info) - return INITIALIZE_HINT_QDEL - mob_info = new_info - RegisterSignal(mob_info, COMSIG_PARENT_QDELETING, PROC_REF(delete_wrapper)) - update_self() - forceMove(mob_info.spawn_point) - if(!mob_info.is_trap) - addtimer(CALLBACK(src, PROC_REF(despawn)), mob_info.lifetime) - -/obj/effect/nanomob/Destroy() - SSmob_hunt.trap_spawns -= src - SSmob_hunt.normal_spawns -= src - mob_info = null // Can't delete this since multiple players can get the exact same /datum/mob_hunt. (This should be refactored) - clients_encountered.Cut() - QDEL_NULL(avatar) - return ..() - -/obj/effect/nanomob/proc/delete_wrapper() - SIGNAL_HANDLER - qdel(src) - -/obj/effect/nanomob/proc/update_self() - if(!mob_info) - return - name = mob_info.mob_name - desc = "A wild [name] (level [mob_info.level]) appeared! Hit it with your PDA with the game open to attempt to capture it!" - if(mob_info.is_shiny) - state_name = mob_info.icon_state_shiny - else - state_name = mob_info.icon_state_normal - avatar = image(icon, src, state_name) - avatar.override = 1 - add_alt_appearance("nanomob_avatar", avatar) - -/obj/effect/nanomob/attackby(obj/item/O, mob/user) - if(istype(O, /obj/item/pda)) - var/obj/item/pda/P = O - attempt_capture(P, -20) //attempting a melee capture reduces the mob's effective run_chance by 20% to balance the risk of triggering a trap mob - return 1 - -/obj/effect/nanomob/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) - if(istype(AM, /obj/item/pda)) - var/obj/item/pda/P = AM - attempt_capture(P) //attempting a ranged capture does not affect the mob's effective run_chance but does prevent you from being shocked by a trap mob - return 1 - -/obj/effect/nanomob/proc/attempt_capture(obj/item/pda/P, catch_mod = 0) //negative catch_mods lower effective run chance, - if(!P || !P.current_app || !istype(P.current_app, /datum/data/pda/app/mob_hunter_game) || !P.cartridge) - return - - var/datum/data/pda/app/mob_hunter_game/client = P.current_app - var/total_catch_mod = client.catch_mod + catch_mod //negative values decrease the chance of the mob running, positive values makes it more likely to flee - if(!client.connected) //must be connected to attempt captures - P.atom_say("No server connection. Capture aborted.") - return - - if(mob_info.is_trap) //traps work even if you ran into them before, which is why this is before the clients_encountered check - if(client.hacked) //hacked copies of the game (copies capable of setting traps) are protected from traps - return - if(iscarbon(P.loc)) - var/mob/living/carbon/C = P.loc - //Strike them down with a lightning bolt to complete the illusion (copied from the surge reagent overdose, probably could make this a general-use proc in the future) - playsound(get_turf(C), 'sound/effects/eleczap.ogg', 75, 1) - var/icon/I=new('icons/obj/zap.dmi',"lightningend") - I.Turn(-135) - var/obj/effect/overlay/beam/B = new(get_turf(C)) - B.pixel_x = rand(-20, 0) - B.pixel_y = rand(-20, 0) - B.icon = I - //then actually do the damage/stun - C.electrocute_act(20, P, 1) //same damage as a revenant's overload ability, except subject to gloves/species shock resistance (for human mobs at least) - return - - if(client in clients_encountered) //we've already dealt with you, go away! - return - else //deal with the new hunter by either running away or getting caught - clients_encountered += client - var/message = null - var/effective_run_chance = mob_info.run_chance + total_catch_mod - if((effective_run_chance > 0) && prob(effective_run_chance)) - message += "Capture failed! [name] escaped [P.owner ? "from [P.owner]" : "from this hunter"]!" - conceal(client) - else - if(client.register_capture(mob_info, 1)) - message += "Capture success! [P.owner ? P.owner : "This hunter"] captured [name]!" - conceal(client) - else - message += "Capture error! Try again." - clients_encountered -= client //if the capture registration failed somehow, let them have another chance with this mob - P.atom_say(message) - -/obj/effect/nanomob/proc/despawn() - if(SSmob_hunt) - if(mob_info.is_trap) - SSmob_hunt.trap_spawns -= src - else - SSmob_hunt.normal_spawns -= src - qdel(src) - -/obj/effect/nanomob/proc/reveal() - if(!SSmob_hunt) - return - var/list/show_to = list() - for(var/A in SSmob_hunt.connected_clients) - if((A in clients_encountered) || !SSmob_hunt.connected_clients[A]) - continue - show_to |= SSmob_hunt.connected_clients[A] - display_alt_appearance("nanomob_avatar", show_to) - -/obj/effect/nanomob/proc/conceal(list/hide_from) - if(!SSmob_hunt) - return - var/list/hiding_from = list() - if(hide_from) - hiding_from = hide_from - else - for(var/A in SSmob_hunt.connected_clients) - if((A in clients_encountered) && SSmob_hunt.connected_clients[A]) - hiding_from |= SSmob_hunt.connected_clients[A] - hide_alt_appearance("nanomob_avatar", hiding_from) - -// BATTLE MOB AVATARS - -/obj/effect/nanomob/battle - name = "Nano-Mob Battle Avatar" - desc = "A new challenger approaches!" - invisibility = 0 - icon_state = "placeholder" - var/obj/machinery/computer/mob_battle_terminal/my_terminal - -/obj/effect/nanomob/battle/update_self() - if(!mob_info) - name = "Nano-Mob Battle Avatar" - desc = "A new challenger approaches" - icon_state = "placeholder" - else - name = mob_info.mob_name - desc = "A tamed [name] (level [mob_info.level]) ready for battle!" - if(mob_info.is_shiny) - icon_state = mob_info.icon_state_shiny - else - icon_state = mob_info.icon_state_normal - -/obj/effect/nanomob/battle/attempt_capture(obj/item/pda/P, catch_mod = 0) - //you can't capture battle avatars, since they belong to someone already - return - -//battle avatars are always visible, so we can ignore reveal and conceal calls for them -/obj/effect/nanomob/battle/reveal() - return - -/obj/effect/nanomob/battle/conceal() - return diff --git a/code/modules/arcade/mob_hunt/mob_cards.dm b/code/modules/arcade/mob_hunt/mob_cards.dm deleted file mode 100644 index 6acfe826f445..000000000000 --- a/code/modules/arcade/mob_hunt/mob_cards.dm +++ /dev/null @@ -1,43 +0,0 @@ - -//Standard Cards -/obj/item/nanomob_card - name = "Nano-Mob Hunter Trading Card" - desc = "A blank Nano-Mob Hunter Trading Card. Worthless!" - icon = 'icons/obj/card.dmi' - icon_state = "trade_card" - force = 0 - throwforce = 1 - w_class = WEIGHT_CLASS_TINY - var/datum/mob_hunt/mob_data - -/obj/item/nanomob_card/proc/update_info() - if(!mob_data) - return - if(mob_data.is_shiny) - name = "Holographic [mob_data.mob_name] Nano-Mob Hunter Card" - desc = "WOW! A holographic trading card containing a level [mob_data.level] [mob_data.mob_name]!" - icon_state = "trade_card_holo" - else - name = "[mob_data.mob_name] Nano-Mob Hunter Card" - desc = "A trading card containing a level [mob_data.level] [mob_data.mob_name]!" - -//Booster Pack Cards (random mob data) -/obj/item/nanomob_card/booster - name = "Nano-Mob Hunter Booster Pack Card" - desc = "A random Nano-Mob Trading Card from a Booster Pack. Wonder what it is?" - -/obj/item/nanomob_card/booster/New() - ..() - var/datum/mob_hunt/mob_info = pick(subtypesof(/datum/mob_hunt)) - mob_data = new mob_info(0,null,1) - update_info() - -//Booster Packs (Box of booster pack cards) -/obj/item/storage/box/nanomob_booster_pack - name = "Nano-Mob Hunter Trading Card Booster Pack" - desc = "Contains 6 random Nano-Mob Hunter Trading Cards. May contain a holographic card!" - can_hold = list(/obj/item/nanomob_card) - -/obj/item/storage/box/nanomob_booster_pack/populate_contents() - for(var/i in 1 to 6) - new /obj/item/nanomob_card/booster(src) diff --git a/code/modules/arcade/mob_hunt/mob_datums.dm b/code/modules/arcade/mob_hunt/mob_datums.dm deleted file mode 100644 index fc60e17bbbea..000000000000 --- a/code/modules/arcade/mob_hunt/mob_datums.dm +++ /dev/null @@ -1,480 +0,0 @@ - -/datum/mob_hunt - //GENERAL STATS AND VARIABLES - var/mob_name = "Generic Mob" //the mob's original name (its species/type/whatever) - var/nickname = "" //the mob's nickname (if given by the owner) - var/run_chance = 0 //percent chance the mob will escape capture attempts (higher is obviously more likely to get away) - - //COMBAT STATS AND VARIABLES - var/level = 0 //actual level of this mob (don't set this, it gets overwritten in New()) - var/min_level = 1 //minimum level of this mob (used for randomizing the actual level) - var/max_level = 1 //maximum level of this mob (used for randomizing the actual level) - var/exp = 0 //number of battles the mob has won towards the next level (resets to 0 on level-up) - var/exp_to_level = 3 //number of battles the mob must win to level up (in case we want to make some mobs harder or easier to level) - //the types of the mob will be used for battles to determine damage resistance or weakness (mob_type_datums.dm) - var/datum/mob_type/primary_type //Make sure you set this or the mob will be unable to deal damage and will take absurd damage in battles - var/datum/mob_type/secondary_type //Don't set if not a dual-type mob so the mob will only calculate damage based on primary type - var/base_attack = 5 //base damage dealt by the mob's attacks for battling (effectively damage dealt at level 0) - var/base_health = 5 //base health of the mob for battling (effectively max health at level 0) - var/attack_multiplier = 1 //how much additional damage per level the mob deals (level * attack_multiplier) - var/health_multiplier = 1 //how much additional health per level the mob gets (level * health_multiplier) for calculating max health - var/cur_health = 0 - var/max_health = 0 - - //SPAWN PREFERENCES AND VARIABLES - //A note on mob spawn preferences: The mob types also have preferences, which are handled prior to per-mob preferences, so ultimately you use a combined set of preferences - var/list/area_blacklist = list() //list of areas this mob can NOT spawn in (such as the bridge) - var/list/turf_blacklist = list() //list of turfs this mob can NOT spawn on (such as wood floors) - var/list/area_whitelist = list() //list of areas this mob is more likely to spawn in (can be used to reinclude subtypes of blacklisted areas) - var/list/turf_whitelist = list() //list of turfs this mob is more likely to spawn on (can be used to reinclude subtypes of blacklisted turfs) - var/turf/spawn_point //gets set and sent to the game server to spawn its avatar (generated in select_spawn or assigned via set_trap) - var/lifetime = 6000 //number of deciseconds the mob will remain before despawning (REMEMBER: DECISECONDS! So 6000 is 600 seconds which is 10 minutes) - var/is_shiny = 0 //if this gets set at spawn (super rare), the mob is considered "shiny" and will use the shiny icon_state and holographic cards - - //the icon file for mob_hunt stuff is 'icons/effects/mob_hunt.dmi' so reference that for the following vars - var/icon_state_normal = "placeholder" //the icon_state for this mob's normal version - var/icon_state_shiny = "placeholder" //the icon_state for this mob's rare shiney version - - var/is_trap = 0 //if this gets set, the mob is a booby-trap and will electrocute any players that dare attempt to catch it - -/datum/mob_hunt/New(set_trap = 0, turf/trap_turf = null, no_register = 0) - if(set_trap) - level = max_level - is_trap = 1 - spawn_point = trap_turf - else - level = rand(min_level, max_level) - if(prob(1) && prob(1)) - is_shiny = 1 - max_health = base_health + (level * health_multiplier) - cur_health = max_health - if(primary_type) - primary_type = new primary_type() - if(secondary_type) - secondary_type = new secondary_type() - if(no_register) //for booster pack cards - return - if(SSmob_hunt) - if(set_trap) - if(SSmob_hunt.register_trap(src)) - return - else if(select_spawn()) - if(SSmob_hunt.register_spawn(src)) - return - qdel(src) //if you reach this, the datum is just pure clutter, so delete it - -/datum/mob_hunt/proc/select_spawn() - var/list/possible_areas = get_possible_areas() - if(!length(possible_areas)) - log_admin("No possible areas to spawn [type] found. Possible code/mapping error?") - return 0 - while(length(possible_areas)) - //randomly select an area from our possible_areas list to try spawning in, then remove it from possible_areas so it won't get picked over and over forever. - var/spawn_area_path = pickweight(possible_areas) - var/area/spawn_area = locate(spawn_area_path) - possible_areas -= spawn_area_path - if(!spawn_area) - break - //clear and generate a fresh list of turfs in the selected area, weighted based on white/black lists - var/list/possible_turfs = get_possible_turfs(spawn_area) - if(!length(possible_turfs)) //If we don't have any possible turfs, this attempt was a failure. Try again. - continue - //if we got this far, we're spawning on this attempt, hooray! - spawn_point = pickweight(possible_turfs) - break - if(!spawn_point) - //if we get to this, we failed every attempt to find a suitable turf for EVERY area in our list of possible areas. DAMN. - log_admin("No acceptable turfs to spawn [type] on could be located. Possible code/mapping error, or someone replaced/destroyed all the acceptable turf types?") - return 0 - return 1 - -/datum/mob_hunt/proc/get_possible_areas() - var/list/possible_areas = list() - //setup, sets all station areas (and subtypes) to weight 1 - for(var/area/A in SSmapping.existing_station_areas) - if(istype(A, /area/holodeck)) //don't allow holodeck areas as possible spawns since it will allow it to spawn in the holodeck rooms on CC level as well - continue - if(A in possible_areas) - continue - for(var/areapath in typesof(A)) - possible_areas[areapath] = 1 - //primary type preferences - if(primary_type) - for(var/A in primary_type.area_whitelist) - for(var/areapath in typesof(A)) - possible_areas[areapath] += 4 - for(var/A in primary_type.area_blacklist) - for(var/areapath in typesof(A)) - possible_areas[areapath] -= 2 - //secondary type preferences - if(secondary_type) - for(var/A in secondary_type.area_whitelist) - for(var/areapath in typesof(A)) - possible_areas[areapath] += 4 - for(var/A in secondary_type.area_blacklist) - for(var/areapath in typesof(A)) - possible_areas[areapath] -= 2 - //mob preferences - for(var/A in area_whitelist) - for(var/areapath in typesof(A)) - possible_areas[areapath] += 4 - for(var/A in area_blacklist) - for(var/areapath in typesof(A)) - possible_areas[areapath] -= 2 - //weight check, remove negative or zero weight areas from the list, then return the list. - for(var/areapath in possible_areas) - //remove any areas that shouldn't be on the station-level - if(possible_areas[areapath] < 1) - possible_areas -= areapath - continue - return possible_areas - -/datum/mob_hunt/proc/get_possible_turfs(area/spawn_area) - if(!spawn_area) - return list() - var/list/possible_turfs = list() - //setup, sets all turfs in spawn_area to weight 1 - for(var/turf/T in spawn_area) - if(!is_station_level(T.z)) //mobs will only consider station-level turfs for spawning. Largely here so we won't have to worry about mapping errors or mobs on the derelict solars - continue - possible_turfs[T] = 1 - //primary type preferences - if(primary_type) - if(is_type_in_list(T, primary_type.turf_whitelist)) - possible_turfs[T] += 4 - if(is_type_in_list(T, primary_type.turf_blacklist)) - possible_turfs[T] -= 2 - //secondary type preferences - if(secondary_type) - if(is_type_in_list(T, secondary_type.turf_whitelist)) - possible_turfs[T] += 4 - if(is_type_in_list(T, secondary_type.turf_blacklist)) - possible_turfs[T] -= 2 - //mob preferences - if(is_type_in_list(T, turf_whitelist)) - possible_turfs[T] += 4 - if(is_type_in_list(T, turf_blacklist)) - possible_turfs[T] -= 2 - //weight check, remove negative or zero weight turfs from the list, then return the list - if(possible_turfs[T] < 1) - possible_turfs -= T - return possible_turfs - -/datum/mob_hunt/proc/calc_def_multiplier(datum/mob_type/attack_type) - if(!primary_type) - return 99 //typeless mobs are weak to everything since they shouldn't exist - if(!attack_type) //typeless attacks will return a multiplier of 1 in case we want to use this for calculating unmodified damage for some reason (UI maybe?) - return 1 - - var/multiplier = 1 - if(attack_type in primary_type.immunity) - return 0 //a single immunity negates all damage - else if(attack_type in primary_type.resistance) - multiplier *= 0.5 - else if(attack_type in primary_type.weakness) - multiplier *= 2 - else - multiplier *= 1 - - if(!secondary_type) //if we don't have a second type, we're done here - return multiplier - if(attack_type in secondary_type.immunity) - return 0 //a single immunity negates all damage - else if(attack_type in secondary_type.resistance) - multiplier *= 0.5 - else if(attack_type in secondary_type.weakness) - multiplier *= 2 - else - multiplier *= 1 - return multiplier - -/datum/mob_hunt/proc/take_damage(raw_damage, datum/mob_type/attack_type) - var/message = "" - var/multiplier = calc_def_multiplier(attack_type) - var/total_damage = raw_damage * multiplier - if(!cur_health) //it's already downed, quit hitting it - return null - if(!total_damage) - message += "The attack is completely ineffective! " - else - cur_health = max(cur_health - total_damage, 0) - switch(multiplier) - if(0) - message += "The attack is completely ineffective! " - if(0.25) - message += "It's barely effective... " - if(0.5) - message += "It's not very effective... " - if(2) - message += "It's super effective! " - if(4) - message += "It's ultra effective! " - if(99) - message += pick("REKT! ", "DUNKED! ", "DEFENSE BREAK! ", "WOMBO-COMBO'D!") - if(!cur_health) - message += "[nickname ? nickname : mob_name] is downed!" - return message - -/datum/mob_hunt/proc/get_raw_damage() - return (level * attack_multiplier) - -/datum/mob_hunt/proc/get_attack_type() - var/datum/mob_type/attack_type = primary_type - if(secondary_type && prob(40)) - attack_type = secondary_type - return attack_type - -/datum/mob_hunt/proc/gain_exp() - exp++ - var/message = "[nickname ? nickname : mob_name] gained EXP! ([exp] / [exp_to_level] EXP)" - if(exp >= exp_to_level) - message = levelup() - return message - -/datum/mob_hunt/proc/levelup() - var/message = "" - level++ - exp = 0 - if(level > max_level) //This is where we would trigger an evolution, when those are added (need to add evolved forms first) - level = max_level //for now though, we'll just cap them back at their max_level - message += "[nickname ? nickname : mob_name] can't get any stronger right now!" - else - max_health = base_health + (level * health_multiplier) - cur_health = max_health //full heal on level-up - message += "[nickname ? nickname : mob_name] has reached level [level]!" - return message - -/datum/mob_hunt/proc/get_type1() - if(!primary_type) - return "Typeless" - else - return primary_type.name - -/datum/mob_hunt/proc/get_type2() - if(!secondary_type) - return null - else - return secondary_type.name - - -/datum/mob_hunt/nemabug - mob_name = "Nemabug" - run_chance = 50 - min_level = 1 - max_level = 10 - primary_type = NANOMOB_TYPE_BUG - icon_state_normal = "nemabug" - icon_state_shiny = "nemabug_shiny" - lifetime = 6000 - -/datum/mob_hunt/stoutquill - mob_name = "Stoutquill" - run_chance = 50 - min_level = 5 - max_level = 15 - primary_type = NANOMOB_TYPE_ICE - icon_state_normal = "stoutquill" - icon_state_shiny = "stoutquill_shiny" - lifetime = 4500 - -/datum/mob_hunt/spectra - mob_name = "Spectra" - run_chance = 35 - min_level = 1 - max_level = 10 - primary_type = NANOMOB_TYPE_POISON - icon_state_normal = "spectra" - icon_state_shiny = "spectra_shiny" - lifetime = 6000 - -/datum/mob_hunt/dunny - mob_name = "Dunny" - run_chance = 35 - min_level = 1 - max_level = 10 - primary_type = NANOMOB_TYPE_FIRE - icon_state_normal = "dunny" - icon_state_shiny = "dunny_shiny" - lifetime = 6000 - -/datum/mob_hunt/buffsel - mob_name = "Buffsel" - run_chance = 35 - min_level = 1 - max_level = 10 - primary_type = NANOMOB_TYPE_ROCK - icon_state_normal = "buffsel" - icon_state_shiny = "buffsel_shiny" - lifetime = 6000 - -/datum/mob_hunt/quarrel - mob_name = "Quarrel" - run_chance = 35 - min_level = 1 - max_level = 10 - primary_type = NANOMOB_TYPE_NORMAL - icon_state_normal = "quarrel" - icon_state_shiny = "quarrel_shiny" - lifetime = 6000 - -/datum/mob_hunt/vulerrt - mob_name = "Vulerrt" - run_chance = 50 - min_level = 5 - max_level = 15 - primary_type = NANOMOB_TYPE_DARK - icon_state_normal = "vulerrt" - icon_state_shiny = "vulerrt_shiny" - turf_whitelist = list() - lifetime = 4500 - -/datum/mob_hunt/strudel - mob_name = "Strudel" - run_chance = 35 - min_level = 1 - max_level = 10 - primary_type = NANOMOB_TYPE_ELECTRIC - icon_state_normal = "strudel" - icon_state_shiny = "strudel_shiny" - lifetime = 4500 - -/datum/mob_hunt/folstick - mob_name = "Folstick" - run_chance = 35 - min_level = 1 - max_level = 10 - primary_type = NANOMOB_TYPE_WATER - icon_state_normal = "folstick" - icon_state_shiny = "folstick_shiny" - lifetime = 6000 - -/datum/mob_hunt/glimmerflare - mob_name = "Glimmerflare" - run_chance = 50 - min_level = 5 - max_level = 15 - primary_type = NANOMOB_TYPE_PSYCHIC - icon_state_normal = "glimmerflare" - icon_state_shiny = "glimmerflare_shiny" - lifetime = 4500 - -/datum/mob_hunt/leecoon - mob_name = "Leecoon" - run_chance = 35 - min_level = 1 - max_level = 10 - primary_type = NANOMOB_TYPE_GRASS - icon_state_normal = "leecoon" - icon_state_shiny = "leecoon_shiny" - lifetime = 6000 - -/datum/mob_hunt/halk - mob_name = "Halk" - run_chance = 35 - min_level = 1 - max_level = 10 - primary_type = NANOMOB_TYPE_FLYING - icon_state_normal = "halk" - icon_state_shiny = "halk_shiny" - lifetime = 6000 - -/datum/mob_hunt/gooby - mob_name = "Gooby" - run_chance = 65 - min_level = 5 - max_level = 20 - primary_type = NANOMOB_TYPE_ELECTRIC - secondary_type = NANOMOB_TYPE_BUG - icon_state_normal = "gooby" - icon_state_shiny = "gooby_shiny" - lifetime = 3000 - -/datum/mob_hunt/pandoom - mob_name = "Pandoom" - run_chance = 50 - min_level = 5 - max_level = 15 - primary_type = NANOMOB_TYPE_GHOST - icon_state_normal = "pandoom" - icon_state_shiny = "pandoom_shiny" - lifetime = 4500 - -/datum/mob_hunt/relish - mob_name = "Relish" - run_chance = 65 - min_level = 5 - max_level = 20 - primary_type = NANOMOB_TYPE_FIRE - secondary_type = NANOMOB_TYPE_GROUND - icon_state_normal = "relish" - icon_state_shiny = "relish_shiny" - lifetime = 3000 - -/datum/mob_hunt/xofine - mob_name = "Xofine" - run_chance = 50 - min_level = 5 - max_level = 10 - primary_type = NANOMOB_TYPE_FIRE - secondary_type = NANOMOB_TYPE_NORMAL - icon_state_normal = "xofine" - icon_state_shiny = "xofine_shiny" - lifetime = 3000 - -/datum/mob_hunt/gitten - mob_name = "Gitten" - run_chance = 65 - min_level = 5 - max_level = 20 - primary_type = NANOMOB_TYPE_WATER - secondary_type = NANOMOB_TYPE_POISON - icon_state_normal = "gitten" - icon_state_shiny = "gitten_shiny" - lifetime = 3000 - -/datum/mob_hunt/nai - mob_name = "Nai" - run_chance = 65 - min_level = 5 - max_level = 20 - primary_type = NANOMOB_TYPE_GRASS - secondary_type = NANOMOB_TYPE_NORMAL - icon_state_normal = "nai" - icon_state_shiny = "nai_shiny" - lifetime = 3000 - -/datum/mob_hunt/pyroghast - mob_name = "Pyroghast" - run_chance = 65 - min_level = 5 - max_level = 20 - primary_type = NANOMOB_TYPE_FIRE - secondary_type = NANOMOB_TYPE_GHOST - icon_state_normal = "pyroghast" - icon_state_shiny = "pyroghast" - lifetime = 4500 - -/datum/mob_hunt/starslam - mob_name = "Starslam" - run_chance = 65 - min_level = 5 - max_level = 20 - primary_type = NANOMOB_TYPE_FIGHTING - secondary_type = NANOMOB_TYPE_ICE - icon_state_normal = "starslam" - icon_state_shiny = "starslam_shiny" - lifetime = 2500 - -/datum/mob_hunt/pheron - mob_name = "Pheron" - run_chance = 85 - min_level = 10 - max_level = 20 - primary_type = NANOMOB_TYPE_BLUESPACE - icon_state_normal = "pheron" - icon_state_shiny = "pheron_shiny" - area_blacklist = list() - turf_blacklist = list() - area_whitelist = list() - turf_whitelist = list() - lifetime = 2000 diff --git a/code/modules/arcade/mob_hunt/mob_type_datums.dm b/code/modules/arcade/mob_hunt/mob_type_datums.dm deleted file mode 100644 index 1789ac679126..000000000000 --- a/code/modules/arcade/mob_hunt/mob_type_datums.dm +++ /dev/null @@ -1,241 +0,0 @@ - -/datum/mob_type - var/name = "Typeless" - var/list/weakness = list() - var/list/resistance = list() - var/list/immunity = list() - - //Type-based spawn preferences (to eliminate copy-pasting the same area and turf lists on each mob type) - var/list/area_blacklist = list() //areas to be avoided - var/list/area_whitelist = list() //areas to be more preferred - var/list/turf_blacklist = list() //turf types to be avoided - var/list/turf_whitelist = list() //turf types to be more preferred - -//Type defines, to avoid spelling mistakes -/datum/mob_type/fire - name = "Fire" - weakness = list(NANOMOB_TYPE_WATER, - NANOMOB_TYPE_ROCK, - NANOMOB_TYPE_GROUND) - resistance = list(NANOMOB_TYPE_BUG, - NANOMOB_TYPE_FIRE, - NANOMOB_TYPE_GRASS, - NANOMOB_TYPE_ICE, - NANOMOB_TYPE_STEEL) - area_blacklist = list(/area/station/public/toilet, - /area/station/science/server/coldroom) - area_whitelist = list(/area/station/maintenance/turbine, - /area/station/maintenance/incinerator, - /area/station/service/kitchen) - turf_blacklist = list(/turf/simulated/floor/beach/water) - -/datum/mob_type/water - name = "Water" - weakness = list(NANOMOB_TYPE_ELECTRIC, - NANOMOB_TYPE_GRASS) - resistance = list(NANOMOB_TYPE_FIRE, - NANOMOB_TYPE_ICE, - NANOMOB_TYPE_STEEL, - NANOMOB_TYPE_WATER) - area_blacklist = list(/area/station/maintenance/turbine, - /area/station/maintenance/incinerator, - /area/station/service/kitchen) - area_whitelist = list(/area/station/public/toilet) - turf_whitelist = list(/turf/simulated/floor/beach/water) - -/datum/mob_type/grass - name = "Grass" - weakness = list(NANOMOB_TYPE_FIRE, - NANOMOB_TYPE_BUG, - NANOMOB_TYPE_POISON, - NANOMOB_TYPE_ICE, - NANOMOB_TYPE_FLYING) - resistance = list(NANOMOB_TYPE_WATER, - NANOMOB_TYPE_GRASS, - NANOMOB_TYPE_ELECTRIC, - NANOMOB_TYPE_GROUND) - area_blacklist = list(/area/station/science) - area_whitelist = list(/area/station/service/hydroponics, - /area/station/public/construction) // dont ask me why grass types can appear in construction sites, I'm just migrating areas - turf_whitelist = list(/turf/simulated/floor/grass) - -/datum/mob_type/electric - name = "Electric" - weakness = list(NANOMOB_TYPE_GROUND) - resistance = list(NANOMOB_TYPE_ELECTRIC, - NANOMOB_TYPE_FLYING, - NANOMOB_TYPE_STEEL) - area_whitelist = list(/area/station/engineering/engine, - /area/station/science/server, - /area/station/maintenance, - /area/station/turret_protected/ai, - /area/station/turret_protected/ai_upload, - /area/station/turret_protected/aisat/interior, - /area/station/aisat, - /area/station/science/robotics) - turf_whitelist = list(/turf/simulated/floor/bluegrid) - -/datum/mob_type/ground - name = "Ground" - weakness = list(NANOMOB_TYPE_WATER, - NANOMOB_TYPE_GRASS, - NANOMOB_TYPE_ICE) - resistance = list(NANOMOB_TYPE_ROCK, - NANOMOB_TYPE_POISON) - immunity = list(NANOMOB_TYPE_ELECTRIC) - -/datum/mob_type/rock - name = "Rock" - weakness = list(NANOMOB_TYPE_WATER, - NANOMOB_TYPE_GRASS, - NANOMOB_TYPE_GROUND, - NANOMOB_TYPE_FIGHTING, - NANOMOB_TYPE_STEEL) - resistance = list(NANOMOB_TYPE_FIRE, - NANOMOB_TYPE_FLYING, - NANOMOB_TYPE_POISON, - NANOMOB_TYPE_NORMAL) - area_whitelist = list(/area/station/supply, - /area/station/maintenance/disposal) - turf_whitelist = list(/turf/simulated/wall, - /turf/simulated/floor/mineral) - -/datum/mob_type/bug - name = "Bug" - weakness = list(NANOMOB_TYPE_FIRE, - NANOMOB_TYPE_ROCK, - NANOMOB_TYPE_FLYING) - resistance = list(NANOMOB_TYPE_GRASS, - NANOMOB_TYPE_GROUND, - NANOMOB_TYPE_FIGHTING) - area_blacklist = list(/area/station/science) - area_whitelist = list(/area/station/service/hydroponics, - /area/station/public/construction) // dont ask me why bug types can appear in construction sites, I'm just migrating areas - turf_whitelist = list(/turf/simulated/floor/grass) - -/datum/mob_type/poison - name = "Poison" - weakness = list(NANOMOB_TYPE_GROUND, - NANOMOB_TYPE_PSYCHIC) - resistance = list(NANOMOB_TYPE_GRASS, - NANOMOB_TYPE_BUG, - NANOMOB_TYPE_POISON, - NANOMOB_TYPE_FIGHTING) - area_blacklist = list(/area/station/medical, - /area/station/service/janitor) - area_whitelist = list(/area/station/medical/virology, - /area/station/science, - /area/station/command/office/rd, - /area/station/maintenance/asmaint2) - -/datum/mob_type/normal - name = "Normal" - weakness = list(NANOMOB_TYPE_FIGHTING) - immunity = list(NANOMOB_TYPE_GHOST) - -/datum/mob_type/fighting - name = "Fighting" - weakness = list(NANOMOB_TYPE_PSYCHIC, - NANOMOB_TYPE_FLYING) - resistance = list(NANOMOB_TYPE_ROCK, - NANOMOB_TYPE_BUG, - NANOMOB_TYPE_DARK) - area_blacklist = list(/area/station/medical) - area_whitelist = list(/area/station/service/bar, - /area/station/public/fitness, - /area/station/security) - turf_whitelist = list(/turf/simulated/floor/wood) - -/datum/mob_type/psychic - name = "Psychic" - weakness = list(NANOMOB_TYPE_BUG, - NANOMOB_TYPE_GHOST, - NANOMOB_TYPE_DARK) - resistance = list(NANOMOB_TYPE_FIGHTING, - NANOMOB_TYPE_PSYCHIC) - area_blacklist = list(/area/station/science, - /area/station/command/office/rd, - /area/station/maintenance/asmaint2, - /area/station/command/teleporter, - /area/station/command/gateway) - area_whitelist = list(/area/station/service/library, - /area/station/service/chapel, - /area/station/medical/psych) - -/datum/mob_type/ghost - name = "Ghost" - weakness = list(NANOMOB_TYPE_GHOST, - NANOMOB_TYPE_DARK) - resistance = list(NANOMOB_TYPE_BUG, - NANOMOB_TYPE_POISON) - immunity = list(NANOMOB_TYPE_NORMAL, - NANOMOB_TYPE_FIGHTING) - area_whitelist = list(/area/station/medical/morgue, - /area/station/service/chapel, - /area/station/medical/cloning) - -/datum/mob_type/ice - name = "Ice" - weakness = list(NANOMOB_TYPE_FIRE, - NANOMOB_TYPE_ROCK, - NANOMOB_TYPE_FIGHTING, - NANOMOB_TYPE_STEEL) - resistance = list(NANOMOB_TYPE_ICE) - area_blacklist = list(/area/station/maintenance/turbine, - /area/station/maintenance/incinerator, - /area/station/service/kitchen) - area_whitelist = list(/area/station/science/server/coldroom) - -/datum/mob_type/flying - name = "Flying" - weakness = list(NANOMOB_TYPE_ELECTRIC, - NANOMOB_TYPE_ROCK, - NANOMOB_TYPE_ICE) - resistance = list(NANOMOB_TYPE_GRASS, - NANOMOB_TYPE_BUG, - NANOMOB_TYPE_FIGHTING) - immunity = list(NANOMOB_TYPE_GROUND) - area_blacklist = list(/area/station/maintenance) - area_whitelist = list(/area/station/hallway) - -/datum/mob_type/bluespace - name = "Bluespace" - weakness = list(NANOMOB_TYPE_ICE, - NANOMOB_TYPE_BLUESPACE) - resistance = list(NANOMOB_TYPE_FIRE, - NANOMOB_TYPE_WATER, - NANOMOB_TYPE_GRASS, - NANOMOB_TYPE_ELECTRIC) - -/datum/mob_type/dark - name = "Dark" - weakness = list(NANOMOB_TYPE_BUG, - NANOMOB_TYPE_FIGHTING) - resistance = list(NANOMOB_TYPE_GHOST, - NANOMOB_TYPE_DARK) - immunity = list(NANOMOB_TYPE_PSYCHIC) - area_blacklist = list(/area/station/engineering/solar, - /area/station/maintenance/auxsolarport, - /area/station/maintenance/starboardsolar, - /area/station/maintenance/portsolar, - /area/station/maintenance/auxsolarstarboard, - /area/station/service/clown) - area_whitelist = list(/area/station/maintenance, - /area/station/service/mime) - turf_blacklist = list(/turf/simulated/floor/light) - -/datum/mob_type/steel - name = "Steel" - weakness = list(NANOMOB_TYPE_FIRE, - NANOMOB_TYPE_GROUND, - NANOMOB_TYPE_FIGHTING) - resistance = list(NANOMOB_TYPE_GRASS, - NANOMOB_TYPE_ROCK, - NANOMOB_TYPE_BUG, - NANOMOB_TYPE_NORMAL, - NANOMOB_TYPE_PSYCHIC, - NANOMOB_TYPE_ICE, - NANOMOB_TYPE_FLYING, - NANOMOB_TYPE_BLUESPACE, - NANOMOB_TYPE_STEEL) - immunity = list(NANOMOB_TYPE_POISON) diff --git a/code/modules/arcade/prize_datums.dm b/code/modules/arcade/prize_datums.dm index 40d8f4d54e30..7e9481bceee8 100644 --- a/code/modules/arcade/prize_datums.dm +++ b/code/modules/arcade/prize_datums.dm @@ -275,12 +275,6 @@ GLOBAL_DATUM_INIT(global_prizes, /datum/prizes, new()) typepath = /obj/item/clothing/under/syndicate/tacticool cost = 90 -/datum/prize_item/nanomob_booster - name = "Nano-Mob Hunter Trading Card Booster Pack" - desc = "Contains 6 random Nano-Mob Hunter Trading Cards. May contain a holographic card!" - typepath = /obj/item/storage/box/nanomob_booster_pack - cost = 100 - /datum/prize_item/fakespell name = "Fake Spellbook" desc = "Perform magic! Astound your friends! Get mistaken for an enemy of the corporation!" diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index f3315c480e47..2a293d763243 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -227,6 +227,9 @@ /obj/effect/beam/i_beam/update_icon_state() transform = turn(matrix(), dir2angle(dir)) +/obj/effect/beam/i_beam/Process_Spacemove(movement_dir) + return TRUE + /obj/effect/beam/i_beam/process() life_cycles++ if(loc.density || !master || life_cycles >= life_cap) diff --git a/code/modules/asset_cache/assets/asset_mob_hunt.dm b/code/modules/asset_cache/assets/asset_mob_hunt.dm deleted file mode 100644 index ed1f7494e332..000000000000 --- a/code/modules/asset_cache/assets/asset_mob_hunt.dm +++ /dev/null @@ -1,7 +0,0 @@ -/datum/asset/simple/mob_hunt/register() - for(var/state in icon_states('icons/effects/mob_hunt.dmi')) - if(state == "Placeholder") - continue - assets["[state].png"] = icon('icons/effects/mob_hunt.dmi', state) - - return ..() diff --git a/code/modules/awaymissions/mission_code/ruins/oldstation.dm b/code/modules/awaymissions/mission_code/ruins/oldstation.dm index 6561f0bc5fe2..7cf6ff16da2e 100644 --- a/code/modules/awaymissions/mission_code/ruins/oldstation.dm +++ b/code/modules/awaymissions/mission_code/ruins/oldstation.dm @@ -301,6 +301,16 @@ bound_height = 64 appearance_flags = LONG_GLIDE +/obj/structure/shuttle/engine/huge + name = "engine" + icon = 'icons/obj/3x3.dmi' + icon_state = "huge_engine" + desc = "An extremely large bluespace engine used to propel extremely large ships." + opacity = TRUE + bound_width = 96 + bound_height = 96 + appearance_flags = LONG_GLIDE + // areas //Ruin of ancient Space Station diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 6330afcfa705..e66ed538b06e 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -456,6 +456,7 @@ display_job_bans(TRUE) if(check_rights(R_DEBUG|R_VIEWRUNTIMES, FALSE, mob)) winset(src, "debugmcbutton", "is-disabled=false") + winset(src, "profilecode", "is-disabled=false") /client/proc/is_connecting_from_localhost() var/static/list/localhost_addresses = list("127.0.0.1", "::1") @@ -1230,6 +1231,18 @@ if("Set-Tab") stat_tab = payload["tab"] SSstatpanels.immediate_send_stat_data(src) + if("Listedturf-Scroll") + if(payload["min"] == payload["max"]) + // Not properly loaded yet, send the default set. + SSstatpanels.refresh_client_obj_view(src) + else + SSstatpanels.refresh_client_obj_view(src, payload["min"], payload["max"]) + // Uncomment to enable log_debug in stat panel code. + // Disabled normally due to HREF exploit concerns. + //if("Statpanel-Debug") + // log_debug(payload) + if("Resend-Asset") + SSassets.transport.send_assets(src, list(payload)) if("Debug-Stat-Entry") var/stat_item = locateUID(payload["stat_item_uid"]) if(!check_rights(R_DEBUG | R_VIEWRUNTIMES) || !stat_item) diff --git a/code/modules/client/preference/loadout/loadout_general.dm b/code/modules/client/preference/loadout/loadout_general.dm index 2549eff6d9c1..e243d1318742 100644 --- a/code/modules/client/preference/loadout/loadout_general.dm +++ b/code/modules/client/preference/loadout/loadout_general.dm @@ -162,11 +162,6 @@ path = /obj/item/paicard cost = 2 -/datum/gear/mob_hunt_game - display_name = "Nano-Mob Hunter GO! Cartridge" - path = /obj/item/cartridge/mob_hunt_game - cost = 2 - ////////////////////// // Mugs // ////////////////////// diff --git a/code/modules/economy/merch_items.dm b/code/modules/economy/merch_items.dm index 4b2c97487d5a..b15a0eb6b303 100644 --- a/code/modules/economy/merch_items.dm +++ b/code/modules/economy/merch_items.dm @@ -47,13 +47,6 @@ cost = 100 category = MERCH_CAT_TOY -/datum/merch_item/nanomob_booster - name = "Nano-Mob Hunter Trading Card Booster Pack" - desc = "Contains 6 random Nano-Mob Hunter Trading Cards. May contain a holographic card!" - typepath = /obj/item/storage/box/nanomob_booster_pack - cost = 125 - category = MERCH_CAT_TOY - /datum/merch_item/crayons name = "Crayons" desc = "Let security know how they're doing by scrawling love notes all over their hallways." diff --git a/code/modules/events/blob/overmind.dm b/code/modules/events/blob/overmind.dm index 026712d5ec2f..12919ff69444 100644 --- a/code/modules/events/blob/overmind.dm +++ b/code/modules/events/blob/overmind.dm @@ -116,7 +116,7 @@ status_tab_data[++status_tab_data.len] = list("Power Stored:", "[blob_points]/[max_blob_points]") /mob/camera/blob/Move(NewLoc, Dir = 0) - var/obj/structure/blob/B = locate() in range("3x3", NewLoc) + var/obj/structure/blob/B = locate() in range(3, NewLoc) if(B) loc = NewLoc else diff --git a/code/modules/events/traders.dm b/code/modules/events/traders.dm index b0eb67f4df5a..684772392d1e 100644 --- a/code/modules/events/traders.dm +++ b/code/modules/events/traders.dm @@ -27,9 +27,9 @@ GLOBAL_LIST_INIT(unused_trade_stations, list("sol")) /datum/traders/nian) if(SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED) - GLOB.minor_announcement.Announce("A trading shuttle from [T.trader_location] has been denied docking permission due to the heightened security alert aboard [station_name()].", "Trader Shuttle Docking Request Refused") + GLOB.minor_announcement.Announce("A trading shuttle from [T.trader_location] has been denied docking permission due to the heightened security alert aboard [station_name()].", "Trader Shuttle Docking Request Refused", 'sound/AI/traderdeny.ogg') return - GLOB.minor_announcement.Announce("A trading shuttle from [T.trader_location] has been granted docking permission at [station_name()] arrivals port 4.", "Trader Shuttle Docking Request Accepted") + GLOB.minor_announcement.Announce("A trading shuttle from [T.trader_location] has been granted docking permission at [station_name()] arrivals port 4.", "Trader Shuttle Docking Request Accepted", 'sound/AI/tradergranted.ogg') /datum/event/traders/start() @@ -48,7 +48,7 @@ GLOBAL_LIST_INIT(unused_trade_stations, list("sol")) /datum/traders/nian) if(SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED) - GLOB.minor_announcement.Announce("A trading shuttle from [T.trader_location] has been denied docking permission due to the heightened security alert aboard [station_name()].", "Trader Shuttle Docking Request Refused") + GLOB.minor_announcement.Announce("A trading shuttle from [T.trader_location] has been denied docking permission due to the heightened security alert aboard [station_name()].", "Trader Shuttle Docking Request Refused", 'sound/AI/traderdeny.ogg') // if the docking request was refused, fire another major event in 60 seconds var/datum/event_container/EC = SSevents.event_containers[EVENT_LEVEL_MAJOR] EC.next_event_time = world.time + (60 * 10) @@ -102,7 +102,7 @@ GLOBAL_LIST_INIT(unused_trade_stations, list("sol")) greet_trader(M, T) success_spawn = TRUE if(success_spawn) - GLOB.minor_announcement.Announce("A trading shuttle from [T.trader_location] has been granted docking permission at [station_name()] arrivals port 4.", "Trader Shuttle Docking Request Accepted") + GLOB.minor_announcement.Announce("A trading shuttle from [T.trader_location] has been granted docking permission at [station_name()] arrivals port 4.", "Trader Shuttle Docking Request Accepted", 'sound/AI/tradergranted.ogg') else GLOB.unused_trade_stations += station // Return the station to the list of usable stations. diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index cccfab34edc9..4f47e4a8863a 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -180,6 +180,8 @@ . += "Alt-click to put something small inside." /obj/item/food/snacks/sliceable/AltClick(mob/user) + if(!Adjacent(user)) + return var/obj/item/I = user.get_active_hand() if(!I) return diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index ffa0bb3e4c06..d95a3e22862e 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -205,9 +205,7 @@ add_attack_logs(user, target, "[what_done] ([reagent_str] | [genes_str])") -/obj/item/food/snacks/grown/extinguish_light(force = FALSE) - if(!force) - return +/obj/item/food/snacks/grown/extinguish_light(force) if(seed.get_gene(/datum/plant_gene/trait/glow/shadow)) return set_light(0) diff --git a/code/modules/hydroponics/hydroponics_tray.dm b/code/modules/hydroponics/hydroponics_tray.dm index c6ef764b2dcc..4bd228afbbb2 100644 --- a/code/modules/hydroponics/hydroponics_tray.dm +++ b/code/modules/hydroponics/hydroponics_tray.dm @@ -315,6 +315,11 @@ update_icon() +/obj/machinery/hydroponics/extinguish_light(force) + if(!force) + return + set_light(0) + /obj/machinery/hydroponics/update_overlays() . = ..() if(self_sustaining && !istype(src, /obj/machinery/hydroponics/soil)) diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index c34741ccaaa3..b1b44250c9a1 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -50,6 +50,7 @@ for(var/t in trophies) var/obj/item/crusher_trophy/T = t . += "It has \a [T] attached, which causes [T.effect_desc()]." + . += "You can use a crowbar on it to remove it's attached trophies." /obj/item/kinetic_crusher/attackby(obj/item/I, mob/living/user) if(istype(I, /obj/item/crusher_trophy)) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 33ded1571896..984f2d1d1388 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -342,7 +342,7 @@ exclaim_verbs = list("imparts") colour = "abductor" key = "^" - flags = RESTRICTED | HIVEMIND | NOLIBRARIAN + flags = RESTRICTED | HIVEMIND | NOLIBRARIAN | HIVEMIND_RUNECHAT follow = TRUE /datum/language/grey/broadcast(mob/living/speaker, message, speaker_mask) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index b7bb510dc0f1..1b6ddb47b940 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -414,6 +414,10 @@ L += contents for(var/obj/item/storage/S in contents) //Check for storage items L += get_contents(S) + for(var/obj/item/mod/control/C in contents) //Check for modsuit storage + for(var/obj/item/mod/module/storage/MS in C.contents) + for(var/obj/item/storage/MSB in MS.contents) + L += get_contents(MSB) for(var/obj/item/clothing/suit/storage/S in contents)//Check for labcoats and jackets L += get_contents(S) for(var/obj/item/clothing/accessory/storage/S in contents)//Check for holsters diff --git a/code/modules/mob/living/silicon/ai/ai_mob.dm b/code/modules/mob/living/silicon/ai/ai_mob.dm index 78e0d6a459a1..3dc96c6967eb 100644 --- a/code/modules/mob/living/silicon/ai/ai_mob.dm +++ b/code/modules/mob/living/silicon/ai/ai_mob.dm @@ -750,24 +750,6 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( to_chat(src, "Цель находится вне зоны камер.") return - if(href_list["callbot"]) //Command a bot to move to a selected location. - Bot = locate(href_list["callbot"]) in GLOB.bots_list - if(!Bot || Bot.remote_disabled || control_disabled) - return //True if there is no bot found, the bot is manually emagged, or the AI is carded with wireless off. - waypoint_mode = TRUE - to_chat(src, "Поставьте беспрепятственную точку назначения.") - return - - if(href_list["interface"]) //Remotely connect to a bot! - Bot = locate(href_list["interface"]) in GLOB.bots_list - if(!Bot || Bot.remote_disabled || control_disabled) - return - Bot.attack_ai(src) - - if(href_list["botrefresh"]) //Refreshes the bot control panel. - botcall() - return - if(href_list["ai_take_control"]) //Mech domination var/obj/mecha/M = locate(href_list["ai_take_control"]) @@ -832,26 +814,9 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( if(check_unable(AI_CHECK_WIRELESS | AI_CHECK_RADIO)) return - var/d - var/area/bot_area - d += "Query network status
" - d += "" - - for(var/mob/living/simple_animal/bot/Bot in GLOB.bots_list) - if(is_ai_allowed(Bot.z) && !Bot.remote_disabled) //Only non-emagged bots on the allowed Z-level are detected! - bot_area = get_area(Bot) - d += "" - //If the bot is on, it will display the bot's current mode status. If the bot is not mode, it will just report "Idle". "Inactive if it is not on at all. - d += "" - d += "" - d += "" - d += "" - d += "" - d = format_text(d) - - var/datum/browser/popup = new(src, "botcall", "Удалённое управление роботами", 700, 400) - popup.set_content(d) - popup.open() + var/datum/ui_module/botcall/botcall + botcall = new(src) + botcall.ui_interact(usr) /mob/living/silicon/ai/proc/set_waypoint(atom/A) var/turf/turf_check = get_turf(A) diff --git a/code/modules/mob/living/silicon/ai/ai_verbs/botcall.dm b/code/modules/mob/living/silicon/ai/ai_verbs/botcall.dm new file mode 100644 index 000000000000..63075b541d67 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/ai_verbs/botcall.dm @@ -0,0 +1,41 @@ +/datum/ui_module/botcall + name = "Access Robot Control" + + var/mob/living/simple_animal/bot/bot + var/mob/living/silicon/ai/AI + +/datum/ui_module/botcall/ui_state(mob/user) + return GLOB.default_state + +/datum/ui_module/botcall/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "BotCall") + ui.set_autoupdate(TRUE) + ui.open() + +/datum/ui_module/botcall/ui_data(mob/user) + var/list/data = ..() + data["bots"] = list() + for(bot in GLOB.bots_list) + if(is_ai_allowed(bot.z) && !bot.remote_disabled) + if(!(bot.bot_type in data["bots"])) + data["bots"][bot.bot_type] = list() + data["bots"][bot.bot_type] += list(bot.get_bot_data()) + return data + +/datum/ui_module/botcall/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + if(..()) + return + var/selected_UID = params["botref"] + AI = usr + bot = locateUID(selected_UID) + if(!bot || bot.remote_disabled || AI.control_disabled) + return + switch(action) + if("interface") + bot.attack_ai(usr) + if("call") + AI.Bot = bot + AI.waypoint_mode = TRUE + to_chat(AI, "Set your waypoint by clicking on a valid location free of obstructions.") diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 7a1a8cb4436a..2d6389a548fd 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -30,6 +30,8 @@ var/window_height = 0 var/obj/item/paicard/paicard // Inserted pai card. var/allow_pai = TRUE // Are we even allowed to insert a pai card. + + /// storing bot_name prior to pai and restoring it. MULEBOT uses this for suffix system var/bot_name var/disabling_timer_id = null @@ -116,8 +118,8 @@ /// The radio filter the bot uses to identify itself on the network. var/bot_filter - /// The type of bot it is, for radio control. - var/bot_type = 0 + /// Type of bot, one of the *_BOT defines. + var/bot_type /// The type of data HUD the bot uses. Diagnostic by default. var/data_hud_type = DATA_HUD_DIAGNOSTIC_BASIC // This holds text for what the bot is mode doing, reported on the remote bot control interface. @@ -696,7 +698,6 @@ Pass a positive integer as an argument to override a bot's default speed. - //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //Patrol and summon code! //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1164,3 +1165,14 @@ Pass a positive integer as an argument to override a bot's default speed. data["emagged"] = emagged data["remote_disabled"] = remote_disabled return data + +// AI bot access verb TGUI +/mob/living/simple_animal/bot/proc/get_bot_data() + . = list( + "name" = name ? name : model, // name is the actual bot name. PAI may change it. Mulebot suffix system uses bot_name // WHY, WHO MADE THIS + "model" = model, // + "status" = mode, // BOT_IDLE is 0, using mode_name will bsod tgui + "location" = get_area(src), + "on" = on, + "UID" = UID(), + ) diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 0ecf75e9a7f3..fa3ab06c3c73 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -81,6 +81,7 @@ target = null oldloc = null area_locked = null + update_icon() /mob/living/simple_animal/bot/cleanbot/set_custom_texts() text_hack = "You corrupt [name]'s cleaning software." @@ -173,6 +174,7 @@ oldloc = loc /mob/living/simple_animal/bot/cleanbot/proc/assign_area() + auto_patrol = FALSE // Don't want autopatrol if we are area locked if(area_locked) area_locked = null else diff --git a/code/modules/mob/living/simple_animal/bot/griefsky.dm b/code/modules/mob/living/simple_animal/bot/griefsky.dm index c8ba2d1e58d6..0df1d99c7237 100644 --- a/code/modules/mob/living/simple_animal/bot/griefsky.dm +++ b/code/modules/mob/living/simple_animal/bot/griefsky.dm @@ -7,7 +7,8 @@ maxHealth = 100 base_icon = "griefsky" window_name = "Automatic Security Unit v3.0" - + bot_type = GRIEF_BOT + model = "Griefsky" var/spin_icon = "griefsky-c" // griefsky and griefsky junior have dif icons var/weapon = /obj/item/melee/energy/sword/saber var/block_chance = 50 //block attacks diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index ff273a7c7476..0f28f329e7a9 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -190,9 +190,14 @@ to_chat(src, "As you observed [period_human_readable], you can freely toggle antag-hud without losing respawnability.") observer.started_as_observer = 1 close_spawn_windows() - var/obj/O = locate("landmark*Observer-Start") + var/obj/spawn_point + if(SSticker.current_state < GAME_STATE_PLAYING) + spawn_point = pick(GLOB.roundstart_observer_start) + else + spawn_point = locate("landmark*Observer-Start") + to_chat(src, "Телепортация...") - observer.forceMove(O.loc) + observer.forceMove(get_turf(spawn_point)) observer.timeofdeath = world.time // Set the time of death so that the respawn timer works correctly. client.prefs.active_character.update_preview_icon(1) observer.icon = client.prefs.active_character.preview_icon diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 8119095b0d0c..feb80b5ca338 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -660,6 +660,42 @@ header = "


" info = "" +/obj/item/paper/nuclear_guide_operating + name = "nuclear guide : 'Operating the Nuclear Device'" + info = "ARMING THE NUCLEAR DEVICE
\ + 1. Insert the NAD.
\ + 2. Enter the code provided by Central Command. For this training device, the code is 11111.
\ + 3. (Optional) Set a specific timer for detonation. Default and minimum is 2 minutes.
\ + 4. Disable the safety.
\ + 5. Arm the nuclear device.
\ + 6. Take out the NAD to ensure the device stays armed.
\ + DISARMING THE NUCLEAR DEVICE
\ + Follow step 1 and 2, then hit the disarm. If you have the NAD but don't know the code, refer to the Defusing guide. If you have neither, refer to the Spacing guide." + +/obj/item/paper/nuclear_guide_defusing + name = "nuclear guide : 'Defusing the Nuclear Device'" + info = "DEFUSING THE NUCLEAR DEVICE
\ + IF YOU DON'T HAVE THE NAD : Refer to the Spacing guide, you cannot defuse the nuclear device.
\ + 1. Insert the NAD.
\ + 2. Use a SCREWDRIVER and open the device's panel.
\ + 3. CUT the CONTROL wire using WIRECUTTERS to short out the control panel and bypass it.
\ + 4. PULSE the DISARM wire using a MULTITOOL to stop the bomb's timer.
\ + WARNING : Nuclear devices deployed by hostile operatives will likely have unlabelled wires.
\ + PULSING or CUTTING the DETONATOR wire will prematurely detonate the bomb if the timer is active.
\ + Depending on the timer left on the bomb, try your luck or refer to the Spacing guide." + +/obj/item/paper/nuclear_guide_spacing + name = "nuclear guide : 'Spacing the Nuclear Device'" + info = "SPACING THE NUCLEAR DEVICE
\ + To be used on assets of hostile operatives only. Any loss of NT nuclear devices following this guide will be charged as Grand Theft per Space Law.
\ + 1. Ensure the device's access panel is closed. Use a screwdriver to close it if it isn't.
\ + 2. Use a WELDING TOOL to cut the anchoring bolt covers.
\ + 3. Use a CROWBAR to pry the bolts open.
\ + 4. Use a WELDING TOOL to cut the anchoring system sealant.
\ + 5. Use a WRENCH to unwrench the anchoring bolts.
\ + 6. Use a CROWBAR to pry the nuclear device off its anchors.
\ + 7. DRAG the nuclear device to the closest opening to SPACE, and PUSH it away from the station." + /obj/item/paper/central_command name = "paper" header ="


Nanotrasen Central Command

Official Expedited Memorandum


" diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm index 231dafbef73b..e21c00727b2e 100644 --- a/code/modules/pda/PDA.dm +++ b/code/modules/pda/PDA.dm @@ -312,9 +312,6 @@ GLOBAL_LIST_EMPTY(PDAs) add_pen(C) to_chat(user, "You slide \the [C] into \the [src].") playsound(src, 'sound/machines/pda_button1.ogg', 50, TRUE) - else if(istype(C, /obj/item/nanomob_card)) - if(cartridge && istype(cartridge, /obj/item/cartridge/mob_hunt_game)) - cartridge.attackby(C, user, params) /obj/item/pda/proc/add_pen(obj/item/P) P.forceMove(src) diff --git a/code/modules/pda/cart.dm b/code/modules/pda/cart.dm index 4a66081f9563..75deb8f685da 100644 --- a/code/modules/pda/cart.dm +++ b/code/modules/pda/cart.dm @@ -306,40 +306,3 @@ messenger_plugins = list( new /datum/data/pda/messenger_plugin/virus/frame ) - -/obj/item/cartridge/mob_hunt_game - name = "Nano-Mob Hunter GO! Cartridge" - desc = "The hit new PDA game that lets you track down and capture your favorite Nano-Mobs living in your world!" - icon_state = "cart-eye" - programs = list( - new /datum/data/pda/app/mob_hunter_game - ) - -/obj/item/cartridge/mob_hunt_game/examine(mob/user) - . = ..() - if(emagged) - if(isAntag(user)) - . += "This copy of Nano-Mob Hunter GO! has been hacked to allow the creation of trap mobs which will cause any PDA that attempts to capture it to shock anyone holding it. Hacked copies of the game will not trigger the trap. Provided you actually find someone playing nanomobs, that is." - -/obj/item/cartridge/mob_hunt_game/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/nanomob_card)) - var/obj/item/nanomob_card/card = O - var/datum/data/pda/app/mob_hunter_game/my_game = programs[1] - - if(my_game.register_capture(card.mob_data)) - to_chat(user, "Transfer successful!") - qdel(card) - else - to_chat(user, "Transfer failed. Could not read mob data from card.") - - else - ..() - -/obj/item/cartridge/mob_hunt_game/emag_act(mob/user) - if(!emagged) - emagged = TRUE - var/datum/data/pda/app/mob_hunter_game/my_game = programs[1] - my_game.hacked = TRUE - to_chat(user, "TR4P_M45T3R.mod successfully initialized. ToS violated. User Agreement nullified. Gotta pwn them all.") - to_chat(user, "You can now create trapped versions of any mob in your collection that will damage hunters who attempt to capture it.") - return TRUE diff --git a/code/modules/pda/mob_hunt_game_app.dm b/code/modules/pda/mob_hunt_game_app.dm deleted file mode 100644 index 73eab8cf1a52..000000000000 --- a/code/modules/pda/mob_hunt_game_app.dm +++ /dev/null @@ -1,205 +0,0 @@ - -/* - This stuff isn't included with in core_apps.dm because it is so distinct and would end up making the file huge (more than it already is). - I put it in it's own file in order to help it stay organized and easier to locate the procs and such. - For reference, the other Nano-mob Hunter GO files are in /code/game/modules/arcade/mob_hunt -*/ - -/datum/data/pda/app/mob_hunter_game - name = "Nano-Mob Hunter GO" - icon = "gamepad" - template = "pda_mob_hunt" - category = "Games" - - var/list/my_collection = list() - var/current_index = 0 - var/connected = FALSE - var/hacked = FALSE //if set, this cartridge is able to spawn trap mobs from its collection (set via emag_act on the cartridge) - var/catch_mod = 0 //used to adjust the likelihood of a mob running from this client, a negative value means it is less likely to run (support for temporary bonuses) - var/wild_captures = 0 //used to track the total number of mobs captured from the wild (does not count card mobs) by this client - var/scan_range = 3 //maximum distance (in tiles) from which the client can reveal nearby mobs - -/datum/data/pda/app/mob_hunter_game/start() - ..() - START_PROCESSING(SSobj, pda) - -/datum/data/pda/app/mob_hunter_game/stop() - ..() - disconnect("Program Terminated") - STOP_PROCESSING(SSobj, pda) - -/datum/data/pda/app/mob_hunter_game/Destroy() - if(pda) - STOP_PROCESSING(SSobj, pda) - SSmob_hunt.connected_clients -= src - return ..() - -/datum/data/pda/app/mob_hunter_game/proc/scan_nearby() - if(!SSmob_hunt || !connected) - return - for(var/turf/T in range(scan_range, get_turf(pda))) - for(var/obj/effect/nanomob/N in T.contents) - if(src in N.clients_encountered) - //hide the mob - N.conceal() - else - //reveal the mob - N.reveal() - -/datum/data/pda/app/mob_hunter_game/proc/reconnect() - if(!SSmob_hunt || !SSmob_hunt.server_status || connected) - //show a message about the server being unavailable (because it doesn't exist / didn't get set to the global var / is offline) - return 0 - SSmob_hunt.connected_clients += src - connected = TRUE - if(pda) - pda.atom_say("Connection established. Capture all of the mobs, [pda.owner ? pda.owner : "hunter"]!") - return 1 - -/datum/data/pda/app/mob_hunter_game/proc/get_player() - if(!pda) - return null - if(ishuman(pda.loc)) - var/mob/living/carbon/human/H = pda.loc - return H - return null - -/datum/data/pda/app/mob_hunter_game/proc/disconnect(reason = null) - if(!SSmob_hunt || !connected) - return - SSmob_hunt.connected_clients -= src - for(var/obj/effect/nanomob/N in (SSmob_hunt.normal_spawns + SSmob_hunt.trap_spawns)) - N.conceal(list(get_player())) - connected = FALSE - //show a disconnect message if we were disconnected involuntarily (reason argument provided) - if(pda && reason) - pda.atom_say("Disconnected from server. Reason: [reason].") - -/datum/data/pda/app/mob_hunter_game/program_process() - if(!SSmob_hunt || !connected) - return - scan_nearby() - -/datum/data/pda/app/mob_hunter_game/proc/register_capture(datum/mob_hunt/captured, wild = FALSE) - if(!captured) - return FALSE - my_collection += captured - RegisterSignal(captured, COMSIG_PARENT_QDELETING, PROC_REF(remove_mob)) - if(wild) - wild_captures++ - return TRUE - -/datum/data/pda/app/mob_hunter_game/update_ui(mob/user, list/data) - if(!SSmob_hunt || !(src in SSmob_hunt.connected_clients)) - data["connected"] = 0 - else - data["connected"] = 1 - data["wild_captures"] = wild_captures - data["no_collection"] = 0 - if(!length(my_collection)) - data["no_collection"] = 1 - return - var/datum/mob_hunt/mob_info - if(!current_index) - current_index = 1 - if(current_index > length(my_collection)) - current_index = 1 - if(current_index < 1) - current_index = length(my_collection) - mob_info = my_collection[current_index] - var/list/entry = list( - "nickname" = mob_info.nickname, - "real_name" = mob_info.mob_name, - "level" = mob_info.level, - "type1" = mob_info.get_type1(), - "type2" = mob_info.get_type2(), - "sprite" = "[mob_info.icon_state_normal].png", - "is_hacked" = hacked - ) - if(mob_info.is_shiny) - entry["sprite"] = "[mob_info.icon_state_shiny].png" - data["entry"] = entry - -/datum/data/pda/app/mob_hunter_game/proc/assign_nickname() - if(!length(my_collection)) - return - var/datum/mob_hunt/mob_info = my_collection[current_index] - var/old_name = mob_info.mob_name - if(mob_info.nickname) - old_name = mob_info.nickname - mob_info.nickname = tgui_input_text(usr, "Give a nickname to [old_name]?", "Nickname", old_name) - -/datum/data/pda/app/mob_hunter_game/proc/release() - if(!length(my_collection)) - return - if(tgui_alert(usr, "Are you sure you want to release this mob back into the wild?", "Confirm Release", list("Yes", "No")) == "Yes") - remove_mob() - -/datum/data/pda/app/mob_hunter_game/proc/print_card() - if(!pda || !length(my_collection)) - return - var/obj/item/nanomob_card/card = new/obj/item/nanomob_card(null) - var/datum/mob_hunt/mob_info = my_collection[current_index] - card.mob_data = mob_info - card.update_info() - card.forceMove(get_turf(pda)) - remove_mob() - -/** - * Removes a Nanomob from the [my_collection] list. - * - * The Nanomob that is currently selected in the app ([current_index]) will be removed from the list unless a `mob_override` argument is given, in which case that will be removed instead. - * - * Arguments: - * * mob_override - A specific Nanomob to remove from the list. (Optional) - */ -/datum/data/pda/app/mob_hunter_game/proc/remove_mob(datum/mob_hunt/mob_override = null) - SIGNAL_HANDLER - if(!length(my_collection)) - return - - if(mob_override) - my_collection -= mob_override - else - my_collection -= my_collection[current_index] - - var/collection_length = length(my_collection) - if(current_index > collection_length) - current_index = collection_length - -/datum/data/pda/app/mob_hunter_game/proc/set_trap() - if(!length(my_collection) || !pda || !hacked) - return - var/datum/mob_hunt/bait = my_collection[current_index] - bait = bait.type - new bait(1, get_turf(pda)) - -/datum/data/pda/app/mob_hunter_game/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - if(..()) - return - - if(!pda.silent) - playsound(pda, 'sound/machines/terminal_select.ogg', 15, TRUE) - - . = TRUE - switch(action) - if("Rename") - assign_nickname() - if("Release") - release() - if("Next") - current_index++ - if(current_index > length(my_collection)) - current_index = 1 - if("Prev") - current_index-- - if(current_index < 1) - current_index = length(my_collection) - if("Reconnect") - reconnect() - if("Disconnect") - disconnect() - if("Transfer") - print_card() - if("Set_Trap") - set_trap() diff --git a/code/modules/pda/pda_tgui.dm b/code/modules/pda/pda_tgui.dm index 27310410d31e..96c1a8f52961 100644 --- a/code/modules/pda/pda_tgui.dm +++ b/code/modules/pda/pda_tgui.dm @@ -60,11 +60,6 @@ return data -/obj/item/pda/ui_assets(mob/user) - return list( - get_asset_datum(/datum/asset/simple/mob_hunt) - ) - // Yes the stupid amount of args here is important, see L102 /obj/item/pda/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) if(..()) diff --git a/code/modules/power/engines/supermatter/supermatter.dm b/code/modules/power/engines/supermatter/supermatter.dm index 0a8131c290fc..3bce6ff85194 100644 --- a/code/modules/power/engines/supermatter/supermatter.dm +++ b/code/modules/power/engines/supermatter/supermatter.dm @@ -355,7 +355,7 @@ explode() -/obj/machinery/atmospherics/supermatter_crystal/proc/explode() +/obj/machinery/atmospherics/supermatter_crystal/proc/explode(forced_combined_gas = 0, forced_power = 0, forced_gasmix_power_ratio = 0) SSblackbox.record_feedback("amount", "supermatter_delaminations", 1) for(var/mob in GLOB.alive_mob_list) var/mob/living/L = mob @@ -381,14 +381,14 @@ else to_chat(M, "You hold onto \the [M.loc] as hard as you can, as reality distorts around you. You feel safe.") - if(combined_gas > MOLE_CRUNCH_THRESHOLD) + if(max(combined_gas, forced_combined_gas) > MOLE_CRUNCH_THRESHOLD) investigate_log("has collapsed into a singularity.", "supermatter") if(T) var/obj/singularity/S = new(T) S.energy = 800 S.consume(src) return //No boom for me sir - else if(power > POWER_PENALTY_THRESHOLD) + else if(max(power, forced_power) > POWER_PENALTY_THRESHOLD) investigate_log("has spawned additional energy balls.", "supermatter") if(T) var/obj/singularity/energy_ball/E = new(T) @@ -399,6 +399,8 @@ // return //No boom for me sir //Dear mappers, balance the sm max explosion radius to 17.5, 37, 39, 41 playsound(src, 'modular_ss220/aesthetics_sounds/sound/supermatter/explode.ogg', 100, FALSE, 40, 30, falloff_distance = 10) //SS220 EDIT - ADDITION + if(forced_gasmix_power_ratio) + gasmix_power_ratio = forced_gasmix_power_ratio explosion(get_turf(T), explosion_power * max(gasmix_power_ratio, 0.205) * 0.5 , explosion_power * max(gasmix_power_ratio, 0.205) + 2, explosion_power * max(gasmix_power_ratio, 0.205) + 4 , explosion_power * max(gasmix_power_ratio, 0.205) + 6, 1, 1) qdel(src) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 7baf9bb6cc79..b4b071e6f616 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -67,22 +67,14 @@ var/flight_x_offset = 0 var/flight_y_offset = 0 - //Zooming - var/zoomable = FALSE //whether the gun generates a Zoom action on creation - var/zoomed = FALSE //Zoom toggle - var/zoom_amt = 3 //Distance in TURFs to move the user's screen forward (the "zoom" effect) - var/datum/action/toggle_scope_zoom/azoom - /obj/item/gun/Initialize(mapload) . = ..() - build_zooming() ADD_TRAIT(src, TRAIT_CAN_POINT_WITH, ROUNDSTART_TRAIT) appearance_flags |= KEEP_TOGETHER /obj/item/gun/Destroy() QDEL_NULL(bayonet) QDEL_NULL(chambered) - QDEL_NULL(azoom) QDEL_NULL(gun_light) return ..() @@ -154,6 +146,10 @@ /obj/item/gun/afterattack(atom/target, mob/living/user, flag, params) if(firing_burst) return + if(SEND_SIGNAL(src, COMSIG_GUN_TRY_FIRE, user, target, flag, params) & COMPONENT_CANCEL_GUN_FIRE) + return + if(SEND_SIGNAL(src, COMSIG_MOB_TRY_FIRE, user, target, flag, params) & COMPONENT_CANCEL_GUN_FIRE) + return if(flag) //It's adjacent, is the user, or is on the user's person if(target in user.contents) //can't shoot stuff inside us. return @@ -414,11 +410,6 @@ visible_message("[src]'s light fades and turns off.") -/obj/item/gun/dropped(mob/user) - ..() - zoom(user,FALSE) - if(azoom) - azoom.Remove(user) /obj/item/gun/AltClick(mob/user) ..() @@ -485,93 +476,8 @@ process_fire(target, user, 1, params) -///////////// -// ZOOMING // -///////////// - -/datum/action/toggle_scope_zoom - name = "Toggle Scope" - check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING - button_icon_state = "sniper_zoom" - var/obj/item/gun/gun = null - -/datum/action/toggle_scope_zoom/Destroy() - gun = null - return ..() - -/datum/action/toggle_scope_zoom/Trigger(left_click) - gun.zoom(owner) - -/datum/action/toggle_scope_zoom/IsAvailable() - . = ..() - if(!. && gun) - gun.zoom(owner, FALSE) - -/datum/action/toggle_scope_zoom/Remove(mob/living/L) - gun.zoom(L, FALSE) - ..() - -/obj/item/gun/proc/zoom(mob/living/user, forced_zoom) - if(!user || !user.client) - return - - switch(forced_zoom) - if(FALSE) - zoomed = FALSE - if(TRUE) - zoomed = TRUE - else - zoomed = !zoomed - - if(zoomed) - var/_x = 0 - var/_y = 0 - switch(user.dir) - if(NORTH) - _y = zoom_amt - if(EAST) - _x = zoom_amt - if(SOUTH) - _y = -zoom_amt - if(WEST) - _x = -zoom_amt - - user.client.pixel_x = world.icon_size*_x - user.client.pixel_y = world.icon_size*_y - else - user.client.pixel_x = 0 - user.client.pixel_y = 0 - - -//Proc, so that gun accessories/scopes/etc. can easily add zooming. -/obj/item/gun/proc/build_zooming() - if(azoom) - return - - if(zoomable) - azoom = new() - azoom.gun = src - RegisterSignal(src, COMSIG_ITEM_EQUIPPED, PROC_REF(ZoomGrantCheck)) - -/** - * Proc which will be called when the gun receives the `COMSIG_ITEM_EQUIPPED` signal. - * - * This happens if the mob picks up the gun, or equips it to any of their slots. - * If the slot is anything other than either of their hands (such as the back slot), un-zoom them, and `Remove` the zoom action button from the mob. - * Otherwise, `Grant` the mob the zoom action button. - * - * Arguments: - * * source - the gun that got equipped, which is `src`. - * * user - the mob equipping the gun. - * * slot - the slot the gun is getting equipped to. - */ -/obj/item/gun/proc/ZoomGrantCheck(datum/source, mob/user, slot) - // Checks if the gun got equipped into either of the user's hands. - if(slot != SLOT_HUD_RIGHT_HAND && slot != SLOT_HUD_LEFT_HAND) - // If its not in their hands, un-zoom, and remove the zoom action button. - zoom(user, FALSE) - azoom.Remove(user) - return FALSE +/obj/item/gun/proc/on_scope_success() + return - // The gun is equipped in their hands, give them the zoom ability. - azoom.Grant(user) +/obj/item/gun/proc/on_scope_end() + return diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 9bc6e43ec821..114fa03cfb6d 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -1,6 +1,6 @@ /obj/item/gun/energy/kinetic_accelerator name = "proto-kinetic accelerator" - desc = "A self recharging, ranged mining tool that does increased damage in low pressure. Capable of holding up to six slots worth of mod kits." + desc = "A self-recharging, ranged mining tool that does increased damage in low pressure environments. It can be upgraded using specialised mod kits." icon_state = "kineticgun" item_state = "kineticgun" ammo_type = list(/obj/item/ammo_casing/energy/kinetic) @@ -34,6 +34,7 @@ for(var/A in get_modkits()) var/obj/item/borg/upgrade/modkit/M = A . += "There is a [M.name] mod installed, using [M.cost]% capacity." + . += "You can use a crowbar on it to remove it's installed mod kits." /obj/item/gun/energy/kinetic_accelerator/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/borg/upgrade/modkit) && max_mod_capacity) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 3d194b08510b..fddd8eacaf40 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -126,39 +126,21 @@ weapon_weight = WEAPON_HEAVY origin_tech = "combat=6;magnets=6;powerstorage=4" ammo_type = list(/obj/item/ammo_casing/energy/laser/sniper, /obj/item/ammo_casing/energy/laser/sniper/pierce) - zoomable = TRUE - zoom_amt = 7 shaded_charge = TRUE - /// Is the scope fully online or not? - var/scope_active = FALSE - var/stored_dir execution_speed = 8 SECONDS -/obj/item/gun/energy/lwap/zoom(mob/living/user, forced_zoom) +/obj/item/gun/energy/lwap/Initialize(mapload) . = ..() - if(!ishuman(user)) - return - var/mob/living/carbon/human/H = user - stored_dir = H.dir - if(scope_active && !zoomed) - select_fire(H) - H.remove_status_effect(STATUS_EFFECT_LWAPSCOPE) - scope_active = FALSE - return - if(zoomed && do_after(user, 3 SECONDS, target = src)) - if(zoomed && !scope_active) //We check after to be sure. - scope_active = TRUE - to_chat(user, "SCOPE_CREEPER_[rand(1, 9999)] Online.") - select_fire(H) - H.apply_status_effect(STATUS_EFFECT_LWAPSCOPE, stored_dir) - return - if(zoomed) - zoom(user, FALSE) //Moved while scope was booting, so we unzoom - -/obj/item/gun/energy/lwap/on_mob_move(dir, mob/user) - if(scope_active) - to_chat(user, "[src]'s scope is overloaded by movement and shuts down!") - zoom(user, FALSE) + AddComponent(/datum/component/scope, range_modifier = 2, time_to_scope = 3 SECONDS, movement_cancels_scope = TRUE) + +/obj/item/gun/energy/lwap/on_scope_success(mob/living/user) + to_chat(user, "SCOPE_CREEPER_[rand(1, 9999)] Online.") + select_fire(user) + user.apply_status_effect(STATUS_EFFECT_LWAPSCOPE) + +/obj/item/gun/energy/lwap/on_scope_end(mob/living/user) + select_fire(user) + user.remove_status_effect(STATUS_EFFECT_LWAPSCOPE) /obj/item/gun/energy/lwap/attack_self() return //no manual ammo changing. @@ -273,7 +255,7 @@ return /// Special version given by the Safety Override upgrade and as a standard module for ERT engiborgs. -/obj/item/gun/energy/emitter/cyborg/proto +/obj/item/gun/energy/emitter/cyborg/proto name = "mobile proto-emitter" desc = "An emitter removed from its base and attached to a laser cannon frame. This one operates on unoptimised software, reducing its effectiveness." ammo_type = list(/obj/item/ammo_casing/energy/emitter/cyborg/proto) diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index 43781e87570a..f8d317464e03 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -15,14 +15,18 @@ can_unsuppress = TRUE can_suppress = TRUE w_class = WEIGHT_CLASS_NORMAL - zoomable = TRUE - zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you. slot_flags = SLOT_FLAG_BACK actions_types = list() execution_speed = 8 SECONDS + var/zoomable = TRUE + +/obj/item/gun/projectile/automatic/sniper_rifle/Initialize(mapload) + . = ..() + if(zoomable) + AddComponent(/datum/component/scope, range_modifier = 2) /obj/item/gun/projectile/automatic/sniper_rifle/process_fire(atom/target, mob/living/user, message = TRUE, params, zone_override, bonus_spread = 0) - if(istype(chambered.BB, /obj/item/projectile/bullet/sniper) && !zoomed) + if(istype(chambered.BB, /obj/item/projectile/bullet/sniper) && !HAS_TRAIT(user, TRAIT_SCOPED)) var/obj/item/projectile/bullet/sniper/S = chambered.BB if(S.non_zoom_spread) to_chat(user, "[src] must be zoomed in to fire this ammunition accurately!") diff --git a/code/modules/projectiles/guns/rocket.dm b/code/modules/projectiles/guns/rocket.dm index 1a6755a59e24..1e3f111479ce 100644 --- a/code/modules/projectiles/guns/rocket.dm +++ b/code/modules/projectiles/guns/rocket.dm @@ -13,11 +13,14 @@ fire_sound = 'sound/weapons/blastcannon.ogg' fire_delay = 40 recoil = 2 - zoomable = TRUE - zoom_amt = 7 var/missile_speed = 2 var/missile_range = 30 + +/obj/item/gun/rocketlauncher/Initialize(mapload) + . = ..() + AddComponent(/datum/component/scope, range_modifier = 2) + /obj/item/gun/rocketlauncher/examine(mob/user) . = ..() . += "It is currently [chambered ? "" : "un"]loaded." diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 1c07afabb507..b62eb64b0f64 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -163,9 +163,11 @@ B.reagents.add_reagent("vaccine", 15, list(vaccine_type)) if("eject_beaker") eject_beaker() + update_static_data(ui.user) if("destroy_eject_beaker") beaker.reagents.clear_reagents() eject_beaker() + update_static_data(ui.user) if("print_release_forms") var/strain_index = text2num(params["strain_index"]) if(isnull(strain_index)) @@ -202,6 +204,7 @@ A.AssignName(new_name) for(var/datum/disease/advance/AD in GLOB.active_diseases) AD.Refresh() + update_static_data(ui.user) if("switch_strain") var/strain_index = text2num(params["strain_index"]) if(isnull(strain_index) || strain_index < 1) diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index 9ed4d2a450cc..0c1b82d9d0c0 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -1020,7 +1020,10 @@ if(ishuman(M) && prob(5)) var/mob/living/carbon/human/H = M if(!H.get_int_organ(/obj/item/organ/internal/bone_tumor)) - new/obj/item/organ/internal/bone_tumor(H) + if(isslimeperson(H)) + new /obj/item/organ/internal/bone_tumor/slime_tumor(H) + else + new /obj/item/organ/internal/bone_tumor(H) return ..() diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 476fa574fcf7..ff3c7b741b4f 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -502,6 +502,17 @@ build_path = /obj/item/organ/internal/eyes/cybernetic/thermals category = list("Medical") +/datum/design/cyberimp_scope + name = "Kaleido Optics Implant" + desc = "These cybernetic eye implants will let you zoom in on far away objects. Many users find it disorienting, and find it hard to interact with things near them when active." + id = "ci-scope" + req_tech = list("materials" = 6, "programming" = 4, "biotech" = 7, "magnets" = 5,"plasmatech" = 4) + build_type = PROTOLATHE | MECHFAB + construction_time = 60 + materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 600, MAT_GOLD = 600, MAT_PLASMA = 1000, MAT_DIAMOND = 2000) + build_path = /obj/item/organ/internal/eyes/cybernetic/scope + category = list("Medical") + /datum/design/cyberimp_antidrop name = "Anti-Drop Implant" desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 45ced9b24035..46189864ab0e 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -51,6 +51,16 @@ build_path = /obj/item/disk/tech_disk category = list("Miscellaneous") +/datum/design/training_disk + name = "Training Authentification Disk" + desc = "Replacement authentication disk for the nuclear training bomb." + id = "training_nad" + req_tech = list("programming" = 1) + build_type = PROTOLATHE | AUTOLATHE + materials = list(MAT_METAL = 300, MAT_GLASS = 100) + build_path = /obj/item/disk/nuclear/training + category = list("Miscellaneous") + /datum/design/digital_camera name = "Digital Camera" desc = "Produce an enhanced version of the standard issue camera." diff --git a/code/modules/ruins/ghost_bar.dm b/code/modules/ruins/ghost_bar.dm index f2061ec251a8..d212ddb88b7b 100644 --- a/code/modules/ruins/ghost_bar.dm +++ b/code/modules/ruins/ghost_bar.dm @@ -1,3 +1,5 @@ +GLOBAL_LIST_EMPTY(occupants_by_key) + /obj/effect/mob_spawn/human/alive/ghost_bar name = "ghastly rejuvenator" mob_name = "ghost bar occupant" @@ -83,6 +85,11 @@ implant.insert(H) log_game("[ckey] has entered the ghost bar") playsound(src, 'sound/machines/wooden_closet_open.ogg', 50) + var/mob/old_mob = GLOB.occupants_by_key["[H.ckey]"] + if(old_mob) + qdel(old_mob) + GLOB.occupants_by_key["[H.ckey]"] = H + RegisterSignal(H, COMSIG_PARENT_QDELETING, PROC_REF(clear_references_to_owner)) /obj/effect/mob_spawn/human/alive/ghost_bar/proc/equip_item(mob/living/carbon/human/H, path, slot) var/obj/item/I = new path(H) @@ -90,6 +97,10 @@ H.speaks_ooc = TRUE return I +/obj/effect/mob_spawn/human/alive/ghost_bar/proc/clear_references_to_owner(mob/mob_to_obliterate) + SIGNAL_HANDLER // COMSIG_PARENT_QDELETING + GLOB.occupants_by_key -= mob_to_obliterate.ckey + /obj/structure/ghost_bar_cryopod name = "returning sarcophagus" desc = "Returns you back to the world of the dead." diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 7c74cbba2ba4..7e2d3950a5a7 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -342,12 +342,26 @@ // The emergency shuttle doesn't work like others so this // ripple check is slightly different if(!length(ripples) && (time_left <= SHUTTLE_RIPPLE_TIME) && ((mode == SHUTTLE_CALL) || (mode == SHUTTLE_ESCAPE))) - var/destination + var/obj/docking_port/stationary/destination if(mode == SHUTTLE_CALL) destination = SSshuttle.getDock("emergency_home") else if(mode == SHUTTLE_ESCAPE) destination = SSshuttle.getDock("emergency_away") + if(lance_docking && !destination) + destination = random_docking_go() create_ripples(destination) + if(lance_docking && is_station_level(destination.z)) + var/list/L2 = list() + switch(destination.dir) + if(NORTH) + L2 = block(locate(destination.x-9, destination.y+36, destination.z), locate(destination.x+9, 255, destination.z)) + if(SOUTH) + L2 = block(locate(destination.x-9, 1, destination.z), locate(destination.x+9, destination.y-36, destination.z)) + if(EAST) + L2 = block(locate(destination.x+36, destination.y-9, destination.z), locate(255, destination.y+9, destination.z)) + if(WEST) + L2 = block(locate(1, destination.y-9, destination.z), locate(destination.x-36, destination.y+9, destination.z)) + create_lance_ripples(L2, destination) switch(mode) if(SHUTTLE_RECALL) @@ -443,6 +457,55 @@ D.open() */ //Leaving this here incase someone decides to port -tg-'s escape shuttle stuff: +/obj/docking_port/mobile/emergency/proc/random_docking_go() + var/cycles = 1000 + var/stop = FALSE + for(var/cycle in 1 to cycles) + // DRUNK DIALLING WOOOOOOOOO + var/x = rand(1, world.maxx) + var/y = rand(1, world.maxy) + var/z = 2 + var/random_dir = pick(NORTH, SOUTH, EAST, WEST) + var/obj/docking_port/stationary/lance/port = new(locate(x, y, z)) + port.dir = random_dir + if(isspaceturf(get_turf(port))) + qdel(port, force = TRUE) + continue + + var/min_x = -1 + var/min_y = -1 + var/max_x = -1 + var/max_y = -1 + + var/list/ordered_turfs = port.return_ordered_turfs() + for(var/turf/T in ordered_turfs) + if(stop) + break + min_x = min_x < 0 ? T.x : min(min_x, T.x) + min_y = min_y < 0 ? T.y : min(min_y, T.y) + max_x = max_x < 0 ? T.x : max(max_x, T.x) + max_y = max_y < 0 ? T.y : max(max_y, T.y) + for(var/obj/O in T.contents) + if(istype(O, /obj/machinery/atmospherics/supermatter_crystal) || istype(O, /obj/singularity)) + qdel(port, force = TRUE) + stop = TRUE + break + if(stop) + stop = FALSE + continue + if(min_x <= TRANSITION_BORDER_WEST + 1 || max_x >= TRANSITION_BORDER_EAST - 1) + qdel(port, force = TRUE) + continue + if(min_y <= TRANSITION_BORDER_SOUTH + 1 || max_y >= TRANSITION_BORDER_NORTH - 1) + qdel(port, force = TRUE) + continue + port.register() + return port + +/obj/docking_port/mobile/emergency/proc/create_lance_ripples(list/L2, obj/docking_port/stationary/S1) + for(var/turf/T in L2) + ripples += new /obj/effect/temp_visual/ripple/lance_crush(T) + // This basically opens a big-ass row of blast doors when the shuttle arrives at centcom /obj/docking_port/mobile/pod name = "escape pod" diff --git a/code/modules/shuttle/lance_docking_targeter.dm b/code/modules/shuttle/lance_docking_targeter.dm new file mode 100644 index 000000000000..f758267d20b2 --- /dev/null +++ b/code/modules/shuttle/lance_docking_targeter.dm @@ -0,0 +1,118 @@ +/obj/item/lance_docking_generator + name = "lance docking beacon" + desc = "A signaling device used to place a beacon, to allow the lance to precicely dock." + icon = 'icons/obj/device.dmi' + icon_state = "gangtool-red" + var/gps + +/obj/item/lance_docking_generator/Initialize(mapload) + . = ..() + gps = new /obj/item/gps/internal/lance_beacon(src) + +/obj/item/lance_docking_generator/Destroy() + qdel(gps) + return ..() + +/obj/item/lance_docking_generator/emag_act(mob/user) + if(!emagged) + emagged = TRUE + to_chat(user, "You emag [src], removing its docking safeties.") + var/turf/T = get_turf(src) + do_sparks(5, FALSE, T) + playsound(T, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + return TRUE + +/obj/item/lance_docking_generator/attack_self(mob/living/user) + if(!is_station_level(user.z)) + to_chat(user, "You'll want this to dock on the station.") + return + var/list/dir_choices = list("North" = NORTH, "East" = EAST, "South" = SOUTH, "West" = WEST) + var/dir_choice = tgui_input_list(user, "Select the new docking area orientation.", "Dock Orientation", dir_choices) + if(!dir_choice) + return + + var/dest_dir = dir_choices[dir_choice] + var/turf/destination = get_step(user.loc, dest_dir) + var/obj/docking_port/stationary/lance/port = new(destination) + port.dir = dest_dir + + var/min_x = -1 + var/min_y = -1 + var/max_x = -1 + var/max_y = -1 + + var/list/ordered_turfs = port.return_ordered_turfs() + for(var/turf/T in ordered_turfs) + min_x = min_x < 0 ? T.x : min(min_x, T.x) + min_y = min_y < 0 ? T.y : min(min_y, T.y) + max_x = max_x < 0 ? T.x : max(max_x, T.x) + max_y = max_y < 0 ? T.y : max(max_y, T.y) + for(var/obj/O in T.contents) + if((istype(O, /obj/machinery/atmospherics/supermatter_crystal) || istype(O, /obj/singularity)) && !emagged) + to_chat(user, "Dangerous landing conditions, aborting!") + qdel(port, force = TRUE) + return + + if(min_x <= TRANSITION_BORDER_WEST + 1 || max_x >= TRANSITION_BORDER_EAST - 1) + to_chat(user, "Docking space area too close to edge of sector, aborting!") + qdel(port, force = TRUE) + return + if(min_y <= TRANSITION_BORDER_SOUTH + 1 || max_y >= TRANSITION_BORDER_NORTH - 1) + to_chat(user, "Docking space area too close to edge of sector, aborting!") + qdel(port, force = TRUE) + return + var/list/L2 = list() + switch(dest_dir) + if(NORTH) + L2 = block(locate(port.x - 9, port.y + 36, port.z), locate(port.x + 9, 255, port.z)) + if(SOUTH) + L2 = block(locate(port.x - 9, 1, port.z), locate(port.x + 9, port.y - 36, port.z)) + if(EAST) + L2 = block(locate(port.x + 36, port.y - 9, port.z), locate(255, port.y + 9, port.z)) + if(WEST) + L2 = block(locate(1, port.y - 9, port.z), locate(port.x - 36, port.y + 9, port.z)) + for(var/turf/BT in L2) + for(var/obj/Ohno in BT.contents) + if((istype(Ohno, /obj/machinery/atmospherics/supermatter_crystal) || istype(Ohno, /obj/singularity)) && !emagged) + to_chat(user, "Dangerous landing conditions, aborting!") + qdel(port, force = TRUE) + return + port.register() + + log_admin("[key_name(user)] created the lance docking location at [COORD(port)].") + to_chat(user, "Landing zone set. The signaller vanishes!") + new /obj/structure/lance_beacon(get_turf(src)) + qdel(src) + +/obj/structure/lance_beacon + name = "lance docking beacon" + desc = "A beacon that allows the Lance to carefully slam into the station at plasteel destroying speeds." + icon = 'icons/obj/singularity.dmi' + icon_state = "beacon1" + layer = MOB_LAYER - 0.2 //so people can't hide it and it's REALLY OBVIOUS + anchored = TRUE + resistance_flags = INDESTRUCTIBLE + var/gps + +/obj/structure/lance_beacon/Initialize(mapload) + . = ..() + gps = new /obj/item/gps/internal/lance_beacon(src) + set_light(5, 3, COLOR_WARM_YELLOW) + +/obj/structure/lance_beacon/Destroy() + qdel(gps) + return ..() + +/obj/docking_port/stationary/lance + name = "lance docking port" + id = "emergency_home" + height = 50 + dheight = 0 + width = 19 + dwidth = 9 + +/obj/item/gps/internal/lance_beacon + icon_state = null + gpstag = "Lance Docking Beacon" + desc = "It is not reccomended to stand here." + invisibility = 100 diff --git a/code/modules/shuttle/ripple.dm b/code/modules/shuttle/ripple.dm index 078cc9aa9fad..bc7ba0e05ed7 100644 --- a/code/modules/shuttle/ripple.dm +++ b/code/modules/shuttle/ripple.dm @@ -20,3 +20,19 @@ . = ..() QUEUE_SMOOTH(src) animate(src, alpha=255, time=SHUTTLE_RIPPLE_TIME) + + +/obj/effect/temp_visual/ripple/lance_crush + name = "collision lights" + desc = "Something is coming through hyperspace in a very unsafe way. You *really* do not want to be standing here." + icon = 'icons/turf/walls/hierophant_wall_temp.dmi' + icon_state = "hierophant_wall_temp-0" + base_icon_state = "hierophant_wall_temp" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = list(SMOOTH_GROUP_HIERO_WALL) + canSmoothWith = list(SMOOTH_GROUP_HIERO_WALL) + color = rgb(255, 0, 0) + light_range = MINIMUM_USEFUL_LIGHT_RANGE + light_color = LIGHT_COLOR_PURE_RED + alpha = 128 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index e429c8a8aaca..9e842b3a7af2 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -228,6 +228,8 @@ var/uses_lockdown = FALSE /// If this variable is true, shuttle is on lockdown, and other requests can not be processed var/lockeddown = FALSE + /// Is this a shuttle that completely destroys whatever dares to get in it's way? + var/lance_docking = FALSE /obj/docking_port/mobile/Initialize(mapload) . = ..() @@ -479,6 +481,18 @@ remove_ripples() //move or squish anything in the way ship at destination + if(lance_docking && is_station_level(S1.z)) + var/list/L2 = list() + switch(S1.dir) + if(NORTH) + L2 = block(locate(S1.x-9, S1.y+36, S1.z), locate(S1.x+9, 255, S1.z)) + if(SOUTH) + L2 = block(locate(S1.x-9, 1, S1.z), locate(S1.x+9, S1.y-36, S1.z)) + if(EAST) + L2 = block(locate(S1.x+36, S1.y-9, S1.z), locate(255, S1.y+9, S1.z)) + if(WEST) + L2 = block(locate(1, S1.y-9, S1.z), locate(S1.x-36, S1.y+9, S1.z)) + shuttle_smash(L2, S1) roadkill(L0, L1, S1.dir) for(var/i in 1 to length(L0)) @@ -614,6 +628,9 @@ if(AM.pulledby) AM.pulledby.stop_pulling() if(AM.flags_2 & IMMUNE_TO_SHUTTLECRUSH_2) + if(istype(AM, /obj/machinery/atmospherics/supermatter_crystal)) + var/obj/machinery/atmospherics/supermatter_crystal/bakoom = AM + addtimer(CALLBACK(bakoom, TYPE_PROC_REF(/obj/machinery/atmospherics/supermatter_crystal, explode), bakoom.combined_gas, bakoom.power, bakoom.gasmix_power_ratio), 1 SECONDS) continue if(ismob(AM)) var/mob/M = AM @@ -627,6 +644,18 @@ "You feel an immense \ crushing pressure as the space around you ripples.") L.gib() + else if(lance_docking) //corrupt the child, destroy them all + if(!AM.simulated) + continue + if(istype(AM, /mob/dead)) + continue + if(istype(AM, /obj/item/organ)) + continue + if(istype(AM, /obj/effect/landmark)) + continue + if(istype(AM, /obj/docking_port)) + continue + qdel(AM, force = TRUE) // Move unanchored atoms if(!AM.anchored && !ismob(AM)) @@ -635,6 +664,21 @@ if(AM.simulated) // Don't qdel lighting overlays, they are static qdel(AM) +/obj/docking_port/mobile/proc/shuttle_smash(list/L2, obj/docking_port/stationary/S1) + var/loud_crash_sound = sound('sound/effects/explosioncreak1.ogg') + for(var/player in GLOB.player_list) + var/mob/M = player + var/turf/mob_turf = get_turf(M) + if(atoms_share_level(S1, mob_turf)) + SEND_SOUND(M, loud_crash_sound) + for(var/turf/T in L2) + for(var/atom/movable/A in T.contents) + A.ex_act(1) + if(istype(A, /obj/machinery/atmospherics/supermatter_crystal)) + var/obj/machinery/atmospherics/supermatter_crystal/bakoom = A + addtimer(CALLBACK(bakoom, TYPE_PROC_REF(/obj/machinery/atmospherics/supermatter_crystal, explode), bakoom.combined_gas, bakoom.power, bakoom.gasmix_power_ratio), 1 SECONDS) + T.ChangeTurf(T.baseturf) //I don't want to deal with turf decals + //used by shuttle subsystem to check timers /obj/docking_port/mobile/proc/check() check_effects() diff --git a/code/modules/shuttle/shuttle_manipulator.dm b/code/modules/shuttle/shuttle_manipulator.dm index c8417758b619..36d822cbdf41 100644 --- a/code/modules/shuttle/shuttle_manipulator.dm +++ b/code/modules/shuttle/shuttle_manipulator.dm @@ -203,6 +203,9 @@ /obj/machinery/shuttle_manipulator/proc/action_load(datum/map_template/shuttle/loading_template) if(isnull(loading_template)) CRASH("No template passed.") + if(istype(loading_template, /datum/map_template/shuttle/emergency) && SSshuttle.emergency_locked_in) + message_admins("The emergency shuttle has been locked in. You can not load another shuttle.") + return if(preview_shuttle && (loading_template != preview_template)) preview_shuttle.jumpToNullSpace() @@ -221,6 +224,10 @@ selected = null /obj/machinery/shuttle_manipulator/proc/action_load_old(datum/map_template/shuttle/loading_template) + if(istype(loading_template, /datum/map_template/shuttle/emergency) && SSshuttle.emergency_locked_in) + message_admins("The emergency shuttle has been locked in. You can not load another shuttle.") + return + // Check for an existing preview if(preview_shuttle && (loading_template != preview_template)) preview_shuttle.jumpToNullSpace() @@ -240,6 +247,8 @@ timer = existing_shuttle.timer mode = existing_shuttle.mode D = existing_shuttle.get_docked() + if(!D) //lance moment + D = SSshuttle.getDock("emergency_away") else D = preview_shuttle.findRoundstartDock() diff --git a/code/modules/supply/supply_packs/pack_shuttle.dm b/code/modules/supply/supply_packs/pack_shuttle.dm index 4a5ba2d77033..2425a61026b9 100644 --- a/code/modules/supply/supply_packs/pack_shuttle.dm +++ b/code/modules/supply/supply_packs/pack_shuttle.dm @@ -40,6 +40,8 @@ . = ..() if(SSshuttle.custom_shuttle_ordered) return + if(SSshuttle.emergency_locked_in) + return if(isnull(template)) CRASH("Shuttle pack [src] has no map template to load!") GLOB.major_announcement.Announce("[order.orderedby] has purchased [name] for [cost] credit\s as the emergency shuttle for the shift.", "Shuttle Purchase Receipt") @@ -54,6 +56,8 @@ var/obj/docking_port/mobile/shuttle = SSshuttle.load_template(template) shuttle.shuttle_speed_factor = speed_factor SSshuttle.replace_shuttle(shuttle) + SSshuttle.emergency_locked_in = TRUE + return TRUE /// Simple supply pack for easy admin modification /datum/supply_packs/abstract/admin_notify/donations @@ -98,6 +102,35 @@ template = /datum/map_template/shuttle/emergency/shadow speed_factor = 2 //Fast enough that it probably won't burn down entirely after the crew looses the plasma +/datum/supply_packs/abstract/shuttle/lance + cost = 5000 //please don't order this for funny please sir + template = /datum/map_template/shuttle/emergency/lance + speed_factor = 1.5 //Don't need to slow down before docking + +/datum/supply_packs/abstract/shuttle/lance/on_order_confirm(datum/supply_order/order) + . = ..() + if(!.) + return + if(order.orderedby) + for(var/mob/living/carbon/human/H in GLOB.human_list) + if(H.name == order.orderedby) + new /obj/item/lance_docking_generator(get_turf(H)) + GLOB.major_announcement.Announce("[order.orderedby] has had a beacon placer teleported to them!", "Shuttle Purchase Receipt") + return TRUE + GLOB.major_announcement.Announce("We were unable to find an orderer. We have sent the beacon placer to the Cargo Office.", "Shuttle Purchase Receipt") + var/list/L = list() + for(var/turf/T in get_area_turfs(/area/station/supply/office)) + if(is_blocked_turf(T)) + continue + L.Add(T) + + if(!length(L)) + GLOB.major_announcement.Announce("We... couldn't find cargo? Well. We'll crash somewhere into your station.", "WELP") + return TRUE + + new /obj/item/lance_docking_generator(pick(L)) + return TRUE + // these, otoh, have some pretty silly features, and are hidden behind emag /datum/supply_packs/abstract/shuttle/clown diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index 69678826def5..427b07d51f38 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -141,6 +141,9 @@ /obj/item/autosurgeon/organ/syndicate/xray_eyes starting_organ = /obj/item/organ/internal/eyes/cybernetic/xray/hardened +/obj/item/autosurgeon/organ/syndicate/scope_eyes + starting_organ = /obj/item/organ/internal/eyes/cybernetic/scope/hardened + /obj/item/autosurgeon/organ/syndicate/anti_stam starting_organ = /obj/item/organ/internal/cyberimp/brain/anti_stam/hardened diff --git a/code/modules/surgery/organs/bone_tumor.dm b/code/modules/surgery/organs/bone_tumor.dm index 98d070f39bd7..6a90f4035e19 100644 --- a/code/modules/surgery/organs/bone_tumor.dm +++ b/code/modules/surgery/organs/bone_tumor.dm @@ -27,3 +27,7 @@ for(var/obj/item/organ/internal/I in other_groin_organs) I.receive_damage(rand(5, 15) + tumor_damage_modifier) + +/obj/item/organ/internal/bone_tumor/slime_tumor + name = "crystalized slime jelly" + diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 373303286c60..a7b13fe9aff9 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -167,6 +167,38 @@ emp_proof = TRUE origin_tech = "materials=6;programming=5;biotech=6;magnets=6;syndicate=3" +/obj/item/organ/internal/eyes/cybernetic/scope + name = "\improper Kaleido Optics eyes" + desc = "These cybernetic eye implants will let you zoom in on far away objects. Many users find it disorienting, and find it hard to interact with things near them when active." + eye_color = "#6f00ff" + flash_protect = FLASH_PROTECTION_EXTRA_SENSITIVE + origin_tech = "materials=5;programming=4;biotech=4;magnets=4" + var/scope_range = 0.8 //Only used in initialize. Greatly nerfed zoom range, since you are not taking the time zoom delay the lwap has. + var/active = FALSE + +/obj/item/organ/internal/eyes/cybernetic/scope/Initialize(mapload) + . = ..() + AddComponent(/datum/component/scope, range_modifier = scope_range, item_action_type = /datum/action/item_action/organ_action/toggle, allow_middle_click = TRUE) + +/obj/item/organ/internal/eyes/cybernetic/scope/insert(mob/living/carbon/human/M, special) + . = ..() + flash_protect = FLASH_PROTECTION_NONE //Resets it to none, so we can just flip to inital each time it is used. + +/obj/item/organ/internal/eyes/cybernetic/scope/ui_action_click(mob/user, actiontype) + active = !active + if(active) + flash_protect = initial(flash_protect) + else + flash_protect = FLASH_PROTECTION_NONE + +/obj/item/organ/internal/eyes/cybernetic/scope/hardened + name = "\improper Hardened Kaleido Optics eyes" + desc = "These cybernetic eye implants will let you zoom in on far away objects. Many users find it disorienting, and find it hard to interact with things near them when active. This pair has been hardened for special operations personnel, and has enhanced zoom functionality." + flash_protect = FLASH_PROTECTION_SENSITIVE + origin_tech = "materials=6;programming=5;biotech=6;magnets=6;syndicate=3" + scope_range = 1.25 + emp_proof = TRUE + /obj/item/organ/internal/eyes/cybernetic/flashlight name = "flashlight eyes" desc = "It's two flashlights rigged together with some wire. Why would you put these in someone's head?" diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 6009508a7fc1..e711b0cf2311 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -1,6 +1,6 @@ /obj/item/retractor name = "retractor" - desc = "Retracts stuff." + desc = "A sterilized tissue retractor used for holding open incisions." icon = 'icons/obj/surgery.dmi' icon_state = "retractor" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' @@ -22,7 +22,7 @@ /obj/item/hemostat name = "hemostat" - desc = "You think you have seen this before." + desc = "A sterilized steel surgical clamp for sealing exposed blood vessels during surgery." icon = 'icons/obj/surgery.dmi' icon_state = "hemostat" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' @@ -44,7 +44,7 @@ /obj/item/cautery name = "cautery" - desc = "This stops bleeding." + desc = "A unipolar electrocauter used to sear surgical incisions shut." icon = 'icons/obj/surgery.dmi' icon_state = "cautery" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' @@ -66,7 +66,7 @@ /obj/item/surgicaldrill name = "surgical drill" - desc = "You can drill using this item. You dig?" + desc = "A sterilized drill used to create holes in bone and teeth." icon = 'icons/obj/surgery.dmi' icon_state = "drill" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' @@ -99,7 +99,7 @@ /obj/item/scalpel name = "scalpel" - desc = "Cut, cut, and once more cut." + desc = "A sterilized stainless steel cutting implement for making precise surgical incisions." icon = 'icons/obj/surgery.dmi' icon_state = "scalpel" item_state = "scalpel" @@ -141,7 +141,7 @@ /// parent type /obj/item/scalpel/laser name = "laser scalpel" - desc = "A scalpel augmented with a directed laser." + desc = "A low-power laser emitter for creating and cauterizing precise surgical incisions." icon_state = "scalpel_laser1_on" damtype = "fire" hitsound = 'sound/weapons/sear.ogg' @@ -149,19 +149,19 @@ /// lasers also count as catuarys /obj/item/scalpel/laser/laser1 name = "laser scalpel" - desc = "A scalpel augmented with a directed laser. This one looks basic and could be improved." + desc = "A basic low-power laser emitter for creating and cauterizing precise surgical incisions." icon_state = "scalpel_laser1_on" toolspeed = 0.8 /obj/item/scalpel/laser/laser2 name = "laser scalpel" - desc = "A scalpel augmented with a directed laser. This one looks somewhat advanced." + desc = "An improved laser emitter for rapidly creating and cauterizing precise surgical incisions." icon_state = "scalpel_laser2_on" toolspeed = 0.6 /obj/item/scalpel/laser/laser3 name = "laser scalpel" - desc = "A scalpel augmented with a directed laser. This one looks to be the pinnacle of precision energy cutlery!" + desc = "An advanced laser emitter for creating and cauterizing precise surgical incisions with extreme speed." icon_state = "scalpel_laser3_on" toolspeed = 0.4 @@ -179,7 +179,7 @@ /obj/item/circular_saw name = "circular saw" - desc = "For heavy duty cutting." + desc = "A sterilized medical saw for use in cutting through bone." icon = 'icons/obj/surgery.dmi' icon_state = "saw" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' @@ -211,6 +211,7 @@ //misc, formerly from code/defines/weapons.dm /obj/item/bonegel name = "bone gel" + desc = "A large bottle of fast-setting medical adhesive. There's more than enough inside to last the shift." icon = 'icons/obj/surgery.dmi' icon_state = "bone-gel" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' @@ -230,6 +231,7 @@ /obj/item/FixOVein name = "FixOVein" + desc = "An advanced medical device which uses an array of manipulators to reconnect and repair ruptured blood vessels." icon = 'icons/obj/surgery.dmi' icon_state = "fixovein" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' @@ -249,6 +251,7 @@ /obj/item/bonesetter name = "bone setter" + desc = "A stainless steel medical clamp used to reconnect fractured bones." icon = 'icons/obj/surgery.dmi' icon_state = "bonesetter" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' @@ -271,7 +274,7 @@ /obj/item/surgical_drapes name = "surgical drapes" - desc = "Nanotrasen brand surgical drapes provide optimal safety and infection control." + desc = "Apearature brand surgical drapes providing privacy and infection control." icon = 'icons/obj/surgery.dmi' icon_state = "surgical_drapes" w_class = WEIGHT_CLASS_SMALL diff --git a/config/example/config.toml b/config/example/config.toml index 0f2eb8b35c1f..ed561a319583 100644 --- a/config/example/config.toml +++ b/config/example/config.toml @@ -736,6 +736,7 @@ active_lava_ruins = [ "_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm", "_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_puzzle.dmm", "_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_random_ripley.dmm", + "_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_shuttlecrash.dmm", "_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm", "_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm", "_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_watcher_grave.dmm", diff --git a/html/statbrowser.css b/html/statbrowser.css index 11eda40d03d5..d78fe76184ab 100644 --- a/html/statbrowser.css +++ b/html/statbrowser.css @@ -158,19 +158,24 @@ td { pointer-events: none; } -.link { - display: inline; +.link, +.listedturf_link { background: none; border: none; - padding: 7px 14px; color: black; text-decoration: none; cursor: pointer; font-size: 13px; +} + +.link { + display: inline; + padding: 7px 14px; margin: 2px 2px; } -.link:hover { +.link:hover, +.listedturf_link:hover { text-decoration: underline; } @@ -225,7 +230,8 @@ body.dark { color: #b2c4dd; } -.dark .link { +.dark .link, +.dark .listedturf_link{ color: #abc6ec; } @@ -268,7 +274,8 @@ body.ntos { color: #b2c4dd; } -.ntos .link { +.ntos .link, +.ntos .listedturf_link{ color: #abc6ec; } @@ -311,7 +318,8 @@ body.paradise { color: #dec5bd; } -.paradise .link { +.paradise .link, +.paradise .listedturf_link{ color: #edc1b2; } @@ -354,6 +362,7 @@ body.syndicate { color: #debdbd; } -.syndicate .link { +.syndicate .link, +.syndicate .listedturf_link { color: #edb2b2; } diff --git a/html/statbrowser.js b/html/statbrowser.js index 7fa1a1f8bcc2..c44d424a1b36 100644 --- a/html/statbrowser.js +++ b/html/statbrowser.js @@ -14,6 +14,13 @@ if (!String.prototype.trim) { }; } +// For sending BYOND debug logs ----------------------------------------------- +// If you use this, you'll need to uncomment the Statpanel-Debug message +// handling, currently in code/modules/client/client_procs.dm +function log_debug(data) { + Byond.sendMessage("Statpanel-Debug", JSON.stringify(data)); +} + // Status panel implementation ------------------------------------------------ var status_tab_parts = [["Loading...", ""]]; var current_tab = null; @@ -22,14 +29,20 @@ var href_token = null; var verb_tabs = []; var verbs = [["", ""]]; // list with a list inside var permanent_tabs = []; // tabs that won't be cleared by wipes -var turfcontents = []; +var turf_row_inner_height = 33; +var turf_row_outer_height = 35; +var turf_rows = {}; +var turf_incomplete_rows = {}; +var turf_size = 0; +var turf_image_errors = {}; +var turfcontents = {"total": 0}; var turfname = ""; +var imageFirstRetryDelay = 50; var imageRetryDelay = 500; var imageRetryLimit = 50; var menu = document.getElementById('menu'); var under_menu = document.getElementById('under_menu'); var statcontentdiv = document.getElementById('statcontent'); -var storedimages = []; var split_admin_tabs = false; // Any BYOND commands that could result in the client's focus changing go through this @@ -371,79 +384,217 @@ function draw_mc() { document.getElementById("statcontent").appendChild(table); } -function iconError(e) { - if(current_tab != turfname) { - return; +function listedturf_add_row(table, table_index, true_index) { + let row = table.insertRow(table_index); + row.style.height = turf_row_inner_height + "px" + row.style.padding = "0px" + row.style.margin = "0px" + turf_rows[true_index] = row; + turf_incomplete_rows[true_index] = true_index + 1; +} + +function listedturf_fill_row(row, item_index) { + let object_info = turfcontents["" + item_index]; + if(!object_info) { + return false; } - setTimeout(function () { - var node = e.target; - var current_attempts = Number(node.getAttribute("data-attempts")) || 0 - if (current_attempts > imageRetryLimit) { - return; + + let cell = document.createElement("td"); + cell.style.height = turf_row_inner_height + "px" + cell.style.padding = "0px" + cell.style.margin = "0px" + row.appendChild(cell) + + var button = document.createElement("div"); + button.className = "listedturf_link"; + var clickcatcher = ""; + button.onmousedown = function (object_info) { + // The outer function is used to close over a fresh "object_info" + // variable, rather than every onmousedown getting the "object_info" + // of the last entry. + return function (e) { + e.preventDefault(); + clickcatcher = "?src=" + object_info[1]; + switch (e.button) { + case 1: + clickcatcher += ";statpanel_item_click=middle" + break; + case 2: + clickcatcher += ";statpanel_item_click=right" + break; + default: + clickcatcher += ";statpanel_item_click=left" + } + if (e.shiftKey) { + clickcatcher += ";statpanel_item_shiftclick=1"; + } + if (e.ctrlKey) { + clickcatcher += ";statpanel_item_ctrlclick=1"; + } + if (e.altKey) { + clickcatcher += ";statpanel_item_altclick=1"; + } + window.location.href = clickcatcher; } - var src = node.src; - node.src = null; - node.src = src + '#' + current_attempts; - node.setAttribute("data-attempts", current_attempts + 1) - draw_listedturf(); - }, imageRetryDelay); + }(object_info); + cell.appendChild(button); + + let img = document.createElement("img"); + img.id = object_info[1]; + img.src = object_info[2]; + img.style.verticalAlign = "middle"; + img.onerror = function (object_info) { + return function () { + let delay = imageRetryDelay; + if (!turf_image_errors[object_info[3]]) { + turf_image_errors[object_info[3]] = 0; + delay = imageFirstRetryDelay; + } + turf_image_errors[object_info[3]]++; + if (turf_image_errors[object_info[3]] > imageRetryLimit) { + return; + } + + Byond.sendMessage("Resend-Asset", object_info[3]); + setTimeout(function () { + // Use the failure count as a cachebreaker to force-reload. + let img = document.getElementById(object_info[1]); + img.src = object_info[2] + "?" + turf_image_errors[object_info[3]]; + }, imageRetryDelay); + } + }(object_info); + button.appendChild(img); + + var label = document.createElement("span"); + label.style.marginLeft = "5px"; + label.textContent = object_info[0]; + button.appendChild(label); + + return true; } -function draw_listedturf() { - statcontentdiv.textContent = ""; - var table = document.createElement("table"); - for (var i = 0; i < turfcontents.length; i++) { - var part = turfcontents[i]; - if (storedimages[part[1]] == null && part[2]) { - var img = document.createElement("img"); - img.src = part[2]; - img.id = part[1]; - storedimages[part[1]] = part[2]; - img.onerror = iconError; - table.appendChild(img); - } else { - var img = document.createElement("img"); - img.onerror = iconError; - img.src = storedimages[part[1]]; - img.id = part[1]; - table.appendChild(img); +function listedturf_fill_all() { + for(let i in turf_incomplete_rows) { + let item_index = turf_incomplete_rows[i]; + if(!turf_rows[i] || listedturf_fill_row(turf_rows[i], item_index)) { + delete turf_incomplete_rows[i]; } - var b = document.createElement("div"); - var clickcatcher = ""; - b.className = "link"; - b.onmousedown = function (part) { - // The outer function is used to close over a fresh "part" variable, - // rather than every onmousedown getting the "part" of the last entry. - return function (e) { - e.preventDefault(); - clickcatcher = "?src=" + part[1]; - switch (e.button) { - case 1: - clickcatcher += ";statpanel_item_click=middle" - break; - case 2: - clickcatcher += ";statpanel_item_click=right" - break; - default: - clickcatcher += ";statpanel_item_click=left" - } - if (e.shiftKey) { - clickcatcher += ";statpanel_item_shiftclick=1"; - } - if (e.ctrlKey) { - clickcatcher += ";statpanel_item_ctrlclick=1"; - } - if (e.altKey) { - clickcatcher += ";statpanel_item_altclick=1"; - } - window.location.href = clickcatcher; + } +} + +var suppress_next_scroll_message = false; +/* We keep a sliding "window" of listedturf items loded. On scroll, we add and + * remove table rows to maintain that window, and update the size of the + * padding row at the top of the table to keep them in the right spot. + */ +function listedturf_scrolled() { + let top_edge = document.documentElement.scrollTop; + let height = document.documentElement.clientHeight; + let bottom_edge = top_edge + height; + let total = document.documentElement.scrollHeight; + let table = document.getElementById("listedturf_table"); + let padding = document.getElementById("listedturf_padding"); + + if (!turf_rows.initialized) { + turf_rows = { + initialized: true, + min_row: 0, + max_row: 0, + }; + } + + if (turf_size === 0) { + return; + } + + let desired_min_row = Math.min(turf_size, Math.max(0, Math.floor(top_edge / turf_row_outer_height) - 10)); + let desired_max_row = Math.min(turf_size, desired_min_row + Math.ceil(height / turf_row_outer_height) + 21); + padding.style.height = (desired_min_row * turf_row_outer_height) + "px"; + if(desired_min_row == turf_rows.min_row && desired_max_row == turf_rows.max_row) { + listedturf_fill_all(); + suppress_next_scroll_message = false; + return; + } + + if (desired_min_row < turf_rows.min_row) { + for (let i = desired_min_row; i < turf_rows.min_row; i++) { + listedturf_add_row(table, i - desired_min_row + 1, i); + } + } else if (desired_min_row > turf_rows.min_row) { + for (let i = turf_rows.min_row; i < desired_min_row && i < turf_rows.max_row; i++) { + if(turf_rows[i]) { + turf_rows[i].remove(); + delete turf_rows[i]; } - }(part); - b.textContent = part[0]; - table.appendChild(b); - table.appendChild(document.createElement("br")); + } } - document.getElementById("statcontent").appendChild(table); + turf_rows.min_row = desired_min_row; + + padding.style.height = turf_rows.min_row * turf_row_outer_height + "px" + + + if (desired_max_row < turf_rows.max_row) { + for (let i = Math.max(desired_max_row, turf_rows.min_row); i < turf_rows.max_row; i++) { + if(turf_rows[i]) { + turf_rows[i].remove(); + delete turf_rows[i]; + } + } + } else if (desired_max_row > turf_rows.max_row) { + for (let i = Math.max(turf_rows.min_row, turf_rows.max_row); i < desired_max_row; i++) { + listedturf_add_row(table, i - turf_rows.min_row + 1, i); + } + } + turf_rows.max_row = desired_max_row; + + listedturf_fill_all(); + + if (!suppress_next_scroll_message) { + Byond.sendMessage("Listedturf-Scroll", {"min": turf_rows.min_row, "max": turf_rows.max_row}) + } + suppress_next_scroll_message = false; +} + +function draw_listedturf() { + if(document.getElementById("listedturf_div")) { + let div = document.getElementById("listedturf_div"); + div.style.height = (turf_row_outer_height * turf_size) + "px"; + suppress_next_scroll_message = true; + listedturf_scrolled(); + return + } + + statcontentdiv.textContent = ""; + turf_rows = {}; + window.onscroll = function() { listedturf_scrolled(); }; + + let div = document.createElement("div"); + div.id = "listedturf_div"; + div.style.height = (turf_row_outer_height * turf_size) + "px"; + document.getElementById("statcontent").appendChild(div); + + let table = document.createElement("table"); + table.id = "listedturf_table"; + table.style.width = "100%" + table.style.height = "100%" + div.appendChild(table) + + let padding = document.createElement("tr"); + padding.id = "listedturf_padding"; + padding.style.height = "0px"; + padding.style.padding = "0px" + padding.style.margin = "0px" + table.appendChild(padding); + + let end_flex = document.createElement("tr"); + end_flex.id = "listedturf_end_flex"; + end_flex.style.height = "100%"; + end_flex.style.padding = "0px" + end_flex.style.margin = "0px" + table.appendChild(end_flex); + + suppress_next_scroll_message = true; + listedturf_scrolled(); } function remove_listedturf() { @@ -452,6 +603,14 @@ function remove_listedturf() { if (current_tab == turfname) { tab_change("Status"); } + if(document.getElementById("listedturf_div")) { + document.getElementById("listedturf_div").remove(); + } + turf_rows = {}; + turf_incomplete_rows = {}; + turf_size = 0; + turfcontents = {"total": 0}; + turfname = ""; } function remove_mc() { @@ -738,6 +897,7 @@ Byond.subscribeTo('remove_mc_tab', function (removeHref) { Byond.subscribeTo('update_listedturf', function (TC) { turfcontents = TC; + turf_size = TC["total"]; if (current_tab == turfname) { draw_listedturf(); } diff --git a/icons/_nanomaps/CereStation_nanomap_z1.png b/icons/_nanomaps/CereStation_nanomap_z1.png index 2563ef75b937..99ec3d7bbb51 100644 Binary files a/icons/_nanomaps/CereStation_nanomap_z1.png and b/icons/_nanomaps/CereStation_nanomap_z1.png differ diff --git a/icons/_nanomaps/Cyberiad_nanomap_z1.png b/icons/_nanomaps/Cyberiad_nanomap_z1.png index 621fa17f543c..c7d9da2ba13a 100644 Binary files a/icons/_nanomaps/Cyberiad_nanomap_z1.png and b/icons/_nanomaps/Cyberiad_nanomap_z1.png differ diff --git a/icons/_nanomaps/Delta_nanomap_z1.png b/icons/_nanomaps/Delta_nanomap_z1.png index dc2d2d09aa3c..c1fba40f0dac 100644 Binary files a/icons/_nanomaps/Delta_nanomap_z1.png and b/icons/_nanomaps/Delta_nanomap_z1.png differ diff --git a/icons/_nanomaps/MetaStation_nanomap_z1.png b/icons/_nanomaps/MetaStation_nanomap_z1.png index 767c69c695c1..e1d4c00fcb72 100644 Binary files a/icons/_nanomaps/MetaStation_nanomap_z1.png and b/icons/_nanomaps/MetaStation_nanomap_z1.png differ diff --git a/icons/effects/mob_hunt.dmi b/icons/effects/mob_hunt.dmi deleted file mode 100644 index 1eea83a9afa4..000000000000 Binary files a/icons/effects/mob_hunt.dmi and /dev/null differ diff --git a/icons/mob/screen_scope.dmi b/icons/mob/screen_scope.dmi new file mode 100644 index 000000000000..03ca5665dbfe Binary files /dev/null and b/icons/mob/screen_scope.dmi differ diff --git a/icons/obj/3x3.dmi b/icons/obj/3x3.dmi new file mode 100644 index 000000000000..07a0213aa937 Binary files /dev/null and b/icons/obj/3x3.dmi differ diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi index 5b56dd841d30..46b03c242261 100644 Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi index fe9c40361f11..2bcc8d2e6045 100644 Binary files a/icons/obj/module.dmi and b/icons/obj/module.dmi differ diff --git a/icons/obj/nuclearbomb.dmi b/icons/obj/nuclearbomb.dmi index bb86ae4a6180..ad6bc4d7efc2 100644 Binary files a/icons/obj/nuclearbomb.dmi and b/icons/obj/nuclearbomb.dmi differ diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi index 9c265a8f5e28..a41f594dfaf3 100755 Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ diff --git a/icons/turf/decals.dmi b/icons/turf/decals.dmi index 52372c44c164..91d9f0f96fcb 100644 Binary files a/icons/turf/decals.dmi and b/icons/turf/decals.dmi differ diff --git a/icons/ui_icons/emoji.dmi b/icons/ui_icons/emoji.dmi index b0adcba15e5f..a937141a940a 100644 Binary files a/icons/ui_icons/emoji.dmi and b/icons/ui_icons/emoji.dmi differ diff --git a/interface/skin.dmf b/interface/skin.dmf index 6af51ad3f305..bfe0941edf00 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -21,6 +21,11 @@ menu "menu" name = "&Переподключиться" command = ".reconnect" category = "&Файл" + elem "profilecode" + name = "&Profile Code" + command = ".profile" + category = "&File" + is-disabled = true elem name = "&Выход" command = ".quit" diff --git a/paradise.dme b/paradise.dme index 2ec9c94fb597..7d7dc5ea39b7 100644 --- a/paradise.dme +++ b/paradise.dme @@ -93,7 +93,6 @@ #include "code\__DEFINES\mod.dm" #include "code\__DEFINES\move_force.dm" #include "code\__DEFINES\muzzle_flash.dm" -#include "code\__DEFINES\nanomob_defines.dm" #include "code\__DEFINES\newscaster_defines.dm" #include "code\__DEFINES\particle_defines.dm" #include "code\__DEFINES\pda.dm" @@ -138,6 +137,7 @@ #include "code\__DEFINES\vv.dm" #include "code\__DEFINES\wires_defines.dm" #include "code\__DEFINES\zlevel_defines.dm" +#include "code\__DEFINES\zoom.dm" #include "code\__DEFINES\dcs\dcs_flags.dm" #include "code\__DEFINES\dcs\dcs_helpers.dm" #include "code\__DEFINES\dcs\signals.dm" @@ -297,7 +297,6 @@ #include "code\controllers\subsystem\SSmachinery.dm" #include "code\controllers\subsystem\SSmetrics.dm" #include "code\controllers\subsystem\SSmobs.dm" -#include "code\controllers\subsystem\SSnano_mob_hunter.dm" #include "code\controllers\subsystem\SSnightshift.dm" #include "code\controllers\subsystem\SSnpcpool.dm" #include "code\controllers\subsystem\SSoverlays.dm" @@ -423,6 +422,7 @@ #include "code\datums\components\persistent_overlay.dm" #include "code\datums\components\proximity_monitor.dm" #include "code\datums\components\radioactive.dm" +#include "code\datums\components\scope.dm" #include "code\datums\components\shielded.dm" #include "code\datums\components\slippery.dm" #include "code\datums\components\spawner.dm" @@ -1494,11 +1494,6 @@ #include "code\modules\arcade\claw_game.dm" #include "code\modules\arcade\prize_counter.dm" #include "code\modules\arcade\prize_datums.dm" -#include "code\modules\arcade\mob_hunt\battle_computer.dm" -#include "code\modules\arcade\mob_hunt\mob_avatar.dm" -#include "code\modules\arcade\mob_hunt\mob_cards.dm" -#include "code\modules\arcade\mob_hunt\mob_datums.dm" -#include "code\modules\arcade\mob_hunt\mob_type_datums.dm" #include "code\modules\assembly\assebmly_holder.dm" #include "code\modules\assembly\assembly.dm" #include "code\modules\assembly\assembly_helpers.dm" @@ -1524,7 +1519,6 @@ #include "code\modules\asset_cache\assets\asset_emoji.dm" #include "code\modules\asset_cache\assets\asset_jquery.dm" #include "code\modules\asset_cache\assets\asset_materials.dm" -#include "code\modules\asset_cache\assets\asset_mob_hunt.dm" #include "code\modules\asset_cache\assets\asset_nanomap.dm" #include "code\modules\asset_cache\assets\asset_orbit_icons.dm" #include "code\modules\asset_cache\assets\asset_panels.dm" @@ -2230,6 +2224,7 @@ #include "code\modules\mob\living\silicon\ai\ai_say.dm" #include "code\modules\mob\living\silicon\ai\ai_update_status.dm" #include "code\modules\mob\living\silicon\ai\latejoin.dm" +#include "code\modules\mob\living\silicon\ai\ai_verbs\botcall.dm" #include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm" #include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" #include "code\modules\mob\living\silicon\ai\freelook\eye.dm" @@ -2499,7 +2494,6 @@ #include "code\modules\pda\core_apps.dm" #include "code\modules\pda\messenger.dm" #include "code\modules\pda\messenger_plugins.dm" -#include "code\modules\pda\mob_hunt_game_app.dm" #include "code\modules\pda\nanobank.dm" #include "code\modules\pda\PDA.dm" #include "code\modules\pda\pda_tgui.dm" @@ -2721,6 +2715,7 @@ #include "code\modules\shuttle\dock_generator.dm" #include "code\modules\shuttle\emergency.dm" #include "code\modules\shuttle\ert_shuttle.dm" +#include "code\modules\shuttle\lance_docking_targeter.dm" #include "code\modules\shuttle\navigation_computer.dm" #include "code\modules\shuttle\on_move.dm" #include "code\modules\shuttle\ripple.dm" diff --git a/sound/AI/traderdeny.ogg b/sound/AI/traderdeny.ogg new file mode 100644 index 000000000000..b4d215468a77 Binary files /dev/null and b/sound/AI/traderdeny.ogg differ diff --git a/sound/AI/tradergranted.ogg b/sound/AI/tradergranted.ogg new file mode 100644 index 000000000000..4c8d8791ff46 Binary files /dev/null and b/sound/AI/tradergranted.ogg differ diff --git a/sound/weapons/scope.ogg b/sound/weapons/scope.ogg new file mode 100644 index 000000000000..37d70b6ff4c3 Binary files /dev/null and b/sound/weapons/scope.ogg differ diff --git a/strings/sillytips.txt b/strings/sillytips.txt index 5b6a1958d17d..2e7e8aed46d5 100644 --- a/strings/sillytips.txt +++ b/strings/sillytips.txt @@ -30,3 +30,4 @@ Cleanbot. Не существует такого понятия, как "cow level". ХОНК. Соляры, вероятно, дают радиационное отравление или что-то в этом роде, учитывая, что другие источники энергии смертельно опасны по-своему. +НТ любезно напоминает вам что популярное "Дедсквад" шоу является полностью выдуманым. Дедсквада не существует в реальной жизни. Любые попытки доказать обратное являются основанием к немедленной ликвидации. diff --git a/strings/tips.txt b/strings/tips.txt index 88982ed6f483..4f7c5d08ad36 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -1,13 +1,13 @@ Соединения уровней космоса рандомизируются в каждом новом раунде. Вы можете ловить брошенные предметы, включив режим броска (R) при активной пустой руке. -Чтобы взломать сейф в хранилище, используйте стетоскоп или термобур. +Чтобы взломать сейф в хранилище, используйте стетоскоп или термобур. Либо вы можете украсть листок с комбинацией из офиса капитана Вы можете забраться на стол, перетащив себя на него. Это занимает некоторое время. Если щелкнуть по столу, на который забрался кто-то другой, то он упадет. Вы можете перетащить игрока на себя, чтобы открыть меню экипировки, позволяющее снять их снаряжение или заставить их надеть что-то. Обратите внимание, что экзокостюмы или шлемы будут блокировать доступ к одежде под ними, и что некоторые предметы снимаются или надеваются дольше, чем другие. Если щелкнуть по стеклянной двери, а не 'натолкнуться' на нее, то она останется открытой. Вы можете щелкнуть по ней еще раз, чтобы закрыть ее. Вы можете распылять огнетушитель, бросать предметы или стрелять из пистолета, паря в пространстве, чтобы изменить направление движения. Просто стреляйте в направлении, противоположном тому, куда вы хотите попасть. Вы можете изменить схему управления, нажав клавишу Tab. В одном случае для передвижения используется WASD, а в другом - клавиши со стрелками. Имейте в виду, что горячие клавиши также изменяются при этом. Огнеупорные костюмы и зимние куртки обеспечивают легкую защиту от холода, позволяя вам проводить больше времени вблизи брешей и в космосе, чем если бы вы вообще ничего не носили. -Осколки стекла можно сварить, чтобы получить стекло, а металлические прутья - чтобы получить металл. Руды тоже можно сваривать, но для этого требуется много топлива. +Осколки стекла можно сварить, чтобы получить стекло, а металлические прутья и тайлы пола - чтобы получить металл. Руды тоже можно сваривать, но для этого требуется много топлива. Если вам нужно перетащить несколько человек в безопасное место, либо в космос, просто принесите шкафчик и засуньте их всех туда, а затем тащите. Вы можете схватить кого-то, нажав на него в 'Grab' интенте (жёлтый), а затем усилить захват, нажав на кнопку 'Grab' в панели рук. Агрессивный захват позволит вам положить его на стол, нажав на стол, или бросить его, переключившись в режим броска (R). Удерживая Alt и щелкая левой кнопкой мыши по тайлу, вы сможете увидеть его содержимое в правой верхней панели, что гораздо быстрее, чем щелчок правой кнопкой мыши. diff --git a/tgui/packages/tgui/interfaces/BotCall.js b/tgui/packages/tgui/interfaces/BotCall.js new file mode 100644 index 000000000000..98c0bc60400a --- /dev/null +++ b/tgui/packages/tgui/interfaces/BotCall.js @@ -0,0 +1,129 @@ +import { useBackend, useLocalState } from '../backend'; +import { Box, Button, Stack, Table, Tabs } from '../components'; +import { Window } from '../layouts'; + +const BotStatus = (mode) => { + const statusMap = [ + { modes: [0], label: 'Idle', color: 'green' }, + { modes: [1, 2, 3], label: 'Arresting', color: 'yellow' }, + { modes: [4, 5], label: 'Patrolling', color: 'average' }, + { modes: [6, 11], label: 'Responding', color: 'green' }, + { modes: [12], label: 'Delivering Cargo', color: 'blue' }, + { modes: [13], label: 'Returning Home', color: 'blue' }, + { modes: [7, 14, 15, 16, 17, 18, 19], label: 'Working', color: 'blue' }, + ]; + + const matchedStatus = statusMap.find((mapping) => + mapping.modes.includes(mode) + ); + + return {matchedStatus.label} ; +}; + +export const BotCall = (props, context) => { + const { act, data } = useBackend(context); + const [tabIndex, setTabIndex] = useLocalState(context, 'tabIndex', 0); + const botNames = { + 0: 'Security', + 1: 'Medibot', + 2: 'Cleanbot', + 3: 'Floorbot', + 4: 'Mule', + 5: 'Honkbot', + }; + const decideTab = (index) => { + return botNames[index] ? ( + + ) : ( + 'This should not happen. Report on Paradise Github' + ); + }; + + return ( + + + + + + {Array.from({ length: 6 }).map((_, index) => ( + setTabIndex(index)} + > + {botNames[index]} + + ))} + + + {decideTab(tabIndex)} + + + + ); +}; + +const BotExists = (props, context) => { + const { act, data } = useBackend(context); + const { bots } = data; + if (bots[props.model] !== undefined) { + return ; + } else { + return ; + } +}; + +const NoBot = (props, context) => { + const { act, data } = useBackend(context); + return ( + + + No {[props.model]} detected + + + ); +}; + +const MapBot = (props, context) => { + const { act, data } = useBackend(context); + const { bots } = data; + + return ( + + +

Имя

Статус

Место

Control

[Bot.hacked ? "(!) [Bot.name]" : Bot.name] ([Bot.model])[Bot.on ? "[Bot.mode ? "[ Bot.mode_name[Bot.mode] ]": "Idle"]" : "Неактивен"][bot_area.name]InterfaceCall
+ + Name + Model + Status + Location + Interface + Call + + {bots[props.model].map((bot) => ( + + {bot.name} + {bot.model} + + {bot.on ? BotStatus(bot.status) : Off} + + {bot.location} + +
+ + + ); +}; diff --git a/tgui/packages/tgui/interfaces/CommunicationsComputer.js b/tgui/packages/tgui/interfaces/CommunicationsComputer.js index 4cb4eacabaff..9563fdc31366 100644 --- a/tgui/packages/tgui/interfaces/CommunicationsComputer.js +++ b/tgui/packages/tgui/interfaces/CommunicationsComputer.js @@ -365,14 +365,6 @@ const PlayerPage = (props, context) => { onClick={() => act('messagelist')} /> - -