diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index bb9bc75d25..b4abf9b535 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -266,7 +266,7 @@ /turf/open/indestructible/boss, /area/ruin/unpowered/ash_walkers) "aH" = ( -/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker, +/obj/structure/lavaland/ash_walker, /turf/open/lava/smooth{ initial_gas_mix = "o2=14;n2=23;TEMP=300" }, diff --git a/_maps/RandomZLevels/VR/snowdin_VR.dmm b/_maps/RandomZLevels/VR/snowdin_VR.dmm index bae0b05e3d..222615619e 100644 --- a/_maps/RandomZLevels/VR/snowdin_VR.dmm +++ b/_maps/RandomZLevels/VR/snowdin_VR.dmm @@ -3675,7 +3675,7 @@ /area/awaymission/snowdin/cave/cavern) "im" = ( /obj/effect/decal/cleanable/blood/old, -/mob/living/simple_animal/hostile/spawner/nether{ +/obj/structure/spawner/nether{ max_mobs = 5 }, /turf/open/floor/engine/cult{ @@ -8278,7 +8278,7 @@ /turf/open/floor/engine/cult, /area/awaymission/snowdin/post/cavern2) "sb" = ( -/mob/living/simple_animal/hostile/spawner/nether{ +/obj/structure/spawner/nether{ max_mobs = 4; name = "weak netherworld link" }, @@ -10179,7 +10179,7 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, -/mob/living/simple_animal/hostile/spawner/nether{ +/obj/structure/spawner/nether{ max_mobs = 4; name = "weak netherworld link" }, diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 96c1a08b1f..913de0817c 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -103,7 +103,7 @@ }, /area/awaymission/caves/BMP_asteroid/level_four) "at" = ( -/mob/living/simple_animal/hostile/spawner/skeleton, +/obj/structure/spawner/skeleton, /turf/open/floor/plating/asteroid/basalt/lava{ initial_gas_mix = "n2=23;o2=14" }, @@ -164,7 +164,7 @@ }, /area/awaymission/caves/BMP_asteroid/level_four) "aB" = ( -/mob/living/simple_animal/hostile/spawner/skeleton, +/obj/structure/spawner/skeleton, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=23;o2=14" }, @@ -374,7 +374,7 @@ }, /area/awaymission/caves/BMP_asteroid/level_three) "be" = ( -/mob/living/simple_animal/hostile/spawner/mining/goliath, +/obj/structure/spawner/mining/goliath, /turf/open/floor/plating/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14" }, @@ -504,7 +504,7 @@ /area/awaymission/caves/BMP_asteroid/level_three) "bw" = ( /obj/effect/decal/cleanable/blood, -/mob/living/simple_animal/hostile/spawner/skeleton, +/obj/structure/spawner/skeleton, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=23;o2=14" }, @@ -930,7 +930,7 @@ /turf/closed/wall, /area/awaymission/caves/BMP_asteroid/level_two) "cL" = ( -/mob/living/simple_animal/hostile/spawner/mining/basilisk, +/obj/structure/spawner/mining/basilisk, /turf/open/floor/plating/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14" }, @@ -1644,7 +1644,7 @@ /turf/open/floor/plasteel, /area/awaymission/caves/listeningpost) "fb" = ( -/mob/living/simple_animal/hostile/spawner/mining/hivelord, +/obj/structure/spawner/mining/hivelord, /turf/open/floor/plating/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14" }, @@ -2133,7 +2133,7 @@ /turf/open/floor/plasteel/recharge_floor, /area/awaymission/caves/BMP_asteroid) "gD" = ( -/mob/living/simple_animal/hostile/spawner/mining/hivelord, +/obj/structure/spawner/mining/hivelord, /turf/open/floor/plating/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14" }, @@ -2206,7 +2206,7 @@ }, /area/awaymission/caves/BMP_asteroid) "gQ" = ( -/mob/living/simple_animal/hostile/spawner/mining/basilisk, +/obj/structure/spawner/mining/basilisk, /turf/open/floor/plating/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14" }, diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index 57e03061dd..c24bf45f81 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -3670,7 +3670,7 @@ /area/awaymission/snowdin/cave/cavern) "im" = ( /obj/effect/decal/cleanable/blood/old, -/mob/living/simple_animal/hostile/spawner/nether{ +/obj/structure/spawner/nether{ max_mobs = 5 }, /turf/open/floor/engine/cult{ @@ -8333,7 +8333,7 @@ /turf/open/floor/engine/cult, /area/awaymission/snowdin/post/cavern2) "sb" = ( -/mob/living/simple_animal/hostile/spawner/nether{ +/obj/structure/spawner/nether{ max_mobs = 4; name = "weak netherworld link" }, @@ -10243,7 +10243,7 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, -/mob/living/simple_animal/hostile/spawner/nether{ +/obj/structure/spawner/nether{ max_mobs = 4; name = "weak netherworld link" }, diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index cfe7dd4335..a175c2fc30 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -6672,12 +6672,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/maintenance/port/fore) -"aoZ" = ( -/obj/machinery/atmospherics/components/binary/valve/digital{ - name = "Waste Release" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "apa" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -6916,7 +6910,7 @@ /turf/open/floor/plasteel, /area/janitor) "apI" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste{ +/obj/machinery/atmospherics/components/unary/relief_valve/atmos/atmos_waste{ dir = 1 }, /obj/structure/lattice/catwalk, @@ -25394,6 +25388,7 @@ /obj/structure/sign/poster/official/state_laws{ pixel_y = -32 }, +/obj/effect/landmark/start/cyborg, /turf/open/floor/plasteel, /area/science/robotics/mechbay) "blu" = ( @@ -25550,7 +25545,7 @@ /area/science/lab) "blM" = ( /obj/effect/turf_decal/bot, -/obj/effect/landmark/start/roboticist, +/obj/effect/landmark/start/cyborg, /turf/open/floor/plasteel, /area/science/robotics/lab) "blO" = ( @@ -26059,6 +26054,7 @@ /area/maintenance/aft) "bnb" = ( /obj/machinery/recharge_station, +/obj/effect/landmark/start/cyborg, /turf/open/floor/plasteel, /area/science/robotics/mechbay) "bnc" = ( @@ -49658,6 +49654,7 @@ /area/ai_monitored/turret_protected/aisat_interior) "cum" = ( /obj/machinery/recharge_station, +/obj/effect/landmark/start/cyborg, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat/service) "cun" = ( @@ -52362,6 +52359,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/effect/landmark/start/roboticist, /turf/open/floor/plasteel, /area/science/robotics/lab) "cHT" = ( @@ -52438,7 +52436,7 @@ "cIc" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/bot, -/obj/effect/landmark/start/roboticist, +/obj/effect/landmark/start/cyborg, /turf/open/floor/plasteel, /area/science/robotics/lab) "cId" = ( @@ -53471,14 +53469,11 @@ /turf/open/floor/wood, /area/crew_quarters/bar) "est" = ( -/obj/machinery/light{ - dir = 1 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-03" +/obj/machinery/computer/shuttle/mining/common{ + dir = 4 }, /turf/open/floor/plasteel/white/corner{ dir = 1 @@ -53625,6 +53620,10 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"eZP" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/space/basic, +/area/hallway/secondary/entry) "fbm" = ( /obj/structure/chair/comfy/brown{ dir = 4 @@ -54818,6 +54817,15 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"jnX" = ( +/obj/machinery/door/airlock/external{ + name = "Common Mining Shuttle Bay" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) "job" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -55374,6 +55382,10 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"kRw" = ( +/obj/effect/landmark/start/roboticist, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) "kSb" = ( /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -56831,6 +56843,18 @@ }, /turf/open/floor/plasteel/dark, /area/maintenance/port) +"rHa" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 3; + height = 5; + id = "commonmining_home"; + name = "SS13: Common Mining Dock"; + roundstart_template = /datum/map_template/shuttle/mining_common/meta; + width = 7 + }, +/turf/open/space/basic, +/area/space) "rKc" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -58110,6 +58134,11 @@ "vYa" = ( /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"vZs" = ( +/obj/structure/lattice, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) "wcy" = ( /obj/structure/reagent_dispensers/water_cooler, /obj/structure/cable{ @@ -58551,6 +58580,15 @@ }, /turf/open/floor/plasteel, /area/science/circuit) +"ycF" = ( +/obj/machinery/door/airlock/external{ + name = "Common Mining Shuttle Bay" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) "ydD" = ( /obj/effect/turf_decal/bot, /obj/machinery/suit_storage_unit/rd, @@ -66662,7 +66700,7 @@ aaa aaa aaa aaa -aaf +aoV aaa aaa aaa @@ -66919,12 +66957,12 @@ aaa aaa aaa aaa -aaf +aoV +aaa +rHa aaa aaa -aaa -aaa -aaf +aoV aaa aaa aaa @@ -67176,12 +67214,12 @@ aaa aaa aaa aaa -aaf -aaa -aaa -aaa -aaf -aaf +asE +asE +ycF +asE +asE +aoV aaa aaa aaa @@ -67434,11 +67472,11 @@ aaa aaa aaa aaf -aaa -aaf -aaa -aAC +eZP +auP +eZP aaf +vZs aaa aaa aaa @@ -67691,10 +67729,10 @@ aaa aaa aaa arB -awW -awW -asE arB +jnX +asE +aAC aaf aaa aaa @@ -91636,7 +91674,7 @@ bMK cbB alk alX -aoZ +cbA bQt apa cgX @@ -102905,7 +102943,7 @@ aYV bfV bhw cHM -biL +kRw blB blF cHS diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index eb3140f281..f29c6afa46 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -159,7 +159,9 @@ /area/construction/mining/aux_base) "abe" = ( /obj/effect/turf_decal/delivery, -/obj/item/twohanded/required/kirbyplants/random, +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "abf" = ( @@ -182,7 +184,7 @@ pixel_x = -23 }, /obj/effect/turf_decal/stripes/line{ - dir = 9 + dir = 8 }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) @@ -108781,6 +108783,7 @@ "dCs" = ( /obj/effect/decal/cleanable/oil, /obj/effect/turf_decal/bot, +/obj/effect/landmark/start/cyborg, /turf/open/floor/plasteel, /area/science/robotics/lab) "dCt" = ( @@ -108800,6 +108803,7 @@ "dCu" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, +/obj/effect/landmark/start/cyborg, /turf/open/floor/plasteel, /area/science/robotics/lab) "dCv" = ( @@ -110235,6 +110239,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/bot, +/obj/effect/landmark/start/cyborg, /turf/open/floor/plasteel, /area/science/robotics/lab) "dEL" = ( @@ -110253,6 +110258,7 @@ /area/science/robotics/lab) "dEM" = ( /obj/effect/turf_decal/bot, +/obj/effect/landmark/start/cyborg, /turf/open/floor/plasteel, /area/science/robotics/lab) "dEN" = ( @@ -125760,6 +125766,17 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"eYg" = ( +/obj/machinery/door/airlock/external{ + name = "External Docking Port" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "faI" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -125918,6 +125935,15 @@ }, /turf/open/floor/engine, /area/science/mixing) +"gdb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "giN" = ( /obj/structure/window/reinforced{ dir = 8 @@ -125929,6 +125955,19 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/science/circuit) +"gmn" = ( +/obj/machinery/door/airlock/external{ + name = "External Docking Port" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "gut" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -126063,6 +126102,11 @@ /obj/structure/sign/warning/vacuum, /turf/closed/wall/r_wall, /area/chapel/office) +"hlu" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/computer/shuttle/mining/common, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "hrP" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -127466,6 +127510,17 @@ }, /turf/open/floor/plasteel, /area/science/research/abandoned) +"xDY" = ( +/obj/docking_port/stationary{ + dwidth = 3; + height = 5; + id = "commonmining_home"; + name = "SS13: Common Mining Dock"; + roundstart_template = /datum/map_template/shuttle/mining_common/meta; + width = 7 + }, +/turf/open/space/basic, +/area/space) "xDZ" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -159473,8 +159528,8 @@ aaa aaa aaa aaa -aaa -aaa +rqh +rqh aad aad aaa @@ -159729,8 +159784,8 @@ aaa aaa aaa aaa -aaa -aaa +aaO +aaO aaO aaO abf @@ -159985,10 +160040,10 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaO +xDY +eYg +gdb +gmn abe abp abC @@ -160243,10 +160298,10 @@ aaa aaa aaa aaa -aaa -aaa aaO -abe +aaO +aaO +hlu abq abD abD @@ -160501,7 +160556,7 @@ aaa aaa aaa aaa -aaa +rqh aaO aaO abf @@ -160758,8 +160813,8 @@ aaa aaa aaa aaa -aaa -aaa +rqh +rqh aad aad aaa diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index d31dbe1405..5dedc7535c 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -5325,9 +5325,12 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "ako" = ( -/obj/structure/closet/firecloset, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/open/floor/plating, -/area/maintenance/port) +/area/maintenance/port/fore) "akp" = ( /obj/structure/rack, /obj/item/clothing/gloves/color/yellow, @@ -27339,6 +27342,7 @@ /turf/closed/wall, /area/security/checkpoint/customs) "bbL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ icon_state = "1-2" }, @@ -31531,28 +31535,35 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white/corner{ - dir = 4 - }, +/turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "bjX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/turf/open/floor/plasteel/cafeteria, -/area/hallway/secondary/entry) +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "bjY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "bjZ" = ( @@ -31589,7 +31600,6 @@ dir = 4 }, /obj/item/radio/intercom{ - name = "Station Intercom (General)"; pixel_y = 21 }, /obj/machinery/light{ @@ -31608,19 +31618,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, +/obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/primary/port) "bke" = ( @@ -31633,9 +31635,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /turf/open/floor/plasteel, /area/hallway/primary/port) "bkf" = ( @@ -31651,12 +31650,9 @@ icon_state = "map-right-MS"; pixel_y = 32 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ - dir = 4 + dir = 1 }, /turf/open/floor/plasteel, /area/hallway/primary/port) @@ -32632,38 +32628,44 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/satellite) "blT" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"blU" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) -"blV" = ( +"blU" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"blV" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "blW" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -32671,39 +32673,39 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"blX" = ( +/obj/effect/turf_decal/stripes/line, /obj/structure/cable/yellow{ icon_state = "4-8" }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"blX" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "blY" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=5-Customs"; location = "4-Customs" }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"blZ" = ( +/obj/effect/turf_decal/stripes/line, /obj/structure/cable/yellow{ icon_state = "4-8" }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"blZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, @@ -32711,12 +32713,13 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"bma" = ( +/obj/effect/turf_decal/stripes/line, /obj/structure/cable/yellow{ icon_state = "4-8" }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"bma" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -32724,36 +32727,34 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"bmb" = ( +/obj/effect/turf_decal/stripes/line, /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"bmb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "bmc" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 }, /turf/open/floor/plasteel, /area/hallway/primary/port) @@ -32761,8 +32762,8 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "2-8" }, /turf/open/floor/plasteel, /area/hallway/primary/port) @@ -33639,49 +33640,41 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bnL" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bnM" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/newscaster{ + pixel_x = 28; + pixel_y = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) -"bnN" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 5 - }, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/port) -"bnO" = ( -/obj/structure/chair/comfy/beige, -/turf/open/floor/plasteel/grimy, +"bnM" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/hallway/primary/port) "bnP" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" +/obj/machinery/door/airlock/external{ + name = "Common Mining Dock" }, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/port) -"bnQ" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/snacks/chips, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/plating, /area/hallway/primary/port) "bnR" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/plasteel/dark, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/structure/sign/mining, +/turf/open/floor/plasteel, /area/hallway/primary/port) "bnS" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment{ dir = 6 @@ -33689,7 +33682,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plasteel, @@ -33701,8 +33694,8 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "1-2" }, /turf/open/floor/plasteel, /area/hallway/primary/port) @@ -34781,88 +34774,75 @@ /area/hallway/secondary/entry) "bqc" = ( /obj/machinery/holopad, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bqd" = ( -/obj/machinery/power/apc{ - areastring = "/area/hallway/secondary/entry"; - dir = 4; - name = "Arrivals APC"; - pixel_x = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) -"bqe" = ( -/obj/structure/chair/comfy/beige{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Arrivals - Lounge"; - dir = 4 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/port) -"bqf" = ( -/turf/open/floor/carpet, -/area/hallway/primary/port) -"bqg" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/holopad{ - pixel_y = -16 - }, -/turf/open/floor/carpet, -/area/hallway/primary/port) -"bqh" = ( -/obj/structure/chair/comfy/beige{ +"bqd" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel/grimy, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"bqf" = ( +/turf/open/floor/plating, +/area/hallway/primary/port) +"bqg" = ( +/obj/docking_port/stationary{ + dir = 2; + dwidth = 3; + height = 5; + id = "commonmining_home"; + name = "SS13: Common Mining Dock"; + roundstart_template = /datum/map_template/shuttle/mining_common/meta; + width = 7 + }, +/turf/open/floor/plating, /area/hallway/primary/port) "bqi" = ( -/obj/machinery/vending/cola/random, -/obj/machinery/newscaster{ - pixel_x = -28; - pixel_y = 1 - }, -/turf/open/floor/plasteel/dark, +/obj/structure/sign/warning/docking, +/turf/closed/wall, /area/hallway/primary/port) "bqj" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plasteel, /area/hallway/primary/port) "bqk" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "bql" = ( @@ -36074,69 +36054,27 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bso" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bsp" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/newscaster{ - pixel_x = 28; - pixel_y = 1 - }, -/obj/machinery/light{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/entry) -"bsq" = ( -/obj/structure/chair/comfy/beige{ +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/port) -"bsr" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/turf/open/floor/carpet, -/area/hallway/primary/port) -"bss" = ( -/obj/structure/chair/comfy/beige{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/port) -"bst" = ( -/obj/machinery/vending/snack/random, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/port) +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) "bsu" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, /obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plasteel, @@ -36145,7 +36083,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "bsw" = ( @@ -36916,59 +36856,31 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"btU" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-08" - }, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/port) -"btV" = ( -/obj/structure/chair/comfy/beige{ +"btY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/port) -"btW" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-03" - }, -/turf/open/floor/plasteel/grimy, -/area/hallway/primary/port) -"btX" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, /obj/machinery/camera{ c_tag = "Port Primary Hallway - Port"; dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/port) -"btY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /turf/open/floor/plasteel, /area/hallway/primary/port) "btZ" = ( /obj/machinery/light{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "bua" = ( @@ -37767,18 +37679,12 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bvJ" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bvK" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -37786,102 +37692,20 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bvL" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bvM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/entry) -"bvN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"bvO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"bvP" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"bvQ" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=6-Port-Central"; - location = "5-Customs" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"bvR" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"bvS" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) "bvT" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -37891,26 +37715,16 @@ }, /turf/open/floor/plating, /area/maintenance/department/science/xenobiology) -"bvU" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) "bvV" = ( /obj/structure/extinguisher_cabinet{ pixel_x = 27 }, -/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "bvW" = ( @@ -38635,7 +38449,7 @@ c_tag = "Arrivals - Middle Arm - Far"; dir = 1 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/turf_decal/stripes/line, @@ -38682,6 +38496,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bxA" = ( @@ -38697,180 +38512,55 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bxC" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/entry) -"bxD" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/entry) -"bxE" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_y = -25 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/entry) -"bxF" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 + dir = 9 }, /turf/open/floor/plasteel, -/area/hallway/primary/port) -"bxG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/area/hallway/secondary/entry) +"bxD" = ( +/obj/effect/turf_decal/tile/blue{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/firealarm{ - pixel_y = -24 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"bxH" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/light{ dir = 4 }, -/obj/machinery/status_display{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"bxI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"bxJ" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"bxK" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) "bxL" = ( -/obj/structure/sign/map/left{ - desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; - icon_state = "map-left-MS"; - pixel_y = -32 +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, +/obj/machinery/vending/coffee, /turf/open/floor/plasteel, -/area/hallway/primary/port) -"bxM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/sign/map/right{ - desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; - icon_state = "map-right-MS"; - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/area/hallway/secondary/entry) "bxN" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" }, /turf/open/floor/plasteel, /area/hallway/primary/port) @@ -39736,34 +39426,26 @@ /turf/open/floor/plasteel/dark, /area/aisat) "bzw" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/newscaster{ + pixel_x = 28; + pixel_y = 1 + }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock{ - name = "Port Emergency Storage" - }, -/turf/open/floor/plating, -/area/maintenance/port) +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) "bzx" = ( /turf/closed/wall, /area/security/vacantoffice) -"bzy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/security/vacantoffice) -"bzz" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/grunge/abandoned{ - name = "Vacant Office"; - req_access_txt = "32" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/security/vacantoffice) "bzA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/yellow{ @@ -40446,36 +40128,42 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "2-4" }, -/turf/open/floor/plasteel/white/corner, +/turf/open/floor/plasteel, /area/hallway/secondary/entry) -"bBe" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/maintenance/port) "bBf" = ( -/obj/structure/table/wood, -/obj/machinery/light_switch{ - pixel_x = -28 +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/item/folder, -/turf/open/floor/wood, -/area/security/vacantoffice) +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "bBg" = ( /turf/open/floor/wood, /area/security/vacantoffice) "bBh" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/security/vacantoffice) +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "bBi" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp, @@ -40487,23 +40175,16 @@ icon_state = "panelscorched" }, /area/maintenance/starboard) -"bBk" = ( -/obj/structure/table/wood, -/obj/item/camera_film{ - pixel_y = 9 - }, -/obj/item/camera_film{ - pixel_x = -3; - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/security/vacantoffice) "bBl" = ( -/obj/structure/urinal{ - pixel_y = 29 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/turf/open/floor/plating, -/area/crew_quarters/toilet/auxiliary) +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "bBm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/yellow{ @@ -41180,38 +40861,36 @@ /turf/open/floor/plating, /area/hallway/secondary/entry) "bCH" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "bCI" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) +"bCJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/port) -"bCJ" = ( -/obj/item/storage/toolbox/emergency, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/port) +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "bCK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -41220,45 +40899,77 @@ /turf/open/floor/plating, /area/maintenance/starboard) "bCL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 }, -/turf/open/floor/wood, -/area/security/vacantoffice) -"bCM" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/security/vacantoffice) -"bCN" = ( -/obj/structure/chair/office/dark{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/wood, -/area/security/vacantoffice) -"bCP" = ( -/obj/machinery/light/small, -/obj/machinery/camera{ - c_tag = "Auxilary Restrooms"; - dir = 4 - }, -/turf/open/floor/plating, -/area/crew_quarters/toilet/auxiliary) -"bCQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 +/obj/machinery/firealarm{ + pixel_y = -24 }, /turf/open/floor/plasteel, -/area/crew_quarters/toilet/auxiliary) -"bCR" = ( +/area/hallway/primary/port) +"bCM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 + dir = 4 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"bCN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/machinery/power/apc{ + areastring = "/area/hallway/secondary/entry"; + dir = 8; + name = "Arrivals APC"; + pixel_x = -26 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"bCP" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/sign/map/right{ + desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; + icon_state = "map-right-MS"; + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"bCQ" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"bCR" = ( /obj/machinery/power/apc/highcap/five_k{ areastring = "/area/crew_quarters/toilet/auxiliary"; name = "Auxiliary Restrooms APC"; pixel_y = -24 }, /obj/structure/cable/yellow, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, /turf/open/floor/plasteel, /area/crew_quarters/toilet/auxiliary) "bCS" = ( @@ -41266,6 +40977,9 @@ dir = 8; pixel_x = 24 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, /turf/open/floor/plasteel, /area/crew_quarters/toilet/auxiliary) "bCV" = ( @@ -41901,54 +41615,57 @@ /turf/open/floor/plating, /area/hallway/secondary/entry) "bEn" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/entry) -"bEo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/item/storage/box/lights/mixed, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) +"bEo" = ( +/obj/machinery/door/airlock{ + name = "Port Emergency Storage" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plating, /area/maintenance/port) "bEp" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "bEq" = ( -/obj/structure/light_construct{ - dir = 8 - }, -/turf/open/floor/wood, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, /area/security/vacantoffice) "bEs" = ( +/obj/structure/table/wood, /obj/item/paper_bin{ pixel_x = -2; pixel_y = 6 }, -/obj/structure/table/wood, -/turf/open/floor/carpet, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/wood, /area/security/vacantoffice) "bEt" = ( -/obj/machinery/door/airlock{ - id_tag = "AuxShower"; - name = "Shower" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, -/area/crew_quarters/toilet/auxiliary) +/area/hallway/primary/port) "bEu" = ( /obj/machinery/door/airlock{ id_tag = "AuxToilet2"; @@ -42960,20 +42677,18 @@ /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) "bGj" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/door/firedoor, /obj/structure/cable/yellow{ - icon_state = "2-4" + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/wood, -/area/security/vacantoffice) +/turf/open/floor/plasteel, +/area/hallway/primary/port) "bGk" = ( /obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 + icon_state = "1-2" }, /turf/open/floor/wood, /area/security/vacantoffice) @@ -42989,13 +42704,13 @@ specialfunctions = 4 }, /obj/item/soap/nanotrasen, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/crew_quarters/toilet/auxiliary) "bGm" = ( -/obj/machinery/shower{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/crew_quarters/toilet/auxiliary) "bGp" = ( @@ -43596,9 +43311,6 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bHI" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/machinery/airalarm{ dir = 8; pixel_x = 24 @@ -43606,35 +43318,39 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "bHJ" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating{ - icon_state = "platingdmg1" +/obj/item/tank/internals/oxygen, +/obj/item/tank/internals/oxygen, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/machinery/light/small{ + dir = 4 }, +/turf/open/floor/plating, /area/maintenance/port) "bHK" = ( -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -3; - pixel_y = 5 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 }, -/obj/structure/table/wood, /turf/open/floor/wood, /area/security/vacantoffice) "bHL" = ( /obj/structure/chair/comfy/black{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/carpet, /area/security/vacantoffice) "bHM" = ( -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, /obj/structure/table/wood, -/turf/open/floor/carpet, +/turf/open/floor/wood, /area/security/vacantoffice) "bHN" = ( /obj/machinery/shower{ @@ -43643,6 +43359,7 @@ /obj/machinery/light/small, /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/blood/gibs/old, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/crew_quarters/toilet/auxiliary) "bHO" = ( @@ -44347,10 +44064,9 @@ /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) "bJj" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;27;37" +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ icon_state = "1-2" }, @@ -44379,41 +44095,33 @@ /turf/open/floor/circuit/telecomms/mainframe, /area/tcommsat/server) "bJo" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "bJp" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;27;37" +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port) +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "bJq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/item/storage/box/lights/mixed, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/port) "bJr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 }, -/obj/effect/landmark/event_spawn, +/obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, /area/maintenance/port) "bJs" = ( @@ -44427,27 +44135,35 @@ dir = 4 }, /obj/item/radio/intercom{ - name = "Station Intercom (General)"; pixel_x = -29 }, +/obj/machinery/light/small{ + dir = 8 + }, /turf/open/floor/wood, /area/security/vacantoffice) "bJu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, /turf/open/floor/wood, /area/security/vacantoffice) "bJv" = ( -/obj/item/folder/blue, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, /obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, /turf/open/floor/carpet, /area/security/vacantoffice) "bJw" = ( -/obj/structure/chair/office/dark{ +/obj/structure/chair/office{ dir = 8 }, /turf/open/floor/carpet, @@ -44457,6 +44173,15 @@ dir = 8; pixel_x = 24 }, +/obj/structure/table/wood, +/obj/item/camera_film{ + pixel_x = 6; + pixel_y = 7 + }, +/obj/item/camera_film{ + pixel_x = -3; + pixel_y = 5 + }, /turf/open/floor/wood, /area/security/vacantoffice) "bJy" = ( @@ -45181,9 +44906,6 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bKW" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/machinery/firealarm{ dir = 8; pixel_x = 24 @@ -45195,19 +44917,24 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/entry) -"bKX" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) +"bKX" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;27;37" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, /area/maintenance/port) "bKY" = ( /obj/machinery/power/apc{ - areastring = "/area/security/vacantoffice"; + areastring = "/area/vacant_room/office"; dir = 8; name = "Vacant Office APC"; pixel_x = -25 @@ -45929,7 +45656,6 @@ dir = 4 }, /obj/item/radio/intercom{ - name = "Station Intercom (General)"; pixel_y = -25 }, /obj/effect/turf_decal/stripes/line, @@ -45948,26 +45674,22 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "bMz" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "bMA" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/structure/sign/map/left{ desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; @@ -45976,15 +45698,15 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "bMB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, /obj/structure/sign/map/right{ desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; @@ -45999,10 +45721,13 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "bMC" = ( -/obj/structure/chair/office/dark, +/obj/structure/chair/office, /turf/open/floor/wood, /area/security/vacantoffice) "bMD" = ( @@ -46265,15 +45990,19 @@ /turf/open/floor/carpet, /area/bridge/showroom/corporate) "bNd" = ( -/obj/item/tank/internals/air, -/obj/item/tank/internals/air, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/machinery/light/small{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Port Primary Hallway - Mining Shuttle"; + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "bNe" = ( /obj/structure/table/wood, /obj/item/phone{ @@ -46317,15 +46046,17 @@ /turf/open/floor/wood, /area/bridge/showroom/corporate) "bNh" = ( -/obj/structure/table/wood, -/obj/item/folder/red, -/obj/item/pen/red, -/obj/machinery/newscaster{ - pixel_x = 30; - pixel_y = 2 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/turf/open/floor/wood, -/area/security/vacantoffice) +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "bNi" = ( /obj/structure/window/reinforced{ dir = 8 @@ -46595,17 +46326,12 @@ /turf/open/floor/wood, /area/crew_quarters/theatre) "bNK" = ( -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 6 +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 }, -/obj/structure/table/wood, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/wood, -/area/security/vacantoffice) +/turf/open/floor/plasteel, +/area/hallway/primary/port) "bNL" = ( /obj/structure/table, /obj/item/stock_parts/subspace/transmitter, @@ -46769,10 +46495,10 @@ /obj/machinery/door/airlock/maintenance{ req_one_access_txt = "12;27" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/port) "bOf" = ( @@ -47469,15 +47195,15 @@ /turf/open/floor/plating, /area/hallway/secondary/entry) "bPC" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plating, /area/maintenance/port) "bPD" = ( @@ -47497,31 +47223,30 @@ /turf/open/floor/plating, /area/maintenance/port) "bPG" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/port) "bPH" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, /obj/item/trash/candy, /turf/open/floor/plating, /area/maintenance/port) "bPI" = ( -/obj/machinery/door/airlock/maintenance/abandoned{ +/obj/machinery/door/airlock/maintenance{ name = "Vacant Office Maintenance"; req_access_txt = "32" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, -/area/maintenance/port) +/area/security/vacantoffice) "bPJ" = ( /obj/structure/rack, /obj/item/clothing/mask/horsehead, +/obj/effect/spawner/lootdrop/costume, /turf/open/floor/plating, /area/maintenance/port) "bPK" = ( @@ -48020,6 +47745,9 @@ dir = 8; pixel_x = 24 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, /turf/open/floor/plating, /area/crew_quarters/toilet/auxiliary) "bQQ" = ( @@ -48106,6 +47834,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/port) "bRe" = ( @@ -48746,23 +48475,25 @@ /turf/open/floor/engine/plasma, /area/engine/atmos) "bSn" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, /turf/open/floor/plating, /area/maintenance/port) "bSo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, /turf/open/floor/plating, /area/maintenance/port) "bSp" = ( @@ -48775,13 +48506,13 @@ /turf/open/floor/plating, /area/maintenance/port) "bSq" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/open/floor/plating, /area/maintenance/port) "bSr" = ( @@ -48806,12 +48537,12 @@ /turf/open/floor/plating, /area/maintenance/port) "bSt" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/open/floor/plating{ icon_state = "platingdmg1" }, @@ -66936,6 +66667,7 @@ "cBg" = ( /obj/machinery/recharge_station, /obj/effect/turf_decal/delivery, +/obj/effect/landmark/start/cyborg, /turf/open/floor/plasteel, /area/science/robotics/mechbay) "cBh" = ( @@ -68922,8 +68654,8 @@ /turf/open/floor/plasteel, /area/science/robotics/lab) "cFf" = ( -/obj/effect/landmark/start/roboticist, /obj/effect/turf_decal/bot, +/obj/effect/landmark/start/cyborg, /turf/open/floor/plasteel, /area/science/robotics/lab) "cFg" = ( @@ -69991,9 +69723,9 @@ /turf/open/floor/plasteel, /area/science/robotics/lab) "cGW" = ( -/obj/effect/landmark/start/roboticist, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/bot, +/obj/effect/landmark/start/cyborg, /turf/open/floor/plasteel, /area/science/robotics/lab) "cGX" = ( @@ -79692,6 +79424,9 @@ /obj/structure/sign/poster/official/random{ pixel_y = 32 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "dhQ" = ( @@ -79769,14 +79504,14 @@ /turf/open/floor/wood, /area/crew_quarters/theatre) "dhZ" = ( -/obj/structure/urinal{ - pixel_y = 29 +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, -/obj/structure/sign/poster/official/random{ - pixel_x = -32 +/obj/structure/cable/yellow{ + icon_state = "1-8" }, -/turf/open/floor/plating, -/area/crew_quarters/toilet/auxiliary) +/turf/open/floor/plasteel, +/area/hallway/primary/port) "dib" = ( /obj/structure/table/wood, /obj/item/lipstick{ @@ -79796,9 +79531,6 @@ /turf/open/floor/wood, /area/crew_quarters/theatre) "dic" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/machinery/light{ dir = 4 }, @@ -79808,14 +79540,18 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "did" = ( /obj/structure/table/wood, -/obj/item/folder, -/obj/structure/sign/poster/official/random{ - pixel_x = -32 +/obj/machinery/light_switch{ + pixel_x = -28 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/folder, /turf/open/floor/wood, /area/security/vacantoffice) "dif" = ( @@ -79830,9 +79566,11 @@ /turf/open/floor/wood, /area/crew_quarters/theatre) "dig" = ( -/obj/structure/sign/poster/official/random{ - pixel_x = 32 +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 }, +/obj/structure/table/wood, /turf/open/floor/wood, /area/security/vacantoffice) "dih" = ( @@ -80428,14 +80166,20 @@ /turf/open/space/basic, /area/space) "djW" = ( -/obj/structure/table/wood, -/obj/item/clipboard, -/obj/item/paper, -/obj/structure/sign/poster/official/random{ - pixel_y = 32 +/obj/machinery/light{ + dir = 1 }, -/turf/open/floor/wood, -/area/security/vacantoffice) +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "djX" = ( /obj/structure/closet/crate/coffin, /obj/machinery/door/window/eastleft{ @@ -80663,6 +80407,12 @@ /obj/machinery/vending/coffee, /turf/open/floor/plasteel, /area/science/mixing) +"drp" = ( +/obj/item/folder/blue, +/obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, +/area/security/vacantoffice) "drQ" = ( /turf/open/floor/plating{ icon_state = "platingdmg2" @@ -81830,6 +81580,10 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"eiS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/toilet/auxiliary) "eoK" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -81943,6 +81697,13 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) +"ghM" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port) "gnZ" = ( /obj/item/radio/intercom{ pixel_y = -30 @@ -82035,6 +81796,10 @@ }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"heE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/security/vacantoffice) "hvt" = ( /obj/structure/kitchenspike_frame, /obj/effect/decal/cleanable/blood/gibs/old, @@ -82107,6 +81872,13 @@ /obj/structure/table, /turf/open/floor/plating, /area/maintenance/port/aft) +"iSt" = ( +/obj/machinery/door/airlock/grunge, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/vacantoffice) "jeV" = ( /obj/machinery/conveyor/inverted{ dir = 10; @@ -82156,6 +81928,18 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) +"jBe" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/poster/official/random{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "jKK" = ( /obj/machinery/door/airlock/external{ req_access_txt = "13" @@ -82181,6 +81965,19 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"jPu" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "kfu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, @@ -82248,6 +82045,19 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"kQP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "kVo" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -82281,6 +82091,9 @@ /obj/item/multitool, /turf/open/floor/plasteel/white, /area/science/circuit) +"lws" = ( +/turf/open/floor/carpet, +/area/security/vacantoffice) "lzk" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ @@ -82315,6 +82128,22 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"lOi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/landmark/start/roboticist, +/turf/open/floor/plasteel, +/area/science/robotics/lab) "lWL" = ( /obj/machinery/smartfridge/organ/preloaded, /turf/closed/wall, @@ -82339,6 +82168,32 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) +"maP" = ( +/obj/item/storage/toolbox/emergency, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/port) +"mcS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/map/left{ + desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; + icon_state = "map-left-MS"; + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "mjJ" = ( /obj/machinery/nuclearbomb/beer{ pixel_x = 2; @@ -82373,6 +82228,16 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) +"mEe" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port) "mWg" = ( /obj/structure/girder, /obj/structure/grille, @@ -82380,6 +82245,20 @@ icon_state = "panelscorched" }, /area/maintenance/port/aft) +"nhy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "nnK" = ( /obj/item/stack/sheet/glass/fifty, /obj/item/paper_bin, @@ -82430,6 +82309,13 @@ }, /turf/open/floor/plasteel, /area/construction/storage/wing) +"nWb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "nXA" = ( /obj/structure/rack{ icon = 'icons/obj/stationobjs.dmi'; @@ -82515,10 +82401,10 @@ /obj/docking_port/stationary{ dir = 2; dwidth = 11; - height = 15; + height = 22; id = "whiteship_home"; name = "SS13: Auxiliary Dock, Station-Port"; - width = 28 + width = 35 }, /turf/open/space/basic, /area/space) @@ -82531,6 +82417,10 @@ /obj/item/pen, /turf/open/floor/plasteel/white, /area/science/circuit) +"oWR" = ( +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/port) "oXn" = ( /obj/machinery/computer/cryopod{ dir = 4; @@ -82595,6 +82485,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) +"pHS" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/maintenance/port) "pMX" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -82627,6 +82521,12 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"pZb" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/wood, +/area/security/vacantoffice) "qhe" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -82711,6 +82611,12 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"rbE" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) "roa" = ( /obj/structure/chair/stool, /obj/machinery/light/small{ @@ -82746,6 +82652,22 @@ /obj/machinery/status_display/supply, /turf/closed/wall, /area/quartermaster/miningoffice) +"rNX" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=6-Port-Central"; + location = "5-Customs" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "rQK" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -82792,6 +82714,16 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"syk" = ( +/obj/machinery/door/airlock{ + id_tag = "AuxShower"; + name = "Shower" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/toilet/auxiliary) "sFv" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -82850,6 +82782,34 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) +"tre" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) "tsx" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -82911,6 +82871,16 @@ "urv" = ( /turf/closed/wall/mineral/plastitanium, /area/security/prison) +"usf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/port) "usx" = ( /obj/machinery/status_display/supply, /turf/closed/wall, @@ -83026,6 +82996,12 @@ /obj/structure/lattice, /turf/open/floor/plating, /area/space/nearstation) +"wdO" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/security/vacantoffice) "wgw" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, @@ -83040,6 +83016,11 @@ }, /turf/open/floor/plating, /area/security/prison) +"wlH" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel, +/area/maintenance/port) "wmt" = ( /obj/effect/decal/cleanable/flour, /turf/open/floor/plating, @@ -83095,11 +83076,25 @@ /obj/machinery/light, /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) +"xfI" = ( +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "xkG" = ( /obj/item/integrated_electronics/wirer, /obj/structure/table/reinforced, /turf/open/floor/plasteel/white, /area/science/circuit) +"xmb" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "xse" = ( /obj/machinery/door/airlock/external{ name = "Solar Maintenance"; @@ -83140,6 +83135,21 @@ /obj/structure/chair/comfy, /turf/open/floor/plasteel, /area/science/misc_lab) +"xDn" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/port) "xEf" = ( /obj/structure/table, /obj/item/flashlight/lamp{ @@ -83156,6 +83166,27 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"xLL" = ( +/obj/structure/table/wood, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/security/vacantoffice) +"xTV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/port) "xVl" = ( /turf/closed/wall, /area/hallway/secondary/service) @@ -95913,7 +95944,7 @@ aaa aVs aVs aVs -bvH +bBl bxz aRA bBc @@ -96172,19 +96203,19 @@ aVs btR bvI bxA -biu +bCN bbI bbI bbI bbI bbI -bjV +nWb btT bMA alK bPD asa -alK +pHS aaa aaa aaf @@ -96394,7 +96425,7 @@ dne auD avL awM -dnk +ako dqe doA dnk @@ -96426,10 +96457,10 @@ aVs aRA aRA aRA -btS +bxL bvJ bxB -biv +bCQ bBd bCH bEn @@ -96686,13 +96717,13 @@ bbI btT bvK bxC -alK -alK -alK -alK -alK -alK +bEp bJp +rbE +alK +alK +alK +alK alK alK alK @@ -96940,21 +96971,21 @@ blT bnL bqc bso -bnL +bso bvL bxD bzw -bvY +tre bCI bEo bJj -bzC +xTV bJq bKX bbL bbL bPG -bxT +usf bSn bTo bUO @@ -97194,25 +97225,25 @@ bbK biw bjX blU +baE +baE bnM -bqd -bsp bnM -bvM -bxE +bnM +baE +baE +jPu +bCJ alK auF -bCJ -bEp -alK -apz +maP bJr -alC +alK aqK aqO -bPF +alC aGN -asa +bSo bTp bUP bVS @@ -97451,24 +97482,24 @@ bgw bix bjY blV -baE -baE -baE -baE -bvN -bjY -alK -bBe +bqi +bqf +bqf +bqf +bqf +bqf +bqi +djW bNd -ako alK +wlH bHJ -bJs -aLd -aLd -aLd +pHS +alK +oWR +aob bPH -aLd +aob bSo bTn bTn @@ -97708,15 +97739,15 @@ bgx biy bjZ blW -bnN -bqe -bsq -btU -bvO -bxF -bzx -bzx -bzx +bnM +bqf +bqf +bqf +bqf +bqf +bnM +bBf +kQP bzx bzx bzx @@ -97726,7 +97757,7 @@ bzx bzx bzx alC -cgH +mEe alK aob aob @@ -97965,13 +97996,13 @@ bgy biz bka blX -bnO +bnM bqf bqf -btV -bvP -bxG -bzy +bqf +bqf +bqf +bnM bBf bCL bEq @@ -98220,27 +98251,27 @@ bda beO bgz biA -bka +bnR blY bnP bqg -bsr -bnP -bvQ -bxH +bqf +bqf +bqf +bqf +bnM +rNX +jBe bzx bBg -bBg -bBg -bGj -bBh +pZb bJu bKZ bMC din bzx auF -bSr +bSo alK bJs bVU @@ -98479,25 +98510,25 @@ bgA biz bkb blZ -bnO +bnM bqf bqf -btV -bvR -bxI -bzz -bBh -bBh +bqf +bqf +bqf +bnM bBh +xmb +iSt bGk +bKZ bHL -bHL -bBg +wdO bBg bOg bzx aoa -bSr +bSo alK bUR alK @@ -98736,25 +98767,25 @@ bpt bcW bkc bma -bnQ -bqh -bss -btW -bvS -bxJ -bzx -bBi +bnM +bqf +bqf +bqf +bqf +bqf +bnM +bBf bCM -bBg -bBg +bzx +bzx bHM bJv -bBg -bBg -bBg +drp +heE +heE bPI bRd -bSr +ghM alK alK alK @@ -98992,26 +99023,26 @@ beR bbK bcW dhP -blV -baE -baE -baE -baE -bvN -bxK -bzx +bqd +bqi +bqf +bqf +bqf +bqf +bqf +bqi djW -bCN -bBg -bBg +bsx +xfI +bzx bEs bJw -bBg +lws bMC -bOg +xLL bzx bRe -bSs +xDn aSO bUS bVV @@ -99250,17 +99281,17 @@ bgC biB bkd bmb -bnR -bqi -bst -btX -bvO -bxL -bzx -bBk +baE +baE +bnM +baE +bnM +baE +baE +bBf bNh bNK -bBg +bzx dig bJx bLa @@ -99511,12 +99542,12 @@ bnS bqj bsu btY -bvU -bxM -bzx -bzx -bzx -bzx +bqj +bsu +bEt +nhy +mcS +bvW bzx bzx bzx @@ -99525,7 +99556,7 @@ bzx bzx bzx alK -bSr +bSo dux bUT bVW @@ -99770,7 +99801,7 @@ bsv btZ bvV bxN -bvW +bGj dhZ bCP bvW @@ -99782,7 +99813,7 @@ bME bOi bPJ alK -cgH +mEe dux iLj dvt @@ -100028,9 +100059,9 @@ baE bvW bxO bvW -bBl -bCQ -bEt +bvW +bvW +bvW bGm bHO bvW @@ -100288,7 +100319,7 @@ bzA bBm bCR bvW -bvW +syk bvW bvW bLd @@ -100544,7 +100575,7 @@ bxQ bzB bBn bCS -bBn +eiS bQN dih bvW @@ -112150,10 +112181,10 @@ cAo cBi cCn cDd -cEm +lOi cFf cFg -cFh +cFf cHR cIL cJK @@ -112664,8 +112695,8 @@ cAp cBj cCq cDf -cEm -cFh +lOi +cFf cGd cGW cHS diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index 99c536bd3c..b79f05cc69 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -26,9 +26,7 @@ /area/lavaland/surface/outdoors) "af" = ( /obj/structure/necropolis_gate/legion_gate, -/obj/structure/necropolis_arch{ - pixel_y = -40 - }, +/obj/structure/necropolis_arch, /obj/structure/stone_tile/slab, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) @@ -76,6 +74,17 @@ "an" = ( /turf/closed/mineral/random/labormineral/volcanic, /area/lavaland/surface/outdoors) +"ao" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "Labor Camp APC"; + pixel_y = 23 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/mine/laborcamp) "ap" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -166,7 +175,6 @@ "aE" = ( /obj/item/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; - dir = 2; name = "Prison Intercom (General)"; pixel_y = 24; prison_radio = 1 @@ -273,9 +281,17 @@ }, /turf/closed/wall, /area/mine/laborcamp) +"aV" = ( +/obj/machinery/door/airlock{ + name = "Restroom" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "aW" = ( /obj/machinery/conveyor{ - dir = 2; id = "gulag" }, /turf/open/floor/plating, @@ -318,6 +334,9 @@ c_tag = "Labor Camp Central"; network = list("labor") }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, /turf/open/floor/plasteel, /area/mine/laborcamp) "bc" = ( @@ -327,16 +346,12 @@ /turf/open/floor/plasteel, /area/mine/laborcamp) "bd" = ( -/obj/machinery/mineral/processing_unit_console{ - dir = 2; - machinedir = 4 - }, +/obj/machinery/mineral/processing_unit_console, /turf/closed/wall, /area/mine/laborcamp) "be" = ( /obj/machinery/mineral/processing_unit{ - dir = 1; - output_dir = 2 + dir = 1 }, /turf/open/floor/plating, /area/mine/laborcamp) @@ -348,7 +363,9 @@ /turf/open/floor/plating, /area/mine/eva) "bh" = ( -/obj/machinery/computer/shuttle/labor/one_way, +/obj/machinery/computer/shuttle/labor/one_way{ + dir = 4 + }, /turf/open/floor/plasteel, /area/mine/laborcamp) "bi" = ( @@ -356,7 +373,7 @@ /turf/open/floor/plasteel, /area/mine/laborcamp) "bj" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /turf/open/floor/plasteel, @@ -472,6 +489,10 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/mine/eva) +"bw" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/mine/laborcamp/security) "bx" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -482,41 +503,34 @@ /turf/open/floor/plasteel, /area/mine/laborcamp) "by" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"bz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, /obj/structure/cable{ icon_state = "2-4" }, /turf/open/floor/plasteel, -/area/mine/laborcamp) -"bz" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/mine/laborcamp) +/area/mine/production) "bA" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Labor Camp Backroom"; - req_access_txt = "2" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, +/turf/closed/wall/r_wall, /area/mine/laborcamp) "bB" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "Labor Camp APC"; - pixel_y = 24 +/obj/structure/toilet{ + dir = 8 }, -/obj/structure/cable{ - icon_state = "2-8" +/obj/machinery/light/small{ + dir = 1 }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel, -/area/mine/laborcamp) +/turf/open/floor/plating, +/area/mine/laborcamp/security) "bC" = ( /obj/machinery/airalarm{ pixel_y = 23 @@ -593,25 +607,18 @@ /turf/open/floor/plasteel, /area/mine/eva) "bL" = ( -/obj/machinery/door/airlock/security/glass{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/airlock/highsecurity{ name = "Labor Camp Monitoring"; - req_access_txt = "2" - }, -/obj/structure/cable{ - icon_state = "1-2" + req_access_txt = "2"; + security_level = 6 }, /turf/open/floor/plasteel, /area/mine/laborcamp) "bM" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Labor Camp Maintenance"; - req_access_txt = "2" - }, -/obj/structure/cable{ - icon_state = "1-10" - }, -/turf/open/floor/plating, -/area/mine/laborcamp) +/turf/closed/wall, +/area/mine/laborcamp/security) "bN" = ( /obj/structure/sign/warning/docking, /obj/effect/spawner/structure/window/reinforced, @@ -628,31 +635,22 @@ /turf/open/floor/plasteel, /area/mine/production) "bQ" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/mine/production) -"bR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ dir = 4 }, -/turf/open/floor/plasteel, -/area/mine/production) -"bS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, /obj/structure/cable{ icon_state = "4-8" }, +/turf/open/floor/plasteel, +/area/mine/production) +"bR" = ( /obj/machinery/door/airlock/mining/glass{ name = "Mining Station EVA"; req_access_txt = "54" @@ -660,28 +658,25 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plasteel, -/area/mine/eva) -"bT" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, /obj/structure/cable{ icon_state = "4-8" }, +/turf/open/floor/plasteel, +/area/mine/eva) +"bS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /obj/effect/turf_decal/tile/brown{ dir = 1 }, /obj/effect/turf_decal/tile/brown{ dir = 8 }, -/turf/open/floor/plasteel, -/area/mine/eva) -"bU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, /obj/structure/cable{ @@ -689,6 +684,32 @@ }, /turf/open/floor/plasteel, /area/mine/eva) +"bT" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/power/apc{ + dir = 1; + name = "Labor Camp Security APC"; + pixel_y = 23 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"bU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/mine/eva) "bV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 @@ -727,20 +748,24 @@ /turf/closed/mineral/random/volcanic, /area/lavaland/surface/outdoors/explored) "ca" = ( -/turf/closed/wall, +/turf/closed/wall/r_wall, /area/mine/laborcamp/security) "cb" = ( -/obj/structure/table, -/obj/machinery/recharger, -/obj/machinery/light/small{ +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/structure/table, +/obj/item/restraints/handcuffs, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "cc" = ( -/obj/structure/chair/office/dark, -/obj/structure/cable{ - icon_state = "1-4" +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/red{ + dir = 1 }, /mob/living/simple_animal/bot/secbot/beepsky{ desc = "Powered by the tears and sweat of laborers."; @@ -749,51 +774,57 @@ /turf/open/floor/plasteel, /area/mine/laborcamp/security) "cd" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/obj/machinery/power/apc{ - dir = 4; - name = "Labor Camp Security APC"; - pixel_x = 24 - }, -/obj/machinery/camera{ - c_tag = "Labor Camp Monitoring"; - network = list("labor") - }, -/obj/structure/cable{ - icon_state = "0-8" +/obj/effect/turf_decal/tile/red{ + dir = 1 }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "ce" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "5-6" - }, -/turf/open/floor/plating, -/area/mine/laborcamp) -"cf" = ( -/obj/machinery/power/terminal, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/mine/laborcamp) -"cg" = ( -/obj/machinery/light/small{ +/obj/machinery/computer/secure_data, +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/turf/open/floor/plating, -/area/mine/laborcamp) +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"cf" = ( +/obj/machinery/computer/security/labor, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"cg" = ( +/obj/machinery/computer/prisoner, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "ch" = ( -/turf/open/floor/plating, -/area/mine/laborcamp) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"ci" = ( +/obj/machinery/power/apc{ + name = "Mining EVA APC"; + pixel_x = 1; + pixel_y = -23 + }, +/obj/machinery/recharge_station, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/mine/eva) "cj" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -815,12 +846,24 @@ /turf/open/floor/plasteel, /area/mine/production) "cl" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"cm" = ( +/obj/machinery/mech_bay_recharge_port, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/mine/eva) +"cn" = ( +/obj/effect/turf_decal/tile/purple{ dir = 4 }, /turf/open/floor/plasteel, /area/mine/production) -"cm" = ( +"co" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, @@ -829,39 +872,28 @@ }, /turf/open/floor/plasteel, /area/mine/production) -"cn" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 +"cp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 }, -/turf/open/floor/plasteel, -/area/mine/production) -"co" = ( -/obj/machinery/power/apc{ - dir = 2; - name = "Mining EVA APC"; - pixel_x = 1; - pixel_y = -23 - }, -/obj/structure/cable, -/obj/machinery/recharge_station, -/obj/effect/turf_decal/tile/purple{ +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, -/area/mine/eva) -"cp" = ( -/obj/machinery/mech_bay_recharge_port, -/obj/structure/cable, -/turf/open/floor/plating, -/area/mine/eva) +/area/mine/laborcamp/security) "cq" = ( /turf/open/floor/mech_bay_recharge_floor, /area/mine/eva) "cr" = ( -/obj/machinery/computer/mech_bay_power_console, /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/computer/mech_bay_power_console{ + dir = 1 + }, /turf/open/floor/plasteel, /area/mine/eva) "cs" = ( @@ -887,47 +919,58 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "cw" = ( -/obj/machinery/computer/secure_data, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/vending/security, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "cx" = ( -/obj/machinery/computer/security{ - name = "Labor Camp Monitoring"; - network = list("labor") - }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "cy" = ( -/obj/machinery/computer/prisoner, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"cz" = ( +/obj/structure/table, +/obj/item/storage/fancy/donut_box, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) -"cz" = ( -/obj/machinery/power/port_gen/pacman{ - anchored = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/mine/laborcamp) "cA" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/cable{ - icon_state = "0-9" - }, -/turf/open/floor/plating, -/area/mine/laborcamp) +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "cB" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/mine/laborcamp) +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "cC" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/mine/laborcamp) +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "cD" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -935,12 +978,18 @@ /turf/open/floor/plasteel, /area/mine/production) "cE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/mine/production) +/area/mine/laborcamp/security) "cF" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -949,8 +998,17 @@ /turf/open/floor/plasteel, /area/mine/production) "cG" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/closet/secure_closet/freezer/gulag_fridge, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, /area/mine/laborcamp/security) "cH" = ( /obj/effect/turf_decal/tile/purple{ @@ -985,9 +1043,9 @@ /turf/closed/wall, /area/mine/living_quarters) "cN" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall, -/area/mine/living_quarters) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "cO" = ( /obj/item/radio/intercom{ dir = 8; @@ -1020,31 +1078,44 @@ /turf/open/floor/plating, /area/mine/living_quarters) "cS" = ( -/obj/machinery/power/smes{ - charge = 5e+006 +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/obj/structure/cable{ - icon_state = "0-4" +/obj/machinery/camera{ + c_tag = "Labor Camp Security Office"; + dir = 1; + network = list("labor") }, -/turf/open/floor/plating, -/area/mine/living_quarters) -"cT" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/light/small{ +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"cT" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ dir = 1 }, -/obj/structure/closet/crate/secure/loot, -/turf/open/floor/plating, -/area/mine/living_quarters) -"cU" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/structure/cable{ - icon_state = "2-8" +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/turf/open/floor/plating, -/area/mine/living_quarters) +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"cU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/airlock/security/glass{ + name = "Labor Camp Monitoring"; + req_access_txt = "2" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "cV" = ( /turf/open/floor/plating, /area/mine/living_quarters) @@ -1053,36 +1124,27 @@ /turf/open/floor/plating, /area/mine/living_quarters) "cX" = ( -/obj/machinery/power/apc{ - dir = 8; - name = "Mining Station Starboard Wing APC"; - pixel_x = -27; - pixel_y = 2 +/obj/machinery/power/smes{ + charge = 5e+006 }, /obj/structure/cable{ icon_state = "0-4" }, -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ +/turf/open/floor/plating, +/area/mine/living_quarters) +"cY" = ( +/obj/machinery/light/small{ dir = 1 }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/mine/production) -"cY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/closet/crate/secure/loot, +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 }, /obj/structure/cable{ - icon_state = "2-8" + icon_state = "4-8" }, -/turf/open/floor/plasteel, -/area/mine/production) +/turf/open/floor/plating, +/area/mine/living_quarters) "cZ" = ( /obj/machinery/mineral/equipment_vendor, /obj/effect/turf_decal/tile/brown{ @@ -1095,9 +1157,7 @@ /turf/open/floor/plasteel, /area/mine/production) "da" = ( -/obj/machinery/mineral/mint{ - input_dir = 4 - }, +/obj/machinery/mineral/mint, /turf/open/floor/plasteel, /area/mine/production) "db" = ( @@ -1139,17 +1199,12 @@ /turf/open/floor/circuit, /area/mine/maintenance) "dh" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, /obj/structure/cable{ - icon_state = "0-2" + icon_state = "2-8" }, -/obj/machinery/power/apc{ - dir = 1; - name = "Mining Communications APC"; - pixel_x = 1; - pixel_y = 25 - }, -/turf/open/floor/plasteel/dark, -/area/mine/maintenance) +/turf/open/floor/plating, +/area/mine/living_quarters) "di" = ( /obj/machinery/telecomms/relay/preset/mining, /obj/machinery/light/small{ @@ -1218,27 +1273,42 @@ /turf/open/floor/plasteel/white, /area/mine/living_quarters) "do" = ( -/obj/machinery/power/terminal{ +/obj/machinery/power/apc{ + dir = 8; + name = "Mining Station Starboard Wing APC"; + pixel_x = -25; + pixel_y = 2 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ dir = 1 }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"dp" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "Mining Communications APC"; + pixel_x = 1; + pixel_y = 23 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /obj/structure/cable{ icon_state = "0-2" }, -/turf/open/floor/plating, -/area/mine/living_quarters) -"dp" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/mine/living_quarters) +/turf/open/floor/plasteel/dark, +/area/mine/maintenance) "dq" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 }, /turf/open/floor/plating, /area/mine/living_quarters) @@ -1249,13 +1319,27 @@ /turf/open/floor/plating, /area/mine/living_quarters) "ds" = ( -/obj/machinery/mineral/equipment_vendor, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/machinery/power/terminal{ + dir = 1 }, -/turf/open/floor/plasteel, -/area/mine/production) +/obj/machinery/power/port_gen/pacman{ + anchored = 1 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/mine/living_quarters) +"dt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/machinery/meter, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/mine/living_quarters) "du" = ( /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel, @@ -1274,20 +1358,28 @@ /turf/open/floor/plasteel, /area/mine/production) "dx" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/machinery/mineral/equipment_vendor, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/turf/open/floor/circuit, -/area/mine/maintenance) +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/production) "dy" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, /obj/structure/cable{ - icon_state = "2-8" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/mine/maintenance) +/turf/open/floor/plasteel, +/area/mine/living_quarters) "dz" = ( /obj/machinery/light_switch{ pixel_y = -25 @@ -1337,10 +1429,16 @@ /turf/open/floor/plasteel/white, /area/mine/living_quarters) "dC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, /turf/open/floor/plasteel/white, /area/mine/living_quarters) "dD" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, /turf/open/floor/plasteel/white, /area/mine/living_quarters) "dE" = ( @@ -1353,36 +1451,34 @@ /turf/open/floor/plasteel/white, /area/mine/living_quarters) "dF" = ( -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/power/port_gen/pacman{ - anchored = 1 - }, -/turf/open/floor/plating, -/area/mine/living_quarters) -"dG" = ( -/obj/machinery/power/port_gen/pacman{ - anchored = 1 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/mine/living_quarters) -"dH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/mine/living_quarters) +"dG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"dH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/circuit, +/area/mine/maintenance) "dI" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 + dir = 5 }, /turf/open/floor/plating, /area/mine/living_quarters) @@ -1455,15 +1551,17 @@ /turf/open/floor/plating, /area/mine/production) "dP" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Mining Station Communications"; - req_access_txt = "48" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/bluespace_beacon, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/dark, /area/mine/maintenance) "dQ" = ( /obj/effect/spawner/structure/window, @@ -1474,32 +1572,35 @@ name = "Infirmary" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel/white, /area/mine/living_quarters) "dS" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/power/port_gen/pacman{ + anchored = 1 }, -/obj/machinery/door/airlock/maintenance{ - name = "Mining Station Maintenance"; - req_access_txt = "48" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable, /turf/open/floor/plating, /area/mine/living_quarters) "dT" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 +/obj/machinery/atmospherics/components/binary/pump/on, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/mine/living_quarters) +"dU" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Mining Station Communications"; + req_access_txt = "48" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/plasteel, -/area/mine/production) -"dU" = ( -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/plasteel, -/area/mine/production) +/area/mine/maintenance) "dV" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -1521,7 +1622,6 @@ /area/mine/production) "dY" = ( /obj/machinery/conveyor{ - dir = 2; id = "mining_internal" }, /obj/effect/turf_decal/stripes/line{ @@ -1539,17 +1639,15 @@ /turf/open/floor/plasteel, /area/mine/living_quarters) "eb" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Mining Station Maintenance"; + req_access_txt = "48" + }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/mine/living_quarters) "ec" = ( /obj/effect/turf_decal/tile/purple{ @@ -1559,9 +1657,10 @@ /area/mine/living_quarters) "ed" = ( /obj/machinery/camera{ - c_tag = "Crew Area Hallway West"; + c_tag = "Crew Area Hallway"; network = list("mine") }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) "ee" = ( @@ -1578,20 +1677,27 @@ /obj/effect/turf_decal/tile/brown{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) "eg" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "Mining Station Port Wing APC"; - pixel_x = 1; - pixel_y = 25 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/airlock/mining/glass{ + name = "Processing Area"; + req_access_txt = "48" }, /obj/structure/cable{ - icon_state = "0-2" + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" }, /turf/open/floor/plasteel, -/area/mine/living_quarters) +/area/mine/production) "eh" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -5; @@ -1600,15 +1706,14 @@ /turf/open/floor/plasteel, /area/mine/living_quarters) "ei" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "Mining Station Port Wing APC"; + pixel_x = 1; + pixel_y = 23 + }, /obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 + icon_state = "0-2" }, /turf/open/floor/plasteel, /area/mine/living_quarters) @@ -1627,12 +1732,11 @@ /turf/open/floor/plasteel, /area/mine/living_quarters) "el" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Processing Area"; - req_access_txt = "48" +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 }, /turf/open/floor/plasteel, -/area/mine/living_quarters) +/area/mine/laborcamp) "em" = ( /obj/machinery/light{ dir = 4 @@ -1641,6 +1745,9 @@ /obj/effect/turf_decal/tile/brown{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, /turf/open/floor/plasteel, /area/mine/production) "en" = ( @@ -1649,8 +1756,7 @@ /area/mine/production) "eo" = ( /obj/machinery/mineral/processing_unit{ - dir = 1; - output_dir = 2 + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -1658,19 +1764,62 @@ /turf/open/floor/plating, /area/mine/production) "ep" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ dir = 4 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "eq" = ( -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"er" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/mine/living_quarters) +"es" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "4-8" + }, /obj/structure/cable{ icon_state = "1-4" }, /turf/open/floor/plasteel, /area/mine/living_quarters) -"er" = ( +"et" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -1679,164 +1828,168 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) -"es" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) -"et" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "eu" = ( +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, /obj/structure/cable{ icon_state = "1-4" }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, /area/mine/living_quarters) "ev" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, /turf/open/floor/plasteel, /area/mine/living_quarters) "ew" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, /turf/open/floor/plasteel, /area/mine/living_quarters) "ex" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Station Bridge"; - req_access_txt = "48" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /turf/open/floor/plasteel, /area/mine/living_quarters) "ey" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, /turf/open/floor/plasteel, /area/mine/living_quarters) "ez" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 }, /obj/structure/cable{ icon_state = "4-8" }, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, -/area/mine/production) +/area/mine/living_quarters) "eA" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Station Bridge"; - req_access_txt = "48" +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-4" }, /turf/open/floor/plasteel, -/area/mine/production) +/area/mine/living_quarters) "eB" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"eC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/airlock/glass{ + name = "Mining Station Bridge" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"eD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/production) +"eE" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 }, /obj/effect/turf_decal/tile/brown{ dir = 8 }, -/turf/open/floor/plasteel, -/area/mine/production) -"eC" = ( -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, /obj/structure/cable{ - icon_state = "1-8" + icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/mine/production) -"eD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/mine/production) -"eE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, +/area/mine/living_quarters) +"eF" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ dir = 4 }, -/turf/open/floor/plasteel, -/area/mine/production) -"eF" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Processing Area"; - req_access_txt = "48" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/mine/production) "eG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 }, /turf/open/floor/plasteel, /area/mine/production) @@ -1845,6 +1998,9 @@ dir = 4 }, /obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, /turf/open/floor/plasteel, /area/mine/production) "eI" = ( @@ -1855,6 +2011,9 @@ /obj/effect/turf_decal/tile/brown{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, /turf/open/floor/plasteel, /area/mine/production) "eJ" = ( @@ -1873,6 +2032,7 @@ /obj/effect/turf_decal/tile/brown{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) "eL" = ( @@ -1887,6 +2047,7 @@ /area/mine/living_quarters) "eN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) "eO" = ( @@ -1903,18 +2064,17 @@ /turf/open/floor/plasteel, /area/mine/production) "eQ" = ( -/obj/machinery/door/airlock/mining{ - name = "Mining Station Storage"; - req_access_txt = "48" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/airlock/glass, /turf/open/floor/plasteel, /area/mine/living_quarters) "eR" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/glass{ name = "Break Room" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) "eS" = ( @@ -1922,13 +2082,7 @@ dir = 1; pixel_y = -22 }, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, +/obj/machinery/mineral/equipment_vendor, /turf/open/floor/plasteel, /area/mine/production) "eT" = ( @@ -1951,16 +2105,7 @@ /turf/open/floor/plasteel, /area/mine/production) "eV" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, /area/mine/production) "eW" = ( @@ -1999,27 +2144,18 @@ dir = 4 }, /obj/effect/turf_decal/stripes/corner{ - dir = 4 + dir = 1 }, /turf/open/floor/plating, /area/mine/production) "fa" = ( -/obj/machinery/mineral/equipment_vendor, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 +/obj/machinery/newscaster{ + pixel_y = 32 }, +/obj/structure/chair, /turf/open/floor/plasteel, /area/mine/living_quarters) "fb" = ( -/obj/machinery/light/small{ - dir = 1 - }, /obj/structure/extinguisher_cabinet{ pixel_x = -5; pixel_y = 30 @@ -2027,6 +2163,10 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/chair, /turf/open/floor/plasteel, /area/mine/living_quarters) "fc" = ( @@ -2040,11 +2180,9 @@ /area/mine/living_quarters) "fd" = ( /obj/machinery/camera{ - c_tag = "Storage"; - dir = 2; + c_tag = "Public Shuttle Lobby"; network = list("mine") }, -/obj/structure/reagent_dispensers/watertank, /obj/effect/turf_decal/tile/brown{ dir = 1 }, @@ -2052,6 +2190,9 @@ /obj/effect/turf_decal/tile/brown{ dir = 4 }, +/obj/structure/table, +/obj/item/gps/mining, +/obj/item/gps/mining, /turf/open/floor/plasteel, /area/mine/living_quarters) "fe" = ( @@ -2066,6 +2207,9 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, /turf/open/floor/carpet, /area/mine/living_quarters) "fg" = ( @@ -2076,6 +2220,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "fh" = ( @@ -2088,12 +2235,18 @@ /obj/effect/turf_decal/tile/brown{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "fi" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "fj" = ( @@ -2112,11 +2265,12 @@ /turf/open/floor/plasteel, /area/mine/living_quarters) "fl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) "fm" = ( @@ -2142,15 +2296,12 @@ /turf/open/floor/plasteel, /area/mine/living_quarters) "fo" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, -/area/mine/living_quarters) +/area/mine/laborcamp) "fp" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -2163,10 +2314,12 @@ name = "Station Intercom (General)"; pixel_x = 28 }, -/obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "fr" = ( @@ -2184,6 +2337,9 @@ pixel_x = 25; specialfunctions = 4 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, /turf/open/floor/carpet, /area/mine/living_quarters) "ft" = ( @@ -2199,11 +2355,12 @@ /area/mine/living_quarters) "fu" = ( /obj/structure/chair, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) "fv" = ( @@ -2215,50 +2372,50 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"fw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "fx" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) +/turf/closed/mineral/random/labormineral/volcanic, +/area/lavaland/surface/outdoors/explored) "fy" = ( -/obj/machinery/recharge_station, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/airlock/glass{ + name = "Mining Station Bridge" + }, +/obj/structure/cable{ + icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/mine/living_quarters) +/area/mine/production) "fz" = ( -/obj/structure/closet/secure_closet/miner, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, +/obj/structure/table, +/obj/item/clothing/glasses/meson, +/obj/item/storage/bag/ore, +/obj/item/pickaxe, +/obj/item/mining_scanner, +/obj/item/flashlight, /turf/open/floor/plasteel, /area/mine/living_quarters) "fA" = ( -/obj/structure/closet/secure_closet/miner, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /turf/open/floor/plasteel, -/area/mine/living_quarters) +/area/mine/eva) "fB" = ( -/obj/structure/closet/secure_closet/miner, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, +/obj/structure/table, +/obj/item/gps/mining, +/obj/item/gps/mining, /turf/open/floor/plasteel, /area/mine/living_quarters) "fC" = ( @@ -2269,6 +2426,9 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "fD" = ( @@ -2277,9 +2437,6 @@ pixel_x = 7; pixel_y = 5 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, /obj/item/reagent_containers/food/drinks/beer{ pixel_x = -1; pixel_y = 9 @@ -2291,29 +2448,35 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "fE" = ( /obj/structure/chair{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "fF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "fG" = ( @@ -2333,6 +2496,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "fI" = ( @@ -2376,7 +2542,7 @@ /area/mine/living_quarters) "fL" = ( /obj/structure/sink{ - dir = 4; + dir = 8; pixel_x = 11 }, /obj/effect/turf_decal/tile/bar, @@ -2396,6 +2562,9 @@ pixel_x = 25; specialfunctions = 4 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, /turf/open/floor/carpet, /area/mine/living_quarters) "fN" = ( @@ -2403,6 +2572,9 @@ /obj/machinery/light{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "fO" = ( @@ -2413,6 +2585,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "fP" = ( @@ -2426,6 +2601,9 @@ pixel_x = 25; specialfunctions = 4 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, /turf/open/floor/carpet, /area/mine/living_quarters) "fQ" = ( @@ -2446,6 +2624,24 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"fU" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/production) "fV" = ( /turf/closed/indestructible/riveted/boss/see_through, /area/lavaland/surface/outdoors) @@ -2454,6 +2650,14 @@ /obj/structure/stone_tile/slab, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) +"fX" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/mine/production) "gj" = ( /obj/structure/stone_tile/surrounding_tile{ dir = 1 @@ -2582,9 +2786,14 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"gX" = ( +/obj/structure/toilet{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) "gY" = ( /obj/docking_port/stationary{ - area_type = /area/lavaland/surface/outdoors; dir = 8; dwidth = 2; height = 5; @@ -2639,13 +2848,19 @@ }, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) -"il" = ( -/obj/machinery/computer/cryopod{ - dir = 4; - pixel_x = -26 +"ie" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/mine/laborcamp) +/area/mine/living_quarters) +"il" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/eva) "ir" = ( /obj/structure/stone_tile/slab/cracked{ dir = 5 @@ -2813,6 +3028,15 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"jI" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "jL" = ( /obj/structure/stone_tile/surrounding_tile, /obj/structure/stone_tile/surrounding_tile{ @@ -2835,6 +3059,17 @@ /obj/structure/stone_tile/center/cracked, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"jO" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 3; + height = 7; + id = "lavaland_common_away"; + name = "Mining base public dock"; + width = 7 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "jQ" = ( /obj/structure/stone_tile{ dir = 1 @@ -2870,6 +3105,12 @@ /obj/structure/fluff/drake_statue/falling, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"km" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "ko" = ( /obj/structure/stone_tile/block/cracked{ dir = 8 @@ -3061,6 +3302,13 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"lB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/production) "lD" = ( /obj/structure/stone_tile/block/cracked{ dir = 4 @@ -3104,6 +3352,13 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"lN" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "lP" = ( /obj/structure/stone_tile/block/cracked{ dir = 4 @@ -3141,6 +3396,14 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"lU" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste{ + dir = 4; + piping_layer = 3 + }, +/obj/structure/lattice/catwalk, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/living_quarters) "lW" = ( /obj/structure/stone_tile/block/cracked, /obj/structure/stone_tile/block/cracked{ @@ -3176,6 +3439,15 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"mi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "mk" = ( /obj/structure/stone_tile/block/cracked{ dir = 8 @@ -3541,12 +3813,579 @@ }, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) -"Po" = ( +"ns" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/mine/production) +"nE" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = -12 + }, +/obj/structure/mirror{ + pixel_x = -28 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"nG" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"nJ" = ( +/obj/structure/sign/poster/official/random{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"nO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"nZ" = ( +/obj/machinery/door/window/southright, +/obj/machinery/shower{ + pixel_y = 22 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"oZ" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"pg" = ( +/obj/machinery/door/airlock/external{ + glass = 1; + name = "Mining External Airlock"; + opacity = 0 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plasteel, +/area/mine/production) +"pm" = ( +/obj/structure/table, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/tank/internals/emergency_oxygen, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"qq" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"qE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"qZ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"rf" = ( +/obj/machinery/door/airlock/external{ + glass = 1; + name = "Mining External Airlock"; + opacity = 0 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"rs" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"rF" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"rY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"sF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"sL" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Lavaland Shuttle Airlock" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"sV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"tg" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/mine/production) +"uy" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/mine/laborcamp/security) +"vk" = ( +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"vE" = ( +/obj/item/twohanded/required/kirbyplants/random, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"vP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"xc" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/production) +"zc" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"zS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"CS" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/mine/production) +"Dn" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"DM" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Et" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"EH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"FB" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/machinery/recharger, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"FX" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Gr" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"GC" = ( +/obj/machinery/camera{ + c_tag = "Crew Area Hallway West"; + dir = 1; + network = list("mine") + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Hk" = ( +/obj/structure/displaycase, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"HO" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "Lavaland Shuttle Airlock" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Iv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"IY" = ( /obj/machinery/cryopod{ dir = 4 }, /turf/open/floor/plasteel, /area/mine/laborcamp) +"Ki" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel/white, +/area/mine/living_quarters) +"Ky" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"KS" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"LW" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/mine/living_quarters) +"Mc" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/mine/living_quarters) +"My" = ( +/obj/machinery/door/airlock{ + id_tag = "miningbathroom"; + name = "Restroom" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"MX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"NC" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/displaycase, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"NU" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"OJ" = ( +/obj/structure/table, +/obj/item/cigbutt, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Pd" = ( +/obj/machinery/button/door{ + id = "miningbathroom"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"Pr" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"PR" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/closet/secure_closet/labor_camp_security, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"Qj" = ( +/obj/machinery/computer/shuttle/mining/common{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Qo" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 30 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"Rn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"RD" = ( +/obj/machinery/door/airlock{ + name = "Restroom" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"RR" = ( +/obj/item/bikehorn{ + color = "#000"; + desc = "A horn off of a bicycle. This one has been charred to hell and back, yet somehow it still honks."; + name = "charred bike horn" + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/explored) +"RW" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"Se" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/mine/living_quarters) +"Sj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"SI" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Tp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/living_quarters) +"Ty" = ( +/obj/machinery/door/window/southleft, +/obj/machinery/shower{ + pixel_y = 22 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"Tz" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) +"TW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"TX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Ub" = ( +/obj/structure/statue{ + desc = "A lifelike statue of a horrifying monster."; + dir = 8; + icon = 'icons/mob/lavaland/lavaland_monsters.dmi'; + icon_state = "goliath"; + name = "goliath" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "Uq" = ( /obj/docking_port/stationary{ area_type = /area/lavaland/surface/outdoors; @@ -3559,12 +4398,35 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"UP" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/mine/production) +"US" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Vk" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"Vz" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/mine/production) "Wp" = ( /obj/docking_port/stationary{ - area_type = /area/lavaland/surface/outdoors; dir = 8; dwidth = 3; - height = 5; + height = 10; id = "mining_away"; name = "lavaland mine"; width = 7 @@ -3622,6 +4484,22 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"YT" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/closed/wall, +/area/mine/living_quarters) +"Zt" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) (1,1,1) = {" aa @@ -7712,10 +8590,10 @@ aj aj aj aj -aj -aj -aj -aj +ab +ab +ab +ab aj aj aj @@ -7968,14 +8846,14 @@ aj aj aj aj -aj -aj -aj -aj -aj -aj -aj -aj +ab +ab +ab +ab +ab +ab +ab +ab aj aj aj @@ -8219,21 +9097,21 @@ aj aj aj aj -ai ab +ai aj aj aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab aj aj aj @@ -8473,26 +9351,26 @@ aD bZ aj aj -aD +RR aj ab +ab ai ai aj aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab aj aj aj @@ -8732,23 +9610,23 @@ bZ aj aj aj +ab +ab ai ai -ai -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab aj aj aj @@ -8982,30 +9860,30 @@ aq bj az az -aq +bA ca ca ca -aj -aj -aj -ai -ad -ai -ai -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj +uy +ca +Se +Mc +LW +cM +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab aj aj aj @@ -9229,39 +10107,39 @@ ap ar ar aq -Po -il +IY az az az az az az +el az az -aq +bA cb cw cG -aj -aj -aj -aj -ai +cz +ca +OJ +SI +nG +cM +lU +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj aj aj aj @@ -9492,33 +10370,33 @@ az az aU bb -az -az -az +cN +fo +by by bL cc cx -cG -aj -aj -aj -aj -aj +mi +cE +ca +km +SI +eM +cM +Tp +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj aj aj aj @@ -9745,37 +10623,37 @@ ay aq aE az -az -az -az -az +cl +cN +cN +dG aQ bk az -bz -aq +az +bA cd -cy -cG -aj -aj -aj -aj +cA +fw +cS +ca +nJ +SI +dZ +cM +er +LW +cM +ab +ab +ab +ab +ab +jO +ab +ab ab ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj aj aj aj @@ -10008,31 +10886,31 @@ az bc aq bl -aq bA -aq -aq -aq -aq -aj -aj -aj +bA +bA +bT +cA +qE +cT +bw +eL +dy +ec +dZ +ie +DM +cM +ab +ab +ab +ab +cR +sL +cR ab ab ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj aj aj aj @@ -10265,33 +11143,33 @@ aq bd aq bl -aq -bz -aq -ce -cz -aq -aj -aj -aj +bA +ao +aV +Zt +Tz +cp +sF +cU +EH +dF +EH +EH +es +GC +cM ab ab ab ab +cR +dZ +cR ab ab aj aj aj -ai -ai -aj -aj -aj -aj -aj -aj -aj aj aj aj @@ -10522,28 +11400,28 @@ aW be aW bm -aq +bA bB bM -cf +ce cA -aq -aj -aj -ab -ad -ai -ab -ab -ab -ai -ab -ab -ab -ad -ai -ai -ai +Iv +vk +bw +dZ +dZ +lN +rF +et +dZ +cM +cM +cM +YT +cM +cR +HO +cR aj aj aj @@ -10779,28 +11657,28 @@ aq aq aq aq -aq -aq -aq -cg +bA +bA +ca +cf cB -aq -aj +cA +qq cQ cQ cQ cQ -cR -cR -cR +rs +et +dZ cM +vE +FX +Qj +FX +eL +Dn cR -cR -cR -cM -ai -ai -aj aj aj aj @@ -11037,27 +11915,27 @@ aX aD aD aD -aD -aq -ch +aw +bw +cg cC -aq -aj +FB +PR cQ dg dg cQ dZ -dZ +et dZ cM fa -fo -fx -cM -ab -aj -aj +dZ +dZ +dZ +dZ +dZ +cR aj aj aj @@ -11294,27 +12172,27 @@ aD aD aD aD -aD -aq -aq -aq -aq -aj +aw +bw +bw +bw +bw +bw cQ -dh -dx +dp +dH cQ ea -ep +et ek cM fb dZ -fy +fz +fz +dZ +Ub cR -ab -aj -aj aj aj aj @@ -11541,7 +12419,7 @@ an an an an -aD +an aq WA aq @@ -11559,19 +12437,19 @@ aj ab cQ di -dy dP -eb -eq +dU +rY +eu eK eQ ef -fp +TX fz +fz +dZ +dZ cR -ab -aj -aj aj aj aj @@ -11819,16 +12697,16 @@ dj dz cQ ec -er +ev eL cM fc +zS dZ -fA -cR -ab -ai -ai +dZ +dZ +eM +cM aj aj aj @@ -12076,17 +12954,17 @@ dk dA cQ ed -er +ew eM cM fd fq fB +pm +Hk +NC cM ai -ad -ai -ai ab aj aj @@ -12333,7 +13211,7 @@ cQ cQ cQ ee -er +ev dZ cM cM @@ -12590,8 +13468,8 @@ dl dB cM dZ -er -dZ +ex +fp cM fe fr @@ -12843,11 +13721,11 @@ aj aj ab cR -dm +Ki dC dQ ea -er +ev dZ cM ff @@ -13093,7 +13971,7 @@ aD aT an aD -aD +fx aj aj aj @@ -13104,7 +13982,7 @@ dm dD dR ef -es +ey dZ cM fg @@ -13349,9 +14227,9 @@ an an an an -aD -aD -aD +fx +fx +an aj aj ai @@ -13361,14 +14239,14 @@ dn dE dQ ec -er +ev dZ eL fh ft eL fh -ec +zc eL fh ec @@ -13617,8 +14495,8 @@ cM cM cM cM -eg -et +ei +ez eN eN fi @@ -13627,7 +14505,7 @@ eN fi fN eN -fi +NU fp cR ab @@ -13865,18 +14743,18 @@ an an an an -an -aD +aj +aj aj aj cM -cS -do -dF +cX +ds +dS cM eh -er -dZ +ex +fp cM cM dQ @@ -13884,8 +14762,8 @@ dQ cM cM cM -cR -cR +RD +cM cM ai ab @@ -14120,29 +14998,29 @@ an an an an -an -an -aD -aD aj aj -cN -cT +aj +aj +aj +aj +cM +cY +cV cV -dG cM ea -er +ev eM cM fj fk -fk +qZ fI cM -ab -ab -ab +Ty +nO +cM ai ad ai @@ -14375,21 +15253,21 @@ an an an an -an -an -an -an -aD -aD +ab +aj +aj +aj +aj +aj aj aj cM -cU -dp -dH -dS -ei -eu +dh +dt +dT +eb +ep +eA ek dQ fk @@ -14397,9 +15275,9 @@ fk fC fk cM -ab -aj -ab +nZ +Sj +cM ab ai ai @@ -14631,13 +15509,13 @@ an an an an -an -an -an -an -an -aD -aD +ab +aj +aj +aj +aj +ab +ab aj ab cM @@ -14646,17 +15524,17 @@ dq dI cM ej -ev -eK +Et +jI eR fl fu fD fJ cM -ai -aj -aj +cM +My +cM aj aj aj @@ -14888,22 +15766,22 @@ an an an an -an -an -an -an -aD -aD aj aj +aj +ab +ab +ab +ab +ab ab cM cW dr dr cM -dZ -er +US +ew eL dQ fk @@ -14911,9 +15789,9 @@ fk fE fK cM -ad -aj -aj +nE +Pd +cM aj aj aj @@ -15144,23 +16022,23 @@ aj an an an -an -an -aD -aD -aD -aD -aj aj aj aj +ab +ab +ab +ab +ab +ab +ab cM cM cM cM cM dZ -er +ev dZ cM fm @@ -15168,9 +16046,9 @@ fk fF fk cM -ai -aj -aj +gX +oZ +cM aj aj aj @@ -15399,25 +16277,25 @@ aj aj aj aj -aj -aj -aD -aD -aD -aD -aj -aj -aj -aj -aj -aj +ab +ab aj aj ab ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj cR dZ -er +ev dZ cM fn @@ -15425,9 +16303,9 @@ fv fG fL cM -ai -ai -aj +cM +cM +cM aj aj aj @@ -15661,20 +16539,20 @@ aj aj aj aj -aj -aj -aj +ab +ab +ab +ab +ab +ab +ab +ab +ab ab aj -aj -aj -aj -aj -aj -ab cR ek -ew +eB eO cM cR @@ -15917,21 +16795,21 @@ aj aj aj aj -aj -aj -aj -aj ab -aj ab -aj -aj -aj -aj +ab +ab +ab +ab +ab +ab +ab +ab +ab aj cR cR -ex +eC cR cR ab @@ -16174,8 +17052,10 @@ aj aj aj aj -aj -aj +ab +ab +ab +ab ab ab ab @@ -16184,11 +17064,9 @@ ab ab ab aj -aj -aj -aj +ab cR -ey +eE cR ab ab @@ -16445,7 +17323,7 @@ aj aj aj cR -er +ev cR ab aj @@ -16702,9 +17580,9 @@ aj aj aj cR -er +ev cR -ab +aj aj aj aj @@ -16959,9 +17837,9 @@ ab aj aj cR -er +ev cR -ab +aj aj aj aj @@ -17214,11 +18092,11 @@ ab ab ab aj -ab +aj br -ez +vP br -ab +aj aj aj aj @@ -17471,11 +18349,11 @@ ab ab aj aj -ab +aj br -ez +vP br -ab +aj aj aj aj @@ -17730,9 +18608,9 @@ aj aj ab br -ez +vP br -ab +aj aj aj aj @@ -17987,10 +18865,10 @@ aj aj ab br -bR +eF br ab -ab +aj aj aj aj @@ -18244,7 +19122,7 @@ aj ab br br -eA +fy br br ab @@ -18499,14 +19377,14 @@ bq bq bq bq -br +ns cH -eB +fU cD br bq -am -am +ab +ab aj aj aj @@ -18748,23 +19626,23 @@ aj ab bq bC +Gr bP -cl -bP +TW cH cO -cX +do ck dJ -dT -bP -ez +CS +cn +vP bP eS bq ab -aj -aj +ab +ab aj aj aj @@ -19005,24 +19883,24 @@ aj ab br bD -bQ -cm -cE -cE -cE -cY -cE -cE -cE -cE -eC +bz +ch +co +cy +cy +MX +sV +cy +eg +eq +fX eP eT bq ab -aj -aj -aj +ab +ab +ab aj aj aj @@ -19262,26 +20140,26 @@ ab ab br bE -bR +bQ cn cF cI cP cn +Rn bP -bP -bP -bP +tg +lB eD bP eU -br +bq +bq +bq +bq +xc +ab ab -aj -aj -aj -aj -aj aj aj aj @@ -19519,26 +20397,26 @@ bf bf bf bF -bS +bR bF bf cJ bq cZ -ds +dx dK -dU -cF -eE -cn +tg +bP +eG +bP +eV +br +KS eV br ab -aj -aj -aj -aj -aj +ab +ai aj aj aj @@ -19776,27 +20654,27 @@ bf bn bs bG -bT -co +bS +ci bf cK bq bq -br -bq -dV -el -eF -dV -bq +Vz bq +Vz +bP +eG +bP +UP +pg +RW +UP +rf ab ab -aj -aj -aj -aj -aj +ai +ai aj aj aj @@ -20031,10 +20909,10 @@ ab ab bg bo -bt -bt +fA +il bU -cp +cm bf cL bq @@ -20042,18 +20920,18 @@ da du dL cH -ck +Vk eG -cD bP +cH +br +Pr +Qo br ab ab -aj -aj -aj -aj -aj +ab +ai aj aj aj @@ -20304,13 +21182,13 @@ eH cF eW bq +bq +bq +bq +xc +ab ab ab -aj -aj -aj -aj -aj aj aj aj @@ -20556,18 +21434,18 @@ dc bP dM dW -dW +Ky eI bq eX bq ab ab -aj -aj -aj -aj -aj +ab +ab +ab +ab +ab aj aj aj @@ -20820,11 +21698,11 @@ eY bq ab ab -aj -aj -aj -aj -aj +ab +ab +ab +ab +ab aj aj aj @@ -21077,10 +21955,10 @@ eY bq ab ab -aj -aj -aj -aj +ab +ab +ab +ab aj aj aj @@ -21335,10 +22213,10 @@ bq ab ab ab -aj -aj -aj -aj +ab +ab +ab +ab aj aj aj @@ -21592,10 +22470,10 @@ bq ab ab ab -aj -aj -aj -aj +ab +ab +ab +ab ab aj aj @@ -21849,10 +22727,10 @@ ab ab ab ab -aj -aj ab -aj +ab +ab +ab aj aj aj @@ -22106,9 +22984,9 @@ ab ab ab ab -aj -aj -aj +ab +ab +ab aj aj aj @@ -22363,8 +23241,8 @@ ab ab ab ab -aj -aj +ab +ab ab aj aj @@ -22620,8 +23498,8 @@ aj ab ab ab -aj -aj +ab +ab ab aj aj @@ -22877,7 +23755,7 @@ ai ab ab ab -aj +ab ab ab ab diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 84ea2dfca1..2947395ccb 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -25468,6 +25468,7 @@ "biw" = ( /obj/machinery/recharge_station, /obj/effect/turf_decal/bot, +/obj/effect/landmark/start/cyborg, /turf/open/floor/plasteel/dark, /area/science/robotics/mechbay) "bix" = ( @@ -26658,6 +26659,7 @@ /obj/effect/turf_decal/tile/green{ dir = 4 }, +/obj/effect/landmark/start/roboticist, /turf/open/floor/plasteel, /area/science/robotics/lab) "blJ" = ( @@ -27579,6 +27581,7 @@ /area/science/robotics/lab) "bnQ" = ( /obj/effect/turf_decal/bot, +/obj/effect/landmark/start/cyborg, /turf/open/floor/plasteel, /area/science/robotics/lab) "bnR" = ( @@ -28095,8 +28098,8 @@ /turf/open/floor/plasteel/dark, /area/science/robotics/lab) "boY" = ( -/obj/effect/landmark/start/roboticist, /obj/effect/turf_decal/bot, +/obj/effect/landmark/start/cyborg, /turf/open/floor/plasteel, /area/science/robotics/lab) "boZ" = ( @@ -98808,8 +98811,8 @@ beI bkt blH bmO -bnQ -bnQ +boY +boY bqi bry bsZ @@ -99065,7 +99068,7 @@ bju bkt blI bmO -bnQ +boY boY bqi brz diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 9a94fd3f61..ee4288d7fc 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -7891,6 +7891,10 @@ }, /turf/open/floor/engine/cult, /area/wizard_station) +"sa" = ( +/obj/item/hilbertshotel/ghostdojo, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "sc" = ( /obj/docking_port/stationary{ area_type = /area/syndicate_mothership/control; @@ -47751,7 +47755,7 @@ Of QF Nd Sd -Sd +sa Nd WN Ur diff --git a/_maps/shuttles/mining_common_meta.dmm b/_maps/shuttles/mining_common_meta.dmm new file mode 100644 index 0000000000..f04f8e1a3b --- /dev/null +++ b/_maps/shuttles/mining_common_meta.dmm @@ -0,0 +1,124 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/mining) +"b" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/mining) +"c" = ( +/obj/structure/table, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/mining) +"d" = ( +/obj/machinery/computer/shuttle/mining/common, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/mining) +"e" = ( +/turf/open/floor/mineral/titanium, +/area/shuttle/mining) +"f" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/mining) +"g" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/mining) +"h" = ( +/obj/machinery/door/airlock/titanium{ + name = "Lavaland Shuttle Airlock" + }, +/obj/docking_port/mobile{ + dir = 8; + dwidth = 3; + height = 5; + id = "mining_common"; + name = "lavaland shuttle"; + port_direction = 4; + width = 7 + }, +/turf/open/floor/plating, +/area/shuttle/mining) +"i" = ( +/obj/structure/closet/crate, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/mining) +"j" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/mining) +"k" = ( +/obj/structure/ore_box, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/mining) +"l" = ( +/obj/structure/shuttle/engine/propulsion/burst, +/turf/open/floor/plating/airless, +/area/shuttle/mining) +"Q" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/mining) + +(1,1,1) = {" +a +a +b +a +b +a +a +"} +(2,1,1) = {" +a +c +e +g +f +i +a +"} +(3,1,1) = {" +b +d +Q +e +f +j +l +"} +(4,1,1) = {" +a +c +e +e +f +k +a +"} +(5,1,1) = {" +a +a +b +h +b +a +a +"} diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index e29be375e6..2b19610040 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -72,9 +72,6 @@ #define MILK_RATE_MULT 1 #define MILK_EFFICIENCY 1 -#define AROUSAL_MINIMUM_DEFAULT 0 -#define AROUSAL_MAXIMUM_DEFAULT 100 -#define AROUSAL_START_VALUE 1 //Individual logging define #define INDIVIDUAL_LOOC_LOG "LOOC log" @@ -82,9 +79,6 @@ #define ADMIN_IC(client) "(IC)"//marks and adminhelp as an IC issue #define ADMIN_REJECT(client) "(REJT)"//Rejects an adminhelp for being unclear or otherwise unhelpful. resets their adminhelp timer -//Damage stuffs -#define AROUSAL "arousal" - //Citadel istypes #define isgenital(A) (istype(A, /obj/item/organ/genital)) @@ -117,6 +111,7 @@ #define NEVER_HYPNO (1<<8) #define NO_APHRO (1<<9) #define NO_ASS_SLAP (1<<10) +#define BIMBOFICATION (1<<11) #define TOGGLES_CITADEL (EATING_NOISES|DIGESTION_NOISES|BREAST_ENLARGEMENT|PENIS_ENLARGEMENT) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index bf2646d03e..cc1b474c49 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -197,3 +197,9 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define TOTAL_MASS_HAND_REPLACEMENT 5 //standard punching stamina cost. most hand replacements are huge items anyway. #define TOTAL_MASS_MEDIEVAL_WEAPON 3.6 //very, very generic average sword/warpick/etc. weight in pounds. #define TOTAL_MASS_TOY_SWORD 1.5 + +//bullet_act() return values +#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting. +#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting. +#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default. +#define BULLET_ACT_TURF "TURF" //It hit us but it should hit something on the same turf too. Usually used for turfs. \ No newline at end of file diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 3c72454af6..20679a95e6 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -292,6 +292,7 @@ //Nanites #define COMSIG_HAS_NANITES "has_nanites" //() returns TRUE if nanites are found +#define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy" //() returns TRUE if nanites have stealth #define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs" //(list/nanite_programs) - makes the input list a copy the nanites' program list #define COMSIG_NANITE_SET_VOLUME "nanite_set_volume" //(amount) Sets current nanite volume to the given amount #define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust" //(amount) Adjusts nanite volume by the given amount @@ -300,6 +301,7 @@ #define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" //(amount) Sets safety threshold to the given amount #define COMSIG_NANITE_SET_REGEN "nanite_set_regen" //(amount) Sets regeneration rate to the given amount #define COMSIG_NANITE_SIGNAL "nanite_signal" //(code(1-9999)) Called when sending a nanite signal to a mob. +#define COMSIG_NANITE_COMM_SIGNAL "nanite_comm_signal" //(comm_code(1-9999), comm_message) Called when sending a nanite comm signal to a mob. #define COMSIG_NANITE_SCAN "nanite_scan" //(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected #define COMSIG_NANITE_UI_DATA "nanite_ui_data" //(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs #define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" //(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 839b690b37..a7d2670747 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -60,6 +60,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define FLYING (1<<1) #define VENTCRAWLING (1<<2) #define FLOATING (1<<3) +#define UNSTOPPABLE (1<<4) //When moving, will Bump()/Cross()/Uncross() everything, but won't be stopped. //Fire and Acid stuff, for resistance_flags #define LAVA_PROOF (1<<0) diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 2756be76fb..f4954f8f05 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -110,6 +110,7 @@ #define HIDENECK (1<<10) #define HIDETAUR (1<<11) //gotta hide that snowflake #define HIDESNOUT (1<<12) //or do we actually hide our snoots +#define HIDEACCESSORY (1<<13) //hides the jumpsuit accessory. //bitflags for clothing coverage - also used for limbs #define HEAD (1<<0) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index d68fb9b490..e2d93aebf5 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -25,30 +25,6 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define NOT_IMPLEMENTED "NOT_IMPLEMENTED" -#define MIDNIGHT_ROLLOVER 864000 //number of deciseconds in a day - -#define JANUARY 1 -#define FEBRUARY 2 -#define MARCH 3 -#define APRIL 4 -#define MAY 5 -#define JUNE 6 -#define JULY 7 -#define AUGUST 8 -#define SEPTEMBER 9 -#define OCTOBER 10 -#define NOVEMBER 11 -#define DECEMBER 12 - -//Select holiday names -- If you test for a holiday in the code, make the holiday's name a define and test for that instead -#define NEW_YEAR "New Year" -#define VALENTINES "Valentine's Day" -#define APRIL_FOOLS "April Fool's Day" -#define EASTER "Easter" -#define HALLOWEEN "Halloween" -#define CHRISTMAS "Christmas" -#define FESTIVE_SEASON "Festive Season" - //Human Overlays Indexes///////// //LOTS OF CIT CHANGES HERE. BE CAREFUL WHEN UPSTREAM ADDS MORE LAYERS #define MUTATIONS_LAYER 32 //mutations. Tk headglows, cold resistance glow, etc diff --git a/code/__DEFINES/move_force.dm b/code/__DEFINES/move_force.dm new file mode 100644 index 0000000000..ec31388c72 --- /dev/null +++ b/code/__DEFINES/move_force.dm @@ -0,0 +1,20 @@ +//Defaults +#define MOVE_FORCE_DEFAULT 1000 +#define MOVE_RESIST_DEFAULT 1000 +#define PULL_FORCE_DEFAULT 1000 + +//Factors/modifiers +#define MOVE_FORCE_PULL_RATIO 1 //Same move force to pull objects +#define MOVE_FORCE_PUSH_RATIO 1 //Same move force to normally push +#define MOVE_FORCE_FORCEPUSH_RATIO 2 //2x move force to forcefully push +#define MOVE_FORCE_CRUSH_RATIO 3 //3x move force to do things like crush objects +#define MOVE_FORCE_THROW_RATIO 1 //Same force throw as resist to throw objects + +#define MOVE_FORCE_OVERPOWERING (MOVE_FORCE_DEFAULT * MOVE_FORCE_CRUSH_RATIO * 10) +#define MOVE_FORCE_EXTREMELY_STRONG (MOVE_FORCE_DEFAULT * MOVE_FORCE_CRUSH_RATIO * 3) +#define MOVE_FORCE_VERY_STRONG ((MOVE_FORCE_DEFAULT * MOVE_FORCE_CRUSH_RATIO) - 1) +#define MOVE_FORCE_STRONG (MOVE_FORCE_DEFAULT * 2) +#define MOVE_FORCE_NORMAL MOVE_FORCE_DEFAULT +#define MOVE_FORCE_WEAK (MOVE_FORCE_DEFAULT / 2) +#define MOVE_FORCE_VERY_WEAK ((MOVE_FORCE_DEFAULT / MOVE_FORCE_CRUSH_RATIO) + 1) +#define MOVE_FORCE_EXTREMELY_WEAK (MOVE_FORCE_DEFAULT / (MOVE_FORCE_CRUSH_RATIO * 3)) \ No newline at end of file diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm index f13f13510b..e1fff1879e 100644 --- a/code/__DEFINES/time.dm +++ b/code/__DEFINES/time.dm @@ -1,3 +1,27 @@ +#define MIDNIGHT_ROLLOVER 864000 //number of deciseconds in a day + +#define JANUARY 1 +#define FEBRUARY 2 +#define MARCH 3 +#define APRIL 4 +#define MAY 5 +#define JUNE 6 +#define JULY 7 +#define AUGUST 8 +#define SEPTEMBER 9 +#define OCTOBER 10 +#define NOVEMBER 11 +#define DECEMBER 12 + +//Select holiday names -- If you test for a holiday in the code, make the holiday's name a define and test for that instead +#define NEW_YEAR "New Year" +#define VALENTINES "Valentine's Day" +#define APRIL_FOOLS "April Fool's Day" +#define EASTER "Easter" +#define HALLOWEEN "Halloween" +#define CHRISTMAS "Christmas" +#define FESTIVE_SEASON "Festive Season" + /* Days of the week to make it easier to reference them. diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index b7a5975ad5..033636017d 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -161,9 +161,10 @@ #define TRAIT_TAGGER "tagger" #define TRAIT_PHOTOGRAPHER "photographer" #define TRAIT_MUSICIAN "musician" +#define TRAIT_PERMABONER "permanent_arousal" +#define TRAIT_NEVERBONER "never_aroused" #define TRAIT_NYMPHO "nymphomania" #define TRAIT_MASO "masochism" -#define TRAIT_EXHIBITIONIST "exhibitionist" #define TRAIT_HIGH_BLOOD "high_blood" #define TRAIT_PARA "paraplegic" #define TRAIT_EMPATH "empath" @@ -172,6 +173,7 @@ #define TRAIT_AUTO_CATCH_ITEM "auto_catch_item" #define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman. #define TRAIT_FREESPRINT "free_sprinting" +#define TRAIT_NO_TELEPORT "no-teleport" //you just can't #define TRAIT_NO_ALCOHOL "alcohol_intolerance" // common trait sources @@ -194,6 +196,7 @@ #define STATUS_EFFECT_TRAIT "status-effect" #define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention #define GHOSTROLE_TRAIT "ghostrole" +#define APHRO_TRAIT "aphro" // unique trait sources, still defines #define STATUE_MUTE "statue" @@ -232,4 +235,5 @@ #define NUKEOP_ANTAGONIST "nukeop-antagonist" #define MADE_UNCLONEABLE "made-uncloneable" #define NUKEOP_TRAIT "nuke-op" +#define MEGAFAUNA_TRAIT "megafauna" #define DEATHSQUAD_TRAIT "deathsquad" diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm index e874097e88..c0acf4c5a5 100644 --- a/code/__HELPERS/_cit_helpers.dm +++ b/code/__HELPERS/_cit_helpers.dm @@ -99,7 +99,7 @@ GLOBAL_LIST_INIT(meat_types, list( "Mammalian" = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/mammal, "Aquatic" = /obj/item/reagent_containers/food/snacks/carpmeat/aquatic, "Avian" = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/avian, - "Inesct" = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/insect)) + "Insect" = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/insect)) //Crew objective and miscreants stuff GLOBAL_VAR_INIT(miscreants_allowed, FALSE) diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 36d27ba73a..41dfce6261 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -120,6 +120,10 @@ if (CONFIG_GET(flag/log_vote)) WRITE_LOG(GLOB.world_game_log, "VOTE: [text]") +/proc/log_craft(text) + if (CONFIG_GET(flag/log_craft)) + WRITE_LOG(GLOB.world_crafting_log, "CRAFT: [text]") + /proc/log_topic(text) WRITE_LOG(GLOB.world_game_log, "TOPIC: [text]") diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 49825bcb50..19ee2b2a5a 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -178,7 +178,7 @@ if(!C.credits) C.RollCredits() C.playtitlemusic(40) - + CONFIG_SET(flag/suicide_allowed,TRUE) // EORG suicides allowed var/popcount = gather_roundend_feedback() display_report(popcount) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 3a9491c4d5..012a7fa02f 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1276,7 +1276,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) invisibility = 101 density = FALSE see_in_dark = 1e6 - anchored = TRUE + move_resist = INFINITY var/ready_to_die = FALSE /mob/dview/Initialize() //Properly prevents this mob from gaining huds or joining any global lists diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 5d95a4eaae..c98faaa4fb 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -101,7 +101,10 @@ GLOBAL_LIST_INIT(bitfields, list( ), "movement_type" = list( "GROUND" = GROUND, - "FLYING" = FLYING + "FLYING" = FLYING, + "VENTCRAWLING" = VENTCRAWLING, + "FLOATING" = FLOATING, + "UNSTOPPABLE" = UNSTOPPABLE ), "resistance_flags" = list( "LAVA_PROOF" = LAVA_PROOF, diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index dc8a6799cf..f9b9927e72 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -1,67 +1,69 @@ -GLOBAL_VAR(log_directory) -GLOBAL_PROTECT(log_directory) -GLOBAL_VAR(world_game_log) -GLOBAL_PROTECT(world_game_log) -GLOBAL_VAR(world_runtime_log) -GLOBAL_PROTECT(world_runtime_log) -GLOBAL_VAR(world_qdel_log) -GLOBAL_PROTECT(world_qdel_log) -GLOBAL_VAR(world_attack_log) -GLOBAL_PROTECT(world_attack_log) -GLOBAL_VAR(world_href_log) -GLOBAL_PROTECT(world_href_log) -GLOBAL_VAR(round_id) -GLOBAL_PROTECT(round_id) -GLOBAL_VAR(config_error_log) -GLOBAL_PROTECT(config_error_log) -GLOBAL_VAR(sql_error_log) -GLOBAL_PROTECT(sql_error_log) -GLOBAL_VAR(world_pda_log) -GLOBAL_PROTECT(world_pda_log) -GLOBAL_VAR(world_telecomms_log) -GLOBAL_PROTECT(world_telecomms_log) -GLOBAL_VAR(world_manifest_log) -GLOBAL_PROTECT(world_manifest_log) -GLOBAL_VAR(query_debug_log) -GLOBAL_PROTECT(query_debug_log) -GLOBAL_VAR(world_job_debug_log) -GLOBAL_PROTECT(world_job_debug_log) -GLOBAL_VAR(world_virus_log) -GLOBAL_PROTECT(world_virus_log) -GLOBAL_VAR(world_map_error_log) -GLOBAL_PROTECT(world_map_error_log) -GLOBAL_VAR(subsystem_log) -GLOBAL_PROTECT(subsystem_log) - -GLOBAL_LIST_EMPTY(bombers) -GLOBAL_PROTECT(bombers) -GLOBAL_LIST_EMPTY(admin_log) -GLOBAL_PROTECT(admin_log) -GLOBAL_LIST_EMPTY(lastsignalers) //keeps last 100 signals here in format: "[src] used [REF(src)] @ location [src.loc]: [freq]/[code]" -GLOBAL_PROTECT(lastsignalers) -GLOBAL_LIST_EMPTY(lawchanges) //Stores who uploaded laws to which silicon-based lifeform, and what the law was -GLOBAL_PROTECT(lawchanges) - -GLOBAL_VAR(tgui_log) -GLOBAL_PROTECT(tgui_log) - -GLOBAL_LIST_EMPTY(combatlog) -GLOBAL_PROTECT(combatlog) -GLOBAL_LIST_EMPTY(IClog) -GLOBAL_PROTECT(IClog) -GLOBAL_LIST_EMPTY(OOClog) -GLOBAL_PROTECT(OOClog) -GLOBAL_LIST_EMPTY(adminlog) -GLOBAL_PROTECT(adminlog) - -GLOBAL_LIST_EMPTY(active_turfs_startlist) - -/////Picture logging -GLOBAL_VAR(picture_log_directory) -GLOBAL_PROTECT(picture_log_directory) - -GLOBAL_VAR_INIT(picture_logging_id, 1) -GLOBAL_PROTECT(picture_logging_id) -GLOBAL_VAR(picture_logging_prefix) -GLOBAL_PROTECT(picture_logging_prefix) -///// +GLOBAL_VAR(log_directory) +GLOBAL_PROTECT(log_directory) +GLOBAL_VAR(world_game_log) +GLOBAL_PROTECT(world_game_log) +GLOBAL_VAR(world_runtime_log) +GLOBAL_PROTECT(world_runtime_log) +GLOBAL_VAR(world_qdel_log) +GLOBAL_PROTECT(world_qdel_log) +GLOBAL_VAR(world_attack_log) +GLOBAL_PROTECT(world_attack_log) +GLOBAL_VAR(world_href_log) +GLOBAL_PROTECT(world_href_log) +GLOBAL_VAR(round_id) +GLOBAL_PROTECT(round_id) +GLOBAL_VAR(config_error_log) +GLOBAL_PROTECT(config_error_log) +GLOBAL_VAR(sql_error_log) +GLOBAL_PROTECT(sql_error_log) +GLOBAL_VAR(world_pda_log) +GLOBAL_PROTECT(world_pda_log) +GLOBAL_VAR(world_telecomms_log) +GLOBAL_PROTECT(world_telecomms_log) +GLOBAL_VAR(world_manifest_log) +GLOBAL_PROTECT(world_manifest_log) +GLOBAL_VAR(query_debug_log) +GLOBAL_PROTECT(query_debug_log) +GLOBAL_VAR(world_job_debug_log) +GLOBAL_PROTECT(world_job_debug_log) +GLOBAL_VAR(world_virus_log) +GLOBAL_PROTECT(world_virus_log) +GLOBAL_VAR(world_map_error_log) +GLOBAL_PROTECT(world_map_error_log) +GLOBAL_VAR(subsystem_log) +GLOBAL_PROTECT(subsystem_log) +GLOBAL_VAR(world_crafting_log) +GLOBAL_PROTECT(world_crafting_log) + +GLOBAL_LIST_EMPTY(bombers) +GLOBAL_PROTECT(bombers) +GLOBAL_LIST_EMPTY(admin_log) +GLOBAL_PROTECT(admin_log) +GLOBAL_LIST_EMPTY(lastsignalers) //keeps last 100 signals here in format: "[src] used [REF(src)] @ location [src.loc]: [freq]/[code]" +GLOBAL_PROTECT(lastsignalers) +GLOBAL_LIST_EMPTY(lawchanges) //Stores who uploaded laws to which silicon-based lifeform, and what the law was +GLOBAL_PROTECT(lawchanges) + +GLOBAL_VAR(tgui_log) +GLOBAL_PROTECT(tgui_log) + +GLOBAL_LIST_EMPTY(combatlog) +GLOBAL_PROTECT(combatlog) +GLOBAL_LIST_EMPTY(IClog) +GLOBAL_PROTECT(IClog) +GLOBAL_LIST_EMPTY(OOClog) +GLOBAL_PROTECT(OOClog) +GLOBAL_LIST_EMPTY(adminlog) +GLOBAL_PROTECT(adminlog) + +GLOBAL_LIST_EMPTY(active_turfs_startlist) + +/////Picture logging +GLOBAL_VAR(picture_log_directory) +GLOBAL_PROTECT(picture_log_directory) + +GLOBAL_VAR_INIT(picture_logging_id, 1) +GLOBAL_PROTECT(picture_logging_id) +GLOBAL_VAR(picture_logging_prefix) +GLOBAL_PROTECT(picture_logging_prefix) +///// diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index f8df958eea..f054cb0c8e 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -61,9 +61,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list( // subtypes can override this to force a specific UI style var/ui_style - //Citadel stuff - var/obj/screen/arousal - /datum/hud/New(mob/owner) mymob = owner diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 04da0ef03d..23e820457c 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -336,11 +336,6 @@ healths = new /obj/screen/healths() healths.hud = src infodisplay += healths - //CIT CHANGE - adds arousal and stamina to hud - arousal = new /obj/screen/arousal() - arousal.icon_state = (owner.canbearoused == 1 ? "arousal0" : "") - arousal.hud = src - infodisplay += arousal staminas = new /obj/screen/staminas() staminas.hud = src diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index aeca31ebd2..6efc9eab12 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -408,3 +408,5 @@ /datum/config_entry/number/dropped_modes config_entry_value = 3 + +/datum/config_entry/flag/suicide_allowed diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 2a08ce77a8..2b3d9d2f72 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -43,6 +43,8 @@ /datum/config_entry/flag/log_vote // log voting +/datum/config_entry/flag/log_craft // log crafting + /datum/config_entry/flag/log_whisper // log client whisper /datum/config_entry/flag/log_attack // log attack messages diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 48da15f67e..d757b00493 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -55,6 +55,7 @@ SUBSYSTEM_DEF(throwing) var/dist_y var/dx var/dy + var/force = MOVE_FORCE_DEFAULT var/pure_diagonal var/diagonal_error var/datum/callback/callback diff --git a/code/datums/action.dm b/code/datums/action.dm index cb56c26b91..8659a9e7c4 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -544,6 +544,9 @@ cooldown = world.time owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE) +/datum/action/item_action/flash + name = "Flash" + //Preset for spells /datum/action/spell_action check_flags = 0 diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm index 89c4deb2e9..e1c96121c7 100644 --- a/code/datums/components/nanites.dm +++ b/code/datums/components/nanites.dm @@ -37,6 +37,7 @@ /datum/component/nanites/RegisterWithParent() . = ..() RegisterSignal(parent, COMSIG_HAS_NANITES, .proc/confirm_nanites) + RegisterSignal(parent, COMSIG_NANITE_IS_STEALTHY, .proc/check_stealth) RegisterSignal(parent, COMSIG_NANITE_UI_DATA, .proc/nanite_ui_data) RegisterSignal(parent, COMSIG_NANITE_GET_PROGRAMS, .proc/get_programs) RegisterSignal(parent, COMSIG_NANITE_SET_VOLUME, .proc/set_volume) @@ -57,10 +58,12 @@ RegisterSignal(parent, COMSIG_LIVING_MINOR_SHOCK, .proc/on_minor_shock) RegisterSignal(parent, COMSIG_SPECIES_GAIN, .proc/check_viable_biotype) RegisterSignal(parent, COMSIG_NANITE_SIGNAL, .proc/receive_signal) + RegisterSignal(parent, COMSIG_NANITE_COMM_SIGNAL, .proc/receive_comm_signal) /datum/component/nanites/UnregisterFromParent() . = ..() UnregisterSignal(parent, list(COMSIG_HAS_NANITES, + COMSIG_NANITE_IS_STEALTHY, COMSIG_NANITE_UI_DATA, COMSIG_NANITE_GET_PROGRAMS, COMSIG_NANITE_SET_VOLUME, @@ -79,7 +82,8 @@ COMSIG_LIVING_MINOR_SHOCK, COMSIG_MOVABLE_HEAR, COMSIG_SPECIES_GAIN, - COMSIG_NANITE_SIGNAL)) + COMSIG_NANITE_SIGNAL, + COMSIG_NANITE_COMM_SIGNAL)) /datum/component/nanites/Destroy() STOP_PROCESSING(SSnanites, src) @@ -188,6 +192,9 @@ var/datum/nanite_program/NP = X NP.on_minor_shock() +/datum/component/nanites/proc/check_stealth(datum/source) + return stealth + /datum/component/nanites/proc/on_death(datum/source, gibbed) for(var/X in programs) var/datum/nanite_program/NP = X @@ -198,6 +205,12 @@ var/datum/nanite_program/NP = X NP.receive_signal(code, source) +/datum/component/nanites/proc/receive_comm_signal(datum/source, comm_code, comm_message, comm_source = "an unidentified source") + for(var/X in programs) + if(istype(X, /datum/nanite_program/triggered/comm)) + var/datum/nanite_program/triggered/comm/NP = X + NP.receive_comm_signal(comm_code, comm_message, comm_source) + /datum/component/nanites/proc/check_viable_biotype() if(!(MOB_ORGANIC in host_mob.mob_biotypes) && !(MOB_UNDEAD in host_mob.mob_biotypes)) qdel(src) //bodytype no longer sustains nanites diff --git a/code/datums/components/spawner.dm b/code/datums/components/spawner.dm new file mode 100644 index 0000000000..fe86b60375 --- /dev/null +++ b/code/datums/components/spawner.dm @@ -0,0 +1,49 @@ +/datum/component/spawner + var/mob_types = list(/mob/living/simple_animal/hostile/carp) + var/spawn_time = 300 //30 seconds default + var/list/spawned_mobs = list() + var/spawn_delay = 0 + var/max_mobs = 5 + var/spawn_text = "emerges from" + var/list/faction = list("mining") + +/datum/component/spawner/Initialize(_mob_types, _spawn_time, _faction, _spawn_text, _max_mobs) + if(_spawn_time) + spawn_time=_spawn_time + if(_mob_types) + mob_types=_mob_types + if(_faction) + faction=_faction + if(_spawn_text) + spawn_text=_spawn_text + if(_max_mobs) + max_mobs=_max_mobs + + RegisterSignal(parent, list(COMSIG_PARENT_QDELETING), .proc/stop_spawning) + START_PROCESSING(SSprocessing, src) + +/datum/component/spawner/process() + try_spawn_mob() + + +/datum/component/spawner/proc/stop_spawning(force, hint) + STOP_PROCESSING(SSprocessing, src) + for(var/mob/living/simple_animal/L in spawned_mobs) + if(L.nest == src) + L.nest = null + spawned_mobs = null + +/datum/component/spawner/proc/try_spawn_mob() + var/atom/P = parent + if(spawned_mobs.len >= max_mobs) + return 0 + if(spawn_delay > world.time) + return 0 + spawn_delay = world.time + spawn_time + var/chosen_mob_type = pick(mob_types) + var/mob/living/simple_animal/L = new chosen_mob_type(P.loc) + L.flags_1 |= (P.flags_1 & ADMIN_SPAWNED_1) + spawned_mobs += L + L.nest = src + L.faction = src.faction + P.visible_message("[L] [spawn_text] [P].") \ No newline at end of file diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 5caa491e4c..e387acbd0b 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -96,7 +96,6 @@ CLONE:[M.getCloneLoss()] BRAIN:[M.getOrganLoss(ORGAN_SLOT_BRAIN)] STAMINA:[M.getStaminaLoss()] - AROUSAL:[M.getArousalLoss()] "} if(GLOB.Debug2) atomsnowflake += {" @@ -1359,9 +1358,6 @@ if("stamina") L.adjustStaminaLoss(amount) newamt = L.getStaminaLoss() - if("arousal") - L.adjustArousalLoss(amount) - newamt = L.getArousalLoss() if("heart") L.adjustOrganLoss(ORGAN_SLOT_HEART, amount) newamt = L.getOrganLoss(ORGAN_SLOT_HEART) diff --git a/code/datums/elements/dusts_on_catatonia.dm b/code/datums/elements/dusts_on_catatonia.dm new file mode 100644 index 0000000000..f5ca5722c4 --- /dev/null +++ b/code/datums/elements/dusts_on_catatonia.dm @@ -0,0 +1,26 @@ +/datum/element/dusts_on_catatonia + element_flags = ELEMENT_DETACH + var/list/mob/attached_mobs = list() + +/datum/element/dusts_on_catatonia/Attach(datum/target,penalize = FALSE) + . = ..() + if(!ismob(target)) + return ELEMENT_INCOMPATIBLE + var/mob/M = target + if(!(M in attached_mobs)) + attached_mobs += M + START_PROCESSING(SSprocessing,src) + +/datum/element/dusts_on_catatonia/Detach(mob/M) + . = ..() + if(M in attached_mobs) + attached_mobs -= M + if(!attached_mobs.len) + STOP_PROCESSING(SSprocessing,src) + +/datum/element/dusts_on_catatonia/process() + for(var/m in attached_mobs) + var/mob/M = m + if(!M.key && !M.get_ghost()) + M.dust(force = TRUE) + Detach(M) diff --git a/code/datums/elements/ghost_role_eligibility.dm b/code/datums/elements/ghost_role_eligibility.dm index 8ecb579bc8..e57aaddd5a 100644 --- a/code/datums/elements/ghost_role_eligibility.dm +++ b/code/datums/elements/ghost_role_eligibility.dm @@ -22,6 +22,8 @@ if(!(M.ckey in timeouts)) timeouts += M.ckey timeouts[M.ckey] = 0 + else if(timeouts[M.ckey] == CANT_REENTER_ROUND) + return timeouts[M.ckey] = max(timeouts[M.ckey],penalty) /datum/element/ghost_role_eligibility/Detach(mob/M) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 1c2ce851fe..6b0981665d 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -66,7 +66,7 @@ var/area/A = get_area(curturf) var/area/B = get_area(destturf) - if(!forced && (A.noteleport || B.noteleport)) + if(!forced && (HAS_TRAIT(teleatom, TRAIT_NO_TELEPORT) || A.noteleport || B.noteleport)) return FALSE if(SEND_SIGNAL(destturf, COMSIG_ATOM_INTERCEPT_TELEPORT, channel, curturf, destturf)) diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm index 45d73353f9..f0ad7aedfd 100644 --- a/code/datums/martial/psychotic_brawl.dm +++ b/code/datums/martial/psychotic_brawl.dm @@ -26,7 +26,7 @@ if(A.grab_state >= GRAB_AGGRESSIVE) D.grabbedby(A, 1) else - A.start_pulling(D, 1) + A.start_pulling(D, supress_message = TRUE) if(A.pulling) D.drop_all_held_items() D.stop_pulling() diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 42f18b8ebb..464ea37d02 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -132,12 +132,8 @@ //CIT CHANGE - makes arousal update when transfering bodies if(isliving(new_character)) //New humans and such are by default enabled arousal. Let's always use the new mind's prefs. var/mob/living/L = new_character - if(L.client && L.client.prefs) - L.canbearoused = L.client.prefs.arousable //Technically this should make taking over a character mean the body gain the new minds setting... - L.update_arousal_hud() //Removes the old icon - if (L.client.prefs.auto_ooc) - if (L.client.prefs.chat_toggles & CHAT_OOC) - L.client.prefs.chat_toggles ^= CHAT_OOC + if(L.client && L.client.prefs & L.client.prefs.auto_ooc & L.client.prefs.chat_toggles & CHAT_OOC) + DISABLE_BITFIELD(L.client.prefs.chat_toggles,CHAT_OOC) SEND_SIGNAL(src, COMSIG_MIND_TRANSFER, new_character, old_character) SEND_SIGNAL(new_character, COMSIG_MOB_ON_NEW_MIND) diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index a6e4c8ed4f..0b9b02af75 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -239,7 +239,14 @@ mood_change = -3 timeout = 1000 +/datum/mood_event/nanite_sadness + description = "+++++++HAPPINESS SUPPRESSION+++++++\n" + mood_change = -7 /datum/mood_event/daylight_2 description = "I have been scorched by the unforgiving rays of the sun.\n" mood_change = -6 timeout = 1200 + +/datum/mood_event/nanite_sadness/add_effects(message) + description = "+++++++[message]+++++++\n" + diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 98a8eade59..1e9a53cf57 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -142,6 +142,16 @@ mood_change = 2 timeout = 15 MINUTES +/datum/mood_event/nanite_happiness + description = "+++++++HAPPINESS ENHANCEMENT+++++++\n" + mood_change = 7 + +/datum/mood_event/nanite_happiness/add_effects(message) + description = "+++++++[message]+++++++\n" + +/datum/mood_event/area + description = "" //Fill this out in the area + mood_change = 0 //Power gamer stuff below /datum/mood_event/drankblood description = "I have fed greedly from that which nourishes me.\n" diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index e355a507f3..2b76850b44 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -131,6 +131,10 @@ port_id = "mining" can_be_bought = FALSE +/datum/map_template/shuttle/mining_common + port_id = "mining_common" + can_be_bought = FALSE + /datum/map_template/shuttle/cargo port_id = "cargo" can_be_bought = FALSE @@ -493,6 +497,10 @@ suffix = "delta" name = "labour shuttle (Delta)" +/datum/map_template/shuttle/mining_common/meta + suffix = "meta" + name = "lavaland shuttle (Meta)" + /datum/map_template/shuttle/arrival/delta suffix = "delta" name = "arrival shuttle (Delta)" diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 751f5faa94..2e46046a7e 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -615,7 +615,7 @@ if(do_after(mob_viewer, 35, null, mob_viewer)) if(isliving(mob_viewer)) var/mob/living/L = mob_viewer - to_chat(mob_viewer, "You succesfuly remove the durathread strand.") + to_chat(mob_viewer, "You successfully remove the durathread strand.") L.remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND) diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index 8be3174f50..d19efe486d 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -92,19 +92,10 @@ name = "Nymphomania" desc = "You're always feeling a bit in heat. Also, you get aroused faster than usual." value = 0 - mob_trait = TRAIT_NYMPHO + mob_trait = TRAIT_PERMABONER gain_text = "You are feeling extra wild." lose_text = "You don't feel that burning sensation anymore." -/datum/quirk/libido/add() - quirk_holder.min_arousal = 16 - quirk_holder.arousal_rate = 3 - -/datum/quirk/libido/remove() - if(quirk_holder) - quirk_holder.min_arousal = initial(quirk_holder.min_arousal) - quirk_holder.arousal_rate = initial(quirk_holder.arousal_rate) - /datum/quirk/maso name = "Masochism" desc = "You are aroused by pain." @@ -113,15 +104,6 @@ gain_text = "You desire to be hurt." lose_text = "Pain has become less exciting for you." -/datum/quirk/exhibitionism - name = "Exhibitionism" - desc = "You don't mind showing off your bare body to strangers, in fact you find it quite satistying." - value = 0 - medical_record_text = "Patient has been diagnosed with exhibitionistic disorder." - mob_trait = TRAIT_EXHIBITIONIST - gain_text = "You feel like exposing yourself to the world." - lose_text = "Indecent exposure doesn't sound as charming to you anymore." - /datum/quirk/coldblooded name = "Cold-blooded" desc = "Your body doesn't create its own internal heat, requiring external heat regulation." diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 9a6d992991..1f62be8a24 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -360,7 +360,7 @@ SEND_SIGNAL(src, COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume) return -/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked) +/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...). addtimer(CALLBACK(src, .proc/hitby_react, AM), 2) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 00a08d62b2..829b66a060 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -3,6 +3,9 @@ var/last_move = null var/last_move_time = 0 var/anchored = FALSE + var/move_resist = MOVE_RESIST_DEFAULT + var/move_force = MOVE_FORCE_DEFAULT + var/pull_force = PULL_FORCE_DEFAULT var/datum/thrownthing/throwing = null var/throw_speed = 2 //How many tiles to move per ds when being thrown. Float values are fully supported var/throw_range = 7 @@ -115,20 +118,20 @@ return FALSE return ..() -/atom/movable/proc/start_pulling(atom/movable/AM,gs) +/atom/movable/proc/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) if(QDELETED(AM)) return FALSE - if(!(AM.can_be_pulled(src))) + if(!(AM.can_be_pulled(src, state, force))) return FALSE // If we're pulling something then drop what we're currently pulling and pull this instead. if(pulling) - if(gs==0) + if(state == 0) stop_pulling() return FALSE // Are we trying to pull something we are already pulling? Then enter grab cycle and end. if(AM == pulling) - grab_state = gs + grab_state = state if(istype(AM,/mob/living)) var/mob/living/AMob = AM AMob.grabbedby(src) @@ -139,11 +142,12 @@ AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once. pulling = AM AM.pulledby = src - grab_state = gs + grab_state = state if(ismob(AM)) var/mob/M = AM log_combat(src, M, "grabbed", addition="passive grab") - visible_message("[src] has grabbed [M] passively!") + if(!supress_message) + visible_message("[src] has grabbed [M] passively!") return TRUE /atom/movable/proc/stop_pulling() @@ -508,17 +512,19 @@ /atom/movable/proc/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) set waitfor = 0 SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum) - return hit_atom.hitby(src) + return hit_atom.hitby(src, throwingdatum=throwingdatum) -/atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked) - if(!anchored && hitpush) +/atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked, datum/thrownthing/throwingdatum) + if(!anchored && hitpush && (!throwingdatum || (throwingdatum.force >= (move_resist * MOVE_FORCE_PUSH_RATIO)))) step(src, AM.dir) ..() -/atom/movable/proc/safe_throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback, messy_throw = TRUE) - return throw_at(target, range, speed, thrower, spin, diagonals_first, callback, messy_throw) +/atom/movable/proc/safe_throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, messy_throw = TRUE) + if((force < (move_resist * MOVE_FORCE_THROW_RATIO)) || (move_resist == INFINITY)) + return + return throw_at(target, range, speed, thrower, spin, diagonals_first, callback, force, messy_throw) -/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback, messy_throw = TRUE) //If this returns FALSE then callback will not be called. +/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, messy_throw = TRUE) //If this returns FALSE then callback will not be called. . = FALSE if (!target || speed <= 0) return @@ -564,6 +570,7 @@ TT.speed = speed TT.thrower = thrower TT.diagonals_first = diagonals_first + TT.force = force TT.callback = callback if(!QDELETED(thrower)) TT.target_zone = thrower.zone_selected @@ -614,6 +621,22 @@ return 0 return 1 +/atom/movable/proc/force_pushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + return FALSE + +/atom/movable/proc/force_push(atom/movable/AM, force = move_force, direction, silent = FALSE) + . = AM.force_pushed(src, force, direction) + if(!silent && .) + visible_message("[src] forcefully pushes against [AM]!", "You forcefully push against [AM]!") + +/atom/movable/proc/move_crush(atom/movable/AM, force = move_force, direction, silent = FALSE) + . = AM.move_crushed(src, force, direction) + if(!silent && .) + visible_message("[src] crushes past [AM]!", "You crush [AM]!") + +/atom/movable/proc/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + return FALSE + /atom/movable/CanPass(atom/movable/mover, turf/target) if(mover in buckled_mobs) return 1 @@ -833,14 +856,15 @@ /atom/movable/proc/get_cell() return -/atom/movable/proc/can_be_pulled(user) +/atom/movable/proc/can_be_pulled(user, grab_state, force) if(src == user || !isturf(loc)) return FALSE if(anchored || throwing) return FALSE + if(force < (move_resist * MOVE_FORCE_PULL_RATIO)) + return FALSE return TRUE - /obj/item/proc/do_pickup_animation(atom/target) set waitfor = FALSE if(!istype(loc, /turf)) diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index 0945875ac9..e443d6ad37 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -145,9 +145,9 @@ C.throw_mode_on() //so they can catch it on the return. return ..() -/obj/item/shield/energy/bananium/throw_impact(atom/hit_atom) +/obj/item/shield/energy/bananium/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(active) - var/caught = hit_atom.hitby(src, 0, 0) + var/caught = hit_atom.hitby(src, FALSE, FALSE, throwingdatum=throwingdatum) if(iscarbon(hit_atom) && !caught)//if they are a carbon and they didn't catch it var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.Slip(hit_atom) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 016f226399..495e90d305 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -220,6 +220,12 @@ T -= M.rating*0.2 prod_coeff = min(1,max(0,T)) // Coeff going 1 -> 0,8 -> 0,6 -> 0,4 +/obj/machinery/autolathe/examine(mob/user) + . += ..() + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Storing up to [materials.max_amount] material units.
Material consumption at [prod_coeff*100]%.
" + /obj/machinery/autolathe/proc/main_win(mob/user) var/dat = "

Autolathe Menu:


" dat += materials_printout() @@ -380,4 +386,4 @@ //Called when the object is constructed by an autolathe //Has a reference to the autolathe so you can do !!FUN!! things with hacked lathes /obj/item/proc/autolathe_crafted(obj/machinery/autolathe/A) - return \ No newline at end of file + return diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index a982411692..fc6cac785a 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -28,6 +28,8 @@ . += "There's [charging ? "a" : "no"] cell in the charger." if(charging) . += "Current charge: [round(charging.percent(), 1)]%." + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Charge rate at [charge_rate]J per cycle." /obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stock_parts/cell) && !panel_open) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 413621d8b9..711b221c54 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -102,8 +102,13 @@ /obj/machinery/clonepod/examine(mob/user) . = ..() var/mob/living/mob_occupant = occupant + . += "The linking device can be scanned with a multitool." if(mess) . += "It's filled with blood and viscera. You swear you can see it moving..." + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Cloning speed at [speed_coeff*50]%.
Predicted amount of cellular damage: [100-heal_level]%.
" + if(efficiency > 5) + to_chat(user, "Pod has been upgraded to support autoprocessing.") if(is_operational() && mob_occupant) if(mob_occupant.stat != DEAD) . += "Current clone cycle is [round(get_completion())]% complete." diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index 21fb70c38c..c52cf29660 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -44,7 +44,7 @@ data += "Current target: [(!target) ? "None" : "[get_area(target)] [(regime_set != "Gate") ? "" : "Teleporter"]"]
" if(calibrating) data += "Calibration: In Progress" - else if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3) + else if(power_station.teleporter_hub.calibrated || power_station.efficiency >= 3) data += "Calibration: Optimal" else data += "Calibration: Sub-Optimal" @@ -84,14 +84,14 @@ if(!target) say("Error: No target set to calibrate to.") return - if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3) + if(power_station.teleporter_hub.calibrated || power_station.efficiency >= 3) say("Hub is already calibrated!") return say("Processing hub calibration to target...") calibrating = 1 power_station.update_icon() - spawn(50 * (3 - power_station.teleporter_hub.accurate)) //Better parts mean faster calibration + spawn(50 * (3 - power_station.efficiency)) //Better parts mean faster calibration calibrating = 0 if(check_hub_connection()) power_station.teleporter_hub.calibrated = 1 diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index f62dceff6c..cff2e361bd 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -27,6 +27,13 @@ for(var/obj/item/stock_parts/micro_laser/P in component_parts) damage_coeff = P.rating +/obj/machinery/dna_scannernew/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Radiation pulse accuracy increased by factor [precision_coeff**2].
Radiation pulse damage decreased by factor [damage_coeff**2].
" + if(scan_level >= 3) + . += "Scanner has been upgraded to support autoprocessing." + /obj/machinery/dna_scannernew/update_icon() //no power or maintenance diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 2e43670624..ad0f372530 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -5,6 +5,7 @@ icon_state = "door1" opacity = 1 density = TRUE + move_resist = MOVE_FORCE_VERY_STRONG layer = OPEN_DOOR_LAYER power_channel = ENVIRON max_integrity = 350 diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 0429db5792..f5bf8c8a1b 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -32,7 +32,7 @@ CalculateAffectingAreas() /obj/machinery/door/firedoor/examine(mob/user) - ..() + . = ..() if(!density) . += "It is open, but could be pried closed." else if(!welded) diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm index e1f9824524..40430b37b7 100644 --- a/code/game/machinery/harvester.dm +++ b/code/game/machinery/harvester.dm @@ -129,7 +129,7 @@ /obj/machinery/harvester/proc/end_harvesting() harvesting = FALSE open_machine() - say("Subject has been succesfuly harvested.") + say("Subject has been successfully harvested.") playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, 0) /obj/machinery/harvester/screwdriver_act(mob/living/user, obj/item/I) @@ -191,4 +191,6 @@ if(state_open) . += "[src] must be closed before harvesting." else if(!harvesting) - . += "Alt-click [src] to start harvesting." \ No newline at end of file + . += "Alt-click [src] to start harvesting." + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Harvest speed at [interval*0.1] seconds per organ." diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 40fc52d6a1..f3e446c686 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -143,6 +143,11 @@ GLOBAL_LIST_EMPTY(network_holopads) holograph_range += 1 * B.rating holo_range = holograph_range +/obj/machinery/holopad/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Current projection range: [holo_range] units." + /obj/machinery/holopad/attackby(obj/item/P, mob/user, params) if(default_deconstruction_screwdriver(user, "holopad_open", "holopad0", P)) return diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index 5418dcdb97..b4a9584368 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -23,6 +23,11 @@ E += M.rating*15 range = E +/obj/machinery/launchpad/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Maximum range: [range] units." + /obj/machinery/launchpad/attackby(obj/item/I, mob/user, params) if(stationary) if(default_deconstruction_screwdriver(user, "lpad-idle-o", "lpad-idle", I)) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index bf9400219b..28afea817b 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -144,7 +144,7 @@ // Set this limb up using the specias name and body zone limb.icon_state = "[selected_category]_[limb.body_zone]" limb.name = "\improper synthetic [selected_category] [parse_zone(limb.body_zone)]" - limb.desc = "A synthetic [selected_category] limb that will morph on its first use in surgery. This one is for the [parse_zone(limb.body_zone)]" + limb.desc = "A synthetic [selected_category] limb that will morph on its first use in surgery. This one is for the [parse_zone(limb.body_zone)]." limb.species_id = selected_category limb.update_icon_dropped() @@ -158,6 +158,11 @@ T -= M.rating*0.2 prod_coeff = min(1,max(0,T)) // Coeff going 1 -> 0,8 -> 0,6 -> 0,4 +/obj/machinery/limbgrower/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Storing up to [reagents.maximum_volume]u of synthflesh.
Synthflesh consumption at [prod_coeff*100]%." + /obj/machinery/limbgrower/proc/main_win(mob/user) var/dat = "

Limb Grower Menu:


" dat += "Chemical Storage" diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index a581981746..2211397f3e 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -23,6 +23,23 @@ for(var/obj/item/stock_parts/capacitor/C in component_parts) recharge_coeff = C.rating +/obj/machinery/recharger/examine(mob/user) + . = ..() + if(!in_range(user, src) && !issilicon(user) && !isobserver(user)) + . += "You're too far away to examine [src]'s contents and display!" + return + + if(charging) + . += {"\The [src] contains: + - \A [charging]."} + + if(!(stat & (NOPOWER|BROKEN))) + . += "The status display reads:" + . += "- Recharging [recharge_coeff*10]% cell charge per cycle." + if(charging) + var/obj/item/stock_parts/cell/C = charging.get_cell() + . += "- \The [charging]'s cell is at [C.percent()]%." + /obj/machinery/recharger/proc/setCharging(new_charging) charging = new_charging if (new_charging) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index cd5f7ad6bf..374c0c71b9 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -50,6 +50,13 @@ for(var/obj/item/stock_parts/cell/C in component_parts) recharge_speed *= C.maxcharge / 10000 +/obj/machinery/recharge_station/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Recharging [recharge_speed]J per cycle." + if(repairs) + to_chat(user, "[src] has been upgraded to support automatic repairs.") + /obj/machinery/recharge_station/process() if(!is_operational()) return diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index c879ca73e8..538017eaef 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -41,9 +41,10 @@ /obj/machinery/recycler/examine(mob/user) . = ..() - . += "The power light is [(stat & NOPOWER) ? "off" : "on"]." - . += "The safety-mode light is [safety_mode ? "on" : "off"]." - . += "The safety-sensors status light is [obj_flags & EMAGGED ? "off" : "on"]." + . += "Reclaiming [amount_produced]% of materials salvaged." + . += {"The power light is [(stat & NOPOWER) ? "off" : "on"]. + The safety-mode light is [safety_mode ? "on" : "off"]. + The safety-sensors status light is [obj_flags & EMAGGED ? "off" : "on"]."} /obj/machinery/recycler/power_change() ..() diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index fc6577a4f1..16016b8e18 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -4,6 +4,7 @@ icon = 'icons/effects/effects.dmi' icon_state = "shield-old" density = TRUE + move_resist = INFINITY opacity = 0 anchored = TRUE resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF @@ -93,6 +94,7 @@ /obj/machinery/shieldgen/proc/shields_up() active = TRUE update_icon() + move_resist = INFINITY for(var/turf/target_tile in range(shield_range, src)) if(isspaceturf(target_tile) && !(locate(/obj/structure/emergency_shield) in target_tile)) @@ -101,6 +103,7 @@ /obj/machinery/shieldgen/proc/shields_down() active = FALSE + move_resist = initial(move_resist) update_icon() QDEL_LIST(deployed_shields) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 984a911d32..6eca52aa0e 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -52,6 +52,8 @@ . += "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%." else . += "There is no power cell installed." + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Temperature range at [settableTemperatureRange]°C.
Heating power at [heatingPower*0.001]kJ.
Power consumption at [(efficiency*-0.0025)+150]%." //100%, 75%, 50%, 25% /obj/machinery/space_heater/update_icon() if(on) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index ae71a0b844..3cc71df0f1 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -11,7 +11,7 @@ idle_power_usage = 10 active_power_usage = 2000 circuit = /obj/item/circuitboard/machine/teleporter_hub - var/accurate = FALSE + var/accuracy = 0 var/obj/machinery/teleport/station/power_station var/calibrated //Calibration prevents mutation @@ -29,7 +29,12 @@ var/A = 0 for(var/obj/item/stock_parts/matter_bin/M in component_parts) A += M.rating - accurate = A + accuracy = A + +/obj/machinery/teleport/hub/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Probability of malfunction decreased by [(accuracy*25)-25]%." /obj/machinery/teleport/hub/proc/link_power_station() if(power_station) @@ -69,13 +74,13 @@ if(do_teleport(M, com.target, channel = TELEPORT_CHANNEL_BLUESPACE)) use_power(5000) - if(!calibrated && iscarbon(M) && prob(30 - ((accurate) * 10))) //oh dear a problem + if(!calibrated && iscarbon(M) && prob(30 - ((accuracy) * 10))) //oh dear a problem var/mob/living/carbon/C = M if(C.dna?.species && C.dna.species.id != "fly" && !HAS_TRAIT(C, TRAIT_RADIMMUNE)) to_chat(C, "You hear a buzzing in your ears.") C.set_species(/datum/species/fly) log_game("[C] ([key_name(C)]) was turned into a fly person") - C.apply_effect((rand(120 - accurate * 40, 180 - accurate * 60)), EFFECT_IRRADIATE, 0) + C.apply_effect((rand(120 - accuracy * 40, 180 - accuracy * 60)), EFFECT_IRRADIATE, 0) calibrated = FALSE return @@ -102,7 +107,7 @@ /obj/machinery/teleport/station - name = "station" + name = "teleporter station" desc = "The power control station for a bluespace teleporter. Used for toggling power, and can activate a test-fire to prevent malfunctions." icon_state = "controller" use_power = IDLE_POWER_USE @@ -125,6 +130,15 @@ E += C.rating efficiency = E - 1 +/obj/machinery/teleport/station/examine(mob/user) + . = ..() + if(!panel_open) + . += "The panel is screwed in, obstructing the linking device and wiring panel." + else + . += "The linking device is now able to be scanned with a multitool.
The wiring can be connected to a nearby console and hub with a pair of wirecutters.
" + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: This station can be linked to [efficiency] other station(s)." + /obj/machinery/teleport/station/proc/link_console_and_hub() for(var/direction in GLOB.cardinals) teleporter_hub = locate(/obj/machinery/teleport/hub, get_step(src, direction)) diff --git a/code/game/machinery/turnstile.dm b/code/game/machinery/turnstile.dm index 1fd78056d4..9bc5193bbb 100644 --- a/code/game/machinery/turnstile.dm +++ b/code/game/machinery/turnstile.dm @@ -19,7 +19,7 @@ return TRUE /obj/machinery/turnstile/bullet_act(obj/item/projectile/P, def_zone) - return -1 //Pass through! + return BULLET_ACT_FORCE_PIERCE //Pass through! /obj/machinery/turnstile/proc/allowed_access(var/mob/B) if(B.pulledby && ismob(B.pulledby)) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index a8ba9850ff..fdb620cc67 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -84,7 +84,7 @@ switch(mode) if(1) if(!locked) - if(!istype(target) || target.anchored) + if(!istype(target) || target.anchored || target.move_resist >= MOVE_FORCE_EXTREMELY_STRONG) occupant_message("Unable to lock on [target]") return locked = target @@ -110,7 +110,7 @@ else atoms = orange(3, target) for(var/atom/movable/A in atoms) - if(A.anchored) + if(A.anchored || A.move_resist >= MOVE_FORCE_EXTREMELY_STRONG) continue spawn(0) var/iter = 5-get_dist(A,target) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 95fc96e119..2e93fc3a49 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -436,7 +436,7 @@ throwforce = 35 icon_state = "punching_glove" -/obj/item/punching_glove/throw_impact(atom/hit_atom) +/obj/item/punching_glove/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) if(ismovableatom(hit_atom)) var/atom/movable/AM = hit_atom diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index 018c694958..facf687cc4 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -36,6 +36,11 @@ MC += C.rating max_charge = MC * 25 +/obj/machinery/mech_bay_recharge_port/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Base recharge rate at [max_charge]J per cycle." + /obj/machinery/mech_bay_recharge_port/process() if(stat & NOPOWER || !recharge_console) return diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 61c0a8bd37..98e4eb4258 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -62,6 +62,11 @@ T += Ml.rating time_coeff = round(initial(time_coeff) - (initial(time_coeff)*(T))/5,0.01) +/obj/machinery/mecha_part_fabricator/examine(mob/user) + . = ..() + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Storing up to [materials.max_amount] material units.
Material consumption at [component_coeff*100]%.
Build time reduced by [100-time_coeff*100]%.
" /obj/machinery/mecha_part_fabricator/emag_act() . = ..() diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index dd335e8b37..e5e578b0e8 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -108,8 +108,8 @@ /obj/mecha/attack_tk() return -/obj/mecha/hitby(atom/movable/A as mob|obj) //wrapper - log_message("Hit by [A].", color="red") +/obj/mecha/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) //wrapper + log_message("Hit by [AM].", color="red") . = ..() diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index d48013d472..6057d1b418 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -4,6 +4,7 @@ /obj/effect icon = 'icons/effects/effects.dmi' resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF + move_resist = INFINITY obj_flags = 0 /obj/effect/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 78dde8d206..aa4e45dee6 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -568,21 +568,21 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) else return -/obj/item/throw_impact(atom/A, datum/thrownthing/throwingdatum) - if(A && !QDELETED(A)) - SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, A, throwingdatum) - if(get_temperature() && isliving(A)) - var/mob/living/L = A +/obj/item/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + if(hit_atom && !QDELETED(hit_atom)) + SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum) + if(get_temperature() && isliving(hit_atom)) + var/mob/living/L = hit_atom L.IgniteMob() var/itempush = 1 if(w_class < 4) itempush = 0 //too light to push anything - return A.hitby(src, 0, itempush) + return hit_atom.hitby(src, 0, itempush, throwingdatum=throwingdatum) -/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, messy_throw = TRUE) +/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, messy_throw = TRUE) thrownby = thrower callback = CALLBACK(src, .proc/after_throw, callback, (spin && messy_throw)) //replace their callback with our own - . = ..(target, range, speed, thrower, spin, diagonals_first, callback) + . = ..(target, range, speed, thrower, spin, diagonals_first, callback, force) /obj/item/proc/after_throw(datum/callback/callback, messy_throw) if (callback) //call the original callback @@ -674,7 +674,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) else . = "" -/obj/item/hitby(atom/movable/AM) +/obj/item/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) return /obj/item/attack_hulk(mob/living/carbon/human/user) diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index e151450d8a..3f57fa7cdf 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -677,18 +677,18 @@ RLD icon_state = "rld" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - matter = 500 - max_matter = 500 - sheetmultiplier = 16 + matter = 200 + max_matter = 200 + sheetmultiplier = 5 var/mode = LIGHT_MODE actions_types = list(/datum/action/item_action/pick_color) ammo_sections = 5 has_ammobar = TRUE - var/wallcost = 10 - var/floorcost = 15 - var/launchcost = 5 - var/deconcost = 10 + var/wallcost = 20 + var/floorcost = 25 + var/launchcost = 10 + var/deconcost = 20 var/walldelay = 10 var/floordelay = 10 diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index ea29059290..2666f0d300 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -19,12 +19,14 @@ GLOBAL_LIST_INIT(atmos_pipe_recipes, list( new /datum/pipe_info/pipe("Manifold", /obj/machinery/atmospherics/pipe/manifold), new /datum/pipe_info/pipe("Manual Valve", /obj/machinery/atmospherics/components/binary/valve), new /datum/pipe_info/pipe("Digital Valve", /obj/machinery/atmospherics/components/binary/valve/digital), + new /datum/pipe_info/pipe("Relief Valve", /obj/machinery/atmospherics/components/binary/relief_valve), new /datum/pipe_info/pipe("4-Way Manifold", /obj/machinery/atmospherics/pipe/manifold4w), new /datum/pipe_info/pipe("Layer Manifold", /obj/machinery/atmospherics/pipe/layer_manifold), ), "Devices" = list( new /datum/pipe_info/pipe("Connector", /obj/machinery/atmospherics/components/unary/portables_connector), new /datum/pipe_info/pipe("Unary Vent", /obj/machinery/atmospherics/components/unary/vent_pump), + new /datum/pipe_info/pipe("Relief Valve", /obj/machinery/atmospherics/components/unary/relief_valve), new /datum/pipe_info/pipe("Gas Pump", /obj/machinery/atmospherics/components/binary/pump), new /datum/pipe_info/pipe("Passive Gate", /obj/machinery/atmospherics/components/binary/passive_gate), new /datum/pipe_info/pipe("Volume Pump", /obj/machinery/atmospherics/components/binary/volume_pump), @@ -33,6 +35,7 @@ GLOBAL_LIST_INIT(atmos_pipe_recipes, list( new /datum/pipe_info/meter("Meter"), new /datum/pipe_info/pipe("Gas Filter", /obj/machinery/atmospherics/components/trinary/filter), new /datum/pipe_info/pipe("Gas Mixer", /obj/machinery/atmospherics/components/trinary/mixer), + new /datum/pipe_info/pipe("Passive Vent", /obj/machinery/atmospherics/components/unary/passive_vent), ), "Heat Exchange" = list( new /datum/pipe_info/pipe("Pipe", /obj/machinery/atmospherics/pipe/heat_exchanging/simple), diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index f3ed99b132..2daf6f0c0b 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -74,6 +74,7 @@ playsound(src, 'sound/weapons/slice.ogg', 50, 1) if(prob(P.damage)) push_over() + return BULLET_ACT_HIT /obj/item/cardboard_cutout/proc/change_appearance(obj/item/toy/crayon/crayon, mob/living/user) if(!crayon || !user) diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index 911a07c288..2dcb495701 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -242,7 +242,7 @@ if(Pgun && istype(Pgun)) Pgun.field_connect(src) else - return 0 + return BULLET_ACT_HIT /obj/effect/chrono_field/assume_air() return 0 diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 32c879e2d2..8400b6fa5c 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -293,6 +293,10 @@ name = "Mining Shuttle (Computer Board)" build_path = /obj/machinery/computer/shuttle/mining +/obj/item/circuitboard/computer/mining_shuttle/common + name = "Lavaland Shuttle (Computer Board)" + build_path = /obj/machinery/computer/shuttle/mining/common + /obj/item/circuitboard/computer/white_ship name = "White Ship (Computer Board)" build_path = /obj/machinery/computer/shuttle/white_ship diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index dffbb46cbb..c4ffa9f0ff 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -146,7 +146,7 @@ master.disrupt() /obj/effect/dummy/chameleon/bullet_act() - ..() + . = ..() master.disrupt() /obj/effect/dummy/chameleon/relaymove(mob/user, direction) diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index cc470466df..1f2f1ddda2 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -56,6 +56,14 @@ else return ..() +/obj/item/laser_pointer/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + if(!diode) + . += "The diode is missing." + else + . += "A class [diode.rating] laser diode is installed. It is screwed in place." + /obj/item/laser_pointer/afterattack(atom/target, mob/living/user, flag, params) . = ..() laser_act(target, user, params) diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index f27884d3ae..b1dd9be376 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -160,7 +160,7 @@ /obj/item/dice/attack_self(mob/user) diceroll(user) -/obj/item/dice/throw_impact(atom/target) +/obj/item/dice/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) diceroll(thrownby) . = ..() diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 849e14b476..f6f14554ed 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -340,7 +340,7 @@ return playsound(src.loc,'sound/weapons/bolathrow.ogg', 75, 1) -/obj/item/restraints/legcuffs/bola/throw_impact(atom/hit_atom) +/obj/item/restraints/legcuffs/bola/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed, return//abort var/mob/living/carbon/C = hit_atom @@ -368,7 +368,7 @@ w_class = WEIGHT_CLASS_SMALL breakouttime = 60 -/obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom) +/obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(iscarbon(hit_atom)) var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom)) B.Crossed(hit_atom) diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm index 11be6b88e9..ef5b7b6cba 100644 --- a/code/game/objects/items/latexballoon.dm +++ b/code/game/objects/items/latexballoon.dm @@ -40,8 +40,10 @@ if (prob(50)) qdel(src) -/obj/item/latexballon/bullet_act() - burst() +/obj/item/latexballon/bullet_act(obj/item/projectile/P) + if(!P.nodamage) + burst() + return ..() /obj/item/latexballon/temperature_expose(datum/gas_mixture/air, temperature, volume) if(temperature > T0C+100) diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 4242fb6c4b..4b071d6a34 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -333,13 +333,13 @@ if(proximity_flag) consume_everything(target) -/obj/item/melee/supermatter_sword/throw_impact(target) +/obj/item/melee/supermatter_sword/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() - if(ismob(target)) - var/mob/M + if(ismob(hit_atom)) + var/mob/M = hit_atom if(src.loc == M) M.dropItemToGround(src) - consume_everything(target) + consume_everything(hit_atom) /obj/item/melee/supermatter_sword/pickup(user) ..() @@ -358,7 +358,8 @@ /obj/item/melee/supermatter_sword/bullet_act(obj/item/projectile/P) visible_message("[P] smacks into [src] and rapidly flashes to ash.",\ "You hear a loud crack as you are washed with a wave of heat.") - consume_everything() + consume_everything(P) + return BULLET_ACT_HIT /obj/item/melee/supermatter_sword/suicide_act(mob/user) user.visible_message("[user] touches [src]'s blade. It looks like [user.p_theyre()] tired of waiting for the radiation to kill [user.p_them()]!") diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 256e84973d..2f40604719 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -60,7 +60,7 @@ #define DECALTYPE_BULLET 2 /obj/item/target/clown/bullet_act(obj/item/projectile/P) - ..() + . = ..() playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1) /obj/item/target/bullet_act(obj/item/projectile/P) @@ -89,8 +89,8 @@ else bullet_hole.icon_state = "dent" add_overlay(bullet_hole) - return - return -1 + return BULLET_ACT_HIT + return BULLET_ACT_FORCE_PIERCE #undef DECALTYPE_SCORCH #undef DECALTYPE_BULLET diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm index f55dae67db..86f0ad4936 100644 --- a/code/game/objects/items/singularityhammer.dm +++ b/code/game/objects/items/singularityhammer.dm @@ -105,10 +105,10 @@ playsound(src.loc, "sparks", 50, 1) shock(M) -/obj/item/twohanded/mjollnir/throw_impact(atom/target) +/obj/item/twohanded/mjollnir/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() - if(isliving(target)) - shock(target) + if(isliving(hit_atom)) + shock(hit_atom) /obj/item/twohanded/mjollnir/update_icon() //Currently only here to fuck with the on-mob icons. icon_state = "mjollnir[wielded]" diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index bb1a475f1f..e2357e8f6d 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -35,7 +35,7 @@ /obj/item/stack/ore/bluespace_crystal/proc/blink_mob(mob/living/L) do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) -/obj/item/stack/ore/bluespace_crystal/throw_impact(atom/hit_atom) +/obj/item/stack/ore/bluespace_crystal/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) // not caught in mid-air visible_message("[src] fizzles and disappears upon impact!") var/turf/T = get_turf(hit_atom) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 4180681754..324b40ac7f 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -202,6 +202,7 @@ if(O) O.setDir(usr.dir) use(R.req_amount * multiplier) + log_craft("[O] crafted by [usr] at [loc_name(O.loc)]") //START: oh fuck i'm so sorry if(istype(O, /obj/structure/windoor_assembly)) @@ -341,7 +342,7 @@ merge(o) . = ..() -/obj/item/stack/hitby(atom/movable/AM, skip, hitpush) +/obj/item/stack/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if(istype(AM, merge_type)) merge(AM) . = ..() diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index f34fc6a9a3..946eb1eb7b 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -41,7 +41,7 @@ cell = new preload_cell_type(src) update_icon() -/obj/item/melee/baton/throw_impact(atom/hit_atom) +/obj/item/melee/baton/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() //Only mob/living types have stun handling if(status && prob(throw_hit_chance) && iscarbon(hit_atom)) diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index d52c280f1b..9b9fae7c8f 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -259,7 +259,7 @@ if(proximity && ismovableatom(O) && O != sliver) Consume(O, user) -/obj/item/hemostat/supermatter/throw_impact(atom/hit_atom) // no instakill supermatter javelins +/obj/item/hemostat/supermatter/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) // no instakill supermatter javelins if(sliver) sliver.forceMove(loc) to_chat(usr, "\The [sliver] falls out of \the [src] as you throw them.") diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index cf891f5a47..92798528ae 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -84,7 +84,7 @@ else return ..() -/obj/item/toy/balloon/throw_impact(atom/hit_atom) +/obj/item/toy/balloon/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) //was it caught by a mob? balloon_burst(hit_atom) @@ -531,7 +531,7 @@ /obj/item/toy/snappop/fire_act(exposed_temperature, exposed_volume) pop_burst() -/obj/item/toy/snappop/throw_impact(atom/hit_atom) +/obj/item/toy/snappop/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) pop_burst() @@ -1152,7 +1152,7 @@ icon_state = "minimeteor" w_class = WEIGHT_CLASS_SMALL -/obj/item/toy/minimeteor/throw_impact(atom/hit_atom) +/obj/item/toy/minimeteor/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) playsound(src, 'sound/effects/meteorimpact.ogg', 40, 1) for(var/mob/M in urange(10, src)) @@ -1201,7 +1201,7 @@ if(user.dropItemToGround(src)) throw_at(target, throw_range, throw_speed) -/obj/item/toy/snowball/throw_impact(atom/hit_atom) +/obj/item/toy/snowball/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) playsound(src, 'sound/effects/pop.ogg', 20, 1) qdel(src) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 70a05a8d40..2d99f0e073 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -46,7 +46,7 @@ if(BURN) playsound(src.loc, 'sound/items/welder.ogg', 100, 1) -/obj/hitby(atom/movable/AM) +/obj/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) ..() var/throwdamage = AM.throwforce if(isobj(AM)) @@ -126,6 +126,17 @@ if(. && !play_soundeffect) playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) +/obj/force_pushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + return TRUE + +/obj/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + collision_damage(pusher, force, direction) + return TRUE + +/obj/proc/collision_damage(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + var/amt = max(0, ((force - (move_resist * MOVE_FORCE_CRUSH_RATIO)) / (move_resist * MOVE_FORCE_CRUSH_RATIO)) * 10) + take_damage(amt, BRUTE) + /obj/attack_slime(mob/living/simple_animal/slime/user) if(!user.is_adult) return diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 8899f2f79f..5f3fc48eb7 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -80,7 +80,7 @@ SEND_SIGNAL(src, COMSIG_OBJ_SETANCHORED, anchorvalue) anchored = anchorvalue -/obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, messy_throw) +/obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, messy_throw = TRUE) . = ..() if(obj_flags & FROZEN) visible_message("[src] shatters into a million pieces!") diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index 9ed148b4e3..c3a23cb171 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -66,6 +66,14 @@ req_access = null locked = FALSE +/obj/structure/closet/secure_closet/freezer/gulag_fridge + name = "refrigerator" + +/obj/structure/closet/secure_closet/freezer/gulag_fridge/PopulateContents() + ..() + for(var/i in 1 to 3) + new /obj/item/reagent_containers/food/drinks/beer/light(src) + /obj/structure/closet/secure_closet/freezer/fridge name = "refrigerator" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 5dcfad66db..1517b30d9c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -290,3 +290,17 @@ ..() for(var/i in 1 to 3) new /obj/item/storage/box/lethalshot(src) + +/obj/structure/closet/secure_closet/labor_camp_security + name = "labor camp security locker" + req_access = list(ACCESS_SECURITY) + icon_state = "sec" + +/obj/structure/closet/secure_closet/labor_camp_security/PopulateContents() + ..() + new /obj/item/clothing/suit/armor/vest(src) + new /obj/item/clothing/head/helmet/sec(src) + new /obj/item/clothing/under/rank/security(src) + new /obj/item/clothing/under/rank/security/skirt(src) + new /obj/item/clothing/glasses/hud/security/sunglasses(src) + new /obj/item/flashlight/seclite(src) diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 42323198b0..7690320159 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -48,6 +48,7 @@ roundstart = FALSE death = FALSE anchored = FALSE + move_resist = MOVE_FORCE_NORMAL density = FALSE short_desc = "You are an ash walker. Your tribe worships the Necropolis." flavour_text = "The wastes are sacred ground, its monsters a blessed bounty. You would never leave its sacred ground. \ @@ -125,6 +126,7 @@ roundstart = FALSE death = FALSE anchored = FALSE + move_resist = MOVE_FORCE_NORMAL density = FALSE var/has_owner = FALSE var/can_transfer = TRUE //if golems can switch bodies to this new shell @@ -663,6 +665,7 @@ SSjob.equip_loadout(null, new_spawn, FALSE) SSquirks.AssignQuirks(new_spawn, new_spawn.client, TRUE, TRUE, null, FALSE, new_spawn) new_spawn.AddElement(/datum/element/ghost_role_eligibility) + new_spawn.AddElement(/datum/element/dusts_on_catatonia) ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, GHOSTROLE_TRAIT) ADD_TRAIT(new_spawn,TRAIT_EXEMPT_HEALTH_EVENTS,GHOSTROLE_TRAIT) ADD_TRAIT(new_spawn,TRAIT_PACIFISM,GHOSTROLE_TRAIT) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 205e87329b..0d4444303e 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -258,7 +258,7 @@ take_damage(1, BURN, 0, 0) ..() -/obj/structure/grille/hitby(AM as mob|obj) +/obj/structure/grille/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if(isobj(AM)) if(prob(50) && anchored && !broken) var/obj/O = AM diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 69ad9f1567..617f42ed29 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -106,6 +106,7 @@ take_damage(10, BRUTE, "melee", 1) //Tasers aren't harmful. if(istype(P, /obj/item/projectile/beam/disabler)) take_damage(5, BRUTE, "melee", 1) //Disablers aren't harmful. + return BULLET_ACT_HIT /obj/structure/holosign/barrier/medical name = "\improper PENLITE holobarrier" @@ -152,6 +153,7 @@ /obj/structure/holosign/barrier/cyborg/hacked/bullet_act(obj/item/projectile/P) take_damage(P.damage, BRUTE, "melee", 1) //Yeah no this doesn't get projectile resistance. + return BULLET_ACT_HIT /obj/structure/holosign/barrier/cyborg/hacked/proc/cooldown() shockcd = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm similarity index 71% rename from code/modules/mob/living/simple_animal/hostile/mining_mobs/necropolis_tendril.dm rename to code/game/objects/structures/lavaland/necropolis_tendril.dm index 27ebb71c0e..6ce0228f54 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/necropolis_tendril.dm +++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm @@ -1,39 +1,32 @@ //Necropolis Tendrils, which spawn lavaland monsters and break into a chasm when killed -/obj/effect/light_emitter/tendril - set_luminosity = 4 - set_cap = 2.5 - light_color = LIGHT_COLOR_LAVA - -/mob/living/simple_animal/hostile/spawner/lavaland +/obj/structure/spawner/lavaland name = "necropolis tendril" desc = "A vile tendril of corruption, originating deep underground. Terrible monsters are pouring out of it." + icon = 'icons/mob/nest.dmi' icon_state = "tendril" - icon_living = "tendril" - icon_dead = "tendril" + faction = list("mining") - weather_immunities = list("lava","ash") - health = 250 - maxHealth = 250 max_mobs = 3 - spawn_time = 300 //30 seconds default + max_integrity = 250 mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril) - spawn_text = "emerges from" - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = INFINITY - loot = list(/obj/effect/collapse, /obj/structure/closet/crate/necropolis/tendril) - del_on_death = 1 + + move_resist=INFINITY // just killing it tears a massive hole in the ground, let's not move it + anchored = TRUE + resistance_flags = FIRE_PROOF | LAVA_PROOF + var/gps = null var/obj/effect/light_emitter/tendril/emitted_light -/mob/living/simple_animal/hostile/spawner/lavaland/goliath + +/obj/structure/spawner/lavaland/goliath mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril) -/mob/living/simple_animal/hostile/spawner/lavaland/legion +/obj/structure/spawner/lavaland/legion mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril) -/mob/living/simple_animal/hostile/spawner/lavaland/Initialize() +GLOBAL_LIST_INIT(tendrils, list()) +/obj/structure/spawner/lavaland/Initialize() . = ..() emitted_light = new(loc) for(var/F in RANGE_TURFS(1, src)) @@ -41,18 +34,19 @@ var/turf/closed/mineral/M = F M.ScrapeAway(null, CHANGETURF_IGNORE_AIR) gps = new /obj/item/gps/internal(src) + GLOB.tendrils += src -/mob/living/simple_animal/hostile/spawner/lavaland/Destroy() - QDEL_NULL(emitted_light) - QDEL_NULL(gps) +/obj/structure/spawner/lavaland/deconstruct(disassembled) + new /obj/effect/collapse(loc) + new /obj/structure/closet/crate/necropolis/tendril(loc) return ..() -/mob/living/simple_animal/hostile/spawner/lavaland/death() + +/obj/structure/spawner/lavaland/Destroy() var/last_tendril = TRUE - for(var/mob/living/simple_animal/hostile/spawner/lavaland/other in GLOB.mob_living_list) - if(other != src) - last_tendril = FALSE - break + if(GLOB.tendrils.len>1) + last_tendril = FALSE + if(last_tendril && !(flags_1 & ADMIN_SPAWNED_1)) if(SSmedals.hub_enabled) for(var/mob/living/L in view(7,src)) @@ -60,7 +54,15 @@ continue SSmedals.UnlockMedal("[BOSS_MEDAL_TENDRIL] [ALL_KILL_MEDAL]", L.client) SSmedals.SetScore(TENDRIL_CLEAR_SCORE, L.client, 1) - ..() + GLOB.tendrils -= src + QDEL_NULL(emitted_light) + QDEL_NULL(gps) + return ..() + +/obj/effect/light_emitter/tendril + set_luminosity = 4 + set_cap = 2.5 + light_color = LIGHT_COLOR_LAVA /obj/effect/collapse name = "collapsing necropolis tendril" @@ -92,4 +94,4 @@ for(var/turf/T in range(2,src)) if(!T.density) T.TerraformTurf(/turf/open/chasm/lavaland, /turf/open/chasm/lavaland, flags = CHANGETURF_INHERIT_AIR) - qdel(src) + qdel(src) \ No newline at end of file diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index cde60e15c1..5cc2315352 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -64,15 +64,15 @@ var/ploc = get_turf(P) if(!finished || !allowed_projectile_typecache[P.type] || !(P.dir in GLOB.cardinals)) return ..() - if(auto_reflect(P, pdir, ploc, pangle) != -1) + if(auto_reflect(P, pdir, ploc, pangle) != BULLET_ACT_FORCE_PIERCE) return ..() - return -1 + return BULLET_ACT_FORCE_PIERCE /obj/structure/reflector/proc/auto_reflect(obj/item/projectile/P, pdir, turf/ploc, pangle) P.ignore_source_check = TRUE P.range = P.decayedRange P.decayedRange = max(P.decayedRange--, 0) - return -1 + return BULLET_ACT_FORCE_PIERCE /obj/structure/reflector/attackby(obj/item/W, mob/user, params) if(admin) diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm new file mode 100644 index 0000000000..e67ef7af60 --- /dev/null +++ b/code/game/objects/structures/spawner.dm @@ -0,0 +1,75 @@ +/obj/structure/spawner + name = "monster nest" + icon = 'icons/mob/animal.dmi' + icon_state = "hole" + max_integrity = 100 + + move_resist = MOVE_FORCE_EXTREMELY_STRONG + anchored = TRUE + density = TRUE + + var/max_mobs = 5 + var/spawn_time = 300 //30 seconds default + var/mob_types = list(/mob/living/simple_animal/hostile/carp) + var/spawn_text = "emerges from" + var/faction = list("hostile") + +/obj/structure/spawner/Initialize() + . = ..() + AddComponent(/datum/component/spawner, mob_types, spawn_time, faction, spawn_text, max_mobs) + +/obj/structure/spawner/syndicate + name = "warp beacon" + icon = 'icons/obj/device.dmi' + icon_state = "syndbeacon" + spawn_text = "warps in from" + mob_types = list(/mob/living/simple_animal/hostile/syndicate/ranged) + faction = list(ROLE_SYNDICATE) + +/obj/structure/spawner/skeleton + name = "bone pit" + desc = "A pit full of bones, and some still seem to be moving..." + icon_state = "hole" + icon = 'icons/mob/nest.dmi' + max_integrity = 150 + max_mobs = 15 + spawn_time = 150 + mob_types = list(/mob/living/simple_animal/hostile/skeleton) + spawn_text = "climbs out of" + faction = list("skeleton") + +/obj/structure/spawner/mining + name = "monster den" + desc = "A hole dug into the ground, harboring all kinds of monsters found within most caves or mining asteroids." + icon_state = "hole" + max_integrity = 200 + max_mobs = 3 + icon = 'icons/mob/nest.dmi' + spawn_text = "crawls out of" + mob_types = list(/mob/living/simple_animal/hostile/asteroid/goldgrub, /mob/living/simple_animal/hostile/asteroid/goliath, /mob/living/simple_animal/hostile/asteroid/hivelord, /mob/living/simple_animal/hostile/asteroid/basilisk, /mob/living/simple_animal/hostile/asteroid/fugu) + faction = list("mining") + +/obj/structure/spawner/mining/goldgrub + name = "goldgrub den" + desc = "A den housing a nest of goldgrubs, annoying but arguably much better than anything else you'll find in a nest." + mob_types = list(/mob/living/simple_animal/hostile/asteroid/goldgrub) + +/obj/structure/spawner/mining/goliath + name = "goliath den" + desc = "A den housing a nest of goliaths, oh god why?" + mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath) + +/obj/structure/spawner/mining/hivelord + name = "hivelord den" + desc = "A den housing a nest of hivelords." + mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord) + +/obj/structure/spawner/mining/basilisk + name = "basilisk den" + desc = "A den housing a nest of basilisks, bring a coat." + mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk) + +/obj/structure/spawner/mining/wumborian + name = "wumborian fugu den" + desc = "A den housing a nest of wumborian fugus, how do they all even fit in there?" + mob_types = list(/mob/living/simple_animal/hostile/asteroid/fugu) \ No newline at end of file diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 5e6b35ba4f..9a6b24b472 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -124,7 +124,7 @@ message_admins("Plasma statue ignited by [Proj]. No known firer, in [ADMIN_VERBOSEJMP(T)]") log_game("Plasma statue ignited by [Proj] in [AREACOORD(T)]. No known firer.") PlasmaBurn(2500) - ..() + return ..() /obj/structure/statue/plasma/attackby(obj/item/W, mob/user, params) if(W.get_temperature() > 300 && !QDELETED(src))//If the temperature of the object is over 300, then ignite diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index b69b98ceaa..9dcfec43bf 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -71,6 +71,5 @@ /obj/structure/target_stake/bullet_act(obj/item/projectile/P) if(pinned_target) - pinned_target.bullet_act(P) - else - ..() + return pinned_target.bullet_act(P) + return ..() diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index ecc8ee5e8d..053b18d8d2 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -151,9 +151,9 @@ has_data = TRUE /turf/open/floor/plating/asteroid/airless/cave/volcanic - mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 3, \ - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random = 40, /mob/living/simple_animal/hostile/spawner/lavaland = 2, \ - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30, /mob/living/simple_animal/hostile/spawner/lavaland/legion = 3, \ + mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, /obj/structure/spawner/lavaland/goliath = 3, \ + /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random = 40, /obj/structure/spawner/lavaland = 2, \ + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30, /obj/structure/spawner/lavaland/legion = 3, \ SPAWN_MEGAFAUNA = 6, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10) data_having_type = /turf/open/floor/plating/asteroid/airless/cave/volcanic/has_data @@ -274,7 +274,7 @@ return //if there's a megafauna within standard view don't spawn anything at all if(ispath(randumb, /mob/living/simple_animal/hostile/asteroid) || istype(H, /mob/living/simple_animal/hostile/asteroid)) return //if the random is a standard mob, avoid spawning if there's another one within 12 tiles - if((ispath(randumb, /mob/living/simple_animal/hostile/spawner/lavaland) || istype(H, /mob/living/simple_animal/hostile/spawner/lavaland)) && get_dist(src, H) <= 2) + if((ispath(randumb, /obj/structure/spawner/lavaland) || istype(H, /obj/structure/spawner/lavaland)) && get_dist(src, H) <= 2) return //prevents tendrils spawning in each other's collapse range new randumb(T) diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm index 2f8ae0cb93..3a474f339c 100644 --- a/code/game/turfs/simulated/lava.dm +++ b/code/game/turfs/simulated/lava.dm @@ -36,7 +36,7 @@ if(burn_stuff(AM)) START_PROCESSING(SSobj, src) -/turf/open/lava/hitby(atom/movable/AM) +/turf/open/lava/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if(burn_stuff(AM)) START_PROCESSING(SSobj, src) diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 73c1c465cd..d0e941e69f 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -65,13 +65,16 @@ if(I.use_tool(src, user, 40, volume=50)) var/range = I.digrange //Store the current digrange so people don't cheese digspeed swapping for faster mining + var/list/dug_tiles = list() if(ismineralturf(src)) if(I.digrange > 0) for(var/turf/closed/mineral/M in range(user,range)) if(get_dir(user,M)&stored_dir) - M.gets_drilled() + M.gets_drilled(user) + dug_tiles += M to_chat(user, "You finish cutting into the rock.") - gets_drilled(user) + if(!(src in dug_tiles)) + gets_drilled(user) SSblackbox.record_feedback("tally", "pick_used_mining", 1, I.type) else return attack_hand(user) @@ -615,4 +618,4 @@ turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS - defer_change = 1 \ No newline at end of file + defer_change = 1 diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm index 9962f72d4a..be46d124ea 100644 --- a/code/game/turfs/simulated/wall/mineral_walls.dm +++ b/code/game/turfs/simulated/wall/mineral_walls.dm @@ -120,7 +120,7 @@ PlasmaBurn(2500) else if(istype(Proj, /obj/item/projectile/ion)) PlasmaBurn(500) - ..() + return ..() /turf/closed/wall/mineral/wood diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/simulated/wall/misc_walls.dm index 8b63d60939..d445be91cb 100644 --- a/code/game/turfs/simulated/wall/misc_walls.dm +++ b/code/game/turfs/simulated/wall/misc_walls.dm @@ -25,7 +25,7 @@ if(stored_pulling) stored_pulling.setDir(get_dir(stored_pulling.loc, newloc)) stored_pulling.forceMove(src) - H.start_pulling(stored_pulling, TRUE) + H.start_pulling(stored_pulling, supress_message = TRUE) /turf/closed/wall/mineral/cult/ratvar_act() . = ..() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index e81b3d1062..d8434f986c 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -224,14 +224,20 @@ for(var/i in contents) if(i == mover || i == mover.loc) // Multi tile objects and moving out of other objects continue + if(QDELETED(mover)) + break var/atom/movable/thing = i - if(thing.Cross(mover)) - continue - if(!firstbump || ((thing.layer > firstbump.layer || thing.flags_1 & ON_BORDER_1) && !(firstbump.flags_1 & ON_BORDER_1))) - firstbump = thing + if(!thing.Cross(mover)) + if(CHECK_BITFIELD(mover.movement_type, UNSTOPPABLE)) + mover.Bump(thing) + continue + else + if(!firstbump || ((thing.layer > firstbump.layer || thing.flags_1 & ON_BORDER_1) && !(firstbump.flags_1 & ON_BORDER_1))) + firstbump = thing if(firstbump) - mover.Bump(firstbump) - return FALSE + if(!QDELETED(mover)) + mover.Bump(firstbump) + return CHECK_BITFIELD(mover.movement_type, UNSTOPPABLE) return TRUE /turf/Exit(atom/movable/mover, atom/newloc) @@ -239,13 +245,16 @@ if(!.) return FALSE for(var/i in contents) + if(QDELETED(mover)) + break if(i == mover) continue var/atom/movable/thing = i if(!thing.Uncross(mover, newloc)) if(thing.flags_1 & ON_BORDER_1) mover.Bump(thing) - return FALSE + if(!CHECK_BITFIELD(mover.movement_type, UNSTOPPABLE)) + return FALSE /turf/Entered(atom/movable/AM) ..() @@ -563,3 +572,8 @@ //Should return new turf /turf/proc/Melt() return ScrapeAway(flags = CHANGETURF_INHERIT_AIR) + +/turf/bullet_act(obj/item/projectile/P) + . = ..() + if(. != BULLET_ACT_FORCE_PIERCE) + . = BULLET_ACT_TURF diff --git a/code/game/world.dm b/code/game/world.dm index c9bbe6d4bf..3c067a5038 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -117,6 +117,7 @@ GLOBAL_LIST(topic_status_cache) GLOB.world_job_debug_log = "[GLOB.log_directory]/job_debug.log" GLOB.tgui_log = "[GLOB.log_directory]/tgui.log" GLOB.subsystem_log = "[GLOB.log_directory]/subsystem.log" + GLOB.world_crafting_log = "[GLOB.log_directory]/crafting.log" #ifdef UNIT_TESTS @@ -134,6 +135,7 @@ GLOBAL_LIST(topic_status_cache) start_log(GLOB.world_job_debug_log) start_log(GLOB.tgui_log) start_log(GLOB.subsystem_log) + start_log(GLOB.world_crafting_log) GLOB.changelog_hash = md5('html/changelog.html') //for telling if the changelog has changed recently if(fexists(GLOB.config_error_log)) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 88e68158ed..372902e8d6 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -185,7 +185,6 @@ body += "Shade" body += "
" - if (M.client) body += "

" body += "Other actions:" body += "
" @@ -194,9 +193,9 @@ body += "Thunderdome 2 | " body += "Thunderdome Admin | " body += "Thunderdome Observer | " - - body += usr.client.citaPPoptions(M) // CITADEL - + body += "Make mentor | " + body += "Remove mentor" + body += "Allow reentering round" body += "
" body += "" @@ -1009,3 +1008,36 @@ "Admin login: [key_name(src)]") if(string) message_admins("[string]") + +/client/proc/cmd_admin_man_up(mob/M in GLOB.mob_list) + set category = "Special Verbs" + set name = "Man Up" + + if(!M) + return + if(!check_rights(R_ADMIN)) + return + + to_chat(M, "Man up, and deal with it.
Move on.") + M.playsound_local(M, 'sound/voice/manup.ogg', 50, FALSE, pressure_affected = FALSE) + + log_admin("Man up: [key_name(usr)] told [key_name(M)] to man up") + var/message = "[key_name_admin(usr)] told [key_name_admin(M)] to man up." + message_admins(message) + admin_ticket_log(M, message) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Man Up") + +/client/proc/cmd_admin_man_up_global() + set category = "Special Verbs" + set name = "Man Up Global" + + if(!check_rights(R_ADMIN)) + return + + to_chat(world, "Man up, and deal with it.
Move on.") + for(var/mob/M in GLOB.player_list) + M.playsound_local(M, 'sound/voice/manup.ogg', 50, FALSE, pressure_affected = FALSE) + + log_admin("Man up global: [key_name(usr)] told everybody to man up") + message_admins("[key_name_admin(usr)] told everybody to man up.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Man Up Global") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 88d4105124..c66927b856 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -22,7 +22,10 @@ if(!CheckAdminHref(href, href_list)) return - citaTopic(href, href_list) //CITADEL EDIT, MENTORS + if(href_list["makementor"]) + makeMentor(href_list["makementor"]) + else if(href_list["removementor"]) + removeMentor(href_list["removementor"]) if(href_list["ahelp"]) if(!check_rights(R_ADMIN, TRUE)) @@ -907,12 +910,16 @@ dat += "Alien" else dat += "Alien" - //Gang if(jobban_isbanned(M, ROLE_GANG) || isbanned_dept) dat += "Gang" else dat += "Gang" + //Bloodsucker + if(jobban_isbanned(M, ROLE_BLOODSUCKER) || isbanned_dept) + dat += "Bloodsucker" + else + dat += "Bloodsucker" //Other Roles (black) @@ -1715,6 +1722,16 @@ log_admin("[key_name(usr)] forced [key_name(M)] to say: [speech]") message_admins("[key_name_admin(usr)] forced [key_name_admin(M)] to say: [speech]") + else if(href_list["makeeligible"]) + if(!check_rights(R_ADMIN)) + return + var/mob/M = locate(href_list["makeeligible"]) + if(!ismob(M)) + to_chat(usr, "this can only be used on instances of type /mob.") + var/datum/element/ghost_role_eligibility/eli = SSdcs.GetElement(/datum/element/ghost_role_eligibility) + if(M.ckey in eli.timeouts) + eli.timeouts -= M.ckey + else if(href_list["sendtoprison"]) if(!check_rights(R_ADMIN)) return @@ -2846,3 +2863,57 @@ dat += {"Random (default)
"} dat += {"Now: [GLOB.secret_force_mode]"} usr << browse(dat, "window=f_secret") + +/datum/admins/proc/makeMentor(ckey) + if(!usr.client) + return + if (!check_rights(0)) + return + if(!ckey) + return + var/client/C = GLOB.directory[ckey] + if(C) + if(check_rights_for(C, R_ADMIN,0)) + to_chat(usr, "The client chosen is an admin! Cannot mentorize.") + return + if(SSdbcore.Connect()) + var/datum/DBQuery/query_get_mentor = SSdbcore.NewQuery("SELECT id FROM [format_table_name("mentor")] WHERE ckey = '[ckey]'") + if(query_get_mentor.NextRow()) + to_chat(usr, "[ckey] is already a mentor.") + return + var/datum/DBQuery/query_add_mentor = SSdbcore.NewQuery("INSERT INTO `[format_table_name("mentor")]` (`id`, `ckey`) VALUES (null, '[ckey]')") + if(!query_add_mentor.warn_execute()) + return + var/datum/DBQuery/query_add_admin_log = SSdbcore.NewQuery("INSERT INTO `[format_table_name("admin_log")]` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added new mentor [ckey]');") + if(!query_add_admin_log.warn_execute()) + return + else + to_chat(usr, "Failed to establish database connection. The changes will last only for the current round.") + new /datum/mentors(ckey) + to_chat(usr, "New mentor added.") + +/datum/admins/proc/removeMentor(ckey) + if(!usr.client) + return + if (!check_rights(0)) + return + if(!ckey) + return + var/client/C = GLOB.directory[ckey] + if(C) + if(check_rights_for(C, R_ADMIN,0)) + to_chat(usr, "The client chosen is an admin, not a mentor! Cannot de-mentorize.") + return + C.remove_mentor_verbs() + C.mentor_datum = null + GLOB.mentors -= C + if(SSdbcore.Connect()) + var/datum/DBQuery/query_remove_mentor = SSdbcore.NewQuery("DELETE FROM [format_table_name("mentor")] WHERE ckey = '[ckey]'") + if(!query_remove_mentor.warn_execute()) + return + var/datum/DBQuery/query_add_admin_log = SSdbcore.NewQuery("INSERT INTO `[format_table_name("admin_log")]` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Removed mentor [ckey]');") + if(!query_add_admin_log.warn_execute()) + return + else + to_chat(usr, "Failed to establish database connection. The changes will last only for the current round.") + to_chat(usr, "Mentor removed.") diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm index 47294bc766..b8d5b1bf6d 100644 --- a/code/modules/antagonists/abductor/machinery/console.dm +++ b/code/modules/antagonists/abductor/machinery/console.dm @@ -46,7 +46,6 @@ dat += "Advanced Baton (2 Credits)
" dat += "Mental Interface Device (2 Credits)
" dat += "Reagent Synthesizer (2 Credits)
" - dat += "Shrink Ray Blaster (2 Credits)
" dat += "Agent Helmet (1 Credit)
" dat += "Agent Vest (1 Credit)
" dat += "Radio Silencer (1 Credit)
" @@ -119,8 +118,6 @@ Dispense(/obj/item/abductor_machine_beacon/chem_dispenser,cost=2) if("tongue") Dispense(/obj/item/organ/tongue/abductor) - if("shrink_ray") - Dispense(/obj/item/gun/energy/shrink_ray,cost=2) updateUsrDialog() /obj/machinery/abductor/console/proc/TeleporterRetrieve() @@ -245,4 +242,4 @@ new item(drop_location) else - say("Insufficent data!") \ No newline at end of file + say("Insufficent data!") diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index b2ab5caef8..49c34f4d1f 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -345,13 +345,13 @@ /obj/item/projectile/tentacle/on_hit(atom/target, blocked = FALSE) var/mob/living/carbon/human/H = firer if(blocked >= 100) - return 0 + return BULLET_ACT_BLOCK if(isitem(target)) var/obj/item/I = target if(!I.anchored) to_chat(firer, "You pull [I] right into your grasp.") H.put_in_hands(I) //Because throwing it is goofy as fuck and unreliable. If you land the tentacle despite the penalties to accuracy, you should have your reward. - . = 1 + . = BULLET_ACT_HIT else if(isliving(target)) var/mob/living/L = target @@ -366,7 +366,7 @@ if(INTENT_HELP) C.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") C.throw_at(get_step_towards(H,C), 8, 2) - return 1 + return BULLET_ACT_HIT if(INTENT_DISARM) var/obj/item/I = C.get_active_held_item() @@ -374,27 +374,27 @@ if(C.dropItemToGround(I)) C.visible_message("[I] is yanked off [C]'s hand by [src]!","A tentacle pulls [I] away from you!") on_hit(I) //grab the item as if you had hit it directly with the tentacle - return 1 + return BULLET_ACT_HIT else to_chat(firer, "You can't seem to pry [I] off [C]'s hands!") - return 0 + return BULLET_ACT_BLOCK else to_chat(firer, "[C] has nothing in hand to disarm!") - return 0 + return BULLET_ACT_HIT if(INTENT_GRAB) C.visible_message("[L] is grabbed by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, .proc/tentacle_grab, H, C)) - return 1 + return BULLET_ACT_HIT if(INTENT_HARM) C.visible_message("[L] is thrown towards [H] by a tentacle!","A tentacle grabs you and throws you towards [H]!") C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, .proc/tentacle_stab, H, C)) - return 1 + return BULLET_ACT_HIT else L.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") L.throw_at(get_step_towards(H,L), 8, 2) - . = 1 + . = BULLET_ACT_HIT /obj/item/projectile/tentacle/Destroy() qdel(chain) diff --git a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm index 9f2ddfda47..ee1a1233d2 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm @@ -182,7 +182,7 @@ if(isliving(target)) var/mob/living/L = target if(is_servant_of_ratvar(L) || L.stat || L.has_status_effect(STATUS_EFFECT_KINDLE)) - return + return BULLET_ACT_HIT var/atom/O = L.anti_magic_check() playsound(L, 'sound/magic/fireball.ogg', 50, TRUE, frequency = 1.25) if(O) diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm index 7534f7c043..05516cc6a2 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm @@ -45,10 +45,10 @@ bonus_damage *= 3 //total 30 damage on cultists, 50 with ratvar GLOB.clockwork_vitality += target.adjustFireLoss(bonus_damage) //adds the damage done to existing vitality -/obj/item/clockwork/weapon/ratvarian_spear/throw_impact(atom/target) - var/turf/T = get_turf(target) - if(isliving(target)) - var/mob/living/L = target +/obj/item/clockwork/weapon/ratvarian_spear/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + var/turf/T = get_turf(hit_atom) + if(isliving(hit_atom)) + var/mob/living/L = hit_atom if(is_servant_of_ratvar(L)) if(L.put_in_active_hand(src)) L.visible_message("[L] catches [src] out of the air!") diff --git a/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm b/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm index 311f552467..6591343116 100644 --- a/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm +++ b/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm @@ -97,7 +97,7 @@ /mob/living/simple_animal/hostile/clockwork/marauder/bullet_act(obj/item/projectile/P) if(deflect_projectile(P)) - return + return BULLET_ACT_BLOCK return ..() /mob/living/simple_animal/hostile/clockwork/marauder/proc/deflect_projectile(obj/item/projectile/P) diff --git a/code/modules/antagonists/clockcult/clock_structures/reflector.dm b/code/modules/antagonists/clockcult/clock_structures/reflector.dm index 34ad051d19..364409d39e 100644 --- a/code/modules/antagonists/clockcult/clock_structures/reflector.dm +++ b/code/modules/antagonists/clockcult/clock_structures/reflector.dm @@ -31,7 +31,7 @@ if(auto_reflect(P, P.dir, get_turf(P), P.Angle) != -1) return ..() - return -1 + return BULLET_ACT_FORCE_PIERCE /obj/structure/destructible/clockwork/reflector/proc/auto_reflect(obj/item/projectile/P, pdir, turf/ploc, pangle) diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index f5be94a0e7..f14aeede9a 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -265,7 +265,7 @@ to_chat(user, "The bola seems to take on a life of its own!") throw_impact(user) -/obj/item/restraints/legcuffs/bola/cult/throw_impact(atom/hit_atom) +/obj/item/restraints/legcuffs/bola/cult/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(iscultist(hit_atom)) return . = ..() @@ -690,10 +690,10 @@ /obj/item/twohanded/cult_spear/update_icon() icon_state = "bloodspear[wielded]" -/obj/item/twohanded/cult_spear/throw_impact(atom/target) - var/turf/T = get_turf(target) - if(isliving(target)) - var/mob/living/L = target +/obj/item/twohanded/cult_spear/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + var/turf/T = get_turf(hit_atom) + if(isliving(hit_atom)) + var/mob/living/L = hit_atom if(iscultist(L)) playsound(src, 'sound/weapons/throwtap.ogg', 50) if(L.put_in_active_hand(src)) @@ -987,11 +987,11 @@ return TRUE return FALSE -/obj/item/shield/mirror/throw_impact(atom/target, throwingdatum) - var/turf/T = get_turf(target) +/obj/item/shield/mirror/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + var/turf/T = get_turf(hit_atom) var/datum/thrownthing/D = throwingdatum - if(isliving(target)) - var/mob/living/L = target + if(isliving(hit_atom)) + var/mob/living/L = hit_atom if(iscultist(L)) playsound(src, 'sound/weapons/throwtap.ogg', 50) if(L.put_in_active_hand(src)) diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index 1d6a31b072..9754d146c3 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -44,7 +44,7 @@ wander = FALSE density = FALSE movement_type = FLYING - anchored = TRUE + move_resist = MOVE_FORCE_OVERPOWERING mob_size = MOB_SIZE_TINY pass_flags = PASSTABLE | PASSGRILLE | PASSMOB speed = 1 @@ -361,7 +361,7 @@ user.dropItemToGround(src) scatter() -/obj/item/ectoplasm/revenant/throw_impact(atom/hit_atom) +/obj/item/ectoplasm/revenant/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() if(inert) return diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 9079b79c3d..b223992d2c 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -142,7 +142,7 @@ . = ..() olddir = dir -/obj/item/assembly/infra/throw_impact() +/obj/item/assembly/infra/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() if(!olddir) return diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index a42fad82c0..c67b79478e 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -130,10 +130,10 @@ return FALSE -/obj/item/assembly/mousetrap/hitby(A as mob|obj) +/obj/item/assembly/mousetrap/hitby(atom/hit_atom, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) if(!armed) return ..() - visible_message("[src] is triggered by [A].") + visible_message("[src] is triggered by [hit_atom].") triggered(null) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 389f1a69f3..632542f605 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -267,12 +267,13 @@ /atom/movable/proc/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0) var/const/PROBABILITY_OFFSET = 25 var/const/PROBABILITY_BASE_PRECENT = 75 + var/max_force = sqrt(pressure_difference)*(MOVE_FORCE_DEFAULT / 5) set waitfor = 0 var/move_prob = 100 if (pressure_resistance > 0) move_prob = (pressure_difference/pressure_resistance*PROBABILITY_BASE_PRECENT)-PROBABILITY_OFFSET move_prob += pressure_resistance_prob_delta - if (move_prob > PROBABILITY_OFFSET && prob(move_prob)) + if (move_prob > PROBABILITY_OFFSET && prob(move_prob) && (move_resist != INFINITY) && (!anchored && (max_force >= (move_resist * MOVE_FORCE_PUSH_RATIO))) || (anchored && (max_force >= (move_resist * MOVE_FORCE_FORCEPUSH_RATIO)))) step(src, direction) last_high_pressure_movement_air_cycle = SSair.times_fired diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 0450e7e8dd..7edea275b6 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -14,6 +14,7 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics anchored = TRUE + move_resist = INFINITY //Moving a connected machine without actually doing the normal (dis)connection things will probably cause a LOT of issues. idle_power_usage = 0 active_power_usage = 0 power_channel = ENVIRON diff --git a/code/modules/atmospherics/machinery/components/binary_devices/relief_valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/relief_valve.dm new file mode 100644 index 0000000000..5835912cd3 --- /dev/null +++ b/code/modules/atmospherics/machinery/components/binary_devices/relief_valve.dm @@ -0,0 +1,108 @@ +/obj/machinery/atmospherics/components/binary/relief_valve + name = "binary pressure relief valve" + desc = "Like a manual valve, but opens at a certain pressure rather than being toggleable." + icon = 'icons/obj/atmospherics/components/relief_valve.dmi' + icon_state = "relief_valve-t-map" + can_unwrench = TRUE + construction_type = /obj/item/pipe/binary + var/opened = FALSE + var/open_pressure = ONE_ATMOSPHERE * 3 + var/close_pressure = ONE_ATMOSPHERE + pipe_state = "relief_valve-t" + +/obj/machinery/atmospherics/components/binary/relief_valve/layer1 + piping_layer = PIPING_LAYER_MIN + pixel_x = -PIPING_LAYER_P_X + pixel_y = -PIPING_LAYER_P_Y + +/obj/machinery/atmospherics/components/binary/relief_valve/layer3 + piping_layer = PIPING_LAYER_MAX + pixel_x = PIPING_LAYER_P_X + pixel_y = PIPING_LAYER_P_Y + +/obj/machinery/atmospherics/components/binary/relief_valve/update_icon_nopipes() + if(dir==SOUTH) + setDir(NORTH) + else if(dir==WEST) + setDir(EAST) + cut_overlays() + + if(!nodes[1] || !opened || !is_operational()) + icon_state = "relief_valve-t" + return + + icon_state = "relief_valve-t-blown" + +/obj/machinery/atmospherics/components/binary/relief_valve/proc/open() + opened = TRUE + update_icon_nopipes() + update_parents() + var/datum/pipeline/parent1 = parents[1] + parent1.reconcile_air() + +/obj/machinery/atmospherics/components/binary/relief_valve/proc/close() + opened = FALSE + update_icon_nopipes() + +/obj/machinery/atmospherics/components/binary/relief_valve/process_atmos() + ..() + + if(!is_operational()) + return + + var/datum/gas_mixture/air_contents = airs[1] + var/our_pressure = air_contents.return_pressure() + if(opened && our_pressure < close_pressure) + close() + else if(!opened && our_pressure >= open_pressure) + open() + +/obj/machinery/atmospherics/components/binary/relief_valve/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "atmos_relief", name, 335, 115, master_ui, state) + ui.open() + +/obj/machinery/atmospherics/components/binary/relief_valve/ui_data() + var/data = list() + data["open_pressure"] = round(open_pressure) + data["close_pressure"] = round(close_pressure) + data["max_pressure"] = round(50*ONE_ATMOSPHERE) + return data + +/obj/machinery/atmospherics/components/binary/relief_valve/ui_act(action, params) + if(..()) + return + switch(action) + if("open_pressure") + var/pressure = params["open_pressure"] + if(pressure == "max") + pressure = 50*ONE_ATMOSPHERE + . = TRUE + else if(pressure == "input") + pressure = input("New output pressure ([close_pressure]-[50*ONE_ATMOSPHERE] kPa):", name, open_pressure) as num|null + if(!isnull(pressure) && !..()) + . = TRUE + else if(text2num(pressure) != null) + pressure = text2num(pressure) + . = TRUE + if(.) + open_pressure = CLAMP(pressure, close_pressure, 50*ONE_ATMOSPHERE) + investigate_log("open pressure was set to [open_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) + if("close_pressure") + var/pressure = params["close_pressure"] + if(pressure == "max") + pressure = open_pressure + . = TRUE + else if(pressure == "input") + pressure = input("New output pressure (0-[open_pressure] kPa):", name, close_pressure) as num|null + if(!isnull(pressure) && !..()) + . = TRUE + else if(text2num(pressure) != null) + pressure = text2num(pressure) + . = TRUE + if(.) + close_pressure = CLAMP(pressure, 0, open_pressure) + investigate_log("close pressure was set to [close_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) + update_icon() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 4e91ee50c3..539b5ce57a 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -57,6 +57,11 @@ heat_capacity = initial(heat_capacity) / C conduction_coefficient = initial(conduction_coefficient) * C +/obj/machinery/atmospherics/components/unary/cryo_cell/examine(mob/user) //this is leaving out everything but efficiency since they follow the same idea of "better matter bin, better results" + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Efficiency at [efficiency*100]%." + /obj/machinery/atmospherics/components/unary/cryo_cell/Destroy() QDEL_NULL(radio) QDEL_NULL(beaker) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm new file mode 100644 index 0000000000..94d8959987 --- /dev/null +++ b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm @@ -0,0 +1,55 @@ +/obj/machinery/atmospherics/components/unary/passive_vent + icon_state = "passive_vent_map-2" + + name = "passive vent" + desc = "It is an open vent." + can_unwrench = TRUE + + level = 1 + layer = GAS_SCRUBBER_LAYER + + pipe_state = "pvent" + +/obj/machinery/atmospherics/components/unary/passive_vent/update_icon_nopipes() + cut_overlays() + if(showpipe) + var/image/cap = getpipeimage(icon, "vent_cap", initialize_directions) + add_overlay(cap) + icon_state = "passive_vent" + +/obj/machinery/atmospherics/components/unary/passive_vent/process_atmos() + ..() + + var/datum/gas_mixture/environment = loc.return_air() + var/environment_pressure = environment.return_pressure() + var/pressure_delta = abs(environment_pressure - airs[1].return_pressure()) + + if((environment.temperature || airs[1].temperature) && pressure_delta > 0.5) + if(environment_pressure < airs[1].return_pressure()) + var/air_temperature = (environment.temperature > 0) ? environment.temperature : airs[1].temperature + var/transfer_moles = (pressure_delta * environment.volume) / (air_temperature * R_IDEAL_GAS_EQUATION) + var/datum/gas_mixture/removed = airs[1].remove(transfer_moles) + loc.assume_air(removed) + air_update_turf() + else + var/air_temperature = (airs[1].temperature > 0) ? airs[1].temperature : environment.temperature + var/output_volume = airs[1].volume + var/transfer_moles = (pressure_delta * output_volume) / (air_temperature * R_IDEAL_GAS_EQUATION) + transfer_moles = min(transfer_moles, environment.total_moles()*airs[1].volume/environment.volume) + var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) + if(isnull(removed)) + return + airs[1].merge(removed) + air_update_turf() + update_parents() + +/obj/machinery/atmospherics/components/unary/passive_vent/can_crawl_through() + return TRUE + +/obj/machinery/atmospherics/components/unary/passive_vent/layer1 + piping_layer = PIPING_LAYER_MIN + icon_state = "passive_vent_map-1" + +/obj/machinery/atmospherics/components/unary/passive_vent/layer3 + piping_layer = PIPING_LAYER_MAX + icon_state = "passive_vent_map-3" diff --git a/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm b/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm new file mode 100644 index 0000000000..9da9e49e01 --- /dev/null +++ b/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm @@ -0,0 +1,111 @@ +/obj/machinery/atmospherics/components/unary/relief_valve + name = "pressure relief valve" + desc = "A valve that opens to the air at a certain pressure, then closes once it goes below another." + icon = 'icons/obj/atmospherics/components/relief_valve.dmi' + icon_state = "relief_valve-e-map" + can_unwrench = TRUE + var/opened = FALSE + var/open_pressure = ONE_ATMOSPHERE * 3 + var/close_pressure = ONE_ATMOSPHERE + pipe_state = "relief_valve-e" + +/obj/machinery/atmospherics/components/unary/relief_valve/layer1 + piping_layer = PIPING_LAYER_MIN + pixel_x = -PIPING_LAYER_P_X + pixel_y = -PIPING_LAYER_P_Y + +/obj/machinery/atmospherics/components/unary/relief_valve/layer3 + piping_layer = PIPING_LAYER_MAX + pixel_x = PIPING_LAYER_P_X + pixel_y = PIPING_LAYER_P_Y + +/obj/machinery/atmospherics/components/unary/relief_valve/atmos + close_pressure = ONE_ATMOSPHERE * 2 + +/obj/machinery/atmospherics/components/unary/relief_valve/atmos/atmos_waste + name = "atmos waste relief valve" + +/obj/machinery/atmospherics/components/unary/relief_valve/update_icon_nopipes() + cut_overlays() + + if(!nodes[1] || !opened || !is_operational()) + icon_state = "relief_valve-e" + return + + icon_state = "relief_valve-e-blown" + +/obj/machinery/atmospherics/components/unary/relief_valve/process_atmos() + ..() + + if(!is_operational()) + return + + var/datum/gas_mixture/air_contents = airs[1] + var/our_pressure = air_contents.return_pressure() + if(opened && our_pressure < close_pressure) + opened = FALSE + update_icon_nopipes() + else if(!opened && our_pressure >= open_pressure) + opened = TRUE + update_icon_nopipes() + if(opened && air_contents.temperature > 0) + var/datum/gas_mixture/environment = loc.return_air() + var/pressure_delta = our_pressure - environment.return_pressure() + var/transfer_moles = pressure_delta*200/(air_contents.temperature * R_IDEAL_GAS_EQUATION) + if(transfer_moles > 0) + var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) + + loc.assume_air(removed) + air_update_turf() + + update_parents() + +/obj/machinery/atmospherics/components/unary/relief_valve/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "atmos_relief", name, 335, 115, master_ui, state) + ui.open() + +/obj/machinery/atmospherics/components/unary/relief_valve/ui_data() + var/data = list() + data["open_pressure"] = round(open_pressure) + data["close_pressure"] = round(close_pressure) + data["max_pressure"] = round(50*ONE_ATMOSPHERE) + return data + +/obj/machinery/atmospherics/components/unary/relief_valve/ui_act(action, params) + if(..()) + return + switch(action) + if("open_pressure") + var/pressure = params["open_pressure"] + if(pressure == "max") + pressure = 50*ONE_ATMOSPHERE + . = TRUE + else if(pressure == "input") + pressure = input("New output pressure ([close_pressure]-[50*ONE_ATMOSPHERE] kPa):", name, open_pressure) as num|null + if(!isnull(pressure) && !..()) + . = TRUE + else if(text2num(pressure) != null) + pressure = text2num(pressure) + . = TRUE + if(.) + open_pressure = CLAMP(pressure, close_pressure, 50*ONE_ATMOSPHERE) + investigate_log("open pressure was set to [open_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) + if("close_pressure") + var/pressure = params["close_pressure"] + if(pressure == "max") + pressure = open_pressure + . = TRUE + else if(pressure == "input") + pressure = input("New output pressure (0-[open_pressure] kPa):", name, close_pressure) as num|null + if(!isnull(pressure) && !..()) + . = TRUE + else if(text2num(pressure) != null) + pressure = text2num(pressure) + . = TRUE + if(.) + close_pressure = CLAMP(pressure, 0, open_pressure) + investigate_log("close pressure was set to [close_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) + update_icon() diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index db8a8e90ad..899b621262 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -227,6 +227,11 @@ if(V.on) PL |= V.parents[1] PL |= V.parents[2] + else if (istype(atmosmch,/obj/machinery/atmospherics/components/binary/relief_valve)) + var/obj/machinery/atmospherics/components/binary/relief_valve/V = atmosmch + if(V.opened) + PL |= V.parents[1] + PL |= V.parents[2] else if (istype(atmosmch, /obj/machinery/atmospherics/components/unary/portables_connector)) var/obj/machinery/atmospherics/components/unary/portables_connector/C = atmosmch if(C.connected_device) diff --git a/code/modules/atmospherics/machinery/pipes/simple.dm b/code/modules/atmospherics/machinery/pipes/simple.dm index dbe67a1594..7cab3c23dc 100644 --- a/code/modules/atmospherics/machinery/pipes/simple.dm +++ b/code/modules/atmospherics/machinery/pipes/simple.dm @@ -35,7 +35,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/general/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/simple/general/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -58,7 +58,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/scrubbers name="scrubbers pipe" pipe_color=rgb(255,0,0) @@ -77,7 +77,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden level = PIPE_HIDDEN_LEVEL @@ -90,7 +90,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/supply name="air supply pipe" pipe_color=rgb(0,0,255) @@ -99,7 +99,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/supply/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/simple/supply/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -122,7 +122,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/supplymain name="main air supply pipe" pipe_color=rgb(130,43,255) @@ -141,7 +141,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/supplymain/hidden level = PIPE_HIDDEN_LEVEL @@ -154,7 +154,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/yellow pipe_color=rgb(255,198,0) color=rgb(255,198,0) @@ -172,7 +172,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/yellow/hidden level = PIPE_HIDDEN_LEVEL @@ -185,7 +185,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/cyan pipe_color=rgb(0,255,249) color=rgb(0,255,249) @@ -193,7 +193,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/cyan/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/simple/cyan/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -206,7 +206,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/cyan/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -224,7 +224,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/green/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/simple/green/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -237,7 +237,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/green/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/simple/green/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -255,7 +255,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/orange/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/simple/orange/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -268,7 +268,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/orange/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/simple/orange/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -286,7 +286,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/purple/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/simple/purple/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -309,7 +309,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/dark pipe_color=rgb(69,69,69) color=rgb(69,69,69) @@ -317,7 +317,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/dark/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/simple/dark/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -340,7 +340,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/violet pipe_color=rgb(64,0,128) color=rgb(64,0,128) @@ -348,7 +348,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/violet/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/simple/violet/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -371,7 +371,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/brown pipe_color=rgb(178,100,56) color=rgb(178,100,56) @@ -379,7 +379,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/brown/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/simple/brown/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X diff --git a/code/modules/cargo/packs/engineering.dm b/code/modules/cargo/packs/engineering.dm index f09c9e429d..ea90255bce 100644 --- a/code/modules/cargo/packs/engineering.dm +++ b/code/modules/cargo/packs/engineering.dm @@ -73,6 +73,17 @@ crate_name = "atmospherics hardsuit" crate_type = /obj/structure/closet/crate/secure/engineering +/datum/supply_pack/engineering/radhardsuit + name = "Radiation Hardsuit" + desc = "The Singulo is loose? Do you need to do a few changes to its containment and don't want to spent the rest of the shift under the shower? Get this Radiation Hardsuit! It protect from radiations and space only." + cost = 3500 + access = ACCESS_ENGINE + contains = list(/obj/item/tank/internals/air, + /obj/item/clothing/mask/gas, + /obj/item/clothing/suit/space/hardsuit/engine/rad) + crate_name = "radiation hardsuit" + crate_type = /obj/structure/closet/crate/secure/engineering + /datum/supply_pack/engineering/industrialrcd name = "Industrial RCD" desc = "An industrial RCD in case the station has gone through more then one meteor storm and the CE needs to bring out the somthing a bit more reliable. Does not contain spare ammo for the industrial RCD or any other RCD models." diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 7b7cf3413e..546268b5c7 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1007,6 +1007,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Forced Feminization: [(cit_toggles & FORCED_FEM) ? "Allowed" : "Disallowed"]
" dat += "Forced Masculinization: [(cit_toggles & FORCED_MASC) ? "Allowed" : "Disallowed"]
" dat += "Lewd Hypno: [(cit_toggles & HYPNO) ? "Allowed" : "Disallowed"]
" + dat += "Bimbofication: [(cit_toggles & BIMBOFICATION) ? "Allowed" : "Disallowed"]
" dat += "" dat +="" dat += "

Other content prefs

" @@ -1015,6 +1016,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Hypno: [(cit_toggles & NEVER_HYPNO) ? "Disallowed" : "Allowed"]
" dat += "Aphrodisiacs: [(cit_toggles & NO_APHRO) ? "Disallowed" : "Allowed"]
" dat += "Ass Slapping: [(cit_toggles & NO_ASS_SLAP) ? "Disallowed" : "Allowed"]
" + dat += "" dat += "
" @@ -2234,6 +2236,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("ass_slap") cit_toggles ^= NO_ASS_SLAP + + if("bimbo") + cit_toggles ^= BIMBOFICATION //END CITADEL EDIT diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 2472cbef78..08ecefb91f 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -109,10 +109,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car else if(current_version < 23) // we are fixing a gamebreaking bug. job_preferences = list() //It loaded null from nonexistant savefile field. - if(current_version < 24 && S["feature_exhibitionist"]) - var/datum/quirk/exhibitionism/E - var/quirk_name = initial(E.name) - all_quirks += quirk_name if(current_version < 25) var/digi S["feature_lizard_legs"] >> digi @@ -543,6 +539,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car ENABLE_BITFIELD(cit_toggles,NO_ASS_SLAP) all_quirks -= V + if(features["meat_type"] == "Inesct") + features["meat_type"] = "Insect" cit_character_pref_load(S) return 1 diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 2e643cc05d..255a5a2eec 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -207,6 +207,9 @@ message_admins("[key_name(src)] (job: [src.job ? "[src.job]" : "None"]) [is_special_character(src) ? "(ANTAG!) " : ""][ghosting ? "ghosted" : "committed suicide"] at [AREACOORD(src)].") /mob/living/proc/canSuicide() + if(!CONFIG_GET(flag/suicide_allowed)) + to_chat(src, "Suicide is not enabled in the config.") + return FALSE switch(stat) if(CONSCIOUS) return TRUE diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 69c50c5461..7df10b56f7 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -250,6 +250,36 @@ throwforce = 12 glass_colour_type = /datum/client_colour/glass_colour/red +/obj/item/clothing/glasses/sunglasses/stunglasses + name = "stunglasses" + desc = "Sunglasses with inbuilt flashes. Made for those who prefer to walk around in style, who needs clumsy flashes anyway?" + actions_types = list(/datum/action/item_action/flash) + var/obj/item/assembly/flash/installed + +/obj/item/clothing/glasses/sunglasses/stunglasses/Initialize() + . = ..() + if (!installed) + installed = new(src) + +/obj/item/clothing/glasses/sunglasses/stunglasses/ui_action_click(mob/user) + if (installed && !installed.crit_fail) + installed.attack_self(user) + else + to_chat(user, "Install a new flash in [src]!") + +/obj/item/clothing/glasses/sunglasses/stunglasses/attackby(obj/item/W,mob/user) + if (istype(W,/obj/item/screwdriver)) + if (installed) + installed.forceMove(get_turf(src)) + to_chat(user, "You remove [installed] from [src].") + installed = null + if (istype(W,/obj/item/assembly/flash)) + if (!installed) + W.forceMove(src) + to_chat(user, "You install [W] into [src].") + installed = W + . = ..() + /obj/item/clothing/glasses/welding name = "welding goggles" desc = "Protects the eyes from welders; approved by the mad scientist association." @@ -458,4 +488,4 @@ if(client && client.prefs.uses_glasses_colour && glasses_equipped) add_client_colour(G.glass_colour_type) else - remove_client_colour(G.glass_colour_type) + remove_client_colour(G.glass_colour_type) \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 984c19e202..c04f581425 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -203,6 +203,31 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/atmos + //Radiation +/obj/item/clothing/head/helmet/space/hardsuit/engine/rad + name = "radiation hardsuit helmet" + desc = "A special helmet that protects against radiation and space. Not much else unfortunately." + icon_state = "cespace_helmet" + item_state = "nothing" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0) + item_color = "engineering" + resistance_flags = FIRE_PROOF + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE + actions_types = list() + +/obj/item/clothing/suit/space/hardsuit/engine/rad + name = "radiation hardsuit" + desc = "A special suit that protects against radiation and space. Not much else unfortunately." + icon_state = "hardsuit-rad" + item_state = "nothing" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0) + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/rad + resistance_flags = FIRE_PROOF + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE + mutantrace_variation = NONE + +/obj/item/clothing/head/helmet/space/hardsuit/engine/rad/attack_self() + return //Sprites required for flashlight //Chief Engineer's hardsuit /obj/item/clothing/head/helmet/space/hardsuit/engine/elite diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 8424ea962c..63e3a63968 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -91,6 +91,9 @@ if(user && notifyAttach) to_chat(user, "You attach [I] to [src].") + if((flags_inv & HIDEACCESSORY) || (A.flags_inv & HIDEACCESSORY)) + return TRUE + var/accessory_color = attached_accessory.item_color if(!accessory_color) accessory_color = attached_accessory.icon_state diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index a4d2c17fd6..86d2b40d0f 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -370,22 +370,25 @@ ///////////////////// /obj/item/clothing/accessory/padding - name = "soft padding" - desc = "Some long sheets of padding to help soften the blows of a physical attacks." + name = "protective padding" + desc = "A soft padding meant to cushion the wearer from melee harm." icon_state = "padding" item_color = "nothing" - armor = list("melee" = 15, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 0, "rad" = 0, "fire" = -20, "acid" = 45) + armor = list("melee" = 20, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 0, "rad" = 0, "fire" = -20, "acid" = 45) + flags_inv = HIDEACCESSORY //hidden from indiscrete mob examines. /obj/item/clothing/accessory/kevlar - name = "kevlar sheets" - desc = "Long thin sheets of kevlar to help resist bullets and some physical attacks." + name = "kevlar padding" + desc = "A layered kevlar padding meant to cushion the wearer from ballistic harm." icon_state = "padding" item_color = "nothing" armor = list("melee" = 10, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 25) + flags_inv = HIDEACCESSORY /obj/item/clothing/accessory/plastics - name = "underling plastic sheet" - desc = "A full body sheet of white plastic to help defuse lasers and energy based weapons." + name = "ablative padding" + desc = "A thin ultra-refractory composite padding meant to cushion the wearer from energy lasers harm." icon_state = "plastics" item_color = "nothing" - armor = list("melee" = 0, "bullet" = 0, "laser" = 20, "energy" = 10, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = -40) + armor = list("melee" = 0, "bullet" = 0, "laser" = 20, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = -40) + flags_inv = HIDEACCESSORY diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm index 795515835e..c91e288f74 100644 --- a/code/modules/crafting/craft.dm +++ b/code/modules/crafting/craft.dm @@ -158,6 +158,7 @@ I.CheckParts(parts, R) if(send_feedback) SSblackbox.record_feedback("tally", "object_crafted", 1, I.type) + log_craft("[I] crafted by [user] at [loc_name(I.loc)]") return 0 return "." return ", missing tool." diff --git a/code/modules/crafting/recipes/recipes_clothing.dm b/code/modules/crafting/recipes/recipes_clothing.dm index 26de5f380d..3e036c7b29 100644 --- a/code/modules/crafting/recipes/recipes_clothing.dm +++ b/code/modules/crafting/recipes/recipes_clothing.dm @@ -86,7 +86,17 @@ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) reqs = list(/obj/item/clothing/glasses/sunglasses/reagent = 1) category = CAT_CLOTHING - +/* //Kevinz doesn't want it as a recipe for now, leaving it in if anything ever changes to let it in +/datum/crafting_recipe/stunglasses + name = "Stunglasses" + result = /obj/item/clothing/glasses/sunglasses/stunglasses + time = 60 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/assembly/flash = 1, + /obj/item/clothing/glasses/sunglasses = 1, + /obj/item/stack/cable_coil = 5) + category = CAT_CLOTHING +*/ /datum/crafting_recipe/ghostsheet name = "Ghost Sheet" result = /obj/item/clothing/suit/ghost_sheet diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index 65d4af56bd..d4f51e995e 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -43,6 +43,9 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 icon = 'icons/obj/objects.dmi' icon_state = "immrod" throwforce = 100 + move_force = INFINITY + move_resist = INFINITY + pull_force = INFINITY density = TRUE anchored = TRUE flags_1 = PREVENT_CONTENTS_EXPLOSION_1 diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index f5262742e2..83dbad0246 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -214,9 +214,9 @@ GLOBAL_LIST_INIT(hallucination_list, list( . = ..() name = "alien hunter ([rand(1, 1000)])" -/obj/effect/hallucination/simple/xeno/throw_impact(A) +/obj/effect/hallucination/simple/xeno/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) update_icon("alienh_pounce") - if(A == target && target.stat!=DEAD) + if(hit_atom == target && target.stat!=DEAD) target.Knockdown(100) target.visible_message("[target] flails around wildly.","[name] pounces on you!") diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 7111ae416b..cd5c9d850b 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -101,10 +101,10 @@ to_chat(user, "You heat [name] with [I]!") ..() -/obj/item/reagent_containers/food/drinks/throw_impact(atom/target, datum/thrownthing/throwinfo) +/obj/item/reagent_containers/food/drinks/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() if(!.) //if the bottle wasn't caught - smash(target, throwinfo.thrower, TRUE) + smash(hit_atom, throwingdatum?.thrower, TRUE) /obj/item/reagent_containers/food/drinks/proc/smash(atom/target, mob/thrower, ranged = FALSE) if(!isGlass) diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 757af11b62..7f2b24ca11 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -505,7 +505,7 @@ isGlass = FALSE return -/obj/item/reagent_containers/food/drinks/bottle/molotov/throw_impact(atom/target,datum/thrownthing/throwdata) +/obj/item/reagent_containers/food/drinks/bottle/molotov/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) var/firestarter = 0 for(var/datum/reagent/R in reagents.reagent_list) for(var/A in accelerants) @@ -513,8 +513,8 @@ firestarter = 1 break if(firestarter && active) - target.fire_act() - new /obj/effect/hotspot(get_turf(target)) + hit_atom.fire_act() + new /obj/effect/hotspot(get_turf(hit_atom)) ..() /obj/item/reagent_containers/food/drinks/bottle/molotov/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/food_and_drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm index 183e64ff7e..f01966a0ff 100644 --- a/code/modules/food_and_drinks/food/snacks_egg.dm +++ b/code/modules/food_and_drinks/food/snacks_egg.dm @@ -31,7 +31,7 @@ var/color = mix_color_from_reagents(reagents.reagent_list) add_atom_colour(color, FIXED_COLOUR_PRIORITY) -/obj/item/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom) +/obj/item/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) //was it caught by a mob? var/turf/T = get_turf(hit_atom) new/obj/effect/decal/cleanable/egg_smudge(T) diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index 0c17814c98..41b08e8c7f 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -443,8 +443,8 @@ head.color = C add_overlay(head) -/obj/item/reagent_containers/food/snacks/lollipop/throw_impact(atom/A) - ..(A) +/obj/item/reagent_containers/food/snacks/lollipop/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + ..(hit_atom) throw_speed = 1 throwforce = 0 diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index 516c8b2c31..1c8b70dc13 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -65,7 +65,7 @@ reagents.add_reagent(extra_reagent, 3) /obj/item/reagent_containers/food/snacks/donut/meat - name = "Meat Donut" + name = "meat donut" desc = "Tastes as gross as it looks." icon_state = "donut_meat" bonus_reagents = list(/datum/reagent/consumable/ketchup = 1) @@ -152,7 +152,7 @@ icon_state = "jelly" decorated_icon = "jelly_homer" bonus_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/nutriment/vitamin = 1) - extra_reagent = "berryjuice" + extra_reagent = /datum/reagent/consumable/berryjuice tastes = list("jelly" = 1, "donut" = 3) foodtype = JUNKFOOD | GRAIN | FRIED | FRUIT | SUGAR | BREAKFAST @@ -240,7 +240,7 @@ name = "jelly donut" desc = "You jelly?" icon_state = "jelly" - extra_reagent = "slimejelly" + extra_reagent = /datum/reagent/toxin/slimejelly foodtype = JUNKFOOD | GRAIN | FRIED | TOXIC | SUGAR | BREAKFAST /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index 357a921c66..0c3623efda 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -29,7 +29,7 @@ foodtype = GRAIN | DAIRY | SUGAR var/stunning = TRUE -/obj/item/reagent_containers/food/snacks/pie/cream/throw_impact(atom/hit_atom) +/obj/item/reagent_containers/food/snacks/pie/cream/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() if(!.) //if we're not being caught splat(hit_atom) diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index 27ee54815f..f3b8e466f3 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -66,10 +66,12 @@ God bless America. oil_use = initial(oil_use) - (oil_efficiency * 0.0095) fry_speed = oil_efficiency -/obj/machinery/deepfryer/examine() +/obj/machinery/deepfryer/examine(mob/user) . = ..() if(frying) . += "You can make out \a [frying] in the oil." + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Frying at [fry_speed*100]% speed.
Using [oil_use*10] units of oil per second.
" /obj/machinery/deepfryer/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/reagent_containers/pill)) diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index e5c5a4f933..4406491f10 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -30,6 +30,14 @@ if(M.rating >= 2) ignore_clothing = TRUE +/obj/machinery/gibber/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Outputting [meat_produced] meat slab(s) after [gibtime*0.1] seconds of processing." + for(var/obj/item/stock_parts/manipulator/M in component_parts) + if(M.rating >= 2) + . += "Gibber has been upgraded to process inorganic materials." + /obj/machinery/gibber/update_icon() cut_overlays() if (dirty) diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm index c25cb2288f..3d7341308b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm @@ -1,6 +1,6 @@ /obj/machinery/monkey_recycler name = "monkey recycler" - desc = "A machine used for recycling dead monkeys into monkey cubes. It currently produces 1 cube for every 5 monkeys inserted." // except it literally never does + desc = "A machine used for recycling dead monkeys into monkey cubes." // except it literally never does icon = 'icons/obj/kitchen.dmi' icon_state = "grinder" layer = BELOW_OBJ_LAYER @@ -22,7 +22,11 @@ cubes_made = M.rating cube_production = cubes_made required_grind = req_grind - src.desc = "A machine used for recycling dead monkeys into monkey cubes. It currently produces [cubes_made] cube(s) for every [required_grind] monkey(s) inserted." + +/obj/machinery/monkey_recycler/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Producing [cube_production] cubes for every monkey inserted." /obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, params) if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O)) diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 35ce25bbaf..b81c127523 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -21,6 +21,11 @@ for(var/obj/item/stock_parts/manipulator/M in component_parts) rating_speed = M.rating +/obj/machinery/processor/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Outputting [rating_amount] item(s) at [rating_speed*100]% speed." + /obj/machinery/processor/proc/process_food(datum/food_processor_process/recipe, atom/movable/what) if (recipe.output && loc && !QDELETED(src)) for(var/i = 0, i < rating_amount, i++) diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 893a53ede7..7619f68448 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -33,6 +33,11 @@ for(var/obj/item/stock_parts/matter_bin/B in component_parts) max_n_of_items = 1500 * B.rating +/obj/machinery/smartfridge/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: This unit can hold a maximum of [max_n_of_items] items." + /obj/machinery/smartfridge/power_change() ..() update_icon() diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index 351495b97a..bd556b8397 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -231,7 +231,7 @@ if(boxes.len >= 3 && prob(25 * boxes.len)) disperse_pizzas() -/obj/item/pizzabox/throw_impact(atom/movable/AM) +/obj/item/pizzabox/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(boxes.len >= 2 && prob(20 * boxes.len)) disperse_pizzas() diff --git a/code/modules/holiday/halloween/halloween.dm b/code/modules/holiday/halloween/halloween.dm index 24225c1a20..d3b9b92b4f 100644 --- a/code/modules/holiday/halloween/halloween.dm +++ b/code/modules/holiday/halloween/halloween.dm @@ -132,7 +132,7 @@ speak_emote = list("howls") emote_hear = list("wails","screeches") density = FALSE - anchored = TRUE + move_resist = MOVE_FORCE_OVERPOWERING incorporeal_move = 1 layer = 4 var/timer = 0 diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm index bd4c26e0f2..2b116bbfd3 100644 --- a/code/modules/holiday/halloween/jacqueen.dm +++ b/code/modules/holiday/halloween/jacqueen.dm @@ -450,7 +450,7 @@ reagents.add_reagent(R, 30) name = "[R] Potion" -/obj/item/reagent_containers/potion_container/throw_impact(atom/target) +/obj/item/reagent_containers/potion_container/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() sleep(20) var/datum/effect_system/smoke_spread/chem/s = new() diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index 7bd2ac689b..206a5c14a3 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -80,7 +80,7 @@ item_state = "dodgeball" desc = "Used for playing the most violent and degrading of childhood games." -/obj/item/toy/beach_ball/holoball/dodgeball/throw_impact(atom/hit_atom) +/obj/item/toy/beach_ball/holoball/dodgeball/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() if((ishuman(hit_atom))) var/mob/living/carbon/M = hit_atom @@ -123,7 +123,7 @@ else ..() -/obj/structure/holohoop/hitby(atom/movable/AM) +/obj/structure/holohoop/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if (isitem(AM) && !istype(AM,/obj/item/projectile)) if(prob(50)) AM.forceMove(get_turf(src)) diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index e946973ded..2376010408 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -52,6 +52,12 @@ productivity = P max_items = max_storage + +/obj/machinery/biogenerator/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Productivity at [productivity*100]%.
Matter consumption reduced by [(efficiency*25)-25]%.
Machine can hold up to [max_items] pieces of produce.
" + /obj/machinery/biogenerator/on_reagent_change(changetype) //When the reagents change, change the icon as well. update_icon() diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index bb751c993a..f99cfde92d 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -91,7 +91,7 @@ squash(user) ..() -/obj/item/reagent_containers/food/snacks/grown/throw_impact(atom/hit_atom) +/obj/item/reagent_containers/food/snacks/grown/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) //was it caught by a mob? if(seed) for(var/datum/plant_gene/trait/T in seed.genes) diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index bdbf999f7a..ef925e3965 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -48,7 +48,7 @@ return 1 return 0 -/obj/item/grown/throw_impact(atom/hit_atom) +/obj/item/grown/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) //was it caught by a mob? if(seed) for(var/datum/plant_gene/trait/T in seed.genes) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 5bc3fb0b60..1cd63db6da 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -46,6 +46,11 @@ maxwater = tmp_capacity * 50 // Up to 300 maxnutri = tmp_capacity * 5 // Up to 30 +/obj/machinery/hydroponics/constructable/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Tray efficiency at [rating*100]%." + /obj/machinery/hydroponics/Destroy() if(myseed) qdel(myseed) @@ -90,6 +95,7 @@ return ..() if(istype(Proj , /obj/item/projectile/energy/floramut)) mutate() + return BULLET_ACT_HIT else if(istype(Proj , /obj/item/projectile/energy/florayield)) return myseed.bullet_act(Proj) else diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index 5af19b8431..617b980654 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -56,6 +56,11 @@ for(var/obj/item/stock_parts/manipulator/M in component_parts) seed_multiplier = M.rating +/obj/machinery/seed_extractor/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Extracting [seed_multiplier] seed(s) per piece of produce.
Machine can store up to [max_seeds]% seeds.
" + /obj/machinery/seed_extractor/attackby(obj/item/O, mob/user, params) if(default_deconstruction_screwdriver(user, "sextractor_open", "sextractor", O)) diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 9a0085eb3d..c28ae3b4c5 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -145,6 +145,7 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) adjust_yield(1 * rating) else if(prob(1/(yield * yield) * 100))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2... adjust_yield(1 * rating) + return BULLET_ACT_HIT else return ..() diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index 46f8017b10..4f9afd9ed5 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -1310,34 +1310,3 @@ set_pin_data(IC_OUTPUT, 2, regurgitated_contents) push_data() activate_pin(2) - -//Degens -/obj/item/integrated_circuit/input/bonermeter - name = "bonermeter" - desc = "Detects the target's arousal and various statistics about the target's arousal levels. Invasive!" - icon_state = "medscan" - complexity = 4 - inputs = list("target" = IC_PINTYPE_REF) - outputs = list( - "current arousal" = IC_PINTYPE_NUMBER, - "minimum arousal" = IC_PINTYPE_NUMBER, - "maximum arousal" = IC_PINTYPE_NUMBER, - "can be aroused" = IC_PINTYPE_BOOLEAN - ) - activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 40 - -/obj/item/integrated_circuit/input/bonermeter/do_work() - - var/mob/living/L = get_pin_data_as_type(IC_INPUT, 1, /mob/living) - - if(!istype(L) || !L.Adjacent(get_turf(src)) ) //Invalid input - return - - set_pin_data(IC_OUTPUT, 1, L.getArousalLoss()) - set_pin_data(IC_OUTPUT, 2, L.min_arousal) - set_pin_data(IC_OUTPUT, 3, L.max_arousal) - set_pin_data(IC_OUTPUT, 4, L.canbearoused) - push_data() - activate_pin(2) \ No newline at end of file diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers/_mapping_helpers.dm similarity index 59% rename from code/modules/mapping/mapping_helpers.dm rename to code/modules/mapping/mapping_helpers/_mapping_helpers.dm index a7f84fd71f..99184b1c3e 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers/_mapping_helpers.dm @@ -1,90 +1,4 @@ //Landmarks and other helpers which speed up the mapping process and reduce the number of unique instances/subtypes of items/turf/ect - - - -/obj/effect/baseturf_helper //Set the baseturfs of every turf in the /area/ it is placed. - name = "baseturf editor" - icon = 'icons/effects/mapping_helpers.dmi' - icon_state = "" - - var/list/baseturf_to_replace - var/baseturf - - layer = POINT_LAYER - -/obj/effect/baseturf_helper/Initialize() - . = ..() - return INITIALIZE_HINT_LATELOAD - -/obj/effect/baseturf_helper/LateInitialize() - if(!baseturf_to_replace) - baseturf_to_replace = typecacheof(list(/turf/open/space,/turf/baseturf_bottom)) - else if(!length(baseturf_to_replace)) - baseturf_to_replace = list(baseturf_to_replace = TRUE) - else if(baseturf_to_replace[baseturf_to_replace[1]] != TRUE) // It's not associative - var/list/formatted = list() - for(var/i in baseturf_to_replace) - formatted[i] = TRUE - baseturf_to_replace = formatted - - var/area/our_area = get_area(src) - for(var/i in get_area_turfs(our_area, z)) - replace_baseturf(i) - - qdel(src) - -/obj/effect/baseturf_helper/proc/replace_baseturf(turf/thing) - var/list/baseturf_cache = thing.baseturfs - if(length(baseturf_cache)) - for(var/i in baseturf_cache) - if(baseturf_to_replace[i]) - baseturf_cache -= i - if(!baseturf_cache.len) - thing.assemble_baseturfs(baseturf) - else - thing.PlaceOnBottom(null, baseturf) - else if(baseturf_to_replace[thing.baseturfs]) - thing.assemble_baseturfs(baseturf) - else - thing.PlaceOnBottom(null, baseturf) - -/obj/effect/baseturf_helper/space - name = "space baseturf editor" - baseturf = /turf/open/space - -/obj/effect/baseturf_helper/asteroid - name = "asteroid baseturf editor" - baseturf = /turf/open/floor/plating/asteroid - -/obj/effect/baseturf_helper/asteroid/airless - name = "asteroid airless baseturf editor" - baseturf = /turf/open/floor/plating/asteroid/airless - -/obj/effect/baseturf_helper/asteroid/basalt - name = "asteroid basalt baseturf editor" - baseturf = /turf/open/floor/plating/asteroid/basalt - -/obj/effect/baseturf_helper/asteroid/snow - name = "asteroid snow baseturf editor" - baseturf = /turf/open/floor/plating/asteroid/snow - -/obj/effect/baseturf_helper/beach/sand - name = "beach sand baseturf editor" - baseturf = /turf/open/floor/plating/beach/sand - -/obj/effect/baseturf_helper/beach/water - name = "water baseturf editor" - baseturf = /turf/open/floor/plating/beach/water - -/obj/effect/baseturf_helper/lava - name = "lava baseturf editor" - baseturf = /turf/open/lava/smooth - -/obj/effect/baseturf_helper/lava_land/surface - name = "lavaland baseturf editor" - baseturf = /turf/open/lava/smooth/lava_land_surface - - /obj/effect/mapping_helpers icon = 'icons/effects/mapping_helpers.dmi' icon_state = "" @@ -94,7 +8,6 @@ ..() return late ? INITIALIZE_HINT_LATELOAD : INITIALIZE_HINT_QDEL - //airlock helpers /obj/effect/mapping_helpers/airlock layer = DOOR_HELPER_LAYER diff --git a/code/modules/mapping/mapping_helpers/baseturf.dm b/code/modules/mapping/mapping_helpers/baseturf.dm new file mode 100644 index 0000000000..f4bd0d7c7f --- /dev/null +++ b/code/modules/mapping/mapping_helpers/baseturf.dm @@ -0,0 +1,82 @@ +/obj/effect/baseturf_helper //Set the baseturfs of every turf in the /area/ it is placed. + name = "baseturf editor" + icon = 'icons/effects/mapping_helpers.dmi' + icon_state = "" + + var/list/baseturf_to_replace + var/baseturf + + layer = POINT_LAYER + +/obj/effect/baseturf_helper/Initialize() + . = ..() + return INITIALIZE_HINT_LATELOAD + +/obj/effect/baseturf_helper/LateInitialize() + if(!baseturf_to_replace) + baseturf_to_replace = typecacheof(list(/turf/open/space,/turf/baseturf_bottom)) + else if(!length(baseturf_to_replace)) + baseturf_to_replace = list(baseturf_to_replace = TRUE) + else if(baseturf_to_replace[baseturf_to_replace[1]] != TRUE) // It's not associative + var/list/formatted = list() + for(var/i in baseturf_to_replace) + formatted[i] = TRUE + baseturf_to_replace = formatted + + var/area/our_area = get_area(src) + for(var/i in get_area_turfs(our_area, z)) + replace_baseturf(i) + + qdel(src) + +/obj/effect/baseturf_helper/proc/replace_baseturf(turf/thing) + var/list/baseturf_cache = thing.baseturfs + if(length(baseturf_cache)) + for(var/i in baseturf_cache) + if(baseturf_to_replace[i]) + baseturf_cache -= i + if(!baseturf_cache.len) + thing.assemble_baseturfs(baseturf) + else + thing.PlaceOnBottom(null, baseturf) + else if(baseturf_to_replace[thing.baseturfs]) + thing.assemble_baseturfs(baseturf) + else + thing.PlaceOnBottom(null, baseturf) + +/obj/effect/baseturf_helper/space + name = "space baseturf editor" + baseturf = /turf/open/space + +/obj/effect/baseturf_helper/asteroid + name = "asteroid baseturf editor" + baseturf = /turf/open/floor/plating/asteroid + +/obj/effect/baseturf_helper/asteroid/airless + name = "asteroid airless baseturf editor" + baseturf = /turf/open/floor/plating/asteroid/airless + +/obj/effect/baseturf_helper/asteroid/basalt + name = "asteroid basalt baseturf editor" + baseturf = /turf/open/floor/plating/asteroid/basalt + +/obj/effect/baseturf_helper/asteroid/snow + name = "asteroid snow baseturf editor" + baseturf = /turf/open/floor/plating/asteroid/snow + +/obj/effect/baseturf_helper/beach/sand + name = "beach sand baseturf editor" + baseturf = /turf/open/floor/plating/beach/sand + +/obj/effect/baseturf_helper/beach/water + name = "water baseturf editor" + baseturf = /turf/open/floor/plating/beach/water + +/obj/effect/baseturf_helper/lava + name = "lava baseturf editor" + baseturf = /turf/open/lava/smooth + +/obj/effect/baseturf_helper/lava_land/surface + name = "lavaland baseturf editor" + baseturf = /turf/open/lava/smooth/lava_land_surface + diff --git a/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm b/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm new file mode 100644 index 0000000000..78a835cffa --- /dev/null +++ b/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm @@ -0,0 +1,43 @@ +//Builds networks like power cables/atmos lines/etc +//Just a holder parent type for now.. +/obj/effect/mapping_helpers/network_builder + /// set var to true to not del on lateload + var/custom_spawned = FALSE + + icon = 'icons/effects/mapping_helpers.dmi' + + late = TRUE + /// what directions we know connections are in + var/list/network_directions = list() + +/obj/effect/mapping_helpers/network_builder/Initialize(mapload) + . = ..() + to_chat(world, "DEBUG: Initializing [COORD(src)]") + var/conflict = check_duplicates() + if(conflict) + stack_trace("WARNING: [type] network building helper found check_duplicates() conflict [conflict] in its location.!") + return INITIALIZE_HINT_QDEL + if(!mapload) + if(GLOB.Debug2) + custom_spawned = TRUE + return INITIALIZE_HINT_NORMAL + else + return INITIALIZE_HINT_QDEL + return INITIALIZE_HINT_LATELOAD + +/// How this works: On LateInitialize, detect all directions that this should be applicable to, and do what it needs to do, and then inform all network builders in said directions that it's been around since it won't be around afterwards. +/obj/effect/mapping_helpers/network_builder/LateInitialize() + to_chat(world, "DEBUG: LateInitializing [COORD(src)]") + scan_directions() + build_network() + if(!custom_spawned) + qdel(src) + +/obj/effect/mapping_helpers/network_builder/proc/check_duplicates() + CRASH("Base abstract network builder tried to check duplicates.") + +/obj/effect/mapping_helpers/network_builder/proc/scan_directions() + CRASH("Base abstract network builder tried to scan directions.") + +/obj/effect/mapping_helpers/network_builder/proc/build_network() + CRASH("Base abstract network builder tried to build network.") diff --git a/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm new file mode 100644 index 0000000000..1983bab3b6 --- /dev/null +++ b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm @@ -0,0 +1,96 @@ +/* Automatically places pipes on init based on any pipes connecting to it and adjacent helpers. Only supports cardinals. + * Conflicts with ANY PIPE ON ITS LAYER, as well as atmos network build helpers on the same layer, as well as any pipe on all layers. Do those manually. +*/ +/obj/effect/mapping_helpers/network_builder/atmos_pipe + name = "atmos pipe autobuilder" + icon_state = "atmospipebuilder" + + /// Layer to put our pipes on + var/pipe_layer = PIPING_LAYER_DEFAULT + + /// Color to set our pipes to + var/pipe_color + + /// Whether or not pipes we make are visible + var/visible_pipes = FALSE + + color = null + +/obj/effect/mapping_helpers/network_builder/atmos_pipe/check_duplicates() + for(var/obj/effect/mapping_helpers/network_builder/atmos_pipe/other in loc) + if(other == src) + continue + if(other.pipe_layer == pipe_layer) + return other + for(var/obj/machinery/atmospherics/A in loc) + if(A.pipe_flags & PIPING_ALL_LAYER) + return A + if(A.piping_layer == pipe_layer) + return A + return FALSE + +/// Scans directions, sets network_directions to have every direction that we can link to. If there's another power cable builder detected, make sure they know we're here by adding us to their cable directions list before we're deleted. +/obj/effect/mapping_helpers/network_builder/atmos_pipe/scan_directions() + var/turf/T + for(var/i in GLOB.cardinals) + if(i in network_directions) + continue //we're already set, that means another builder set us. + T = get_step(loc, i) + if(!T) + continue + var/found = FALSE + for(var/obj/effect/mapping_helpers/network_builder/atmos_pipe/other in T) + if(other.pipe_layer == pipe_layer) + network_directions += i + other.network_directions += turn(i, 180) + found = TRUE + break + if(found) + continue + for(var/obj/machinery/atmospherics/A in T) + if((A.piping_layer == pipe_layer) && (A.initialize_directions & turn(i, 180))) + network_directions += i + break + return network_directions + +/// Directions should only ever have cardinals. +/obj/effect/mapping_helpers/network_builder/atmos_pipe/build_network() + if(length(network_directions) <= 1) + return + var/obj/machinery/atmospherics/pipe/built + switch(length(network_directions)) + if(2) //straight pipe + built = new /obj/machinery/atmospherics/pipe/simple(loc) + var/d1 = network_directions[1] + var/d2 = network_directions[2] + var/combined = d1 | d2 + if(combined in GLOB.diagonals) + built.setDir(combined) + else + built.setDir(d1) + if(3) //manifold + var/list/missing = network_directions ^ GLOB.cardinals + missing = missing[1] + built = new /obj/machinery/atmospherics/pipe/manifold(loc) + built.setDir(missing) + if(4) //4 way manifold + built = new /obj/machinery/atmospherics/pipe/manifold4w(loc) + built.SetInitDirections() + built.on_construction(pipe_color, pipe_layer) + built.hide(!visible_pipes) + +/obj/effect/mapping_helpers/network_builder/atmos_pipe/distro + name = "distro line autobuilder" + pipe_layer = PIPING_LAYER_MIN + pixel_x = -PIPING_LAYER_P_X + pixel_y = -PIPING_LAYER_P_Y + pipe_color = rgb(130,43,255) + color = rgb(130,43,255) + +/obj/effect/mapping_helpers/network_builder/atmos_pipe/scrubbers + name = "scrubbers line autobuilder" + pipe_layer = PIPING_LAYER_MAX + pixel_x = PIPING_LAYER_P_X + pixel_y = PIPING_LAYER_P_Y + pipe_color = rgb(255,0,0) + color = rgb(255,0,0) diff --git a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm new file mode 100644 index 0000000000..5385045618 --- /dev/null +++ b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm @@ -0,0 +1,189 @@ +#define NO_KNOT 0 +#define KNOT_AUTO 1 +#define KNOT_FORCED 2 + +/// Automatically links on init to power cables and other cable builder helpers. Only supports cardinals. +/obj/effect/mapping_helpers/network_builder/power_cable + name = "power line autobuilder" + icon_state = "powerlinebuilder" + + color = "#ff0000" + + /// Whether or not we forcefully make a knot + var/knot = NO_KNOT + + /// cable color as from GLOB.cable_colors + var/cable_color = "red" + +/obj/effect/mapping_helpers/network_builder/power_cable/check_duplicates() + var/obj/structure/cable/C = locate() in loc + if(C) + return C + for(var/obj/effect/mapping_helpers/network_builder/power_cable/other in loc) + if(other == src) + continue + return other + +/// Scans directions, sets network_directions to have every direction that we can link to. If there's another power cable builder detected, make sure they know we're here by adding us to their cable directions list before we're deleted. +/obj/effect/mapping_helpers/network_builder/power_cable/scan_directions() + var/turf/T + for(var/i in GLOB.cardinals) + if(i in network_directions) + continue //we're already set, that means another builder set us. + T = get_step(loc, i) + if(!T) + continue + var/obj/effect/mapping_helpers/network_builder/power_cable/other = locate() in T + if(other) + network_directions += i + other.network_directions += turn(i, 180) + continue + for(var/obj/structure/cable/C in T) + if(C.d1 == turn(i, 180) || C.d2 == turn(i, 180)) + network_directions += i + continue + return network_directions + +/// Directions should only ever have cardinals. +/obj/effect/mapping_helpers/network_builder/power_cable/build_network() + if(!length(network_directions)) + return + else if(length(network_directions) == 1) + new /obj/structure/cable(loc, cable_color, NONE, network_directions[1]) + else + if(knot == KNOT_FORCED) + for(var/d in network_directions) + new /obj/structure/cable(loc, cable_color, NONE, d) + else + var/do_knot = (knot == KNOT_FORCED) || ((knot == KNOT_AUTO) && should_auto_knot()) + var/dirs = length(network_directions) + for(var/i in 1 to dirs - 1) + var/li = (i == 1)? dirs : (i - 1) + var/d1 = network_directions[i] + var/d2 = network_directions[li] + if(d1 > d2) //this is ugly please help me + d1 = network_directions[li] + d2 = network_directions[i] + new /obj/structure/cable(loc, cable_color, d1, d2) + if(do_knot) + new /obj/structure/cable(loc, cable_color, NONE, network_directions[i]) + do_knot = FALSE + +/obj/effect/mapping_helpers/network_builder/power_cable/proc/should_auto_knot() + return (locate(/obj/machinery/power/terminal) in loc) + +/obj/effect/mapping_helpers/network_builder/power_cable/knot + icon_state = "powerlinebuilderknot" + knot = KNOT_FORCED + +/obj/effect/mapping_helpers/network_builder/power_cable/auto + icon_state = "powerlinebuilderauto" + knot = KNOT_AUTO + +// Red +/obj/effect/mapping_helpers/network_builder/power_cable/red + color = "#ff0000" + cable_color = "red" + +/obj/effect/mapping_helpers/network_builder/power_cable/red/knot + icon_state = "powerlinebuilderknot" + knot = KNOT_FORCED + +/obj/effect/mapping_helpers/network_builder/power_cable/red/auto + icon_state = "powerlinebuilderauto" + knot = KNOT_AUTO + +// White +/obj/effect/mapping_helpers/network_builder/power_cable/white + color = "#ffffff" + cable_color = "white" + +/obj/effect/mapping_helpers/network_builder/power_cable/white/knot + icon_state = "powerlinebuilderknot" + knot = KNOT_FORCED + +/obj/effect/mapping_helpers/network_builder/power_cable/white/auto + icon_state = "powerlinebuilderauto" + knot = KNOT_AUTO + +// Cyan +/obj/effect/mapping_helpers/network_builder/power_cable/cyan + color = "#00ffff" + cable_color = "cyan" + +/obj/effect/mapping_helpers/network_builder/power_cable/cyan/knot + icon_state = "powerlinebuilderknot" + knot = KNOT_FORCED + +/obj/effect/mapping_helpers/network_builder/power_cable/cyan/auto + icon_state = "powerlinebuilderauto" + knot = KNOT_AUTO + +// Orange +/obj/effect/mapping_helpers/network_builder/power_cable/orange + color = "#ff8000" + cable_color = "orange" + +/obj/effect/mapping_helpers/network_builder/power_cable/orange/knot + icon_state = "powerlinebuilderknot" + knot = KNOT_FORCED + +/obj/effect/mapping_helpers/network_builder/power_cable/orange/auto + icon_state = "powerlinebuilderauto" + knot = KNOT_AUTO + +// Pink +/obj/effect/mapping_helpers/network_builder/power_cable/pink + color = "#ff3cc8" + cable_color = "pink" + +/obj/effect/mapping_helpers/network_builder/power_cable/pink/knot + icon_state = "powerlinebuilderknot" + knot = KNOT_FORCED + +/obj/effect/mapping_helpers/network_builder/power_cable/pink/auto + icon_state = "powerlinebuilderauto" + knot = KNOT_AUTO + +// Blue +/obj/effect/mapping_helpers/network_builder/power_cable/blue + color = "#1919c8" + cable_color = "blue" + +/obj/effect/mapping_helpers/network_builder/power_cable/blue/knot + icon_state = "powerlinebuilderknot" + knot = KNOT_FORCED + +/obj/effect/mapping_helpers/network_builder/power_cable/blue/auto + icon_state = "powerlinebuilderauto" + knot = KNOT_AUTO + +// Green +/obj/effect/mapping_helpers/network_builder/power_cable/green + color = "#00aa00" + cable_color = "green" + +/obj/effect/mapping_helpers/network_builder/power_cable/green/knot + icon_state = "powerlinebuilderknot" + knot = KNOT_FORCED + +/obj/effect/mapping_helpers/network_builder/power_cable/green/auto + icon_state = "powerlinebuilderauto" + knot = KNOT_AUTO + +// Yellow +/obj/effect/mapping_helpers/network_builder/power_cable/yellow + color = "#ffff00" + cable_color = "yellow" + +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/knot + icon_state = "powerlinebuilderknot" + knot = KNOT_FORCED + +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto + icon_state = "powerlinebuilderauto" + knot = KNOT_AUTO + +#undef NO_KNOT +#undef KNOT_AUTO +#undef KNOT_FORCED diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm index 9c578badb1..34ce6ef35c 100644 --- a/code/modules/mapping/ruins.dm +++ b/code/modules/mapping/ruins.dm @@ -22,6 +22,8 @@ for(var/i in get_affected_turfs(central_turf, 1)) var/turf/T = i + for(var/obj/structure/spawner/nest in T) + qdel(nest) for(var/mob/living/simple_animal/monster in T) qdel(monster) for(var/obj/structure/flora/ash/plant in T) diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index f46f4f785c..fd366670f0 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -11,6 +11,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) var/uses_left = 3 var/can_use_indoors var/safe_for_living_creatures = 1 + var/max_force_fulton = MOVE_FORCE_STRONG /obj/item/extraction_pack/examine() . = ..() @@ -57,7 +58,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) return if(!isturf(A.loc)) // no extracting stuff inside other stuff return - if(A.anchored) + if(A.anchored || (A.move_resist > max_force_fulton)) return to_chat(user, "You start attaching the pack to [A]...") if(do_after(user,50,target=A)) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 950ae7dda1..1ddb3a3189 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -87,6 +87,14 @@ return . = ..() +/obj/machinery/computer/shuttle/mining/common + name = "lavaland shuttle console" + desc = "Used to call and send the lavaland shuttle." + req_access = list() + circuit = /obj/item/circuitboard/computer/mining_shuttle/common + shuttleId = "mining_common" + possible_destinations = "whiteship_home;lavaland_common_away;landing_zone_dock;mining_public" + /**********************Mining car (Crate like thing, not the rail car)**************************/ /obj/structure/closet/crate/miningcar diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 29a835ddde..7765bf8713 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -99,7 +99,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ recipes = GLOB.sand_recipes . = ..() -/obj/item/stack/ore/glass/throw_impact(atom/hit_atom) +/obj/item/stack/ore/glass/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(..() || !ishuman(hit_atom)) return var/mob/living/carbon/human/C = hit_atom @@ -250,7 +250,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/twohanded/required/gibtonite/bullet_act(obj/item/projectile/P) GibtoniteReaction(P.firer) - ..() + return ..() /obj/item/twohanded/required/gibtonite/ex_act() GibtoniteReaction(null, 1) diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm index a1f46c0a64..ff1d9231f7 100644 --- a/code/modules/mob/camera/camera.dm +++ b/code/modules/mob/camera/camera.dm @@ -3,7 +3,8 @@ /mob/camera name = "camera mob" density = FALSE - anchored = TRUE + move_force = INFINITY + move_resist = INFINITY status_flags = GODMODE // You can't damage it. mouse_opacity = MOUSE_OPACITY_TRANSPARENT see_in_dark = 7 diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 90e16649c9..0c50cb0468 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -4,6 +4,7 @@ INITIALIZE_IMMEDIATE(/mob/dead) /mob/dead sight = SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF + move_resist = INFINITY throwforce = 0 /mob/dead/Initialize() diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index ae635fa371..0418b281e6 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -12,8 +12,6 @@ stat = DEAD canmove = FALSE - anchored = TRUE // don't get pushed around - var/mob/living/new_character //for instant transfer once the round is set up //Used to make sure someone doesn't get spammed with messages if they're ineligible for roles diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index d234aafca6..3d07649e2f 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -12,7 +12,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) stat = DEAD density = FALSE canmove = 0 - anchored = TRUE // don't get pushed around see_invisible = SEE_INVISIBLE_OBSERVER see_in_dark = 100 invisibility = INVISIBILITY_OBSERVER @@ -664,10 +663,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(src, "This creature is too powerful for you to possess!") return 0 - if(istype (target, /mob/living/simple_animal/hostile/spawner)) - to_chat(src, "This isn't really a creature, now is it!") - return 0 - if(can_reenter_corpse && mind && mind.current) if(alert(src, "Your soul is still tied to your former life as [mind.current.name], if you go forward there is no going back to that life. Are you sure you wish to continue?", "Move On", "Yes", "No") == "No") return 0 diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index 4ed539adc2..e8a9b50e98 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -14,7 +14,7 @@ /obj/effect/dummy/phased_mob/slaughter/ex_act() return /obj/effect/dummy/phased_mob/slaughter/bullet_act() - return + return BULLET_ACT_FORCE_PIERCE /obj/effect/dummy/phased_mob/slaughter/singularity_act() return diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index d830957056..8de60cba2f 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -5,7 +5,7 @@ /mob/living/carbon/alien/get_ear_protection() return 2 //no ears -/mob/living/carbon/alien/hitby(atom/movable/AM, skipcatch, hitpush) +/mob/living/carbon/alien/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) return ..(AM, skipcatch = TRUE, hitpush = FALSE) /mob/living/carbon/alien/can_embed(obj/item/I) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index 3babab4586..b20383301d 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -54,15 +54,15 @@ weather_immunities -= "lava" update_icons() -/mob/living/carbon/alien/humanoid/hunter/throw_impact(atom/A) +/mob/living/carbon/alien/humanoid/hunter/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!leaping) return ..() pounce_cooldown = world.time + pounce_cooldown_time - if(A) - if(isliving(A)) - var/mob/living/L = A + if(hit_atom) + if(isliving(hit_atom)) + var/mob/living/L = hit_atom if(!L.check_shields(src, 0, "the [name]", attack_type = LEAP_ATTACK)) L.visible_message("[src] pounces on [L]!", "[src] pounces on you!") L.Knockdown(100) @@ -72,8 +72,8 @@ Knockdown(40, 1, 1) toggle_leap(0) - else if(A.density && !A.CanPass(src)) - visible_message("[src] smashes into [A]!", "[src] smashes into [A]!") + else if(hit_atom.density && !hit_atom.CanPass(src)) + visible_message("[src] smashes into [hit_atom]!", "[src] smashes into [hit_atom]!") Knockdown(40, 1, 1) if(leaping) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 8e1e5aab8d..fb26a40350 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -56,7 +56,7 @@ /mob/living/carbon/alien/larva/toggle_throw_mode() return -/mob/living/carbon/alien/larva/start_pulling() +/mob/living/carbon/alien/larva/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) return /mob/living/carbon/alien/larva/stripPanelUnequip(obj/item/what, mob/who) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 0f6fc7e944..8e5e327f39 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -115,7 +115,7 @@ if(icon_state == "[initial(icon_state)]_thrown") icon_state = "[initial(icon_state)]" -/obj/item/clothing/mask/facehugger/throw_impact(atom/hit_atom) +/obj/item/clothing/mask/facehugger/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() if(stat == CONSCIOUS) icon_state = "[initial(icon_state)]" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index e8f42b707c..6123c5b60f 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -94,15 +94,13 @@ return 1 return ..() -/mob/living/carbon/throw_impact(atom/hit_atom, throwingdatum) +/mob/living/carbon/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() var/hurt = TRUE - if(istype(throwingdatum, /datum/thrownthing)) - var/datum/thrownthing/D = throwingdatum - if(iscyborg(D.thrower)) - var/mob/living/silicon/robot/R = D.thrower - if(!R.emagged) - hurt = FALSE + if(throwingdatum?.thrower && iscyborg(throwingdatum.thrower)) + var/mob/living/silicon/robot/R = throwingdatum.thrower + if(!R.emagged) + hurt = FALSE if(hit_atom.density && isturf(hit_atom)) if(hurt) Knockdown(20) @@ -160,7 +158,7 @@ var/random_turn = a_intent == INTENT_HARM //END OF CIT CHANGES - var/obj/item/I = src.get_active_held_item() + var/obj/item/I = get_active_held_item() var/atom/movable/thrown_thing var/mob/living/throwable_mob @@ -201,11 +199,11 @@ if(thrown_thing) visible_message("[src] has thrown [thrown_thing].") - src.log_message("has thrown [thrown_thing]", LOG_ATTACK) + log_message("has thrown [thrown_thing]", LOG_ATTACK) do_attack_animation(target, no_effect = 1) playsound(loc, 'sound/weapons/punchmiss.ogg', 50, 1, -1) newtonian_move(get_dir(target, src)) - thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src, null, null, null, random_turn) + thrown_thing.safe_throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src, null, null, null, move_force, random_turn) @@ -463,7 +461,7 @@ I.throw_at(target,I.throw_range,I.throw_speed,src) if(61 to 90) //throw it down to the floor var/turf/target = get_turf(loc) - I.throw_at(target,I.throw_range,I.throw_speed,src) + I.safe_throw_at(target,I.throw_range,I.throw_speed,src, force = move_force) /mob/living/carbon/Stat() ..() diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index d893108bcd..5bffc4e276 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -41,9 +41,6 @@ update_damage_overlays() else adjustStaminaLoss(damage_amount, forced = forced) - //citadel code - if(AROUSAL) - adjustArousalLoss(damage_amount) return TRUE diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index e212e0e713..8edd5847de 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -41,7 +41,7 @@ var/accessory_msg if(istype(w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = w_uniform - if(U.attached_accessory) + if(U.attached_accessory && !(U.attached_accessory.flags_inv & HIDEACCESSORY) && !(U.flags_inv & HIDEACCESSORY)) accessory_msg += " with [icon2html(U.attached_accessory, user)] \a [U.attached_accessory]" . += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)][accessory_msg]." diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index c5d3ec18f9..934e0f08dc 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -51,7 +51,7 @@ if(prob(mind.martial_art.dodge_chance)) var/dodgemessage = pick("dodges under the projectile!","dodges to the right of the projectile!","jumps over the projectile!") visible_message("[src] [dodgemessage]", "You dodge the projectile!") - return -1 + return BULLET_ACT_BLOCK if(mind.martial_art && !incapacitated(FALSE, TRUE) && mind.martial_art.can_use(src) && mind.martial_art.deflection_chance) //Some martial arts users can deflect projectiles! if(prob(mind.martial_art.deflection_chance)) if(!lying && dna && !dna.check_mutation(HULK)) //But only if they're not lying down, and hulks can't do it @@ -60,12 +60,10 @@ else visible_message("[src] deflects the projectile!", "You deflect the projectile!") playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1) - if(!mind.martial_art.reroute_deflection) - return FALSE - else + if(mind.martial_art.reroute_deflection) P.firer = src P.setAngle(rand(0, 360))//SHING - return FALSE + return BULLET_ACT_FORCE_PIERCE return ..() @@ -104,7 +102,7 @@ return TRUE return FALSE -/mob/living/carbon/human/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE) +/mob/living/carbon/human/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) return dna?.species?.spec_hitby(AM, src) || ..() /mob/living/carbon/human/grabbedby(mob/living/carbon/user, supress_message = 0) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 821a3472e4..7507067597 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -39,10 +39,6 @@ //Stuff jammed in your limbs hurts handle_embedded_objects() - if(stat != DEAD) - //process your dick energy - handle_arousal(times_fired) - //Update our name based on whether our face is obscured/disfigured name = get_visible_name() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 5b8173b6ba..3357cc9ffe 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -323,12 +323,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) for(var/datum/disease/A in C.diseases) A.cure(FALSE) -//CITADEL EDIT - if(NOAROUSAL in species_traits) - C.canbearoused = FALSE - else - if(C.client) - C.canbearoused = C.client.prefs.arousable if(ishuman(C)) var/mob/living/carbon/human/H = C if(NOGENITALS in H.dna.species.species_traits) @@ -1586,10 +1580,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) "You slap [user == target ? "yourself" : "\the [target]"] in the face! ",\ "You hear a slap." ) - if (!HAS_TRAIT(target, TRAIT_NYMPHO)) - stop_wagging_tail(target) user.do_attack_animation(target, ATTACK_EFFECT_FACE_SLAP) user.adjustStaminaLossBuffered(3) + if (!HAS_TRAIT(target, TRAIT_PERMABONER)) + stop_wagging_tail(target) return FALSE else if(aim_for_groin && (target == user || target.lying || same_dir) && (target_on_help || target_restrained || target_aiming_for_groin)) if(target.client?.prefs.cit_toggles & NO_ASS_SLAP) @@ -1597,19 +1591,17 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) return FALSE user.do_attack_animation(target, ATTACK_EFFECT_ASS_SLAP) user.adjustStaminaLossBuffered(3) + target.adjust_arousal(20,maso = TRUE) + if (ishuman(target) && HAS_TRAIT(target, TRAIT_MASO) && target.has_dna() && prob(10)) + target.mob_climax(forced_climax=TRUE) + if (!HAS_TRAIT(target, TRAIT_PERMABONER)) + stop_wagging_tail(target) playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1) user.visible_message(\ "\The [user] slaps \the [target]'s ass!",\ "You slap [user == target ? "your" : "\the [target]'s"] ass!",\ "You hear a slap." - ) - if (target.canbearoused) - target.adjustArousalLoss(5) - if (target.getArousalLoss() >= 100 && ishuman(target) && HAS_TRAIT(target, TRAIT_MASO) && target.has_dna()) - target.mob_climax(forced_climax=TRUE) - if (!HAS_TRAIT(target, TRAIT_NYMPHO)) - stop_wagging_tail(target) - + ) return FALSE else if(attacker_style && attacker_style.disarm_act(user,target)) return 1 @@ -1962,10 +1954,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(BP) if(damage > 0 ? BP.receive_damage(damage_amount, 0) : BP.heal_damage(abs(damage_amount), 0)) H.update_damage_overlays() - if(HAS_TRAIT(H, TRAIT_MASO)) - H.adjustArousalLoss(damage_amount, 0) - if (H.getArousalLoss() >= 100 && ishuman(H) && H.has_dna()) - H.mob_climax(forced_climax=TRUE) + if(HAS_TRAIT(H, TRAIT_MASO) && prob(damage_amount)) + H.mob_climax(forced_climax=TRUE) else//no bodypart, we deal damage with a more general method. H.adjustBruteLoss(damage_amount) @@ -1996,8 +1986,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(BRAIN) var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.brain_mod H.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount) - if(AROUSAL) //Citadel edit - arousal - H.adjustArousalLoss(damage * hit_percent) return 1 /datum/species/proc/on_hit(obj/item/projectile/P, mob/living/carbon/human/H) @@ -2010,7 +1998,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) /datum/species/proc/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H) // called before a projectile hit - return 0 + return ///////////// //BREATHING// diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 3dad8449df..98c3f269dc 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -360,8 +360,8 @@ playsound(H, 'sound/effects/shovel_dig.ogg', 70, 1) H.visible_message("The [P.name] sinks harmlessly in [H]'s sandy body!", \ "The [P.name] sinks harmlessly in [H]'s sandy body!") - return 2 - return 0 + return BULLET_ACT_BLOCK + return ..() //Reflects lasers and resistant to burn damage, but very vulnerable to brute damage. Shatters on death. /datum/species/golem/glass @@ -397,8 +397,8 @@ var/turf/target = get_turf(P.starting) // redirect the projectile P.preparePixelProjectile(locate(CLAMP(target.x + new_x, 1, world.maxx), CLAMP(target.y + new_y, 1, world.maxy), H.z), H) - return -1 - return 0 + return BULLET_ACT_FORCE_PIERCE + return ..() //Teleports when hit or when it wants to /datum/species/golem/bluespace diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index fa2fd1c858..a0291631dc 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -60,8 +60,8 @@ if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) H.visible_message("[H] dances in the shadows, evading [P]!") playsound(T, "bullet_miss", 75, 1) - return -1 - return 0 + return BULLET_ACT_FORCE_PIERCE + return ..() /datum/species/shadow/nightmare/check_roundstart_eligible() return FALSE diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 61e68b50ec..ea9e6be78b 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -516,7 +516,6 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put if(bufferedstam && world.time > stambufferregentime) var/drainrate = max((bufferedstam*(bufferedstam/(5)))*0.1,1) bufferedstam = max(bufferedstam - drainrate, 0) - adjustStaminaLoss(drainrate*0.5) //END OF CIT CHANGES var/restingpwr = 1 + 4 * resting diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index 56ef4fe24a..3277c57b75 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -403,9 +403,9 @@ if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)) if(!Proj.nodamage && Proj.damage < src.health && isliving(Proj.firer)) retaliate(Proj.firer) - ..() + return ..() -/mob/living/carbon/monkey/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE) +/mob/living/carbon/monkey/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) if(istype(AM, /obj/item)) var/obj/item/I = AM if(I.throwforce < src.health && I.thrownby && ishuman(I.thrownby)) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 45d9c80a35..abcb0589ae 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -110,7 +110,7 @@ /mob/living/proc/apply_effects(stun = 0, knockdown = 0, unconscious = 0, irradiate = 0, slur = 0, stutter = 0, eyeblur = 0, drowsy = 0, blocked = FALSE, stamina = 0, jitter = 0, kd_stamoverride, kd_stammax) if(blocked >= 100) - return 0 + return BULLET_ACT_BLOCK if(stun) apply_effect(stun, EFFECT_STUN, blocked) if(knockdown) @@ -131,7 +131,7 @@ apply_damage(stamina, STAMINA, null, blocked) if(jitter) apply_effect(jitter, EFFECT_JITTER, blocked) - return 1 + return BULLET_ACT_HIT /mob/living/proc/getBruteLoss() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index c2a307950c..72b7b580f7 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -75,7 +75,7 @@ return if(ismovableatom(A)) var/atom/movable/AM = A - if(PushAM(AM)) + if(PushAM(AM, move_force)) return /mob/living/Bumped(atom/movable/AM) @@ -218,36 +218,46 @@ return //Called when we want to push an atom/movable -/mob/living/proc/PushAM(atom/movable/AM) +/mob/living/proc/PushAM(atom/movable/AM, force = move_force) if(now_pushing) - return 1 + return TRUE if(moving_diagonally)// no pushing during diagonal moves. - return 1 + return TRUE if(!client && (mob_size < MOB_SIZE_SMALL)) return - if(!AM.anchored) - now_pushing = 1 - var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window)) - var/obj/structure/window/W = AM - if(W.fulltile) - for(var/obj/structure/window/win in get_step(W,t)) - now_pushing = 0 - return - if(pulling == AM) - stop_pulling() - var/current_dir - if(isliving(AM)) - current_dir = AM.dir - step(AM, t) - if(current_dir) - AM.setDir(current_dir) - now_pushing = 0 + now_pushing = TRUE + var/t = get_dir(src, AM) + var/push_anchored = FALSE + if((AM.move_resist * MOVE_FORCE_CRUSH_RATIO) <= force) + if(move_crush(AM, move_force, t)) + push_anchored = TRUE + if((AM.move_resist * MOVE_FORCE_FORCEPUSH_RATIO) <= force) //trigger move_crush and/or force_push regardless of if we can push it normally + if(force_push(AM, move_force, t, push_anchored)) + push_anchored = TRUE + if((AM.anchored && !push_anchored) || (force < (AM.move_resist * MOVE_FORCE_PUSH_RATIO))) + now_pushing = FALSE + return + if (istype(AM, /obj/structure/window)) + var/obj/structure/window/W = AM + if(W.fulltile) + for(var/obj/structure/window/win in get_step(W,t)) + now_pushing = FALSE + return + if(pulling == AM) + stop_pulling() + var/current_dir + if(isliving(AM)) + current_dir = AM.dir + if(step(AM, t)) + step(src, t) + if(current_dir) + AM.setDir(current_dir) + now_pushing = FALSE -/mob/living/start_pulling(atom/movable/AM, supress_message = 0) +/mob/living/start_pulling(atom/movable/AM, state, force = pull_force, supress_message = FALSE) if(!AM || !src) return FALSE - if(!(AM.can_be_pulled(src))) + if(!(AM.can_be_pulled(src, state, force))) return FALSE if(throwing || incapacitated()) return FALSE diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 4c67922c18..6a14cce4af 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -34,7 +34,7 @@ return FALSE /mob/living/proc/on_hit(obj/item/projectile/P) - return + return BULLET_ACT_HIT /mob/living/proc/check_shields(atom/AM, damage, attack_text = "the attack", attack_type = MELEE_ATTACK, armour_penetration = 0) var/block_chance_modifier = round(damage / -3) @@ -76,16 +76,16 @@ /mob/living/bullet_act(obj/item/projectile/P, def_zone) if(P.original != src || P.firer != src) //try to block or reflect the bullet, can't do so when shooting oneself if(reflect_bullet_check(P, def_zone)) - return -1 // complete projectile permutation + return BULLET_ACT_FORCE_PIERCE // complete projectile permutation if(check_shields(P, P.damage, "the [P.name]", PROJECTILE_ATTACK, P.armour_penetration)) P.on_hit(src, 100, def_zone) - return 2 + return BULLET_ACT_BLOCK var/armor = run_armor_check(def_zone, P.flag, null, null, P.armour_penetration, null) if(!P.nodamage) apply_damage(P.damage, P.damage_type, def_zone, armor) if(P.dismemberment) check_projectile_dismemberment(P, def_zone) - return P.on_hit(src, armor) + return P.on_hit(src, armor) ? BULLET_ACT_HIT : BULLET_ACT_BLOCK /mob/living/proc/check_projectile_dismemberment(obj/item/projectile/P, def_zone) return 0 @@ -107,7 +107,7 @@ /mob/living/proc/can_embed(obj/item/I) return FALSE -/mob/living/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE) +/mob/living/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) var/obj/item/I var/throwpower = 30 if(isitem(AM)) @@ -189,7 +189,7 @@ adjust_fire_stacks(3) IgniteMob() -/mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = 0) +/mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = FALSE) if(user == anchored || !isturf(user.loc)) return FALSE @@ -215,7 +215,7 @@ return FALSE if(!user.pulling || user.pulling != src) - user.start_pulling(src, supress_message) + user.start_pulling(src, supress_message = supress_message) return if(!(status_flags & CANPUSH) || HAS_TRAIT(src, TRAIT_PUSHIMMUNE)) diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index 93bb9d1f8d..e0ea6350d7 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -2,6 +2,21 @@ . = ..() update_turf_movespeed(loc) +/mob/living/CanPass(atom/movable/mover, turf/target) + if((mover.pass_flags & PASSMOB)) + return TRUE + if(istype(mover, /obj/item/projectile)) + var/obj/item/projectile/P = mover + return !P.can_hit_target(src, P.permutated, src == P.original, TRUE) + if(mover.throwing) + return (!density || lying) + if(buckled == mover) + return TRUE + if(ismob(mover)) + if (mover in buckled_mobs) + return TRUE + return (!mover.density || !density || lying || (mover.throwing && mover.throwing.thrower == src && !ismob(mover))) + /mob/living/toggle_move_intent() . = ..() update_move_intent_slowdown() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 5ae649c87e..33cbdb7cc9 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -16,7 +16,7 @@ name = "AI" icon = 'icons/mob/ai.dmi' icon_state = "ai" - anchored = TRUE + move_resist = MOVE_FORCE_OVERPOWERING density = TRUE canmove = FALSE status_flags = CANSTUN|CANPUSH @@ -101,6 +101,7 @@ new/obj/structure/AIcore/deactivated(loc) //New empty terminal. return INITIALIZE_HINT_QDEL //Delete AI. + ADD_TRAIT(src, TRAIT_NO_TELEPORT, src) if(L && istype(L, /datum/ai_laws)) laws = L laws.associate(src) @@ -311,9 +312,16 @@ return // stop if(incapacitated()) return - anchored = !anchored // Toggles the anchor + var/is_anchored = FALSE + if(move_resist == MOVE_FORCE_OVERPOWERING) + move_resist = MOVE_FORCE_NORMAL + else + is_anchored = TRUE + move_resist = MOVE_FORCE_OVERPOWERING + REMOVE_TRAIT(src, TRAIT_NO_TELEPORT, src) + ADD_TRAIT(src, TRAIT_NO_TELEPORT, src) - to_chat(src, "You are now [anchored ? "" : "un"]anchored.") + to_chat(src, "You are now [is_anchored ? "" : "un"]anchored.") // the message in the [] will change depending whether or not the AI is anchored /mob/living/silicon/ai/update_canmove() //If the AI dies, mobs won't go through it anymore diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index 97d26f672a..2bcb3c9b5a 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -42,9 +42,8 @@ /mob/living/silicon/ai/bullet_act(obj/item/projectile/Proj) - ..(Proj) + . = ..() updatehealth() - return 2 /mob/living/silicon/ai/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0) return // no eyes, no flashing diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 6ff744e0da..f978b7b697 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -14,7 +14,7 @@ cameraFollow = null - anchored = FALSE //unbolt floorbolts + move_resist = MOVE_FORCE_NORMAL update_canmove() if(eyeobj) eyeobj.setLoc(get_turf(src)) diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm index c727e100d8..05b2bc77ba 100644 --- a/code/modules/mob/living/silicon/pai/pai_defense.dm +++ b/code/modules/mob/living/silicon/pai/pai_defense.dm @@ -55,7 +55,7 @@ if(P.stun) fold_in(force = TRUE) visible_message("The electrically-charged projectile disrupts [src]'s holomatrix, forcing [src] to fold in!") - . = ..() + return ..() /mob/living/silicon/pai/stripPanelUnequip(obj/item/what, mob/who, where) //prevents stripping to_chat(src, "Your holochassis stutters and warps intensely as you attempt to interact with the object, forcing you to cease lest the field fail.") diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm index 6577c26402..bb02bf172d 100644 --- a/code/modules/mob/living/silicon/pai/pai_shell.dm +++ b/code/modules/mob/living/silicon/pai/pai_shell.dm @@ -104,7 +104,7 @@ visible_message("[src] [resting? "lays down for a moment..." : "perks up from the ground"]") update_icon() -/mob/living/silicon/pai/start_pulling(atom/movable/AM, gs) +/mob/living/silicon/pai/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) if(ispAI(AM)) return ..() return FALSE diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 7e06c66eff..e7b252a248 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -184,8 +184,7 @@ adjustBruteLoss(30) /mob/living/silicon/robot/bullet_act(obj/item/projectile/P, def_zone) - ..() + . = ..() updatehealth() if(prob(75) && P.damage > 0) spark_system.start() - return 2 diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index ca8ad25713..4cd8dd47e4 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -129,7 +129,7 @@ unbuckle_mob(M) M.visible_message("[M] is knocked off of [src] by the [P]!") P.on_hit(src) - return 2 + return BULLET_ACT_HIT /mob/living/silicon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash/static) if(affect_silicon) diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index ad8dfc4900..f4feab8824 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -114,7 +114,7 @@ return apply_damage(Proj.damage, Proj.damage_type) Proj.on_hit(src) - return 0 + return BULLET_ACT_HIT /mob/living/simple_animal/ex_act(severity, target, origin) if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src)) diff --git a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm index 03afecc66f..a5d36b5ba9 100644 --- a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm +++ b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm @@ -21,7 +21,7 @@ /mob/living/simple_animal/bot/secbot/grievous/bullet_act(obj/item/projectile/P) visible_message("[src] deflects [P] with its energy swords!") playsound(src, 'sound/weapons/blade1.ogg', 50, TRUE) - return FALSE + return BULLET_ACT_BLOCK /mob/living/simple_animal/bot/secbot/grievous/Crossed(atom/movable/AM) ..() diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 4715a1361a..4e479dc75b 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -210,7 +210,7 @@ Auto Patrol[]"}, if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)) if(!Proj.nodamage && Proj.damage < src.health && ishuman(Proj.firer)) retaliate(Proj.firer) - ..() + return ..() /mob/living/simple_animal/bot/ed209/handle_automated_action() if(!..()) @@ -510,11 +510,9 @@ Auto Patrol[]"}, spawn(100) disabled = 0 icon_state = "[lasercolor]ed2091" - return 1 - else - ..(Proj) - else - ..(Proj) + return BULLET_ACT_HIT + return ..() + return ..() /mob/living/simple_animal/bot/ed209/bluetag lasercolor = "b" diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 109c7b4636..d844237a61 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -139,7 +139,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, /mob/living/simple_animal/bot/honkbot/bullet_act(obj/item/projectile/Proj) if((istype(Proj,/obj/item/projectile/beam)) || (istype(Proj,/obj/item/projectile/bullet) && (Proj.damage_type == BURN))||(Proj.damage_type == BRUTE) && (!Proj.nodamage && Proj.damage < health && ishuman(Proj.firer))) retaliate(Proj.firer) - ..() + return ..() /mob/living/simple_animal/bot/honkbot/UnarmedAttack(atom/A) if(!on) @@ -156,7 +156,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, bike_horn(A) -/mob/living/simple_animal/bot/honkbot/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0) +/mob/living/simple_animal/bot/honkbot/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) if(istype(AM, /obj/item)) playsound(src, honksound, 50, TRUE, -1) var/obj/item/I = AM diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 43963b4eef..48cf93210e 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -13,8 +13,8 @@ desc = "A Multiple Utility Load Effector bot." icon_state = "mulebot0" density = TRUE - anchored = TRUE - animate_movement=1 + move_resist = MOVE_FORCE_STRONG + animate_movement = 1 health = 50 maxHealth = 50 damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) @@ -152,7 +152,7 @@ /mob/living/simple_animal/bot/mulebot/bullet_act(obj/item/projectile/Proj) . = ..() - if(. && !QDELETED(src)) //Got hit and not blown up yet. + if(. == BULLET_ACT_HIT && !QDELETED(src)) //Got hit and not blown up yet.) if(prob(50) && !isnull(load)) unload(0) if(prob(25)) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index d4fc98ee9e..8302346a00 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -205,7 +205,7 @@ Auto Patrol: []"}, if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)) if(!Proj.nodamage && Proj.damage < src.health && ishuman(Proj.firer)) retaliate(Proj.firer) - ..() + return ..() /mob/living/simple_animal/bot/secbot/UnarmedAttack(atom/A) @@ -221,7 +221,7 @@ Auto Patrol: []"}, ..() -/mob/living/simple_animal/bot/secbot/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE) +/mob/living/simple_animal/bot/secbot/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) if(istype(AM, /obj/item)) var/obj/item/I = AM if(I.throwforce < src.health && I.thrownby && ishuman(I.thrownby)) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 736524496f..fbdc32f2c1 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -167,9 +167,9 @@ new_angle_s -= 360 P.setAngle(new_angle_s) - return -1 // complete projectile permutation + return BULLET_ACT_FORCE_PIERCE // complete projectile permutation - return (..(P)) + return ..() @@ -334,7 +334,7 @@ stored_pulling.forceMove(loc) forceMove(AM) if(stored_pulling) - start_pulling(stored_pulling, TRUE) //drag anything we're pulling through the wall with us by magic + start_pulling(stored_pulling, supress_message = TRUE) //drag anything we're pulling through the wall with us by magic /mob/living/simple_animal/hostile/construct/harvester/AttackingTarget() if(iscarbon(target)) diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm index 914d38022f..237ab9d919 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm @@ -44,15 +44,15 @@ if(!charging) ..() -/mob/living/simple_animal/hostile/guardian/charger/throw_impact(atom/A) +/mob/living/simple_animal/hostile/guardian/charger/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!charging) return ..() - else if(A) - if(isliving(A) && A != summoner) - var/mob/living/L = A + else if(hit_atom) + if(isliving(hit_atom) && hit_atom != summoner) + var/mob/living/L = hit_atom var/blocked = FALSE - if(hasmatchingsummoner(A)) //if the summoner matches don't hurt them + if(hasmatchingsummoner(hit_atom)) //if the summoner matches don't hurt them blocked = TRUE if(L.check_shields(src, 90, "[name]", attack_type = THROWN_PROJECTILE_ATTACK)) blocked = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm index 34903a477b..deb88d677b 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -248,7 +248,7 @@ /mob/living/simple_animal/hostile/jungle/leaper/Goto() return -/mob/living/simple_animal/hostile/jungle/leaper/throw_impact() +/mob/living/simple_animal/hostile/jungle/leaper/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) return /mob/living/simple_animal/hostile/jungle/leaper/update_icons() diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm index 29f48c7295..b786637592 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm @@ -147,7 +147,7 @@ update_icons() Goto(target, move_to_delay, minimum_distance) -/mob/living/simple_animal/hostile/jungle/mook/throw_impact(atom/hit_atom, throwingdatum) +/mob/living/simple_animal/hostile/jungle/mook/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() if(isliving(hit_atom) && attack_state == MOOK_ATTACK_ACTIVE) var/mob/living/L = hit_atom diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm index 38dd17a09b..7565a686bf 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm @@ -29,7 +29,7 @@ projectilesound = 'sound/weapons/pierce.ogg' robust_searching = TRUE stat_attack = UNCONSCIOUS - anchored = TRUE + move_resist = MOVE_FORCE_EXTREMELY_STRONG blood_volume = 0 var/combatant_state = SEEDLING_STATE_NEUTRAL var/obj/seedling_weakpoint/weak_point diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 45745bd84e..83abde2fca 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -158,12 +158,12 @@ Difficulty: Hard DestroySurroundings() ..() -/mob/living/simple_animal/hostile/megafauna/bubblegum/throw_impact(atom/A) +/mob/living/simple_animal/hostile/megafauna/bubblegum/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!charging) return ..() - else if(isliving(A)) - var/mob/living/L = A + else if(isliving(hit_atom)) + var/mob/living/L = hit_atom L.visible_message("[src] slams into [L]!", "[src] slams into you!") L.apply_damage(40, BRUTE) playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, 1) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index c2c9f5a71f..1ad07b3203 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -117,7 +117,7 @@ Difficulty: Very Hard var/random_y = rand(0, 72) AT.pixel_y += random_y - ..() + return ..() /mob/living/simple_animal/hostile/megafauna/colossus/proc/enrage(mob/living/L) if(ishuman(L)) @@ -395,7 +395,7 @@ Difficulty: Very Hard ..() /obj/machinery/anomalous_crystal/bullet_act(obj/item/projectile/P, def_zone) - ..() + . = ..() if(istype(P, /obj/item/projectile/magic)) ActivationReaction(P.firer, ACTIVATE_MAGIC, P.damage_type) return diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index af3014cb18..d7c52efe1d 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -21,7 +21,9 @@ maxbodytemp = INFINITY vision_range = 4 aggro_vision_range = 15 - anchored = TRUE + move_force = MOVE_FORCE_OVERPOWERING + move_resist = MOVE_FORCE_OVERPOWERING + pull_force = MOVE_FORCE_OVERPOWERING mob_size = MOB_SIZE_LARGE layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway @@ -37,6 +39,7 @@ /mob/living/simple_animal/hostile/megafauna/Initialize(mapload) . = ..() apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) + ADD_TRAIT(src, TRAIT_NO_TELEPORT, MEGAFAUNA_TRAIT) /mob/living/simple_animal/hostile/megafauna/Destroy() QDEL_NULL(internal) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm index 786d7a9775..c7d90f9556 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm @@ -54,7 +54,6 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa weather_immunities = list("lava","ash") stop_automated_movement = TRUE wander = FALSE - anchored = TRUE layer = BELOW_MOB_LAYER AIStatus = AI_OFF var/swarmer_spawn_cooldown = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm index 51919dad24..e4046138cd 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm @@ -98,7 +98,7 @@ IGNORE_PROC_IF_NOT_TARGET(attack_slime) /mob/living/simple_animal/hostile/asteroid/curseblob/bullet_act(obj/item/projectile/Proj) if(Proj.firer != set_target) - return + return BULLET_ACT_FORCE_PIERCE return ..() /mob/living/simple_animal/hostile/asteroid/curseblob/attacked_by(obj/item/I, mob/living/L) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm index a2b342ab1b..c02f0c46c7 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm @@ -75,7 +75,7 @@ /mob/living/simple_animal/hostile/asteroid/goldgrub/bullet_act(obj/item/projectile/P) visible_message("The [P.name] was repelled by [name]'s girth!") - return + return BULLET_ACT_BLOCK /mob/living/simple_animal/hostile/asteroid/goldgrub/adjustHealth(amount, updating_health = TRUE, forced = FALSE) vision_range = 9 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm index 15f2a0a834..c17e98a7db 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm @@ -27,7 +27,9 @@ throw_message = "does nothing to the rocky hide of the" vision_range = 4 aggro_vision_range = 7 - anchored = TRUE //Stays anchored until death as to be unpullable + move_force = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_VERY_STRONG + pull_force = MOVE_FORCE_VERY_STRONG var/pre_attack = 0 var/pre_attack_icon = "Goliath_preattack" loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) @@ -51,7 +53,9 @@ . = 1 /mob/living/simple_animal/hostile/asteroid/goliath/death(gibbed) - anchored = FALSE + move_force = MOVE_FORCE_DEFAULT + move_resist = MOVE_RESIST_DEFAULT + pull_force = PULL_FORCE_DEFAULT ..(gibbed) /mob/living/simple_animal/hostile/asteroid/goliath/OpenFire() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index 82f85766c2..9e398ce0da 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -217,7 +217,7 @@ can_infest_dead = TRUE //Legion that spawns Legions -/mob/living/simple_animal/hostile/spawner/legion +/mob/living/simple_animal/hostile/big_legion name = "legion" desc = "One of many." icon = 'icons/mob/lavaland/64x64megafauna.dmi' @@ -226,10 +226,6 @@ icon_dead = "legion" health = 450 maxHealth = 450 - max_mobs = 3 - spawn_time = 200 - spawn_text = "peels itself off from" - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion) melee_damage_lower = 20 melee_damage_upper = 20 anchored = FALSE @@ -252,6 +248,10 @@ see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE +/mob/living/simple_animal/hostile/big_legion/Initialize() + .=..() + AddComponent(/datum/component/spawner, list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion), 200, faction, "peels itself off from", 3) + //Tendril-spawned Legion remains, the charred skeletons of those whose bodies sank into laval or fell into chasms. /obj/effect/mob_spawn/human/corpse/charredskeleton name = "charred skeletal remains" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm index 03d2365016..0cd788325a 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm @@ -43,9 +43,9 @@ if(P.damage < 30 && P.damage_type != BRUTE) P.damage = (P.damage / 3) visible_message("[P] has a reduced effect on [src]!") - ..() + return ..() -/mob/living/simple_animal/hostile/asteroid/hitby(atom/movable/AM)//No floor tiling them to death, wiseguy +/mob/living/simple_animal/hostile/asteroid/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum)//No floor tiling them to death, wiseguy if(istype(AM, /obj/item)) var/obj/item/T = AM if(!stat) diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index 8727652103..d023cf0dd8 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -172,16 +172,17 @@ if(M.a_intent == INTENT_HARM) Bruise() -/mob/living/simple_animal/hostile/mushroom/hitby(atom/movable/AM) +/mob/living/simple_animal/hostile/mushroom/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) ..() if(istype(AM, /obj/item)) var/obj/item/T = AM if(T.throwforce) Bruise() -/mob/living/simple_animal/hostile/mushroom/bullet_act() - ..() - Bruise() +/mob/living/simple_animal/hostile/mushroom/bullet_act(obj/item/projectile/P) + . = ..() + if(!P.nodamage) + Bruise() /mob/living/simple_animal/hostile/mushroom/harvest() var/counter diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index 903372b05c..918a2d8acc 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -65,33 +65,30 @@ attacktext = "punches" deathmessage = "falls apart into a fine dust." -/mob/living/simple_animal/hostile/spawner/nether +/obj/structure/spawner/nether name = "netherworld link" desc = "A direct link to another dimension full of creatures not very happy to see you. Entering the link would be a very bad idea." icon_state = "nether" - icon_living = "nether" - health = 50 - maxHealth = 50 + max_integrity = 50 spawn_time = 600 //1 minute max_mobs = 15 - mob_biotypes = list(MOB_INORGANIC) icon = 'icons/mob/nest.dmi' spawn_text = "crawls through" mob_types = list(/mob/living/simple_animal/hostile/netherworld/migo, /mob/living/simple_animal/hostile/netherworld, /mob/living/simple_animal/hostile/netherworld/blankbody) - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) faction = list("nether") - deathmessage = "shatters into oblivion." - del_on_death = TRUE -/mob/living/simple_animal/hostile/spawner/nether/attack_hand(mob/user) +/obj/structure/spawner/nether/Initialize() + .=..() + START_PROCESSING(SSprocessing, src) + +/obj/structure/spawner/nether/attack_hand(mob/user) user.visible_message("[user] is violently pulled into the link!", \ "Touching the portal, you are quickly pulled through into a world of unimaginable horror!") contents.Add(user) -/mob/living/simple_animal/hostile/spawner/nether/Life() - ..() - var/list/C = src.get_contents() - for(var/mob/living/M in C) + +/obj/structure/spawner/nether/process() + for(var/mob/living/M in contents) if(M) playsound(src, 'sound/magic/demon_consume.ogg', 50, 1) M.adjustBruteLoss(60) diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index da423f3788..1e1fa9d41b 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -44,7 +44,10 @@ search_objects = 1 // So that it can see through walls sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS - anchored = TRUE + + move_force = MOVE_FORCE_EXTREMELY_STRONG + move_resist = MOVE_FORCE_EXTREMELY_STRONG + pull_force = MOVE_FORCE_EXTREMELY_STRONG var/cannot_be_seen = 1 var/mob/living/creator = null diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 0faee34f85..96a75f6b4f 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -128,13 +128,10 @@ return ..() /mob/living/simple_animal/hostile/syndicate/melee/bullet_act(obj/item/projectile/Proj) - if(!Proj) - return if(prob(25)) return ..() - else - visible_message("[src] blocks [Proj] with its shield!") - return 0 + visible_message("[src] blocks [Proj] with its shield!") + return BULLET_ACT_BLOCK /mob/living/simple_animal/hostile/syndicate/melee/sword/space icon_state = "syndicate_space_sword" diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 68d08aabd2..f6b29b95aa 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -337,7 +337,7 @@ //Bullets /mob/living/simple_animal/parrot/bullet_act(obj/item/projectile/Proj) - ..() + . = ..() if(!stat && !client) if(parrot_state == PARROT_PERCH) parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched @@ -347,7 +347,6 @@ //parrot_been_shot += 5 icon_state = icon_living drop_held_item(0) - return /* diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 0d146df04c..6082bdf705 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -66,7 +66,7 @@ var/buffed = 0 //In the event that you want to have a buffing effect on the mob, but don't want it to stack with other effects, any outside force that applies a buff to a simple mob should at least set this to 1, so we have something to check against var/gold_core_spawnable = NO_SPAWN //If the mob can be spawned with a gold slime core. HOSTILE_SPAWN are spawned with plasma, FRIENDLY_SPAWN are spawned with blood - var/mob/living/simple_animal/hostile/spawner/nest + var/datum/component/spawner/nest var/sentience_type = SENTIENCE_ORGANIC // Sentience type, for slime potions diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 107a6eed38..5a1a794d4e 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -220,15 +220,12 @@ return ..() //Heals them /mob/living/simple_animal/slime/bullet_act(obj/item/projectile/Proj) - if(!Proj) - return attacked += 10 if((Proj.damage_type == BURN)) adjustBruteLoss(-abs(Proj.damage)) //fire projectiles heals slimes. Proj.on_hit(src) - else - ..(Proj) - return 0 + return BULLET_ACT_BLOCK + return ..() /mob/living/simple_animal/slime/emp_act(severity) . = ..() @@ -246,7 +243,7 @@ /mob/living/simple_animal/slime/doUnEquip(obj/item/W) return -/mob/living/simple_animal/slime/start_pulling(atom/movable/AM) +/mob/living/simple_animal/slime/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) return /mob/living/simple_animal/slime/attack_ui(slot) diff --git a/code/modules/mob/living/simple_animal/spawner.dm b/code/modules/mob/living/simple_animal/spawner.dm deleted file mode 100644 index 0b97a940e4..0000000000 --- a/code/modules/mob/living/simple_animal/spawner.dm +++ /dev/null @@ -1,113 +0,0 @@ -/mob/living/simple_animal/hostile/spawner - name = "monster nest" - icon = 'icons/mob/animal.dmi' - health = 100 - maxHealth = 100 - gender = NEUTER - var/list/spawned_mobs = list() - var/max_mobs = 5 - var/spawn_delay = 0 - var/spawn_time = 300 //30 seconds default - var/mob_types = list(/mob/living/simple_animal/hostile/carp) - var/spawn_text = "emerges from" - status_flags = 0 - anchored = TRUE - AIStatus = AI_OFF - a_intent = INTENT_HARM - stop_automated_movement = 1 - wander = 0 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = 350 - layer = BELOW_MOB_LAYER - sentience_type = SENTIENCE_BOSS - - -/mob/living/simple_animal/hostile/spawner/Destroy() - for(var/mob/living/simple_animal/L in spawned_mobs) - if(L.nest == src) - L.nest = null - spawned_mobs = null - return ..() - -/mob/living/simple_animal/hostile/spawner/Life() - . = ..() - if(!.) // dead - return - spawn_mob() - -/mob/living/simple_animal/hostile/spawner/proc/spawn_mob() - if(spawned_mobs.len >= max_mobs) - return 0 - if(spawn_delay > world.time) - return 0 - spawn_delay = world.time + spawn_time - var/chosen_mob_type = pick(mob_types) - var/mob/living/simple_animal/L = new chosen_mob_type(src.loc) - L.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) //If we were admin spawned, lets have our children count as that as well. - spawned_mobs += L - L.nest = src - L.faction = src.faction - visible_message("[L] [spawn_text] [src].") - -/mob/living/simple_animal/hostile/spawner/syndicate - name = "warp beacon" - icon = 'icons/obj/device.dmi' - icon_state = "syndbeacon" - spawn_text = "warps in from" - mob_types = list(/mob/living/simple_animal/hostile/syndicate/ranged) - faction = list(ROLE_SYNDICATE) - -/mob/living/simple_animal/hostile/spawner/skeleton - name = "bone pit" - desc = "A pit full of bones, and some still seem to be moving..." - icon_state = "hole" - icon_living = "hole" - icon = 'icons/mob/nest.dmi' - health = 150 - maxHealth = 150 - max_mobs = 15 - spawn_time = 150 - mob_types = list(/mob/living/simple_animal/hostile/skeleton) - spawn_text = "climbs out of" - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - faction = list("skeleton") - -/mob/living/simple_animal/hostile/spawner/mining - name = "monster den" - desc = "A hole dug into the ground, harboring all kinds of monsters found within most caves or mining asteroids." - icon_state = "hole" - icon_living = "hole" - health = 200 - maxHealth = 200 - max_mobs = 3 - icon = 'icons/mob/nest.dmi' - spawn_text = "crawls out of" - mob_types = list(/mob/living/simple_animal/hostile/asteroid/goldgrub, /mob/living/simple_animal/hostile/asteroid/goliath, /mob/living/simple_animal/hostile/asteroid/hivelord, /mob/living/simple_animal/hostile/asteroid/basilisk, /mob/living/simple_animal/hostile/asteroid/fugu) - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - faction = list("mining") - -/mob/living/simple_animal/hostile/spawner/mining/goldgrub - name = "goldgrub den" - desc = "A den housing a nest of goldgrubs, annoying but arguably much better than anything else you'll find in a nest." - mob_types = list(/mob/living/simple_animal/hostile/asteroid/goldgrub) - -/mob/living/simple_animal/hostile/spawner/mining/goliath - name = "goliath den" - desc = "A den housing a nest of goliaths, oh god why?" - mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath) - -/mob/living/simple_animal/hostile/spawner/mining/hivelord - name = "hivelord den" - desc = "A den housing a nest of hivelords." - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord) - -/mob/living/simple_animal/hostile/spawner/mining/basilisk - name = "basilisk den" - desc = "A den housing a nest of basilisks, bring a coat." - mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk) - -/mob/living/simple_animal/hostile/spawner/mining/wumborian - name = "wumborian fugu den" - desc = "A den housing a nest of wumborian fugus, how do they all even fit in there?" - mob_types = list(/mob/living/simple_animal/hostile/asteroid/fugu) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index b4c3c93824..630ce54261 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -508,6 +508,10 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) usr << browse(text("[][]", name, replacetext(flavor_text, "\n", "
")), text("window=[];size=500x200", name)) onclose(usr, "[name]") + if(href_list["flavor2_more"]) + usr << browse(text("[][]", name, replacetext(flavor_text_2, "\n", "
")), text("window=[];size=500x200", name)) + onclose(usr, "[name]") + if(href_list["flavor_change"]) update_flavor_text() diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index f61d65146e..a1feb899c6 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -1,15 +1,3 @@ -/mob/CanPass(atom/movable/mover, turf/target) - if((mover.pass_flags & PASSMOB)) - return TRUE - if(istype(mover, /obj/item/projectile) || mover.throwing) - return (!density || lying) - if(buckled == mover) - return TRUE - if(ismob(mover)) - if (mover in buckled_mobs) - return TRUE - return (!mover.density || !density || lying || (mover.throwing && mover.throwing.thrower == src && !ismob(mover))) - //DO NOT USE THIS UNLESS YOU ABSOLUTELY HAVE TO. THIS IS BEING PHASED OUT FOR THE MOVESPEED MODIFICATION SYSTEM. //See mob_movespeed.dm /mob/proc/movement_delay() //update /living/movement_delay() if you change this @@ -108,8 +96,7 @@ if((direct & (direct - 1)) && mob.loc == n) //moved diagonally successfully add_delay *= 2 - if(mob.loc != oldloc) - move_delay += add_delay + move_delay += add_delay if(.) // If mob is null here, we deserve the runtime if(mob.throwing) mob.throwing.finalize(FALSE) diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index a387dcb1d2..a130152b4c 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -51,7 +51,7 @@ if(length(msg) <= 40) return "[html_encode(msg)]" else - return "[html_encode(copytext(msg, 1, 37))]... More..." + return "[html_encode(copytext(msg, 1, 37))]... More..." /mob/proc/get_top_level_mob() diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index a988003b67..39b2c45d99 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -158,4 +158,5 @@ // "Brute" damage mostly damages the casing. /obj/machinery/modular_computer/bullet_act(obj/item/projectile/Proj) if(cpu) - cpu.bullet_act(Proj) + return cpu.bullet_act(Proj) + return ..() diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index 97c41faf12..e6d53d914f 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -56,7 +56,7 @@ //If we hit the Ninja who owns this Katana, they catch it. //Works for if the Ninja throws it or it throws itself or someone tries //To throw it at the ninja -/obj/item/energy_katana/throw_impact(atom/hit_atom) +/obj/item/energy_katana/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(ishuman(hit_atom)) var/mob/living/carbon/human/H = hit_atom if(istype(H.wear_suit, /obj/item/clothing/suit/space/space_ninja)) diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index f3f7e45378..cfd028c4df 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -99,7 +99,7 @@ /obj/item/paperplane/throw_at(atom/target, range, speed, mob/thrower, spin=FALSE, diagonals_first = FALSE, datum/callback/callback) . = ..(target, range, speed, thrower, FALSE, diagonals_first, callback) -/obj/item/paperplane/throw_impact(atom/hit_atom) +/obj/item/paperplane/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(iscarbon(hit_atom)) var/mob/living/carbon/C = hit_atom if(!C.get_active_held_item() && !C.restrained()) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index b1c2d225ee..cee9a17ebf 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -79,13 +79,17 @@ By design, d1 is the smallest direction and d2 is the highest color = "#ffffff" // the power cable object -/obj/structure/cable/Initialize(mapload, param_color) +/obj/structure/cable/Initialize(mapload, param_color, _d1, _d2) . = ..() - // ensure d1 & d2 reflect the icon_state for entering and exiting cable - var/dash = findtext(icon_state, "-") - d1 = text2num( copytext( icon_state, 1, dash ) ) - d2 = text2num( copytext( icon_state, dash+1 ) ) + if(isnull(_d1) || isnull(_d2)) + // ensure d1 & d2 reflect the icon_state for entering and exiting cable + var/dash = findtext(icon_state, "-") + d1 = text2num( copytext( icon_state, 1, dash ) ) + d2 = text2num( copytext( icon_state, dash+1 ) ) + else + d1 = _d1 + d2 = _d2 var/turf/T = get_turf(src) // hide if turf is not intact if(level==1) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 2f7fa5b10a..127565ea29 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -1,409 +1,410 @@ - -// -// Gravity Generator -// - -GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding new gravity generators to the list, and keying it with the z level. - -#define POWER_IDLE 0 -#define POWER_UP 1 -#define POWER_DOWN 2 - -#define GRAV_NEEDS_SCREWDRIVER 0 -#define GRAV_NEEDS_WELDING 1 -#define GRAV_NEEDS_PLASTEEL 2 -#define GRAV_NEEDS_WRENCH 3 - -// -// Abstract Generator -// - -/obj/machinery/gravity_generator - name = "gravitational generator" - desc = "A device which produces a graviton field when set up." - icon = 'icons/obj/machines/gravity_generator.dmi' - density = TRUE - use_power = NO_POWER_USE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - var/sprite_number = 0 - -/obj/machinery/gravity_generator/safe_throw_at() - return FALSE - -/obj/machinery/gravity_generator/ex_act(severity, target) - if(severity == 1) // Very sturdy. - set_broken() - -/obj/machinery/gravity_generator/blob_act(obj/structure/blob/B) - if(prob(20)) - set_broken() - -/obj/machinery/gravity_generator/tesla_act(power, tesla_flags) - ..() - if(tesla_flags & TESLA_MACHINE_EXPLOSIVE) - qdel(src)//like the singulo, tesla deletes it. stops it from exploding over and over - -/obj/machinery/gravity_generator/update_icon() - ..() - icon_state = "[get_status()]_[sprite_number]" - -/obj/machinery/gravity_generator/proc/get_status() - return "off" - -// You aren't allowed to move. -/obj/machinery/gravity_generator/Move() - . = ..() - qdel(src) - -/obj/machinery/gravity_generator/proc/set_broken() - stat |= BROKEN - -/obj/machinery/gravity_generator/proc/set_fix() - stat &= ~BROKEN - -/obj/machinery/gravity_generator/part/Destroy() - if(main_part) - qdel(main_part) - set_broken() - return ..() - -// -// Part generator which is mostly there for looks -// - -/obj/machinery/gravity_generator/part - var/obj/machinery/gravity_generator/main/main_part = null - -/obj/machinery/gravity_generator/part/attackby(obj/item/I, mob/user, params) - return main_part.attackby(I, user) - -/obj/machinery/gravity_generator/part/get_status() - return main_part.get_status() - -/obj/machinery/gravity_generator/part/attack_hand(mob/user) - return main_part.attack_hand(user) - -/obj/machinery/gravity_generator/part/set_broken() - ..() - if(main_part && !(main_part.stat & BROKEN)) - main_part.set_broken() - -// -// Generator which spawns with the station. -// - -/obj/machinery/gravity_generator/main/station/Initialize() - . = ..() - setup_parts() - middle.add_overlay("activated") - update_list() - -// -// Generator an admin can spawn -// -/obj/machinery/gravity_generator/main/station/admin - use_power = NO_POWER_USE - -// -// Main Generator with the main code -// - -/obj/machinery/gravity_generator/main - icon_state = "on_8" - idle_power_usage = 0 - active_power_usage = 3000 - power_channel = ENVIRON - sprite_number = 8 - use_power = IDLE_POWER_USE - interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OFFLINE - var/on = TRUE - var/breaker = TRUE - var/list/parts = list() - var/obj/middle = null - var/charging_state = POWER_IDLE - var/charge_count = 100 - var/current_overlay = null - var/broken_state = 0 - var/setting = 1 //Gravity value when on - -/obj/machinery/gravity_generator/main/Destroy() // If we somehow get deleted, remove all of our other parts. - investigate_log("was destroyed!", INVESTIGATE_GRAVITY) - on = FALSE - update_list() - for(var/obj/machinery/gravity_generator/part/O in parts) - O.main_part = null - if(!QDESTROYING(O)) - qdel(O) - return ..() - -/obj/machinery/gravity_generator/main/proc/setup_parts() - var/turf/our_turf = get_turf(src) - // 9x9 block obtained from the bottom middle of the block - var/list/spawn_turfs = block(locate(our_turf.x - 1, our_turf.y + 2, our_turf.z), locate(our_turf.x + 1, our_turf.y, our_turf.z)) - var/count = 10 - for(var/turf/T in spawn_turfs) - count-- - if(T == our_turf) // Skip our turf. - continue - var/obj/machinery/gravity_generator/part/part = new(T) - if(count == 5) // Middle - middle = part - if(count <= 3) // Their sprite is the top part of the generator - part.density = FALSE - part.layer = WALL_OBJ_LAYER - part.sprite_number = count - part.main_part = src - parts += part - part.update_icon() - -/obj/machinery/gravity_generator/main/proc/connected_parts() - return parts.len == 8 - -/obj/machinery/gravity_generator/main/set_broken() - ..() - for(var/obj/machinery/gravity_generator/M in parts) - if(!(M.stat & BROKEN)) - M.set_broken() - middle.cut_overlays() - charge_count = 0 - breaker = FALSE - set_power() - set_state(0) - investigate_log("has broken down.", INVESTIGATE_GRAVITY) - -/obj/machinery/gravity_generator/main/set_fix() - ..() - for(var/obj/machinery/gravity_generator/M in parts) - if(M.stat & BROKEN) - M.set_fix() - broken_state = FALSE - update_icon() - set_power() - -// Interaction - -// Fixing the gravity generator. -/obj/machinery/gravity_generator/main/attackby(obj/item/I, mob/user, params) - switch(broken_state) - if(GRAV_NEEDS_SCREWDRIVER) - if(istype(I, /obj/item/screwdriver)) - to_chat(user, "You secure the screws of the framework.") - I.play_tool_sound(src) - broken_state++ - update_icon() - return - if(GRAV_NEEDS_WELDING) - if(istype(I, /obj/item/weldingtool)) - if(I.use_tool(src, user, 0, volume=50, amount=1)) - to_chat(user, "You mend the damaged framework.") - broken_state++ - update_icon() - return - if(GRAV_NEEDS_PLASTEEL) - if(istype(I, /obj/item/stack/sheet/plasteel)) - var/obj/item/stack/sheet/plasteel/PS = I - if(PS.get_amount() >= 10) - PS.use(10) - to_chat(user, "You add the plating to the framework.") - playsound(src.loc, 'sound/machines/click.ogg', 75, 1) - broken_state++ - update_icon() - else - to_chat(user, "You need 10 sheets of plasteel!") - return - if(GRAV_NEEDS_WRENCH) - if(istype(I, /obj/item/wrench)) - to_chat(user, "You secure the plating to the framework.") - I.play_tool_sound(src) - set_fix() - return - return ..() - -/obj/machinery/gravity_generator/main/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ - datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) - if(!ui) - ui = new(user, src, ui_key, "gravity_generator", name, 400, 200, master_ui, state) - ui.open() - -/obj/machinery/gravity_generator/main/ui_data(mob/user) - var/list/data = list() - - data["breaker"] = breaker - data["charge_count"] = charge_count - data["charging_state"] = charging_state - data["on"] = on - data["operational"] = (stat & BROKEN) ? FALSE : TRUE - - return data - -/obj/machinery/gravity_generator/main/ui_act(action, params) - if(..()) - return - switch(action) - if("gentoggle") - breaker = !breaker - investigate_log("was toggled [breaker ? "ON" : "OFF"] by [key_name(usr)].", INVESTIGATE_GRAVITY) - set_power() - -// Power and Icon States - -/obj/machinery/gravity_generator/main/power_change() - ..() - investigate_log("has [stat & NOPOWER ? "lost" : "regained"] power.", INVESTIGATE_GRAVITY) - set_power() - -/obj/machinery/gravity_generator/main/get_status() - if(stat & BROKEN) - return "fix[min(broken_state, 3)]" - return on || charging_state != POWER_IDLE ? "on" : "off" - -/obj/machinery/gravity_generator/main/update_icon() - ..() - for(var/obj/O in parts) - O.update_icon() - -// Set the charging state based on power/breaker. -/obj/machinery/gravity_generator/main/proc/set_power() - var/new_state = FALSE - if(stat & (NOPOWER|BROKEN) || !breaker) - new_state = FALSE - else if(breaker) - new_state = TRUE - - charging_state = new_state ? POWER_UP : POWER_DOWN // Startup sequence animation. - investigate_log("is now [charging_state == POWER_UP ? "charging" : "discharging"].", INVESTIGATE_GRAVITY) - update_icon() - -// Set the state of the gravity. -/obj/machinery/gravity_generator/main/proc/set_state(new_state) - charging_state = POWER_IDLE - on = new_state - use_power = on ? ACTIVE_POWER_USE : IDLE_POWER_USE - // Sound the alert if gravity was just enabled or disabled. - var/alert = FALSE - if(SSticker.IsRoundInProgress()) - if(on) // If we turned on and the game is live. - if(gravity_in_level() == FALSE) - alert = TRUE - investigate_log("was brought online and is now producing gravity for this level.", INVESTIGATE_GRAVITY) - message_admins("The gravity generator was brought online [ADMIN_VERBOSEJMP(src)]") - else - if(gravity_in_level() == TRUE) - alert = TRUE - investigate_log("was brought offline and there is now no gravity for this level.", INVESTIGATE_GRAVITY) - message_admins("The gravity generator was brought offline with no backup generator. [ADMIN_VERBOSEJMP(src)]") - - update_icon() - update_list() - src.updateUsrDialog() - if(alert) - shake_everyone() - -// Charge/Discharge and turn on/off gravity when you reach 0/100 percent. -// Also emit radiation and handle the overlays. -/obj/machinery/gravity_generator/main/process() - if(stat & BROKEN) - return - if(charging_state != POWER_IDLE) - if(charging_state == POWER_UP && charge_count >= 100) - set_state(1) - else if(charging_state == POWER_DOWN && charge_count <= 0) - set_state(0) - else - if(charging_state == POWER_UP) - charge_count += 2 - else if(charging_state == POWER_DOWN) - charge_count -= 2 - - if(charge_count % 4 == 0 && prob(75)) // Let them know it is charging/discharging. - playsound(src.loc, 'sound/effects/empulse.ogg', 100, 1) - - updateDialog() - if(prob(25)) // To help stop "Your clothes feel warm." spam. - pulse_radiation() - - var/overlay_state = null - switch(charge_count) - if(0 to 20) - overlay_state = null - if(21 to 40) - overlay_state = "startup" - if(41 to 60) - overlay_state = "idle" - if(61 to 80) - overlay_state = "activating" - if(81 to 100) - overlay_state = "activated" - - if(overlay_state != current_overlay) - if(middle) - middle.cut_overlays() - if(overlay_state) - middle.add_overlay(overlay_state) - current_overlay = overlay_state - - -/obj/machinery/gravity_generator/main/proc/pulse_radiation() - radiation_pulse(src, 200) - -// Shake everyone on the z level to let them know that gravity was enagaged/disenagaged. -/obj/machinery/gravity_generator/main/proc/shake_everyone() - var/turf/T = get_turf(src) - var/sound/alert_sound = sound('sound/effects/alert.ogg') - for(var/i in GLOB.mob_list) - var/mob/M = i - if(M.z != z && !(SSmapping.level_trait(z, ZTRAITS_STATION) && SSmapping.level_trait(M.z, ZTRAITS_STATION))) - continue - M.update_gravity(M.mob_has_gravity()) - if(M.client) - shake_camera(M, 15, 1) - M.playsound_local(T, null, 100, 1, 0.5, S = alert_sound) - -/obj/machinery/gravity_generator/main/proc/gravity_in_level() - var/turf/T = get_turf(src) - if(!T) - return FALSE - if(GLOB.gravity_generators["[T.z]"]) - return length(GLOB.gravity_generators["[T.z]"]) - return FALSE - -/obj/machinery/gravity_generator/main/proc/update_list() - var/turf/T = get_turf(src.loc) - if(T) - var/list/z_list = list() - // Multi-Z, station gravity generator generates gravity on all ZTRAIT_STATION z-levels. - if(SSmapping.level_trait(T.z, ZTRAIT_STATION)) - for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) - z_list += z - else - z_list += T.z - for(var/z in z_list) - if(!GLOB.gravity_generators["[z]"]) - GLOB.gravity_generators["[z]"] = list() - if(on) - GLOB.gravity_generators["[z]"] |= src - else - GLOB.gravity_generators["[z]"] -= src - -/obj/machinery/gravity_generator/main/proc/change_setting(value) - if(value != setting) - setting = value - shake_everyone() - -// Misc - -/obj/item/paper/guides/jobs/engi/gravity_gen - name = "paper- 'Generate your own gravity!'" - info = {"

Gravity Generator Instructions For Dummies

-

Surprisingly, gravity isn't that hard to make! All you have to do is inject deadly radioactive minerals into a ball of - energy and you have yourself gravity! You can turn the machine on or off when required but you must remember that the generator - will EMIT RADIATION when charging or discharging, you can tell it is charging or discharging by the noise it makes, so please WEAR PROTECTIVE CLOTHING.

-
-

It blew up!

-

Don't panic! The gravity generator was designed to be easily repaired. If, somehow, the sturdy framework did not survive then - please proceed to panic; otherwise follow these steps.

    -
  1. Secure the screws of the framework with a screwdriver.
  2. -
  3. Mend the damaged framework with a welding tool.
  4. -
  5. Add additional plasteel plating.
  6. -
  7. Secure the additional plating with a wrench.
"} + +// +// Gravity Generator +// + +GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding new gravity generators to the list, and keying it with the z level. + +#define POWER_IDLE 0 +#define POWER_UP 1 +#define POWER_DOWN 2 + +#define GRAV_NEEDS_SCREWDRIVER 0 +#define GRAV_NEEDS_WELDING 1 +#define GRAV_NEEDS_PLASTEEL 2 +#define GRAV_NEEDS_WRENCH 3 + +// +// Abstract Generator +// + +/obj/machinery/gravity_generator + name = "gravitational generator" + desc = "A device which produces a graviton field when set up." + icon = 'icons/obj/machines/gravity_generator.dmi' + density = TRUE + move_resist = INFINITY + use_power = NO_POWER_USE + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + var/sprite_number = 0 + +/obj/machinery/gravity_generator/safe_throw_at() + return FALSE + +/obj/machinery/gravity_generator/ex_act(severity, target) + if(severity == 1) // Very sturdy. + set_broken() + +/obj/machinery/gravity_generator/blob_act(obj/structure/blob/B) + if(prob(20)) + set_broken() + +/obj/machinery/gravity_generator/tesla_act(power, tesla_flags) + ..() + if(tesla_flags & TESLA_MACHINE_EXPLOSIVE) + qdel(src)//like the singulo, tesla deletes it. stops it from exploding over and over + +/obj/machinery/gravity_generator/update_icon() + ..() + icon_state = "[get_status()]_[sprite_number]" + +/obj/machinery/gravity_generator/proc/get_status() + return "off" + +// You aren't allowed to move. +/obj/machinery/gravity_generator/Move() + . = ..() + qdel(src) + +/obj/machinery/gravity_generator/proc/set_broken() + stat |= BROKEN + +/obj/machinery/gravity_generator/proc/set_fix() + stat &= ~BROKEN + +/obj/machinery/gravity_generator/part/Destroy() + if(main_part) + qdel(main_part) + set_broken() + return ..() + +// +// Part generator which is mostly there for looks +// + +/obj/machinery/gravity_generator/part + var/obj/machinery/gravity_generator/main/main_part = null + +/obj/machinery/gravity_generator/part/attackby(obj/item/I, mob/user, params) + return main_part.attackby(I, user) + +/obj/machinery/gravity_generator/part/get_status() + return main_part.get_status() + +/obj/machinery/gravity_generator/part/attack_hand(mob/user) + return main_part.attack_hand(user) + +/obj/machinery/gravity_generator/part/set_broken() + ..() + if(main_part && !(main_part.stat & BROKEN)) + main_part.set_broken() + +// +// Generator which spawns with the station. +// + +/obj/machinery/gravity_generator/main/station/Initialize() + . = ..() + setup_parts() + middle.add_overlay("activated") + update_list() + +// +// Generator an admin can spawn +// +/obj/machinery/gravity_generator/main/station/admin + use_power = NO_POWER_USE + +// +// Main Generator with the main code +// + +/obj/machinery/gravity_generator/main + icon_state = "on_8" + idle_power_usage = 0 + active_power_usage = 3000 + power_channel = ENVIRON + sprite_number = 8 + use_power = IDLE_POWER_USE + interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OFFLINE + var/on = TRUE + var/breaker = TRUE + var/list/parts = list() + var/obj/middle = null + var/charging_state = POWER_IDLE + var/charge_count = 100 + var/current_overlay = null + var/broken_state = 0 + var/setting = 1 //Gravity value when on + +/obj/machinery/gravity_generator/main/Destroy() // If we somehow get deleted, remove all of our other parts. + investigate_log("was destroyed!", INVESTIGATE_GRAVITY) + on = FALSE + update_list() + for(var/obj/machinery/gravity_generator/part/O in parts) + O.main_part = null + if(!QDESTROYING(O)) + qdel(O) + return ..() + +/obj/machinery/gravity_generator/main/proc/setup_parts() + var/turf/our_turf = get_turf(src) + // 9x9 block obtained from the bottom middle of the block + var/list/spawn_turfs = block(locate(our_turf.x - 1, our_turf.y + 2, our_turf.z), locate(our_turf.x + 1, our_turf.y, our_turf.z)) + var/count = 10 + for(var/turf/T in spawn_turfs) + count-- + if(T == our_turf) // Skip our turf. + continue + var/obj/machinery/gravity_generator/part/part = new(T) + if(count == 5) // Middle + middle = part + if(count <= 3) // Their sprite is the top part of the generator + part.density = FALSE + part.layer = WALL_OBJ_LAYER + part.sprite_number = count + part.main_part = src + parts += part + part.update_icon() + +/obj/machinery/gravity_generator/main/proc/connected_parts() + return parts.len == 8 + +/obj/machinery/gravity_generator/main/set_broken() + ..() + for(var/obj/machinery/gravity_generator/M in parts) + if(!(M.stat & BROKEN)) + M.set_broken() + middle.cut_overlays() + charge_count = 0 + breaker = FALSE + set_power() + set_state(0) + investigate_log("has broken down.", INVESTIGATE_GRAVITY) + +/obj/machinery/gravity_generator/main/set_fix() + ..() + for(var/obj/machinery/gravity_generator/M in parts) + if(M.stat & BROKEN) + M.set_fix() + broken_state = FALSE + update_icon() + set_power() + +// Interaction + +// Fixing the gravity generator. +/obj/machinery/gravity_generator/main/attackby(obj/item/I, mob/user, params) + switch(broken_state) + if(GRAV_NEEDS_SCREWDRIVER) + if(istype(I, /obj/item/screwdriver)) + to_chat(user, "You secure the screws of the framework.") + I.play_tool_sound(src) + broken_state++ + update_icon() + return + if(GRAV_NEEDS_WELDING) + if(istype(I, /obj/item/weldingtool)) + if(I.use_tool(src, user, 0, volume=50, amount=1)) + to_chat(user, "You mend the damaged framework.") + broken_state++ + update_icon() + return + if(GRAV_NEEDS_PLASTEEL) + if(istype(I, /obj/item/stack/sheet/plasteel)) + var/obj/item/stack/sheet/plasteel/PS = I + if(PS.get_amount() >= 10) + PS.use(10) + to_chat(user, "You add the plating to the framework.") + playsound(src.loc, 'sound/machines/click.ogg', 75, 1) + broken_state++ + update_icon() + else + to_chat(user, "You need 10 sheets of plasteel!") + return + if(GRAV_NEEDS_WRENCH) + if(istype(I, /obj/item/wrench)) + to_chat(user, "You secure the plating to the framework.") + I.play_tool_sound(src) + set_fix() + return + return ..() + +/obj/machinery/gravity_generator/main/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "gravity_generator", name, 400, 200, master_ui, state) + ui.open() + +/obj/machinery/gravity_generator/main/ui_data(mob/user) + var/list/data = list() + + data["breaker"] = breaker + data["charge_count"] = charge_count + data["charging_state"] = charging_state + data["on"] = on + data["operational"] = (stat & BROKEN) ? FALSE : TRUE + + return data + +/obj/machinery/gravity_generator/main/ui_act(action, params) + if(..()) + return + switch(action) + if("gentoggle") + breaker = !breaker + investigate_log("was toggled [breaker ? "ON" : "OFF"] by [key_name(usr)].", INVESTIGATE_GRAVITY) + set_power() + +// Power and Icon States + +/obj/machinery/gravity_generator/main/power_change() + ..() + investigate_log("has [stat & NOPOWER ? "lost" : "regained"] power.", INVESTIGATE_GRAVITY) + set_power() + +/obj/machinery/gravity_generator/main/get_status() + if(stat & BROKEN) + return "fix[min(broken_state, 3)]" + return on || charging_state != POWER_IDLE ? "on" : "off" + +/obj/machinery/gravity_generator/main/update_icon() + ..() + for(var/obj/O in parts) + O.update_icon() + +// Set the charging state based on power/breaker. +/obj/machinery/gravity_generator/main/proc/set_power() + var/new_state = FALSE + if(stat & (NOPOWER|BROKEN) || !breaker) + new_state = FALSE + else if(breaker) + new_state = TRUE + + charging_state = new_state ? POWER_UP : POWER_DOWN // Startup sequence animation. + investigate_log("is now [charging_state == POWER_UP ? "charging" : "discharging"].", INVESTIGATE_GRAVITY) + update_icon() + +// Set the state of the gravity. +/obj/machinery/gravity_generator/main/proc/set_state(new_state) + charging_state = POWER_IDLE + on = new_state + use_power = on ? ACTIVE_POWER_USE : IDLE_POWER_USE + // Sound the alert if gravity was just enabled or disabled. + var/alert = FALSE + if(SSticker.IsRoundInProgress()) + if(on) // If we turned on and the game is live. + if(gravity_in_level() == FALSE) + alert = TRUE + investigate_log("was brought online and is now producing gravity for this level.", INVESTIGATE_GRAVITY) + message_admins("The gravity generator was brought online [ADMIN_VERBOSEJMP(src)]") + else + if(gravity_in_level() == TRUE) + alert = TRUE + investigate_log("was brought offline and there is now no gravity for this level.", INVESTIGATE_GRAVITY) + message_admins("The gravity generator was brought offline with no backup generator. [ADMIN_VERBOSEJMP(src)]") + + update_icon() + update_list() + src.updateUsrDialog() + if(alert) + shake_everyone() + +// Charge/Discharge and turn on/off gravity when you reach 0/100 percent. +// Also emit radiation and handle the overlays. +/obj/machinery/gravity_generator/main/process() + if(stat & BROKEN) + return + if(charging_state != POWER_IDLE) + if(charging_state == POWER_UP && charge_count >= 100) + set_state(1) + else if(charging_state == POWER_DOWN && charge_count <= 0) + set_state(0) + else + if(charging_state == POWER_UP) + charge_count += 2 + else if(charging_state == POWER_DOWN) + charge_count -= 2 + + if(charge_count % 4 == 0 && prob(75)) // Let them know it is charging/discharging. + playsound(src.loc, 'sound/effects/empulse.ogg', 100, 1) + + updateDialog() + if(prob(25)) // To help stop "Your clothes feel warm." spam. + pulse_radiation() + + var/overlay_state = null + switch(charge_count) + if(0 to 20) + overlay_state = null + if(21 to 40) + overlay_state = "startup" + if(41 to 60) + overlay_state = "idle" + if(61 to 80) + overlay_state = "activating" + if(81 to 100) + overlay_state = "activated" + + if(overlay_state != current_overlay) + if(middle) + middle.cut_overlays() + if(overlay_state) + middle.add_overlay(overlay_state) + current_overlay = overlay_state + + +/obj/machinery/gravity_generator/main/proc/pulse_radiation() + radiation_pulse(src, 200) + +// Shake everyone on the z level to let them know that gravity was enagaged/disenagaged. +/obj/machinery/gravity_generator/main/proc/shake_everyone() + var/turf/T = get_turf(src) + var/sound/alert_sound = sound('sound/effects/alert.ogg') + for(var/i in GLOB.mob_list) + var/mob/M = i + if(M.z != z && !(SSmapping.level_trait(z, ZTRAITS_STATION) && SSmapping.level_trait(M.z, ZTRAITS_STATION))) + continue + M.update_gravity(M.mob_has_gravity()) + if(M.client) + shake_camera(M, 15, 1) + M.playsound_local(T, null, 100, 1, 0.5, S = alert_sound) + +/obj/machinery/gravity_generator/main/proc/gravity_in_level() + var/turf/T = get_turf(src) + if(!T) + return FALSE + if(GLOB.gravity_generators["[T.z]"]) + return length(GLOB.gravity_generators["[T.z]"]) + return FALSE + +/obj/machinery/gravity_generator/main/proc/update_list() + var/turf/T = get_turf(src.loc) + if(T) + var/list/z_list = list() + // Multi-Z, station gravity generator generates gravity on all ZTRAIT_STATION z-levels. + if(SSmapping.level_trait(T.z, ZTRAIT_STATION)) + for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) + z_list += z + else + z_list += T.z + for(var/z in z_list) + if(!GLOB.gravity_generators["[z]"]) + GLOB.gravity_generators["[z]"] = list() + if(on) + GLOB.gravity_generators["[z]"] |= src + else + GLOB.gravity_generators["[z]"] -= src + +/obj/machinery/gravity_generator/main/proc/change_setting(value) + if(value != setting) + setting = value + shake_everyone() + +// Misc + +/obj/item/paper/guides/jobs/engi/gravity_gen + name = "paper- 'Generate your own gravity!'" + info = {"

Gravity Generator Instructions For Dummies

+

Surprisingly, gravity isn't that hard to make! All you have to do is inject deadly radioactive minerals into a ball of + energy and you have yourself gravity! You can turn the machine on or off when required but you must remember that the generator + will EMIT RADIATION when charging or discharging, you can tell it is charging or discharging by the noise it makes, so please WEAR PROTECTIVE CLOTHING.

+
+

It blew up!

+

Don't panic! The gravity generator was designed to be easily repaired. If, somehow, the sturdy framework did not survive then + please proceed to panic; otherwise follow these steps.

    +
  1. Secure the screws of the framework with a screwdriver.
  2. +
  3. Mend the damaged framework with a welding tool.
  4. +
  5. Add additional plasteel plating.
  6. +
  7. Secure the additional plating with a wrench.
"} diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index e50b11ea35..903f63e22c 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -756,7 +756,7 @@ /obj/item/light/bulb/broken status = LIGHT_BROKEN -/obj/item/light/throw_impact(atom/hit_atom) +/obj/item/light/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) //not caught by a mob shatter() diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 9ae6c69847..3a6a98d681 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -103,6 +103,8 @@ . += "The generator has [sheets] units of [sheet_name] fuel left, producing [power_gen] per cycle." if(crit_fail) . += "The generator seems to have broken down." + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Fuel efficiency increased by [(consumption*100)-100]%." /obj/machinery/power/port_gen/pacman/HasFuel() if(sheets >= 1 / (time_per_sheet / power_output) - sheet_left) diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index 9dca8f3124..afbeef30a1 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -36,6 +36,11 @@ power_gen = initial(power_gen) * part_level +/obj/machinery/power/rtg/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Power generation now at [power_gen*0.001]kW." + /obj/machinery/power/rtg/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-open", initial(icon_state), I)) return @@ -74,7 +79,7 @@ addtimer(CALLBACK(GLOBAL_PROC, .proc/explosion, get_turf(src), 2, 3, 4, 8), 100) // Not a normal explosion. /obj/machinery/power/rtg/abductor/bullet_act(obj/item/projectile/Proj) - ..() + . = ..() if(!going_kaboom && istype(Proj) && !Proj.nodamage && ((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))) message_admins("[ADMIN_LOOKUPFLW(Proj.firer)] triggered an Abductor Core explosion at [AREACOORD(src)] via projectile.") log_game("[key_name(Proj.firer)] triggered an Abductor Core explosion at [AREACOORD(src)] via projectile.") diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index e007b72c88..31e0c479ed 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -6,6 +6,7 @@ icon = 'icons/obj/singularity.dmi' icon_state = "Contain_F" density = FALSE + move_resist = INFINITY resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF use_power = NO_POWER_USE interaction_flags_atom = NONE diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index d6f51497cd..d8b0ede3a2 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -68,6 +68,11 @@ sparks.attach(src) sparks.set_up(1, TRUE, src) +/obj/machinery/power/emitter/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Emitting one beam each [fire_delay*0.1] seconds.
Power consumption at [active_power_usage]W.
" + /obj/machinery/power/emitter/ComponentInitialize() . = ..() AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 595d87697d..54aca32cf7 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -245,6 +245,7 @@ field_generator power level display if(state != FG_WELDED || !anchored) turn_off() return + move_resist = INFINITY spawn(1) setup_field(1) spawn(2) @@ -335,6 +336,7 @@ field_generator power level display message_admins("A singulo exists and a containment field has failed at [ADMIN_VERBOSEJMP(T)].") investigate_log("has failed whilst a singulo exists at [AREACOORD(T)].", INVESTIGATE_SINGULO) O.last_warning = world.time + move_resist = initial(move_resist) /obj/machinery/field/generator/shock(mob/living/user) if(fields.len) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index d622336925..76eeeae205 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -7,6 +7,7 @@ icon_state = "singularity_s1" anchored = TRUE density = TRUE + move_resist = INFINITY layer = MASSIVE_OBJ_LAYER light_range = 6 appearance_flags = 0 @@ -113,7 +114,8 @@ /obj/singularity/bullet_act(obj/item/projectile/P) - return 0 //Will there be an impact? Who knows. Will we see it? No. + qdel(P) + return BULLET_ACT_HIT //Will there be an impact? Who knows. Will we see it? No. /obj/singularity/Bump(atom/A) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 68ffcb909a..ee93767a0c 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -521,7 +521,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) has_been_powered = TRUE else if(takes_damage) damage += Proj.damage * config_bullet_energy - return FALSE + return BULLET_ACT_HIT /obj/machinery/power/supermatter_crystal/singularity_act() var/gain = 100 diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index 2265f806a5..e29ffa865e 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -36,6 +36,11 @@ zap_cooldown -= (C.rating * 20) input_power_multiplier = power_multiplier +/obj/machinery/power/tesla_coil/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Power generation at [input_power_multiplier*100]%.
Shock interval at [zap_cooldown*0.1] seconds.
" + /obj/machinery/power/tesla_coil/on_construction() if(anchored) connect_to_network() diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 13b68c4043..b40e5c6c41 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -85,6 +85,11 @@ E += M.rating efficiency = E / 6 +/obj/machinery/power/compressor/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Efficiency at [efficiency*100]%." + /obj/machinery/power/compressor/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, initial(icon_state), initial(icon_state), I)) return @@ -168,6 +173,11 @@ P += C.rating productivity = P / 6 +/obj/machinery/power/turbine/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Productivity at [productivity*100]%." + /obj/machinery/power/turbine/locate_machinery() if(compressor) return diff --git a/code/modules/procedural_mapping/mapGenerators/lavaland.dm b/code/modules/procedural_mapping/mapGenerators/lavaland.dm index 6ad21eb959..20194a24ec 100644 --- a/code/modules/procedural_mapping/mapGenerators/lavaland.dm +++ b/code/modules/procedural_mapping/mapGenerators/lavaland.dm @@ -16,9 +16,9 @@ /datum/mapGeneratorModule/splatterLayer/lavalandTendrils spawnableTurfs = list() - spawnableAtoms = list(/mob/living/simple_animal/hostile/spawner/lavaland = 5, - /mob/living/simple_animal/hostile/spawner/lavaland/legion = 5, - /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 5) + spawnableAtoms = list(/obj/structure/spawner/lavaland = 5, + /obj/structure/spawner/lavaland/legion = 5, + /obj/structure/spawner/lavaland/goliath = 5) /datum/mapGenerator/lavaland/ground_only modules = list(/datum/mapGeneratorModule/bottomLayer/lavaland_default) diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm index ccd43e734b..a9e4fa1646 100644 --- a/code/modules/projectiles/ammunition/_ammunition.dm +++ b/code/modules/projectiles/ammunition/_ammunition.dm @@ -65,7 +65,7 @@ else return ..() -/obj/item/ammo_casing/throw_impact(atom/A) +/obj/item/ammo_casing/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(heavy_metal) bounce_away(FALSE, NONE) . = ..() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 19fdfd2b7e..531c6082b0 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -37,7 +37,6 @@ var/burst_spread = 0 //Spread induced by the gun itself during burst fire per iteration. Only checked if spread is 0. var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. var/inaccuracy_modifier = 1 - var/pb_knockback = 0 lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' @@ -126,10 +125,6 @@ if(message) if(pointblank) user.visible_message("[user] fires [src] point blank at [pbtarget]!", null, null, COMBAT_MESSAGE_RANGE) - if(pb_knockback > 0) - var/atom/throw_target = get_edge_target_turf(pbtarget, user.dir) - pbtarget.throw_at(throw_target, pb_knockback, 2) - else user.visible_message("[user] fires [src]!", null, null, COMBAT_MESSAGE_RANGE) diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 7fb4a8232e..bcb212a031 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -267,7 +267,6 @@ fire_delay = 0 pin = /obj/item/firing_pin/implant/pindicate actions_types = list() - pb_knockback = 2 /obj/item/gun/ballistic/automatic/shotgun/bulldog/unrestricted pin = /obj/item/firing_pin diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 31a5131804..c2206fcea8 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -273,7 +273,6 @@ "Maple" = "dshotgun-l", "Rosewood" = "dshotgun-p" ) - pb_knockback = 3 // it's a super shotgun! /obj/item/gun/ballistic/revolver/doublebarrel/attackby(obj/item/A, mob/user, params) ..() diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index deec187f88..571525d8f0 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -12,8 +12,6 @@ var/recentpump = 0 // to prevent spammage weapon_weight = WEAPON_MEDIUM - pb_knockback = 2 - /obj/item/gun/ballistic/shotgun/attackby(obj/item/A, mob/user, params) . = ..() if(.) diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index 8f9bc13583..8b358832b0 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -56,7 +56,6 @@ item_flags = NONE casing_ejector = FALSE can_suppress = FALSE - pb_knockback = 0 /obj/item/gun/ballistic/shotgun/toy/process_chamber(empty_chamber = 0) ..() diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 7aa85db246..c53e28ea29 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -569,4 +569,4 @@ /obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit() qdel(src) - return FALSE + return BULLET_ACT_HIT diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm index 6c685ebe89..1c8d519ba8 100644 --- a/code/modules/projectiles/guns/misc/blastcannon.dm +++ b/code/modules/projectiles/guns/misc/blastcannon.dm @@ -114,7 +114,7 @@ icon_state = "blastwave" damage = 0 nodamage = FALSE - forcedodge = TRUE + movement_type = FLYING | UNSTOPPABLE var/heavyr = 0 var/mediumr = 0 var/lightr = 0 diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 31eb34a4e1..cc778bcf05 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -11,15 +11,16 @@ item_flags = ABSTRACT pass_flags = PASSTABLE mouse_opacity = MOUSE_OPACITY_TRANSPARENT + movement_type = FLYING hitsound = 'sound/weapons/pierce.ogg' var/hitsound_wall = "" resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF var/def_zone = "" //Aiming at var/atom/movable/firer = null//Who shot it - var/atom/fired_from = null // the atom that the projectile was fired from (gun, turret) + var/atom/fired_from = null // the atom that the projectile was fired from (gun, turret) var/suppressed = FALSE //Attack message var/suppressed = FALSE //Attack message - var/candink = FALSE //Can this projectile play the dink sound when hitting the head? + var/candink = FALSE //Can this projectile play the dink sound when hitting the head? var/yo = null var/yo = null var/xo = null var/atom/original = null // the original target clicked @@ -84,7 +85,8 @@ var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb var/projectile_type = /obj/item/projectile var/range = 50 //This will de-increment every step. When 0, it will deletze the projectile. - var/decayedRange + var/decayedRange //stores original range + var/reflect_range_decrease = 5 //amount of original range that falls off when reflecting, so it doesn't go forever var/is_reflectable = FALSE // Can it be reflected or not? //Effects var/stun = 0 @@ -99,11 +101,12 @@ var/drowsy = 0 var/stamina = 0 var/jitter = 0 - var/forcedodge = 0 //to pass through everything var/dismemberment = 0 //The higher the number, the greater the bonus to dismembering. 0 will not dismember at all. var/impact_effect_type //what type of impact effect to show when hitting something var/log_override = FALSE //is this type spammed enough to not log? (KAs) + var/temporary_unstoppable_movement = FALSE + /obj/item/projectile/Initialize() . = ..() permutated = list() @@ -152,12 +155,12 @@ W.add_dent(WALL_DENT_SHOT, hitx, hity) - return 0 + return BULLET_ACT_HIT if(!isliving(target)) if(impact_effect_type && !hitscan) new impact_effect_type(target_loca, hitx, hity) - return 0 + return BULLET_ACT_HIT var/mob/living/L = target @@ -185,7 +188,6 @@ C.bleed(damage) else L.add_splatter_floor(target_loca) - else if(impact_effect_type && !hitscan) new impact_effect_type(target_loca, hitx, hity) @@ -235,24 +237,20 @@ beam_segments[beam_index] = null /obj/item/projectile/Bump(atom/A) + var/turf/T = get_turf(A) if(trajectory && check_ricochet(A) && check_ricochet_flag(A) && ricochets < ricochets_max) var/datum/point/pcache = trajectory.copy_to() ricochets++ if(A.handle_ricochet(src)) on_ricochet(A) ignore_source_check = TRUE - range = initial(range) + decayedRange = max(0, decayedRange - reflect_range_decrease) + range = decayedRange if(hitscan) store_hitscan_collision(pcache) return TRUE - if(firer && !ignore_source_check) - if(A == firer || (A == firer.loc && ismecha(A))) //cannot shoot yourself or your mech - trajectory_ignore_forcemove = TRUE - forceMove(get_turf(A)) - trajectory_ignore_forcemove = FALSE - return FALSE - var/distance = get_dist(get_turf(A), starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations. + var/distance = get_dist(T, starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations. def_zone = ran_zone(def_zone, max(100-(7*distance), 5)) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use. if(isturf(A) && hitsound_wall) @@ -261,51 +259,66 @@ volume = 5 playsound(loc, hitsound_wall, volume, 1, -1) - var/turf/target_turf = get_turf(A) + return process_hit(T, select_target(T, A)) - if(!prehit(A)) - if(forcedodge) - trajectory_ignore_forcemove = TRUE - forceMove(target_turf) - trajectory_ignore_forcemove = FALSE - return FALSE +#define QDEL_SELF 1 //Delete if we're not UNSTOPPABLE flagged non-temporarily +#define DO_NOT_QDEL 2 //Pass through. +#define FORCE_QDEL 3 //Force deletion. - var/permutation = A.bullet_act(src, def_zone) // searches for return value, could be deleted after run so check A isn't null - if(permutation == -1 || forcedodge)// the bullet passes through a dense object! - trajectory_ignore_forcemove = TRUE - forceMove(target_turf) - trajectory_ignore_forcemove = FALSE - if(A) - permutated.Add(A) - return FALSE - else - var/atom/alt = select_target(A) - if(alt) - if(!prehit(alt)) - return FALSE - alt.bullet_act(src, def_zone) - qdel(src) - return TRUE +/obj/item/projectile/proc/process_hit(turf/T, atom/target, qdel_self, hit_something = FALSE) //probably needs to be reworked entirely when pixel movement is done. + if(QDELETED(src) || !T || !target) //We're done, nothing's left. + if((qdel_self == FORCE_QDEL) || ((qdel_self == QDEL_SELF) && !temporary_unstoppable_movement && !CHECK_BITFIELD(movement_type, UNSTOPPABLE))) + qdel(src) + return hit_something + permutated |= target //Make sure we're never hitting it again. If we ever run into weirdness with piercing projectiles needing to hit something multiple times.. well.. that's a to-do. + if(!prehit(target)) + return process_hit(T, select_target(T), qdel_self, hit_something) //Hit whatever else we can since that didn't work. + var/result = target.bullet_act(src, def_zone) + if(result == BULLET_ACT_FORCE_PIERCE) + if(!CHECK_BITFIELD(movement_type, UNSTOPPABLE)) + temporary_unstoppable_movement = TRUE + ENABLE_BITFIELD(movement_type, UNSTOPPABLE) + return process_hit(T, select_target(T), qdel_self, TRUE) //Hit whatever else we can since we're piercing through but we're still on the same tile. + else if(result == BULLET_ACT_TURF) //We hit the turf but instead we're going to also hit something else on it. + return process_hit(T, select_target(T), QDEL_SELF, TRUE) + else //Whether it hit or blocked, we're done! + qdel_self = QDEL_SELF + hit_something = TRUE + if((qdel_self == FORCE_QDEL) || ((qdel_self == QDEL_SELF) && !temporary_unstoppable_movement && !CHECK_BITFIELD(movement_type, UNSTOPPABLE))) + qdel(src) + return hit_something -/obj/item/projectile/proc/select_target(atom/A) //Selects another target from a wall if we hit a wall. - if(!A || !A.density || (A.flags_1 & ON_BORDER_1) || ismob(A) || A == original) //if we hit a dense non-border obj or dense turf then we also hit one of the mobs or machines/structures on that tile. - return - var/turf/T = get_turf(A) - if(original in T) +#undef QDEL_SELF +#undef DO_NOT_QDEL +#undef FORCE_QDEL + +/obj/item/projectile/proc/select_target(turf/T, atom/target) //Select a target from a turf. + if((original in T) && can_hit_target(original, permutated, TRUE, TRUE)) return original - var/list/mob/possible_mobs = typecache_filter_list(T, GLOB.typecache_mob) - A + if(target && can_hit_target(target, permutated, target == original, TRUE)) + return target + var/list/mob/living/possible_mobs = typecache_filter_list(T, GLOB.typecache_mob) var/list/mob/mobs = list() - for(var/i in possible_mobs) - var/mob/M = i - if(M.lying) + for(var/mob/living/M in possible_mobs) + if(!can_hit_target(M, permutated, M == original, TRUE)) continue mobs += M var/mob/M = safepick(mobs) if(M) return M.lowest_buckled_mob() - var/obj/O = safepick(typecache_filter_list(T, GLOB.typecache_machine_or_structure) - A) + var/list/obj/possible_objs = typecache_filter_list(T, GLOB.typecache_machine_or_structure) + var/list/obj/objs = list() + for(var/obj/O in possible_objs) + if(!can_hit_target(O, permutated, O == original, TRUE)) + continue + objs += O + var/obj/O = safepick(objs) if(O) return O + //Nothing else is here that we can hit, hit the turf if we haven't. + if(!(T in permutated) && can_hit_target(T, permutated, T == original, TRUE)) + return T + //Returns null if nothing at all was found. /obj/item/projectile/proc/check_ricochet() if(prob(ricochet_chance)) @@ -332,7 +345,7 @@ var/turf/ending = return_predicted_turf_after_moves(moves, forced_angle) return getline(current, ending) -/obj/item/projectile/Process_Spacemove(var/movement_dir = 0) +/obj/item/projectile/Process_Spacemove(movement_dir = 0) return TRUE //Bullets don't drift in space /obj/item/projectile/process() @@ -360,8 +373,7 @@ /obj/item/projectile/proc/fire(angle, atom/direct_target) if(fired_from) - SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_BEFORE_FIRE, src, original) - //If no angle needs to resolve it from xo/yo! + SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_BEFORE_FIRE, src, original) //If no angle needs to resolve it from xo/yo! if(!log_override && firer && original) log_combat(firer, original, "fired at", src, "from [get_area_name(src, TRUE)]") if(direct_target) @@ -498,8 +510,6 @@ else if(T != loc) step_towards(src, T) hitscan_last = loc - if(can_hit_target(original, permutated)) - Bump(original) if(!hitscanning && !forcemoved) pixel_x = trajectory.return_px() - trajectory.mpx * trajectory_multiplier * SSprojectiles.global_iterations_per_move pixel_y = trajectory.return_py() - trajectory.mpy * trajectory_multiplier * SSprojectiles.global_iterations_per_move @@ -528,8 +538,28 @@ homing_offset_y = -homing_offset_y //Returns true if the target atom is on our current turf and above the right layer -/obj/item/projectile/proc/can_hit_target(atom/target, var/list/passthrough) - return (target && ((target.layer >= PROJECTILE_HIT_THRESHHOLD_LAYER) || ismob(target)) && (loc == get_turf(target)) && (!(target in passthrough))) +//If direct target is true it's the originally clicked target. +/obj/item/projectile/proc/can_hit_target(atom/target, list/passthrough, direct_target = FALSE, ignore_loc = FALSE) + if(QDELETED(target)) + return FALSE + if(!ignore_source_check && firer) + var/mob/M = firer + if((target == firer) || ((target == firer.loc) && ismecha(firer.loc)) || (target in firer.buckled_mobs) || (istype(M) && (M.buckled == target))) + return FALSE + if(!ignore_loc && (loc != target.loc)) + return FALSE + if(target in passthrough) + return FALSE + if(target.density) //This thing blocks projectiles, hit it regardless of layer/mob stuns/etc. + return TRUE + if(!isliving(target)) + if(target.layer < PROJECTILE_HIT_THRESHHOLD_LAYER) + return FALSE + else + var/mob/living/L = target + if(!direct_target && !L.density) + return FALSE + return TRUE //Spread is FORCED! /obj/item/projectile/proc/preparePixelProjectile(atom/target, atom/source, params, spread = 0) @@ -591,9 +621,20 @@ return list(angle, p_x, p_y) /obj/item/projectile/Crossed(atom/movable/AM) //A mob moving on a tile with a projectile is hit by it. - ..() - if(isliving(AM) && (AM.density || AM == original) && !(src.pass_flags & PASSMOB)) - Bump(AM) + . = ..() + if(isliving(AM) && !(pass_flags & PASSMOB)) + var/mob/living/L = AM + if(can_hit_target(L, permutated, (AM == original))) + Bump(AM) + +/obj/item/projectile/Move(atom/newloc, dir = NONE) + . = ..() + if(.) + if(temporary_unstoppable_movement) + temporary_unstoppable_movement = FALSE + DISABLE_BITFIELD(movement_type, UNSTOPPABLE) + if(fired && can_hit_target(original, permutated, TRUE)) + Bump(original) /obj/item/projectile/Destroy() if(hitscan) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index d984217f8c..fd79a52906 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -107,8 +107,8 @@ /obj/item/projectile/beam/pulse/heavy/on_hit(atom/target, blocked = FALSE) life -= 10 if(life > 0) - . = -1 - ..() + . = BULLET_ACT_FORCE_PIERCE + return ..() /obj/item/projectile/beam/emitter name = "emitter beam" @@ -207,4 +207,4 @@ . = ..() if(isopenturf(target) || istype(target, /turf/closed/indestructible))//shrunk floors wouldnt do anything except look weird, i-walls shouldnt be bypassable return - target.AddComponent(/datum/component/shrink, shrink_time) \ No newline at end of file + target.AddComponent(/datum/component/shrink, shrink_time) diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm index 9d60f72de0..3f418df75b 100644 --- a/code/modules/projectiles/projectile/bullets/dart_syringe.dm +++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm @@ -15,7 +15,7 @@ if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body. ..() if(skip == TRUE) - return + return BULLET_ACT_HIT reagents.reaction(M, INJECT) reagents.trans_to(M, reagents.total_volume) return TRUE @@ -27,7 +27,7 @@ ..(target, blocked) DISABLE_BITFIELD(reagents.reagents_holder_flags, NO_REACT) reagents.handle_reactions() - return TRUE + return BULLET_ACT_HIT /obj/item/projectile/bullet/dart/metalfoam/Initialize() . = ..() @@ -70,11 +70,11 @@ target.visible_message("\The [src] beeps!") to_chat("You feel a tiny prick as a smartdart embeds itself in you with a beep.") - return TRUE + return BULLET_ACT_HIT else blocked = 100 target.visible_message("\The [src] was deflected!", \ "You see a [src] bounce off you, booping sadly!") target.visible_message("\The [src] fails to land on target!") - return TRUE + return BULLET_ACT_BLOCK diff --git a/code/modules/projectiles/projectile/bullets/dnainjector.dm b/code/modules/projectiles/projectile/bullets/dnainjector.dm index 3bfe2add01..22e9d28ab6 100644 --- a/code/modules/projectiles/projectile/bullets/dnainjector.dm +++ b/code/modules/projectiles/projectile/bullets/dnainjector.dm @@ -12,7 +12,7 @@ if(M.can_inject(null, FALSE, def_zone, FALSE)) if(injector.inject(M, firer)) QDEL_NULL(injector) - return TRUE + return BULLET_ACT_HIT else blocked = 100 target.visible_message("\The [src] was deflected!", \ diff --git a/code/modules/projectiles/projectile/bullets/grenade.dm b/code/modules/projectiles/projectile/bullets/grenade.dm index 3e01f167f6..16305c233f 100644 --- a/code/modules/projectiles/projectile/bullets/grenade.dm +++ b/code/modules/projectiles/projectile/bullets/grenade.dm @@ -9,4 +9,4 @@ /obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = FALSE) ..() explosion(target, -1, 0, 2, 1, 0, flame_range = 3) - return TRUE + return BULLET_ACT_HIT diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index ed9478e0ee..02ec167b80 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -53,7 +53,7 @@ /obj/item/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = FALSE) ..() explosion(target, -1, 0, 1) - return TRUE + return BULLET_ACT_HIT /obj/item/projectile/bullet/pellet var/tile_dropoff = 0.75 diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm index 6519421284..bea5dbc140 100644 --- a/code/modules/projectiles/projectile/bullets/sniper.dm +++ b/code/modules/projectiles/projectile/bullets/sniper.dm @@ -34,7 +34,7 @@ icon_state = "gauss" name = "penetrator round" damage = 60 - forcedodge = TRUE + movement_type = FLYING | UNSTOPPABLE dismemberment = 0 //It goes through you cleanly. knockdown = 0 breakthings = FALSE diff --git a/code/modules/projectiles/projectile/bullets/special.dm b/code/modules/projectiles/projectile/bullets/special.dm index 0d3ed847d8..a0414d8a9c 100644 --- a/code/modules/projectiles/projectile/bullets/special.dm +++ b/code/modules/projectiles/projectile/bullets/special.dm @@ -3,7 +3,7 @@ /obj/item/projectile/bullet/honker damage = 0 knockdown = 60 - forcedodge = TRUE + movement_type = FLYING | UNSTOPPABLE nodamage = TRUE candink = FALSE hitsound = 'sound/items/bikehorn.ogg' diff --git a/code/modules/projectiles/projectile/energy/net_snare.dm b/code/modules/projectiles/projectile/energy/net_snare.dm index c8333a811c..22eaadb1e0 100644 --- a/code/modules/projectiles/projectile/energy/net_snare.dm +++ b/code/modules/projectiles/projectile/energy/net_snare.dm @@ -15,7 +15,7 @@ var/turf/Tloc = get_turf(target) if(!locate(/obj/effect/nettingportal) in Tloc) new /obj/effect/nettingportal(Tloc) - ..() + return ..() /obj/item/projectile/energy/net/on_range() do_sparks(1, TRUE, src) @@ -69,7 +69,7 @@ else if(iscarbon(target)) var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy(get_turf(target)) B.Crossed(target) - ..() + return ..() /obj/item/projectile/energy/trap/on_range() new /obj/item/restraints/legcuffs/beartrap/energy(loc) @@ -91,7 +91,7 @@ var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target)) B.Crossed(target) QDEL_IN(src, 10) - ..() + return ..() /obj/item/projectile/energy/trap/cyborg/on_range() do_sparks(1, TRUE, src) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 791db320a2..7608e5f4a8 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -17,7 +17,7 @@ var/mob/M = target if(M.anti_magic_check()) M.visible_message("[src] vanishes on contact with [target]!") - return + return BULLET_ACT_BLOCK M.death(0) /obj/item/projectile/magic/resurrection @@ -31,10 +31,10 @@ . = ..() if(isliving(target)) if(target.hellbound) - return + return BULLET_ACT_BLOCK if(target.anti_magic_check()) target.visible_message("[src] vanishes on contact with [target]!") - return + return BULLET_ACT_BLOCK if(iscarbon(target)) var/mob/living/carbon/C = target C.regenerate_limbs() @@ -60,7 +60,7 @@ var/mob/M = target if(M.anti_magic_check()) M.visible_message("[src] fizzles on contact with [target]!") - return + return BULLET_ACT_BLOCK var/teleammount = 0 var/teleloc = target if(!isturf(target)) @@ -116,7 +116,7 @@ if(M.anti_magic_check()) M.visible_message("[src] fizzles on contact with [M]!") qdel(src) - return + return BULLET_ACT_BLOCK wabbajack(change) qdel(src) @@ -264,7 +264,7 @@ /obj/item/projectile/magic/animate/on_hit(atom/target, blocked = FALSE) target.animate_atom_living(firer) - ..() + . = ..() /atom/proc/animate_atom_living(var/mob/living/owner = null) if((isitem(src) || isstructure(src)) && !is_type_in_list(src, GLOB.protected_objects)) @@ -315,7 +315,7 @@ if(M.anti_magic_check()) M.visible_message("[src] vanishes on contact with [target]!") qdel(src) - return + return BULLET_ACT_BLOCK . = ..() /obj/item/projectile/magic/arcane_barrage @@ -334,7 +334,7 @@ if(M.anti_magic_check()) M.visible_message("[src] vanishes on contact with [target]!") qdel(src) - return + return BULLET_ACT_BLOCK . = ..() @@ -460,7 +460,7 @@ if(M.anti_magic_check()) visible_message("[src] fizzles on contact with [target]!") qdel(src) - return + return BULLET_ACT_BLOCK tesla_zap(src, tesla_range, tesla_power, tesla_flags) qdel(src) @@ -487,7 +487,7 @@ var/mob/living/M = target if(M.anti_magic_check()) visible_message("[src] vanishes into smoke on contact with [target]!") - return + return BULLET_ACT_BLOCK M.take_overall_damage(0,10) //between this 10 burn, the 10 brute, the explosion brute, and the onfire burn, your at about 65 damage if you stop drop and roll immediately var/turf/T = get_turf(target) explosion(T, -1, exp_heavy, exp_light, exp_flash, 0, flame_range = exp_fire) @@ -504,7 +504,7 @@ if(ismob(target)) var/mob/living/M = target if(M.anti_magic_check()) - return + return BULLET_ACT_BLOCK var/turf/T = get_turf(target) for(var/i=0, i<50, i+=10) addtimer(CALLBACK(GLOBAL_PROC, .proc/explosion, T, -1, exp_heavy, exp_light, exp_flash, FALSE, FALSE, exp_fire), i) @@ -518,11 +518,11 @@ /obj/item/projectile/magic/nuclear/on_hit(target) if(used) - return + return BULLET_ACT_HIT new/obj/effect/temp_visual/slugboom(get_turf(src)) if(ismob(target)) if(target == victim) - return + return BULLET_ACT_FORCE_PIERCE used = 1 visible_message("[victim] slams into [target] with explosive force!") explosion(src, 2, 3, 4, -1, TRUE, FALSE, 5) @@ -531,8 +531,9 @@ victim.take_overall_damage(30,30) victim.Knockdown(60) explosion(src, -1, -1, -1, -1, FALSE, FALSE, 5) + return BULLET_ACT_HIT /obj/item/projectile/magic/nuclear/Destroy() for(var/atom/movable/AM in contents) AM.forceMove(get_turf(src)) - . = ..() \ No newline at end of file + . = ..() diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm index 0464f93cd3..062623689b 100644 --- a/code/modules/projectiles/projectile/special/curse.dm +++ b/code/modules/projectiles/projectile/special/curse.dm @@ -12,7 +12,7 @@ knockdown = 20 speed = 2 range = 16 - forcedodge = TRUE + movement_type = FLYING | UNSTOPPABLE var/datum/beam/arm var/handedness = 0 @@ -28,7 +28,7 @@ /obj/item/projectile/curse_hand/prehit(atom/target) if(target == original) - forcedodge = FALSE + DISABLE_BITFIELD(movement_type, UNSTOPPABLE) else if(!isturf(target)) return FALSE return ..() @@ -37,7 +37,7 @@ if(arm) arm.End() arm = null - if(forcedodge) + if(CHECK_BITFIELD(movement_type, UNSTOPPABLE)) playsound(src, 'sound/effects/curse3.ogg', 25, 1, -1) var/turf/T = get_step(src, dir) new/obj/effect/temp_visual/dir_setting/curse/hand(T, dir, handedness) diff --git a/code/modules/projectiles/projectile/special/ion.dm b/code/modules/projectiles/projectile/special/ion.dm index 231b4de021..ae0888d3df 100644 --- a/code/modules/projectiles/projectile/special/ion.dm +++ b/code/modules/projectiles/projectile/special/ion.dm @@ -6,15 +6,12 @@ nodamage = 1 flag = "energy" impact_effect_type = /obj/effect/temp_visual/impact_effect/ion + var/emp_radius = 1 /obj/item/projectile/ion/on_hit(atom/target, blocked = FALSE) ..() - empulse(target, 1, 1) - return TRUE + empulse(target, emp_radius, emp_radius) + return BULLET_ACT_HIT /obj/item/projectile/ion/weak - -/obj/item/projectile/ion/weak/on_hit(atom/target, blocked = FALSE) - ..() - empulse(target, 0, 0) - return TRUE + emp_radius = 0 diff --git a/code/modules/projectiles/projectile/special/plasma.dm b/code/modules/projectiles/projectile/special/plasma.dm index 3a9ce24674..33559fa92c 100644 --- a/code/modules/projectiles/projectile/special/plasma.dm +++ b/code/modules/projectiles/projectile/special/plasma.dm @@ -29,7 +29,7 @@ mine_range-- range++ if(range > 0) - return -1 + return BULLET_ACT_FORCE_PIERCE /obj/item/projectile/plasma/adv damage = 28 diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm index 03d85665d5..0cee20dd53 100644 --- a/code/modules/projectiles/projectile/special/rocket.dm +++ b/code/modules/projectiles/projectile/special/rocket.dm @@ -6,7 +6,7 @@ /obj/item/projectile/bullet/gyro/on_hit(atom/target, blocked = FALSE) ..() explosion(target, -1, 0, 2) - return TRUE + return BULLET_ACT_HIT /obj/item/projectile/bullet/a84mm name ="\improper HEDP rocket" @@ -28,7 +28,7 @@ if(issilicon(target)) var/mob/living/silicon/S = target S.take_overall_damage(anti_armour_damage*0.75, anti_armour_damage*0.25) - return TRUE + return BULLET_ACT_HIT /obj/item/projectile/bullet/a84mm_he name ="\improper HE missile" @@ -43,4 +43,4 @@ explosion(target, 0, 1, 2, 4) else explosion(target, 0, 0, 2, 4) - return TRUE \ No newline at end of file + return BULLET_ACT_HIT \ No newline at end of file diff --git a/code/modules/projectiles/projectile/special/wormhole.dm b/code/modules/projectiles/projectile/special/wormhole.dm index 0832f0cc76..aaf9f542d3 100644 --- a/code/modules/projectiles/projectile/special/wormhole.dm +++ b/code/modules/projectiles/projectile/special/wormhole.dm @@ -25,5 +25,5 @@ /obj/item/projectile/beam/wormhole/on_hit(atom/target) if(!gun) qdel(src) - return + return BULLET_ACT_BLOCK gun.create_portal(src, get_turf(src)) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 137a9cf792..95d78425db 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -113,7 +113,9 @@ if(panel_open) . += "[src]'s maintenance hatch is open!" if(in_range(user, src) || isobserver(user)) - . += "The status display reads:
Recharging [recharge_amount] power units per interval.
Power efficiency increased by [(powerefficiency*1000)-100]%." + . += "The status display reads:\n\ + Recharging [recharge_amount] power units per interval.\n\ + Power efficiency increased by [round((powerefficiency*1000)-100, 1)]%." switch(macrotier) if(1) . += "Macro granularity at 5u." diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index c0ecbbae6d..189d09b06f 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -52,6 +52,11 @@ for(var/obj/item/stock_parts/micro_laser/M in component_parts) heater_coefficient *= M.rating +/obj/machinery/chem_heater/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Heating reagents at [heater_coefficient*1000]% speed." + /obj/machinery/chem_heater/process() ..() if(stat & NOPOWER) diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 6460bfed78..6a191bd2ab 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -901,7 +901,12 @@ M.emote("nya") if(prob(20)) to_chat(M, "[pick("Headpats feel nice.", "Backrubs would be nice.", "Mew")]") - M.adjustArousalLoss(5) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/list/adjusted = H.adjust_arousal(5,aphro = TRUE) + for(var/g in adjusted) + var/obj/item/organ/genital/G = g + to_chat(M, "You feel like playing with your [G.name]!") ..() /datum/reagent/consumable/monkey_energy diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index f960633d94..ccc966e7e4 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2127,5 +2127,11 @@ M.emote("nya") if(prob(20)) to_chat(M, "[pick("Headpats feel nice.", "The feeling of a hairball...", "Backrubs would be nice.", "Whats behind those doors?")]") - M.adjustArousalLoss(2) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/list/adjusted = H.adjust_arousal(2,aphro = TRUE) + for(var/g in adjusted) + var/obj/item/organ/genital/G = g + to_chat(M, "You feel like playing with your [G.name]!") + ..() diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index d4c71ebb44..26b39fb3b0 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -222,7 +222,6 @@ /datum/chemical_reaction/mix_virus name = "Mix Virus" id = "mixvirus" - results = list(/datum/reagent/blood = 1) required_reagents = list(/datum/reagent/consumable/virus_food = 1) required_catalysts = list(/datum/reagent/blood = 1) var/level_min = 1 @@ -234,8 +233,8 @@ if(B && B.data) var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] if(D) - D.Evolve(level_min, level_max) - + for(var/i in 1 to min(created_volume, 5)) + D.Evolve(level_min, level_max) /datum/chemical_reaction/mix_virus/mix_virus_2 @@ -326,19 +325,18 @@ level_max = 8 /datum/chemical_reaction/mix_virus/rem_virus - name = "Devolve Virus" id = "remvirus" required_reagents = list(/datum/reagent/medicine/synaptizine = 1) required_catalysts = list(/datum/reagent/blood = 1) /datum/chemical_reaction/mix_virus/rem_virus/on_reaction(datum/reagents/holder, created_volume) - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list if(B && B.data) var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] if(D) - D.Devolve() + for(var/i in 1 to min(created_volume, 5)) + D.Devolve() /datum/chemical_reaction/mix_virus/neuter_virus name = "Neuter Virus" @@ -347,14 +345,12 @@ required_catalysts = list(/datum/reagent/blood = 1) /datum/chemical_reaction/mix_virus/neuter_virus/on_reaction(datum/reagents/holder, created_volume) - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list if(B && B.data) var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] if(D) - D.Neuter() - - + for(var/i in 1 to min(created_volume, 5)) + D.Neuter() ////////////////////////////////// foam and foam precursor /////////////////////////////////////////////////// diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 321b63da1e..f311537641 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -102,9 +102,9 @@ reagents.expose_temperature(exposed_temperature) ..() -/obj/item/reagent_containers/throw_impact(atom/target) +/obj/item/reagent_containers/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() - SplashReagents(target, TRUE) + SplashReagents(hit_atom, TRUE) /obj/item/reagent_containers/proc/bartender_check(atom/target) . = FALSE diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 2e0c5b7619..1c87c1901c 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -125,7 +125,7 @@ boom() /obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/P) - ..() + . = ..() if(!QDELETED(src)) //wasn't deleted by the projectile's effects. if(!P.nodamage && ((P.damage_type == BURN) || (P.damage_type == BRUTE))) var/boom_message = "[ADMIN_LOOKUPFLW(P.firer)] triggered a fueltank explosion via projectile." diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 1965883cfe..e1c312ae2a 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -371,7 +371,7 @@ return TRUE return FALSE -/obj/machinery/disposal/bin/hitby(atom/movable/AM) +/obj/machinery/disposal/bin/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) if(isitem(AM) && AM.CanEnterDisposals()) if(prob(75)) AM.forceMove(src) diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm index 94599e9c32..ae0f13764b 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm @@ -117,7 +117,7 @@ name = "Foam Riot Dart" id = "riot_dart" build_type = AUTOLATHE - materials = list(MAT_METAL = 1000) //Discount for making individually - no box = less metal! + materials = list(MAT_METAL = 1125) //Discount for making individually - no box = less metal! build_path = /obj/item/ammo_casing/caseless/foam_dart/riot category = list("hacked", "Security") diff --git a/code/modules/research/designs/electronics_designs.dm b/code/modules/research/designs/electronics_designs.dm index 1525c6659e..82fd71d895 100644 --- a/code/modules/research/designs/electronics_designs.dm +++ b/code/modules/research/designs/electronics_designs.dm @@ -46,6 +46,16 @@ category = list("Electronics") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE +/datum/design/nanite_comm_remote + name = "Nanite Communication Remote" + desc = "Allows for the construction of a nanite communication remote." + id = "nanite_comm_remote" + build_type = PROTOLATHE + materials = list(MAT_GLASS = 500, MAT_METAL = 500) + build_path = /obj/item/nanite_remote/comm + category = list("Electronics") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + /datum/design/nanite_scanner name = "Nanite Scanner" desc = "Allows for the construction of a nanite scanner." diff --git a/code/modules/research/designs/nanite_designs.dm b/code/modules/research/designs/nanite_designs.dm index 09fe1d9c9b..13668ba570 100644 --- a/code/modules/research/designs/nanite_designs.dm +++ b/code/modules/research/designs/nanite_designs.dm @@ -380,7 +380,7 @@ name = "Mind Control" desc = "The nanites imprint an absolute directive onto the host's brain while they're active." id = "mindcontrol_nanites" - program_type = /datum/nanite_program/mind_control + program_type = /datum/nanite_program/triggered/comm/mind_control category = list("Weaponized Nanites") ////////////////////SUPPRESSION NANITES////////////////////////////////////// @@ -445,21 +445,35 @@ name = "Skull Echo" desc = "The nanites echo a synthesized message inside the host's skull." id = "voice_nanites" - program_type = /datum/nanite_program/triggered/voice + program_type = /datum/nanite_program/triggered/comm/voice category = list("Suppression Nanites") /datum/design/nanites/speech name = "Forced Speech" desc = "The nanites force the host to say a pre-programmed sentence when triggered." id = "speech_nanites" - program_type = /datum/nanite_program/triggered/speech + program_type = /datum/nanite_program/triggered/comm/speech category = list("Suppression Nanites") /datum/design/nanites/hallucination name = "Hallucination" desc = "The nanites make the host see and hear things that aren't real." id = "hallucination_nanites" - program_type = /datum/nanite_program/triggered/hallucination + program_type = /datum/nanite_program/triggered/comm/hallucination + category = list("Suppression Nanites") + +/datum/design/nanites/good_mood + name = "Happiness Enhancer" + desc = "The nanites synthesize serotonin inside the host's brain, creating an artificial sense of happiness." + id = "good_mood_nanites" + program_type = /datum/nanite_program/good_mood + category = list("Suppression Nanites") + +/datum/design/nanites/bad_mood + name = "Happiness Suppressor" + desc = "The nanites suppress the production of serotonin inside the host's brain, creating an artificial state of depression." + id = "bad_mood_nanites" + program_type = /datum/nanite_program/bad_mood category = list("Suppression Nanites") ////////////////////SENSOR NANITES////////////////////////////////////// diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index bff8df8816..681195bcc3 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -82,6 +82,11 @@ for(var/obj/item/stock_parts/micro_laser/M in component_parts) badThingCoeff += M.rating +/obj/machinery/rnd/experimentor/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Malfunction probability reduced by [badThingCoeff]%.
Cooldown interval between experiments at [resetTime*0.1] seconds.
" + /obj/machinery/rnd/experimentor/proc/checkCircumstances(obj/item/O) //snowflake check to only take "made" bombs if(istype(O, /obj/item/transfer_valve)) diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index d93355b36c..659a83c703 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -73,6 +73,12 @@ total_rating = max(1, total_rating) efficiency_coeff = total_rating +/obj/machinery/rnd/production/examine(mob/user) + . = ..() + var/datum/component/remote_materials/materials = GetComponent(/datum/component/remote_materials) + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Storing up to [materials.local_size] material units locally.
Material usage efficiency at [efficiency_coeff*100]%.
" + //we eject the materials upon deconstruction. /obj/machinery/rnd/production/on_deconstruction() for(var/obj/item/reagent_containers/glass/G in component_parts) diff --git a/code/modules/research/nanites/nanite_chamber.dm b/code/modules/research/nanites/nanite_chamber.dm index 1fc2633989..515231c24c 100644 --- a/code/modules/research/nanites/nanite_chamber.dm +++ b/code/modules/research/nanites/nanite_chamber.dm @@ -29,6 +29,11 @@ for(var/obj/item/stock_parts/scanning_module/P in component_parts) scan_level += P.rating +/obj/machinery/nanite_chamber/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Scanning module has been upgraded to level [scan_level]." + /obj/machinery/nanite_chamber/proc/set_busy(status, message, working_icon) busy = status busy_message = message diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm index ad48b64baa..df439e4496 100644 --- a/code/modules/research/nanites/nanite_programs/healing.dm +++ b/code/modules/research/nanites/nanite_programs/healing.dm @@ -3,7 +3,7 @@ /datum/nanite_program/regenerative name = "Accelerated Regeneration" desc = "The nanites boost the host's natural regeneration, increasing their healing speed. Does not consume nanites if the host is unharmed." - use_rate = 2.5 + use_rate = 0.5 rogue_types = list(/datum/nanite_program/necrotic) /datum/nanite_program/regenerative/check_conditions() @@ -23,11 +23,11 @@ if(!parts.len) return for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(1/parts.len, 1/parts.len)) + if(L.heal_damage(0.5/parts.len, 0.5/parts.len, null, BODYPART_ORGANIC)) host_mob.update_damage_overlays() else - host_mob.adjustBruteLoss(-1, TRUE) - host_mob.adjustFireLoss(-1, TRUE) + host_mob.adjustBruteLoss(-0.5, TRUE) + host_mob.adjustFireLoss(-0.5, TRUE) /datum/nanite_program/temperature name = "Temperature Adjustment" @@ -112,7 +112,7 @@ /datum/nanite_program/repairing name = "Mechanical Repair" desc = "The nanites fix damage in the host's mechanical limbs." - use_rate = 0.5 //much more efficient than organic healing + use_rate = 0.5 rogue_types = list(/datum/nanite_program/necrotic) /datum/nanite_program/repairing/check_conditions() @@ -137,13 +137,13 @@ return var/update = FALSE for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(1/parts.len, 1/parts.len, only_robotic = TRUE, only_organic = FALSE)) + if(L.heal_damage(1.5/parts.len, 1.5/parts.len, null, BODYPART_ROBOTIC)) //much faster than organic healing update = TRUE if(update) host_mob.update_damage_overlays() else - host_mob.adjustBruteLoss(-1, TRUE) - host_mob.adjustFireLoss(-1, TRUE) + host_mob.adjustBruteLoss(-1.5, TRUE) + host_mob.adjustFireLoss(-1.5, TRUE) /datum/nanite_program/purging_advanced name = "Selective Blood Purification" diff --git a/code/modules/research/nanites/nanite_programs/suppression.dm b/code/modules/research/nanites/nanite_programs/suppression.dm index a6225fd337..ad5706f88c 100644 --- a/code/modules/research/nanites/nanite_programs/suppression.dm +++ b/code/modules/research/nanites/nanite_programs/suppression.dm @@ -114,7 +114,19 @@ . = ..() host_mob.cure_fakedeath("nanites") -/datum/nanite_program/triggered/speech +//Can receive transmissions from a nanite communication remote for customized messages +/datum/nanite_program/triggered/comm + var/comm_code = 0 + var/comm_message = "" + +/datum/nanite_program/triggered/comm/proc/receive_comm_signal(signal_comm_code, comm_message, comm_source) + if(!activated || !comm_code) + return + if(signal_comm_code == comm_code) + host_mob.investigate_log("'s [name] nanite program was messaged by [comm_source] with comm code [signal_comm_code] and message '[comm_message]'.", INVESTIGATE_NANITES) + trigger(comm_message) + +/datum/nanite_program/triggered/comm/speech name = "Forced Speech" desc = "The nanites force the host to say a pre-programmed sentence when triggered." unique = FALSE @@ -122,10 +134,10 @@ trigger_cooldown = 20 rogue_types = list(/datum/nanite_program/brain_misfire, /datum/nanite_program/brain_decay) - extra_settings = list("Sentence") + extra_settings = list("Sentence","Comm Code") var/sentence = "" -/datum/nanite_program/triggered/speech/set_extra_setting(user, setting) +/datum/nanite_program/triggered/comm/speech/set_extra_setting(user, setting) if(setting == "Sentence") var/new_sentence = stripped_input(user, "Choose the sentence that the host will be forced to say.", "Sentence", sentence, MAX_MESSAGE_LEN) if(!new_sentence) @@ -133,23 +145,34 @@ if(copytext(new_sentence, 1, 2) == "*") //emotes are abusable, like surrender return sentence = new_sentence + if(setting == "Comm Code") + var/new_code = input(user, "Set the communication code (1-9999) or set to 0 to disable external signals.", name, null) as null|num + if(isnull(new_code)) + return + comm_code = CLAMP(round(new_code, 1), 0, 9999) -/datum/nanite_program/triggered/speech/get_extra_setting(setting) +/datum/nanite_program/triggered/comm/speech/get_extra_setting(setting) if(setting == "Sentence") return sentence + if(setting == "Comm Code") + return comm_code -/datum/nanite_program/triggered/speech/copy_extra_settings_to(datum/nanite_program/triggered/speech/target) +/datum/nanite_program/triggered/comm/speech/copy_extra_settings_to(datum/nanite_program/triggered/comm/speech/target) target.sentence = sentence + target.comm_code = comm_code -/datum/nanite_program/triggered/speech/trigger() +/datum/nanite_program/triggered/comm/speech/trigger(comm_message) if(!..()) return + var/sent_message = comm_message + if(!comm_message) + sent_message = sentence if(host_mob.stat == DEAD) return to_chat(host_mob, "You feel compelled to speak...") - host_mob.say(sentence, forced = "nanite speech") + host_mob.say(sent_message, forced = "nanite speech") -/datum/nanite_program/triggered/voice +/datum/nanite_program/triggered/comm/voice name = "Skull Echo" desc = "The nanites echo a synthesized message inside the host's skull." unique = FALSE @@ -157,44 +180,62 @@ trigger_cooldown = 20 rogue_types = list(/datum/nanite_program/brain_misfire, /datum/nanite_program/brain_decay) - extra_settings = list("Message") + extra_settings = list("Message","Comm Code") var/message = "" -/datum/nanite_program/triggered/voice/set_extra_setting(user, setting) +/datum/nanite_program/triggered/comm/voice/set_extra_setting(user, setting) if(setting == "Message") var/new_message = stripped_input(user, "Choose the message sent to the host.", "Message", message, MAX_MESSAGE_LEN) if(!new_message) return message = new_message + if(setting == "Comm Code") + var/new_code = input(user, "Set the communication code (1-9999) or set to 0 to disable external signals.", name, null) as null|num + if(isnull(new_code)) + return + comm_code = CLAMP(round(new_code, 1), 0, 9999) -/datum/nanite_program/triggered/voice/get_extra_setting(setting) +/datum/nanite_program/triggered/comm/voice/get_extra_setting(setting) if(setting == "Message") return message + if(setting == "Comm Code") + return comm_code -/datum/nanite_program/triggered/voice/copy_extra_settings_to(datum/nanite_program/triggered/voice/target) +/datum/nanite_program/triggered/comm/voice/copy_extra_settings_to(datum/nanite_program/triggered/comm/voice/target) target.message = message + target.comm_code = comm_code -/datum/nanite_program/triggered/voice/trigger() +/datum/nanite_program/triggered/comm/voice/trigger(comm_message) if(!..()) return + var/sent_message = comm_message + if(!comm_message) + sent_message = message if(host_mob.stat == DEAD) return - to_chat(host_mob, "You hear a strange, robotic voice in your head... \"[message]\"") + to_chat(host_mob, "You hear a strange, robotic voice in your head... \"[sent_message]\"") -/datum/nanite_program/triggered/hallucination +/datum/nanite_program/triggered/comm/hallucination name = "Hallucination" desc = "The nanites make the host hallucinate something when triggered." trigger_cost = 4 trigger_cooldown = 80 unique = FALSE rogue_types = list(/datum/nanite_program/brain_misfire) - extra_settings = list("Hallucination Type") + extra_settings = list("Hallucination Type", "Comm Code") var/hal_type var/hal_details -/datum/nanite_program/triggered/hallucination/trigger() +/datum/nanite_program/triggered/comm/hallucination/trigger(comm_message) if(!..()) return + + if(comm_message && (hal_type != "Message")) //Triggered via comm remote, but not set to a message hallucination + return + var/sent_message = comm_message //Comm remotes can send custom hallucination messages for the chat hallucination + if(!sent_message) + sent_message = hal_details + if(!iscarbon(host_mob)) return var/mob/living/carbon/C = host_mob @@ -203,7 +244,7 @@ else switch(hal_type) if("Message") - new /datum/hallucination/chat(C, TRUE, null, hal_details) + new /datum/hallucination/chat(C, TRUE, null, sent_message) if("Battle") new /datum/hallucination/battle(C, TRUE, hal_details) if("Sound") @@ -223,7 +264,13 @@ if("Plasma Flood") new /datum/hallucination/fake_flood(C, TRUE) -/datum/nanite_program/triggered/hallucination/set_extra_setting(user, setting) +/datum/nanite_program/triggered/comm/hallucination/set_extra_setting(user, setting) + if(setting == "Comm Code") + var/new_code = input(user, "(Only for Message) Set the communication code (1-9999) or set to 0 to disable external signals.", name, null) as null|num + if(isnull(new_code)) + return + comm_code = CLAMP(round(new_code, 1), 0, 9999) + if(setting == "Hallucination Type") var/list/possible_hallucinations = list("Random","Message","Battle","Sound","Weird Sound","Station Message","Health","Alert","Fire","Shock","Plasma Flood") var/hal_type_choice = input("Choose the hallucination type", name) as null|anything in possible_hallucinations @@ -299,13 +346,76 @@ if("Plasma Flood") hal_type = "Plasma Flood" -/datum/nanite_program/triggered/hallucination/get_extra_setting(setting) +/datum/nanite_program/triggered/comm/hallucination/get_extra_setting(setting) if(setting == "Hallucination Type") if(!hal_type) return "Random" else return hal_type + if(setting == "Comm Code") + return comm_code -/datum/nanite_program/triggered/hallucination/copy_extra_settings_to(datum/nanite_program/triggered/hallucination/target) +/datum/nanite_program/triggered/comm/hallucination/copy_extra_settings_to(datum/nanite_program/triggered/comm/hallucination/target) target.hal_type = hal_type - target.hal_details = hal_details \ No newline at end of file + target.hal_details = hal_details + target.comm_code = comm_code + +/datum/nanite_program/good_mood + name = "Happiness Enhancer" + desc = "The nanites synthesize serotonin inside the host's brain, creating an artificial sense of happiness." + use_rate = 0.1 + rogue_types = list(/datum/nanite_program/brain_decay) + extra_settings = list("Mood Message") + var/message = "HAPPINESS ENHANCEMENT" + +/datum/nanite_program/good_mood/set_extra_setting(user, setting) + if(setting == "Mood Message") + var/new_message = stripped_input(user, "Choose the message visible on the mood effect.", "Message", message, MAX_NAME_LEN) + if(!new_message) + return + message = new_message + +/datum/nanite_program/good_mood/get_extra_setting(setting) + if(setting == "Mood Message") + return message + +/datum/nanite_program/good_mood/copy_extra_settings_to(datum/nanite_program/good_mood/target) + target.message = message + +/datum/nanite_program/good_mood/enable_passive_effect() + . = ..() + SEND_SIGNAL(host_mob, COMSIG_ADD_MOOD_EVENT, "nanite_happy", /datum/mood_event/nanite_happiness, message) + +/datum/nanite_program/good_mood/disable_passive_effect() + . = ..() + SEND_SIGNAL(host_mob, COMSIG_CLEAR_MOOD_EVENT, "nanite_happy") + +/datum/nanite_program/bad_mood + name = "Happiness Suppressor" + desc = "The nanites suppress the production of serotonin inside the host's brain, creating an artificial state of depression." + use_rate = 0.1 + rogue_types = list(/datum/nanite_program/brain_decay) + extra_settings = list("Mood Message") + var/message = "HAPPINESS SUPPRESSION" + +/datum/nanite_program/bad_mood/set_extra_setting(user, setting) + if(setting == "Mood Message") + var/new_message = stripped_input(user, "Choose the message visible on the mood effect.", "Message", message, MAX_NAME_LEN) + if(!new_message) + return + message = new_message + +/datum/nanite_program/bad_mood/get_extra_setting(setting) + if(setting == "Mood Message") + return message + +/datum/nanite_program/bad_mood/copy_extra_settings_to(datum/nanite_program/bad_mood/target) + target.message = message + +/datum/nanite_program/bad_mood/enable_passive_effect() + . = ..() + SEND_SIGNAL(host_mob, COMSIG_ADD_MOOD_EVENT, "nanite_sadness", /datum/mood_event/nanite_sadness, message) + +/datum/nanite_program/bad_mood/disable_passive_effect() + . = ..() + SEND_SIGNAL(host_mob, COMSIG_CLEAR_MOOD_EVENT, "nanite_sadness") diff --git a/code/modules/research/nanites/nanite_programs/utility.dm b/code/modules/research/nanites/nanite_programs/utility.dm index 3db482d989..46f5de168f 100644 --- a/code/modules/research/nanites/nanite_programs/utility.dm +++ b/code/modules/research/nanites/nanite_programs/utility.dm @@ -6,6 +6,7 @@ rogue_types = list(/datum/nanite_program/toxic) extra_settings = list("Program Overwrite","Cloud Overwrite") + var/pulse_cooldown = 0 var/sync_programs = TRUE var/sync_overwrite = FALSE var/overwrite_cloud = FALSE @@ -67,12 +68,16 @@ target.sync_overwrite = sync_overwrite /datum/nanite_program/viral/active_effect() + if(world.time < pulse_cooldown) + return for(var/mob/M in orange(host_mob, 5)) - if(prob(5)) - if(sync_programs) - SEND_SIGNAL(M, COMSIG_NANITE_SYNC, nanites, sync_overwrite) - if(overwrite_cloud) - SEND_SIGNAL(M, COMSIG_NANITE_SET_CLOUD, set_cloud) + if(SEND_SIGNAL(M, COMSIG_NANITE_IS_STEALTHY)) + continue + if(sync_programs) + SEND_SIGNAL(M, COMSIG_NANITE_SYNC, nanites, sync_overwrite) + if(overwrite_cloud) + SEND_SIGNAL(M, COMSIG_NANITE_SET_CLOUD, set_cloud) + pulse_cooldown = world.time + 75 /datum/nanite_program/monitoring name = "Monitoring" @@ -197,6 +202,15 @@ return SEND_SIGNAL(host_mob, COMSIG_NANITE_SIGNAL, code, source) +/datum/nanite_program/relay/proc/relay_comm_signal(comm_code, relay_code, comm_message) + if(!activated) + return + if(!host_mob) + return + if(relay_code != relay_channel) + return + SEND_SIGNAL(host_mob, COMSIG_NANITE_COMM_SIGNAL, comm_code, comm_message) + /datum/nanite_program/metabolic_synthesis name = "Metabolic Synthesis" desc = "The nanites use the metabolic cycle of the host to speed up their replication rate, using their extra nutrition as fuel." @@ -248,26 +262,27 @@ resulting in an extremely infective strain of nanites." use_rate = 1.50 rogue_types = list(/datum/nanite_program/aggressive_replication, /datum/nanite_program/necrotic) + var/spread_cooldown = 0 /datum/nanite_program/spreading/active_effect() - if(prob(10)) - var/list/mob/living/target_hosts = list() - var/turf/T = get_turf(host_mob) - for(var/mob/living/L in range(5, host_mob)) - if(!(MOB_ORGANIC in L.mob_biotypes) && !(MOB_UNDEAD in L.mob_biotypes)) - continue - if(!disease_air_spread_walk(T, get_turf(L))) - continue - target_hosts += L - target_hosts -= host_mob - if(!target_hosts.len) - return - var/mob/living/infectee = pick(target_hosts) - if(prob(100 - (infectee.get_permeability_protection() * 100))) - //this will potentially take over existing nanites! - infectee.AddComponent(/datum/component/nanites, 10) - SEND_SIGNAL(infectee, COMSIG_NANITE_SYNC, nanites) - infectee.investigate_log("[key_name(infectee)] was infected by spreading nanites by [key_name(host_mob)]", INVESTIGATE_NANITES) + if(spread_cooldown < world.time) + return + spread_cooldown = world.time + 50 + var/list/mob/living/target_hosts = list() + for(var/mob/living/L in oview(5, host_mob)) + if(!prob(25)) + continue + if(!(L.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD))) + continue + target_hosts += L + if(!target_hosts.len) + return + var/mob/living/infectee = pick(target_hosts) + if(prob(100 - (infectee.get_permeability_protection() * 100))) + //this will potentially take over existing nanites! + infectee.AddComponent(/datum/component/nanites, 10) + SEND_SIGNAL(infectee, COMSIG_NANITE_SYNC, nanites) + infectee.investigate_log("was infected by spreading nanites by [key_name(host_mob)] at [AREACOORD(infectee)].", INVESTIGATE_NANITES) /datum/nanite_program/mitosis name = "Mitosis" diff --git a/code/modules/research/nanites/nanite_programs/weapon.dm b/code/modules/research/nanites/nanite_programs/weapon.dm index 4f29398e91..f634b2088c 100644 --- a/code/modules/research/nanites/nanite_programs/weapon.dm +++ b/code/modules/research/nanites/nanite_programs/weapon.dm @@ -160,40 +160,55 @@ /datum/nanite_program/cryo/active_effect() host_mob.adjust_bodytemperature(-rand(15,25), 50) -/datum/nanite_program/mind_control +/datum/nanite_program/triggered/comm/mind_control name = "Mind Control" - desc = "The nanites imprint an absolute directive onto the host's brain while they're active." - use_rate = 3 + desc = "The nanites imprint an absolute directive onto the host's brain for one minute when triggered." + trigger_cost = 30 + trigger_cooldown = 1800 rogue_types = list(/datum/nanite_program/brain_decay, /datum/nanite_program/brain_misfire) - extra_settings = list("Directive") - var/cooldown = 0 //avoids spam when nanites are running low + extra_settings = list("Directive","Comm Code") var/directive = "..." -/datum/nanite_program/mind_control/set_extra_setting(user, setting) +/datum/nanite_program/triggered/comm/mind_control/set_extra_setting(user, setting) if(setting == "Directive") var/new_directive = stripped_input(user, "Choose the directive to imprint with mind control.", "Directive", directive, MAX_MESSAGE_LEN) if(!new_directive) return directive = new_directive + if(setting == "Comm Code") + var/new_code = input(user, "Set the communication code (1-9999) or set to 0 to disable external signals.", name, null) as null|num + if(isnull(new_code)) + return + comm_code = CLAMP(round(new_code, 1), 0, 9999) -/datum/nanite_program/mind_control/get_extra_setting(setting) +/datum/nanite_program/triggered/comm/mind_control/get_extra_setting(setting) if(setting == "Directive") return directive + if(setting == "Comm Code") + return comm_code -/datum/nanite_program/mind_control/copy_extra_settings_to(datum/nanite_program/mind_control/target) +/datum/nanite_program/triggered/comm/mind_control/copy_extra_settings_to(datum/nanite_program/triggered/comm/mind_control/target) target.directive = directive + target.comm_code = comm_code -/datum/nanite_program/mind_control/enable_passive_effect() - if(world.time < cooldown) +/datum/nanite_program/triggered/comm/mind_control/trigger(comm_message) + if(!..()) return - . = ..() - brainwash(host_mob, directive) + if(host_mob.stat == DEAD) + return + var/sent_directive = comm_message + if(!comm_message) + sent_directive = directive + brainwash(host_mob, sent_directive) log_game("A mind control nanite program brainwashed [key_name(host_mob)] with the objective '[directive]'.") + addtimer(CALLBACK(src, .proc/end_brainwashing), 600) -/datum/nanite_program/mind_control/disable_passive_effect() - . = ..() +/datum/nanite_program/triggered/comm/mind_control/proc/end_brainwashing() if(host_mob.mind && host_mob.mind.has_antag_datum(/datum/antagonist/brainwashed)) host_mob.mind.remove_antag_datum(/datum/antagonist/brainwashed) log_game("[key_name(host_mob)] is no longer brainwashed by nanites.") - cooldown = world.time + 450 + +/datum/nanite_program/triggered/comm/mind_control/disable_passive_effect() + . = ..() + end_brainwashing() diff --git a/code/modules/research/nanites/nanite_remote.dm b/code/modules/research/nanites/nanite_remote.dm index a7c8533521..e10d8f8c4b 100644 --- a/code/modules/research/nanites/nanite_remote.dm +++ b/code/modules/research/nanites/nanite_remote.dm @@ -168,6 +168,109 @@ . = TRUE +/obj/item/nanite_remote/comm + name = "nanite communication remote" + desc = "A device that can send text messages to specific programs." + icon_state = "nanite_comm_remote" + var/comm_code = 0 + var/comm_message = "" + +/obj/item/nanite_remote/comm/afterattack(atom/target, mob/user, etc) + switch(mode) + if(REMOTE_MODE_OFF) + return + if(REMOTE_MODE_SELF) + to_chat(user, "You activate [src], signaling the nanites in your bloodstream.") + signal_mob(user, comm_code, comm_message) + if(REMOTE_MODE_TARGET) + if(isliving(target) && (get_dist(target, get_turf(src)) <= 7)) + to_chat(user, "You activate [src], signaling the nanites inside [target].") + signal_mob(target, code, comm_message, key_name(user)) + if(REMOTE_MODE_AOE) + to_chat(user, "You activate [src], signaling the nanites inside every host around you.") + for(var/mob/living/L in view(user, 7)) + signal_mob(L, code, comm_message, key_name(user)) + if(REMOTE_MODE_RELAY) + to_chat(user, "You activate [src], signaling all connected relay nanites.") + signal_relay(code, relay_code, comm_message, key_name(user)) + +/obj/item/nanite_remote/comm/signal_mob(mob/living/M, code, source) + SEND_SIGNAL(M, COMSIG_NANITE_COMM_SIGNAL, comm_code, comm_message) + +/obj/item/nanite_remote/comm/signal_relay(code, relay_code, source) + for(var/X in SSnanites.nanite_relays) + var/datum/nanite_program/relay/N = X + N.relay_comm_signal(comm_code, relay_code, comm_message) + +/obj/item/nanite_remote/comm/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state) + SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "nanite_comm_remote", name, 420, 800, master_ui, state) + ui.open() + +/obj/item/nanite_remote/comm/ui_data() + var/list/data = list() + data["comm_code"] = comm_code + data["relay_code"] = relay_code + data["comm_message"] = comm_message + data["mode"] = mode + data["locked"] = locked + data["saved_settings"] = saved_settings + + return data + +/obj/item/nanite_remote/comm/ui_act(action, params) + if(..()) + return + switch(action) + if("set_comm_code") + if(locked) + return + var/new_code = input("Set comm code (0000-9999):", name, code) as null|num + if(!isnull(new_code)) + new_code = CLAMP(round(new_code, 1),0,9999) + comm_code = new_code + . = TRUE + if("set_message") + if(locked) + return + var/new_message = stripped_input(usr, "Set the message (Max 300 characters):", "Set Message", null , 300) + if(!new_message) + return + comm_message = new_message + . = TRUE + if("comm_save") + if(locked) + return + var/code_name = stripped_input(usr, "Set the setting name", "Set Name", null , 15) + if(!code_name) + return + var/new_save = list() + new_save["id"] = last_id + 1 + last_id++ + new_save["name"] = code_name + new_save["code"] = comm_code + new_save["mode"] = mode + new_save["relay_code"] = relay_code + new_save["message"] = comm_message + + saved_settings += list(new_save) + . = TRUE + if("comm_load") + var/code_id = params["save_id"] + var/list/setting + for(var/list/X in saved_settings) + if(X["id"] == text2num(code_id)) + setting = X + break + if(setting) + comm_code = setting["code"] + mode = setting["mode"] + relay_code = setting["relay_code"] + comm_message = setting["message"] + . = TRUE + + #undef REMOTE_MODE_OFF #undef REMOTE_MODE_SELF #undef REMOTE_MODE_TARGET diff --git a/code/modules/research/nanites/program_disks.dm b/code/modules/research/nanites/program_disks.dm index f780f40932..6444ebc025 100644 --- a/code/modules/research/nanites/program_disks.dm +++ b/code/modules/research/nanites/program_disks.dm @@ -142,4 +142,10 @@ program_type = /datum/nanite_program/researchplus /obj/item/disk/nanite_program/reduced_diagnostics - program_type = /datum/nanite_program/reduced_diagnostics \ No newline at end of file + program_type = /datum/nanite_program/reduced_diagnostics + +/obj/item/disk/nanite_program/good_mood + program_type = /datum/nanite_program/good_mood + +/obj/item/disk/nanite_program/bad_mood + program_type = /datum/nanite_program/bad_mood diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 178921dacd..74f07e4ce3 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -976,7 +976,7 @@ display_name = "Basic Nanite Programming" description = "The basics of nanite construction and programming." prereq_ids = list("datatheory","robotics") - design_ids = list("nanite_disk","nanite_remote","nanite_scanner",\ + design_ids = list("nanite_disk","nanite_remote","nanite_comm_remote","nanite_scanner",\ "nanite_chamber","public_nanite_chamber","nanite_chamber_control","nanite_programmer","nanite_program_hub","nanite_cloud_control",\ "relay_nanites", "monitoring_nanites", "access_nanites", "repairing_nanites","sensor_nanite_volume", "repeater_nanites", "relay_repeater_nanites","red_diag_nanites") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) @@ -1015,7 +1015,7 @@ display_name = "Neural Nanite Programming" description = "Nanite programs affecting nerves and brain matter." prereq_ids = list("nanite_bio") - design_ids = list("nervous_nanites", "brainheal_nanites", "paralyzing_nanites", "stun_nanites", "selfscan_nanites") + design_ids = list("nervous_nanites", "brainheal_nanites", "paralyzing_nanites", "stun_nanites", "selfscan_nanites","good_mood_nanites","bad_mood_nanites") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 diff --git a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm index 5425ddbdc4..2401fc63a0 100644 --- a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm +++ b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm @@ -1,26 +1,31 @@ #define ASH_WALKER_SPAWN_THRESHOLD 2 //The ash walker den consumes corpses or unconscious mobs to create ash walker eggs. For more info on those, check ghost_role_spawners.dm -/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker +/obj/structure/lavaland/ash_walker name = "necropolis tendril nest" desc = "A vile tendril of corruption. It's surrounded by a nest of rapidly growing eggs..." + icon = 'icons/mob/nest.dmi' icon_state = "ash_walker_nest" - icon_living = "ash_walker_nest" - icon_dead = "ash_walker_nest" - faction = list("ashwalker") - health = 200 - maxHealth = 200 - loot = list(/obj/effect/collapse) + move_resist=INFINITY // just killing it tears a massive hole in the ground, let's not move it + anchored = TRUE + density = TRUE + resistance_flags = FIRE_PROOF | LAVA_PROOF + max_integrity = 200 + var/faction = list("ashwalker") var/meat_counter = 6 -/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker/death() +/obj/structure/lavaland/ash_walker/Initialize() + .=..() + START_PROCESSING(SSprocessing, src) + +/obj/structure/lavaland/ash_walker/deconstruct(disassembled) new /obj/item/assembly/signaler/anomaly (get_step(loc, pick(GLOB.alldirs))) - return ..() + new /obj/effect/collapse(loc) -/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker/Life() +/obj/structure/lavaland/ash_walker/process() consume() - return ..() + spawn_mob() -/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker/proc/consume() +/obj/structure/lavaland/ash_walker/proc/consume() for(var/mob/living/H in view(src, 1)) //Only for corpse right next to/on same tile if(H.stat) visible_message("Serrated tendrils eagerly pull [H] to [src], tearing the body apart as its blood seeps over the eggs.") @@ -33,9 +38,9 @@ else meat_counter++ H.gib() - adjustHealth(-maxHealth * 0.05)//restores 5% hp of tendril + obj_integrity = min(obj_integrity + max_integrity*0.05,max_integrity)//restores 5% hp of tendril -/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker/spawn_mob() +/obj/structure/lavaland/ash_walker/proc/spawn_mob() if(meat_counter >= ASH_WALKER_SPAWN_THRESHOLD) new /obj/effect/mob_spawn/human/ash_walker(get_step(loc, pick(GLOB.alldirs))) visible_message("One of the eggs swells to an unnatural size and tumbles free. It's ready to hatch!") diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index f64b5e4d01..dc721506a5 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -172,6 +172,15 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) var/turf/T = locate(_x, _y, _z) A.forceMove(T) +/obj/item/hilbertshotel/ghostdojo + name = "Infinite Dormitories" + anchored = TRUE + interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND + +/obj/item/hilbertshotel/ghostdojo/interact(mob/user) + . = ..() + promptAndCheckIn(user) + //Template Stuff /datum/map_template/hilbertshotel name = "Hilbert's Hotel Room" diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 121ee2e07f..beaaa51adb 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -131,7 +131,7 @@ All ShuttleMove procs go here var/range = throw_force * 10 range = CEILING(rand(range-(range*0.1), range+(range*0.1)), 10)/10 var/speed = range/5 - throw_at(target, range, speed) + safe_throw_at(target, range, speed) ///////////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/spells/spell_types/conjure.dm b/code/modules/spells/spell_types/conjure.dm index a04a86b928..8336c06edb 100644 --- a/code/modules/spells/spell_types/conjure.dm +++ b/code/modules/spells/spell_types/conjure.dm @@ -63,7 +63,7 @@ clothes_req = FALSE charge_max = 600 cooldown_min = 200 - summon_type = list(/mob/living/simple_animal/hostile/spawner/nether) + summon_type = list(/obj/structure/spawner/nether) summon_amt = 1 range = 1 cast_sound = 'sound/weapons/marauder.ogg' diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm index 9d1274edef..a9d5f21abc 100644 --- a/code/modules/spells/spell_types/ethereal_jaunt.dm +++ b/code/modules/spells/spell_types/ethereal_jaunt.dm @@ -99,5 +99,6 @@ /obj/effect/dummy/phased_mob/spell_jaunt/ex_act(blah) return + /obj/effect/dummy/phased_mob/spell_jaunt/bullet_act(blah) - return \ No newline at end of file + return BULLET_ACT_FORCE_PIERCE \ No newline at end of file diff --git a/code/modules/spells/spell_types/shadow_walk.dm b/code/modules/spells/spell_types/shadow_walk.dm index 8dbb6d6532..b32c8c16c6 100644 --- a/code/modules/spells/spell_types/shadow_walk.dm +++ b/code/modules/spells/spell_types/shadow_walk.dm @@ -91,7 +91,7 @@ return /obj/effect/dummy/phased_mob/shadow/bullet_act() - return + return BULLET_ACT_FORCE_PIERCE /obj/effect/dummy/phased_mob/shadow/singularity_act() return diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm index 262f656967..a2d7612681 100644 --- a/code/modules/spells/spell_types/wizard.dm +++ b/code/modules/spells/spell_types/wizard.dm @@ -363,7 +363,7 @@ icon_state = "snappop" w_class = WEIGHT_CLASS_TINY -/obj/item/spellpacket/lightningbolt/throw_impact(atom/hit_atom) +/obj/item/spellpacket/lightningbolt/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) if(isliving(hit_atom)) var/mob/living/M = hit_atom diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 63a392bf06..e2c77fa177 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -29,6 +29,7 @@ var/burn_dam = 0 var/stamina_dam = 0 var/max_stamina_damage = 0 + var/incoming_stam_mult = 1 //Multiplier for incoming staminaloss, decreases when taking staminaloss when the limb is disabled, resets back to 1 when limb is no longer disabled. var/max_damage = 0 var/stam_heal_tick = 0 //per Life(). Defaults to 0 due to citadel changes @@ -115,7 +116,7 @@ else return ..() -/obj/item/bodypart/throw_impact(atom/hit_atom) +/obj/item/bodypart/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() if(status != BODYPART_ROBOTIC) playsound(get_turf(src), 'sound/misc/splort.ogg', 50, 1, -1) @@ -141,7 +142,7 @@ //Return TRUE to get whatever mob this is in to update health. /obj/item/bodypart/proc/on_life() if(stam_heal_tick && stamina_dam > DAMAGE_PRECISION) //DO NOT update health here, it'll be done in the carbon's life. - if(heal_damage(brute = 0, burn = 0, stamina = stam_heal_tick, only_robotic = FALSE, only_organic = FALSE, updating_health = FALSE)) + if(heal_damage(brute = 0, burn = 0, stamina = (stam_heal_tick * (disabled ? 2 : 1)), only_robotic = FALSE, only_organic = FALSE, updating_health = FALSE)) . |= BODYPART_LIFE_UPDATE_HEALTH //Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all. @@ -153,7 +154,7 @@ var/dmg_mlt = CONFIG_GET(number/damage_multiplier) brute = round(max(brute * dmg_mlt, 0),DAMAGE_PRECISION) burn = round(max(burn * dmg_mlt, 0),DAMAGE_PRECISION) - stamina = round(max(stamina * dmg_mlt, 0),DAMAGE_PRECISION) + stamina = round(max((stamina * dmg_mlt) * incoming_stam_mult, 0),DAMAGE_PRECISION) brute = max(0, brute - brute_reduction) burn = max(0, burn - burn_reduction) //No stamina scaling.. for now.. @@ -183,6 +184,9 @@ var/available_damage = max_damage - current_damage stamina_dam += round(CLAMP(stamina, 0, min(max_stamina_damage - stamina_dam, available_damage)), DAMAGE_PRECISION) + if(disabled && stamina > 10) + incoming_stam_mult = max(0.01, incoming_stam_mult/(stamina*0.1)) + if(owner && updating_health) owner.updatehealth() if(stamina > DAMAGE_PRECISION) @@ -252,6 +256,8 @@ owner.update_health_hud() //update the healthdoll owner.update_body() owner.update_canmove() + if(!disabled) + incoming_stam_mult = 1 return TRUE //Updates an organ's brute/burn states for use by update_damage_overlays() @@ -645,7 +651,7 @@ held_index = 1 px_x = -6 px_y = 0 - stam_heal_tick = 2 + stam_heal_tick = 4 /obj/item/bodypart/l_arm/is_disabled() if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_ARM)) @@ -705,7 +711,7 @@ held_index = 2 px_x = 6 px_y = 0 - stam_heal_tick = 2 + stam_heal_tick = 4 max_stamina_damage = 50 /obj/item/bodypart/r_arm/is_disabled() @@ -765,7 +771,7 @@ body_damage_coeff = 0.75 px_x = -2 px_y = 12 - stam_heal_tick = 2 + stam_heal_tick = 4 max_stamina_damage = 50 var/blood_state = BLOOD_STATE_NOT_BLOODY var/list/bloody_legs = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) @@ -826,7 +832,7 @@ px_x = 2 px_y = 12 max_stamina_damage = 50 - stam_heal_tick = 2 + stam_heal_tick = 4 var/blood_state = BLOOD_STATE_NOT_BLOODY var/list/bloody_legs = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 161461d099..6dc1d1b6ce 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -578,7 +578,8 @@ cooldown = COOLDOWN_MEME for(var/V in listeners) var/mob/living/carbon/human/H = V - if(H.canbearoused && H.has_dna() && HAS_TRAIT(H, TRAIT_NYMPHO)) // probably a redundant check but for good measure + + if(H.client && H.client.prefs && H.client.prefs.cit_toggles & HYPNO) // probably a redundant check but for good measure H.mob_climax(forced_climax=TRUE) //DAB @@ -807,7 +808,7 @@ E.enthrallTally += (power_multiplier*(((length(message))/200) + 1)) //encourage players to say more than one word. else E.enthrallTally += power_multiplier*1.25 //thinking about it, I don't know how this can proc - if(L.canbearoused && E.lewd) + if(E.lewd) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] is so nice to listen to."), 5) E.cooldown += 1 @@ -821,8 +822,6 @@ continue if (E.lewd) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] has praised me!!"), 5) - if(HAS_TRAIT(L, TRAIT_NYMPHO)) - L.adjustArousalLoss(2*power_multiplier) if(HAS_TRAIT(L, TRAIT_MASO)) E.enthrallTally -= power_multiplier E.resistanceTally += power_multiplier @@ -845,7 +844,9 @@ continue if (E.lewd) if(HAS_TRAIT(L, TRAIT_MASO)) - L.adjustArousalLoss(3*power_multiplier) + if(ishuman(L)) + var/mob/living/carbon/human/H = L + H.adjust_arousal(3*power_multiplier,maso = TRUE) descmessage += "And yet, it feels so good..!" //I don't really understand masco, is this the right sort of thing they like? E.enthrallTally += power_multiplier E.resistanceTally -= power_multiplier @@ -1001,16 +1002,6 @@ if(160 to INFINITY) speaktrigger += "I feel like I'm on the brink of losing my mind, " - //horny - if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && E.lewd) - switch(H.getArousalLoss()) - if(40 to 60) - speaktrigger += "I'm feeling a little horny, " - if(60 to 80) - speaktrigger += "I'm feeling horny, " - if(80 to INFINITY) - speaktrigger += "I'm really, really horny, " - //collar if(istype(H.wear_neck, /obj/item/clothing/neck/petcollar) && E.lewd) speaktrigger += "I love the collar you gave me, " @@ -1111,11 +1102,10 @@ var/mob/living/carbon/human/H = V var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase > 1) - if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && E.lewd) // probably a redundant check but for good measure + if(E.lewd) // probably a redundant check but for good measure addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Your [E.enthrallGender] pushes you over the limit, overwhelming your body with pleasure."), 5) H.mob_climax(forced_climax=TRUE) H.SetStun(20) - H.setArousalLoss(H.min_arousal) E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). E.enthrallTally += power_multiplier E.cooldown += 6 diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index c23662de5a..c739d426c2 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -2,6 +2,7 @@ //Keep this sorted alphabetically #ifdef UNIT_TESTS +#include "anchored_mobs.dm" #include "component_tests.dm" #include "reagent_id_typos.dm" #include "reagent_recipe_collisions.dm" diff --git a/code/modules/unit_tests/anchored_mobs.dm b/code/modules/unit_tests/anchored_mobs.dm new file mode 100644 index 0000000000..5324179bb7 --- /dev/null +++ b/code/modules/unit_tests/anchored_mobs.dm @@ -0,0 +1,9 @@ +/datum/unit_test/anchored_mobs/Run() + var/list/L = list() + for(var/i in typesof(/mob)) + var/mob/M = i + if(initial(M.anchored)) + L += "[i]" + if(!L.len) + return //passed! + Fail("The following mobs are defined as anchored. This is incompatible with the new move force/resist system and needs to be revised.: [L.Join(" ")]") \ No newline at end of file diff --git a/code/modules/uplink/uplink_items/uplink_clothing.dm b/code/modules/uplink/uplink_items/uplink_clothing.dm index 2881aa8dfd..3a3c53288a 100644 --- a/code/modules/uplink/uplink_items/uplink_clothing.dm +++ b/code/modules/uplink/uplink_items/uplink_clothing.dm @@ -23,21 +23,21 @@ /datum/uplink_item/suits/padding name = "Soft Padding" - desc = "Padding to add to a jumpsuit to help against melee and bullets." + desc = "An inconspicious soft padding meant to be worn underneath jumpsuits, will cushion the user from melee harm." item = /obj/item/clothing/accessory/padding cost = 2 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) /datum/uplink_item/suits/kevlar - name = "Kevlar sheets" - desc = "Kevlar sheets to add to jumpsuit to help against bullets and melee." + name = "Kevlar Padding" + desc = "An inconspicious kevlar padding meant to be worn underneath jumpsuits, will cushion the wearer from ballistic harm." item = /obj/item/clothing/accessory/kevlar cost = 2 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) /datum/uplink_item/suits/plastic - name = "Plastic sheet" - desc = "Plastic body sheet to add to a jumpsuit to help against laser and energy harm." + name = "Ablative Padding" + desc = "An inconspicious ablative padding meant to be worn underneath jumpsuits, will cushion the wearer from energy lasers harm." item = /obj/item/clothing/accessory/plastics cost = 2 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) diff --git a/code/modules/vore/eating/voreitems.dm b/code/modules/vore/eating/voreitems.dm index 05ab1e5f8b..4e6bdaa1e0 100644 --- a/code/modules/vore/eating/voreitems.dm +++ b/code/modules/vore/eating/voreitems.dm @@ -21,6 +21,7 @@ range = 2 /obj/item/projectile/sickshot/on_hit(var/atom/movable/target, var/blocked = 0) + . = ..() if(iscarbon(target)) var/mob/living/carbon/H = target if(prob(5)) @@ -28,7 +29,7 @@ H.release_vore_contents() H.visible_message("[H] contracts strangely, spewing out contents on the floor!", \ "You spew out everything inside you on the floor!") - return + return BULLET_ACT_HIT ////////////////////////// Anti-Noms Drugs ////////////////////////// diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm index 8295f32cfa..156b220df3 100644 --- a/code/modules/vore/resizing/sizegun_vr.dm +++ b/code/modules/vore/resizing/sizegun_vr.dm @@ -42,7 +42,8 @@ impact_type = /obj/effect/projectile/xray/impact /obj/item/projectile/beam/shrinklaser/on_hit(var/atom/target, var/blocked = 0) - if(istype(target, /mob/living)) + . = ..() + if(isliving(target)) var/mob/living/M = target switch(M.size_multiplier) if(SIZESCALE_HUGE to INFINITY) @@ -54,7 +55,7 @@ if((0 - INFINITY) to SIZESCALE_NORMAL) M.sizescale(SIZESCALE_TINY) M.update_transform() - return 1 + return BULLET_ACT_HIT /obj/item/projectile/beam/growlaser name = "growth beam" @@ -68,7 +69,8 @@ impact_type = /obj/effect/projectile/laser_blue/impact /obj/item/projectile/beam/growlaser/on_hit(var/atom/target, var/blocked = 0) - if(istype(target, /mob/living)) + . = ..() + if(isliving(target)) var/mob/living/M = target switch(M.size_multiplier) if(SIZESCALE_BIG to SIZESCALE_HUGE) @@ -80,7 +82,7 @@ if((0 - INFINITY) to SIZESCALE_TINY) M.sizescale(SIZESCALE_SMALL) M.update_transform() - return 1 + return BULLET_ACT_HIT */ datum/design/sizeray @@ -108,7 +110,8 @@ datum/design/sizeray icon_state="laser" /obj/item/projectile/sizeray/shrinkray/on_hit(var/atom/target, var/blocked = 0) - if(istype(target, /mob/living)) + . = ..() + if(isliving(target)) var/mob/living/M = target switch(M.size_multiplier) if(SIZESCALE_HUGE to INFINITY) @@ -120,10 +123,11 @@ datum/design/sizeray if((0 - INFINITY) to SIZESCALE_NORMAL) M.sizescale(SIZESCALE_TINY) M.update_transform() - return 1 + return BULLET_ACT_ /obj/item/projectile/sizeray/growthray/on_hit(var/atom/target, var/blocked = 0) - if(istype(target, /mob/living)) + . = ..() + if(isliving(target)) var/mob/living/M = target switch(M.size_multiplier) if(SIZESCALE_BIG to SIZESCALE_HUGE) @@ -135,7 +139,7 @@ datum/design/sizeray if((0 - INFINITY) to SIZESCALE_TINY) M.sizescale(SIZESCALE_SMALL) M.update_transform() - return 1 + return BULLET_ACT_HIT /obj/item/ammo_casing/energy/laser/growthray projectile_type = /obj/item/projectile/sizeray/growthray diff --git a/config/config.txt b/config/config.txt index fafb3e5791..a89827809f 100644 --- a/config/config.txt +++ b/config/config.txt @@ -110,6 +110,9 @@ LOG_GAME ## log player votes LOG_VOTE +## log player crafting +LOG_CRAFT + ## log client Whisper LOG_WHISPER diff --git a/config/game_options.txt b/config/game_options.txt index b8b89de17c..9fc50fcd0f 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -597,3 +597,6 @@ MODETIER_VOTING ## Number of modes dropped by the modetier vote during mode selection, after vote. DROPPED_MODES 3 + +## Whether the suicide verb is allowed. +# SUICIDE_ALLOWED diff --git a/html/changelogs/AutoChangeLog-pr-10097.yml b/html/changelogs/AutoChangeLog-pr-10097.yml new file mode 100644 index 0000000000..9b9a2c9a58 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10097.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - tweak: "Attached kevlar/soft/plastic padding accessories are now stealthier and will no longer be displayed on mob examine." diff --git a/html/changelogs/AutoChangeLog-pr-10125.yml b/html/changelogs/AutoChangeLog-pr-10125.yml new file mode 100644 index 0000000000..951b69ccb3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10125.yml @@ -0,0 +1,5 @@ +author: "Kevinz000" +delete-after: True +changes: + - bugfix: "Fixes successful projectile hits also striking another atom on the same turf should the first one be not the target the projectile was meant for." + - rscdel: "Removes infinite reflector loops." diff --git a/html/changelogs/AutoChangeLog-pr-10307.yml b/html/changelogs/AutoChangeLog-pr-10307.yml new file mode 100644 index 0000000000..279dbe2840 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10307.yml @@ -0,0 +1,4 @@ +author: "Seris02" +delete-after: True +changes: + - rscadd: "stunglasses" diff --git a/html/changelogs/AutoChangeLog-pr-10346.yml b/html/changelogs/AutoChangeLog-pr-10346.yml new file mode 100644 index 0000000000..3a0cd6dae4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10346.yml @@ -0,0 +1,6 @@ +author: "Bhijn" +delete-after: True +changes: + - rscadd: "Limbs now regenerate their stamina faster while disabled" + - rscadd: "Limbs now have the same incoming stamina damage multiplier mechanics as spacemen, where the more staminaloss they take while disabled, the less staminaloss they'll take." + - balance: "Limbs have had their base stamina regen rate doubled to match the doubled stamina regen rate of standard spacemen." diff --git a/html/changelogs/AutoChangeLog-pr-10347.yml b/html/changelogs/AutoChangeLog-pr-10347.yml new file mode 100644 index 0000000000..c0508aa279 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10347.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - balance: "The stamina buffer no longer uses stamina while recharging." diff --git a/html/changelogs/AutoChangeLog-pr-10375.yml b/html/changelogs/AutoChangeLog-pr-10375.yml new file mode 100644 index 0000000000..7d0cc2bf44 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10375.yml @@ -0,0 +1,5 @@ +author: "r4d6" +delete-after: True +changes: + - rscadd: "Added a Radiation Hardsuit" + - rscadd: "Added a Radiation Hardsuit crate" diff --git a/html/changelogs/AutoChangeLog-pr-10456.yml b/html/changelogs/AutoChangeLog-pr-10456.yml new file mode 100644 index 0000000000..4c94455e47 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10456.yml @@ -0,0 +1,12 @@ +author: "Putnam" +delete-after: True +changes: + - rscdel: "Arousal damage is gone, and with it the arousal damage heart on the UI." + - rscdel: "As exhibitionist relied on arousal damage, that's gone too." + - rscdel: "Bonermeter and electronic stimulation circuit modules are gone." + - rscdel: "Masturbation is no longer an option in the climax menu. It was identical to climax alone in every way but text. Emote it out." + - rscadd: "Arousal on genitals can now be displayed manually, on a case-by-case basis." + - rscadd: "\"Climax alone\" and \"climax with partner\" now only display to the people directly involved in the interaction. +rework: Catnip tea, catnip, crocin, hexacrocin, camphor, hexacamphor all had functions or bits of functions reworked." + - tweak: "\"Climax with partner\" now requires consent from both parties--it can no longer be used on mindless mobs, and it asks the mob getting climaxed with if they consent first." + - tweak: "A lot of MKUltra behaviors have been moved to hypno checks or removed due to reliance on maso/nympho/exhib." diff --git a/html/changelogs/AutoChangeLog-pr-10481.yml b/html/changelogs/AutoChangeLog-pr-10481.yml new file mode 100644 index 0000000000..c884a45ec9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10481.yml @@ -0,0 +1,5 @@ +author: "dapnee" +delete-after: True +changes: + - imageadd: "new toxin's uniform and accessories" + - imagedel: "old toxin's uniform and accessories" diff --git a/html/changelogs/AutoChangeLog-pr-10501.yml b/html/changelogs/AutoChangeLog-pr-10501.yml new file mode 100644 index 0000000000..27e7ddbb8e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10501.yml @@ -0,0 +1,5 @@ +author: "Putnam" +delete-after: True +changes: + - rscadd: "Two relief valves for atmospherics, available in your RPD today: a unary one that opens to air and a binary one that connects two pipenets, like a manual valve." + - tweak: "The atmos waste outlet injector on box has been replaced with an atmos waste relief valve." diff --git a/html/changelogs/AutoChangeLog-pr-10520.yml b/html/changelogs/AutoChangeLog-pr-10520.yml new file mode 100644 index 0000000000..ae23c082d8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10520.yml @@ -0,0 +1,7 @@ +author: "Denton, ported by Hatterhat" +delete-after: True +changes: + - tweak: "Most upgradeable machines now show their upgrade status when examined while standing right next to them." + - tweak: "Added examine messages to teleporter stations that hint at their multitool/wirecutter interactions." + - tweak: "Renamed teleporter stations from station to teleporter station." + - code_imp: "Changed the teleporter hub accurate var to accuracy; the old name misled people into thinking that it was a boolean." diff --git a/html/changelogs/AutoChangeLog-pr-10547.yml b/html/changelogs/AutoChangeLog-pr-10547.yml new file mode 100644 index 0000000000..41d255e991 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10547.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - tweak: "Ghost dojo spawns will dust if their owner suicides or uses the \"ghost\" verb." diff --git a/html/changelogs/AutoChangeLog-pr-10568.yml b/html/changelogs/AutoChangeLog-pr-10568.yml new file mode 100644 index 0000000000..6916f1289f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10568.yml @@ -0,0 +1,4 @@ +author: "r4d6" +delete-after: True +changes: + - rscadd: "added passive vent to the arsenal of atmospheric devices." diff --git a/html/changelogs/AutoChangeLog-pr-10569.yml b/html/changelogs/AutoChangeLog-pr-10569.yml new file mode 100644 index 0000000000..0b9cb0b992 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10569.yml @@ -0,0 +1,5 @@ +author: "keronshb" +delete-after: True +changes: + - rscadd: "Ports the special nanite remote, mood programs, and research generating nanites" + - balance: "rebalances some nanites" diff --git a/html/changelogs/AutoChangeLog-pr-10570.yml b/html/changelogs/AutoChangeLog-pr-10570.yml new file mode 100644 index 0000000000..9eaf2168a8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10570.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - code_imp: "Mapping helpers added for power cables and atmos pipes." diff --git a/html/changelogs/AutoChangeLog-pr-10571.yml b/html/changelogs/AutoChangeLog-pr-10571.yml new file mode 100644 index 0000000000..1d6844aa53 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10571.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Riot foam dart (not the ammo box) design cost is yet again consistent with the result's material amount." diff --git a/html/changelogs/AutoChangeLog-pr-10578.yml b/html/changelogs/AutoChangeLog-pr-10578.yml new file mode 100644 index 0000000000..a84fa5ba21 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10578.yml @@ -0,0 +1,4 @@ +author: "r4d6" +delete-after: True +changes: + - rscadd: "Mining base now has a common area accessible via a new shuttle on the medium-highpop maps, and a security office connecting the gulag and the mining base. Gulag also has functional atmos." diff --git a/html/changelogs/AutoChangeLog-pr-10579.yml b/html/changelogs/AutoChangeLog-pr-10579.yml new file mode 100644 index 0000000000..c428c0109d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10579.yml @@ -0,0 +1,4 @@ +author: "r4d6" +delete-after: True +changes: + - rscadd: "Added more Cyborg Landmarks" diff --git a/html/changelogs/AutoChangeLog-pr-10580.yml b/html/changelogs/AutoChangeLog-pr-10580.yml new file mode 100644 index 0000000000..6cb625d7af --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10580.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - admin: "Crafting is logged in a file now" diff --git a/html/changelogs/AutoChangeLog-pr-10582.yml b/html/changelogs/AutoChangeLog-pr-10582.yml new file mode 100644 index 0000000000..2024088fb8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10582.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - bugfix: "temporary flavor text now pops up properly" diff --git a/html/changelogs/AutoChangeLog-pr-10584.yml b/html/changelogs/AutoChangeLog-pr-10584.yml new file mode 100644 index 0000000000..e2c9f93ac8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10584.yml @@ -0,0 +1,4 @@ +author: "AffectedArc07" +delete-after: True +changes: + - code_imp: "Line ending CI works now" diff --git a/html/changelogs/AutoChangeLog-pr-10586.yml b/html/changelogs/AutoChangeLog-pr-10586.yml new file mode 100644 index 0000000000..eb90213398 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10586.yml @@ -0,0 +1,4 @@ +author: "Tupinambis" +delete-after: True +changes: + - balance: "RLDs now cost more to use, have reduced matter capacity, and sheets are worth less when refilling them." diff --git a/html/changelogs/AutoChangeLog-pr-10591.yml b/html/changelogs/AutoChangeLog-pr-10591.yml new file mode 100644 index 0000000000..ac8504ec9c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10591.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - rscdel: "Blood duplication is gone, but viruses now react up to 5 times, 1 time per unit, for virus mix." diff --git a/html/changelogs/AutoChangeLog-pr-10597.yml b/html/changelogs/AutoChangeLog-pr-10597.yml new file mode 100644 index 0000000000..9f28c4f84c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10597.yml @@ -0,0 +1,5 @@ +author: "Putnam3145" +delete-after: True +changes: + - code_imp: "demodularized player panel code, mostly" + - admin: "added ghost role eligibility delay removal to player panel" diff --git a/html/changelogs/AutoChangeLog-pr-10599.yml b/html/changelogs/AutoChangeLog-pr-10599.yml new file mode 100644 index 0000000000..33435979c7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10599.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - bugfix: "Gibtonite no longer instantly explodes upon being pickaxe'd." diff --git a/html/changelogs/AutoChangeLog-pr-10600.yml b/html/changelogs/AutoChangeLog-pr-10600.yml new file mode 100644 index 0000000000..ab0c5ac964 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10600.yml @@ -0,0 +1,6 @@ +author: "Kraseo" +delete-after: True +changes: + - bugfix: "Jelly donuts and pink jelly donuts will now properly display sprinkled icon state." + - bugfix: "Jelly donuts and its variants will properly spawn with berry juice." + - bugfix: "Slime jelly donuts have slime jelly in them now. (thanks ghommie)" diff --git a/html/changelogs/AutoChangeLog-pr-10614.yml b/html/changelogs/AutoChangeLog-pr-10614.yml new file mode 100644 index 0000000000..4c4d8bfdbd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10614.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - config: "Added suicide to the config." diff --git a/html/changelogs/AutoChangeLog-pr-9601.yml b/html/changelogs/AutoChangeLog-pr-9601.yml new file mode 100644 index 0000000000..c54279627f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9601.yml @@ -0,0 +1,9 @@ +author: "Ghommie (original PRs by Kevinz000, ShivCalez, 4dplanner, Barhandar, 81Denton, zxaber, Fox-McCloud)" +delete-after: True +changes: + - rscadd: "All atom movables now have move force and move resist, and pull force An atom can only pull another atom if its pull force is stronger than that atom's move resist" + - rscadd: "Mobs with a higher move force than an atom's move resist will automatically try to force the atom out of its way. This might not always work, depending on how snowflakey code is. +experimental: As of right now, everything has a move force and resist of 100, and a pull force of 101. Things take (resist - force) damage when bumped into +experimental: Failing to move onto a tile will now still bump up your last move timer. However, successfully pushing something out of your way will result in you automatically moving into where it was." + - bugfix: "Bolted AIs can no longer be teleported by launchpads." + - balance: "Megafauna cannot teleport" diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi index dec83046b9..e3cc3865b2 100644 Binary files a/icons/effects/mapping_helpers.dmi and b/icons/effects/mapping_helpers.dmi differ diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi index bebfb7c2e0..1a4b8019cd 100644 Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ diff --git a/icons/mob/feet_digi.dmi b/icons/mob/feet_digi.dmi index 028dc67e72..ddc5ff0c5f 100644 Binary files a/icons/mob/feet_digi.dmi and b/icons/mob/feet_digi.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 8e294916f5..24d654b743 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/suit_digi.dmi b/icons/mob/suit_digi.dmi index a9898262a8..e181c65cdb 100644 Binary files a/icons/mob/suit_digi.dmi and b/icons/mob/suit_digi.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 7cc6b8e762..04e2e3cc75 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/mob/uniform_digi.dmi b/icons/mob/uniform_digi.dmi index 5b5c7ceb6e..3b86511013 100644 Binary files a/icons/mob/uniform_digi.dmi and b/icons/mob/uniform_digi.dmi differ diff --git a/icons/obj/atmospherics/components/relief_valve.dmi b/icons/obj/atmospherics/components/relief_valve.dmi index 313081dae1..2ed56f6183 100644 Binary files a/icons/obj/atmospherics/components/relief_valve.dmi and b/icons/obj/atmospherics/components/relief_valve.dmi differ diff --git a/icons/obj/atmospherics/components/unary_devices.dmi b/icons/obj/atmospherics/components/unary_devices.dmi index e18ee92849..3f09e99156 100644 Binary files a/icons/obj/atmospherics/components/unary_devices.dmi and b/icons/obj/atmospherics/components/unary_devices.dmi differ diff --git a/icons/obj/atmospherics/pipes/pipe_item.dmi b/icons/obj/atmospherics/pipes/pipe_item.dmi index b17ecb1a15..c16e4c1bbb 100644 Binary files a/icons/obj/atmospherics/pipes/pipe_item.dmi and b/icons/obj/atmospherics/pipes/pipe_item.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 8e6c6d5758..be091c596d 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 4cb7e02e03..71fceba8b4 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/food/donut.dmi b/icons/obj/food/donut.dmi index fb13ab5dfa..395739eccc 100644 Binary files a/icons/obj/food/donut.dmi and b/icons/obj/food/donut.dmi differ diff --git a/modular_citadel/code/_onclick/hud/stamina.dm b/modular_citadel/code/_onclick/hud/stamina.dm index 184e3add24..0515b9d762 100644 --- a/modular_citadel/code/_onclick/hud/stamina.dm +++ b/modular_citadel/code/_onclick/hud/stamina.dm @@ -11,7 +11,7 @@ /obj/screen/staminas/Click(location,control,params) if(isliving(usr)) var/mob/living/L = usr - to_chat(L, "You have [L.getStaminaLoss()] stamina loss.
Your stamina buffer can take [L.stambuffer] stamina loss, and will use 50% of that stamina loss when recharging.
Your stamina buffer is [(L.stambuffer*(100/L.stambuffer))-(L.bufferedstam*(100/L.stambuffer))]% full.
") + to_chat(L, "You have [L.getStaminaLoss()] stamina loss.
Your stamina buffer can take [L.stambuffer] stamina loss, and recharges at no cost.
Your stamina buffer is [(L.stambuffer*(100/L.stambuffer))-(L.bufferedstam*(100/L.stambuffer))]% full.
") /obj/screen/staminas/update_icon_state() var/mob/living/carbon/user = hud?.mymob diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 4449ca801a..89086ab1e5 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -268,10 +268,6 @@ RegisterSignal(owner, COMSIG_LIVING_RESIST, .proc/owner_resist) //Do resistance calc if resist is pressed# RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/owner_hear) mental_capacity = 500 - M.getOrganLoss(ORGAN_SLOT_BRAIN)//It's their brain! - var/mob/living/carbon/human/H = owner - if(H)//Prefs - if(!H.canbearoused) - H.client?.prefs.cit_toggles &= ~HYPNO lewd = (owner.client?.prefs.cit_toggles & HYPNO) && (master.client?.prefs.cit_toggles & HYPNO) var/message = "[(lewd ? "I am a good pet for [enthrallGender]." : "[master] is a really inspirational person!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall, message) @@ -625,8 +621,6 @@ //Speak (Forces player to talk) if (lowertext(customTriggers[trigger][1]) == "speak")//trigger2 var/saytext = "Your mouth moves on it's own before you can even catch it." - if(HAS_TRAIT(C, TRAIT_NYMPHO)) - saytext += " You find yourself fully believing in the validity of what you just said and don't think to question it." addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "[saytext]"), 5) addtimer(CALLBACK(C, /atom/movable/proc/say, "[customTriggers[trigger][2]]"), 5) log_game("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been forced to say: \"[customTriggers[trigger][2]]\" from previous trigger.") @@ -639,8 +633,9 @@ //Shocking truth! else if (lowertext(customTriggers[trigger]) == "shock") - if (C.canbearoused && lewd) - C.adjustArousalLoss(5) + if (lewd && ishuman(C)) + var/mob/living/carbon/human/H = C + H.adjust_arousal(5) C.jitteriness += 100 C.stuttering += 25 C.Knockdown(60) @@ -649,13 +644,11 @@ //wah intensifies wah-rks else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - if (HAS_TRAIT(C, TRAIT_NYMPHO) && lewd) - if (C.getArousalLoss() > 80) - C.mob_climax(forced_climax=TRUE) - C.SetStun(10)//We got your stun effects in somewhere, Kev. - else - C.adjustArousalLoss(10) - to_chat(C, "You feel a surge of arousal!") + if (lewd) + if(ishuman(C)) + var/mob/living/carbon/human/H = C + H.mob_climax(forced_climax=TRUE) + C.SetStun(10)//We got your stun effects in somewhere, Kev. else C.throw_at(get_step_towards(hearing_args[HEARING_SPEAKER],C), 3, 1) //cut this if it's too hard to get working @@ -734,16 +727,13 @@ if(prob(5)) M.emote("me",1,"squints, shaking their head for a moment.")//shows that you're trying to resist sometimes deltaResist *= 1.5 - //nymphomania - if (M.canbearoused && HAS_TRAIT(M, TRAIT_NYMPHO))//I'm okay with this being removed. - deltaResist*= 0.5-(((2/200)*M.arousalloss)/1)//more aroused you are, the weaker resistance you can give, the less you are, the more you gain. (+/- 0.5) //chemical resistance, brain and annaphros are the key to undoing, but the subject has to to be willing to resist. if (owner.reagents.has_reagent(/datum/reagent/medicine/mannitol)) deltaResist *= 1.25 if (owner.reagents.has_reagent(/datum/reagent/medicine/neurine)) deltaResist *= 1.5 - if (!(owner.client?.prefs.cit_toggles & NO_APHRO) && M.canbearoused && lewd) + if (!(owner.client?.prefs.cit_toggles & NO_APHRO) && lewd) if (owner.reagents.has_reagent(/datum/reagent/drug/anaphrodisiac)) deltaResist *= 1.5 if (owner.reagents.has_reagent(/datum/reagent/drug/anaphrodisiacplus)) diff --git a/modular_citadel/code/modules/admin/admin.dm b/modular_citadel/code/modules/admin/admin.dm deleted file mode 100644 index 529d0c79ec..0000000000 --- a/modular_citadel/code/modules/admin/admin.dm +++ /dev/null @@ -1,39 +0,0 @@ -/client/proc/citaPPoptions(mob/M) // why is this client and not /datum/admins? noone knows, in PP src == client, instead of holder. wtf. - var/body = "
" - if(M.client) - body += "Make mentor | " - body += "Remove mentor" - return body - -/client/proc/cmd_admin_man_up(mob/M in GLOB.mob_list) - set category = "Special Verbs" - set name = "Man Up" - - if(!M) - return - if(!check_rights(R_ADMIN)) - return - - to_chat(M, "Man up, and deal with it.
Move on.") - M.playsound_local(M, 'sound/voice/manup.ogg', 50, FALSE, pressure_affected = FALSE) - - log_admin("Man up: [key_name(usr)] told [key_name(M)] to man up") - var/message = "[key_name_admin(usr)] told [key_name_admin(M)] to man up." - message_admins(message) - admin_ticket_log(M, message) - SSblackbox.record_feedback("tally", "admin_verb", 1, "Man Up") - -/client/proc/cmd_admin_man_up_global() - set category = "Special Verbs" - set name = "Man Up Global" - - if(!check_rights(R_ADMIN)) - return - - to_chat(world, "Man up, and deal with it.
Move on.") - for(var/mob/M in GLOB.player_list) - M.playsound_local(M, 'sound/voice/manup.ogg', 50, FALSE, pressure_affected = FALSE) - - log_admin("Man up global: [key_name(usr)] told everybody to man up") - message_admins("[key_name_admin(usr)] told everybody to man up.") - SSblackbox.record_feedback("tally", "admin_verb", 1, "Man Up Global") diff --git a/modular_citadel/code/modules/admin/topic.dm b/modular_citadel/code/modules/admin/topic.dm deleted file mode 100644 index 26bc902bef..0000000000 --- a/modular_citadel/code/modules/admin/topic.dm +++ /dev/null @@ -1,59 +0,0 @@ -/datum/admins/proc/citaTopic(href, href_list) - if(href_list["makementor"]) - makeMentor(href_list["makementor"]) - else if(href_list["removementor"]) - removeMentor(href_list["removementor"]) - -/datum/admins/proc/makeMentor(ckey) - if(!usr.client) - return - if (!check_rights(0)) - return - if(!ckey) - return - var/client/C = GLOB.directory[ckey] - if(C) - if(check_rights_for(C, R_ADMIN,0)) - to_chat(usr, "The client chosen is an admin! Cannot mentorize.") - return - if(SSdbcore.Connect()) - var/datum/DBQuery/query_get_mentor = SSdbcore.NewQuery("SELECT id FROM [format_table_name("mentor")] WHERE ckey = '[ckey]'") - if(query_get_mentor.NextRow()) - to_chat(usr, "[ckey] is already a mentor.") - return - var/datum/DBQuery/query_add_mentor = SSdbcore.NewQuery("INSERT INTO `[format_table_name("mentor")]` (`id`, `ckey`) VALUES (null, '[ckey]')") - if(!query_add_mentor.warn_execute()) - return - var/datum/DBQuery/query_add_admin_log = SSdbcore.NewQuery("INSERT INTO `[format_table_name("admin_log")]` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added new mentor [ckey]');") - if(!query_add_admin_log.warn_execute()) - return - else - to_chat(usr, "Failed to establish database connection. The changes will last only for the current round.") - new /datum/mentors(ckey) - to_chat(usr, "New mentor added.") - -/datum/admins/proc/removeMentor(ckey) - if(!usr.client) - return - if (!check_rights(0)) - return - if(!ckey) - return - var/client/C = GLOB.directory[ckey] - if(C) - if(check_rights_for(C, R_ADMIN,0)) - to_chat(usr, "The client chosen is an admin, not a mentor! Cannot de-mentorize.") - return - C.remove_mentor_verbs() - C.mentor_datum = null - GLOB.mentors -= C - if(SSdbcore.Connect()) - var/datum/DBQuery/query_remove_mentor = SSdbcore.NewQuery("DELETE FROM [format_table_name("mentor")] WHERE ckey = '[ckey]'") - if(!query_remove_mentor.warn_execute()) - return - var/datum/DBQuery/query_add_admin_log = SSdbcore.NewQuery("INSERT INTO `[format_table_name("admin_log")]` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Removed mentor [ckey]');") - if(!query_add_admin_log.warn_execute()) - return - else - to_chat(usr, "Failed to establish database connection. The changes will last only for the current round.") - to_chat(usr, "Mentor removed.") \ No newline at end of file diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm index ed28185bb7..3361707b04 100644 --- a/modular_citadel/code/modules/arousal/arousal.dm +++ b/modular_citadel/code/modules/arousal/arousal.dm @@ -1,17 +1,8 @@ -//Mob vars /mob/living - var/arousalloss = 0 //How aroused the mob is. - var/min_arousal = AROUSAL_MINIMUM_DEFAULT //The lowest this mobs arousal will get. default = 0 - var/max_arousal = AROUSAL_MAXIMUM_DEFAULT //The highest this mobs arousal will get. default = 100 - var/arousal_rate = AROUSAL_START_VALUE //The base rate that arousal will increase in this mob. - var/arousal_loss_rate = AROUSAL_START_VALUE //How easily arousal can be relieved for this mob. - var/canbearoused = FALSE //Mob-level disabler for arousal. Starts off and can be enabled as features are added for different mob types. var/mb_cd_length = 5 SECONDS //5 second cooldown for masturbating because fuck spam. var/mb_cd_timer = 0 //The timer itself /mob/living/carbon/human - canbearoused = TRUE - var/saved_underwear = ""//saves their underwear so it can be toggled later var/saved_undershirt = "" var/saved_socks = "" @@ -21,8 +12,6 @@ //Species vars /datum/species - var/arousal_gain_rate = AROUSAL_START_VALUE //Rate at which this species becomes aroused - var/arousal_lose_rate = AROUSAL_START_VALUE //Multiplier for how easily arousal can be relieved var/list/cum_fluids = list("semen") var/list/milk_fluids = list("milk") var/list/femcum_fluids = list("femcum") @@ -52,130 +41,26 @@ update_body() -/mob/living/proc/handle_arousal(times_fired) - return -/mob/living/carbon/handle_arousal(times_fired) - if(!canbearoused || !dna) - return - var/datum/species/S = dna.species - if(!S || (times_fired % 36) || !getArousalLoss() >= max_arousal)//Totally stolen from breathing code. Do this every 36 ticks. - return - var/our_loss = arousal_rate * S.arousal_gain_rate - if(HAS_TRAIT(src, TRAIT_EXHIBITIONIST) && client) - var/amt_nude = 0 +/mob/living/carbon/human/proc/adjust_arousal(strength,aphro = FALSE,maso = FALSE) // returns all genitals that were adjust + var/list/obj/item/organ/genital/genit_list = list() + if(!client?.prefs.arousable || (aphro && (client?.prefs.cit_toggles & NO_APHRO)) || (maso && !HAS_TRAIT(src, TRAIT_MASO))) + return // no adjusting made here + if(strength>0) for(var/obj/item/organ/genital/G in internal_organs) - if(G.is_exposed()) - amt_nude++ - if(amt_nude) - var/watchers = 0 - for(var/mob/living/L in view(src)) - if(L.client && !L.stat && !L.eye_blind && (src in view(L))) - watchers++ - if(watchers) - our_loss += (amt_nude * watchers) + S.arousal_gain_rate - adjustArousalLoss(our_loss) - -/mob/living/proc/getArousalLoss() - return arousalloss - -/mob/living/proc/adjustArousalLoss(amount, updating_arousal=1) - if(status_flags & GODMODE || !canbearoused) - return FALSE - arousalloss = CLAMP(arousalloss + amount, min_arousal, max_arousal) - if(updating_arousal) - updatearousal() - -/mob/living/proc/setArousalLoss(amount, updating_arousal=1) - if(status_flags & GODMODE || !canbearoused) - return FALSE - arousalloss = CLAMP(amount, min_arousal, max_arousal) - if(updating_arousal) - updatearousal() - -/mob/living/proc/getPercentAroused() - var/percentage = ((100 / max_arousal) * arousalloss) - return percentage - -/mob/living/proc/isPercentAroused(percentage)//returns true if the mob's arousal (measured in a percent of 100) is greater than the arg percentage. - if(!isnum(percentage) || percentage > 100 || percentage < 0) - CRASH("Provided percentage is invalid") - if(getPercentAroused() >= percentage) - return TRUE - return FALSE - -//H U D// -/mob/living/proc/updatearousal() - update_arousal_hud() - -/mob/living/carbon/updatearousal() - . = ..() - for(var/obj/item/organ/genital/G in internal_organs) - if(istype(G)) - var/datum/sprite_accessory/S - switch(G.type) - if(/obj/item/organ/genital/penis) - S = GLOB.cock_shapes_list[G.shape] - if(/obj/item/organ/genital/testicles) - S = GLOB.balls_shapes_list[G.shape] - if(/obj/item/organ/genital/vagina) - S = GLOB.vagina_shapes_list[G.shape] - if(/obj/item/organ/genital/breasts) - S = GLOB.breasts_shapes_list[G.shape] - if(S?.alt_aroused) - G.aroused_state = isPercentAroused(G.aroused_amount) - else - G.aroused_state = FALSE - G.update_appearance() - -/mob/living/proc/update_arousal_hud() - return FALSE - -/mob/living/carbon/human/update_arousal_hud() - if(!client || !(hud_used?.arousal)) - return FALSE - if(!canbearoused) - hud_used.arousal.icon_state = "" - return FALSE + if(!G.aroused_state && prob(strength*G.sensitivity)) + G.set_aroused_state(TRUE) + G.update_appearance() + if(G.aroused_state) + genit_list += G else - var/value = FLOOR(getPercentAroused(), 10) - hud_used.arousal.icon_state = "arousal[value]" - return TRUE - -/obj/screen/arousal - name = "arousal" - icon_state = "arousal0" - icon = 'modular_citadel/icons/obj/genitals/hud.dmi' - screen_loc = ui_arousal - -/obj/screen/arousal/Click() - if(!isliving(usr)) - return FALSE - var/mob/living/M = usr - if(M.canbearoused) - M.mob_climax() - return TRUE - else - to_chat(M, "Arousal is disabled. Feature is unavailable.") - - -/mob/living/proc/mob_climax(forced_climax = FALSE)//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while. - set name = "Masturbate" - set category = "IC" - if(canbearoused && !restrained() && !stat) - if(mb_cd_timer <= world.time) - //start the cooldown even if it fails - mb_cd_timer = world.time + mb_cd_length - if(getArousalLoss() >= 33)//one third of average max_arousal or greater required - visible_message("[src] starts masturbating!", \ - "You start masturbating.") - if(do_after(src, 30, target = src)) - visible_message("[src] relieves [p_them()]self!", \ - "You have relieved yourself.") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - setArousalLoss(min_arousal) - else - to_chat(src, "You aren't aroused enough for that.") + for(var/obj/item/organ/genital/G in internal_organs) + if(G.aroused_state && prob(strength*G.sensitivity)) + G.set_aroused_state(FALSE) + G.update_appearance() + if(G.aroused_state) + genit_list += G + return genit_list /obj/item/organ/genital/proc/climaxable(mob/living/carbon/human/H, silent = FALSE) //returns the fluid source (ergo reagents holder) if found. if(CHECK_BITFIELD(genital_flags, GENITAL_FUID_PRODUCTION)) @@ -189,48 +74,25 @@ /mob/living/carbon/human/proc/do_climax(datum/reagents/R, atom/target, obj/item/organ/genital/G, spill = TRUE) if(!G) return - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - setArousalLoss(min_arousal) if(!target || !R) return var/turfing = isturf(target) - if(spill & R.total_volume >= 5) + if(spill && R.total_volume >= 5) R.reaction(turfing ? target : target.loc, TOUCH, 1, 0) if(!turfing) R.trans_to(target, R.total_volume * (spill ? G.fluid_transfer_factor : 1)) R.clear_reagents() -//These are various procs that we'll use later, split up for readability instead of having one, huge proc. -//For all of these, we assume the arguments given are proper and have been checked beforehand. -/mob/living/carbon/human/proc/mob_masturbate(obj/item/organ/genital/G, mb_time = 30) //Masturbation, keep it gender-neutral - var/datum/reagents/fluid_source = G.climaxable(src) - if(!fluid_source) - return - var/obj/item/organ/genital/PP = CHECK_BITFIELD(G.genital_flags, MASTURBATE_LINKED_ORGAN) ? G.linked_organ : G - if(!PP) - to_chat(src, "You shudder, unable to cum with your [name].") - if(mb_time) - visible_message("[src] starts to [G.masturbation_verb] [p_their()] [G.name].", \ - "You start to [G.masturbation_verb] your [G.name].") - if(!do_after(src, mb_time, target = src) || !G.climaxable(src, TRUE)) - return - visible_message("[src] orgasms, [PP.orgasm_verb][isturf(loc) ? " onto [loc]" : ""] with [p_their()] [PP.name]!", \ - "You orgasm, [PP.orgasm_verb][isturf(loc) ? " onto [loc]" : ""] with your [PP.name].") - do_climax(fluid_source, loc, G) - /mob/living/carbon/human/proc/mob_climax_outside(obj/item/organ/genital/G, mb_time = 30) //This is used for forced orgasms and other hands-free climaxes var/datum/reagents/fluid_source = G.climaxable(src, TRUE) if(!fluid_source) - visible_message("[src] shudders, their [G.name] unable to cum.", \ - "Your [G.name] cannot cum, giving no relief.") + to_chat(src,"Your [G.name] cannot cum.") return if(mb_time) //as long as it's not instant, give a warning - visible_message("[src] looks like they're about to cum.", \ - "You feel yourself about to orgasm.") + to_chat(src,"You feel yourself about to orgasm.") if(!do_after(src, mb_time, target = src) || !G.climaxable(src, TRUE)) return - visible_message("[src] orgasms[isturf(loc) ? " onto [loc]" : ""], using [p_their()] [G.name]!", \ - "You climax[isturf(loc) ? " onto [loc]" : ""] with your [G.name].") + to_chat(src,"You climax[isturf(loc) ? " onto [loc]" : ""] with your [G.name].") do_climax(fluid_source, loc, G) /mob/living/carbon/human/proc/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage = TRUE, mb_time = 30) //Used for climaxing with any living thing @@ -238,48 +100,30 @@ if(!fluid_source) return if(mb_time) //Skip warning if this is an instant climax. - visible_message("[src] is about to climax with [L]!", \ - "You're about to climax with [L]!") + to_chat(src,"You're about to climax with [L]!") + to_chat(L,"[src] is about to climax with you!") if(!do_after(src, mb_time, target = src) || !in_range(src, L) || !G.climaxable(src, TRUE)) return if(spillage) - visible_message("[src] climaxes with [L], overflowing and spilling, using [p_their()] [G.name]!", \ - "You orgasm with [L], spilling out of them, using your [G.name].") + to_chat(src,"You orgasm with [L], spilling out of them, using your [G.name].") + to_chat(L,"[src] climaxes with you, overflowing and spilling, using [p_their()] [G.name]!") else //knots and other non-spilling orgasms - visible_message("[src] climaxes with [L], [p_their()] [G.name] spilling nothing!", \ - "You ejaculate with [L], your [G.name] spilling nothing.") + to_chat(src,"You climax with [L], your [G.name] spilling nothing.") + to_chat(L,"[src] climaxes with you, [p_their()] [G.name] spilling nothing!") SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) do_climax(fluid_source, spillage ? loc : L, G, spillage) - /mob/living/carbon/human/proc/mob_fill_container(obj/item/organ/genital/G, obj/item/reagent_containers/container, mb_time = 30) //For beaker-filling, beware the bartender var/datum/reagents/fluid_source = G.climaxable(src) if(!fluid_source) return if(mb_time) - visible_message("[src] starts to [G.masturbation_verb] their [G.name] over [container].", \ - "You start to [G.masturbation_verb] your [G.name] over [container].") + to_chat(src,"You start to [G.masturbation_verb] your [G.name] over [container].") if(!do_after(src, mb_time, target = src) || !in_range(src, container) || !G.climaxable(src, TRUE)) return - visible_message("[src] uses [p_their()] [G.name] to fill [container]!", \ - "You used your [G.name] to fill [container].") + to_chat(src,"You used your [G.name] to fill [container].") do_climax(fluid_source, container, G, FALSE) -/mob/living/carbon/human/proc/pick_masturbate_genitals(silent = FALSE) - var/list/genitals_list - var/list/worn_stuff = get_equipped_items() - - for(var/obj/item/organ/genital/G in internal_organs) - if(CHECK_BITFIELD(G.genital_flags, CAN_MASTURBATE_WITH) && G.is_exposed(worn_stuff)) //filter out what you can't masturbate with - if(CHECK_BITFIELD(G.genital_flags, MASTURBATE_LINKED_ORGAN) && !G.linked_organ) - continue - LAZYADD(genitals_list, G) - if(LAZYLEN(genitals_list)) - var/obj/item/organ/genital/ret_organ = input(src, "with what?", "Masturbate", null) as null|obj in genitals_list - return ret_organ - else if(!silent) - to_chat(src, "You cannot masturbate without available genitals.") - /mob/living/carbon/human/proc/pick_climax_genitals(silent = FALSE) var/list/genitals_list var/list/worn_stuff = get_equipped_items() @@ -301,6 +145,8 @@ partners += pulledby //Now we got both of them, let's check if they're proper for(var/mob/living/L in partners) + if(!L.client || !L.mind) // can't consent, not a partner + partners -= L if(iscarbon(L)) var/mob/living/carbon/C = L if(!C.exposed_genitals.len && !C.is_groin_exposed() && !C.is_chest_exposed()) //Nothing through_clothing, no proper partner. @@ -312,7 +158,9 @@ return //No one left. var/mob/living/target = input(src, "With whom?", "Sexual partner", null) as null|anything in partners //pick one, default to null if(target && in_range(src, target)) - return target + var/consenting = input(target, "Do you want [src] to climax with you?","Climax mechanics","No") in list("Yes","No") + if(consenting == "Yes") + return target /mob/living/carbon/human/proc/pick_climax_container(silent = FALSE) var/list/containers_list = list() @@ -349,13 +197,13 @@ return TRUE //Here's the main proc itself -/mob/living/carbon/human/mob_climax(forced_climax=FALSE) //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints +/mob/living/carbon/human/proc/mob_climax(forced_climax=FALSE) //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints if(mb_cd_timer > world.time) if(!forced_climax) //Don't spam the message to the victim if forced to come too fast to_chat(src, "You need to wait [DisplayTimeText((mb_cd_timer - world.time), TRUE)] before you can do that again!") return - if(!canbearoused || !has_dna()) + if(!client?.prefs.arousable || !has_dna()) return if(stat == DEAD) if(!forced_climax) @@ -398,32 +246,19 @@ if(stat == UNCONSCIOUS) //No sleep-masturbation, you're unconscious. to_chat(src, "You must be conscious to do that!") return - if(getArousalLoss() < 33) //flat number instead of percentage - to_chat(src, "You aren't aroused enough for that!") - return //Ok, now we check what they want to do. - var/choice = input(src, "Select sexual activity", "Sexual activity:") as null|anything in list("Masturbate", "Climax alone", "Climax with partner", "Fill container") + var/choice = input(src, "Select sexual activity", "Sexual activity:") as null|anything in list("Climax alone","Climax with partner", "Fill container") if(!choice) return switch(choice) - if("Masturbate") - if(!available_rosie_palms()) - return - //We got hands, let's pick an organ - var/obj/item/organ/genital/picked_organ = pick_masturbate_genitals() - if(picked_organ && available_rosie_palms(TRUE)) - mob_masturbate(picked_organ) - return - if("Climax alone") if(!available_rosie_palms()) return var/obj/item/organ/genital/picked_organ = pick_climax_genitals() if(picked_organ && available_rosie_palms(TRUE)) mob_climax_outside(picked_organ) - if("Climax with partner") //We need no hands, we can be restrained and so on, so let's pick an organ var/obj/item/organ/genital/picked_organ = pick_climax_genitals() @@ -433,7 +268,6 @@ var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as null|anything in list("Yes", "No") if(spillage && in_range(src, partner)) mob_climax_partner(picked_organ, partner, spillage == "Yes" ? TRUE : FALSE) - if("Fill container") //We'll need hands and no restraints. if(!available_rosie_palms(FALSE, /obj/item/reagent_containers)) @@ -447,4 +281,10 @@ if(fluid_container && available_rosie_palms(TRUE, /obj/item/reagent_containers)) mob_fill_container(picked_organ, fluid_container) - mb_cd_timer = world.time + mb_cd_length \ No newline at end of file + mb_cd_timer = world.time + mb_cd_length + +/mob/living/carbon/human/verb/climax_verb() + set category = "IC" + set name = "Climax" + set desc = "Lets you choose a couple ways to ejaculate." + mob_climax() diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm index d5daf24f8a..a16617ba3f 100644 --- a/modular_citadel/code/modules/arousal/genitals.dm +++ b/modular_citadel/code/modules/arousal/genitals.dm @@ -2,10 +2,12 @@ color = "#fcccb3" w_class = WEIGHT_CLASS_NORMAL var/shape = "human" - var/sensitivity = AROUSAL_START_VALUE + var/sensitivity = 1 // wow if this were ever used that'd be cool but it's not but i'm keeping it for my unshit code var/genital_flags //see citadel_defines.dm var/masturbation_verb = "masturbate" var/orgasm_verb = "cumming" //present continous + var/arousal_verb = "You feel aroused" + var/unarousal_verb = "You no longer feel aroused" var/fluid_transfer_factor = 0 //How much would a partner get in them if they climax using this? var/size = 2 //can vary between num or text, just used in icon_state strings var/datum/reagent/fluid_id = null @@ -14,7 +16,6 @@ var/fluid_rate = CUM_RATE var/fluid_mult = 1 var/aroused_state = FALSE //Boolean used in icon_state strings - var/aroused_amount = 50 //This is a num from 0 to 100 for arousal percentage for when to use arousal state icons. var/obj/item/organ/genital/linked_organ var/linked_organ_slot //used for linking an apparatus' organ to its other half on update_link(). var/layer_index = GENITAL_LAYER_INDEX //Order should be very important. FIRST vagina, THEN testicles, THEN penis, as this affects the order they are rendered in. @@ -38,6 +39,11 @@ Remove(owner, TRUE)//this should remove references to it, so it can be GCd correctly return ..() +/obj/item/organ/genital/proc/set_aroused_state(new_state) + if(!((HAS_TRAIT(owner,TRAIT_PERMABONER) && !new_state) || HAS_TRAIT(owner,TRAIT_NEVERBONER) && new_state)) + aroused_state = new_state + return aroused_state + /obj/item/organ/genital/proc/update(removing = FALSE) if(QDELETED(src)) return @@ -90,11 +96,9 @@ set desc = "Allows you to toggle which genitals should show through clothes or not." var/list/genital_list = list() - for(var/obj/item/organ/O in internal_organs) - if(isgenital(O)) - var/obj/item/organ/genital/G = O - if(!CHECK_BITFIELD(G.genital_flags, GENITAL_INTERNAL)) - genital_list += G + for(var/obj/item/organ/genital/G in internal_organs) + if(!CHECK_BITFIELD(G.genital_flags, GENITAL_INTERNAL)) + genital_list += G if(!genital_list.len) //There is nothing to expose return //Full list of exposable genitals created @@ -105,6 +109,39 @@ picked_organ.toggle_visibility(picked_visibility) return +/mob/living/carbon/verb/toggle_arousal_state() + set category = "IC" + set name = "Toggle genital arousal" + set desc = "Allows you to toggle which genitals are showing signs of arousal." + var/list/genital_list = list() + for(var/obj/item/organ/genital/G in internal_organs) + var/datum/sprite_accessory/S + switch(G.type) + if(/obj/item/organ/genital/penis) + S = GLOB.cock_shapes_list[G.shape] + if(/obj/item/organ/genital/testicles) + S = GLOB.balls_shapes_list[G.shape] + if(/obj/item/organ/genital/vagina) + S = GLOB.vagina_shapes_list[G.shape] + if(/obj/item/organ/genital/breasts) + S = GLOB.breasts_shapes_list[G.shape] + if(S?.alt_aroused) + genital_list += G + if(!genital_list.len) //There's nothing that can show arousal + return + var/obj/item/organ/genital/picked_organ + picked_organ = input(src, "Choose which genitalia to toggle arousal on", "Set genital arousal", null) in genital_list + if(picked_organ) + var/original_state = picked_organ.aroused_state + picked_organ.set_aroused_state(!picked_organ.aroused_state) + if(original_state != picked_organ.aroused_state) + to_chat(src,"[picked_organ.aroused_state ? picked_organ.arousal_verb : picked_organ.unarousal_verb].") + else + to_chat(src,"You can't make that genital [picked_organ.aroused_state ? "unaroused" : "aroused"]!") + picked_organ.update_appearance() + return + + /obj/item/organ/genital/proc/modify_size(modifier, min = -INFINITY, max = INFINITY) fluid_max_volume += modifier*2.5 fluid_rate += modifier/10 @@ -233,7 +270,7 @@ //Checks to see if organs are new on the mob, and changes their colours so that they don't get crazy colours. /mob/living/carbon/human/proc/emergent_genital_call() - if(!canbearoused) + if(!client.prefs.arousable) return FALSE var/organCheck = locate(/obj/item/organ/genital) in internal_organs diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 73d03eff3b..d1f1a08ea8 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -11,6 +11,8 @@ shape = "pair" genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_FUID_PRODUCTION masturbation_verb = "massage" + arousal_verb = "Your breasts start feeling sensitive" + unarousal_verb = "Your breasts no longer feel sensitive" orgasm_verb = "leaking" fluid_transfer_factor = 0.5 var/static/list/breast_values = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "flat" = 0) diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 408d6521d0..c6d3c764ac 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -6,6 +6,8 @@ zone = BODY_ZONE_PRECISE_GROIN slot = ORGAN_SLOT_PENIS masturbation_verb = "stroke" + arousal_verb = "You pop a boner" + unarousal_verb = "Your boner goes down" genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH linked_organ_slot = ORGAN_SLOT_TESTICLES fluid_transfer_factor = 0.5 @@ -26,7 +28,7 @@ ..() /obj/item/organ/genital/penis/update_size(modified = FALSE) - if(length < 0)//I don't actually know what round() does to negative numbers, so to be safe!! + if(length <= 0)//I don't actually know what round() does to negative numbers, so to be safe!! if(owner) to_chat(owner, "You feel your tallywacker shrinking away from your body as your groin flattens out!") QDEL_IN(src, 1) diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm index a911eefe01..e5b34926de 100644 --- a/modular_citadel/code/modules/arousal/organs/testicles.dm +++ b/modular_citadel/code/modules/arousal/organs/testicles.dm @@ -6,6 +6,8 @@ zone = BODY_ZONE_PRECISE_GROIN slot = ORGAN_SLOT_TESTICLES size = BALLS_SIZE_MIN + arousal_verb = "Your balls ache a little" + unarousal_verb = "Your balls finally stop aching, again" linked_organ_slot = ORGAN_SLOT_PENIS genital_flags = CAN_MASTURBATE_WITH|MASTURBATE_LINKED_ORGAN|GENITAL_FUID_PRODUCTION var/size_name = "average" diff --git a/modular_citadel/code/modules/arousal/organs/vagina.dm b/modular_citadel/code/modules/arousal/organs/vagina.dm index 0df954fd79..31d116b48e 100644 --- a/modular_citadel/code/modules/arousal/organs/vagina.dm +++ b/modular_citadel/code/modules/arousal/organs/vagina.dm @@ -8,6 +8,8 @@ size = 1 //There is only 1 size right now genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH masturbation_verb = "finger" + arousal_verb = "You feel wetness on your crotch." + unarousal_verb = "You no longer feel wet." fluid_transfer_factor = 0.1 //Yes, some amount is exposed to you, go get your AIDS layer_index = VAGINA_LAYER_INDEX var/cap_length = 8//D E P T H (cap = capacity) diff --git a/modular_citadel/code/modules/arousal/toys/dildos.dm b/modular_citadel/code/modules/arousal/toys/dildos.dm index 964c9964ad..58245c0c5f 100644 --- a/modular_citadel/code/modules/arousal/toys/dildos.dm +++ b/modular_citadel/code/modules/arousal/toys/dildos.dm @@ -5,8 +5,7 @@ name = "dildo" desc = "Floppy!" icon = 'modular_citadel/icons/obj/genitals/dildo.dmi' - damtype = AROUSAL - force = 5 + force = 0 hitsound = 'sound/weapons/tap.ogg' throwforce = 0 icon_state = "dildo_knotted_2" diff --git a/modular_citadel/code/modules/client/preferences.dm b/modular_citadel/code/modules/client/preferences.dm index eef8664fbb..4e7cb2972f 100644 --- a/modular_citadel/code/modules/client/preferences.dm +++ b/modular_citadel/code/modules/client/preferences.dm @@ -49,10 +49,9 @@ if(L[slot_to_string(slot)] < DEFAULT_SLOT_AMT) return TRUE -datum/preferences/copy_to(mob/living/carbon/human/character, icon_updates = 1) +/datum/preferences/copy_to(mob/living/carbon/human/character, icon_updates = 1) ..() character.give_genitals(TRUE) character.flavor_text = features["flavor_text"] //Let's update their flavor_text at least initially - character.canbearoused = arousable if(icon_updates) character.update_genitals() diff --git a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm deleted file mode 100644 index 547c1a5768..0000000000 --- a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm +++ /dev/null @@ -1,53 +0,0 @@ -/obj/item/integrated_circuit/manipulation/electric_stimulator - name = "electronic stimulation module" - desc = "Used to induce sexual stimulation in a target via electricity." - icon_state = "power_relay" - extended_desc = "The circuit accepts a reference to a person, as well as a number representing the strength of the shock, and upon activation, attempts to stimulate them to orgasm. The number ranges from -35 to 35, with negative numbers reducing arousal and positive numbers increasing it by that amount." - complexity = 15 - size = 2 - inputs = list("target" = IC_PINTYPE_REF, "strength" = IC_PINTYPE_NUMBER) - outputs = list("arousal gain"=IC_PINTYPE_NUMBER) - activators = list("fire" = IC_PINTYPE_PULSE_IN, "on success" = IC_PINTYPE_PULSE_OUT, "on fail" = IC_PINTYPE_PULSE_OUT, "on orgasm" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 500 - cooldown_per_use = 50 - ext_cooldown = 25 - -/obj/item/integrated_circuit/manipulation/electric_stimulator/do_work() - set_pin_data(IC_OUTPUT, 1, 0) - var/mob/living/M = get_pin_data_as_type(IC_INPUT, 1, /mob/living) - if(!check_target(M)) - return - - var/arousal_gain = CLAMP(get_pin_data(IC_INPUT, 2),-35,35) - set_pin_data(IC_OUTPUT, 1, arousal_gain) - - if(ismob(M) && M.canbearoused && arousal_gain != 0) - var/orgasm = FALSE - if(arousal_gain > 0) - if(M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna()) - var/mob/living/carbon/human/H = M - var/orgasm_message = pick("A sharp pulse of electricity pushes you to orgasm!", "You feel a jolt of electricity force you into orgasm!") - H.visible_message("\The [assembly] electrodes shock [H]!", "[orgasm_message]") - playsound(src, "sound/effects/light_flicker.ogg", 30, 1) - H.mob_climax(forced_climax=TRUE) - orgasm = TRUE - else - M.adjustArousalLoss(arousal_gain) - var/stimulate_message = pick("You feel a sharp warming tingle of electricity through your body!", "A burst of arousing electricity flows through your body!") - M.visible_message("\The [assembly] electrodes shock [M]!", "[stimulate_message]") - - else - var/stimulate_message = pick("You feel a dull prickle of electricity through your body!", "A burst of dull electricity flows through your body!") - M.visible_message("\The [assembly] electrodes shock [M]!", "[stimulate_message]") - M.adjustArousalLoss(arousal_gain) - - playsound(src, "sound/effects/light_flicker.ogg", 30, 1) - push_data() - activate_pin(2) - if(orgasm) activate_pin(4) - - else - visible_message("\The [assembly] electrodes fail to shock [M]!") - push_data() - activate_pin(3) diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm index f2743d853b..c2b8ff0868 100644 --- a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm +++ b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm @@ -416,14 +416,14 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! playsound(src, 'sound/effects/stealthoff.ogg', 25, TRUE, -1) weather_immunities -= "lava" -/mob/living/silicon/robot/throw_impact(atom/A) +/mob/living/silicon/robot/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!leaping) return ..() - if(A) - if(isliving(A)) - var/mob/living/L = A + if(hit_atom) + if(isliving(hit_atom)) + var/mob/living/L = hit_atom if(!L.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK)) L.visible_message("[src] pounces on [L]!", "[src] pounces on you!") L.Knockdown(iscarbon(L) ? 60 : 45, override_stamdmg = CLAMP(pounce_stamloss, 0, pounce_stamloss_cap-L.getStaminaLoss())) // Temporary. If someone could rework how dogborg pounces work to accomodate for combat changes, that'd be nice. @@ -437,8 +437,8 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! pounce_cooldown = !pounce_cooldown spawn(pounce_cooldown_time) //3s by default pounce_cooldown = !pounce_cooldown - else if(A.density && !A.CanPass(src)) - visible_message("[src] smashes into [A]!", "You smash into [A]!") + else if(hit_atom.density && !hit_atom.CanPass(src)) + visible_message("[src] smashes into [hit_atom]!", "You smash into [hit_atom]!") playsound(src, 'sound/items/trayhit1.ogg', 50, 1) Knockdown(15, 1, 1) diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm index 10ab3901d9..98d2efc4ea 100644 --- a/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm @@ -66,6 +66,7 @@ obj/item/projectile/bullet/c10mm/soporific knockdown = 0 /obj/item/projectile/bullet/c10mm/soporific/on_hit(atom/target, blocked = FALSE) + . = ..() if((blocked != 100) && isliving(target)) var/mob/living/L = target L.blur_eyes(6) @@ -73,7 +74,6 @@ obj/item/projectile/bullet/c10mm/soporific L.Sleeping(300) else L.adjustStaminaLoss(25) - return 1 /obj/item/ammo_casing/c10mm/soporific name = ".10mm soporific bullet casing" diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm index 8ee00bef06..9779b47b15 100644 --- a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm @@ -355,7 +355,7 @@ damage = 10 armour_penetration = 10 stamina = 10 - forcedodge = TRUE + movement_type = FLYING | UNSTOPPABLE range = 6 light_range = 1 light_color = LIGHT_COLOR_RED @@ -363,14 +363,14 @@ /obj/item/projectile/bullet/mags/hyper/inferno icon_state = "magjectile-large" stamina = 0 - forcedodge = FALSE + movement_type = FLYING | UNSTOPPABLE range = 25 light_range = 4 /obj/item/projectile/bullet/mags/hyper/inferno/on_hit(atom/target, blocked = FALSE) ..() explosion(target, -1, 1, 2, 4, 5) - return 1 + return BULLET_ACT_HIT ///ammo casings/// @@ -436,7 +436,7 @@ icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' icon_state = "magjectile-toy" name = "lasertag magbolt" - forcedodge = TRUE //for penetration memes + movement_type = FLYING | UNSTOPPABLE //for penetration memes range = 5 //so it isn't super annoying light_range = 2 light_color = LIGHT_COLOR_YELLOW diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm index b70858c9af..9e965ec7a7 100644 --- a/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm @@ -9,7 +9,7 @@ /obj/item/projectile/bullet/spinfusor/on_hit(atom/target, blocked = FALSE) //explosion to emulate the spinfusor's AOE ..() explosion(target, -1, -1, 2, 0, -1) - return 1 + return BULLET_ACT_HIT /obj/item/ammo_casing/caseless/spinfusor name = "spinfusor disk" diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 0985b758c6..86325faa91 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -308,8 +308,6 @@ Creating a chem with a low purity will make you permanently fall in love with so SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have bonded") else if(get_dist(M, love) < 8) - if(HAS_TRAIT(M, TRAIT_NYMPHO)) //Add this back when merged/updated. - M.adjustArousalLoss(5) var/message = "[(lewd?"I'm next to my crush..! Eee!":"I'm making friends with [love]!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "InLove", /datum/mood_event/InLove, message) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm index b907c27329..32474263c4 100644 --- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm +++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm @@ -97,14 +97,18 @@ color = "#FFADFF"//PINK, rgb(255, 173, 255) /datum/reagent/drug/aphrodisiac/on_mob_life(mob/living/M) - if(M && M.canbearoused && !(M.client?.prefs.cit_toggles & NO_APHRO)) - if(prob(33)) - M.adjustArousalLoss(2) - if(prob(5)) + if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO)) + if((prob(min(current_cycle/2,5)))) M.emote(pick("moan","blush")) - if(prob(5)) + if(prob(min(current_cycle/4,10))) var/aroused_message = pick("You feel frisky.", "You're having trouble suppressing your urges.", "You feel in the mood.") to_chat(M, "[aroused_message]") + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/list/genits = H.adjust_arousal(current_cycle, aphro = TRUE) // redundant but should still be here + for(var/g in genits) + var/obj/item/organ/genital/G = g + to_chat(M, "[G.arousal_verb]!") ..() /datum/reagent/drug/aphrodisiacplus @@ -118,21 +122,26 @@ overdose_threshold = 20 /datum/reagent/drug/aphrodisiacplus/on_mob_life(mob/living/M) - if(M && M.canbearoused && !(M.client?.prefs.cit_toggles & NO_APHRO)) - if(prob(33)) - M.adjustArousalLoss(6)//not quite six times as powerful, but still considerably more powerful. + if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO)) if(prob(5)) - if(M.getArousalLoss() > 75) + if(prob(current_cycle)) M.say(pick("Hnnnnngghh...", "Ohh...", "Mmnnn...")) else M.emote(pick("moan","blush")) if(prob(5)) var/aroused_message - if(M.getArousalLoss() > 90) + if(current_cycle>25) aroused_message = pick("You need to fuck someone!", "You're bursting with sexual tension!", "You can't get sex off your mind!") else aroused_message = pick("You feel a bit hot.", "You feel strong sexual urges.", "You feel in the mood.", "You're ready to go down on someone.") to_chat(M, "[aroused_message]") + REMOVE_TRAIT(M,TRAIT_NEVERBONER,APHRO_TRAIT) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/list/genits = H.adjust_arousal(100, aphro = TRUE) // redundant but should still be here + for(var/g in genits) + var/obj/item/organ/genital/G = g + to_chat(M, "[G.arousal_verb]!") ..() /datum/reagent/drug/aphrodisiacplus/addiction_act_stage2(mob/living/M) @@ -150,15 +159,11 @@ ..() /datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M) - if(M && M.canbearoused && !(M.client?.prefs.cit_toggles & NO_APHRO) && prob(33)) - if(prob(5) && M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna()) - if(prob(5)) //Less spam - to_chat(M, "Your libido is going haywire!") - if(M.min_arousal < 50) - M.min_arousal += 1 - if(M.min_arousal < M.max_arousal) - M.min_arousal += 1 - M.adjustArousalLoss(2) + if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO) && prob(33)) + if(prob(5) && ishuman(M) && M.has_dna() && (M.client?.prefs.cit_toggles & BIMBOFICATION)) + if(!HAS_TRAIT(M,TRAIT_PERMABONER)) + to_chat(M, "Your libido is going haywire!") + ADD_TRAIT(M,TRAIT_PERMABONER,APHRO_TRAIT) ..() /datum/reagent/drug/anaphrodisiac @@ -171,8 +176,12 @@ reagent_state = SOLID /datum/reagent/drug/anaphrodisiac/on_mob_life(mob/living/M) - if(M && M.canbearoused && prob(33)) - M.adjustArousalLoss(-2) + if(M && M.client?.prefs.arousable && prob(16)) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/list/genits = H.adjust_arousal(-100, aphro = TRUE) + if(genits.len) + to_chat(M, "You no longer feel aroused.") ..() /datum/reagent/drug/anaphrodisiacplus @@ -184,17 +193,20 @@ overdose_threshold = 20 /datum/reagent/drug/anaphrodisiacplus/on_mob_life(mob/living/M) - if(M && M.canbearoused && prob(33)) - M.adjustArousalLoss(-4) + if(M && M.client?.prefs.arousable) + REMOVE_TRAIT(M,TRAIT_PERMABONER,APHRO_TRAIT) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/list/genits = H.adjust_arousal(-100, aphro = TRUE) + if(genits.len) + to_chat(M, "You no longer feel aroused.") + ..() /datum/reagent/drug/anaphrodisiacplus/overdose_process(mob/living/M) - if(M && M.canbearoused && prob(33)) - if(M.min_arousal > 0) - M.min_arousal -= 1 - if(M.min_arousal > 50) - M.min_arousal -= 1 - M.adjustArousalLoss(-2) + if(M && M.client?.prefs.arousable && prob(5)) + to_chat(M, "You feel like you'll never feel aroused again...") + ADD_TRAIT(M,TRAIT_NEVERBONER,APHRO_TRAIT) ..() //recipes diff --git a/tgstation.dme b/tgstation.dme index c3a3e775bd..d8e500a9f0 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -70,6 +70,7 @@ #include "code\__DEFINES\misc.dm" #include "code\__DEFINES\mobs.dm" #include "code\__DEFINES\monkeys.dm" +#include "code\__DEFINES\move_force.dm" #include "code\__DEFINES\movespeed_modification.dm" #include "code\__DEFINES\nanites.dm" #include "code\__DEFINES\networks.dm" @@ -391,6 +392,7 @@ #include "code\datums\components\shrink.dm" #include "code\datums\components\sizzle.dm" #include "code\datums\components\slippery.dm" +#include "code\datums\components\spawner.dm" #include "code\datums\components\spooky.dm" #include "code\datums\components\squeak.dm" #include "code\datums\components\stationloving.dm" @@ -471,6 +473,7 @@ #include "code\datums\diseases\advance\symptoms\youth.dm" #include "code\datums\elements\_element.dm" #include "code\datums\elements\cleaning.dm" +#include "code\datums\elements\dusts_on_catatonia.dm" #include "code\datums\elements\earhealing.dm" #include "code\datums\elements\ghost_role_eligibility.dm" #include "code\datums\elements\wuv.dm" @@ -1070,6 +1073,7 @@ #include "code\game\objects\structures\reflector.dm" #include "code\game\objects\structures\safe.dm" #include "code\game\objects\structures\showcase.dm" +#include "code\game\objects\structures\spawner.dm" #include "code\game\objects\structures\spirit_board.dm" #include "code\game\objects\structures\stairs.dm" #include "code\game\objects\structures\statues.dm" @@ -1113,6 +1117,7 @@ #include "code\game\objects\structures\crates_lockers\crates\large.dm" #include "code\game\objects\structures\crates_lockers\crates\secure.dm" #include "code\game\objects\structures\crates_lockers\crates\wooden.dm" +#include "code\game\objects\structures\lavaland\necropolis_tendril.dm" #include "code\game\objects\structures\signs\_signs.dm" #include "code\game\objects\structures\signs\signs_departments.dm" #include "code\game\objects\structures\signs\signs_maps.dm" @@ -1471,6 +1476,7 @@ #include "code\modules\atmospherics\machinery\components\binary_devices\dp_vent_pump.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\passive_gate.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\pump.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\relief_valve.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\valve.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\volume_pump.dm" #include "code\modules\atmospherics\machinery\components\trinary_devices\filter.dm" @@ -1479,7 +1485,9 @@ #include "code\modules\atmospherics\machinery\components\unary_devices\cryo.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\heat_exchanger.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\outlet_injector.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\passive_vent.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\portables_connector.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\relief_valve.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\tank.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\thermomachine.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\unary_devices.dm" @@ -2011,11 +2019,15 @@ #include "code\modules\lighting\lighting_turf.dm" #include "code\modules\mapping\dmm_suite.dm" #include "code\modules\mapping\map_template.dm" -#include "code\modules\mapping\mapping_helpers.dm" #include "code\modules\mapping\preloader.dm" #include "code\modules\mapping\reader.dm" #include "code\modules\mapping\ruins.dm" #include "code\modules\mapping\verify.dm" +#include "code\modules\mapping\mapping_helpers\_mapping_helpers.dm" +#include "code\modules\mapping\mapping_helpers\baseturf.dm" +#include "code\modules\mapping\mapping_helpers\network_builder\_network_builder.dm" +#include "code\modules\mapping\mapping_helpers\network_builder\atmos_pipe.dm" +#include "code\modules\mapping\mapping_helpers\network_builder\power_cables.dm" #include "code\modules\mapping\space_management\multiz_helpers.dm" #include "code\modules\mapping\space_management\space_level.dm" #include "code\modules\mapping\space_management\space_reservation.dm" @@ -2283,7 +2295,6 @@ #include "code\modules\mob\living\simple_animal\simple_animal.dm" #include "code\modules\mob\living\simple_animal\simple_animal_vr.dm" #include "code\modules\mob\living\simple_animal\simplemob_vore_values.dm" -#include "code\modules\mob\living\simple_animal\spawner.dm" #include "code\modules\mob\living\simple_animal\status_procs.dm" #include "code\modules\mob\living\simple_animal\bot\bot.dm" #include "code\modules\mob\living\simple_animal\bot\cleanbot.dm" @@ -2388,7 +2399,6 @@ #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\gutlunch.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\necropolis_tendril.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\elite.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\goliath_broodmother.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\herald.dm" @@ -3090,11 +3100,9 @@ #include "modular_citadel\code\game\machinery\wishgranter.dm" #include "modular_citadel\code\game\objects\cit_screenshake.dm" #include "modular_citadel\code\game\objects\effects\temporary_visuals\souldeath.dm" -#include "modular_citadel\code\modules\admin\admin.dm" #include "modular_citadel\code\modules\admin\chat_commands.dm" #include "modular_citadel\code\modules\admin\holder2.dm" #include "modular_citadel\code\modules\admin\secrets.dm" -#include "modular_citadel\code\modules\admin\topic.dm" #include "modular_citadel\code\modules\arousal\arousal.dm" #include "modular_citadel\code\modules\arousal\genitals.dm" #include "modular_citadel\code\modules\arousal\genitals_sprite_accessories.dm" @@ -3137,7 +3145,6 @@ #include "modular_citadel\code\modules\custom_loadout\custom_items.dm" #include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm" #include "modular_citadel\code\modules\custom_loadout\read_from_file.dm" -#include "modular_citadel\code\modules\integrated_electronics\subtypes\manipulation.dm" #include "modular_citadel\code\modules\mentor\follow.dm" #include "modular_citadel\code\modules\mentor\mentor.dm" #include "modular_citadel\code\modules\mentor\mentor_memo.dm" diff --git a/tgui/src/interfaces/atmos_relief.ract b/tgui/src/interfaces/atmos_relief.ract new file mode 100644 index 0000000000..4cc0d1fb68 --- /dev/null +++ b/tgui/src/interfaces/atmos_relief.ract @@ -0,0 +1,12 @@ + + + Set + Max + {{Math.round(adata.open_pressure)}} kPa + + + Set + Max + {{Math.round(adata.close_pressure)}} kPa + + diff --git a/tgui/src/interfaces/nanite_comm_remote.ract b/tgui/src/interfaces/nanite_comm_remote.ract new file mode 100644 index 0000000000..9cdc5fb7f3 --- /dev/null +++ b/tgui/src/interfaces/nanite_comm_remote.ract @@ -0,0 +1,41 @@ + +{{#if data.locked}} + The interface is locked. +{{else}} + Lock Interface + Save Current Setting + + {{data.comm_code}} + Set + + + {{data.comm_message}} +
+ Set +
+ {{#if data.mode == "Relay"}} + + {{data.relay_code}} + Set + + {{/if}} + + {{data.mode}} +
+ Off + Local + Targeted + Area + Relay +
+{{/if}} +
+ + {{#each data.saved_settings}} + {{name}} + {{#if !data.locked}} + Remove + {{/if}} +
+ {{/each}} +
diff --git a/tools/travis/check_line_endings.py b/tools/travis/check_line_endings.py index 3ee7baf7aa..fbbbc41426 100644 --- a/tools/travis/check_line_endings.py +++ b/tools/travis/check_line_endings.py @@ -7,8 +7,8 @@ import glob WINDOWS_NEWLINE = b'\r\n' FILES_TO_READ = [] -FILES_TO_READ.extend(glob.glob(r"**\*.dm", recursive=True)) -FILES_TO_READ.extend(glob.glob(r"**\*.dmm", recursive=True)) +FILES_TO_READ.extend(glob.glob(r"**/*.dm", recursive=True)) +FILES_TO_READ.extend(glob.glob(r"**/*.dmm", recursive=True)) FILES_TO_READ.extend(glob.glob(r"*.dme")) #for i in FILES_TO_READ: # if os.path.isdir(i):