diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_crashed_pinnance.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_crashed_pinnance.dmm index 512e56b6f269..31e1de26e369 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_crashed_pinnance.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_crashed_pinnance.dmm @@ -374,9 +374,8 @@ name = "survey gear"; pixel_x = 30 }, -/obj/item/survey_handheld/elite, -/obj/item/survey_handheld/advanced, -/obj/item/survey_handheld/advanced, +/obj/item/gear_pack/survey_pack/Experimental, +/obj/item/pinpointer/survey_data, /obj/item/clothing/accessory/armband/science, /obj/item/clothing/suit/toggle/labcoat/science, /obj/item/clothing/glasses/science, diff --git a/_maps/shuttles/independent/nanotrasen_heron.dmm b/_maps/shuttles/independent/nanotrasen_heron.dmm index a7ccdec275fc..28acd8ded865 100644 --- a/_maps/shuttles/independent/nanotrasen_heron.dmm +++ b/_maps/shuttles/independent/nanotrasen_heron.dmm @@ -6518,9 +6518,6 @@ pixel_y = 5; pixel_x = 5 }, -/obj/item/survey_handheld{ - pixel_x = -2 - }, /obj/item/book/manual/wiki/robotics_cyborgs{ pixel_y = -1; pixel_x = 5 @@ -10040,7 +10037,6 @@ pixel_y = -6 }, /obj/item/storage/wallet/random, -/obj/item/survey_handheld, /turf/open/floor/plasteel/dark, /area/ship/bridge) "Ll" = ( diff --git a/_maps/shuttles/minutemen/minutemen_cepheus.dmm b/_maps/shuttles/minutemen/minutemen_cepheus.dmm index d14a368faf55..e4e590907761 100644 --- a/_maps/shuttles/minutemen/minutemen_cepheus.dmm +++ b/_maps/shuttles/minutemen/minutemen_cepheus.dmm @@ -171,12 +171,6 @@ }, /turf/open/floor/plasteel/tech/grid, /area/ship/science/robotics) -"cl" = ( -/obj/machinery/porta_turret/ship/ballistic{ - dir = 5 - }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/science/robotics) "cF" = ( /obj/structure/table/reinforced{ color = "#c1b6a5" @@ -233,6 +227,10 @@ }, /turf/open/floor/plasteel/dark, /area/ship/science/robotics) +"cJ" = ( +/obj/machinery/porta_turret/ship/ballistic, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/security) "db" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/glass{ @@ -806,18 +804,6 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel/telecomms_floor, /area/ship/science/robotics) -"iM" = ( -/obj/machinery/porta_turret/ship/ballistic{ - dir = 9 - }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/engineering/atmospherics) -"jl" = ( -/obj/machinery/porta_turret/ship/ballistic{ - dir = 6 - }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/security) "jp" = ( /obj/effect/turf_decal/techfloor, /obj/effect/turf_decal/techfloor/hole, @@ -838,30 +824,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, /area/ship/cargo) -"jK" = ( -/obj/effect/turf_decal/industrial/outline/yellow, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/light_switch{ - pixel_x = -10; - pixel_y = 23 - }, -/obj/structure/closet/crate/science, -/obj/item/storage/box/stockparts/t2{ - pixel_x = -5; - pixel_y = 2 - }, -/obj/effect/spawner/lootdrop/maintenance/three, -/obj/item/survey_handheld{ - pixel_x = 7 - }, -/obj/item/clothing/glasses/science{ - pixel_x = -2; - pixel_y = -6 - }, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/plasteel/tech/grid, -/area/ship/cargo) "jR" = ( /obj/structure/railing{ dir = 1; @@ -3001,6 +2963,10 @@ }, /turf/open/floor/plasteel/dark, /area/ship/bridge) +"Fw" = ( +/obj/machinery/porta_turret/ship/ballistic, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/engineering/electrical) "Fx" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -3818,6 +3784,10 @@ }, /turf/open/floor/plasteel/tech, /area/ship/security) +"OK" = ( +/obj/machinery/porta_turret/ship/ballistic, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/science/robotics) "OP" = ( /obj/effect/turf_decal/techfloor/orange, /obj/effect/decal/cleanable/dirt/dust, @@ -3929,6 +3899,29 @@ "Qf" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ship/hallway/central) +"Qg" = ( +/obj/effect/turf_decal/industrial/outline/yellow, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/light_switch{ + pixel_x = -9; + pixel_y = 21 + }, +/obj/structure/closet/crate/science, +/obj/item/storage/box/stockparts/t2{ + pixel_x = -5; + pixel_y = 2 + }, +/obj/effect/spawner/lootdrop/maintenance/three, +/obj/item/clothing/glasses/science{ + pixel_x = -2; + pixel_y = -6 + }, +/obj/machinery/firealarm/directional/north, +/obj/item/gear_pack/survey_pack, +/obj/item/pinpointer/survey_data, +/turf/open/floor/plasteel/tech/grid, +/area/ship/cargo) "Qr" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ship/science/robotics) @@ -4169,12 +4162,6 @@ /obj/effect/decal/cleanable/robot_debris, /turf/open/floor/plasteel/tech, /area/ship/engineering/electrical) -"SQ" = ( -/obj/machinery/porta_turret/ship/ballistic{ - dir = 10 - }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/engineering/electrical) "Tu" = ( /obj/effect/turf_decal/techfloor{ dir = 4 @@ -4857,11 +4844,11 @@ zQ zQ zQ zQ -iM +uX xV xV El -jK +Qg wK lc jp @@ -4869,7 +4856,7 @@ MS El Xs Xs -SQ +Fw zQ zQ zQ @@ -5429,7 +5416,7 @@ zQ (27,1,1) = {" zQ zQ -cl +OK Qr Qr qT @@ -5447,7 +5434,7 @@ TU lX TU TU -jl +cJ zQ zQ "} diff --git a/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm b/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm index c91299ae62ba..dc3d1460b336 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm @@ -73,6 +73,27 @@ }, /turf/open/floor/plating, /area/ship/cargo) +"aw" = ( +/obj/effect/turf_decal/borderfloor{ + dir = 4 + }, +/obj/effect/turf_decal/industrial/loading{ + dir = 8 + }, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 1 + }, +/obj/machinery/mineral/processing_unit_console{ + machinedir = 6; + pixel_y = 26 + }, +/obj/machinery/conveyor_switch/oneway{ + id = "1984"; + pixel_x = 5; + pixel_y = -10 + }, +/turf/open/floor/plasteel, +/area/ship/cargo) "ax" = ( /turf/closed/wall/mineral/titanium, /area/ship/cargo) @@ -1339,17 +1360,6 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/plasteel/white, /area/ship/science/robotics) -"mf" = ( -/obj/effect/turf_decal/borderfloor, -/obj/machinery/door/airlock{ - name = "Janitorial Closet" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/plasteel/tech/grid, -/area/ship/hallway/port) "mt" = ( /obj/structure/sign/departments/medbay/alt, /turf/closed/wall/mineral/titanium/nodiagonal, @@ -1413,6 +1423,27 @@ }, /turf/open/floor/plasteel, /area/ship/medical) +"np" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/machinery/camera, +/obj/machinery/light/small/directional/north, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/table, +/obj/item/mmi/posibrain{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/item/mmi/posibrain{ + pixel_x = 5 + }, +/obj/item/gear_pack/survey_pack/advanced/nt{ + pixel_x = -6 + }, +/obj/item/pinpointer/survey_data, +/turf/open/floor/plasteel/white, +/area/ship/science/robotics) "nq" = ( /obj/effect/spawner/structure/window/shuttle, /obj/machinery/door/poddoor{ @@ -1434,6 +1465,17 @@ /obj/structure/catwalk/over, /turf/open/floor/plating, /area/ship/engineering) +"op" = ( +/obj/effect/turf_decal/borderfloor, +/obj/machinery/door/airlock{ + name = "Restroom" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ship/hallway/port) "oq" = ( /obj/machinery/light/small/built/directional/south, /obj/structure/cable{ @@ -2251,17 +2293,6 @@ }, /turf/open/floor/plating, /area/ship/cargo) -"Jf" = ( -/obj/effect/turf_decal/borderfloor, -/obj/machinery/door/airlock{ - name = "Restroom" - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plasteel/tech/grid, -/area/ship/hallway/port) "Jj" = ( /obj/structure/cable{ icon_state = "1-2" @@ -2423,6 +2454,17 @@ }, /turf/open/floor/plasteel, /area/ship/science/robotics) +"Nm" = ( +/obj/effect/turf_decal/borderfloor, +/obj/machinery/door/airlock{ + name = "Janitorial Closet" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/tech/grid, +/area/ship/hallway/port) "NF" = ( /obj/structure/cable{ icon_state = "4-8" @@ -2520,27 +2562,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plasteel/patterned, /area/ship/cargo) -"Sr" = ( -/obj/effect/turf_decal/borderfloor{ - dir = 4 - }, -/obj/effect/turf_decal/industrial/loading{ - dir = 8 - }, -/obj/effect/turf_decal/corner/opaque/brown{ - dir = 1 - }, -/obj/machinery/mineral/processing_unit_console{ - machinedir = 6; - pixel_y = 26 - }, -/obj/machinery/conveyor_switch/oneway{ - id = "1984"; - pixel_x = 5; - pixel_y = -10 - }, -/turf/open/floor/plasteel, -/area/ship/cargo) "SE" = ( /obj/effect/turf_decal/corner/opaque/blue, /obj/effect/turf_decal/corner/opaque/blue{ @@ -2657,26 +2678,6 @@ /obj/machinery/vending/coffee, /turf/open/floor/plasteel/dark, /area/ship/hallway/central) -"Wf" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/machinery/camera, -/obj/machinery/light/small/directional/north, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/table, -/obj/item/mmi/posibrain{ - pixel_x = 5; - pixel_y = 6 - }, -/obj/item/mmi/posibrain{ - pixel_x = 5 - }, -/obj/item/survey_handheld{ - pixel_x = -6 - }, -/turf/open/floor/plasteel/white, -/area/ship/science/robotics) "WG" = ( /obj/machinery/porta_turret/ship/weak{ dir = 4 @@ -2985,7 +2986,7 @@ YZ aa ae al -mf +Nm aR Jj bD @@ -3045,7 +3046,7 @@ SN aa ae CP -Jf +op qt ae bF @@ -3264,7 +3265,7 @@ Mc (22,1,1) = {" aa ab -Sr +aw jk rs de @@ -3294,7 +3295,7 @@ aa aa aa HJ -Wf +np db dv dM diff --git a/_maps/shuttles/roumain/srm_glaive.dmm b/_maps/shuttles/roumain/srm_glaive.dmm index 6ac9e480222e..3e33c855a855 100644 --- a/_maps/shuttles/roumain/srm_glaive.dmm +++ b/_maps/shuttles/roumain/srm_glaive.dmm @@ -2832,7 +2832,6 @@ /area/ship/roumain) "Rn" = ( /obj/structure/table/wood, -/obj/item/survey_handheld, /obj/effect/turf_decal/siding/wood{ dir = 4 }, diff --git a/code/datums/action.dm b/code/datums/action.dm index ff03b689085d..ea332792a397 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -252,6 +252,9 @@ /datum/action/item_action/toggle_mister name = "Toggle Mister" +/datum/action/item_action/toggle_attachment + name = "Toggle Attachment" + /datum/action/item_action/activate_injector name = "Activate Injector" diff --git a/code/datums/mapgen/planetary/BeachGenerator.dm b/code/datums/mapgen/planetary/BeachGenerator.dm index ca1d70b929fa..9ce3fc0d1419 100644 --- a/code/datums/mapgen/planetary/BeachGenerator.dm +++ b/code/datums/mapgen/planetary/BeachGenerator.dm @@ -113,6 +113,11 @@ ) mob_spawn_chance = 1 + feature_spawn_chance = 0.2 + feature_spawn_list = list( + /obj/effect/survey_point = 1 + ) + /datum/biome/grass/dense flora_spawn_chance = 70 mob_spawn_list = list( @@ -122,7 +127,6 @@ /mob/living/simple_animal/hostile/poison/bees/toxin = 3, ) mob_spawn_chance = 2 - feature_spawn_chance = 0.1 /datum/biome/beach open_turf_types = list(/turf/open/floor/plating/asteroid/sand/lit = 1) @@ -136,6 +140,10 @@ /obj/item/toy/seashell = 1, ) flora_spawn_chance = 5 + feature_spawn_chance = 0.2 + feature_spawn_list = list( + /obj/effect/survey_point = 1 + ) /datum/biome/beach/dense open_turf_types = list(/turf/open/floor/plating/asteroid/sand/dense/lit = 1) @@ -156,6 +164,10 @@ /obj/structure/flora/ash/garden/seaweed = 1 ) flora_spawn_chance = 1 + feature_spawn_chance = 1 + feature_spawn_list = list( + /obj/effect/survey_point = 1 + ) /datum/biome/ocean/deep open_turf_types = list(/turf/open/water/beach/deep = 1) @@ -170,6 +182,10 @@ /mob/living/simple_animal/hostile/bear/cave = 5, /mob/living/simple_animal/hostile/asteroid/lobstrosity/beach = 1, ) + feature_spawn_chance = 1 + feature_spawn_list = list( + /obj/effect/survey_point = 1 + ) /datum/biome/cave/beach/cove open_turf_types = list(/turf/open/floor/plating/asteroid/sand/dense = 1) diff --git a/code/datums/mapgen/planetary/JungleGenerator.dm b/code/datums/mapgen/planetary/JungleGenerator.dm index dd5635d4841f..68197a12c830 100644 --- a/code/datums/mapgen/planetary/JungleGenerator.dm +++ b/code/datums/mapgen/planetary/JungleGenerator.dm @@ -103,6 +103,11 @@ /obj/effect/spawner/lootdrop/chicken/jungle/flock = 1 ) + feature_spawn_chance = 0.3 + feature_spawn_list = list( + /obj/effect/survey_point = 1 + ) + /datum/biome/jungle/dense flora_spawn_chance = 100 open_turf_types = list(/turf/open/floor/plating/grass/jungle/lit = 1, /turf/open/floor/plating/dirt/jungle/dark/lit = 9) @@ -146,9 +151,17 @@ flora_spawn_chance = 20 mob_spawn_chance = 0.05 mob_spawn_list = list(/mob/living/simple_animal/hostile/poison/giant_spider/tarantula = 1) + feature_spawn_chance = 0.3 + feature_spawn_list = list( + /obj/effect/survey_point = 1 + ) /datum/biome/jungle_wasteland open_turf_types = list(/turf/open/floor/plating/dirt/jungle/wasteland/lit = 1) + feature_spawn_chance = 1 + feature_spawn_list = list( + /obj/effect/survey_point = 1 + ) /datum/biome/jungle/water open_turf_types = list(/turf/open/water/jungle/lit = 1) @@ -177,10 +190,11 @@ /mob/living/simple_animal/hostile/retaliate/bat = 1, /mob/living/simple_animal/hostile/retaliate/poison/snake = 1 ) - feature_spawn_chance = 0.5 + feature_spawn_chance = 1 feature_spawn_list = list( /obj/item/pickaxe/rusted = 1, /obj/structure/spawner/ice_moon = 1, + /obj/effect/survey_point = 1, /obj/effect/spawner/lootdrop/anomaly/jungle = 1 ) @@ -240,5 +254,8 @@ mob_spawn_list = list( /mob/living/simple_animal/hostile/lightgeist = 1 ) - feature_spawn_chance = 0.1 - feature_spawn_list = list(/obj/item/rod_of_asclepius = 1) + feature_spawn_chance = 2 + feature_spawn_list = list( + /obj/item/rod_of_asclepius = 1, + /obj/effect/survey_point = 100 + ) diff --git a/code/datums/mapgen/planetary/LavaGenerator.dm b/code/datums/mapgen/planetary/LavaGenerator.dm index 6e6d4d898ac1..806bed5d5dc6 100644 --- a/code/datums/mapgen/planetary/LavaGenerator.dm +++ b/code/datums/mapgen/planetary/LavaGenerator.dm @@ -94,12 +94,13 @@ /obj/structure/flora/ash/fireblossom = 1, /obj/structure/flora/ash/puce = 5, ) - feature_spawn_chance = 0.3 + feature_spawn_chance = 1 feature_spawn_list = list( - /obj/structure/flora/rock/hell = 10, - /obj/structure/elite_tumor = 2, - /obj/structure/geyser/random = 2, - /obj/effect/spawner/lootdrop/anomaly/lava = 1, + /obj/effect/survey_point = 30, + /obj/structure/flora/rock/hell = 50, + /obj/structure/elite_tumor = 10, + /obj/structure/geyser/random = 10, + /obj/effect/spawner/lootdrop/anomaly/lava = 5 ) mob_spawn_chance = 4 @@ -157,11 +158,12 @@ open_turf_types = list( /turf/open/floor/plating/grass/lava = 50 ) - feature_spawn_chance = 5 + feature_spawn_chance = 10 feature_spawn_list = list( - /obj/structure/flora/tree/dead/barren = 50, - /obj/structure/flora/tree/dead/tall/grey = 45, - /obj/effect/spawner/lootdrop/anomaly/lava = 5 + /obj/structure/flora/tree/dead/barren = 10, + /obj/structure/flora/tree/dead/tall/grey = 10, + /obj/effect/survey_point = 5, + /obj/effect/spawner/lootdrop/anomaly/lava = 1 ) /datum/biome/lavaland/plains/dense/mixed @@ -246,6 +248,10 @@ /obj/structure/flora/ash/fern = 2, /obj/structure/flora/ash/puce = 2 ) + feature_spawn_chance = 2 + feature_spawn_list = list( + /obj/effect/survey_point = 1 + ) /datum/biome/cave/lavaland/rocky open_turf_types = list(/turf/open/floor/plating/asteroid/purple = 1) @@ -270,5 +276,5 @@ /datum/biome/cave/lavaland/lava open_turf_types = list(/turf/open/lava/smooth/lava_land_surface = 1) - feature_spawn_chance = 1 + feature_spawn_chance = 2 feature_spawn_list = list(/obj/structure/flora/rock/pile/lava = 1) diff --git a/code/datums/mapgen/planetary/RockGenerator.dm b/code/datums/mapgen/planetary/RockGenerator.dm index 61578c7a3ace..502b45fbffe5 100644 --- a/code/datums/mapgen/planetary/RockGenerator.dm +++ b/code/datums/mapgen/planetary/RockGenerator.dm @@ -83,10 +83,11 @@ /datum/biome/rock open_turf_types = list(/turf/open/floor/plating/asteroid/rockplanet/lit = 1) - feature_spawn_chance = 0.25 + feature_spawn_chance = 0.2 feature_spawn_list = list( - /obj/structure/geyser/random = 80, - /obj/structure/elite_tumor = 40, + /obj/structure/geyser/random = 10, + /obj/structure/elite_tumor = 20, + /obj/effect/survey_point = 40, /obj/effect/spawner/lootdrop/anomaly/rock = 10, /obj/effect/spawner/lootdrop/anomaly/big = 1 //get out of here stalker ) @@ -145,10 +146,12 @@ /obj/structure/flora/ash/fern = 2, /obj/structure/flora/ash/puce = 1, ) - feature_spawn_chance = 0.5 + feature_spawn_chance = 1 feature_spawn_list = list( - /obj/structure/geyser/random = 2, - /obj/structure/elite_tumor = 1, + /obj/structure/geyser/random = 1, + /obj/structure/elite_tumor = 2, + /obj/structure/spawner/ice_moon/rockplanet = 4, + /obj/effect/survey_point = 4, /obj/structure/spawner/ice_moon/rockplanet = 4, /obj/effect/spawner/lootdrop/anomaly/rock/cave = 1, ) diff --git a/code/datums/mapgen/planetary/SandGenerator.dm b/code/datums/mapgen/planetary/SandGenerator.dm index e50223744a7c..fc6ddf7b9a4f 100644 --- a/code/datums/mapgen/planetary/SandGenerator.dm +++ b/code/datums/mapgen/planetary/SandGenerator.dm @@ -89,11 +89,12 @@ /obj/structure/flora/ash/cap_shroom = 4 , /obj/structure/flora/ash/stem_shroom = 4 , ) - feature_spawn_chance = 0.1 + feature_spawn_chance = 0.2 feature_spawn_list = list( - /obj/structure/geyser/random = 8, - /obj/structure/elite_tumor = 4, - /obj/effect/spawner/lootdrop/anomaly/sand = 1, + /obj/structure/geyser/random = 1, + /obj/structure/elite_tumor = 2, + /obj/effect/survey_point = 4, + /obj/effect/spawner/lootdrop/anomaly/sand = 1, ) mob_spawn_chance = 4 mob_spawn_list = list( @@ -192,9 +193,10 @@ /obj/structure/flora/ash/puce = 1, ) feature_spawn_list = list( - /obj/structure/geyser/random = 4, - /obj/structure/elite_tumor = 4, - /obj/effect/spawner/lootdrop/anomaly/sand/cave = 1 + /obj/structure/geyser/random = 1, + /obj/structure/elite_tumor = 2, + /obj/effect/survey_point = 4, + /obj/effect/spawner/lootdrop/anomaly/sand/cave = 1 ) mob_spawn_chance = 4 mob_spawn_list = list( diff --git a/code/datums/mapgen/planetary/SnowGenerator.dm b/code/datums/mapgen/planetary/SnowGenerator.dm index 05661009b52d..5c0c54c8aeb4 100644 --- a/code/datums/mapgen/planetary/SnowGenerator.dm +++ b/code/datums/mapgen/planetary/SnowGenerator.dm @@ -110,12 +110,13 @@ /mob/living/simple_animal/hostile/asteroid/ice_whelp = 10, /mob/living/simple_animal/hostile/asteroid/lobstrosity = 10, ) - feature_spawn_chance = 0.1 + feature_spawn_chance = 0.2 feature_spawn_list = list( + /obj/effect/survey_point = 50, /obj/effect/spawner/lootdrop/anomaly/ice = 12, /obj/effect/spawner/lootdrop/anomaly/big = 1, /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 25, - /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 50, + /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 25, /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 13 ) @@ -162,12 +163,13 @@ open_turf_types = list( /turf/open/floor/plating/asteroid/snow/lit = 1 ) - feature_spawn_chance = 0.1 + feature_spawn_chance = 0.2 feature_spawn_list = list( /obj/structure/spawner/ice_moon = 3, /obj/structure/spawner/ice_moon/polarbear = 3, /obj/structure/statue/snow/snowman = 3, - /obj/structure/statue/snow/snowlegion = 1 + /obj/structure/statue/snow/snowlegion = 1, + /obj/effect/survey_point = 4 ) mob_spawn_list = list( /mob/living/simple_animal/hostile/asteroid/wolf/random = 30, @@ -205,13 +207,14 @@ /mob/living/simple_animal/hostile/asteroid/ice_whelp = 5, /mob/living/simple_animal/hostile/asteroid/lobstrosity = 5, ) - feature_spawn_chance = 0.3 + feature_spawn_chance = 0.6 feature_spawn_list = list( - /obj/effect/spawner/lootdrop/anomaly/ice = 100, + /obj/effect/survey_point = 50, + /obj/effect/spawner/lootdrop/anomaly/ice = 10, /obj/effect/spawner/lootdrop/anomaly/big = 1, - /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 300, - /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 500, - /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 50, + /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 30, + /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 50, + /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 5, /obj/structure/spawner/ice_moon/demonic_portal/extreme_threat = 1 ) @@ -258,8 +261,9 @@ /mob/living/simple_animal/hostile/asteroid/ice_whelp = 5, /mob/living/simple_animal/hostile/asteroid/lobstrosity = 10, ) - feature_spawn_chance = 0.2 + feature_spawn_chance = 0.4 feature_spawn_list = list( + /obj/effect/survey_point = 4, /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 30, /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 50, /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 6, @@ -309,7 +313,17 @@ /obj/structure/flora/ash/cap_shroom = 1, /obj/structure/flora/ash/stem_shroom = 1, ) - feature_spawn_chance = 0.2 + feature_spawn_chance = 0.4 + feature_spawn_list = list( + /obj/effect/survey_point = 4, + /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 30, + /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 50, + /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 6, + /obj/structure/spawner/ice_moon/demonic_portal/extreme_threat = 2, + /obj/structure/spawner/ice_moon = 30, + /obj/structure/spawner/ice_moon/polarbear = 30, + /obj/effect/spawner/lootdrop/anomaly/ice/cave = 10 + ) /datum/biome/cave/volcanic/lava open_turf_types = list( diff --git a/code/datums/mapgen/planetary/WasteGenerator.dm b/code/datums/mapgen/planetary/WasteGenerator.dm index d0243740bc3b..f55432cba8c8 100644 --- a/code/datums/mapgen/planetary/WasteGenerator.dm +++ b/code/datums/mapgen/planetary/WasteGenerator.dm @@ -132,6 +132,7 @@ /obj/effect/radiation/waste = 30, /obj/effect/radiation/waste/intense = 10, /obj/structure/geyser/random = 1, + /obj/effect/survey_point = 10, /obj/effect/spawner/lootdrop/anomaly/waste = 1 ) @@ -148,7 +149,7 @@ ) flora_spawn_chance = 25 - feature_spawn_chance = 0.5 + feature_spawn_chance = 1 mob_spawn_chance = 2 /datum/biome/waste/crater @@ -179,7 +180,7 @@ /datum/biome/waste/clearing flora_spawn_chance = 20 - feature_spawn_chance = 2 + feature_spawn_chance = 4 /datum/biome/waste/clearing/mushroom flora_spawn_list = list( @@ -315,6 +316,7 @@ /obj/effect/radiation/waste = 30, /obj/effect/radiation/waste/intense = 10, /obj/structure/geyser/random = 1, + /obj/effect/survey_point = 10, /obj/effect/spawner/lootdrop/anomaly/waste/cave = 1 ) mob_spawn_list = list( @@ -328,7 +330,7 @@ ) flora_spawn_chance = 30 - feature_spawn_chance = 4 + feature_spawn_chance = 8 mob_spawn_chance = 5 /datum/biome/cave/waste/tar_bed //tar colorings here diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm index 3c8340bb284b..9670ae68933a 100644 --- a/code/game/objects/effects/anomalies/_anomalies.dm +++ b/code/game/objects/effects/anomalies/_anomalies.dm @@ -15,11 +15,12 @@ var/lifespan = 990 var/death_time - var/research_value //for anomaly effects, range is how far the effects can reach, the cooldown lets us wire in effects that happen every pulse delay seconds var/effectrange = 6 + var/anomalyResearchValueMult = 1 + COOLDOWN_DECLARE(pulse_cooldown) COOLDOWN_DECLARE(pulse_secondary_cooldown) var/pulse_delay = 15 SECONDS @@ -42,7 +43,6 @@ if (!impact_area) return INITIALIZE_HINT_QDEL - research_value = rand(500,4000) pulse_delay = rand(pulse_delay*0.5, pulse_delay*1.5) src.drops_core = drops_core @@ -50,7 +50,7 @@ aSignal = new aSignal(src) aSignal.code = rand(1,100) aSignal.anomaly_type = type - aSignal.research = rand(500,4000) + aSignal.research = rand(1000,4000) * anomalyResearchValueMult var/frequency = rand(MIN_FREE_FREQ, MAX_FREE_FREQ) if(ISMULTIPLE(frequency, 2))//signaller frequencies are always uneven! @@ -132,12 +132,21 @@ /obj/effect/anomaly/attackby(obj/item/weapon, mob/user, params) if(weapon.tool_behaviour == TOOL_ANALYZER && aSignal) + if(istype(weapon, /obj/item/attachment/survey_scanner)) //I'm sure there's a better way to do this. + to_chat(user, span_notice("You analyze [src].")) + to_chat(user, span_notice("[src]'s primary field is fluctuating along frequency [format_frequency(aSignal.frequency)], code [aSignal.code].")) + if(bSignal) + to_chat(user, span_notice("A second field is fluctuating along [format_frequency(bSignal.frequency)], code [bSignal.code]. It is highly unstable." )) + return TRUE to_chat(user, span_notice("You start analyzing [src].")) if(do_after(user, 20, TRUE, src)) to_chat(user, span_notice("[src]'s primary field is fluctuating along frequency [format_frequency(aSignal.frequency)], code [aSignal.code].")) if(bSignal) to_chat(user, span_notice("A second field is fluctuating along [format_frequency(bSignal.frequency)], code [bSignal.code]. It is highly unstable." )) - return TRUE + return TRUE + + + return ..() @@ -145,7 +154,7 @@ /obj/effect/anomaly/examine(mob/user) . = ..() if(user.research_scanner == TRUE) - to_chat(user, span_notice("If harvested, this anomaly would be worth [research_value] research points.")) + to_chat(user, span_notice("If harvested, this anomaly would be worth [aSignal.research] research points.")) /obj/effect/anomaly/throw_atom_into_space() qdel(src) diff --git a/code/game/objects/effects/survey_points.dm b/code/game/objects/effects/survey_points.dm new file mode 100644 index 000000000000..2ee82f5e7880 --- /dev/null +++ b/code/game/objects/effects/survey_points.dm @@ -0,0 +1,76 @@ +GLOBAL_LIST_EMPTY(active_survey_points) + +/obj/effect/survey_point //sure effects shouldn't be attackable, sue me. + name = "Survey Point" + desc = "A location of particular survey value." + icon = 'icons/effects/landmarks_static.dmi' + icon_state = "generic_event" + invisibility = INVISIBILITY_OBSERVER + alpha = 50 + var/research_value + +/obj/effect/survey_point/Initialize() + . = ..() + GLOB.active_survey_points += src + research_value = rand(750, 2000) + +/obj/effect/survey_point/examine(mob/user) + . = ..() + if(user.research_scanner) + to_chat(user, "This survey point appears to be worth [research_value] research points") + +/obj/effect/survey_point/attackby(obj/item/item, mob/user, params) + if(ispath(/obj/item/attachment/survey_scanner)) + var/obj/item/attachment/survey_scanner/scangler = item + if(scangler.active) + return + + var/turf/user_turf = get_turf(user) + + if(!scangler.pack.powered) + to_chat(user, "Insufficient power to scan [src]") + return + + to_chat(user, "You begin to scan [src] with [scangler].") + scangler.active = TRUE + + if(do_after(user, scangler.survey_delay, TRUE)) //note to self: refactor this into 3 procs - an attack by, do_scan, and drop_reward + flick(icon_state + "-print", item) + playsound(src, 'sound/machines/whirr_beep.ogg', 20) + user_turf.visible_message("Data recorded and enscribed to research packet.") + scangler.active = FALSE + scangler.pack.deductcharge(scangler.usecost) + drop_loot(user) + qdel(src) + else + flick(icon_state + "-corrupted", item) + playsound(src, 'sound/machines/buzz-sigh.ogg', 20) + user_turf.visible_message("Warning: Results corrupted. Attempt scan again.") + scangler.active = FALSE + return + +/obj/effect/survey_point/proc/drop_loot(mob/user) + var/obj/item/result = new /obj/item/research_notes(null, research_value, pick(list( + "geographic analysis", + "soil composition", + "atmospheric deviation", + "planetary survey", + "background radiation levels", + "watertable readings", + "biohazard potential", + "plasma density", + "ore vein potential", + "fauna protein analysis", + "fern probablity index", + "carcinization threshold" + ))) + var/obj/item/research_notes/notes = locate() in get_turf(user) + if(notes) + notes.merge(result) + else if(!user.put_in_hands(result) && istype(user.get_inactive_held_item(), /obj/item/research_notes)) + var/obj/item/research_notes/research = user.get_inactive_held_item() + research.merge(result) + +/obj/effect/survey_point/Destroy() + . = ..() + GLOB.active_survey_points -= src diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 6f11fe4ebac1..bb61ab2ef9af 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -475,12 +475,9 @@ GENE SCANNER var/n2_concentration = environment.get_moles(GAS_N2)/total_moles var/co2_concentration = environment.get_moles(GAS_CO2)/total_moles var/plasma_concentration = environment.get_moles(GAS_PLASMA)/total_moles - - //WS Start -- Atmos Analyzer Reformat (Issue #419) to_chat(user, "Results of analysis.") to_chat(user, "Pressure: [round(pressure,0.01)] kPa") to_chat(user, "Temperature: [round(environment.return_temperature()-T0C, 0.01)] °C ([round(environment.return_temperature(), 0.01)] K)") - //WS End if(abs(n2_concentration - N2STANDARD) < 20) to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_N2), 0.01)] mol)") @@ -508,68 +505,6 @@ GENE SCANNER var/gas_concentration = environment.get_moles(id)/total_moles to_chat(user, "[GLOB.gas_data.names[id]]: [round(gas_concentration*100, 0.01)] % ([round(environment.get_moles(id), 0.01)] mol)") -/obj/item/analyzer/AltClick(mob/user) //Barometer output for measuring when the next storm happens - ..() - - if(user.canUseTopic(src, BE_CLOSE)) - if(cooldown) - to_chat(user, "[src]'s barometer function is preparing itself.") - return - - var/turf/T = get_turf(user) - if(!T) - return - - var/datum/weather_controller/weather_controller = SSmapping.get_map_zone_weather_controller(T) - playsound(src, 'sound/effects/pop.ogg', 100) - var/area/user_area = T.loc - var/datum/weather/ongoing_weather = null - - if(!user_area.outdoors) - to_chat(user, "[src]'s barometer function won't work indoors!") - return - - if(weather_controller.current_weathers) - for(var/datum/weather/W as anything in weather_controller.current_weathers) - if(W.barometer_predictable && W.my_controller.mapzone.is_in_bounds(T) && W.area_type == user_area.type && !(W.stage == END_STAGE)) - ongoing_weather = W - break - - if(ongoing_weather) - if((ongoing_weather.stage == MAIN_STAGE) || (ongoing_weather.stage == WIND_DOWN_STAGE)) - to_chat(user, "[src]'s barometer function can't trace anything while the storm is [ongoing_weather.stage == MAIN_STAGE ? "already here!" : "winding down."]") - return - - if(ongoing_weather.aesthetic) - to_chat(user, "[src]'s barometer function says that the next storm will breeze on by.") - else - var/next_hit = weather_controller.next_weather - var/fixed = next_hit - world.time - if(fixed <= 0) - to_chat(user, "[src]'s barometer function was unable to trace any weather patterns.") - else - to_chat(user, "[src]'s barometer function says a storm will land in approximately [butchertime(fixed)].") - cooldown = TRUE - addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/analyzer, ping)), cooldown_time) - -/obj/item/analyzer/proc/ping() - if(isliving(loc)) - var/mob/living/L = loc - to_chat(L, "[src]'s barometer function is ready!") - playsound(src, 'sound/machines/click.ogg', 100) - cooldown = FALSE - -/obj/item/analyzer/proc/butchertime(amount) - if(!amount) - return - if(accuracy) - var/inaccurate = round(accuracy*(1/3)) - if(prob(50)) - amount -= inaccurate - if(prob(50)) - amount += inaccurate - return DisplayTimeText(max(1,amount)) - /proc/atmosanalyzer_scan(mob/user, atom/target, silent=FALSE) var/mixture = target.return_analyzable_air() if(!mixture) @@ -594,12 +529,10 @@ GENE SCANNER var/cached_scan_results = air_contents.analyzer_results if(total_moles > 0) - //WS Start -- Atmos Analyzer Reformat (Issue #419) render_list += "Moles: [round(total_moles, 0.01)] mol\ \nVolume: [volume] L\ \nPressure: [round(pressure,0.01)] kPa\ \nTemperature: [round(temperature - T0C,0.01)] °C ([round(temperature, 0.01)] K)" - //WS End for(var/id in air_contents.get_gases()) var/gas_concentration = air_contents.get_moles(id)/total_moles diff --git a/code/game/objects/items/gear_packs.dm b/code/game/objects/items/gear_packs.dm new file mode 100644 index 000000000000..91dd7747c584 --- /dev/null +++ b/code/game/objects/items/gear_packs.dm @@ -0,0 +1,285 @@ +/obj/item/gear_pack + name = "gear pack" + desc = "A large backpack that usually holds things" + icon = 'icons/obj/hydroponics/equipment.dmi' + icon_state = "waterbackpack" + item_state = "waterbackpack" + lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi' + w_class = WEIGHT_CLASS_HUGE + slot_flags = ITEM_SLOT_BACK + item_flags = SLOWS_WHILE_IN_HAND + max_integrity = 300 + slowdown = 1 + drag_slowdown = 1 + actions_types = list(/datum/action/item_action/toggle_attachment) + max_integrity = 200 + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) + resistance_flags = FIRE_PROOF + var/on = FALSE + var/obj/item/stock_parts/cell/cell + var/preload_cell_type = /obj/item/stock_parts/cell/high + var/powered = FALSE + var/activate_sound = "sparks" + var/obj/item/attachment/attachment_type = /obj/item/attachment + var/obj/item/attachment/attachment + +/obj/item/gear_pack/get_cell() + return cell + +/obj/item/gear_pack/Initialize() + . = ..() + drag_slowdown = slowdown + attachment = new attachment_type(src) + cell = new(src) + update_power() + return + +/obj/item/gear_pack/examine(mob/user) + . = ..() + . += "It is [ on ? "currently" : "not"] active." + if(cell) + . += " A small readout reports [PERCENT(cell.charge / cell.maxcharge)]% charge." + +/obj/item/gear_pack/fire_act(exposed_temperature, exposed_volume) + . = ..() + if(attachment?.loc == src) + attachment.fire_act(exposed_temperature, exposed_volume) + +/obj/item/gear_pack/extinguish() + . = ..() + if(attachment?.loc == src) + attachment.extinguish() + +/obj/item/gear_pack/proc/update_power() + if(!QDELETED(cell)) + if(QDELETED(attachment) || cell.charge < attachment.usecost) + powered = FALSE + else + powered = TRUE + else + powered = FALSE + update_icon() + +/obj/item/gear_pack/update_overlays() + . = ..() + + if(!on) + . += "[initial(icon_state)]-attachment" + if(powered) + . += "[initial(icon_state)]-powered" + if(!QDELETED(cell)) + var/ratio = cell.charge / cell.maxcharge + ratio = CEILING(ratio*4, 1) * 25 + . += "[initial(icon_state)]-charge[ratio]" + if(!cell) + . += "[initial(icon_state)]-nocell" + +/obj/item/gear_pack/CheckParts(list/parts_list) + ..() + cell = locate(/obj/item/stock_parts/cell) in contents + update_power() + +/obj/item/gear_pack/ui_action_click() + toggle_attachment() + +//ATTACK HAND IGNORING PARENT RETURN VALUE +/obj/item/gear_pack/attack_hand(mob/user) + if(loc == user) + if(slot_flags == ITEM_SLOT_BACK) + if(user.get_item_by_slot(ITEM_SLOT_BACK) == src) + ui_action_click() + else + to_chat(user, "Put the [src] on your back first!") + + else if(slot_flags == ITEM_SLOT_BELT) + if(user.get_item_by_slot(ITEM_SLOT_BELT) == src) + ui_action_click() + else + to_chat(user, "Strap the [src]'s belt on first!") + return + return ..() + +/obj/item/gear_pack/MouseDrop(obj/over_object) + . = ..() + if(ismob(loc)) + var/mob/M = loc + if(!M.incapacitated() && istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object + M.putItemFromInventoryInHandIfPossible(src, H.held_index) + +/obj/item/gear_pack/attackby(obj/item/W, mob/user, params) + if(W == attachment) + toggle_attachment() + else if(istype(W, /obj/item/stock_parts/cell)) + var/obj/item/stock_parts/cell/C = W + if(cell) + to_chat(user, "[src] already has a cell!") + else + if(C.maxcharge < attachment.usecost) + to_chat(user, "[src] requires a higher capacity cell.") + return + if(!user.transferItemToLoc(W, src)) + return + cell = W + to_chat(user, "You install a cell in [src].") + update_power() + + else if(W.tool_behaviour == TOOL_SCREWDRIVER) + if(cell) + cell.update_icon() + cell.forceMove(get_turf(src)) + cell = null + to_chat(user, "You remove the cell from [src].") + update_power() + else + return ..() + +/obj/item/gear_pack/emp_act(severity) + . = ..() + if(cell && !(. & EMP_PROTECT_CONTENTS)) + deductcharge(1000 / severity) + if(. & EMP_PROTECT_SELF) + return + update_power() + +/obj/item/gear_pack/proc/toggle_attachment() + set name = "Toggle Attachment" + set category = "Object" + on = !on + + var/mob/living/carbon/user = usr + if(on) + //Detach the attachment into the user's hands + playsound(src, 'sound/items/handling/multitool_pickup.ogg', 100) + if(!usr.put_in_hands(attachment)) + on = FALSE + to_chat(user, "You need a free hand to hold the [attachment]!") + update_power() + return + else + //Remove from their hands and back onto the gear pack + remove_attachment(user) + + update_power() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + + +/obj/item/gear_pack/equipped(mob/user, slot) + ..() + if((slot_flags == ITEM_SLOT_BACK && slot != ITEM_SLOT_BACK) || (slot_flags == ITEM_SLOT_BELT && slot != ITEM_SLOT_BELT)) + remove_attachment(user) + update_power() + +/obj/item/gear_pack/item_action_slot_check(slot, mob/user) + if(slot == user.getBackSlot()) + return 1 + +/obj/item/gear_pack/proc/remove_attachment(mob/user) + if(ismob(attachment.loc)) + var/mob/M = attachment.loc + M.dropItemToGround(attachment, TRUE) + return + +/obj/item/gear_pack/Destroy() + if(on) + var/M = get(attachment, /mob) + remove_attachment(M) + QDEL_NULL(attachment) + QDEL_NULL(cell) + return ..() + +/obj/item/gear_pack/proc/deductcharge(chrgdeductamt) + if(cell) + if(cell.charge < (attachment.usecost+chrgdeductamt)) + powered = FALSE + update_power() + if(cell.use(chrgdeductamt)) + update_power() + return TRUE + else + return FALSE + +/obj/item/attachment + + name = "attachment" + desc = "The Attachment." + icon = 'icons/obj/hydroponics/equipment.dmi' + icon_state = "mister" + item_state = "mister" + lefthand_file = 'icons/mob/inhands/equipment/mister_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/mister_righthand.dmi' + + force = 0 + throwforce = 6 + w_class = WEIGHT_CLASS_BULKY + resistance_flags = INDESTRUCTIBLE + base_icon_state = "mister" + + var/req_pack = TRUE + var/usecost = 1000 + var/obj/item/gear_pack/pack + +/obj/item/attachment/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NO_STORAGE_INSERT, GENERIC_ITEM_TRAIT) + if (!loc || !istype(loc, /obj/item/gear_pack)) + return INITIALIZE_HINT_QDEL + if(!req_pack) + return + pack = loc + update_icon() + +/obj/item/attachment/Destroy() + pack = null + return ..() + +/obj/item/attachment/equipped(mob/user, slot) + . = ..() + if(!req_pack) + return + RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(check_range)) + +/obj/item/attachment/Moved() + . = ..() + check_range() + + +/obj/item/attachment/fire_act(exposed_temperature, exposed_volume) + . = ..() + if((req_pack && pack) && loc != pack) + pack.fire_act(exposed_temperature, exposed_volume) + +/obj/item/attachment/proc/check_range() + SIGNAL_HANDLER + + if(!req_pack ||!pack) + return + if(!in_range(src,pack)) + var/mob/living/L = loc + if(istype(L)) + to_chat(L, "[pack]'s [src] overextends and comes out of your hands!") + else + visible_message("[src] snaps back into [pack].") + snap_back() + +/obj/item/attachment/dropped(mob/user) + . = ..() + if(!req_pack) + return ..() + if(user) + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) + if(user != loc) + to_chat(user, "[src] snap back into the main unit.") + snap_back() + return + +/obj/item/attachment/proc/snap_back() + if(!pack) + return + playsound() + pack.on = FALSE + forceMove(pack) + pack.update_power() diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index 12f91f99fb8c..ddfd4354e9e9 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -186,6 +186,69 @@ size = "small" return "pinondirect[size]" +//this makes me feel dirty. +/obj/item/pinpointer/survey_data + name = "survey pinpointer" + desc = "A small electronic handheld tuned to detect planetary irregularities" + process_scan = TRUE + +/obj/item/pinpointer/survey_data/proc/trackable(mob/living/user) + var/turf/here = get_turf(src) + if((user.z == 0 || user.virtual_z() == here.virtual_z())) + var/turf/there = get_turf(user) + return (user.z != 0 || (there && ((there.virtual_z() == here.virtual_z())))) + return FALSE + +/obj/item/pinpointer/survey_data/attack_self(mob/living/user) + var/list/possible_targets = list() + if(active) + toggle_on() + user.visible_message("[user] deactivates [user.p_their()] pinpointer.", "You deactivate your pinpointer.") + return + for(var/i in GLOB.active_survey_points) + var/obj/effect/survey_point/my_target = i + if(!trackable(my_target)) + continue + possible_targets += my_target + if(!possible_targets.len) + user.visible_message("[user]'s pinpointer fails to detect a signal.", "Your pinpointer fails to detect a signal.") + return + + target = get_closest_target(possible_targets) + toggle_on() + user.visible_message("[user] activates [user.p_their()] pinpointer.", "You activate your pinpointer.") + +/obj/item/pinpointer/survey_data/proc/get_closest_target(list/targets) + var/final_target + for(var/obj/effect/survey_point/targetee in targets) + if(targetee) + if(get_dist(src,targetee) < get_dist(src,final_target)) + final_target = targetee + return final_target + return FALSE + +/obj/item/pinpointer/survey_data/get_direction_icon(here, there) + var/size = "" + if(here == there) + size = "alert" + else + switch(get_dist(here, there)) + if(1 to 2) + size = "xtrlarge" + if(3 to 8) + size = "large" + //9 through 16 use the normal pinion, "pinondirect" + if(17 to INFINITY) + size = "small" + return "pinondirect[size]" + +/obj/item/pinpointer/survey_data/process() + if(get_closest_target() == FALSE) + target = null + toggle_on() + to_chat("[src] deactivates suddenly, the area must be fully surveyed!") + . = ..() + /obj/item/pinpointer/pair name = "pair pinpointer" desc = "A handheld tracking device that locks onto its other half of the matching pair." diff --git a/code/game/objects/items/survery_handheld.dm b/code/game/objects/items/survery_handheld.dm index 79523b574030..ec0c3c42aa15 100644 --- a/code/game/objects/items/survery_handheld.dm +++ b/code/game/objects/items/survery_handheld.dm @@ -1,136 +1,124 @@ -/obj/item/survey_handheld - name = "Survey Handheld" - desc = "A small tool designed for quick and inefficient data collection about your local star sector." +/obj/item/gear_pack/survey_pack + name = "Survey Pack" + desc = "A large scientific kit designed for planetary survey." icon = 'icons/obj/item/survey_handheld.dmi' icon_state = "survey" - var/static/list/z_active = list() - var/static/list/z_history = list() - var/active = FALSE - var/survey_value = 300 + item_state = "survey" + lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi' + attachment_type = /obj/item/attachment/survey_scanner + slowdown = 1 + var/survey_mult = 1 var/survey_delay = 4 SECONDS -/obj/item/survey_handheld/advanced - name = "Advanced Survey Handheld" - desc = "An improved version of its predecessor this tool collects large amounts of data." +/obj/item/gear_pack/survey_pack/advanced //can be purchased, is Expendy. + name = "Advanced Survey Pack" + desc = "A high tech piece of scientific kit designed for thorough planetary survey." icon_state = "survey-adv" - survey_value = 450 + survey_mult = 1.5 + slowdown = 0.8 + +/obj/item/gear_pack/survey_pack/advanced/nt + name = "Nanotrasen Survey Pack" + desc = "A large, high tech piece of Nanotrasen kit, designed for mining survey." + icon_state = "survey-nt" + survey_mult = 1.6 survey_delay = 3 SECONDS + slowdown = 0.5 -/obj/item/survey_handheld/elite - name = "Experimental Survey Handheld" - desc = "An improvement on even the Advanced version; this handheld was designed to be extremely fast in collecting data." +/obj/item/gear_pack/survey_pack/Experimental //these should never be purchasable or manufacturable, loot only. + name = "Experimental Survey Pack" + desc = "An experimental survey pack, capable of analyzing entire regions in seconds." icon_state = "survey-elite" - survey_value = 650 + survey_mult = 2 survey_delay = 2 SECONDS + slowdown = 0.6 -/obj/item/survey_handheld/attack_self(mob/user) - if(active) - return - - var/turf/src_turf = get_turf(src) - var/my_z = "[virtual_z()]" - if(z_active[my_z]) - flick(icon_state + "-corrupted", src) - playsound(src, 'sound/machines/buzz-sigh.ogg', 20) - src_turf.visible_message("Warning: interference detected in current sector") +/obj/item/attachment/survey_scanner + name = "survey scanner" + desc = "A wired tool designed to work in tandem with a survey pack" + w_class = WEIGHT_CLASS_BULKY + icon = 'icons/obj/item/survey_handheld.dmi' + icon_state = "survey-att" + lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi' + pack = /obj/item/gear_pack/survey_pack + tool_behaviour = TOOL_ANALYZER + usecost = 100 + var/survey_mult + var/survey_delay + var/active + var/cooldown = FALSE + var/cooldown_time + +/obj/item/attachment/survey_scanner/New(loc, ...) + . = ..() + survey_mult = pack?:survey_mult + survey_delay = pack?:survey_delay + return + +/obj/item/attachment/survey_scanner/attack_self(mob/living/user) + if(src.pack.powered) + user.visible_message("[user] fires a ping off from [src]") + playsound(src, 'sound/effects/ping.ogg', 75) + for(var/obj/effect/survey_point/revealed in orange(1, user)) + revealed.invisibility = 0 //could use an effect but I'm lazy + animate(revealed, alpha = 255,time = 15) + revealed.visible_message("[revealed] reveals itself in a short burst of energy!") + src.pack.deductcharge(usecost / 2) + return + else + to_chat(user," [src.pack] is out of power!") + +/obj/item/attachment/survey_scanner/proc/ping() + if(isliving(loc)) + var/mob/living/L = loc + to_chat(L, "[src]'s barometer function is ready!") + playsound(src, 'sound/machines/click.ogg', 100) + cooldown = FALSE + +/obj/item/attachment/survey_scanner/proc/butchertime(amount) + if(!amount) return - if(!z_history[my_z]) - z_history[my_z] = 1 - - active = TRUE - z_active[my_z] = TRUE - while(user.get_active_held_item() == src) - to_chat(user, "You begin to scan your surroundings with [src].") - - var/penalty = 1 - (z_history[my_z] - 1) * 0.05 // You lose five percent of value and are five percent slower - if(!penalty || penalty < 0.20) // If you are below 20% value, do nothing and abort - flick(icon_state + "-corrupted", src) - playsound(src, 'sound/machines/buzz-sigh.ogg', 20) - src_turf.visible_message("Warning: unable to locate valuable information in current sector.") - break - - if(!do_after_mob(user, list(src), survey_delay / penalty)) - flick(icon_state + "-corrupted", src) - playsound(src, 'sound/machines/buzz-sigh.ogg', 20) - src_turf.visible_message("Warning: results corrupted. Please try again.") - break - - flick(icon_state + "print", src) - playsound(src, 'sound/machines/whirr_beep.ogg', 20) - src_turf.visible_message("Data recorded and enscribed to research packet.") - z_history[my_z]++ - - var/obj/item/result = new /obj/item/research_notes(null, survey_value * penalty, pick(list("astronomy", "physics", "planets", "space"))) - - var/obj/item/research_notes/notes = locate() in get_turf(user) - if(notes) - notes.merge(result) - else if(!user.put_in_hands(result) && istype(user.get_inactive_held_item(), /obj/item/research_notes)) - var/obj/item/research_notes/research = user.get_inactive_held_item() - research.merge(result) - continue - - active = FALSE - z_active[my_z] = FALSE - -/datum/design/survey_handheld - name = "Survey Handheld" - id = "survey-handheld" - build_type = AUTOLATHE - build_path = /obj/item/survey_handheld - materials = list( - /datum/material/iron = 2000, - /datum/material/glass = 1000, - ) - category = list("initial", "Tools") - -/datum/design/survey_handheld_advanced - name = "Advanced Survey Handheld" - id = "survey-handheld-advanced" - build_type = PROTOLATHE - build_path = /obj/item/survey_handheld/advanced - materials = list( - /datum/material/iron = 3000, - /datum/material/glass = 2000, - /datum/material/gold = 2000, - ) - category = list("Tool Designs") - -/datum/design/survey_handheld_elite - name = "Elite Survey Handheld" - id = "survey-handheld-elite" - build_type = PROTOLATHE - build_path = /obj/item/survey_handheld/elite - materials = list( - /datum/material/iron = 5000, - /datum/material/silver = 5000, - /datum/material/gold = 3000, - /datum/material/uranium = 3000, - /datum/material/diamond = 2000, - ) - category = list("Tool Designs") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - - -/datum/design/survey_handheld_exp - name = "Experimental Survey Handheld" - id = "survey-handheld-exp" - build_type = PROTOLATHE - build_path = /obj/item/survey_handheld/elite - materials = list( - /datum/material/iron = 5000, - /datum/material/silver = 5000, - /datum/material/gold = 3000, - /datum/material/uranium = 3000, - /datum/material/diamond = 3000, - /datum/material/bluespace = 3000, - ) - category = list("Tool Designs") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/obj/structure/anomaly - name = "Defaultic Bind" - desc = "The truly unexpected anomaly. Let a coder know if you see this!" - max_integrity = 300 +/obj/item/attachment/survey_scanner/examine(mob/user) + . = ..() + . += "Alt-click [src] to activate the barometer function." + +/obj/item/attachment/survey_scanner/AltClick(mob/living/user) + ..() + if(user.canUseTopic(src, BE_CLOSE)) + if(cooldown) + to_chat(user, "[src]'s barometer function is preparing itself.") + return + var/turf/T = get_turf(user) + if(!T) + return + var/datum/weather_controller/weather_controller = SSmapping.get_map_zone_weather_controller(T) + playsound(src, 'sound/effects/pop.ogg', 100) + var/area/user_area = T.loc + var/datum/weather/ongoing_weather = null + if(!user_area.outdoors) + to_chat(user, "[src]'s barometer function won't work indoors!") + return + if(weather_controller.current_weathers) + for(var/datum/weather/W as anything in weather_controller.current_weathers) + if(W.barometer_predictable && W.my_controller.mapzone.is_in_bounds(T) && W.area_type == user_area.type && !(W.stage == END_STAGE)) + ongoing_weather = W + break + if(ongoing_weather) + if((ongoing_weather.stage == MAIN_STAGE) || (ongoing_weather.stage == WIND_DOWN_STAGE)) + to_chat(user, "[src]'s barometer function can't trace anything while the storm is [ongoing_weather.stage == MAIN_STAGE ? "already here!" : "winding down."]") + return + if(ongoing_weather.aesthetic) + to_chat(user, "[src]'s barometer function says that the next storm will breeze on by.") + else + var/next_hit = weather_controller.next_weather + var/fixed = next_hit - world.time + if(fixed <= 0) + to_chat(user, "[src]'s barometer function was unable to trace any weather patterns.") + else + to_chat(user, "[src]'s barometer function says a storm will land in approximately [butchertime(fixed)].") + cooldown = TRUE + addtimer(CALLBACK(src,/obj/item/attachment/survey_scanner/proc/ping), cooldown_time) diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 0bfac86ee0df..16aa292c92b3 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -259,8 +259,6 @@ desc = "The neutralized core of a melter anomaly. It sizzles and crackles. It'd probably be valuable for research." icon_state = "pyro core" - - /obj/item/assembly/signaler/anomaly/attack_self() return diff --git a/code/modules/cargo/packs/exploration.dm b/code/modules/cargo/packs/exploration.dm index 504b3b4bdbb1..52fdf4ce8cc9 100644 --- a/code/modules/cargo/packs/exploration.dm +++ b/code/modules/cargo/packs/exploration.dm @@ -89,3 +89,22 @@ /obj/item/survivalcapsule, ) +/datum/supply_pack/exploration/scanners + name = "Survey Scanner Kit" + desc = "Contains a Survey Scanner and survey locator, ideal for analyzing the surface of planets." + cost = 1000 + contains = list( + /obj/item/gear_pack/survey_pack, + /obj/item/pinpointer/survey_data + ) + crate_name = "Survey Scanner Kit" + +/datum/supply_pack/exploration/adv_scanner + name = "Advanced Survey Scanner Kit" + desc = "Contains a state of the art Survey Scanner" + cost = 1500 + contains = list( + /obj/item/gear_pack/survey_pack/advanced, + /obj/item/pinpointer/survey_data + ) + crate_name = "Survey Scanner Kit" diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index e590e118c035..5d49f62ffa63 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -663,12 +663,6 @@ surgery = /datum/surgery/advanced/experimental_dissection/exp departmental_flags = DEPARTMENTAL_FLAG_MEDICAL -/datum/design/surgery/experimental_dissection/ext - name = "Extraterrestrial Dissection" - id = "surgery_ext_dissection" - surgery = /datum/surgery/advanced/experimental_dissection/alien - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - /datum/design/surgery/lobotomy name = "Lobotomy" desc = "An invasive surgical procedure which guarantees removal of almost all brain traumas, but might cause another permanent trauma in return." diff --git a/code/modules/research/research_disk.dm b/code/modules/research/research_disk.dm index 5f4fce5fd457..3381eade3b18 100644 --- a/code/modules/research/research_disk.dm +++ b/code/modules/research/research_disk.dm @@ -71,11 +71,11 @@ icon_state = "paper_words" return else if(value >= 100) - name = "notes of [origin_type]" + name = "notes on [origin_type]" icon_state = "paperslip_words" return else - name = "fragmentary data of [origin_type]" + name = "fragmentary data on [origin_type]" icon_state = "scrap" return diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 02f51a1af9db..7b590c1cb32a 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -157,7 +157,7 @@ display_name = "Alien Surgery" description = "Abductors did nothing wrong." prereq_ids = list("exp_surgery", "alientech") - design_ids = list("surgery_brainwashing","surgery_zombie","surgery_heal_combo_upgrade_femto", "surgery_ext_dissection") + design_ids = list("surgery_brainwashing","surgery_zombie","surgery_heal_combo_upgrade_femto") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) export_price = 5000 @@ -168,7 +168,6 @@ description = "Big Data, in space!" prereq_ids = list("base") design_ids = list( - "survey-handheld-advanced", "design_disk_adv" ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) @@ -416,7 +415,6 @@ "mining", "rdcamera", "seccamera", - "survey-handheld-elite", "design_disk_super", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) @@ -447,7 +445,7 @@ display_name = "Computerized Recordkeeping" description = "Organized record databases and how they're used." prereq_ids = list("comptech") - design_ids = list("secdata", "med_data", "prisonmanage", "vendor", "automated_announcement", "survey-handheld-exp", "design_disk_elite") + design_ids = list("secdata", "med_data", "prisonmanage", "vendor", "automated_announcement", "design_disk_elite") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) export_price = 2000 diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm index 7cf752ddf998..44bf8852e24a 100644 --- a/code/modules/surgery/experimental_dissection.dm +++ b/code/modules/surgery/experimental_dissection.dm @@ -1,4 +1,4 @@ -#define BASE_HUMAN_REWARD 500 +#define BASE_HUMAN_REWARD 250 #define EXPDIS_FAIL_MSG "You dissect [target], but do not find anything particularly interesting." #define PUBLIC_TECHWEB_GAIN 0.6 //how many research points go directly into the main pool #define PRIVATE_TECHWEB_GAIN (1 - PUBLIC_TECHWEB_GAIN) //how many research points go directly into the main pool @@ -20,7 +20,7 @@ /datum/surgery/advanced/experimental_dissection/can_start(mob/user, mob/living/target) . = ..() - if(HAS_TRAIT_FROM(target, TRAIT_DISSECTED, "[name]")) + if(HAS_TRAIT(target, TRAIT_DISSECTED)) return FALSE if(target.stat != DEAD) return FALSE @@ -38,7 +38,7 @@ /obj/item/shard = 10)// special tools not only cut down time but also improve probability time = 125 silicons_obey_prob = TRUE - repeatable = TRUE + repeatable = FALSE //If you fuck it up you fuck it up experience_given = 0 //experience recieved scales with what's being dissected + which step you're doing. /datum/surgery_step/dissection/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) @@ -50,22 +50,24 @@ //determine bonus applied if(isalienqueen(target) || isalienroyal(target)) - cost = (BASE_HUMAN_REWARD*38) + cost = (BASE_HUMAN_REWARD*5) else if(isalienadult(target)) - cost = (BASE_HUMAN_REWARD*30) + cost = (BASE_HUMAN_REWARD*4) else if(ismonkey(target)) cost = (BASE_HUMAN_REWARD*0.5) else if(ishuman(target)) var/mob/living/carbon/human/H = target if(H?.dna?.species) if(isabductor(H)) - cost = (BASE_HUMAN_REWARD*24) + cost = (BASE_HUMAN_REWARD*2) else if(isgolem(H) || iszombie(H) || isshadow(H) || isandroid(H)) - cost = (BASE_HUMAN_REWARD*20) + cost = (BASE_HUMAN_REWARD*4) else if(isjellyperson(H) || ispodperson(H) || isalien(H)) - cost = (BASE_HUMAN_REWARD*14) + cost = (BASE_HUMAN_REWARD*6) else if(isskeleton(H)) cost = (BASE_HUMAN_REWARD * 0.5) + else if(ismegafauna(target)) + cost = (BASE_HUMAN_REWARD * 16) else cost = (BASE_HUMAN_REWARD * 0.5) @@ -74,7 +76,7 @@ //now we do math for surgeries already done (no double dipping!). for(var/i in typesof(/datum/surgery/advanced/experimental_dissection)) var/datum/surgery/advanced/experimental_dissection/cringe = new i - if(HAS_TRAIT_FROM(target, TRAIT_DISSECTED, "[cringe.name]")) + if(HAS_TRAIT(target, TRAIT_DISSECTED)) multi_surgery_adjust = max(multi_surgery_adjust, cringe.value_multiplier) //multiply by multiplier in surgery @@ -114,23 +116,16 @@ /datum/surgery/advanced/experimental_dissection/adv name = "Thorough Dissection" - value_multiplier = 2 + value_multiplier = 1.5 replaced_by = /datum/surgery/advanced/experimental_dissection/exp requires_tech = TRUE /datum/surgery/advanced/experimental_dissection/exp name = "Experimental Dissection" - value_multiplier = 4 - replaced_by = /datum/surgery/advanced/experimental_dissection/alien - requires_tech = TRUE - -/datum/surgery/advanced/experimental_dissection/alien - name = "Extraterrestrial Dissection" - value_multiplier = 8 + value_multiplier = 2 requires_tech = TRUE replaced_by = null - #undef BASE_HUMAN_REWARD #undef EXPDIS_FAIL_MSG #undef PUBLIC_TECHWEB_GAIN diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index a82a1e208f85..e9257686024c 100644 Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 360e4cd0f3e4..e1510e5b68d9 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/item/survey_handheld.dmi b/icons/obj/item/survey_handheld.dmi index a15f71f442ad..c009828af1a3 100644 Binary files a/icons/obj/item/survey_handheld.dmi and b/icons/obj/item/survey_handheld.dmi differ diff --git a/shiptest.dme b/shiptest.dme index b39d8c19e544..95af72dc83e3 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1031,6 +1031,7 @@ #include "code\game\objects\effects\spiderperson_web.dm" #include "code\game\objects\effects\spiders.dm" #include "code\game\objects\effects\step_triggers.dm" +#include "code\game\objects\effects\survey_points.dm" #include "code\game\objects\effects\turf_fire.dm" #include "code\game\objects\effects\wanted_poster.dm" #include "code\game\objects\effects\anomalies\_anomalies.dm" @@ -1127,6 +1128,7 @@ #include "code\game\objects\items\extinguisher.dm" #include "code\game\objects\items\fireaxe.dm" #include "code\game\objects\items\flamethrower.dm" +#include "code\game\objects\items\gear_packs.dm" #include "code\game\objects\items\gift.dm" #include "code\game\objects\items\granters.dm" #include "code\game\objects\items\handcuffs.dm"