diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 6f3ac43d0dc..00961dbd7f5 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -160,6 +160,10 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/machinery/airlock_controller/incinerator_atmos{ + pixel_x = -40; + pixel_y = -8 + }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) "aem" = ( @@ -205,8 +209,15 @@ /obj/machinery/atmospherics/components/trinary/filter/flipped/layer2{ dir = 4 }, -/obj/structure/extinguisher_cabinet/directional/north, /obj/machinery/light/small/directional/north, +/obj/machinery/button/door/incinerator_vent_atmos_aux{ + pixel_x = 8; + pixel_y = 24 + }, +/obj/machinery/button/door/incinerator_vent_atmos_main{ + pixel_x = 8; + pixel_y = 36 + }, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "aeX" = ( @@ -531,12 +542,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) -"amT" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation/entertainment) "anb" = ( /obj/effect/turf_decal/siding/thinplating_new/terracotta, /obj/effect/turf_decal/siding/red/corner{ @@ -2661,6 +2666,13 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"baO" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/spawner/random/entertainment/arcade{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "baP" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -4398,6 +4410,7 @@ cycle_id = "atmos_airlock_1" }, /obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron, /area/station/engineering/atmos/office) "bJK" = ( @@ -4942,6 +4955,13 @@ }, /turf/open/space/basic, /area/space/nearstation) +"bWp" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "bWs" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -4950,8 +4970,9 @@ /turf/open/floor/iron, /area/station/science/xenobiology) "bXb" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/electrical) "bXi" = ( @@ -5127,6 +5148,7 @@ /obj/structure/disposalpipe/segment{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron, /area/station/engineering/atmos/office) "cam" = ( @@ -5713,7 +5735,7 @@ dir = 1; name = "Plasma to Pure" }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green{ +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 }, /turf/open/floor/iron, @@ -7328,6 +7350,7 @@ /obj/machinery/door/airlock/engineering/glass{ name = "Engineering Storage" }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/engine_equipment, /turf/open/floor/iron/smooth_half{ dir = 8 }, @@ -7542,6 +7565,12 @@ }, /turf/closed/wall, /area/station/service/library) +"cUB" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "cUH" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -7744,6 +7773,15 @@ /obj/structure/sign/departments/telecomms/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"cYp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "cYt" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -8370,6 +8408,13 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/textured_half, /area/station/commons/fitness/locker_room) +"diG" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/light/small/directional/east, +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "diI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral, @@ -9217,6 +9262,7 @@ /area/station/maintenance/starboard/aft) "dzH" = ( /obj/machinery/portable_atmospherics/canister/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) "dAn" = ( @@ -10708,6 +10754,10 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"efn" = ( +/obj/effect/spawner/random/structure/crate_loot, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "efy" = ( /obj/item/kirbyplants/organic/plant21, /obj/machinery/status_display/ai/directional/west, @@ -10844,13 +10894,6 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) -"ehP" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/machinery/light/small/directional/east, -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation/entertainment) "ehT" = ( /obj/machinery/door/airlock{ id_tag = "commiss2"; @@ -12415,6 +12458,9 @@ "eKd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/machinery/light/small/directional/west, +/obj/machinery/airlock_sensor/incinerator_atmos{ + pixel_y = -20 + }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) "eKf" = ( @@ -12445,9 +12491,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"eKU" = ( -/turf/closed/wall/r_wall/rust, -/area/station/engineering/atmos/pumproom) "eKW" = ( /obj/machinery/door/airlock/maintenance{ name = "Bathroom" @@ -12599,6 +12642,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"eOX" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/item/kirbyplants/random, +/obj/machinery/airalarm/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "eOY" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 4 @@ -12713,13 +12763,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"eRi" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation/entertainment) "eRy" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -14365,9 +14408,7 @@ /area/station/science/xenobiology) "fxp" = ( /obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/simple/orange{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/open/floor/plating, /area/station/engineering/supermatter/room) "fxF" = ( @@ -14425,14 +14466,6 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/plating, /area/station/service/chapel/funeral) -"fyC" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/machinery/light/small/directional/east, -/obj/structure/chair/stool/bar/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation/entertainment) "fyH" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -16479,6 +16512,10 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"ggr" = ( +/obj/item/pickaxe, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "ggw" = ( /obj/effect/turf_decal/stripes/white/end{ dir = 1 @@ -16670,6 +16707,13 @@ }, /turf/open/floor/iron/dark/corner, /area/station/science/xenobiology) +"gjn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "gjE" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt/dust, @@ -16935,15 +16979,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/execution/transfer) -"goY" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "goZ" = ( /obj/structure/rack, /obj/item/clothing/head/costume/papersack/smiley, @@ -18698,13 +18733,6 @@ /obj/structure/sign/departments/cargo/directional/west, /turf/open/floor/iron/dark, /area/station/hallway/primary/central/fore) -"gTa" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation/entertainment) "gTb" = ( /turf/open/floor/iron/dark/side{ dir = 8 @@ -18850,7 +18878,7 @@ dir = 4 }, /turf/closed/wall/r_wall, -/area/station/engineering/atmos/pumproom) +/area/station/maintenance/department/engine/atmos) "gUV" = ( /obj/structure/cable, /obj/structure/chair/stool/directional/south{ @@ -19674,7 +19702,7 @@ dir = 4 }, /turf/closed/wall/r_wall, -/area/station/engineering/atmos/pumproom) +/area/station/maintenance/department/engine/atmos) "hhL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20155,8 +20183,8 @@ }, /area/station/science/lobby) "hqH" = ( -/obj/structure/reagent_dispensers/watertank, /obj/item/reagent_containers/cup/watering_can/wood, +/obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "hqM" = ( @@ -20987,6 +21015,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"hEw" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/light/small/directional/east, +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "hED" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -21060,6 +21096,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) +"hGa" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Atmospherics Tank - Mix" + }, +/turf/open/floor/engine/vacuum, +/area/station/engineering/atmos) "hGb" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/storage) @@ -21869,7 +21911,7 @@ /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, /turf/open/floor/iron, /area/station/engineering/atmos) "hWk" = ( @@ -22194,6 +22236,13 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"ibF" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "ibI" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 8 @@ -23299,7 +23348,7 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ dir = 4 }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, /turf/open/floor/iron, /area/station/engineering/atmos) "itw" = ( @@ -25617,13 +25666,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"jbE" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos) "jbV" = ( /obj/machinery/photocopier, /turf/open/floor/iron/dark, @@ -26678,6 +26720,17 @@ /obj/structure/cable, /turf/open/floor/iron/dark/small, /area/station/command/heads_quarters/captain/private) +"jvm" = ( +/obj/machinery/door/airlock/engineering/glass/critical{ + heat_proof = 1; + name = "Supermatter Chamber" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "jvB" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -27815,7 +27868,7 @@ /obj/machinery/atmospherics/components/binary/pump/off{ name = "O2 To Pure" }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green{ +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 }, /turf/open/floor/iron, @@ -28232,6 +28285,13 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron, /area/station/cargo/storage) +"jTC" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "jTD" = ( /obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ dir = 8 @@ -30964,9 +31024,6 @@ /area/station/maintenance/starboard/fore) "kNv" = ( /obj/machinery/air_sensor/mix_tank, -/obj/machinery/camera/directional/east{ - c_tag = "Atmospherics Tank - Mix" - }, /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) "kNx" = ( @@ -31881,14 +31938,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/textured_half, /area/station/security/brig) -"ldP" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/structure/chair/sofa/bench/right{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation/entertainment) "lee" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -32169,6 +32218,10 @@ /obj/item/camera, /turf/open/floor/iron, /area/station/security/prison/workout) +"lhd" = ( +/obj/structure/water_source/puddle, +/turf/open/floor/grass, +/area/station/security/prison/garden) "lhi" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/button/door/directional/north{ @@ -32323,6 +32376,15 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/rust, /area/station/maintenance/department/engine/atmos) +"ljc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "ljg" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 1 @@ -33213,9 +33275,6 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"lwK" = ( -/turf/closed/wall/r_wall/rust, -/area/station/engineering/atmos/storage) "lwO" = ( /obj/machinery/door/airlock/highsecurity{ name = "Engine Room" @@ -33898,7 +33957,6 @@ "lGO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sink/directional/west, /turf/open/floor/iron, /area/station/security/prison/garden) "lGT" = ( @@ -35503,13 +35561,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/engineering/atmos) -"mgO" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/effect/spawner/random/entertainment/arcade{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation/entertainment) "mgR" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 9 @@ -36634,13 +36685,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"mDb" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/department/electrical) "mDf" = ( /obj/structure/chair/wood{ dir = 8 @@ -37270,10 +37314,6 @@ /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"mMF" = ( -/obj/structure/sign/warning/pods/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/department/electrical) "mMN" = ( /obj/structure/chair/office{ dir = 8 @@ -38028,6 +38068,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/lesser) +"nbN" = ( +/obj/effect/spawner/random/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "ncb" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/wood, @@ -39090,6 +39134,17 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/starboard/aft) +"nuV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "nuY" = ( /obj/structure/broken_flooring/pile/directional/east, /obj/structure/alien/weeds/node, @@ -39850,12 +39905,6 @@ /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/dark, /area/station/medical/medbay/lobby) -"nIF" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/effect/spawner/random/entertainment/arcade, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation/entertainment) "nIJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -39938,9 +39987,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/obj/machinery/atmospherics/pipe/smart/simple/orange{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "nKj" = ( @@ -40892,6 +40939,7 @@ }, /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, +/obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage) "odh" = ( @@ -43190,12 +43238,6 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) -"oTK" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/item/kirbyplants/random, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation/entertainment) "oTM" = ( /obj/structure/table, /obj/effect/turf_decal/siding{ @@ -43420,6 +43462,10 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"oYf" = ( +/obj/machinery/button/ignition/incinerator/atmos, +/turf/closed/wall/r_wall, +/area/station/maintenance/disposal/incinerator) "oYi" = ( /obj/effect/turf_decal/trimline/neutral/line, /obj/effect/turf_decal/trimline/neutral/line{ @@ -44331,6 +44377,7 @@ /area/station/service/chapel) "pnO" = ( /obj/structure/cable, +/obj/machinery/airalarm/directional/south, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "pnQ" = ( @@ -44557,6 +44604,10 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"prd" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/supermatter/room) "prf" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -46119,6 +46170,18 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/engineering/storage/tech) +"pTk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation/entertainment) "pTq" = ( /obj/machinery/door/airlock/maintenance{ name = "Crematorium Maintenance" @@ -46139,6 +46202,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, /area/station/service/lawoffice) +"pTA" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/spawner/random/entertainment/arcade, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "pTZ" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 8 @@ -46454,6 +46523,14 @@ /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/plating, /area/station/hallway/secondary/dock) +"pYi" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "pYr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46936,7 +47013,7 @@ dir = 1; name = "CO2 to Pure" }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green{ +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 }, /turf/open/floor/iron, @@ -47557,14 +47634,6 @@ }, /turf/open/floor/iron/dark/small, /area/station/maintenance/aft) -"qux" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "quO" = ( /obj/structure/reagent_dispensers/wall/peppertank/directional/east, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -49086,13 +49155,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"qUI" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation/entertainment) "qUJ" = ( /obj/effect/turf_decal/bot{ dir = 1 @@ -50650,6 +50712,7 @@ name = "Engine Airlock" }, /obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, /turf/open/floor/plating, /area/station/engineering/supermatter/room) "ruS" = ( @@ -51556,11 +51619,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"rKa" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/structure/chair/stool/bar/directional/north, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation/entertainment) "rKv" = ( /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/iron, @@ -52916,6 +52974,11 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/fore) +"siN" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/chair/stool/bar/directional/north, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "sjl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53429,7 +53492,7 @@ /area/station/maintenance/port/greater) "srw" = ( /turf/closed/wall/r_wall/rust, -/area/station/engineering/atmospherics_engine) +/area/station/maintenance/department/electrical) "srx" = ( /obj/machinery/power/port_gen/pacman, /obj/effect/turf_decal/bot{ @@ -53549,13 +53612,6 @@ dir = 1 }, /area/station/maintenance/department/science/xenobiology) -"stG" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation/entertainment) "stH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/brown/half, @@ -53603,6 +53659,14 @@ }, /turf/open/floor/carpet/purple, /area/station/commons/dorms) +"sue" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "sul" = ( /obj/effect/turf_decal/siding{ dir = 1 @@ -54395,6 +54459,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) +"sJf" = ( +/obj/structure/water_source/puddle, +/turf/open/misc/asteroid, +/area/station/maintenance/starboard/greater) "sJg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/door/airlock/command{ @@ -56170,6 +56238,12 @@ }, /turf/open/misc/sandy_dirt, /area/station/security/tram) +"tlJ" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "tlX" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -56493,6 +56567,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/commons/fitness/recreation) +"tqn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) "tqo" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -56711,18 +56791,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/server) -"tuI" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/commons/fitness/recreation/entertainment) "tuP" = ( /obj/machinery/light/small/directional/east, /obj/item/kirbyplants/random, @@ -58667,6 +58735,9 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/project) +"uct" = ( +/turf/open/floor/engine/vacuum, +/area/station/engineering/atmos) "ucy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/red{ @@ -59941,6 +60012,11 @@ "uvA" = ( /turf/closed/wall/r_wall, /area/station/command/gateway) +"uvG" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/spawner/random/entertainment/arcade, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "uwB" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted{ dir = 4 @@ -60075,11 +60151,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"uAD" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/effect/spawner/random/entertainment/arcade, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation/entertainment) "uAK" = ( /obj/machinery/computer/security, /obj/effect/turf_decal/siding/red{ @@ -60088,19 +60159,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/wood/tile, /area/station/command/bridge) -"uAM" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/closet/firecloset, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "uAY" = ( /turf/open/floor/plating, /area/station/maintenance/department/bridge) @@ -61472,15 +61530,6 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"uXe" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation/entertainment) "uXs" = ( /obj/structure/window/spawner/directional/east, /obj/structure/window/spawner/directional/west, @@ -61717,10 +61766,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"vcm" = ( -/obj/item/pickaxe, -/turf/open/misc/asteroid, -/area/station/maintenance/department/electrical) "vcB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63902,7 +63947,7 @@ /obj/machinery/door/airlock/engineering{ name = "Engineering Office" }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/effect/mapping_helpers/airlock/access/all/engineering/engine_equipment, /turf/open/floor/iron/smooth_half{ dir = 8 }, @@ -65436,14 +65481,6 @@ "wfr" = ( /turf/closed/wall/r_wall, /area/station/medical/pharmacy) -"wfB" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating, -/area/station/maintenance/department/electrical) "wfG" = ( /obj/structure/disposalpipe/segment, /obj/machinery/firealarm/directional/west, @@ -66902,17 +66939,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) -"wDO" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation/entertainment) "wEf" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ @@ -67704,10 +67730,10 @@ /obj/machinery/atmospherics/components/binary/pump/on{ name = "O2 to Airmix" }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green{ +/obj/machinery/light/no_nightlight/directional/north, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 }, -/obj/machinery/light/no_nightlight/directional/north, /turf/open/floor/iron, /area/station/engineering/atmos) "wPP" = ( @@ -68269,13 +68295,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood/tile, /area/station/science/lower) -"wYb" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/item/kirbyplants/random, -/obj/machinery/airalarm/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation/entertainment) "wYd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70298,6 +70317,10 @@ heat_proof = 1; name = "Supermatter Chamber" }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, /turf/open/floor/engine, /area/station/engineering/supermatter) "xAA" = ( @@ -72322,7 +72345,7 @@ /area/station/hallway/primary/starboard) "yei" = ( /obj/machinery/door/airlock/maintenance{ - name = "Transit Tube Station" + name = "Atmospherics Maintenance" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -81899,7 +81922,7 @@ wBo sRf wBo hFO -wBo +oYf mPB wWm nlR @@ -83992,7 +84015,7 @@ kjW fcE ceN cDV -kUN +bNq ybs knv knv @@ -84218,8 +84241,8 @@ wzv wzv fjh dfd -ybO -jbE +pnl +ooo ukP ooo jZl @@ -84230,7 +84253,7 @@ wmq vMI pKW kiP -wmq +tqn dYv jZl feu @@ -84249,7 +84272,7 @@ tKn eWr xcW prP -kUN +bNq ybs knv aJq @@ -84475,7 +84498,7 @@ wzv wzv fjh wzv -ybO +pnl dpH kNv gAy @@ -84506,7 +84529,7 @@ hBi bzF gzM svd -kUN +bNq liX jqd lxP @@ -84732,10 +84755,10 @@ pWm pWm uEH dfd -ybO -ybO -ybO -ybO +pnl +uct +uct +uct jZl bEG rCk @@ -84763,7 +84786,7 @@ isC bPd vDG rry -kUN +bNq olj cmf gBh @@ -84988,11 +85011,11 @@ wzv wzv wzv yil -yil -wfB -kNn -yil -kNn +wzv +pnl +uct +hGa +uct jZl oqq tmK @@ -85020,7 +85043,7 @@ uqg cjS gqS kmL -eKU +ecq olj gBh gBh @@ -85241,15 +85264,15 @@ dDB aWx tdY qcF -wzv +kNn yil xnL yil -pWm -pWm -pWm -mMF -mDb +bXb +pnl +pnl +pnl +pnl srw tXF qaU @@ -85277,7 +85300,7 @@ hMQ tNm nWa iua -kUN +bNq bJK dez gBh @@ -85498,13 +85521,13 @@ pWm pWm pWm pWm -pWm rjo pWm pWm pWm -bvt -bvt +bXb +bXb +bXb bXb yil fTJ @@ -85534,7 +85557,7 @@ kti iwR oQK dFG -kUN +bNq cvJ olj knv @@ -85753,18 +85776,18 @@ dDB dDB tYT aJq -aJq -pWm +gcs ako mmT vtJ acg pWm -bvt -bvt -vcm +efn +wzv +wzv +wzv oii -jZl +pnl sZP wvZ mDS @@ -85791,7 +85814,7 @@ lkN rjw vSt kOH -kUN +bNq cvJ aIk knv @@ -86010,8 +86033,7 @@ dDB dDB tYT aJq -aJq -pWm +gcs arN wOz viE @@ -86019,9 +86041,10 @@ bOa pWm bvt bvt -bvt +nbN +ggr oii -jZl +pnl gmv jrD jrD @@ -86048,7 +86071,7 @@ vuV xLS lfq cHt -kUN +bNq xxt liX knv @@ -86198,7 +86221,7 @@ xjz xjz xjz xjz -dDB +xjz dDB blb blb @@ -86267,8 +86290,7 @@ dDB dDB tYT aJq -aJq -pWm +gcs pWm hDg qMG @@ -86277,17 +86299,18 @@ bvt bvt bvt bvt +bvt yil -jZl +pnl wFZ oLc jDi jDi jDi -jZl +pnl srw -jZl -jZl +pnl +pnl jZl xck cag @@ -86295,17 +86318,17 @@ xck bJH xck cGV -cGV -cGV -lwK -cGV -kUN +bNq +bNq +ecq +bNq +bNq hhr -kUN +bNq gUQ -kUN -kUN -kUN +bNq +bNq +bNq knv tZE knv @@ -86454,7 +86477,7 @@ hJC aHJ wmy tBm -xjz +tBm xjz blb blb @@ -86526,22 +86549,22 @@ dDB tYT aJq bvt -bvt fiw oIf pWm bvt bvt bvt +bvt pWm oii -jZl +pnl jDi jDi jDi jDi jDi -jZl +pnl oCE oCE lYH @@ -86711,7 +86734,7 @@ aWt sis sis sis -tBm +lhd xjz blb dDB @@ -86792,13 +86815,13 @@ bvt bvt pWm yil -jZl +pnl urP kLr wkj tuu kHd -jZl +pnl oCE pWm pWm @@ -87050,11 +87073,11 @@ bvt pWm qjp kNn -jZl -jZl -jZl +pnl +pnl +pnl srw -jZl +pnl tOc oCE pWm @@ -90393,7 +90416,7 @@ szg tpW pUM kMe -kMe +prd fGf ayK izf @@ -91670,7 +91693,7 @@ cBd cBd dyI ozQ -xAx +jvm brA dyI oer @@ -92701,7 +92724,7 @@ buI kjs xUK vni -uAM +nHH lHd nHH xTr @@ -112293,14 +112316,14 @@ fcW jVY cvk nFW -uAD -rKa +uvG +siN jpp -wDO -ldP +nuV +sue jpp -amT -mgO +cUB +baO pzd gMz rem @@ -112550,14 +112573,14 @@ xUy rEd aWb nFW -nIF -fyC -stG -qUI +pTA +hEw +bWp +gjn jpp -eRi -ehP -mgO +ibF +diG +baO pzd ycQ rem @@ -112809,10 +112832,10 @@ nFW nFW pzd pzd -oTK -uXe -gTa -wYb +tlJ +cYp +jTC +eOX pzd xQJ xQJ @@ -113067,7 +113090,7 @@ fsq iRl pzd pzd -tuI +pTk pzd pzd pzd @@ -113324,7 +113347,7 @@ fLg tHi tfc wOp -goY +ljc xQJ ejn vJx @@ -113581,7 +113604,7 @@ pot rUq lyq wOp -goY +ljc xQJ mbV vJx @@ -113838,7 +113861,7 @@ iqi cUY dnk wOp -qux +pYi xXT ihv rdw @@ -129058,7 +129081,7 @@ ylD hqH vzv brz -cgM +sJf ylD wyj dYR diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 54fc0aae2e6..ffb2192c4d0 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -10367,14 +10367,12 @@ /area/station/command/corporate_showroom) "czg" = ( /obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, /obj/item/plant_analyzer, /obj/machinery/camera/directional/east{ c_tag = "Permabrig - Garden"; network = list("ss13","prison") }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, +/turf/open/misc/sandy_dirt, /area/station/security/prison/garden) "czi" = ( /obj/effect/decal/cleanable/dirt, @@ -19576,10 +19574,8 @@ /area/station/engineering/atmos) "eQx" = ( /obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, /obj/item/shovel/spade, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, +/turf/open/misc/sandy_dirt, /area/station/security/prison/garden) "eQB" = ( /obj/machinery/door/airlock/public/glass{ @@ -27494,10 +27490,8 @@ "gLT" = ( /obj/machinery/hydroponics/soil, /obj/item/cultivator, -/obj/effect/decal/cleanable/dirt, /obj/structure/sign/warning/electric_shock/directional/west, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, +/turf/open/misc/sandy_dirt, /area/station/security/prison/garden) "gMd" = ( /obj/structure/window/reinforced/spawner/directional/west, @@ -30810,23 +30804,10 @@ /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) "hHi" = ( -/obj/structure/closet/crate/hydroponics, -/obj/item/paper/guides/jobs/hydroponics, -/obj/item/seeds/onion, -/obj/item/seeds/garlic, -/obj/item/seeds/potato, -/obj/item/seeds/tomato, -/obj/item/seeds/carrot, -/obj/item/seeds/grass, -/obj/item/seeds/ambrosia, -/obj/item/seeds/wheat, -/obj/item/seeds/pumpkin, -/obj/effect/spawner/random/contraband/prison, /obj/structure/window/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/item/seeds/tower, /obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron, +/obj/structure/water_source/puddle, +/turf/open/misc/sandy_dirt, /area/station/security/prison/garden) "hHo" = ( /obj/structure/disposalpipe/trunk, @@ -59536,13 +59517,23 @@ /area/station/service/chapel) "oWp" = ( /obj/structure/window/spawner/directional/south, -/obj/structure/sink/directional/south, -/obj/structure/reagent_dispensers/watertank, -/obj/item/reagent_containers/cup/watering_can, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/closet/crate/hydroponics, +/obj/item/seeds/tower, +/obj/effect/spawner/random/contraband/prison, +/obj/item/seeds/pumpkin, +/obj/item/seeds/wheat, +/obj/item/seeds/ambrosia, +/obj/item/seeds/grass, +/obj/item/seeds/carrot, +/obj/item/seeds/tomato, +/obj/item/seeds/potato, +/obj/item/seeds/garlic, +/obj/item/seeds/onion, +/obj/item/paper/guides/jobs/hydroponics, /turf/open/floor/iron, /area/station/security/prison/garden) "oWt" = ( @@ -78586,11 +78577,9 @@ /area/station/command/corporate_showroom) "tGW" = ( /obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, /obj/item/radio/intercom/directional/east, -/obj/effect/mapping_helpers/burnt_floor, /obj/machinery/light/small/directional/east, -/turf/open/floor/plating, +/turf/open/misc/sandy_dirt, /area/station/security/prison/garden) "tHc" = ( /obj/structure/table/wood/fancy, @@ -79851,10 +79840,8 @@ dir = 1 }, /obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, +/obj/structure/water_source/puddle, +/turf/open/misc/sandy_dirt, /area/station/service/hydroponics/garden) "tXe" = ( /obj/effect/turf_decal/loading_area/red{ @@ -84692,6 +84679,7 @@ /obj/machinery/hydroponics/constructable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/green, +/obj/item/reagent_containers/cup/watering_can, /turf/open/floor/iron, /area/station/security/prison/garden) "veD" = ( @@ -90315,10 +90303,8 @@ "wAt" = ( /obj/machinery/hydroponics/soil, /obj/item/cultivator, -/obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, +/turf/open/misc/sandy_dirt, /area/station/security/prison/garden) "wAz" = ( /obj/structure/table/wood, @@ -91823,11 +91809,9 @@ /area/space) "wVy" = ( /obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/west, -/obj/effect/mapping_helpers/burnt_floor, /obj/structure/sign/poster/contraband/ambrosia_vulgaris/directional/west, -/turf/open/floor/plating, +/turf/open/misc/sandy_dirt, /area/station/security/prison/garden) "wVJ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index f39e285d0eb..b88647d4934 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -7935,15 +7935,6 @@ /obj/structure/sink/kitchen/directional/south, /turf/open/floor/iron, /area/station/service/hydroponics) -"cmh" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) "cmq" = ( /obj/machinery/door/airlock/external{ name = "External Access" @@ -9038,6 +9029,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"cBD" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) "cBG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -17599,14 +17602,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white, /area/mine/living_quarters) -"fjX" = ( -/obj/structure/sink/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison/garden) "fkc" = ( /obj/machinery/power/terminal{ dir = 8 @@ -19605,12 +19600,6 @@ dir = 1 }, /area/station/security/prison) -"fQL" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) "fQU" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -27122,12 +27111,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/atmos) -"ify" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden) "ifA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/cold_temp, @@ -43806,6 +43789,13 @@ /mob/living/carbon/human/species/monkey, /turf/open/floor/engine, /area/station/science/genetics) +"nhS" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/item/radio/intercom/directional/west, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) "nhT" = ( /obj/machinery/door/airlock/external{ glass = 1; @@ -49562,6 +49552,10 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/aft/lesser) +"oNW" = ( +/obj/structure/water_source/puddle, +/turf/open/floor/grass, +/area/station/security/prison/garden) "oNX" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, @@ -52429,6 +52423,15 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) +"pGy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden) "pGJ" = ( /obj/structure/sign/poster/contraband/random/directional/north, /obj/effect/mapping_helpers/burnt_floor, @@ -54287,6 +54290,13 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) +"qiT" = ( +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden) "qjb" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 10 @@ -66881,13 +66891,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/storage) -"tQp" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden) "tQE" = ( /obj/effect/turf_decal/siding/brown/corner{ dir = 4 @@ -69463,17 +69466,6 @@ "uIg" = ( /turf/open/floor/engine/n2o, /area/station/engineering/atmos) -"uIi" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Garden" - }, -/obj/item/kirbyplants/random, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden) "uIj" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -73927,6 +73919,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/large, /area/station/command/heads_quarters/ce) +"wcz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/prison/garden) "wcD" = ( /obj/structure/chair/plastic{ dir = 4 @@ -77706,6 +77705,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/blue, /area/station/hallway/secondary/entry) +"xhg" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Garden" + }, +/obj/machinery/status_display/ai/directional/east, +/obj/structure/water_source/puddle, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) "xhk" = ( /turf/open/floor/iron/dark, /area/station/commons/storage/primary) @@ -167761,7 +167768,7 @@ jlF jNf dpC cGQ -whr +oNW nmr hVY gjq @@ -168276,7 +168283,7 @@ jNf qIo tau dWK -ozX +whr hVY gjq gjq @@ -169044,7 +169051,7 @@ bCp fYi tCL jNf -fjX +wcz hKI fWe ozX @@ -227934,7 +227941,7 @@ esv lCb ddZ eUA -fQL +nhS oCO oCO oCO @@ -228192,7 +228199,7 @@ eUi eBB tNd nor -tQp +qiT cgw mZu hjv @@ -228704,7 +228711,7 @@ lJO wDf sAR sAR -cmh +cBD kPy dQI pPT @@ -228961,8 +228968,8 @@ lJO mCT mut lGo -uIi -ify +xhg +pGy wCL tTc wtr diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index aaf9a0f08c3..45772433fbc 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -15525,13 +15525,10 @@ /turf/open/floor/plating/airless, /area/station/solars/port/fore) "fzr" = ( -/obj/structure/table, -/obj/effect/turf_decal/stripes/line, -/obj/effect/spawner/random/food_or_drink/seed{ - spawn_all_loot = 1; - spawn_random_offset = 1 - }, -/turf/open/floor/iron, +/obj/structure/window/spawner/directional/south, +/obj/structure/window/spawner/directional/west, +/obj/structure/water_source/puddle, +/turf/open/floor/grass, /area/station/service/hydroponics/garden) "fzE" = ( /obj/structure/sign/warning/vacuum/external/directional/north, @@ -38976,6 +38973,7 @@ /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/garden) "nNw" = ( @@ -39514,6 +39512,10 @@ /obj/structure/table, /obj/structure/extinguisher_cabinet/directional/west, /obj/effect/turf_decal/stripes/line, +/obj/effect/spawner/random/food_or_drink/seed{ + spawn_all_loot = 1; + spawn_random_offset = 1 + }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) "nYU" = ( @@ -40395,7 +40397,6 @@ /obj/machinery/hydroponics/soil, /obj/item/cultivator, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, /turf/open/floor/grass, /area/station/security/prison/garden) "opG" = ( @@ -50758,8 +50759,6 @@ /turf/open/floor/iron/white, /area/station/medical/virology) "rVb" = ( -/obj/structure/sink/directional/west, -/obj/item/reagent_containers/cup/watering_can, /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 }, @@ -51192,7 +51191,6 @@ "sbX" = ( /obj/machinery/hydroponics/soil, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, /obj/item/plant_analyzer, /turf/open/floor/grass, /area/station/security/prison/garden) @@ -55373,6 +55371,7 @@ /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/garden) "tCF" = ( @@ -63869,6 +63868,12 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/iron, /area/station/science/robotics/mechbay) +"wsG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/water_source/puddle, +/obj/item/reagent_containers/cup/watering_can, +/turf/open/floor/grass, +/area/station/security/prison/garden) "wsI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -65137,7 +65142,6 @@ /turf/open/floor/iron/white, /area/station/science/robotics/lab) "wRF" = ( -/obj/structure/window/spawner/directional/west, /obj/structure/flora/rock/pile, /turf/open/floor/grass, /area/station/service/hydroponics/garden) @@ -87402,7 +87406,7 @@ aaa lMJ aaa aaa -aaa +cmB cmB cmB cmB @@ -87660,7 +87664,7 @@ lMJ aaa aaa cmB -cmB +wsG opF sbX jTi diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index 2f749e687d8..b949209410e 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -18345,6 +18345,18 @@ /obj/machinery/duct, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) +"eJy" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/security/prison/garden) "eJF" = ( /obj/machinery/airalarm/directional/south, /obj/item/kirbyplants/random, @@ -54060,7 +54072,9 @@ /area/station/maintenance/floor1/starboard) "nSz" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/sink/kitchen/directional/south, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, /turf/open/floor/iron/dark/side{ dir = 5 }, @@ -59366,6 +59380,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/aft) +"ppf" = ( +/obj/effect/turf_decal/weather/sand/light, +/turf/closed/wall/r_wall, +/area/station/security/execution/education) "ppi" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -64253,15 +64271,9 @@ /turf/open/floor/iron/dark, /area/station/command/teleporter) "qzQ" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 8 - }, -/obj/item/reagent_containers/cup/watering_can, -/obj/effect/turf_decal/tile/dark_blue, /obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, +/obj/structure/water_source/puddle, +/turf/open/misc/dirt/jungle, /area/station/security/prison/garden) "qzX" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -68275,6 +68287,7 @@ /obj/effect/mapping_helpers/broken_floor, /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/item/reagent_containers/cup/watering_can, /turf/open/floor/iron/dark/corner{ dir = 4 }, @@ -329837,7 +329850,7 @@ oyh oyh oyh fkA -fkA +ppf wmD fkA kUZ @@ -331381,7 +331394,7 @@ oyh wMF wMF qzQ -pfL +eJy pfL pfL yfr diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 0c117271c42..eb3032f5f44 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -8359,6 +8359,10 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/engineering/atmos) +"bRl" = ( +/obj/structure/water_source/puddle, +/turf/open/misc/asteroid, +/area/station/security/prison/workout) "bRE" = ( /obj/structure/lattice/catwalk, /turf/open/floor/plating/airless, @@ -10742,14 +10746,13 @@ /turf/open/floor/iron, /area/station/security/brig) "cGm" = ( -/obj/effect/turf_decal/bot, -/obj/structure/reagent_dispensers/watertank, /obj/machinery/airalarm/directional/east, /obj/effect/turf_decal/trimline/neutral/line, /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 }, -/turf/open/floor/iron, +/obj/structure/water_source/puddle, +/turf/open/floor/grass, /area/station/service/hydroponics/garden) "cGy" = ( /obj/structure/chair/stool/directional/north, @@ -46715,7 +46718,6 @@ /area/station/hallway/secondary/exit) "pzw" = ( /obj/effect/turf_decal/bot, -/obj/structure/reagent_dispensers/watertank, /obj/machinery/power/apc/auto_name/directional/east, /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -47463,10 +47465,10 @@ /turf/open/floor/iron/white, /area/station/science/lower) "pMz" = ( -/obj/structure/table/glass, /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 5 }, +/obj/structure/reagent_dispensers/watertank, /turf/open/floor/iron, /area/station/service/hydroponics/garden) "pMG" = ( @@ -88126,7 +88128,7 @@ abM aal lPV kPC -lFk +bRl lFk lFk mAB diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index 5e78718c948..fa4ea9e4b32 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -1155,16 +1155,6 @@ /obj/machinery/door/window/left/directional/west, /turf/open/floor/grass, /area/station/service/hydroponics/garden) -"atk" = ( -/obj/machinery/airalarm/directional/east, -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/mechanical, -/obj/item/clothing/head/utility/welding, -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) "atl" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/freezer, @@ -1854,6 +1844,17 @@ }, /turf/open/floor/circuit, /area/station/cargo/bitrunning/den) +"aEL" = ( +/obj/machinery/airalarm/directional/east, +/obj/structure/table/reinforced, +/obj/item/stack/sheet/iron/fifty, +/obj/item/storage/toolbox/mechanical, +/obj/item/clothing/head/utility/welding, +/obj/effect/turf_decal/siding/purple{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) "aEP" = ( /obj/effect/mapping_helpers/airlock/access/all/command/captain, /obj/machinery/door/airlock/command{ @@ -10267,16 +10268,28 @@ /area/station/service/theater) "dGs" = ( /obj/structure/table/reinforced, -/obj/item/storage/pill_bottle/epinephrine, -/obj/item/stack/sheet/mineral/plasma{ - pixel_y = 12 - }, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ dir = 4 }, +/obj/item/hand_labeler{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/item/storage/pill_bottle/epinephrine{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/stack/sheet/mineral/plasma{ + pixel_y = 14; + pixel_x = 3 + }, +/obj/item/hand_labeler_refill{ + pixel_x = 10; + pixel_y = -2 + }, /turf/open/floor/iron/white/smooth_edge{ dir = 4 }, @@ -17275,6 +17288,7 @@ /area/station/science/research) "ggl" = ( /obj/machinery/camera/autoname/directional/west, +/obj/structure/water_source/puddle, /turf/open/floor/grass, /area/station/service/hydroponics/garden) "ggu" = ( @@ -24046,6 +24060,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) +"iAM" = ( +/obj/machinery/computer/security/telescreen/rd/directional/south, +/turf/open/floor/glass/reinforced/plasma, +/area/station/command/heads_quarters/rd) "iBe" = ( /obj/structure/chair/pew/right{ dir = 4 @@ -34427,6 +34445,20 @@ }, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) +"miU" = ( +/obj/structure/table/reinforced, +/obj/item/stack/sheet/plasteel{ + amount = 15 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 5; + pixel_y = 7 + }, +/obj/structure/fireaxecabinet/mechremoval/directional/east, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/iron/fifty, +/turf/open/floor/iron/dark/textured, +/area/station/science/robotics/lab) "miV" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, @@ -39028,6 +39060,10 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron, /area/station/command/bridge) +"nPw" = ( +/obj/structure/water_source/puddle, +/turf/open/floor/grass, +/area/station/security/prison/garden) "nPM" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -42471,20 +42507,6 @@ /obj/machinery/digital_clock/directional/south, /turf/open/floor/iron/white/textured_large, /area/station/medical/treatment_center) -"pfz" = ( -/obj/item/stack/sheet/glass, -/obj/item/clothing/glasses/welding, -/obj/item/disk/tech_disk{ - pixel_y = 6 - }, -/obj/item/reagent_containers/dropper, -/obj/structure/table, -/obj/machinery/requests_console/auto_name/directional/north, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/ore_update, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/white, -/area/station/science/lab) "pfV" = ( /obj/machinery/holopad, /turf/open/floor/iron, @@ -44216,6 +44238,21 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) +"pJU" = ( +/obj/item/stack/sheet/glass, +/obj/item/stack/sheet/iron/fifty, +/obj/item/clothing/glasses/welding, +/obj/item/disk/tech_disk{ + pixel_y = 6 + }, +/obj/item/reagent_containers/dropper, +/obj/structure/table, +/obj/machinery/requests_console/auto_name/directional/north, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/ore_update, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/white, +/area/station/science/lab) "pKb" = ( /obj/effect/spawner/random/trash/cigbutt{ spawn_random_offset = 4; @@ -49567,12 +49604,6 @@ /obj/machinery/digital_clock/directional/south, /turf/open/floor/iron/white, /area/station/science/lab) -"rBL" = ( -/obj/machinery/computer/records/medical, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/computer/security/telescreen/med_sec/directional/north, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) "rBT" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/transit_tube/station/dispenser/reverse{ @@ -53807,11 +53838,6 @@ }, /turf/open/floor/iron, /area/station/command/bridge) -"sXs" = ( -/obj/machinery/computer/security/telescreen/rd/directional/south, -/obj/machinery/keycard_auth/wall_mounted/directional/south, -/turf/open/floor/glass/reinforced/plasma, -/area/station/command/heads_quarters/rd) "sXG" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58832,6 +58858,12 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/station/solars/port) +"uJq" = ( +/obj/machinery/computer/records/medical, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/computer/security/telescreen/med_sec/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) "uJt" = ( /obj/effect/mapping_helpers/engraving, /turf/closed/wall, @@ -66442,19 +66474,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/purple, /area/station/service/library) -"xvO" = ( -/obj/structure/table/reinforced, -/obj/item/stack/sheet/plasteel{ - amount = 15 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = 5; - pixel_y = 7 - }, -/obj/structure/fireaxecabinet/mechremoval/directional/east, -/obj/item/stack/sheet/glass/fifty, -/turf/open/floor/iron/dark/textured, -/area/station/science/robotics/lab) "xvU" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -82447,7 +82466,7 @@ iUF dUc xrb xrb -dEG +nPw dEG iqf cKn @@ -82777,7 +82796,7 @@ mBj jHx iJF kFT -rBL +uJq sGt ltj fvo @@ -103815,7 +103834,7 @@ tdk hkc swi dHy -atk +aEL trL nMP xOU @@ -104319,7 +104338,7 @@ vfJ xbu gMK cPt -pfz +pJU wtu dfr mKF @@ -104340,7 +104359,7 @@ qnQ xcb wCO tld -xvO +miU azv azv azv @@ -177836,7 +177855,7 @@ gmH rXS tOL fPv -sXs +iAM iFN mZn oND diff --git a/_maps/safehouses/bathroom.dmm b/_maps/safehouses/bathroom.dmm index 76712d6193c..69ad0b25e95 100644 --- a/_maps/safehouses/bathroom.dmm +++ b/_maps/safehouses/bathroom.dmm @@ -27,7 +27,7 @@ dir = 4 }, /obj/machinery/light/small/blacklight/directional/east, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "v" = ( /obj/machinery/light/small/blacklight/directional/east, @@ -68,7 +68,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "M" = ( /obj/effect/decal/cleanable/dirt, diff --git a/_maps/safehouses/den.dmm b/_maps/safehouses/den.dmm index 15debc7e284..9b0b37f5351 100644 --- a/_maps/safehouses/den.dmm +++ b/_maps/safehouses/den.dmm @@ -18,7 +18,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "e" = ( /obj/structure/table/reinforced/plastitaniumglass, @@ -59,7 +59,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "z" = ( /obj/effect/turf_decal/trimline/yellow/corner{ diff --git a/_maps/safehouses/dig.dmm b/_maps/safehouses/dig.dmm index 73f0d247dfb..aa26f980d60 100644 --- a/_maps/safehouses/dig.dmm +++ b/_maps/safehouses/dig.dmm @@ -20,7 +20,7 @@ dir = 8 }, /obj/effect/landmark/bitrunning/cache_goal_turf, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "i" = ( /obj/effect/turf_decal/siding/yellow{ @@ -98,7 +98,7 @@ /obj/effect/turf_decal/loading_area, /obj/effect/turf_decal/box/corners, /obj/effect/landmark/bitrunning/cache_goal_turf, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "T" = ( /obj/effect/landmark/bitrunning/hololadder_spawn, diff --git a/_maps/safehouses/ice.dmm b/_maps/safehouses/ice.dmm index 96d689339ab..f9716de7103 100644 --- a/_maps/safehouses/ice.dmm +++ b/_maps/safehouses/ice.dmm @@ -60,7 +60,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "p" = ( /obj/structure/railing, @@ -69,7 +69,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "u" = ( /obj/effect/decal/cleanable/dirt/dust, diff --git a/_maps/safehouses/lavaland_boss.dmm b/_maps/safehouses/lavaland_boss.dmm index 7331a5b79d7..56141803990 100644 --- a/_maps/safehouses/lavaland_boss.dmm +++ b/_maps/safehouses/lavaland_boss.dmm @@ -63,7 +63,7 @@ /obj/machinery/light/directional/east, /obj/structure/railing, /obj/effect/landmark/bitrunning/cache_goal_turf, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "A" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ diff --git a/_maps/safehouses/mine.dmm b/_maps/safehouses/mine.dmm index 904c3c5378e..4bf99ab14f3 100644 --- a/_maps/safehouses/mine.dmm +++ b/_maps/safehouses/mine.dmm @@ -26,7 +26,7 @@ }, /obj/machinery/light/directional/east, /obj/effect/landmark/bitrunning/cache_goal_turf, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "B" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -52,7 +52,7 @@ }, /obj/structure/railing, /obj/effect/landmark/bitrunning/cache_goal_turf, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "H" = ( /obj/machinery/door/airlock/external/glass{ diff --git a/_maps/safehouses/shuttle.dmm b/_maps/safehouses/shuttle.dmm index 75fe975258c..19f0c4b73aa 100644 --- a/_maps/safehouses/shuttle.dmm +++ b/_maps/safehouses/shuttle.dmm @@ -16,7 +16,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/bitrunning/cache_goal_turf, /obj/effect/turf_decal/loading_area, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "i" = ( /obj/effect/turf_decal/stripes/line{ @@ -41,7 +41,7 @@ /obj/machinery/light/small/directional/south, /obj/effect/landmark/bitrunning/cache_goal_turf, /obj/effect/turf_decal/loading_area, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "m" = ( /obj/modular_map_connector, diff --git a/_maps/safehouses/shuttle_space.dmm b/_maps/safehouses/shuttle_space.dmm index 0029f5b0a6e..2f4071a8347 100644 --- a/_maps/safehouses/shuttle_space.dmm +++ b/_maps/safehouses/shuttle_space.dmm @@ -67,7 +67,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/bitrunning/cache_goal_turf, /obj/effect/turf_decal/loading_area, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "z" = ( /obj/effect/turf_decal/stripes/line{ @@ -98,7 +98,7 @@ /obj/machinery/light/small/directional/south, /obj/effect/landmark/bitrunning/cache_goal_turf, /obj/effect/turf_decal/loading_area, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "E" = ( /obj/effect/turf_decal/stripes/line{ diff --git a/_maps/safehouses/wood.dmm b/_maps/safehouses/wood.dmm index 05fbb97f915..5faa33faa41 100644 --- a/_maps/safehouses/wood.dmm +++ b/_maps/safehouses/wood.dmm @@ -19,7 +19,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "v" = ( /obj/machinery/light/small/directional/east, @@ -50,7 +50,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "T" = ( /obj/effect/landmark/bitrunning/hololadder_spawn, diff --git a/_maps/virtual_domains/island_brawl.dmm b/_maps/virtual_domains/island_brawl.dmm index fa04316b9b6..c9010062f54 100644 --- a/_maps/virtual_domains/island_brawl.dmm +++ b/_maps/virtual_domains/island_brawl.dmm @@ -2540,7 +2540,7 @@ /area/virtual_domain) "GD" = ( /obj/effect/landmark/bitrunning/permanent_exit, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/protected_space/fullbright) "GI" = ( /turf/open/floor/iron/dark/textured_large, diff --git a/code/__DEFINES/dcs/signals/signals_fish.dm b/code/__DEFINES/dcs/signals/signals_fish.dm index 8f7483d9416..2fbf99446ab 100644 --- a/code/__DEFINES/dcs/signals/signals_fish.dm +++ b/code/__DEFINES/dcs/signals/signals_fish.dm @@ -46,3 +46,9 @@ /// From /obj/item/fish_analyzer/proc/analyze_status: (fish, user) #define COMSIG_FISH_ANALYZER_ANALYZE_STATUS "fish_analyzer_analyze_status" + +/// From /datum/component/fish_growth/on_fish_life: (seconds_per_tick) +#define COMSIG_FISH_BEFORE_GROWING "fish_before_growing" + #define COMPONENT_DONT_GROW (1 << 0) +/// From /datum/component/fish_growth/finish_growing: (result) +#define COMSIG_FISH_FINISH_GROWING "fish_finish_growing" diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index a3668431555..c96746b47c1 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -100,7 +100,7 @@ #define JOB_CHAPLAIN "Chaplain" #define JOB_PSYCHOLOGIST "Psychologist" #define JOB_BARBER "Barber" // SKYRAT EDIT ADDITION -#define JOB_BOUNCER "Service Guard" // SKYRAT EDIT ADDITION +#define JOB_BOUNCER "Bouncer" // SKYRAT EDIT ADDITION //ERTs #define JOB_ERT_DEATHSQUAD "Death Commando" #define JOB_ERT_COMMANDER "Emergency Response Team Commander" diff --git a/code/__DEFINES/mining.dm b/code/__DEFINES/mining.dm index 5b612b4b7bc..d0fa97062b1 100644 --- a/code/__DEFINES/mining.dm +++ b/code/__DEFINES/mining.dm @@ -9,6 +9,7 @@ #define MAX_BOULDERS_PER_VENT 10 /// Time multiplier #define INATE_BOULDER_SPEED_MULTIPLIER 3 + // Vent type /// Large vents, giving large boulders. #define LARGE_VENT_TYPE "large" @@ -17,6 +18,14 @@ /// Small vents, giving small boulders. #define SMALL_VENT_TYPE "small" +// Timers for the ore vents to perform wave defense. +/// Duration for wave defense for a small vent. +#define WAVE_DURATION_SMALL 60 SECONDS +/// Duration for wave defense for a medium vent. +#define WAVE_DURATION_MEDIUM 90 SECONDS +/// Duration for wave defense for a large vent. +#define WAVE_DURATION_LARGE 150 SECONDS + /// Proximity to a vent that a wall ore needs to be for 5 ore to be mined. #define VENT_PROX_VERY_HIGH 3 /// Proximity to a vent that a wall ore needs to be for 4 ore to be mined. diff --git a/code/__DEFINES/uplink.dm b/code/__DEFINES/uplink.dm index cdfdf4680f7..929b558dfec 100644 --- a/code/__DEFINES/uplink.dm +++ b/code/__DEFINES/uplink.dm @@ -36,7 +36,7 @@ /// Typepath used for uplink items which don't actually produce an item (essentially just a placeholder) /// Future todo: Make this not necessary / make uplink items support item-less items natively -#define ABSTRACT_UPLINK_ITEM /obj/effect/gibspawner/generic +#define ABSTRACT_UPLINK_ITEM /obj/item/loot_table_maker /// Lower threshold for which an uplink items's TC cost is considered "low" for spy bounties picking rewards #define SPY_LOWER_COST_THRESHOLD 5 diff --git a/code/__DEFINES/~skyrat_defines/DNA.dm b/code/__DEFINES/~skyrat_defines/DNA.dm index 5ea728ac724..d8c48d45066 100644 --- a/code/__DEFINES/~skyrat_defines/DNA.dm +++ b/code/__DEFINES/~skyrat_defines/DNA.dm @@ -69,14 +69,20 @@ //In inches #define PENIS_MIN_GIRTH PENIS_MIN_LENGTH -#define PENIS_MAX_GIRTH 15 +#define PENIS_MAX_GIRTH 20 +/// for non oversized mobs with a 'normal' body size +#define PENIS_MAX_GIRTH_NORMAL_SIZED 15 #define PENIS_DEFAULT_GIRTH 5 // a lil big but not by much #define PENIS_MIN_LENGTH 1 -#define PENIS_MAX_LENGTH 20 +#define PENIS_MAX_LENGTH 36 +/// for non oversized mobs with a 'normal' body size +#define PENIS_MAX_LENGTH_NORMAL_SIZED 20 #define PENIS_DEFAULT_LENGTH 6 //still a lil long but not insane #define TESTICLES_MIN_SIZE 0 -#define TESTICLES_MAX_SIZE 3 +#define TESTICLES_MAX_SIZE 6 +/// for non oversized mobs with a 'normal' body size +#define TESTICLES_MAX_NORMAL_SIZED 3 #define SHEATH_NONE "None" #define SHEATH_NORMAL "Sheath" diff --git a/code/__DEFINES/~skyrat_defines/keybindings.dm b/code/__DEFINES/~skyrat_defines/keybindings.dm index 5a205f4f0f8..76dc277fe59 100644 --- a/code/__DEFINES/~skyrat_defines/keybindings.dm +++ b/code/__DEFINES/~skyrat_defines/keybindings.dm @@ -1,5 +1,9 @@ #define COMSIG_KB_MOB_PIXEL_SHIFT_DOWN "keybinding_mob_pixel_shift_down" #define COMSIG_KB_MOB_PIXEL_SHIFT_UP "keybinding_mob_pixel_shift_up" +#define COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_DOWN "keybinding_mob_item_pixelshift_down" +#define COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_UP "keybinding_mob_item_pixelshift_up" +#define COMSIG_KB_MOB_PIXEL_TILT_DOWN "keybinding_mob_pixeltilt_down" +#define COMSIG_KB_MOB_PIXEL_TILT_UP "keybinding_mob_pixeltilt_up" #define COMSIG_KB_CLIENT_LOOC_DOWN "keybinding_client_looc_down" #define COMSIG_KB_CLIENT_WHISPER_DOWN "keybinding_client_whisper_down" #define COMSIG_KB_LIVING_COMBAT_INDICATOR "keybinding_living_combat_indicator" diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 596e688a256..0aa6f91da99 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -121,7 +121,7 @@ if(isnull(user_input)) // User pressed cancel return if(no_trim) - return copytext(html_encode(user_input), 1, max_length) + return copytext_char(html_encode(user_input), 1, max_length) else return trim(html_encode(user_input), max_length) //trim is "outside" because html_encode can expand single symbols into multiple symbols (such as turning < into <) @@ -140,7 +140,7 @@ if(isnull(user_input)) // User pressed cancel return if(no_trim) - return copytext(html_encode(user_input), 1, max_length) + return copytext_char(html_encode(user_input), 1, max_length) else return trim(html_encode(user_input), max_length) @@ -368,7 +368,7 @@ */ /proc/truncate(text, max_length) if(length(text) > max_length) - return copytext(text, 1, max_length) + return copytext_char(text, 1, max_length) return text //Returns a string with reserved characters and spaces before the first word and after the last word removed. diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 61b78425050..0982f171263 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -219,7 +219,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_ECHOLOCATION_RECEIVER" = TRAIT_ECHOLOCATION_RECEIVER, "TRAIT_ELDRITCH_PAINTING_EXAMINE" = TRAIT_ELDRITCH_PAINTING_EXAMINE, "TRAIT_ELITE_CHALLENGER" = TRAIT_ELITE_CHALLENGER, - "TRAIT_EMOTEMUTE " = TRAIT_EMOTEMUTE, "TRAIT_EMOTEMUTE" = TRAIT_EMOTEMUTE, "TRAIT_EMPATH" = TRAIT_EMPATH, "TRAIT_ENTRAILS_READER" = TRAIT_ENTRAILS_READER, diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 95396211230..5003da19f73 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -30,14 +30,21 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_AGENDER" = TRAIT_AGENDER, "TRAIT_AGEUSIA" = TRAIT_AGEUSIA, "TRAIT_ALCOHOL_TOLERANCE" = TRAIT_ALCOHOL_TOLERANCE, + "TRAIT_ALLOW_HERETIC_CASTING" = TRAIT_ALLOW_HERETIC_CASTING, + "TRAIT_ALWAYS_NO_ACCESS" = TRAIT_ALWAYS_NO_ACCESS, + "TRAIT_ALWAYS_WANTED" = TRAIT_ALWAYS_WANTED, "TRAIT_ANOSMIA" = TRAIT_ANOSMIA, + "TRAIT_ANTENNAE" = TRAIT_ANTENNAE, "TRAIT_ANTIMAGIC" = TRAIT_ANTIMAGIC, + "TRAIT_ANTIMAGIC_NO_SELFBLOCK" = TRAIT_ANTIMAGIC_NO_SELFBLOCK, "TRAIT_ANXIOUS" = TRAIT_ANXIOUS, "TRAIT_BADDNA" = TRAIT_BADDNA, "TRAIT_BADTOUCH" = TRAIT_BADTOUCH, "TRAIT_BALD" = TRAIT_BALD, + "TRAIT_BALLOON_SUTRA" = TRAIT_BALLOON_SUTRA, "TRAIT_BATON_RESISTANCE" = TRAIT_BATON_RESISTANCE, "TRAIT_BEAST_EMPATHY" = TRAIT_BEAST_EMPATHY, + "TRAIT_BLOB_ALLY" = TRAIT_BLOB_ALLY, "TRAIT_BLOCK_SHUTTLE_MOVEMENT" = TRAIT_BLOCK_SHUTTLE_MOVEMENT, "TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS, "TRAIT_BLOODSHOT_EYES" = TRAIT_BLOODSHOT_EYES, @@ -46,20 +53,27 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_BOOZE_SLIDER" = TRAIT_BOOZE_SLIDER, "TRAIT_BYPASS_MEASURES" = TRAIT_BYPASS_MEASURES, "TRAIT_CAN_HOLD_ITEMS" = TRAIT_CAN_HOLD_ITEMS, + "TRAIT_CAN_STRIP" = TRAIT_CAN_STRIP, + "TRAIT_CAN_USE_NUKE" = TRAIT_CAN_USE_NUKE, "TRAIT_CANNOT_BE_UNBUCKLED" = TRAIT_CANNOT_BE_UNBUCKLED, "TRAIT_CANNOT_OPEN_PRESENTS" = TRAIT_CANNOT_OPEN_PRESENTS, + "TRAIT_CATLIKE_GRACE" = TRAIT_CATLIKE_GRACE, "TRAIT_CHASM_DESTROYED" = TRAIT_CHASM_DESTROYED, "TRAIT_CHUNKYFINGERS_IGNORE_BATON" = TRAIT_CHUNKYFINGERS_IGNORE_BATON, "TRAIT_CHUNKYFINGERS" = TRAIT_CHUNKYFINGERS, + "TRAIT_CLEANBOT_WHISPERER" = TRAIT_CLEANBOT_WHISPERER, + "TRAIT_CLIFF_WALKER" = TRAIT_CLIFF_WALKER, "TRAIT_CLOWN_ENJOYER" = TRAIT_CLOWN_ENJOYER, "TRAIT_CLUMSY" = TRAIT_CLUMSY, "TRAIT_COMMISSIONED" = TRAIT_COMMISSIONED, + "TRAIT_CORPSELOCKED" = TRAIT_CORPSELOCKED, "TRAIT_CRITICAL_CONDITION" = TRAIT_CRITICAL_CONDITION, "TRAIT_CULT_HALO" = TRAIT_CULT_HALO, "TRAIT_DEAF" = TRAIT_DEAF, "TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA, "TRAIT_DEFIB_BLACKLISTED" = TRAIT_DEFIB_BLACKLISTED, "TRAIT_DEPRESSION" = TRAIT_DEPRESSION, + "TRAIT_DETECT_STORM" = TRAIT_DETECT_STORM, "TRAIT_DIAGNOSTIC_HUD" = TRAIT_DIAGNOSTIC_HUD, "TRAIT_BOT_PATH_HUD" = TRAIT_BOT_PATH_HUD, "TRAIT_DISCOORDINATED_TOOL_USER" = TRAIT_DISCOORDINATED_TOOL_USER, @@ -71,42 +85,59 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_DWARF" = TRAIT_DWARF, "TRAIT_EASILY_WOUNDED" = TRAIT_EASILY_WOUNDED, "TRAIT_EASYDISMEMBER" = TRAIT_EASYDISMEMBER, - "TRAIT_EMOTEMUTE " = TRAIT_EMOTEMUTE, + "TRAIT_EMOTEMUTE" = TRAIT_EMOTEMUTE, "TRAIT_EMPATH" = TRAIT_EMPATH, + "TRAIT_ENTRAILS_READER" = TRAIT_ENTRAILS_READER, + "TRAIT_EXAMINE_FISHING_SPOT" = TRAIT_EXAMINE_FISHING_SPOT, "TRAIT_EXAMINE_FITNESS" = TRAIT_EXAMINE_FITNESS, "TRAIT_EXPANDED_FOV" = TRAIT_EXPANDED_FOV, "TRAIT_EXPERT_FISHER" = TRAIT_EXPERT_FISHER, + "TRAIT_EXTROVERT" = TRAIT_EXTROVERT, "TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH, + "TRAIT_FASTMED" = TRAIT_FASTMED, "TRAIT_FAST_CUFFING" = TRAIT_FAST_CUFFING, + "TRAIT_FAST_TYING" = TRAIT_FAST_TYING, "TRAIT_FAT" = TRAIT_FAT, "TRAIT_FEARLESS" = TRAIT_FEARLESS, "TRAIT_FENCE_CLIMBER" = TRAIT_FENCE_CLIMBER, "TRAIT_FIST_MINING" = TRAIT_FIST_MINING, "TRAIT_FIXED_HAIRCOLOR" = TRAIT_FIXED_HAIRCOLOR, "TRAIT_FIXED_MUTANT_COLORS" = TRAIT_FIXED_MUTANT_COLORS, + "TRAIT_FLESH_DESIRE" = TRAIT_FLESH_DESIRE, "TRAIT_FLOORED" = TRAIT_FLOORED, + "TRAIT_FORBID_MINING_SHUTTLE_CONSOLE_OUTSIDE_STATION" = TRAIT_FORBID_MINING_SHUTTLE_CONSOLE_OUTSIDE_STATION, "TRAIT_FORCED_STANDING" = TRAIT_FORCED_STANDING, "TRAIT_FREERUNNING" = TRAIT_FREERUNNING, + "TRAIT_FREE_FLOAT_MOVEMENT" = TRAIT_FREE_FLOAT_MOVEMENT, + "TRAIT_FREE_HYPERSPACE_MOVEMENT" = TRAIT_FREE_HYPERSPACE_MOVEMENT, + "TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT" = TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT, "TRAIT_FRIENDLY" = TRAIT_FRIENDLY, "TRAIT_GAMER" = TRAIT_GAMER, "TRAIT_GAMERGOD" = TRAIT_GAMERGOD, + "TRAIT_GARLIC_BREATH" = TRAIT_GARLIC_BREATH, "TRAIT_GENELESS" = TRAIT_GENELESS, "TRAIT_GIANT" = TRAIT_GIANT, "TRAIT_GOOD_HEARING" = TRAIT_GOOD_HEARING, "TRAIT_GRABWEAKNESS" = TRAIT_GRABWEAKNESS, "TRAIT_GREENTEXT_CURSED" = TRAIT_GREENTEXT_CURSED, "TRAIT_GUNFLIP" = TRAIT_GUNFLIP, + "TRAIT_GUN_NATURAL" = TRAIT_GUN_NATURAL, "TRAIT_HANDS_BLOCKED" = TRAIT_HANDS_BLOCKED, "TRAIT_HARDLY_WOUNDED" = TRAIT_HARDLY_WOUNDED, + "TRAIT_HATED_BY_DOGS" = TRAIT_HATED_BY_DOGS, + "TRAIT_HEAVY_DRINKER" = TRAIT_HEAVY_DRINKER, "TRAIT_HEAVY_SLEEPER" = TRAIT_HEAVY_SLEEPER, "TRAIT_HIDE_EXTERNAL_ORGANS" = TRAIT_HIDE_EXTERNAL_ORGANS, + "TRAIT_HIGH_VALUE_RANSOM" = TRAIT_HIGH_VALUE_RANSOM, "TRAIT_HOLY" = TRAIT_HOLY, "TRAIT_HUSK" = TRAIT_HUSK, + "TRAIT_ID_APPRAISER" = TRAIT_ID_APPRAISER, "TRAIT_IGNORE_ELEVATION" = TRAIT_IGNORE_ELEVATION, "TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN, "TRAIT_ILLITERATE" = TRAIT_ILLITERATE, "TRAIT_IMMOBILIZED" = TRAIT_IMMOBILIZED, "TRAIT_INCAPACITATED" = TRAIT_INCAPACITATED, + "TRAIT_INTROVERT" = TRAIT_INTROVERT, "TRAIT_INVISIBLE_MAN" = TRAIT_INVISIBLE_MAN, "TRAIT_IWASBATONED" = TRAIT_IWASBATONED, "TRAIT_JOLLY" = TRAIT_JOLLY, @@ -114,13 +145,16 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_KNOCKEDOUT" = TRAIT_KNOCKEDOUT, "TRAIT_KNOW_ENGI_WIRES" = TRAIT_KNOW_ENGI_WIRES, "TRAIT_KNOW_ROBO_WIRES" = TRAIT_KNOW_ROBO_WIRES, + "TRAIT_LIGHTBULB_REMOVER" = TRAIT_LIGHTBULB_REMOVER, "TRAIT_LIGHT_DRINKER" = TRAIT_LIGHT_DRINKER, "TRAIT_LIGHT_STEP" = TRAIT_LIGHT_STEP, "TRAIT_LIGHTBULB_REMOVER" = TRAIT_LIGHTBULB_REMOVER, "TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT, "TRAIT_LITERATE" = TRAIT_LITERATE, "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, + "TRAIT_MADNESS_IMMUNE" = TRAIT_MADNESS_IMMUNE, "TRAIT_MAGICALLY_GIFTED" = TRAIT_MAGICALLY_GIFTED, + "TRAIT_MARTIAL_ARTS_IMMUNE" = TRAIT_MARTIAL_ARTS_IMMUNE, "TRAIT_MASQUERADE_FOOD" = TRAIT_MASQUERADE_FOOD, //BUBBER EDIT "TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD, "TRAIT_MIME_FAN" = TRAIT_MIME_FAN, @@ -128,10 +162,12 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD, "TRAIT_MOB_HIDE_HAPPINESS" = TRAIT_MOB_HIDE_HAPPINESS, "TRAIT_MORBID" = TRAIT_MORBID, + "TRAIT_MULTIZ_SUIT_SENSORS" = TRAIT_MULTIZ_SUIT_SENSORS, "TRAIT_MUSICIAN" = TRAIT_MUSICIAN, "TRAIT_MUTANT_COLORS" = TRAIT_MUTANT_COLORS, "TRAIT_MUTE" = TRAIT_MUTE, "TRAIT_NAIVE" = TRAIT_NAIVE, + "TRAIT_NEGATES_GRAVITY" = TRAIT_NEGATES_GRAVITY, "TRAIT_NEVER_WOUNDED" = TRAIT_NEVER_WOUNDED, "TRAIT_NICE_SHOT" = TRAIT_NICE_SHOT, "TRAIT_NIGHT_VISION" = TRAIT_NIGHT_VISION, @@ -140,13 +176,18 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_NO_DNA_COPY" = TRAIT_NO_DNA_COPY, "TRAIT_NO_EXTINGUISH" = TRAIT_NO_EXTINGUISH, "TRAIT_NO_GLIDE" = TRAIT_NO_GLIDE, + "TRAIT_NO_GUN_AKIMBO" = TRAIT_NO_GUN_AKIMBO, + "TRAIT_NO_MINDSWAP" = TRAIT_NO_MINDSWAP, + "TRAIT_NO_MIRROR_REFLECTION" = TRAIT_NO_MIRROR_REFLECTION, "TRAIT_NO_PLASMA_TRANSFORM" = TRAIT_NO_PLASMA_TRANSFORM, "TRAIT_NO_SLIP_ALL" = TRAIT_NO_SLIP_ALL, "TRAIT_NO_SLIP_ICE" = TRAIT_NO_SLIP_ICE, "TRAIT_NO_SLIP_SLIDE" = TRAIT_NO_SLIP_SLIDE, "TRAIT_NO_SLIP_WATER" = TRAIT_NO_SLIP_WATER, "TRAIT_NO_SOUL" = TRAIT_NO_SOUL, + "TRAIT_NO_STAGGER" = TRAIT_NO_STAGGER, "TRAIT_NO_TRANSFORM" = TRAIT_NO_TRANSFORM, + "TRAIT_NO_TWOHANDING" = TRAIT_NO_TWOHANDING, "TRAIT_NO_UNDERWEAR" = TRAIT_NO_UNDERWEAR, "TRAIT_NO_ZOMBIFY" = TRAIT_NO_ZOMBIFY, "TRAIT_NOBLOOD" = TRAIT_NOBLOOD, @@ -155,7 +196,10 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_NOCRITOVERLAY" = TRAIT_NOCRITOVERLAY, "TRAIT_NODEATH" = TRAIT_NODEATH, "TRAIT_NODISMEMBER" = TRAIT_NODISMEMBER, + "TRAIT_NOFAT" = TRAIT_NOFAT, + "TRAIT_NOFEAR_HOLDUPS" = TRAIT_NOFEAR_HOLDUPS, "TRAIT_NOFIRE" = TRAIT_NOFIRE, + "TRAIT_NOFIRE_SPREAD" = TRAIT_NOFIRE_SPREAD, "TRAIT_NOFLASH" = TRAIT_NOFLASH, "TRAIT_NOGUNS" = TRAIT_NOGUNS, "TRAIT_TOSS_GUN_HARD" = TRAIT_TOSS_GUN_HARD, @@ -164,7 +208,9 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_NOLIMBDISABLE" = TRAIT_NOLIMBDISABLE, "TRAIT_NOMOBSWAP" = TRAIT_NOMOBSWAP, "TRAIT_NOSOFTCRIT" = TRAIT_NOSOFTCRIT, + "TRAIT_OFF_BALANCE_TACKLER" = TRAIT_OFF_BALANCE_TACKLER, "TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED, + "TRAIT_OVERDOSEIMMUNE" = TRAIT_OVERDOSEIMMUNE, "TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE, "TRAIT_PACIFISM" = TRAIT_PACIFISM, "TRAIT_HIPPOCRATIC_OATH" = TRAIT_HIPPOCRATIC_OATH, @@ -176,6 +222,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_PASSTABLE" = TRAIT_PASSTABLE, "TRAIT_PASSWINDOW" = TRAIT_PASSWINDOW, "TRAIT_PERFECT_ATTACKER" = TRAIT_PERFECT_ATTACKER, + "TRAIT_PERMANENTLY_MORTAL" = TRAIT_PERMANENTLY_MORTAL, "TRAIT_PHOTOGRAPHER" = TRAIT_PHOTOGRAPHER, "TRAIT_PIERCEIMMUNE" = TRAIT_PIERCEIMMUNE, "TRAIT_PLANT_SAFE" = TRAIT_PLANT_SAFE, @@ -186,16 +233,22 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_PROSOPAGNOSIA" = TRAIT_PROSOPAGNOSIA, "TRAIT_PULL_BLOCKED" = TRAIT_PULL_BLOCKED, "TRAIT_PUSHIMMUNE" = TRAIT_PUSHIMMUNE, + "TRAIT_QUICK_BUILD" = TRAIT_QUICK_BUILD, "TRAIT_QUICK_CARRY" = TRAIT_QUICK_CARRY, "TRAIT_QUICKER_CARRY" = TRAIT_QUICKER_CARRY, "TRAIT_RADIMMUNE" = TRAIT_RADIMMUNE, + "TRAIT_REMOTE_TASTING" = TRAIT_REMOTE_TASTING, "TRAIT_RESISTCOLD" = TRAIT_RESISTCOLD, "TRAIT_RESISTHEAT" = TRAIT_RESISTHEAT, "TRAIT_RESISTHEATHANDS" = TRAIT_RESISTHEATHANDS, "TRAIT_RESISTHIGHPRESSURE" = TRAIT_RESISTHIGHPRESSURE, "TRAIT_RESISTLOWPRESSURE" = TRAIT_RESISTLOWPRESSURE, "TRAIT_RESTRAINED" = TRAIT_RESTRAINED, + "TRAIT_REVEAL_FISH" = TRAIT_REVEAL_FISH, + "TRAIT_ROCK_STONER" = TRAIT_ROCK_STONER, + "TRAIT_ROD_SUPLEX" = TRAIT_ROD_SUPLEX, "TRAIT_ROUGHRIDER" = TRAIT_ROUGHRIDER, + "TRAIT_SABRAGE_PRO" = TRAIT_SABRAGE_PRO, "TRAIT_SECURITY_HUD" = TRAIT_SECURITY_HUD, "TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE, "TRAIT_SETTLER" = TRAIT_SETTLER, @@ -210,23 +263,28 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_SLOW_FLIP" = TRAIT_SLOW_FLIP, "TRAIT_SMOKER" = TRAIT_SMOKER, "TRAIT_SNOB" = TRAIT_SNOB, + "TRAIT_SOFTSPOKEN" = TRAIT_SOFTSPOKEN, "TRAIT_SOOTHED_THROAT" = TRAIT_SOOTHED_THROAT, "TRAIT_SPACEWALK" = TRAIT_SPACEWALK, "TRAIT_SPECIAL_TRAUMA_BOOST" = TRAIT_SPECIAL_TRAUMA_BOOST, "TRAIT_SPIRITUAL" = TRAIT_SPIRITUAL, "TRAIT_STABLEHEART" = TRAIT_STABLEHEART, "TRAIT_STABLELIVER" = TRAIT_STABLELIVER, + "TRAIT_STRENGTH" = TRAIT_STRENGTH, "TRAIT_STRONG_GRABBER" = TRAIT_STRONG_GRABBER, "TRAIT_STRONG_STOMACH" = TRAIT_STRONG_STOMACH, "TRAIT_STUBBY_BODY" = TRAIT_STUBBY_BODY, "TRAIT_STUNIMMUNE" = TRAIT_STUNIMMUNE, "TRAIT_STURDY_FRAME" = TRAIT_STURDY_FRAME, + "TRAIT_SUPERMATTER_SOOTHER" = TRAIT_SUPERMATTER_SOOTHER, "TRAIT_SURGEON" = TRAIT_SURGEON, "TRAIT_SURGICALLY_ANALYZED" = TRAIT_SURGICALLY_ANALYZED, "TRAIT_TAGGER" = TRAIT_TAGGER, "TRAIT_TENTACLE_IMMUNE" = TRAIT_TENTACLE_IMMUNE, "TRAIT_TESLA_SHOCKIMMUNE" = TRAIT_TESLA_SHOCKIMMUNE, "TRAIT_THERMAL_VISION" = TRAIT_THERMAL_VISION, + "TRAIT_THROWINGARM" = TRAIT_THROWINGARM, + "TRAIT_TIME_STOP_IMMUNE" = TRAIT_TIME_STOP_IMMUNE, "TRAIT_TOXIMMUNE" = TRAIT_TOXIMMUNE, "TRAIT_TOXINLOVER" = TRAIT_TOXINLOVER, "TRAIT_TRAIT_MEDIBOTCOMINGTHROUGH" = TRAIT_MEDIBOTCOMINGTHROUGH, @@ -242,7 +300,10 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_UNSTABLE" = TRAIT_UNSTABLE, "TRAIT_USED_DNA_VAULT" = TRAIT_USED_DNA_VAULT, "TRAIT_USES_SKINTONES" = TRAIT_USES_SKINTONES, + "TRAIT_VENTCRAWLER_ALWAYS" = TRAIT_VENTCRAWLER_ALWAYS, + "TRAIT_VENTCRAWLER_NUDE" = TRAIT_VENTCRAWLER_NUDE, "TRAIT_VIRUSIMMUNE" = TRAIT_VIRUSIMMUNE, + "TRAIT_VIRUS_RESISTANCE" = TRAIT_VIRUS_RESISTANCE, "TRAIT_VORACIOUS" = TRAIT_VORACIOUS, "TRAIT_WOUND_LICKER" = TRAIT_WOUND_LICKER, "TRAIT_WEAK_SOUL" = TRAIT_WEAK_SOUL, diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 713f03bc75a..6ee994cf79c 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -319,14 +319,14 @@ GLOBAL_LIST_EMPTY(radial_menus) current_page = WRAP(current_page + 1,1,pages+1) update_screen_objects() -/datum/radial_menu/proc/show_to(mob/M) +/datum/radial_menu/proc/show_to(mob/M, offset_x = 0, offset_y = 0) if(current_user) hide() if(!M.client || !anchor) return current_user = M.client //Blank - menu_holder = image(icon='icons/effects/effects.dmi',loc=anchor,icon_state="nothing", layer = RADIAL_BACKGROUND_LAYER) + menu_holder = image(icon='icons/effects/effects.dmi',loc=anchor,icon_state="nothing", layer = RADIAL_BACKGROUND_LAYER, pixel_x = offset_x, pixel_y = offset_y) SET_PLANE_EXPLICIT(menu_holder, ABOVE_HUD_PLANE, M) menu_holder.appearance_flags |= KEEP_APART|RESET_ALPHA|RESET_COLOR|RESET_TRANSFORM menu_holder.vis_contents += elements + close_button @@ -358,7 +358,7 @@ GLOBAL_LIST_EMPTY(radial_menus) Choices should be a list where list keys are movables or text used for element names and return value and list values are movables/icons/images used for element icons */ -/proc/show_radial_menu(mob/user, atom/anchor, list/choices, uniqueid, radius, datum/callback/custom_check, require_near = FALSE, tooltips = FALSE, no_repeat_close = FALSE, radial_slice_icon = "radial_slice", autopick_single_option = TRUE, entry_animation = TRUE, click_on_hover = FALSE) +/proc/show_radial_menu(mob/user, atom/anchor, list/choices, uniqueid, radius, datum/callback/custom_check, require_near = FALSE, tooltips = FALSE, no_repeat_close = FALSE, radial_slice_icon = "radial_slice", autopick_single_option = TRUE, entry_animation = TRUE, click_on_hover = FALSE, user_space = FALSE) if(!user || !anchor || !length(choices)) return @@ -381,11 +381,18 @@ GLOBAL_LIST_EMPTY(radial_menus) menu.radius = radius if(istype(custom_check)) menu.custom_check_callback = custom_check - menu.anchor = anchor + menu.anchor = user_space ? user : anchor menu.radial_slice_icon = radial_slice_icon menu.check_screen_border(user) //Do what's needed to make it look good near borders or on hud menu.set_choices(choices, tooltips, click_on_hover) - menu.show_to(user) + var/offset_x = 0 + var/offset_y = 0 + if (user_space) + var/turf/user_turf = get_turf(user) + var/turf/anchor_turf = get_turf(anchor) + offset_x = (anchor_turf.x - user_turf.x) * world.icon_size + anchor.pixel_x - user.pixel_x + offset_y = (anchor_turf.y - user_turf.y) * world.icon_size + anchor.pixel_y - user.pixel_y + menu.show_to(user, offset_x, offset_y) menu.wait(user, anchor, require_near) var/answer = menu.selected_choice qdel(menu) diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index 8beb7cd7837..729bd92a125 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -37,6 +37,7 @@ GLOBAL_LIST_INIT_TYPED(quirk_blacklist, /list/datum/quirk, list( list(/datum/quirk/light_drinker, /datum/quirk/drunkhealing), list(/datum/quirk/oversized, /datum/quirk/freerunning), list(/datum/quirk/oversized, /datum/quirk/item_quirk/settler), + list(/datum/quirk/echolocation, /datum/quirk/item_quirk/blindness, /datum/quirk/item_quirk/nearsighted, /datum/quirk/item_quirk/deafness), //SKYRAT EDIT ADDITION END //BUBBER EDIT ADDITION BEGIN list(/datum/quirk/featherweight, /datum/quirk/oversized), diff --git a/code/datums/components/callouts.dm b/code/datums/components/callouts.dm index 24e7f081fbe..98d489cc915 100644 --- a/code/datums/components/callouts.dm +++ b/code/datums/components/callouts.dm @@ -111,7 +111,7 @@ for(var/datum/callout_option/callout_option as anything in callout_options) callout_items[callout_option] = image(icon = 'icons/hud/radial.dmi', icon_state = callout_option::icon_state) - var/datum/callout_option/selection = show_radial_menu(user, get_turf(clicked_atom), callout_items, entry_animation = FALSE, click_on_hover = TRUE) + var/datum/callout_option/selection = show_radial_menu(user, get_turf(clicked_atom), callout_items, entry_animation = FALSE, click_on_hover = TRUE, user_space = TRUE) if (!selection) return diff --git a/code/datums/components/crafting/entertainment.dm b/code/datums/components/crafting/entertainment.dm index 84b2ef163bb..f1aa865e0cb 100644 --- a/code/datums/components/crafting/entertainment.dm +++ b/code/datums/components/crafting/entertainment.dm @@ -250,11 +250,17 @@ ) category = CAT_EQUIPMENT -/datum/crafting_recipe/bonedice - name = "Bone Die" - result = /obj/item/dice/d6/bone - time = 5 SECONDS +/datum/crafting_recipe/violin + name = "Violin" + result = /obj/item/instrument/violin reqs = list( - /obj/item/stack/sheet/bone = 1, + /obj/item/stack/sheet/mineral/wood = 4, + /obj/item/stack/sheet/cloth = 2, + /obj/item/stack/sheet/iron = 1, ) - category = CAT_EQUIPMENT + tool_paths = list( + /obj/item/hatchet, + ) + time = 30 SECONDS + category = CAT_ENTERTAINMENT + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED diff --git a/code/datums/components/crafting/equipment.dm b/code/datums/components/crafting/equipment.dm index bd2b8b1d8b6..9bc0559c28a 100644 --- a/code/datums/components/crafting/equipment.dm +++ b/code/datums/components/crafting/equipment.dm @@ -23,6 +23,17 @@ time = 4 SECONDS category = CAT_EQUIPMENT +/datum/crafting_recipe/improvisedshield + name = "Moonflower Shield" + result = /obj/item/shield/buckler/moonflower + reqs = list( + /obj/item/seeds/sunflower/moonflower = 3, + /obj/item/grown/log/steel = 3, + ) + time = 4 SECONDS + category = CAT_EQUIPMENT + + /datum/crafting_recipe/radiogloves name = "Radio Gloves" result = /obj/item/clothing/gloves/radio @@ -260,3 +271,18 @@ ) category = CAT_EQUIPMENT tool_behaviors = list(TOOL_WELDER, TOOL_WIRECUTTER) + +// SKYRAT EDIT REMOVAL START +/* +/datum/crafting_recipe/arrow_quiver + name = "Archery Quiver" + result = /obj/item/storage/bag/quiver/lesser + time = 10 + reqs = list( + /obj/item/stack/sheet/leather = 4, + /obj/item/stack/sheet/cardboard = 4 + ) + category = CAT_EQUIPMENT + tool_behaviors = list(TOOL_WELDER, TOOL_WIRECUTTER) + +*/ // SKYRAT EDIT REMOVAL END diff --git a/code/datums/components/crafting/melee_weapon.dm b/code/datums/components/crafting/melee_weapon.dm index 594ff7aefd3..018d99d8703 100644 --- a/code/datums/components/crafting/melee_weapon.dm +++ b/code/datums/components/crafting/melee_weapon.dm @@ -191,3 +191,13 @@ ) time = 10 SECONDS category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/bambostaff + name = "Bamboo Bo Staff" + result = /obj/item/bambostaff + reqs = list( + /obj/item/stack/sheet/mineral/bamboo = 4, + /obj/item/grown/log/steel = 2, + ) + time = 8 SECONDS + category = CAT_WEAPON_MELEE diff --git a/code/datums/components/crafting/ranged_weapon.dm b/code/datums/components/crafting/ranged_weapon.dm index 4b6ab64a22c..0e3c7b11916 100644 --- a/code/datums/components/crafting/ranged_weapon.dm +++ b/code/datums/components/crafting/ranged_weapon.dm @@ -375,6 +375,21 @@ category = CAT_WEAPON_RANGED crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED +/datum/crafting_recipe/shortbow + name = "Shortbow" + result = /obj/item/gun/ballistic/bow/shortbow + reqs = list( + /obj/item/stack/sheet/mineral/wood = 4, + /obj/item/stack/sheet/cloth = 2, + /obj/item/stack/sheet/iron = 1, + ) + tool_paths = list( + /obj/item/hatchet, + ) + time = 30 SECONDS + category = CAT_WEAPON_RANGED + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED + /datum/crafting_recipe/photoncannon name = "Photon Cannon" result = /obj/item/gun/energy/photon diff --git a/code/datums/components/crafting/tailoring.dm b/code/datums/components/crafting/tailoring.dm index 2bcec49aeb5..3c498f74416 100644 --- a/code/datums/components/crafting/tailoring.dm +++ b/code/datums/components/crafting/tailoring.dm @@ -6,6 +6,61 @@ time = 5 SECONDS category = CAT_CLOTHING +/datum/crafting_recipe/durathread_robe + name = "Durathread Robe" + result = /obj/item/clothing/suit/wizrobe/durathread + reqs = list( + /obj/item/stack/sheet/durathread = 3, + /obj/item/stack/sheet/leather = 6, + ) + time = 5 SECONDS + category = CAT_CLOTHING + +/datum/crafting_recipe/durathread_robe_fire + name = "Durathread Pyromancer Robe" + result = /obj/item/clothing/suit/wizrobe/durathread/fire + reqs = list(/obj/item/clothing/suit/wizrobe/durathread = 1, + /obj/item/grown/novaflower = 1, + /obj/item/seeds/chili = 3) + time = 2 SECONDS + category = CAT_CLOTHING + +/datum/crafting_recipe/durathread_robe_ice + name = "Durathread Ice-o-mancer Robe" + result = /obj/item/clothing/suit/wizrobe/durathread/ice + reqs = list(/obj/item/clothing/suit/wizrobe/durathread = 1, + /obj/item/seeds/chili/ice = 1, + /obj/item/food/grown/herbs = 3) + time = 2 SECONDS + category = CAT_CLOTHING + +/datum/crafting_recipe/durathread_robe_electric + name = "Durathread Electromancer Robe" + result = /obj/item/clothing/suit/wizrobe/durathread/electric + reqs = list(/obj/item/clothing/suit/wizrobe/durathread = 1, + /obj/item/food/grown/mushroom/jupitercup = 1, + /obj/item/food/grown/sunflower = 3) + time = 2 SECONDS + category = CAT_CLOTHING + +/datum/crafting_recipe/durathread_robe_earth + name = "Durathread Geomancer Robe" + result = /obj/item/clothing/suit/wizrobe/durathread/earth + reqs = list(/obj/item/clothing/suit/wizrobe/durathread = 1, + /obj/item/food/grown/cahnroot = 1, + /obj/item/food/grown/potato = 3) + time = 2 SECONDS + category = CAT_CLOTHING + +/datum/crafting_recipe/durathread_robe_necro + name = "Durathread Necromancer Robe" + result = /obj/item/clothing/suit/wizrobe/durathread/necro + reqs = list(/obj/item/clothing/suit/wizrobe/durathread = 1, + /obj/item/food/grown/cannabis/death = 2, + /obj/item/food/grown/mushroom/angel = 2) + time = 2 SECONDS + category = CAT_CLOTHING + /datum/crafting_recipe/durathread_helmet name = "Durathread Helmet" result = /obj/item/clothing/head/helmet/durathread @@ -14,6 +69,62 @@ time = 4 SECONDS category = CAT_CLOTHING +/datum/crafting_recipe/watermelon_armour + name = "Watermelon Armour" + result = /obj/item/clothing/suit/armor/durability/watermelon + reqs = list(/obj/item/clothing/head/helmet/durability/watermelon = 3, + /obj/item/stack/sheet/durathread = 1) + time = 4 SECONDS + category = CAT_CLOTHING + +/datum/crafting_recipe/watermelon_armour_fr + name = "Watermelon Armour" + result = /obj/item/clothing/suit/armor/durability/watermelon/fire_resist + reqs = list(/obj/item/clothing/head/helmet/durability/watermelon/fire_resist = 3, + /obj/item/stack/sheet/durathread = 1) + time = 4 SECONDS + category = CAT_CLOTHING + +/datum/crafting_recipe/holymelon_armour + name = "Holymelon Armour" + result = /obj/item/clothing/suit/armor/durability/holymelon + reqs = list(/obj/item/clothing/head/helmet/durability/holymelon = 3, + /obj/item/stack/sheet/durathread = 1) + time = 4 SECONDS + category = CAT_CLOTHING + +/datum/crafting_recipe/holymelonmelon_armour_fr + name = "Holymelon Armour" + result = /obj/item/clothing/suit/armor/durability/holymelon/fire_resist + reqs = list(/obj/item/clothing/head/helmet/durability/holymelon/fire_resist = 3, + /obj/item/stack/sheet/durathread = 1) + time = 4 SECONDS + category = CAT_CLOTHING + +/datum/crafting_recipe/barrelmelon_armour + name = "Barrelmelon Armour" + result = /obj/item/clothing/suit/armor/durability/barrelmelon + reqs = list(/obj/item/clothing/head/helmet/durability/barrelmelon = 3, + /obj/item/stack/sheet/durathread = 1) + time = 4 SECONDS + category = CAT_CLOTHING + +/datum/crafting_recipe/barrelmelon_armour_fr + name = "Barrelmelon Armour" + result = /obj/item/clothing/suit/armor/durability/barrelmelon/fire_resist + reqs = list(/obj/item/clothing/head/helmet/durability/barrelmelon/fire_resist = 3, + /obj/item/stack/sheet/durathread = 1) + time = 4 SECONDS + category = CAT_CLOTHING + +/datum/crafting_recipe/grass_sheath + name = "Grass Sabre Sheath" + result = /obj/item/storage/belt/grass_sabre + reqs = list(/obj/item/food/grown/grass = 4, + /obj/item/food/grown/grass/fairy = 2) + time = 4 SECONDS + category = CAT_CONTAINERS + /datum/crafting_recipe/fannypack name = "Fannypack" result = /obj/item/storage/belt/fannypack diff --git a/code/datums/components/crafting/weapon_ammo.dm b/code/datums/components/crafting/weapon_ammo.dm index f68ff58072c..9a3448bc803 100644 --- a/code/datums/components/crafting/weapon_ammo.dm +++ b/code/datums/components/crafting/weapon_ammo.dm @@ -111,3 +111,68 @@ ) category = CAT_WEAPON_AMMO crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED + +/datum/crafting_recipe/arrow + name = "Arrow" + result = /obj/item/ammo_casing/arrow + reqs = list( + /obj/item/stack/sheet/mineral/wood = 1, + /obj/item/stack/sheet/cloth = 1, + /obj/item/stack/sheet/iron = 1, + ) + tool_paths = list( + /obj/item/hatchet, + ) + time = 5 SECONDS + category = CAT_WEAPON_AMMO + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED + +/datum/crafting_recipe/sticky_arrow + name = "Sticky arrow" + result = /obj/item/ammo_casing/arrow/sticky + reqs = list( + /obj/item/ammo_casing/arrow = 1, + /obj/item/food/honeycomb = 3, + ) + time = 5 SECONDS + category = CAT_WEAPON_AMMO + crafting_flags = CRAFT_CHECK_DENSITY + +/datum/crafting_recipe/poison_arrow + name = "Poison arrow" + result = /obj/item/ammo_casing/arrow/poison + reqs = list( + /obj/item/ammo_casing/arrow = 1, + /obj/item/food/grown/berries/poison = 5, + ) + time = 5 SECONDS + category = CAT_WEAPON_AMMO + crafting_flags = CRAFT_CHECK_DENSITY + +/datum/crafting_recipe/plastic_arrow + name = "Plastic Arrow" + result = /obj/item/ammo_casing/arrow/plastic + reqs = list( + /obj/item/stack/sheet/plastic = 1, + ) + tool_paths = list( + /obj/item/hatchet, + ) + time = 5 SECONDS + category = CAT_WEAPON_AMMO + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED + + +/datum/crafting_recipe/holy_arrow + name = "Holy Arrow" + result = /obj/item/ammo_casing/arrow/holy + reqs = list( + /obj/item/ammo_casing/arrow = 1, + /datum/reagent/water/holywater = 10, + ) + tool_paths = list( + /obj/item/gun/ballistic/bow/divine, + ) + time = 5 SECONDS + category = CAT_WEAPON_AMMO + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED diff --git a/code/datums/components/echolocation.dm b/code/datums/components/echolocation.dm index 020c47ad875..f5181a98147 100644 --- a/code/datums/components/echolocation.dm +++ b/code/datums/components/echolocation.dm @@ -32,7 +32,7 @@ /// Cooldown for the echolocation. COOLDOWN_DECLARE(cooldown_last) -/datum/component/echolocation/Initialize(echo_range, cooldown_time, image_expiry_time, fade_in_time, fade_out_time, images_are_static, blocking_trait, echo_group, echo_icon = "echo", color_path) +/datum/component/echolocation/Initialize(echo_range, cooldown_time, image_expiry_time, fade_in_time, fade_out_time, images_are_static, blocking_trait, echo_group, echo_icon, color_path, use_echo = TRUE, show_own_outline = FALSE, personal_color = "#ffffff") // SKYRAT EDIT CHANGE - ORIGINAL: /datum/component/echolocation/Initialize(echo_range, cooldown_time, image_expiry_time, fade_in_time, fade_out_time, images_are_static, blocking_trait, echo_group, echo_icon = "echo", color_path) . = ..() var/mob/living/echolocator = parent if(!istype(echolocator)) @@ -55,12 +55,19 @@ src.images_are_static = images_are_static if(!isnull(blocking_trait)) src.blocking_trait = blocking_trait + // SKYRAT ADDITION START: echolocation + src.show_own_outline = show_own_outline + src.echo_color = personal_color + // SKYRAT EDIT ADDITION END if(ispath(color_path)) client_color = echolocator.add_client_colour(color_path) src.echo_group = echo_group || REF(src) echolocator.add_traits(list(TRAIT_ECHOLOCATION_RECEIVER, TRAIT_TRUE_NIGHT_VISION), echo_group) //so they see all the tiles they echolocated, even if they are in the dark echolocator.become_blind(ECHOLOCATION_TRAIT) - echolocator.overlay_fullscreen("echo", /atom/movable/screen/fullscreen/echo, echo_icon) + // SKYRAT EDIT ADDITION START + if (use_echo) // add constructor toggle to not use the eye overlay + echolocator.overlay_fullscreen("echo", /atom/movable/screen/fullscreen/echo, echo_icon) + // SKYRAT EDIT ADDITION END START_PROCESSING(SSfastprocess, src) /datum/component/echolocation/Destroy(force) @@ -85,7 +92,7 @@ echolocate() /datum/component/echolocation/proc/echolocate() - if(!COOLDOWN_FINISHED(src, cooldown_last)) + if(stall || !COOLDOWN_FINISHED(src, cooldown_last)) // SKYRAT EDIT CHANGE - ORIGINAL: if(!COOLDOWN_FINISHED(src, cooldown_last)) return COOLDOWN_START(src, cooldown_last, cooldown_time) var/mob/living/echolocator = parent @@ -121,11 +128,18 @@ if(images_are_static) final_image.pixel_x = input.pixel_x final_image.pixel_y = input.pixel_y - if(HAS_TRAIT_FROM(input, TRAIT_ECHOLOCATION_RECEIVER, echo_group)) //mark other echolocation with full white - final_image.color = white_matrix + // SKYRAT ADDITION START: echolocation (show outlines on self) + if(HAS_TRAIT_FROM(input, TRAIT_ECHOLOCATION_RECEIVER, echo_group)) //mark other echolocation with full white, except ourselves + var/datum/component/echolocation/located_component = input.GetComponent(/datum/component/echolocation) + var/mob/living/echolocator = parent + if(located_component) + final_image.color = located_component.echo_color + else if(input != echolocator) + final_image.color = white_matrix + // SKYRAT EDIT ADDITION END var/list/fade_ins = list(final_image) for(var/mob/living/echolocate_receiver as anything in receivers) - if(echolocate_receiver == input) + if(echolocate_receiver == input && !show_own_outline) // SKYRAT EDIT CHANGE - ORIGINAL: if(echolocate_receiver == input) continue if(receivers[echolocate_receiver][input]) var/previous_image = receivers[echolocate_receiver][input]["image"] diff --git a/code/datums/components/fish_growth.dm b/code/datums/components/fish_growth.dm new file mode 100644 index 00000000000..bc7c8a9869e --- /dev/null +++ b/code/datums/components/fish_growth.dm @@ -0,0 +1,57 @@ +///A simple component that manages raising things from aquarium fish. +/datum/component/fish_growth + dupe_mode = COMPONENT_DUPE_SELECTIVE + ///the type of the movable that's spawned when the fish grows up. + var/result_type + ///The progress, from 0 to 100 + var/maturation + ///How much maturation is gained per tick + var/growth_rate + ///Is the result moved on the nearest drop location? + var/use_drop_loc + ///Is the parent deleted once the result is spawned? + var/del_on_grow + +/datum/component/fish_growth/Initialize(result_type, growth_rate, use_drop_loc = TRUE, del_on_grow = TRUE) + . = ..() + if(!isfish(parent)) + return COMPONENT_INCOMPATIBLE + RegisterSignal(parent, COMSIG_FISH_LIFE, PROC_REF(on_fish_life)) + src.result_type = result_type + src.growth_rate = growth_rate + src.use_drop_loc = use_drop_loc + src.del_on_grow = del_on_grow + +/datum/component/fish_growth/CheckDupeComponent(result_type, growth_rate, use_drop_loc = TRUE, del_on_grow = TRUE) + if(result_type == src.result_type) + src.growth_rate = growth_rate + return TRUE //copy the growth rate and kill the new component + return FALSE + +/datum/component/fish_growth/proc/on_fish_life(obj/item/fish/source, seconds_per_tick) + SIGNAL_HANDLER + if(SEND_SIGNAL(source, COMSIG_FISH_BEFORE_GROWING, seconds_per_tick) & COMPONENT_DONT_GROW) + return + maturation += growth_rate * seconds_per_tick + if(maturation >= 100) + finish_growing(source) + +/datum/component/fish_growth/proc/finish_growing(obj/item/fish/source) + var/atom/location = use_drop_loc ? source.drop_location() : source.loc + var/atom/movable/result = new result_type (location) + if(location != source.loc) + result.visible_message(span_boldnotice("\A [result] jumps out of [source.loc]!")) + playsound(result, 'sound/effects/fish_splash.ogg', 60) + if(isbasicmob(result)) + for(var/trait_type in source.fish_traits) + var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] + trait.apply_to_mob(result) + + addtimer(CALLBACK(result, TYPE_PROC_REF(/mob/living/basic, hop_on_nearby_turf)), 0.1 SECONDS) + + SEND_SIGNAL(source, COMSIG_FISH_FINISH_GROWING, result) + + if(del_on_grow) + qdel(parent) + else + maturation = 0 diff --git a/code/datums/components/gunpoint.dm b/code/datums/components/gunpoint.dm index ed4142f41ce..edde591c0c3 100644 --- a/code/datums/components/gunpoint.dm +++ b/code/datums/components/gunpoint.dm @@ -48,7 +48,7 @@ RegisterSignals(targ, list(COMSIG_LIVING_DISARM_HIT, COMSIG_LIVING_GET_PULLED), PROC_REF(cancel)) RegisterSignals(weapon, list(COMSIG_ITEM_DROPPED, COMSIG_ITEM_EQUIPPED), PROC_REF(cancel)) - var/distance = min(get_dist(shooter, target), 1) // treat 0 distance as adjacent + var/distance = max(get_dist(shooter, target), 1) // treat 0 distance as adjacent var/distance_description = (distance <= 1 ? "point blank " : "") shooter.visible_message(span_danger("[shooter] aims [weapon] [distance_description]at [target]!"), diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index a5ff46964bf..d64022d22b8 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -227,9 +227,12 @@ for(var/datum/uplink_item/item as anything in uplink_handler.extra_purchasable) if(item.stock_key in stock_list) extra_purchasable_stock[REF(item)] = stock_list[item.stock_key] + var/atom/actual_item = item.item extra_purchasable += list(list( "id" = item.type, "name" = item.name, + "icon" = actual_item.icon, + "icon_state" = actual_item.icon_state, "cost" = item.cost, "desc" = item.desc, "category" = item.category ? initial(item.category.name) : null, @@ -288,6 +291,13 @@ return item = SStraitor.uplink_items_by_type[item_path] uplink_handler.purchase_item(ui.user, item, parent) + if("buy_raw_tc") + if (uplink_handler.telecrystals <= 0) + return + var/desired_amount = tgui_input_number(ui.user, "How many raw telecrystals to buy?", "Buy Raw TC", default = uplink_handler.telecrystals, max_value = uplink_handler.telecrystals) + if(!desired_amount || desired_amount < 1) + return + uplink_handler.purchase_raw_tc(ui.user, desired_amount, parent) if("lock") if(!lockable) return TRUE diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 9560820f2f0..154027b8b9a 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -146,6 +146,8 @@ cycles_to_beat = max(DISEASE_RECOVERY_SCALING, DISEASE_CYCLES_HARMFUL) if(DISEASE_SEVERITY_BIOHAZARD) cycles_to_beat = max(DISEASE_RECOVERY_SCALING, DISEASE_CYCLES_BIOHAZARD) + else + cycles_to_beat = max(DISEASE_RECOVERY_SCALING, DISEASE_CYCLES_NONTHREAT) peaked_cycles += stage/max_stages //every cycle we spend sick counts towards eventually curing the virus, faster at higher stages recovery_prob += DISEASE_RECOVERY_CONSTANT + (peaked_cycles / (cycles_to_beat / DISEASE_RECOVERY_SCALING)) //more severe viruses are beaten back more aggressively after the peak if(stage_peaked) diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 8c8e8e02169..82099a7532b 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -265,7 +265,7 @@ properties["severity"] += round((properties["transmittable"] / 8), 1) properties["severity"] = round((properties["severity"] / 2), 1) properties["severity"] *= (symptoms.len / VIRUS_SYMPTOM_LIMIT) //fewer symptoms, less severity - properties["severity"] = clamp(properties["severity"], 1, 7) + properties["severity"] = round(clamp(properties["severity"], 1, 7), 1) properties["capacity"] = get_symptom_weights() // Assign the properties that are in the list. diff --git a/code/datums/dog_fashion.dm b/code/datums/dog_fashion.dm index c2154736cc0..7aa7f120e75 100644 --- a/code/datums/dog_fashion.dm +++ b/code/datums/dog_fashion.dm @@ -243,3 +243,18 @@ obj_icon_state = "eyepatch" emote_hear = list("sighs gruffly.", "groans.") emote_see = list("considers their own mortality.", "stares bleakly into the middle distance.", "ponders the horrors of warfare.") + +/datum/dog_fashion/head/watermelon + name = "Watermelon Warrior %REAL_NAME%" + desc = "5% safer than normal and ready to take on advantage!" + obj_icon_state = "watermelon" + +/datum/dog_fashion/head/holymelon + name = "Holymelon Paladin %REAL_NAME%" + desc = "Extraterrestial powers beware, %NAME% is here to smite you down!" + obj_icon_state = "holymelon" + +/datum/dog_fashion/head/barrelmelon + name = "Barrelmelon Berserk %REAL_NAME%" + desc = "Either the sturdiness of the helmet gave %REAL_NAME% a confidence boost, or its bit tight on their head..." + obj_icon_state = "barrelmelon" diff --git a/code/datums/greyscale/json_configs/meter.json b/code/datums/greyscale/json_configs/meter.json index 73cfb739959..344500c2a9d 100644 --- a/code/datums/greyscale/json_configs/meter.json +++ b/code/datums/greyscale/json_configs/meter.json @@ -2,26 +2,26 @@ "meter": [ { "type": "icon_state", - "icon_state": "pressure_off", + "icon_state": "meter_base", "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", + "icon_state": "pressure_off", "blend_mode": "overlay" } ], "meter0": [ { "type": "icon_state", - "icon_state": "pressure0", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure0", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -32,14 +32,14 @@ "meter1_1": [ { "type": "icon_state", - "icon_state": "pressure1_1", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure1_1", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -50,14 +50,14 @@ "meter1_2": [ { "type": "icon_state", - "icon_state": "pressure1_2", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure1_2", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -68,14 +68,14 @@ "meter1_3": [ { "type": "icon_state", - "icon_state": "pressure1_3", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure1_3", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -86,14 +86,14 @@ "meter1_4": [ { "type": "icon_state", - "icon_state": "pressure1_4", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure1_4", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -104,14 +104,14 @@ "meter1_5": [ { "type": "icon_state", - "icon_state": "pressure1_5", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure1_5", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -122,14 +122,14 @@ "meter1_6": [ { "type": "icon_state", - "icon_state": "pressure1_6", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure1_6", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -140,14 +140,14 @@ "meter2_1": [ { "type": "icon_state", - "icon_state": "pressure2_1", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure2_1", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -158,14 +158,14 @@ "meter2_2": [ { "type": "icon_state", - "icon_state": "pressure2_2", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure2_2", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -176,14 +176,14 @@ "meter2_3": [ { "type": "icon_state", - "icon_state": "pressure2_3", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure2_3", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -194,14 +194,14 @@ "meter2_4": [ { "type": "icon_state", - "icon_state": "pressure2_4", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure2_4", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -212,14 +212,14 @@ "meter2_5": [ { "type": "icon_state", - "icon_state": "pressure2_5", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure2_5", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -230,14 +230,14 @@ "meter2_6": [ { "type": "icon_state", - "icon_state": "pressure2_6", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure2_6", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -248,14 +248,14 @@ "meter3_1": [ { "type": "icon_state", - "icon_state": "pressure3_1", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure3_1", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -266,14 +266,14 @@ "meter3_2": [ { "type": "icon_state", - "icon_state": "pressure3_2", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure3_2", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -284,14 +284,14 @@ "meter3_3": [ { "type": "icon_state", - "icon_state": "pressure3_3", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure3_3", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -302,14 +302,14 @@ "meter3_4": [ { "type": "icon_state", - "icon_state": "pressure3_4", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure3_4", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -320,14 +320,14 @@ "meter3_5": [ { "type": "icon_state", - "icon_state": "pressure3_5", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure3_5", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -338,14 +338,14 @@ "meter3_6": [ { "type": "icon_state", - "icon_state": "pressure3_6", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure3_6", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", @@ -356,14 +356,14 @@ "meter4": [ { "type": "icon_state", - "icon_state": "pressure4", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "meter_base", + "blend_mode": "overlay" }, { "type": "icon_state", - "icon_state": "meter_base", - "blend_mode": "overlay" + "icon_state": "pressure4", + "blend_mode": "overlay", + "color_ids": [ 1 ] }, { "type": "icon_state", diff --git a/code/datums/pod_style.dm b/code/datums/pod_style.dm index 681e66ad082..853d7e05878 100644 --- a/code/datums/pod_style.dm +++ b/code/datums/pod_style.dm @@ -56,7 +56,7 @@ glow_color = "blue" id = "deathsquad" -/datum/pod_style/advanced +/datum/pod_style/cultist name = "bloody supply pod" ui_name = "Cultist" desc = "A Nanotrasen supply pod covered in scratch-marks, blood, and strange runes." diff --git a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm index 6832b07d125..a9d2e0bcaa0 100644 --- a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm +++ b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm @@ -449,3 +449,23 @@ /obj/structure/table = list(/obj/structure/table/greyscale = 9, /obj/structure/table/abductor = 1), /obj/structure/toilet = list(/obj/structure/toilet/greyscale = 1), ) + +/datum/dimension_theme/bronze + name = "Bronze" + icon = 'icons/obj/weapons/spear.dmi' + icon_state = "ratvarian_spear" + material = /datum/material/bronze + replace_walls = /turf/closed/wall/mineral/bronze + replace_floors = list(/turf/open/floor/bronze = 1, /turf/open/floor/bronze/flat = 1, /turf/open/floor/bronze/filled = 1) + replace_objs = list( + /obj/structure/girder = list(/obj/structure/girder/bronze = 1), + /obj/structure/window/fulltile = list(/obj/structure/window/bronze/fulltile = 1), + /obj/structure/window = list(/obj/structure/window/bronze = 1), + /obj/structure/statue = list(/obj/structure/statue/bronze/marx = 1), // karl marx was a servant of ratvar + /obj/structure/table = list(/obj/structure/table/bronze = 1), + /obj/structure/toilet = list(/obj/structure/toilet/greyscale = 1), + /obj/structure/chair = list(/obj/structure/chair/bronze = 1), + /obj/item/reagent_containers/cup/glass/trophy = list(/obj/item/reagent_containers/cup/glass/trophy/bronze_cup = 1), + /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/bronze = 1), + ) + sound = 'sound/magic/clockwork/fellowship_armory.ogg' diff --git a/code/game/objects/effects/particles/fire.dm b/code/game/objects/effects/particles/fire.dm index 9d90d0d29c2..99046858073 100644 --- a/code/game/objects/effects/particles/fire.dm +++ b/code/game/objects/effects/particles/fire.dm @@ -33,3 +33,21 @@ drift = generator(GEN_VECTOR, list(-0.1,0), list(0.1,0.025), UNIFORM_RAND) spin = generator(GEN_NUM, list(-15,15), NORMAL_RAND) scale = generator(GEN_VECTOR, list(0.5,0.5), list(2,2), NORMAL_RAND) + +/particles/embers/spark + count = 3 + spawning = 2 + gradient = list("#FBAF4D", "#FCE6B6", "#FFFFFF") + lifespan = 1.5 SECONDS + fade = 1 SECONDS + fadein = 0.1 SECONDS + grow = -0.1 + velocity = generator(GEN_CIRCLE, 3, 3, SQUARE_RAND) + position = generator(GEN_SPHERE, 0, 0, LINEAR_RAND) + scale = generator(GEN_VECTOR, list(0.5, 0.5), list(1,1), NORMAL_RAND) + drift = list(0) + +/particles/embers/spark/severe + count = 10 + spawning = 5 + gradient = list("#FCE6B6", "#FFFFFF") diff --git a/code/game/objects/effects/particles/smoke.dm b/code/game/objects/effects/particles/smoke.dm index 27249c65a68..776c90534a9 100644 --- a/code/game/objects/effects/particles/smoke.dm +++ b/code/game/objects/effects/particles/smoke.dm @@ -84,3 +84,16 @@ grow = 0.05 spin = 2 color = "#fcffff77" + +/particles/smoke/cyborg + count = 5 + spawning = 1 + lifespan = 1 SECONDS + fade = 1.8 SECONDS + position = list(0, 0, 0) + scale = list(0.5, 0.5) + grow = 0.1 + +/particles/smoke/cyborg/heavy_damage + lifespan = 0.8 SECONDS + fade = 0.8 SECONDS diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index f6917ee3c48..96dae8c0fc5 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -963,14 +963,10 @@ var/dark_light_range = 2.5 ///Variable to preserve old lighting behavior in flashlights, to handle darkness. var/dark_light_power = -3 - var/on = FALSE /obj/item/flashlight/flashdark/update_brightness() . = ..() - if(on) - set_light(dark_light_range, dark_light_power) - else - set_light(0) + set_light(dark_light_range, dark_light_power) //type and subtypes spawned and used to give some eyes lights, /obj/item/flashlight/eyelight diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index ed3d8e4605b..3d61f2a1760 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -352,10 +352,10 @@ return - if(iscarbon(talking_movable)) - var/mob/living/carbon/talking_carbon = talking_movable - if(talking_carbon.client?.prefs.read_preference(/datum/preference/toggle/radio_noise)) - SEND_SOUND(talking_carbon, 'sound/misc/radio_talk.ogg') + if(isliving(talking_movable)) + var/mob/living/talking_living = talking_movable + if(talking_living.client?.prefs.read_preference(/datum/preference/toggle/radio_noise)) + SEND_SOUND(talking_living, 'sound/misc/radio_talk.ogg') // All radios make an attempt to use the subspace system first signal.send_to_receivers() @@ -428,15 +428,17 @@ SEND_SIGNAL(src, COMSIG_RADIO_RECEIVE_MESSAGE, data) flick_overlay_view(overlay_speaker_active, 5 SECONDS) - if(iscarbon(loc)) - var/mob/living/carbon/holder = loc - if(!holder.client?.prefs.read_preference(/datum/preference/toggle/radio_noise)) - return + if(!isliving(loc)) + return - var/list/spans = data["spans"] - SEND_SOUND(holder, 'sound/misc/radio_receive.ogg') - if(SPAN_COMMAND in spans) - SEND_SOUND(holder, 'sound/misc/radio_important.ogg') + var/mob/living/holder = loc + if(!holder.client?.prefs.read_preference(/datum/preference/toggle/radio_noise)) + return + + var/list/spans = data["spans"] + SEND_SOUND(holder, 'sound/misc/radio_receive.ogg') + if(SPAN_COMMAND in spans) + SEND_SOUND(holder, 'sound/misc/radio_important.ogg') /obj/item/radio/ui_state(mob/user) return GLOB.inventory_state diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index 01ff7eb5f08..f32b2ee30ec 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -167,12 +167,6 @@ icon_state = "de6" microwave_riggable = FALSE // You can't melt wood in the microwave -/obj/item/dice/d6/bone - name = "bone die" - desc = "A die carved from a creature's bone. Dried blood marks the indented pits." - icon_state = "db6" - microwave_riggable = FALSE // You can't melt bone in the microwave - /obj/item/dice/d6/space name = "space cube" desc = "A die with six sides. 6 TIMES 255 TIMES 255 TILE TOTAL EXISTENCE, SQUARE YOUR MIND OF EDUCATED STUPID: 2 DOES NOT EXIST." diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm index 8ef85c8ea21..4e8b8cbf220 100644 --- a/code/game/objects/items/food/misc.dm +++ b/code/game/objects/items/food/misc.dm @@ -16,6 +16,87 @@ juice_typepath = /datum/reagent/consumable/watermelonjuice w_class = WEIGHT_CLASS_SMALL +/obj/item/food/watermelonmush + name = "watermelon mush" + desc = "A plop of watery goodness." + icon = 'icons/obj/service/hydroponics/harvest.dmi' + icon_state = "watermelonpulp" + food_reagents = list( + /datum/reagent/water = 2, + /datum/reagent/consumable/nutriment/vitamin = 0.1, + /datum/reagent/consumable/nutriment = 0.5, + ) + tastes = list("watermelon" = 1) + foodtypes = FRUIT + food_flags = FOOD_FINGER_FOOD + juice_typepath = /datum/reagent/consumable/watermelonjuice + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/holymelonslice + name = "holymelon slice" + desc = "A slice of holy goodness." + icon = 'icons/obj/service/hydroponics/harvest.dmi' + icon_state = "holymelonslice" + food_reagents = list( + /datum/reagent/water/holywater = 0.5, + /datum/reagent/consumable/nutriment/vitamin = 0.2, + /datum/reagent/consumable/nutriment = 1, + ) + tastes = list("holymelon" = 1) + foodtypes = FRUIT + food_flags = FOOD_FINGER_FOOD + juice_typepath = /datum/reagent/water/holywater + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/holymelonmush + name = "holymelon mush" + desc = "A plop of holy goodness." + icon = 'icons/obj/service/hydroponics/harvest.dmi' + icon_state = "holymelonpulp" + food_reagents = list( + /datum/reagent/water/holywater = 1, + /datum/reagent/consumable/nutriment/vitamin = 0.1, + /datum/reagent/consumable/nutriment = 0.5, + ) + tastes = list("holymelon" = 1) + foodtypes = FRUIT + food_flags = FOOD_FINGER_FOOD + juice_typepath = /datum/reagent/water/holywater + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/barrelmelonslice + name = "barrelmelon slice" + desc = "A slice of beery goodness." + icon = 'icons/obj/service/hydroponics/harvest.dmi' + icon_state = "barrelmelonslice" + food_reagents = list( + /datum/reagent/consumable/ethanol/beer = 1, + /datum/reagent/consumable/nutriment/vitamin = 0.2, + /datum/reagent/consumable/nutriment = 1, + ) + tastes = list("beer" = 1) + foodtypes = FRUIT + food_flags = FOOD_FINGER_FOOD + juice_typepath = /datum/reagent/consumable/ethanol/beer + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/barrelmelonmush + name = "barrelmelon mush" + desc = "A plop of beery goodness." + icon = 'icons/obj/service/hydroponics/harvest.dmi' + icon_state = "barrelmelonpulp" + food_reagents = list( + /datum/reagent/consumable/ethanol/beer = 2, + /datum/reagent/consumable/nutriment/vitamin = 0.1, + /datum/reagent/consumable/nutriment = 0.5, + ) + tastes = list("beer" = 1) + foodtypes = FRUIT + food_flags = FOOD_FINGER_FOOD + juice_typepath = /datum/reagent/consumable/ethanol/beer + w_class = WEIGHT_CLASS_SMALL + + /obj/item/food/appleslice name = "apple slice" desc = "The perfect after-school snack." diff --git a/code/game/objects/items/granters/crafting/fletching.dm b/code/game/objects/items/granters/crafting/fletching.dm new file mode 100644 index 00000000000..91ce20c43dd --- /dev/null +++ b/code/game/objects/items/granters/crafting/fletching.dm @@ -0,0 +1,22 @@ + +/obj/item/book/granter/crafting_recipe/fletching + name = "Whittle Me This: Fletching for the Modern Spacer" + desc = "A how-to guide to crafting and maintaining wooden bows, fletching arrows, and... making violins?" + crafting_recipe_types = list( + /datum/crafting_recipe/arrow, + /datum/crafting_recipe/plastic_arrow, + /datum/crafting_recipe/shortbow, + /datum/crafting_recipe/holy_arrow, + ///datum/crafting_recipe/arrow_quiver, // SKYRAT EDIT REMOVAL: public-knowledge quiver + /datum/crafting_recipe/violin, + ) + icon_state = "book4" + uses = INFINITY + remarks = list( + "Okay, so the quality of the wood has some impact.", + "I feel like the violin chapter is in here as a joke, surely...", + "The author seems oddly proud about how many years they've been hunting in 'these parts'...", + "i really wish they'd stop with all the marriage euphemisms...", + "I need membership? Membership with what?", + "Okay, I think I get the point already...", + ) diff --git a/code/game/objects/items/grenades/_grenade.dm b/code/game/objects/items/grenades/_grenade.dm index 6c84b5cf46e..bb9d275fb00 100644 --- a/code/game/objects/items/grenades/_grenade.dm +++ b/code/game/objects/items/grenades/_grenade.dm @@ -17,6 +17,8 @@ obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BELT max_integrity = 40 + pickup_sound = 'sound/items/grenade_pick_up.ogg' + drop_sound = 'sound/items/grenade_drop.ogg' /// Bitfields which prevent the grenade from detonating if set. Includes ([GRENADE_DUD]|[GRENADE_USED]) var/dud_flags = NONE ///Is this grenade currently armed? diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index c5a68260aba..7edc0009204 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -48,6 +48,8 @@ breakouttime = 1 MINUTES armor_type = /datum/armor/restraints_handcuffs custom_price = PAYCHECK_COMMAND * 0.35 + pickup_sound = 'sound/items/handcuffs_pick_up.ogg' + drop_sound = 'sound/items/handcuffs_drop.ogg' ///How long it takes to handcuff someone var/handcuff_time = 4 SECONDS @@ -55,6 +57,8 @@ var/handcuff_time_mod = 1 ///Sound that plays when starting to put handcuffs on someone var/cuffsound = 'sound/weapons/handcuffs.ogg' + ///Sound that plays when restrain is successful + var/cuffsuccesssound = 'sound/items/handcuff_finish.ogg' ///If set, handcuffs will be destroyed on application and leave behind whatever this is set to. var/trashtype = null /// How strong the cuffs are. Weak cuffs can be broken with wirecutters or boxcutters. @@ -120,6 +124,7 @@ return apply_cuffs(victim, user, dispense = iscyborg(user)) + playsound(loc, cuffsuccesssound, 30, TRUE, -2) victim.visible_message( span_notice("[user] handcuffs [victim]."), @@ -195,6 +200,8 @@ custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 1.5, /datum/material/glass= SMALL_MATERIAL_AMOUNT * 0.75) breakouttime = 30 SECONDS cuffsound = 'sound/weapons/cablecuff.ogg' + pickup_sound = null + drop_sound = null restraint_strength = HANDCUFFS_TYPE_WEAK /obj/item/restraints/handcuffs/cable/Initialize(mapload, new_color) diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm index 1a16b08eb86..848058a6a27 100644 --- a/code/game/objects/items/knives.dm +++ b/code/game/objects/items/knives.dm @@ -166,6 +166,19 @@ force = 15 throwforce = 15 +/obj/item/knife/combat/root + name = "cahn'root dagger" + icon = 'icons/obj/weapons/stabby.dmi' + icon_state = "rootdagger" + worn_icon_state = "root_dagger" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + inhand_icon_state = "rootshiv" + embed_type = /datum/embed_data/combat_knife/weak + desc = "A root dagger, deceptively sharp. Perfect to hide and stab someone with, or make a couple and throw them at enemies." + force = 15 + throwforce = 15 + /obj/item/knife/combat/bone name = "bone dagger" inhand_icon_state = "bone_dagger" @@ -177,7 +190,6 @@ desc = "A sharpened bone. The bare minimum in survival." embed_type = /datum/embed_data/combat_knife/weak obj_flags = parent_type::obj_flags & ~CONDUCTS_ELECTRICITY - slot_flags = NONE force = 15 throwforce = 15 custom_materials = null @@ -189,7 +201,9 @@ name = "cyborg knife" icon = 'icons/obj/items_cyborg.dmi' icon_state = "knife_cyborg" + worn_icon_state = "knife_cyborg" //error sprite - this shouldn't have been dropped desc = "A cyborg-mounted plasteel knife. Extremely sharp and durable." + slot_flags = NONE //you can't put this in your mouth /obj/item/knife/shiv name = "glass shiv" @@ -279,3 +293,18 @@ /obj/item/knife/shiv/carrot/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] forcefully drives \the [src] into [user.p_their()] eye! It looks like [user.p_theyre()] trying to commit suicide!")) return BRUTELOSS + +/obj/item/knife/shiv/parsnip + name = "parsnip shiv" + icon_state = "parsnipshiv" + inhand_icon_state = "parsnipshiv" + desc = "Truly putting 'snip' in the 'parsnip', and it's not sub-par either!" + custom_materials = null + +/obj/item/knife/shiv/root + name = "cahn'root shiv" + icon_state = "rootshiv" + inhand_icon_state = "rootshiv" + desc = "A root sharpened into a shiv. A root source of someone's stab wounds soon, most likely." + custom_materials = null + diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index 8555d5f6a81..4af5c4c923e 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -318,6 +318,8 @@ bare_wound_bonus = 5 clumsy_knockdown_time = 15 SECONDS active = FALSE + pickup_sound = 'sound/items/stun_baton_pick_up.ogg' + drop_sound = 'sound/items/stun_baton_drop.ogg' /// The sound effecte played when our baton is extended. var/on_sound = 'sound/weapons/batonextend.ogg' @@ -436,6 +438,8 @@ light_on = FALSE light_color = LIGHT_COLOR_ORANGE light_power = 0.5 + pickup_sound = 'sound/items/stun_baton_pick_up.ogg' + drop_sound = 'sound/items/stun_baton_drop.ogg' var/throw_stun_chance = 35 diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 0f38cf2d5de..9e7e9cec7ee 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -54,7 +54,7 @@ /obj/item/melee/sabre name = "officer's sabre" //SKYRAT EDIT - Buffed in modular_skyrat/modules/modular_weapons/code/melee.dm - desc = "An elegant weapon, its monomolecular edge is capable of cutting through flesh and bone with ease." + desc = "An elegant weapon, its monomolecular edge is capable of cutting through flesh and bone with ease." icon = 'icons/obj/weapons/sword.dmi' icon_state = "sabre" inhand_icon_state = "sabre" @@ -164,6 +164,47 @@ user.death(FALSE) REMOVE_TRAIT(src, TRAIT_NODROP, SABRE_SUICIDE_TRAIT) +/obj/item/melee/parsnip_sabre + name = "parsnip sabre" + desc = "A weird, yet elegant weapon. Suprisingly sharp for something made from a parsnip." + + icon = 'icons/obj/weapons/sword.dmi' + icon_state = "parsnip_sabre" + inhand_icon_state = "parsnip_sabre" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + force = 15 + throwforce = 10 + demolition_mod = 0.3 + w_class = WEIGHT_CLASS_BULKY + block_chance = 40 + armour_penetration = 40 + sharpness = SHARP_EDGED + attack_verb_continuous = list("slashes", "cuts") + attack_verb_simple = list("slash", "cut") + block_sound = 'sound/weapons/parry.ogg' + hitsound = 'sound/weapons/rapierhit.ogg' + custom_materials = null + wound_bonus = 5 + bare_wound_bonus = 15 + +/obj/item/melee/sabre/Initialize(mapload) + . = ..() + AddComponent(/datum/component/jousting) + +/obj/item/melee/parsnip_sabre/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) + if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK) + final_block_chance = 0 //Don't bring a sword to a gunfight, and also you aren't going to really block someone full body tackling you with a sword + return ..() + +/obj/item/melee/parsnip_sabre/on_exit_storage(datum/storage/container) + . = ..() + playsound(container.parent, 'sound/items/unsheath.ogg', 25, TRUE) + +/obj/item/melee/parsnip_sabre/on_enter_storage(datum/storage/container) + . = ..() + playsound(container.parent, 'sound/items/sheath.ogg', 25, TRUE) + /obj/item/melee/beesword name = "The Stinger" desc = "Taken from a giant bee and folded over one thousand times in pure honey. Can sting through anything." diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 1553f0e9c8f..c980fe0dbb3 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -99,6 +99,15 @@ max_integrity = 55 w_class = WEIGHT_CLASS_NORMAL +/obj/item/shield/buckler/moonflower + name = "moonflower buckler" + desc = "A buckler made from a steel-cap reinforced moonflower." + icon_state = "moonflower_buckler" + inhand_icon_state = "moonflower_buckler" + block_chance = 40 + max_integrity = 40 + w_class = WEIGHT_CLASS_NORMAL + /obj/item/shield/kite name = "kite shield" desc = "Protect your internal organs with this almond shaped shield." @@ -140,6 +149,8 @@ shield_break_sound = 'sound/effects/glassbr3.ogg' shield_break_leftover = /obj/item/shard armor_type = /datum/armor/item_shield/riot + pickup_sound = 'sound/items/plastic_shield_pick_up.ogg' + drop_sound = 'sound/items/plastic_shield_drop.ogg' /obj/item/shield/riot/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 6314c16c844..69dbe87cd5c 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -41,6 +41,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ merge_type = /obj/item/stack/rods pickup_sound = 'sound/items/iron_rod_pick_up.ogg' drop_sound = 'sound/items/metal_drop.ogg' + sound_vary = TRUE /datum/embed_data/rods embed_chance = 50 diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index de4d7506be3..d2b301197ad 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -398,6 +398,9 @@ /obj/item/restraints/legcuffs/bola, /obj/item/stock_parts/power_store/cell/microfusion, //SKYRAT EDIT ADDITION )) + atom_storage.open_sound = 'sound/items/holster.ogg' + atom_storage.open_sound_vary = TRUE + atom_storage.rustle_sound = FALSE /obj/item/storage/belt/security/full/PopulateContents() new /obj/item/reagent_containers/spray/pepper(src) @@ -883,6 +886,50 @@ new /obj/item/melee/sabre(src) update_appearance() +/obj/item/storage/belt/grass_sabre + name = "sabre sheath" + desc = "An simple grass sheath designed to hold a sabre of... some sort. Actual metal one might be too sharp, though..." + icon_state = "grass_sheath" + inhand_icon_state = "grass_sheath" + worn_icon_state = "grass_sheath" + w_class = WEIGHT_CLASS_BULKY + interaction_flags_click = parent_type::interaction_flags_click | NEED_DEXTERITY | NEED_HANDS + +/obj/item/storage/belt/grass_sabre/Initialize(mapload) + . = ..() + AddElement(/datum/element/update_icon_updates_onmob) + + atom_storage.max_slots = 1 + atom_storage.rustle_sound = FALSE + atom_storage.max_specific_storage = WEIGHT_CLASS_BULKY + atom_storage.set_holdable(/obj/item/melee/parsnip_sabre) + atom_storage.click_alt_open = FALSE + +/obj/item/storage/belt/grass_sabre/examine(mob/user) + . = ..() + if(length(contents)) + . += span_notice("Alt-click it to quickly draw the blade.") + +/obj/item/storage/belt/grass_sabre/click_alt(mob/user) + if(length(contents)) + var/obj/item/I = contents[1] + user.visible_message(span_notice("[user] takes [I] out of [src]."), span_notice("You take [I] out of [src].")) + user.put_in_hands(I) + update_appearance() + else + balloon_alert(user, "it's empty!") + return CLICK_ACTION_SUCCESS + +/obj/item/storage/belt/grass_sabre/update_icon_state() + icon_state = initial(inhand_icon_state) + inhand_icon_state = initial(inhand_icon_state) + worn_icon_state = initial(worn_icon_state) + if(contents.len) + icon_state += "-sabre" + inhand_icon_state += "-sabre" + worn_icon_state += "-sabre" + return ..() + /obj/item/storage/belt/plant name = "botanical belt" desc = "A sturdy leather belt used to hold most hydroponics supplies." diff --git a/code/game/objects/items/storage/boxes/job_boxes.dm b/code/game/objects/items/storage/boxes/job_boxes.dm index 7f6b1398c5f..2620cb58dc8 100644 --- a/code/game/objects/items/storage/boxes/job_boxes.dm +++ b/code/game/objects/items/storage/boxes/job_boxes.dm @@ -43,7 +43,7 @@ if(HAS_TRAIT(SSstation, STATION_TRAIT_RADIOACTIVE_NEBULA)) new /obj/item/storage/pill_bottle/potassiodide(src) - if(LAZYLEN(SSmapping.multiz_levels)) + if(length(SSmapping.levels_by_trait(ZTRAIT_STATION)) > 1) new /obj/item/climbing_hook/emergency(src) new /obj/item/oxygen_candle(src) //SKYRAT EDIT ADDITION diff --git a/code/game/objects/items/storage/holsters.dm b/code/game/objects/items/storage/holsters.dm index afb7b0f750b..f8dee3afdc7 100644 --- a/code/game/objects/items/storage/holsters.dm +++ b/code/game/objects/items/storage/holsters.dm @@ -33,6 +33,8 @@ /obj/item/gun/energy/laser/captain, /obj/item/gun/energy/e_gun/hos, )) + atom_storage.open_sound = 'sound/items/holster.ogg' + atom_storage.open_sound_vary = TRUE /obj/item/storage/belt/holster/energy name = "energy shoulder holsters" diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index c6b0d52cdc1..20e3846adef 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -191,7 +191,7 @@ desc = "A hydraulic prying tool, simple but powerful." icon = 'icons/obj/items_cyborg.dmi' icon_state = "toolkit_engiborg_crowbar" - worn_icon_state = "crowbar" + worn_icon_state = "toolkit_engiborg_crowbar" //error sprite - this shouldn't have been dropped usesound = 'sound/items/jaws_pry.ogg' force = 10 toolspeed = 0.5 diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index fbe11fe933d..0d3e3f60d4a 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -505,6 +505,37 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 user.visible_message(span_suicide("[user] is strangling [user.p_them()]self with [src]'s cord! It looks like [user.p_theyre()] trying to commit suicide!")) return OXYLOSS +/obj/item/bambostaff + name = "Bamboo Staff" + desc = "A long bamboo-made staff with steel-capped ends. It is rumoured that initiates of Spider Clan train with such before getting to learn how to use a katana." + force = 10 + block_chance = 45 + block_sound = 'sound/weapons/genhit.ogg' + slot_flags = ITEM_SLOT_BACK + w_class = WEIGHT_CLASS_BULKY + hitsound = SFX_SWING_HIT + attack_verb_continuous = list("smashes", "slams", "whacks", "thwacks") + attack_verb_simple = list("smash", "slam", "whack", "thwack") + icon = 'icons/obj/weapons/staff.dmi' + icon_state = "bambostaff0" + base_icon_state = "bambostaff" + inhand_icon_state = "bambostaff0" + worn_icon_state = "bambostaff0" + lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' + +/obj/item/bambostaff/Initialize(mapload) + . = ..() + AddComponent(/datum/component/two_handed, \ + force_unwielded = 10, \ + force_wielded = 14, \ + icon_wielded = "[base_icon_state]1", \ + ) + +/obj/item/bambostaff/update_icon_state() + icon_state = "[base_icon_state]0" + return ..() + /obj/item/cane name = "cane" desc = "A cane used by a true gentleman. Or a clown." diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm index 024276198ab..f9214b989b9 100644 --- a/code/game/objects/structures/lavaland/ore_vent.dm +++ b/code/game/objects/structures/lavaland/ore_vent.dm @@ -39,6 +39,7 @@ MEDIUM_VENT_TYPE = 5, SMALL_VENT_TYPE = 7, ) + var/wave_timer = WAVE_DURATION_SMALL /// What string do we use to warn the player about the excavation event? var/excavation_warning = "Are you ready to excavate this ore vent?" @@ -219,6 +220,9 @@ node.arrive(src) RegisterSignal(node, COMSIG_QDELETING, PROC_REF(handle_wave_conclusion)) RegisterSignal(node, COMSIG_MOVABLE_MOVED, PROC_REF(handle_wave_conclusion)) + addtimer(CALLBACK(node, TYPE_PROC_REF(/atom, update_appearance)), wave_timer * 0.25) + addtimer(CALLBACK(node, TYPE_PROC_REF(/atom, update_appearance)), wave_timer * 0.5) + addtimer(CALLBACK(node, TYPE_PROC_REF(/atom, update_appearance)), wave_timer * 0.75) particles = new /particles/smoke/ash() for(var/i in 1 to 5) // Clears the surroundings of the ore vent before starting wave defense. for(var/turf/closed/mineral/rock in oview(i)) @@ -247,11 +251,6 @@ spawn_distance = 4, \ spawn_distance_exclude = 3, \ ) - var/wave_timer = 60 SECONDS - if(boulder_size == BOULDER_SIZE_MEDIUM) - wave_timer = 90 SECONDS - else if(boulder_size == BOULDER_SIZE_LARGE) - wave_timer = 150 SECONDS COOLDOWN_START(src, wave_cooldown, wave_timer) addtimer(CALLBACK(src, PROC_REF(handle_wave_conclusion)), wave_timer) icon_state = icon_state_tapped @@ -290,6 +289,7 @@ icon_state = icon_state_tapped update_appearance(UPDATE_ICON_STATE) qdel(GetComponent(/datum/component/gps)) + UnregisterSignal(node, COMSIG_QDELETING) else visible_message(span_danger("\the [src] creaks and groans as the mining attempt fails, and the vent closes back up.")) icon_state = initial(icon_state) @@ -474,18 +474,22 @@ switch(string_boulder_size) if(LARGE_VENT_TYPE) boulder_size = BOULDER_SIZE_LARGE + wave_timer = WAVE_DURATION_LARGE if(mapload) GLOB.ore_vent_sizes["large"] += 1 if(MEDIUM_VENT_TYPE) boulder_size = BOULDER_SIZE_MEDIUM + wave_timer = WAVE_DURATION_MEDIUM if(mapload) GLOB.ore_vent_sizes["medium"] += 1 if(SMALL_VENT_TYPE) boulder_size = BOULDER_SIZE_SMALL + wave_timer = WAVE_DURATION_SMALL if(mapload) GLOB.ore_vent_sizes["small"] += 1 else boulder_size = BOULDER_SIZE_SMALL //Might as well set a default value + wave_timer = WAVE_DURATION_SMALL name = initial(name) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 881603e11d8..e2cc6a55202 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -356,6 +356,7 @@ if((shove_flags & SHOVE_KNOCKDOWN_BLOCKED) || !(shove_flags & SHOVE_BLOCKED)) return target.Knockdown(SHOVE_KNOCKDOWN_TABLE) + target.apply_status_effect(/datum/status_effect/next_shove_stuns) target.visible_message(span_danger("[shover.name] shoves [target.name] onto \the [src]!"), span_userdanger("You're shoved onto \the [src] by [shover.name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, shover) to_chat(shover, span_danger("You shove [target.name] onto \the [src]!")) diff --git a/code/game/objects/structures/water_structures/water_source.dm b/code/game/objects/structures/water_structures/water_source.dm index b7ad26a65ea..e06cd8c6771 100644 --- a/code/game/objects/structures/water_structures/water_source.dm +++ b/code/game/objects/structures/water_structures/water_source.dm @@ -137,6 +137,15 @@ base_icon_state = "puddle" resistance_flags = UNACIDABLE +/obj/structure/water_source/puddle/Initialize(mapload) + . = ..() + register_context() + +/obj/structure/water_source/puddle/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(isnull(held_item)) + context[SCREENTIP_CONTEXT_RMB] = "Scoop Tadpoles" + //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/structure/water_source/puddle/attack_hand(mob/user, list/modifiers) icon_state = "[base_icon_state]-splash" @@ -147,3 +156,20 @@ icon_state = "[base_icon_state]-splash" . = ..() icon_state = base_icon_state + +/obj/structure/water_source/puddle/attack_hand_secondary(mob/living/carbon/human/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + if(DOING_INTERACTION_WITH_TARGET(user, src)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + icon_state = "[base_icon_state]-splash" + balloon_alert(user, "scooping tadpoles...") + if(do_after(user, src, 5 SECONDS)) + playsound(loc, 'sound/effects/slosh.ogg', 15, TRUE) + balloon_alert(user, "got a tadpole") + var/obj/item/fish/tadpole/tadpole = new(loc) + tadpole.randomize_size_and_weight() + user.put_in_hands(tadpole) + icon_state = base_icon_state + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN diff --git a/code/modules/admin/verbs/server.dm b/code/modules/admin/verbs/server.dm index e3a66dcd1b3..f0817f06a36 100644 --- a/code/modules/admin/verbs/server.dm +++ b/code/modules/admin/verbs/server.dm @@ -16,10 +16,15 @@ ADMIN_VERB(toggle_hub, R_SERVER, "Toggle Hub", "Toggles the server's visilibilit SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggled Hub Visibility", "[GLOB.hub_visibility ? "Enabled" : "Disabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! +#define REGULAR_RESTART "Regular Restart" +#define REGULAR_RESTART_DELAYED "Regular Restart (with delay)" +#define HARD_RESTART "Hard Restart (No Delay/Feedback Reason)" +#define HARDEST_RESTART "Hardest Restart (No actions, just reboot)" +#define TGS_RESTART "Server Restart (Kill and restart DD)" ADMIN_VERB(restart, R_SERVER, "Reboot World", "Restarts the world immediately.", ADMIN_CATEGORY_SERVER) - var/list/options = list("Regular Restart", "Regular Restart (with delay)", "Hard Restart (No Delay/Feeback Reason)", "Hardest Restart (No actions, just reboot)") + var/list/options = list(REGULAR_RESTART, REGULAR_RESTART_DELAYED, HARD_RESTART, HARDEST_RESTART) if(world.TgsAvailable()) - options += "Server Restart (Kill and restart DD)"; + options += TGS_RESTART; if(SSticker.admin_delay_notice) if(alert(user, "Are you sure? An admin has already delayed the round end for the following reason: [SSticker.admin_delay_notice]", "Confirmation", "Yes", "No") != "Yes") @@ -32,12 +37,12 @@ ADMIN_VERB(restart, R_SERVER, "Reboot World", "Restarts the world immediately.", BLACKBOX_LOG_ADMIN_VERB("Reboot World") var/init_by = "Initiated by [user.holder.fakekey ? "Admin" : user.key]." switch(result) - if("Regular Restart") + if(REGULAR_RESTART) if(!user.is_localhost()) if(alert(user, "Are you sure you want to restart the server?","This server is live", "Restart", "Cancel") != "Restart") return FALSE SSticker.Reboot(init_by, "admin reboot - by [user.key] [user.holder.fakekey ? "(stealth)" : ""]", 10) - if("Regular Restart (with delay)") + if(REGULAR_RESTART_DELAYED) var/delay = input("What delay should the restart have (in seconds)?", "Restart Delay", 5) as num|null if(!delay) return FALSE @@ -45,16 +50,22 @@ ADMIN_VERB(restart, R_SERVER, "Reboot World", "Restarts the world immediately.", if(alert(user,"Are you sure you want to restart the server?","This server is live", "Restart", "Cancel") != "Restart") return FALSE SSticker.Reboot(init_by, "admin reboot - by [user.key] [user.holder.fakekey ? "(stealth)" : ""]", delay * 10) - if("Hard Restart (No Delay, No Feeback Reason)") + if(HARD_RESTART) to_chat(world, "World reboot - [init_by]") world.Reboot() - if("Hardest Restart (No actions, just reboot)") + if(HARDEST_RESTART) to_chat(world, "Hard world reboot - [init_by]") world.Reboot(fast_track = TRUE) - if("Server Restart (Kill and restart DD)") + if(TGS_RESTART) to_chat(world, "Server restart - [init_by]") world.TgsEndProcess() +#undef REGULAR_RESTART +#undef REGULAR_RESTART_DELAYED +#undef HARD_RESTART +#undef HARDEST_RESTART +#undef TGS_RESTART + ADMIN_VERB(end_round, R_SERVER, "End Round", "Forcibly ends the round and allows the server to restart normally.", ADMIN_CATEGORY_SERVER) var/confirm = tgui_alert(user, "End the round and restart the game world?", "End Round", list("Yes", "Cancel")) if(confirm != "Yes") diff --git a/code/modules/antagonists/clown_ops/clown_weapons.dm b/code/modules/antagonists/clown_ops/clown_weapons.dm index 130b6c9af5f..1e566b7d197 100644 --- a/code/modules/antagonists/clown_ops/clown_weapons.dm +++ b/code/modules/antagonists/clown_ops/clown_weapons.dm @@ -192,7 +192,7 @@ //BOMBANANA /obj/item/seeds/banana/bombanana - name = "pack of bombanana seeds" + name = "bombanana seed pack" desc = "They're seeds that grow into bombanana trees. When grown, give to the clown." plantname = "Bombanana Tree" product = /obj/item/food/grown/banana/bombanana diff --git a/code/modules/antagonists/heretic/influences.dm b/code/modules/antagonists/heretic/influences.dm index 26855d2d02a..3e7bfad8f44 100644 --- a/code/modules/antagonists/heretic/influences.dm +++ b/code/modules/antagonists/heretic/influences.dm @@ -253,7 +253,7 @@ return SECONDARY_ATTACK_CALL_NORMAL if(being_drained) - balloon_alert(user, "already being drained!") + loc.balloon_alert(user, "already being drained!") else INVOKE_ASYNC(src, PROC_REF(drain_influence), user, 1) @@ -285,15 +285,15 @@ /obj/effect/heretic_influence/proc/drain_influence(mob/living/user, knowledge_to_gain) being_drained = TRUE - balloon_alert(user, "draining influence...") + loc.balloon_alert(user, "draining influence...") if(!do_after(user, 10 SECONDS, src, hidden = TRUE)) being_drained = FALSE - balloon_alert(user, "interrupted!") + loc.balloon_alert(user, "interrupted!") return // We don't need to set being_drained back since we delete after anyways - balloon_alert(user, "influence drained") + loc.balloon_alert(user, "influence drained") var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) heretic_datum.knowledge_points += knowledge_to_gain diff --git a/code/modules/antagonists/traitor/uplink_handler.dm b/code/modules/antagonists/traitor/uplink_handler.dm index f78ddb02478..2d27f3c4a0e 100644 --- a/code/modules/antagonists/traitor/uplink_handler.dm +++ b/code/modules/antagonists/traitor/uplink_handler.dm @@ -126,6 +126,21 @@ on_update() return TRUE +/datum/uplink_handler/proc/purchase_raw_tc(mob/user, amount, atom/movable/source) + if(shop_locked) + return FALSE + if(telecrystals < amount) + return FALSE + + telecrystals -= amount + var/tcs = new /obj/item/stack/telecrystal(get_turf(user), amount) + user.put_in_hands(tcs) + + log_uplink("[key_name(user)] purchased [amount] raw telecrystals from [source]'s uplink") + on_update() + return TRUE + + /// Generates objectives for this uplink handler /datum/uplink_handler/proc/generate_objectives() var/potential_objectives_left = maximum_potential_objectives - (length(potential_objectives) + length(active_objectives)) diff --git a/code/modules/asset_cache/assets/uplink.dm b/code/modules/asset_cache/assets/uplink.dm index e85ee1b35b5..35a907a234d 100644 --- a/code/modules/asset_cache/assets/uplink.dm +++ b/code/modules/asset_cache/assets/uplink.dm @@ -18,10 +18,13 @@ for(var/datum/uplink_item/item_path as anything in subtypesof(/datum/uplink_item)) var/datum/uplink_item/item = new item_path() + var/atom/actual_item = item.item if(item.item) { items += list(list( "id" = item_path, "name" = item.name, + "icon" = actual_item.icon, + "icon_state" = actual_item.icon_state, "cost" = item.cost, "desc" = item.desc, "category" = item.category ? initial(item.category.name) : null, diff --git a/code/modules/bitrunning/components/avatar_connection.dm b/code/modules/bitrunning/components/avatar_connection.dm index 342150797e4..b56fd3069c7 100644 --- a/code/modules/bitrunning/components/avatar_connection.dm +++ b/code/modules/bitrunning/components/avatar_connection.dm @@ -20,7 +20,7 @@ help_text, ) - if(!isliving(parent) || !isliving(old_body) || !server.is_operational || !pod.is_operational) + if(!isliving(parent) || !isliving(old_body) || !old_mind || !server.is_operational || !pod.is_operational) return COMPONENT_INCOMPATIBLE var/mob/living/avatar = parent @@ -67,6 +67,9 @@ if(alias && avatar.real_name != alias) avatar.fully_replace_character_name(avatar.real_name, alias) + for(var/skill_type in old_mind.known_skills) + avatar.mind.set_experience(skill_type, old_mind.get_skill_exp(skill_type), silent = TRUE) + avatar.playsound_local(avatar, 'sound/magic/blink.ogg', 25, TRUE) avatar.set_static_vision(2 SECONDS) avatar.set_temp_blindness(1 SECONDS) // I'm in @@ -282,6 +285,10 @@ if(isnull(old_mind) || isnull(old_body)) return + for(var/skill_type in avatar.mind.known_skills) + old_mind.set_experience(skill_type, avatar.mind.get_skill_exp(skill_type), silent = TRUE) + avatar.mind.set_experience(skill_type, 0, silent = TRUE) + ghost.mind = old_mind if(old_body.stat != DEAD) old_mind.transfer_to(old_body, force_key_move = TRUE) diff --git a/code/modules/bitrunning/turfs.dm b/code/modules/bitrunning/turfs.dm index 93dce1789c4..6ceb31b0e31 100644 --- a/code/modules/bitrunning/turfs.dm +++ b/code/modules/bitrunning/turfs.dm @@ -1,4 +1,4 @@ -/turf/open/floor/bitrunning_transport +/turf/open/indestructible/bitrunning_transport name = "circuit floor" icon = 'icons/turf/floors.dmi' desc = "Looks complex. You can see the circuits running through the floor." diff --git a/code/modules/capture_the_flag/medieval_sim/medisim_classes.dm b/code/modules/capture_the_flag/medieval_sim/medisim_classes.dm index 3c4a55748c4..09ed5b40b1f 100644 --- a/code/modules/capture_the_flag/medieval_sim/medisim_classes.dm +++ b/code/modules/capture_the_flag/medieval_sim/medisim_classes.dm @@ -26,7 +26,7 @@ name = "Redfield Castle Archer" icon_state = "medisim_archer" - belt = /obj/item/storage/bag/quiver + belt = /obj/item/storage/bag/quiver/full suit = /obj/item/clothing/suit/armor/vest/cuirass l_hand = /obj/item/gun/ballistic/bow diff --git a/code/modules/cargo/exports/fish.dm b/code/modules/cargo/exports/fish.dm index 3860dff904b..9c34fd3afca 100644 --- a/code/modules/cargo/exports/fish.dm +++ b/code/modules/cargo/exports/fish.dm @@ -6,8 +6,4 @@ /datum/export/fish/get_cost(obj/item/fish/fish, apply_elastic) var/elastic_cost = ..() var/elastic_percent = elastic_cost / init_cost - var/size_weight_exponentation = (fish.size * fish.weight * 0.01)^0.85 - var/new_cost = elastic_cost + size_weight_exponentation * elastic_percent - if(HAS_TRAIT(fish, TRAIT_FISH_FROM_CASE)) //Avoid printing money by simply ordering fish and sending it back. - new_cost *= 0.05 - return round(new_cost) + return fish.get_export_price(elastic_cost, elastic_percent) diff --git a/code/modules/cargo/packs/imports.dm b/code/modules/cargo/packs/imports.dm index 98ab1e78594..8a282770c4e 100644 --- a/code/modules/cargo/packs/imports.dm +++ b/code/modules/cargo/packs/imports.dm @@ -315,11 +315,12 @@ Removal End */ risky espionage hallway operations. Enjoy our product!" contraband = TRUE cost = CARGO_CRATE_VALUE * 6 - contains = list(/obj/item/clothing/under/syndicate/floortilecamo = 3, - /obj/item/clothing/mask/floortilebalaclava = 3, - /obj/item/clothing/gloves/combat/floortile = 3, - /obj/item/clothing/shoes/jackboots/floortile = 3, - /obj/item/storage/backpack/floortile = 3 + contains = list( + /obj/item/clothing/under/syndicate/floortilecamo = 3, + /obj/item/clothing/mask/floortilebalaclava = 3, + /obj/item/clothing/gloves/combat/floortile = 3, + /obj/item/clothing/shoes/jackboots/floortile = 3, + /obj/item/storage/backpack/floortile = 3 ) crate_name = "floortile camouflauge crate" crate_type = /obj/structure/closet/crate/secure/weapon diff --git a/code/modules/cargo/packs/service.dm b/code/modules/cargo/packs/service.dm index 434450b4302..20323b52960 100644 --- a/code/modules/cargo/packs/service.dm +++ b/code/modules/cargo/packs/service.dm @@ -303,3 +303,17 @@ contains = list(/obj/item/wallframe/barsign/all_access) crate_name = "bar sign crate" discountable = SUPPLY_PACK_RARE_DISCOUNTABLE + +/datum/supply_pack/service/bowmaking + name = "Fletching and Bow-Making Starter Kit" + desc = "A fairly outdated copy of 'Whittle Me This: Fletching for the Modern Spacer', along with some useful materials. \ + For those looking to get into bow-making, or give their LARPing a little more edge, you can't go wrong. Also has \ + instructions for making violins." + cost = CARGO_CRATE_VALUE * 1.5 + contains = list( + /obj/item/book/granter/crafting_recipe/fletching = 1, + /obj/item/stack/sheet/mineral/wood = 10, + /obj/item/stack/sheet/cloth = 10, + ) + crate_name = "bowmaking starter kit crate" + crate_type = /obj/structure/closet/crate/wooden diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index be71e79319f..f5915eaed37 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -426,18 +426,22 @@ insert(turf_underneath, holder) /obj/structure/closet/supplypod/insert(atom/to_insert, atom/movable/holder) - if(insertion_allowed(to_insert)) - if(isturf(to_insert)) - var/turf/turf_to_insert = to_insert - turfs_in_cargo += turf_to_insert.type - turf_to_insert.ScrapeAway() - else - var/atom/movable/movable_to_insert = to_insert - movable_to_insert.forceMove(holder) - return TRUE - else + if(!insertion_allowed(to_insert)) return FALSE + if(isturf(to_insert)) + var/turf/turf_to_insert = to_insert + turfs_in_cargo += turf_to_insert.type + turf_to_insert.ScrapeAway() + return TRUE + + var/atom/movable/movable_to_insert = to_insert + if (ismob(movable_to_insert)) + var/mob/mob_to_insert = movable_to_insert + if (!isnull(mob_to_insert.buckled)) + mob_to_insert.buckled.unbuckle_mob(mob_to_insert, force = TRUE) + movable_to_insert.forceMove(holder) + /obj/structure/closet/supplypod/insertion_allowed(atom/to_insert) if(to_insert.invisibility == INVISIBILITY_ABSTRACT) return FALSE diff --git a/code/modules/client/preferences/clothing.dm b/code/modules/client/preferences/clothing.dm index b54149db299..e57d87bf2c8 100644 --- a/code/modules/client/preferences/clothing.dm +++ b/code/modules/client/preferences/clothing.dm @@ -155,7 +155,7 @@ return /datum/sprite_accessory/undershirt/sports_bra::name return ..() -*/ // NOVA EDIT REMOVAL END +*/ // SKYRAT EDIT REMOVAL END /datum/preference/choiced/undershirt/icon_for(value) var/static/icon/body diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 7034cd3484c..65aa5642b8b 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -183,19 +183,19 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car apply_all_client_preferences() //general preferences - lastchangelog = savefile.get_entry("lastchangelog") - be_special = savefile.get_entry("be_special") - default_slot = savefile.get_entry("default_slot") - chat_toggles = savefile.get_entry("chat_toggles") - toggles = savefile.get_entry("toggles") - ignoring = savefile.get_entry("ignoring") + lastchangelog = savefile.get_entry("lastchangelog", lastchangelog) + be_special = savefile.get_entry("be_special", be_special) + default_slot = savefile.get_entry("default_slot", default_slot) + chat_toggles = savefile.get_entry("chat_toggles", chat_toggles) + toggles = savefile.get_entry("toggles", toggles) + ignoring = savefile.get_entry("ignoring", ignoring) // OOC commendations - hearted_until = savefile.get_entry("hearted_until") + hearted_until = savefile.get_entry("hearted_until", hearted_until) if(hearted_until > world.realtime) hearted = TRUE //favorite outfits - favorite_outfits = savefile.get_entry("favorite_outfits") + favorite_outfits = savefile.get_entry("favorite_outfits", favorite_outfits) var/list/parsed_favs = list() for(var/typetext in favorite_outfits) @@ -205,7 +205,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car favorite_outfits = unique_list(parsed_favs) // Custom hotkeys - key_bindings = savefile.get_entry("key_bindings") + key_bindings = savefile.get_entry("key_bindings", key_bindings) //try to fix any outdated data if necessary if(needs_update >= 0) diff --git a/code/modules/clothing/head/hat.dm b/code/modules/clothing/head/hat.dm index d9258b8c7dd..7b7329088c8 100644 --- a/code/modules/clothing/head/hat.dm +++ b/code/modules/clothing/head/hat.dm @@ -210,6 +210,14 @@ name = "rice hat" desc = "Welcome to the rice fields, motherfucker." icon_state = "rice_hat" + base_icon_state = "rice_hat" + var/reversed = FALSE + +/obj/item/clothing/head/costume/rice_hat/click_alt(mob/user) + reversed = !reversed + worn_icon_state = "[base_icon_state][reversed ? "_kim" : ""]" + to_chat(user, span_notice("You [reversed ? "lower" : "raise"] the hat.")) + update_appearance() /obj/item/clothing/head/costume/lizard name = "lizardskin cloche hat" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 68921334510..76c230ca504 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -568,3 +568,106 @@ fire = 50 acid = 50 wound = 30 + +/obj/item/clothing/head/helmet/durability/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) + take_damage(1, BRUTE, 0, 0) + +/obj/item/clothing/head/helmet/durability/watermelon + name = "Watermelon Helmet" + desc = "A helmet cut out from a watermelon. Might take a few hits, but don't expect it whitstand much." + icon_state = "watermelon" + inhand_icon_state = "watermelon" + flags_inv = HIDEEARS + dog_fashion = /datum/dog_fashion/head/watermelon + armor_type = /datum/armor/helmet_watermelon + max_integrity = 15 + +/obj/item/clothing/head/helmet/durability/watermelon/fire_resist + resistance_flags = FIRE_PROOF + armor_type = /datum/armor/helmet_watermelon_fr + +/datum/armor/helmet_watermelon + melee = 15 + bullet = 10 + energy = 10 + bomb = 10 + fire = 0 + acid = 25 + wound = 5 + +/datum/armor/helmet_watermelon_fr + melee = 15 + bullet = 10 + energy = 10 + bomb = 10 + fire = 15 + acid = 30 + wound = 5 + +/obj/item/clothing/head/helmet/durability/holymelon + name = "Holymelon Helmet" + desc = "A helmet from a hollowed out holymelon. Might take a few hits, but don't expect it whitstand much." + icon_state = "holymelon" + inhand_icon_state = "holymelon" + flags_inv = HIDEEARS + dog_fashion = /datum/dog_fashion/head/holymelon + armor_type = /datum/armor/helmet_watermelon + max_integrity = 15 + var/decayed = FALSE + +/obj/item/clothing/head/helmet/durability/holymelon/fire_resist + resistance_flags = FIRE_PROOF + armor_type = /datum/armor/helmet_watermelon_fr + +/obj/item/clothing/head/helmet/durability/holymelon/Initialize(mapload) + . = ..() + if(decayed) + decay() + return + + AddComponent( + /datum/component/anti_magic, \ + antimagic_flags = MAGIC_RESISTANCE_HOLY, \ + inventory_flags = ITEM_SLOT_OCLOTHING, \ + charges = 1, \ + drain_antimagic = CALLBACK(src, PROC_REF(drain_antimagic)), \ + expiration = CALLBACK(src, PROC_REF(decay)) \ + ) + +/obj/item/clothing/head/helmet/durability/holymelon/proc/drain_antimagic(mob/user) + to_chat(user, span_warning("[src] looses a bit of its shimmer and glossiness...")) + +/obj/item/clothing/head/helmet/durability/holymelon/proc/decay() + take_damage(8, BRUTE, 0, 0) + +/obj/item/clothing/head/helmet/durability/barrelmelon + name = "Barrelmelon Helmet" + desc = "A helmet from hollowed out barrelmelon. As sturdy as if made from actual wood, though its rigid structure makes it break up quicker." + icon_state = "barrelmelon" + inhand_icon_state = "barrelmelon" + flags_inv = HIDEEARS + dog_fashion = /datum/dog_fashion/head/barrelmelon + armor_type = /datum/armor/helmet_barrelmelon + max_integrity = 10 + +/obj/item/clothing/head/helmet/durability/barrelmelon/fire_resist + resistance_flags = FIRE_PROOF + armor_type = /datum/armor/helmet_barrelmelon_fr + +/datum/armor/helmet_barrelmelon + melee = 25 + bullet = 20 + energy = 15 + bomb = 10 + fire = 0 + acid = 35 + wound = 10 + +/datum/armor/helmet_barrelmelon_fr + melee = 25 + bullet = 20 + energy = 15 + bomb = 10 + fire = 20 + acid = 40 + wound = 10 diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 63a0dd515c3..380cd0cf3fb 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -118,33 +118,45 @@ . = ..() if(!up) . += visor_icon + if(smile) + var/mutable_appearance/smiley = mutable_appearance(icon, smile_state) + smiley.color = smile_color + . += smiley -/obj/item/clothing/head/helmet/space/plasmaman/attackby(obj/item/hitting_item, mob/living/user) - . = ..() - if(istype(hitting_item, /obj/item/toy/crayon)) - if(smile == FALSE) - var/obj/item/toy/crayon/CR = hitting_item - to_chat(user, span_notice("You start drawing a smiley face on the helmet's visor..")) - if(do_after(user, 2.5 SECONDS, target = src)) - smile = TRUE - smile_color = CR.paint_color - to_chat(user, "You draw a smiley on the helmet visor.") - update_appearance() - else - to_chat(user, span_warning("Seems like someone already drew something on this helmet's visor!")) - return - if(istype(hitting_item, /obj/item/clothing/head)) - var/obj/item/clothing/hitting_clothing = hitting_item - if(hitting_clothing.clothing_flags & STACKABLE_HELMET_EXEMPT) - to_chat(user, span_notice("You cannot place [hitting_clothing.name] on helmet!")) - return - if(attached_hat) - to_chat(user, span_notice("There's already something placed on helmet!")) - return - attached_hat = hitting_clothing - to_chat(user, span_notice("You placed [hitting_clothing.name] on helmet!")) - hitting_clothing.forceMove(src) +/obj/item/clothing/head/helmet/space/plasmaman/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/toy/crayon)) + if(smile) + to_chat(user, span_warning("Seems like someone already drew something on [src]'s visor!")) + return ITEM_INTERACT_BLOCKING + + var/obj/item/toy/crayon/crayon = tool + to_chat(user, span_notice("You start drawing a smiley face on [src]'s visor...")) + if(!do_after(user, 2.5 SECONDS, target = src)) + return ITEM_INTERACT_BLOCKING + + smile = TRUE + smile_color = crayon.paint_color + to_chat(user, "You draw a smiley on [src] visor.") update_appearance() + return ITEM_INTERACT_SUCCESS + + if(!istype(tool, /obj/item/clothing/head)) + return NONE + + var/obj/item/clothing/hitting_clothing = tool + if(hitting_clothing.clothing_flags & STACKABLE_HELMET_EXEMPT) + to_chat(user, span_notice("You cannot place [hitting_clothing.name] on [src]!")) + return ITEM_INTERACT_BLOCKING + + if(attached_hat) + to_chat(user, span_notice("There's already something placed on [src]!")) + return ITEM_INTERACT_BLOCKING + + attached_hat = hitting_clothing + to_chat(user, span_notice("You placed [hitting_clothing.name] on [src]!")) + hitting_clothing.forceMove(src) + update_appearance() + return ITEM_INTERACT_SUCCESS ///By the by, helmets have the update_icon_updates_onmob element, so we don't have to call mob.update_worn_head() /obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(mutable_appearance/standing, isinhands) diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 9c34574840d..0d33f0e5f51 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -738,3 +738,113 @@ fire = 50 acid = 50 wound = 30 + +/obj/item/clothing/suit/armor/durability/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) + take_damage(1, BRUTE, 0, 0) + +/obj/item/clothing/suit/armor/durability/watermelon + name = "watermelon" + desc = "An armour, made from watermelons. Propably won't take too many hits, but at least it looks serious... As serious as worn watermelon can be." + icon_state = "watermelon" + inhand_icon_state = null + body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + armor_type = /datum/armor/watermelon + strip_delay = 60 + equip_delay_other = 40 + clothing_traits = list(TRAIT_BRAWLING_KNOCKDOWN_BLOCKED) + max_integrity = 15 + +/obj/item/clothing/suit/armor/durability/watermelon/fire_resist + resistance_flags = FIRE_PROOF + armor_type = /datum/armor/watermelon_fr + +/datum/armor/watermelon + melee = 15 + bullet = 10 + energy = 10 + bomb = 10 + fire = 0 + acid = 25 + wound = 5 + +/datum/armor/watermelon_fr + melee = 15 + bullet = 10 + energy = 10 + bomb = 10 + fire = 15 + acid = 30 + wound = 5 + +/obj/item/clothing/suit/armor/durability/holymelon + name = "holymelon" + desc = "An armour, made from holymelons. Inspires you to go on some sort of a crusade... Perhaps spreading spinach to children?" + icon_state = "holymelon" + inhand_icon_state = null + body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + armor_type = /datum/armor/watermelon + strip_delay = 60 + equip_delay_other = 40 + clothing_traits = list(TRAIT_BRAWLING_KNOCKDOWN_BLOCKED) + max_integrity = 15 + var/decayed = FALSE + +/obj/item/clothing/suit/armor/durability/holymelon/fire_resist + resistance_flags = FIRE_PROOF + armor_type = /datum/armor/watermelon_fr + +/obj/item/clothing/suit/armor/durability/holymelon/Initialize(mapload) + . = ..() + if(decayed) + decay() + return + + AddComponent( + /datum/component/anti_magic, \ + antimagic_flags = MAGIC_RESISTANCE_HOLY, \ + inventory_flags = ITEM_SLOT_OCLOTHING, \ + charges = 1, \ + drain_antimagic = CALLBACK(src, PROC_REF(drain_antimagic)), \ + expiration = CALLBACK(src, PROC_REF(decay)) \ + ) + +/obj/item/clothing/suit/armor/durability/holymelon/proc/drain_antimagic(mob/user) + to_chat(user, span_warning("[src] looses a bit of its shimmer and glossiness...")) + +/obj/item/clothing/suit/armor/durability/holymelon/proc/decay() + take_damage(8, BRUTE, 0, 0) + + +/obj/item/clothing/suit/armor/durability/barrelmelon + name = "barrelmelon" + desc = "An armour, made from barrelmelons. Reeks of ale, inspiring to courageous deeds. Or, perhaps, a bar brawl." + icon_state = "barrelmelon" + inhand_icon_state = null + body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + armor_type = /datum/armor/barrelmelon + strip_delay = 60 + equip_delay_other = 40 + clothing_traits = list(TRAIT_BRAWLING_KNOCKDOWN_BLOCKED) + max_integrity = 10 + +/obj/item/clothing/suit/armor/durability/barrelmelon/fire_resist + resistance_flags = FIRE_PROOF + armor_type = /datum/armor/barrelmelon_fr + +/datum/armor/barrelmelon + melee = 25 + bullet = 20 + energy = 15 + bomb = 10 + fire = 0 + acid = 35 + wound = 10 + +/datum/armor/barrelmelon_fr + melee = 25 + bullet = 20 + energy = 15 + bomb = 10 + fire = 20 + acid = 40 + wound = 10 diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index eb1ccb3c510..38bb028fa1e 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -49,6 +49,17 @@ resistance_flags = FLAMMABLE dog_fashion = /datum/dog_fashion/head/blue_wizard +/obj/item/clothing/head/wizard/chanterelle + name = "chanterelle hat" + desc = "An oversized chanterelle with hollow out space to fit a head in. Kinda looks like wizard's hat." + icon_state = "chanterelle" + inhand_icon_state = "chanterellehat" + armor_type = /datum/armor/none + resistance_flags = FLAMMABLE + +/obj/item/clothing/head/wizard/chanterelle/fr + resistance_flags = FIRE_PROOF + /obj/item/clothing/head/wizard/marisa name = "witch hat" desc = "Strange-looking hat-wear. Makes you want to cast fireballs." @@ -205,6 +216,48 @@ actions_types = list(/datum/action/item_action/stickmen) +/obj/item/clothing/suit/wizrobe/durathread + name = "durathread robe" + desc = "A rather dull durathread robe; not quite as protective as a proper piece of armour, but much stylish." + icon_state = "durathread-fake" + inhand_icon_state = null + armor_type = /datum/armor/robe_durathread + +/datum/armor/robe_durathread + melee = 15 + bullet = 5 + laser = 25 + energy = 30 + bomb = 10 + fire = 30 + acid = 40 + +/obj/item/clothing/suit/wizrobe/durathread/fire + name = "pyromancer robe" + desc = "A rather dull durathread robe; not quite as protective as an woven armour, but much stylish." + icon_state = "durathread-fire" + +/obj/item/clothing/suit/wizrobe/durathread/ice + name = "pyromancer robe" + desc = "A rather dull durathread robe; not quite as protective as an woven armour, but much stylish." + icon_state = "durathread-ice" + +/obj/item/clothing/suit/wizrobe/durathread/electric + name = "electromancer robe" + desc = "Doesn't actually conduit or isolate from electricity. Though it does have some durability on account of being made from durathread." + icon_state = "durathread-electric" + +/obj/item/clothing/suit/wizrobe/durathread/earth + name = "geomancer robe" + desc = "A rather dull durathread robe; not quite as protective as an woven armour, but much stylish." + icon_state = "durathread-earth" + +/obj/item/clothing/suit/wizrobe/durathread/necro + name = "necromancer robe" + desc = "A rather dull durathread robe; not quite as protective as an woven armour, but much stylish." + icon_state = "durathread-necro" + + /obj/item/clothing/suit/wizrobe/paper/ui_action_click(mob/user, action) stickmen() diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm index 6b437d8437b..4c88c45f54c 100644 --- a/code/modules/fishing/fish/_fish.dm +++ b/code/modules/fishing/fish/_fish.dm @@ -627,6 +627,14 @@ fish_zap_flags |= (ZAP_GENERATES_POWER | ZAP_MOB_STUN) tesla_zap(source = get_turf(src), zap_range = fish_zap_range, power = fish_zap_power, cutoff = 1 MEGA JOULES, zap_flags = fish_zap_flags) +///Returns the price of this fish, for the fish export. +/obj/item/fish/proc/get_export_price(price, percent) + var/size_weight_exponentation = (size * weight * 0.01)^0.85 + var/calculated_price = price + size_weight_exponentation * percent + if(HAS_TRAIT(src, TRAIT_FISH_FROM_CASE)) //Avoid printing money by simply ordering fish and sending it back. + calculated_price *= 0.05 + return round(calculated_price) + /// Returns random fish, using random_case_rarity probabilities. /proc/random_fish_type(required_fluid) var/static/probability_table diff --git a/code/modules/fishing/fish/fish_types.dm b/code/modules/fishing/fish/fish_types.dm index 11f9ab317d2..ce9f36f0553 100644 --- a/code/modules/fishing/fish/fish_types.dm +++ b/code/modules/fishing/fish/fish_types.dm @@ -81,6 +81,55 @@ required_temperature_max = MIN_AQUARIUM_TEMP+30 beauty = FISH_BEAUTY_GOOD +/obj/item/fish/tadpole + name = "tadpole" + desc = "The larval spawn of an amphibian. A very minuscle, round creature with a long tail it uses to swim around." + icon_state = "tadpole" + dedicated_in_aquarium_icon_state = "tadpole small" + average_size = 3 + average_weight = 10 + sprite_width = 3 + sprite_height = 1 + health = 50 + feeding_frequency = 1.5 MINUTES + required_temperature_min = MIN_AQUARIUM_TEMP+15 + required_temperature_max = MIN_AQUARIUM_TEMP+20 + fillet_type = null + fish_traits = list(/datum/fish_trait/no_mating) //They grow into frogs and that's it. + beauty = FISH_BEAUTY_NULL + random_case_rarity = FISH_RARITY_NOPE //Why would you want generic frog tadpoles you get from ponds inside fish cases? + /// Once dead, tadpoles disappear after a dozen seconds, since you can get infinite tadpoles. + var/del_timerid + +/obj/item/fish/tadpole/Initialize(mapload, apply_qualities = TRUE) + . = ..() + AddComponent(/datum/component/fish_growth, /mob/living/basic/frog, 100 / rand(2.5, 3 MINUTES) * 10) + RegisterSignal(src, COMSIG_FISH_BEFORE_GROWING, PROC_REF(growth_checks)) + RegisterSignal(src, COMSIG_FISH_FINISH_GROWING, PROC_REF(on_growth)) + +/obj/item/fish/tadpole/set_status(new_status) + . = ..() + if(status == FISH_DEAD) + del_timerid = QDEL_IN_STOPPABLE(src, 12 SECONDS) + else + deltimer(del_timerid) + +/obj/item/fish/tadpole/proc/growth_checks(datum/source, seconds_per_tick) + SIGNAL_HANDLER + var/hunger = CLAMP01((world.time - last_feeding) / feeding_frequency) + if(hunger >= 0.7) //too hungry to grow + return COMPONENT_DONT_GROW + var/obj/structure/aquarium/aquarium = loc + if(!aquarium.allow_breeding) //the aquarium has breeding disabled + return COMPONENT_DONT_GROW + +/obj/item/fish/tadpole/proc/on_growth(datum/source, mob/living/basic/frog/result) + SIGNAL_HANDLER + playsound(result, result.attack_sound, 50, TRUE) // reeeeeeeeeeeeeee... + +/obj/item/fish/tadpole/get_export_price(price, percent) + return 2 //two credits. Tadpoles aren't really that valueable. + // Saltwater fish below /obj/item/fish/clownfish @@ -270,8 +319,6 @@ evolution_types = list(/datum/fish_evolution/ice_chrab) compatible_types = list(/obj/item/fish/chasm_crab/ice) beauty = FISH_BEAUTY_GOOD - ///Chasm crabs mature into juveline lobstrositiess with time. This is the progess from 0 to 100 - var/maturation = 0 ///This value represents how much the crab needs aren't being met. Higher values translate to a more likely hostile lobstrosity. var/anger = 0 ///The lobstrosity type this matures into @@ -279,6 +326,11 @@ ///at which rate the crab gains maturation var/growth_rate = 100 / (10 MINUTES) * 10 +/obj/item/fish/chasm_crab/Initialize(mapload, apply_qualities = TRUE) + . = ..() + RegisterSignal(src, COMSIG_FISH_BEFORE_GROWING, PROC_REF(growth_checks)) + RegisterSignal(src, COMSIG_FISH_FINISH_GROWING, PROC_REF(on_growth)) + ///A chasm crab growth speed is determined by its initial weight and size, ergo bigger crabs for faster lobstrosities /obj/item/fish/chasm_crab/update_size_and_weight(new_size = average_size, new_weight = average_weight) . = ..() @@ -298,62 +350,41 @@ else if(weight >= 1500) multiplier += min(0.1 * round((weight - 1000) / 500), 2) - growth_rate = initial(growth_rate) * multiplier + AddComponent(/datum/component/fish_growth, lob_type, initial(growth_rate) * multiplier) -/obj/item/fish/chasm_crab/process(seconds_per_tick) - . = ..() - grow_up(seconds_per_tick) - -///Slowly grow up each process tick (in an aquarium). This is its own proc so that it can be used in the unit test. -/obj/item/fish/chasm_crab/proc/grow_up(seconds_per_tick) +/obj/item/fish/chasm_crab/proc/growth_checks(datum/source, seconds_per_tick) + SIGNAL_HANDLER var/hunger = CLAMP01((world.time - last_feeding) / feeding_frequency) if(health <= initial(health) * 0.6 || hunger >= 0.6) //if too hurt or hungry, don't grow. anger += growth_rate * 2 * seconds_per_tick - return + return COMPONENT_DONT_GROW - if(!isaquarium(loc)) //can't grow outside an aquarium. + if(hunger >= 0.4) //I'm hungry and angry + anger += growth_rate * 0.6 * seconds_per_tick + + if(!isaquarium(loc)) return var/obj/structure/aquarium/aquarium = loc if(!aquarium.allow_breeding) //the aquarium has breeding disabled - return - if(hunger >= 0.4) //I'm hungry and angry - anger += growth_rate * 0.6 * seconds_per_tick + return COMPONENT_DONT_GROW if(!locate(/obj/item/aquarium_prop) in aquarium) //the aquarium deco is quite barren anger += growth_rate * 0.25 * seconds_per_tick var/fish_count = length(aquarium.get_fishes()) if(!ISINRANGE(fish_count, 3, AQUARIUM_MAX_BREEDING_POPULATION * 0.5)) //too lonely or overcrowded anger += growth_rate * 0.3 * seconds_per_tick - if(fish_count <= AQUARIUM_MAX_BREEDING_POPULATION * 0.5) //check if there's enough room to maturate. - maturation += growth_rate * seconds_per_tick + if(fish_count > AQUARIUM_MAX_BREEDING_POPULATION * 0.5) //check if there's enough room to maturate. + return COMPONENT_DONT_GROW - if(maturation >= 100) - return finish_growing() - -///spawn a juvenile lobstrosity on the aquarium turf -/obj/item/fish/chasm_crab/proc/finish_growing() - var/mob/living/basic/mining/lobstrosity/juvenile/lob = new lob_type(get_turf(src)) - for(var/trait_type in fish_traits) - var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] - trait.apply_to_mob(lob) +/obj/item/fish/chasm_crab/proc/on_growth(datum/source, mob/living/basic/mining/lobstrosity/juvenile/result) + SIGNAL_HANDLER if(!prob(anger)) - lob.AddElement(/datum/element/ai_retaliate) - qdel(lob.ai_controller) - lob.ai_controller = new /datum/ai_controller/basic_controller/lobstrosity/juvenile/calm(lob) + result.AddElement(/datum/element/ai_retaliate) + qdel(result.ai_controller) + result.ai_controller = new /datum/ai_controller/basic_controller/lobstrosity/juvenile/calm(result) else if(anger < 30) //not really that mad, just a bit unstable. - qdel(lob.ai_controller) - lob.ai_controller = new /datum/ai_controller/basic_controller/lobstrosity/juvenile/capricious(lob) - - animate(lob, pixel_y = 18, time = 0.4 SECONDS, flags = ANIMATION_RELATIVE, easing = CUBIC_EASING|EASE_OUT) - animate(pixel_y = -18, time = 0.4 SECONDS, flags = ANIMATION_RELATIVE, easing = CUBIC_EASING|EASE_IN) - loc.visible_message(span_boldnotice("\A [lob] jumps out of [loc]!")) - playsound(loc, 'sound/effects/fish_splash.ogg', 60) - - ///make sure it moves the next tick so that it properly glides to the next location after jumping off the aquarium. - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(random_step), lob, 1, 100), 0.1 SECONDS) - - qdel(src) - return lob + qdel(result.ai_controller) + result.ai_controller = new /datum/ai_controller/basic_controller/lobstrosity/juvenile/capricious(result) /obj/item/fish/chasm_crab/ice name = "arctic chrab" @@ -434,7 +465,7 @@ ) beauty = FISH_BEAUTY_DISGUSTING -/obj/item/fish/ratfish/Initialize(mapload) +/obj/item/fish/ratfish/Initialize(mapload, apply_qualities = TRUE) . = ..() //stable pop reflects the config for how many mice migrate. powerful... stable_population = CONFIG_GET(number/mice_roundstart) @@ -566,7 +597,7 @@ fish_traits = list(/datum/fish_trait/no_mating) //just to be sure, these shouldn't reproduce experisci_scannable = FALSE -/obj/item/fish/holo/Initialize(mapload) +/obj/item/fish/holo/Initialize(mapload, apply_qualities = TRUE) . = ..() var/area/station/holodeck/holo_area = get_area(src) if(!istype(holo_area)) @@ -655,7 +686,7 @@ fish_traits = list(/datum/fish_trait/antigrav, /datum/fish_trait/mixotroph) beauty = FISH_BEAUTY_GREAT -/obj/item/fish/starfish/Initialize(mapload) +/obj/item/fish/starfish/Initialize(mapload, apply_qualities = TRUE) . = ..() update_appearance(UPDATE_OVERLAYS) @@ -693,7 +724,7 @@ ///maximum bonus damage when winded up var/maximum_bonus = 25 -/obj/item/fish/lavaloop/Initialize(mapload) +/obj/item/fish/lavaloop/Initialize(mapload, apply_qualities = TRUE) . = ..() ADD_TRAIT(src, TRAIT_BYPASS_RANGED_ARMOR, INNATE_TRAIT) AddComponent(/datum/component/boomerang, throw_range, TRUE) diff --git a/code/modules/fishing/sources/_fish_source.dm b/code/modules/fishing/sources/_fish_source.dm index feaa93424f9..4a0419f98f5 100644 --- a/code/modules/fishing/sources/_fish_source.dm +++ b/code/modules/fishing/sources/_fish_source.dm @@ -57,6 +57,11 @@ GLOBAL_LIST_INIT(specific_fish_icons, zebra_typecacheof(list( var/explosive_malus = FALSE /// If explosive_malus is true, this will be used to keep track of the turfs where an explosion happened for when we'll spawn the loot. var/list/exploded_turfs + /// Mindless mobs that can fish will never pull up items on this list + var/static/list/profound_fisher_blacklist = typecacheof(list( + /mob/living/basic/mining/lobstrosity, + /obj/structure/closet/crate/necropolis/tendril, + )) /datum/fish_source/New() if(!PERFORM_ALL_TESTS(focus_only/fish_sources_tables)) @@ -276,6 +281,9 @@ GLOBAL_LIST(fishing_property_cache) var/list/fish_list_properties = collect_fish_properties() + + if(HAS_TRAIT(fisherman, TRAIT_PROFOUND_FISHER) && !fisherman.client) + final_table -= profound_fisher_blacklist for(var/result in final_table) final_table[result] *= rod.hook?.get_hook_bonus_multiplicative(result) final_table[result] += rod.hook?.get_hook_bonus_additive(result)//Decide on order here so it can be multiplicative diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm index 0768876014c..858e4cd7aef 100644 --- a/code/modules/food_and_drinks/machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/machinery/smartfridge.dm @@ -417,7 +417,8 @@ for(var/obj/item/dispensed_item in src) if(desired <= 0) break - if(params["path"] == "[dispensed_item.type]-[dispensed_item.name]") + var/item_name = "[dispensed_item.type]-[replacetext(replacetext(dispensed_item.name, "\proper", ""), "\improper", "")]" + if(params["path"] == item_name) if(dispensed_item in component_parts) CRASH("Attempted removal of [dispensed_item] component_part from smartfridge via smartfridge interface.") //dispense the item diff --git a/code/modules/hydroponics/grown/aloe.dm b/code/modules/hydroponics/grown/aloe.dm index cfbefce6dba..05480987326 100644 --- a/code/modules/hydroponics/grown/aloe.dm +++ b/code/modules/hydroponics/grown/aloe.dm @@ -1,7 +1,7 @@ // aloe /obj/item/seeds/aloe - name = "pack of aloe seeds" + name = "aloe seed pack" desc = "These seeds grow into aloe." icon_state = "seed-aloe" species = "aloe" diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm index 2becc390f39..92cdc2d62c8 100644 --- a/code/modules/hydroponics/grown/ambrosia.dm +++ b/code/modules/hydroponics/grown/ambrosia.dm @@ -11,7 +11,7 @@ // Ambrosia Vulgaris /obj/item/seeds/ambrosia - name = "pack of ambrosia vulgaris seeds" + name = "ambrosia vulgaris seed pack" desc = "These seeds grow into common ambrosia, a plant grown by and from medicine." icon_state = "seed-ambrosiavulgaris" plant_icon_offset = 0 @@ -36,7 +36,7 @@ // Ambrosia Deus /obj/item/seeds/ambrosia/deus - name = "pack of ambrosia deus seeds" + name = "ambrosia deus seed pack" desc = "These seeds grow into ambrosia deus. Could it be the food of the gods..?" icon_state = "seed-ambrosiadeus" species = "ambrosiadeus" @@ -55,7 +55,7 @@ //Ambrosia Gaia /obj/item/seeds/ambrosia/gaia - name = "pack of ambrosia gaia seeds" + name = "ambrosia gaia seed pack" desc = "These seeds grow into ambrosia gaia, filled with infinite potential." icon_state = "seed-ambrosia_gaia" species = "ambrosia_gaia" diff --git a/code/modules/hydroponics/grown/apple.dm b/code/modules/hydroponics/grown/apple.dm index 0079f63ec90..c1739cc7dea 100644 --- a/code/modules/hydroponics/grown/apple.dm +++ b/code/modules/hydroponics/grown/apple.dm @@ -1,6 +1,6 @@ // Apple /obj/item/seeds/apple - name = "pack of apple seeds" + name = "apple seed pack" desc = "These seeds grow into apple trees." icon_state = "seed-apple" species = "apple" @@ -31,7 +31,7 @@ // Gold Apple /obj/item/seeds/apple/gold - name = "pack of golden apple seeds" + name = "golden apple seed pack" desc = "These seeds grow into golden apple trees. Good thing there are no firebirds in space." icon_state = "seed-goldapple" species = "goldapple" diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index ab38f688990..6e09ee3497c 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -1,6 +1,6 @@ // Banana /obj/item/seeds/banana - name = "pack of banana seeds" + name = "banana seed pack" desc = "They're seeds that grow into banana trees. When grown, keep away from clown." icon_state = "seed-banana" species = "banana" @@ -91,7 +91,7 @@ // Mimana - invisible sprites are totally a feature! /obj/item/seeds/banana/mime - name = "pack of mimana seeds" + name = "mimana seed pack" desc = "They're seeds that grow into mimana trees. When grown, keep away from mime." icon_state = "seed-mimana" species = "mimana" @@ -119,7 +119,7 @@ // Bluespace Banana /obj/item/seeds/banana/bluespace - name = "pack of bluespace banana seeds" + name = "bluespace banana seed pack" desc = "They're seeds that grow into bluespace banana trees. When grown, keep away from bluespace clown." icon_state = "seed-banana-blue" species = "bluespacebanana" diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm index 974b19889ec..885eb77c0c6 100644 --- a/code/modules/hydroponics/grown/beans.dm +++ b/code/modules/hydroponics/grown/beans.dm @@ -1,6 +1,6 @@ // Soybeans /obj/item/seeds/soya - name = "pack of soybean seeds" + name = "soybean seed pack" desc = "These seeds grow into soybean plants." icon_state = "seed-soybean" species = "soybean" @@ -30,7 +30,7 @@ // Koibean /obj/item/seeds/soya/koi - name = "pack of koibean seeds" + name = "koibean seed pack" desc = "These seeds grow into koibean plants." icon_state = "seed-koibean" species = "koibean" @@ -63,7 +63,7 @@ //Butterbeans, the beans wid da butta! // Butterbeans! - Squeeze for a single butter slice! /obj/item/seeds/soya/butter - name = "pack of butterbean seeds" + name = "butterbean seed pack" desc = "These seeds grow into butterbean plants." icon_state = "seed-butterbean" species = "butterbean" @@ -94,7 +94,7 @@ // Green Beans /obj/item/seeds/greenbean - name = "pack of green bean seeds" + name = "green bean seed pack" desc = "These seeds grow into green bean plants." icon_state = "seed-greenbean" species = "greenbean" @@ -123,7 +123,7 @@ // Jumping Bean /obj/item/seeds/greenbean/jump - name = "pack of jumping bean seeds" + name = "jumping bean seed pack" desc = "These seeds grow into jumping bean plants." icon_state = "seed-jumpingbean" species = "jumpingbean" diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index 317f8ef2ed8..10631e4dcb0 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -1,6 +1,6 @@ // Berries /obj/item/seeds/berry - name = "pack of berry seeds" + name = "berry seed pack" desc = "These seeds grow into berry bushes." icon_state = "seed-berry" species = "berry" @@ -31,7 +31,7 @@ // Poison Berries /obj/item/seeds/berry/poison - name = "pack of poison-berry seeds" + name = "poison-berry seed pack" desc = "These seeds grow into poison-berry bushes." icon_state = "seed-poisonberry" species = "poisonberry" @@ -55,7 +55,7 @@ // Death Berries /obj/item/seeds/berry/death - name = "pack of death-berry seeds" + name = "death-berry seed pack" desc = "These seeds grow into death berries." icon_state = "seed-deathberry" species = "deathberry" @@ -81,7 +81,7 @@ // Glow Berries /obj/item/seeds/berry/glow - name = "pack of glow-berry seeds" + name = "glow-berry seed pack" desc = "These seeds grow into glow-berry bushes." icon_state = "seed-glowberry" species = "glowberry" @@ -108,7 +108,7 @@ // Grapes /obj/item/seeds/grape - name = "pack of grape seeds" + name = "grape seed pack" desc = "These seeds grow into grape vines." icon_state = "seed-grapes" species = "grape" @@ -143,7 +143,7 @@ // Green Grapes /obj/item/seeds/grape/green - name = "pack of green grape seeds" + name = "green grape seed pack" desc = "These seeds grow into green-grape vines." icon_state = "seed-greengrapes" species = "greengrape" @@ -162,7 +162,7 @@ // Toechtauese Berries /obj/item/seeds/toechtauese - name = "pack of töchtaüse berry seeds" + name = "töchtaüse berry seed pack" desc = "These seeds grow into töchtaüse bushes." icon_state = "seed-toechtauese" species = "toechtauese" @@ -190,7 +190,7 @@ distill_reagent = /datum/reagent/toxin/itching_powder /obj/item/seeds/lanternfruit - name = "pack of lanternfruit seeds" + name = "lanternfruit seed pack" desc = "These seeds grow into lanternfruit pods." icon_state = "seed-lanternfruit" species = "lanternfruit" diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm index b4cd35899d2..6309ae8475b 100644 --- a/code/modules/hydroponics/grown/cannabis.dm +++ b/code/modules/hydroponics/grown/cannabis.dm @@ -1,6 +1,6 @@ // Cannabis /obj/item/seeds/cannabis - name = "pack of cannabis seeds" + name = "cannabis seed pack" desc = "Taxable." icon_state = "seed-cannabis" plant_icon_offset = 6 @@ -24,7 +24,7 @@ /obj/item/seeds/cannabis/rainbow - name = "pack of rainbow weed seeds" + name = "rainbow weed seed pack" desc = "These seeds grow into rainbow weed. Groovy... and also highly addictive." icon_state = "seed-megacannabis" icon_grow = "megacannabis-grow" @@ -36,7 +36,7 @@ rarity = 40 /obj/item/seeds/cannabis/death - name = "pack of deathweed seeds" + name = "deathweed seed pack" desc = "These seeds grow into deathweed. Not groovy." icon_state = "seed-blackcannabis" icon_grow = "blackcannabis-grow" @@ -48,7 +48,7 @@ rarity = 40 /obj/item/seeds/cannabis/white - name = "pack of lifeweed seeds" + name = "lifeweed seed pack" desc = "I will give unto him that is munchies of the fountain of the cravings of life, freely." icon_state = "seed-whitecannabis" icon_grow = "whitecannabis-grow" @@ -62,7 +62,7 @@ /obj/item/seeds/cannabis/ultimate - name = "pack of omega weed seeds" + name = "omega weed seed pack" desc = "These seeds grow into omega weed." icon_state = "seed-ocannabis" plant_icon_offset = 0 diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm index 744c0dc5b02..b304382d2dc 100644 --- a/code/modules/hydroponics/grown/cereals.dm +++ b/code/modules/hydroponics/grown/cereals.dm @@ -1,6 +1,6 @@ // Wheat /obj/item/seeds/wheat - name = "pack of wheat seeds" + name = "wheat seed pack" desc = "These may, or may not, grow into wheat." icon_state = "seed-wheat" species = "wheat" @@ -30,7 +30,7 @@ // Oat /obj/item/seeds/wheat/oat - name = "pack of oat seeds" + name = "oat seed pack" desc = "These may, or may not, grow into oat." icon_state = "seed-oat" species = "oat" @@ -52,7 +52,7 @@ // Rice /obj/item/seeds/wheat/rice - name = "pack of rice seeds" + name = "rice seed pack" desc = "These may, or may not, grow into rice." icon_state = "seed-rice" species = "rice" @@ -76,7 +76,7 @@ //Meatwheat - grows into synthetic meat /obj/item/seeds/wheat/meat - name = "pack of meatwheat seeds" + name = "meatwheat seed pack" desc = "If you ever wanted to drive a vegetarian to insanity, here's how." icon_state = "seed-meatwheat" species = "meatwheat" diff --git a/code/modules/hydroponics/grown/cherries.dm b/code/modules/hydroponics/grown/cherries.dm index 4ebd42489d9..ad35bacf8fe 100644 --- a/code/modules/hydroponics/grown/cherries.dm +++ b/code/modules/hydroponics/grown/cherries.dm @@ -1,6 +1,6 @@ // Cherries /obj/item/seeds/cherry - name = "pack of cherry pits" + name = "cherry pit pack" desc = "Careful not to crack a tooth on one... That'd be the pits." icon_state = "seed-cherry" species = "cherry" @@ -34,7 +34,7 @@ // Blue Cherries /obj/item/seeds/cherry/blue - name = "pack of blue cherry pits" + name = "blue cherry pit pack" desc = "The blue kind of cherries." icon_state = "seed-bluecherry" species = "bluecherry" @@ -57,7 +57,7 @@ //Cherry Bulbs /obj/item/seeds/cherry/bulb - name = "pack of cherry bulb pits" + name = "cherry bulb pit pack" desc = "The glowy kind of cherries." icon_state = "seed-cherrybulb" species = "cherrybulb" @@ -82,7 +82,7 @@ //Cherry Bombs /obj/item/seeds/cherry/bomb - name = "pack of cherry bomb pits" + name = "cherry bomb pit pack" desc = "They give you vibes of dread and frustration." icon_state = "seed-cherry_bomb" species = "cherry_bomb" diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm index 9f6d3bbd08c..1d9aaa8468e 100644 --- a/code/modules/hydroponics/grown/chili.dm +++ b/code/modules/hydroponics/grown/chili.dm @@ -1,6 +1,6 @@ // Chili /obj/item/seeds/chili - name = "pack of chili seeds" + name = "chili seed pack" desc = "These seeds grow into chili plants. HOT! HOT! HOT!" icon_state = "seed-chili" species = "chili" @@ -30,7 +30,7 @@ // Ice Chili /obj/item/seeds/chili/ice - name = "pack of chilly pepper seeds" + name = "chilly pepper seed pack" desc = "These seeds grow into chilly pepper plants." icon_state = "seed-icepepper" species = "chiliice" @@ -56,7 +56,7 @@ // Ghost Chili /obj/item/seeds/chili/ghost - name = "pack of ghost chili seeds" + name = "ghost chili seed pack" desc = "These seeds grow into a chili said to be the hottest in the galaxy." icon_state = "seed-chilighost" species = "chilighost" @@ -83,7 +83,7 @@ // Bell Pepper /obj/item/seeds/chili/bell_pepper - name = "pack of bell pepper seeds" + name = "bell pepper seed pack" desc = "These seeds grow into bell pepper plants. MILD! MILD! MILD!" icon_state = "seed-bell-pepper" species = "bellpepper" diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm index c624722f823..6bfc8bc203a 100644 --- a/code/modules/hydroponics/grown/citrus.dm +++ b/code/modules/hydroponics/grown/citrus.dm @@ -9,7 +9,7 @@ // Lime /obj/item/seeds/lime - name = "pack of lime seeds" + name = "lime seed pack" desc = "These are very sour seeds." icon_state = "seed-lime" species = "lime" @@ -33,7 +33,7 @@ // Orange /obj/item/seeds/orange - name = "pack of orange seeds" + name = "orange seed pack" desc = "Sour seeds." icon_state = "seed-orange" species = "orange" @@ -61,7 +61,7 @@ // Lemon /obj/item/seeds/lemon - name = "pack of lemon seeds" + name = "lemon seed pack" desc = "These are sour seeds." icon_state = "seed-lemon" species = "lemon" @@ -86,7 +86,7 @@ // Combustible lemon /obj/item/seeds/firelemon //combustible lemon is too long so firelemon - name = "pack of combustible lemon seeds" + name = "combustible lemon seed pack" desc = "When life gives you lemons, don't make lemonade. Make life take the lemons back! Get mad! I don't want your damn lemons!" icon_state = "seed-firelemon" species = "firelemon" @@ -112,7 +112,7 @@ //3D Orange /obj/item/seeds/orange_3d - name = "pack of extradimensional orange seeds" + name = "extradimensional orange seed pack" desc = "Polygonal seeds." icon_state = "seed-orange" species = "orange" diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm index 4e9a9810b42..e4b6c916f7c 100644 --- a/code/modules/hydroponics/grown/cocoa_vanilla.dm +++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm @@ -1,6 +1,6 @@ // Cocoa Pod /obj/item/seeds/cocoapod - name = "pack of cocoa pod seeds" + name = "cocoa pod seed pack" desc = "These seeds grow into cacao trees. They look fattening." //SIC: cocoa is the seeds. The trees are spelled cacao. icon_state = "seed-cocoapod" species = "cocoapod" @@ -31,7 +31,7 @@ // Vanilla Pod /obj/item/seeds/cocoapod/vanillapod - name = "pack of vanilla pod seeds" + name = "vanilla pod seed pack" desc = "These seeds grow into vanilla trees. They look fattening." icon_state = "seed-vanillapod" species = "vanillapod" @@ -52,7 +52,7 @@ distill_reagent = /datum/reagent/consumable/vanilla //Takes longer, but you can get even more vanilla from it. /obj/item/seeds/cocoapod/bungotree - name = "pack of bungo tree seeds" + name = "bungo tree seed pack" desc = "These seeds grow into bungo trees. They appear to be heavy and almost perfectly spherical." icon_state = "seed-bungotree" plant_icon_offset = 4 diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index d5f9f94e1b2..02f77280c5a 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -1,6 +1,6 @@ // Corn /obj/item/seeds/corn - name = "pack of corn seeds" + name = "corn seed pack" desc = "I don't mean to sound corny..." icon_state = "seed-corn" species = "corn" @@ -57,7 +57,7 @@ // Snapcorn /obj/item/seeds/corn/snapcorn - name = "pack of snapcorn seeds" + name = "snapcorn seed pack" desc = "Oh snap!" icon_state = "seed-snapcorn" species = "snapcorn" @@ -100,7 +100,7 @@ //Pepper-corn - Heh funny. /obj/item/seeds/corn/pepper - name = "pack of pepper-corn seeds" + name = "pepper-corn seed pack" desc = "If Peter picked a pack of pepper-corn..." icon_state = "seed-peppercorn" species = "peppercorn" diff --git a/code/modules/hydroponics/grown/cotton.dm b/code/modules/hydroponics/grown/cotton.dm index 819d97f321f..c2149b7a330 100644 --- a/code/modules/hydroponics/grown/cotton.dm +++ b/code/modules/hydroponics/grown/cotton.dm @@ -1,5 +1,5 @@ /obj/item/seeds/cotton - name = "pack of cotton seeds" + name = "cotton seed pack" desc = "A pack of seeds that'll grow into a cotton plant. Assistants make good free labor if neccesary." icon_state = "seed-cotton" species = "cotton" @@ -45,7 +45,7 @@ //reinforced mutated variant /obj/item/seeds/cotton/durathread - name = "pack of durathread seeds" + name = "durathread seed pack" desc = "A pack of seeds that'll grow into an extremely durable thread that could easily rival plasteel if woven properly." icon_state = "seed-durathread" species = "durathread" diff --git a/code/modules/hydroponics/grown/cucumber.dm b/code/modules/hydroponics/grown/cucumber.dm index f3712c6a5c9..a8487a0cac9 100644 --- a/code/modules/hydroponics/grown/cucumber.dm +++ b/code/modules/hydroponics/grown/cucumber.dm @@ -1,6 +1,6 @@ // CUCUMBERS YEAH /obj/item/seeds/cucumber - name = "pack of cucumber seeds" + name = "cucumber seed pack" desc = "These seeds grow into cucumber plants." icon_state = "seed-cucumber" species = "cucumber" diff --git a/code/modules/hydroponics/grown/eggplant.dm b/code/modules/hydroponics/grown/eggplant.dm index d4b38c3438b..47cbc6d934c 100644 --- a/code/modules/hydroponics/grown/eggplant.dm +++ b/code/modules/hydroponics/grown/eggplant.dm @@ -1,6 +1,6 @@ // Eggplant /obj/item/seeds/eggplant - name = "pack of eggplant seeds" + name = "eggplant seed pack" desc = "These seeds grow to produce berries that look nothing like eggs." icon_state = "seed-eggplant" species = "eggplant" @@ -25,7 +25,7 @@ // Egg-Plant /obj/item/seeds/eggplant/eggy - name = "pack of egg-plant seeds" + name = "egg-plant seed pack" desc = "These seeds grow to produce berries that look a lot like eggs." icon_state = "seed-eggy" species = "eggy" diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index 84b1414335c..d4ef53474fc 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -1,6 +1,6 @@ // Poppy /obj/item/seeds/poppy - name = "pack of poppy seeds" + name = "poppy seed pack" desc = "These seeds grow into poppies." icon_state = "seed-poppy" species = "poppy" @@ -32,7 +32,7 @@ // Lily /obj/item/seeds/poppy/lily - name = "pack of lily seeds" + name = "lily seed pack" desc = "These seeds grow into lilies." icon_state = "seed-lily" species = "lily" @@ -52,7 +52,7 @@ //Spacemans's Trumpet /obj/item/seeds/poppy/lily/trumpet - name = "pack of spaceman's trumpet seeds" + name = "spaceman's trumpet seed pack" desc = "A plant sculped by extensive genetic engineering. The spaceman's trumpet is said to bear no resemblance to its wild ancestors. Inside NT AgriSci circles it is better known as NTPW-0372." icon_state = "seed-trumpet" species = "spacemanstrumpet" @@ -86,7 +86,7 @@ // Geranium /obj/item/seeds/poppy/geranium - name = "pack of geranium seeds" + name = "geranium seed pack" desc = "These seeds grow into geranium." icon_state = "seed-geranium" species = "geranium" @@ -106,7 +106,7 @@ ///Fraxinella seeds. /obj/item/seeds/poppy/geranium/fraxinella - name = "pack of fraxinella seeds" + name = "fraxinella seed pack" desc = "These seeds grow into fraxinella." icon_state = "seed-fraxinella" species = "fraxinella" @@ -130,7 +130,7 @@ // Harebell /obj/item/seeds/harebell - name = "pack of harebell seeds" + name = "harebell seed pack" desc = "These seeds grow into pretty little flowers." icon_state = "seed-harebell" plant_icon_offset = 1 @@ -162,7 +162,7 @@ // Sunflower /obj/item/seeds/sunflower - name = "pack of sunflower seeds" + name = "sunflower seed pack" desc = "These seeds grow into sunflowers." icon_state = "seed-sunflower" species = "sunflower" @@ -203,7 +203,7 @@ // Moonflower /obj/item/seeds/sunflower/moonflower - name = "pack of moonflower seeds" + name = "moonflower seed pack" desc = "These seeds grow into moonflowers." icon_state = "seed-moonflower" lefthand_file = 'icons/mob/inhands/items/food_lefthand.dmi' @@ -231,7 +231,7 @@ // Novaflower /obj/item/seeds/sunflower/novaflower - name = "pack of novaflower seeds" + name = "novaflower seed pack" desc = "These seeds grow into novaflowers." icon_state = "seed-novaflower" species = "novaflower" @@ -266,7 +266,7 @@ // Rose /obj/item/seeds/rose - name = "pack of rose seeds" + name = "rose seed pack" desc = "These seeds grow into roses." icon_state = "seed-rose" species = "rose" @@ -311,7 +311,7 @@ // Carbon Rose /obj/item/seeds/carbon_rose - name = "pack of carbon rose seeds" + name = "carbon rose seed pack" desc = "These seeds grow into carbon roses." icon_state = "seed-carbonrose" species = "carbonrose" diff --git a/code/modules/hydroponics/grown/garlic.dm b/code/modules/hydroponics/grown/garlic.dm index e37d49fa930..755d0c2920a 100644 --- a/code/modules/hydroponics/grown/garlic.dm +++ b/code/modules/hydroponics/grown/garlic.dm @@ -1,5 +1,5 @@ /obj/item/seeds/garlic - name = "pack of garlic seeds" + name = "garlic seed pack" desc = "A packet of extremely pungent seeds." icon_state = "seed-garlic" species = "garlic" diff --git a/code/modules/hydroponics/grown/gatfruit.dm b/code/modules/hydroponics/grown/gatfruit.dm index f64b6eb3bd4..c6de17d6eb6 100644 --- a/code/modules/hydroponics/grown/gatfruit.dm +++ b/code/modules/hydroponics/grown/gatfruit.dm @@ -1,7 +1,7 @@ // Gatfruit /obj/item/seeds/gatfruit - name = "pack of gatfruit seeds" + name = "gatfruit seed pack" desc = "These seeds grow into .357 revolvers." icon_state = "seed-gatfruit" species = "gatfruit" diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index 732a6d32b88..a5cdc08fb76 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -1,6 +1,6 @@ // Grass /obj/item/seeds/grass - name = "pack of grass seeds" + name = "grass seed pack" desc = "These seeds grow into grass. Yummy!" icon_state = "seed-grass" species = "grass" @@ -42,7 +42,7 @@ //Fairygrass /obj/item/seeds/grass/fairy - name = "pack of fairygrass seeds" + name = "fairygrass seed pack" desc = "These seeds grow into a more mystical grass." icon_state = "seed-fairygrass" species = "fairygrass" @@ -65,7 +65,7 @@ // Carpet /obj/item/seeds/grass/carpet - name = "pack of carpet seeds" + name = "carpet seed pack" desc = "These seeds grow into stylish carpet samples." icon_state = "seed-carpet" species = "carpet" diff --git a/code/modules/hydroponics/grown/hedges.dm b/code/modules/hydroponics/grown/hedges.dm index 9127f70f78f..d02949bfd98 100644 --- a/code/modules/hydroponics/grown/hedges.dm +++ b/code/modules/hydroponics/grown/hedges.dm @@ -1,5 +1,5 @@ /obj/item/seeds/shrub - name = "pack of shrub seeds" + name = "shrub seed pack" desc = "These seeds grow into hedge shrubs." icon_state = "seed-shrub" species = "shrub" diff --git a/code/modules/hydroponics/grown/herbs.dm b/code/modules/hydroponics/grown/herbs.dm index b22be06ec6a..bc450d6857f 100644 --- a/code/modules/hydroponics/grown/herbs.dm +++ b/code/modules/hydroponics/grown/herbs.dm @@ -1,6 +1,6 @@ // Herbs /obj/item/seeds/herbs - name = "pack of herb seeds" + name = "herb seed pack" desc = "These seeds grow to produce an assortment of herbs and seasonings." icon_state = "seed-herbs" species = "herbs" diff --git a/code/modules/hydroponics/grown/korta_nut.dm b/code/modules/hydroponics/grown/korta_nut.dm index cfa6c1e5b51..457ebff0716 100644 --- a/code/modules/hydroponics/grown/korta_nut.dm +++ b/code/modules/hydroponics/grown/korta_nut.dm @@ -1,6 +1,6 @@ //Korta Nut /obj/item/seeds/korta_nut - name = "pack of korta nut seeds" + name = "korta nut seed pack" desc = "These seeds grow into korta nut bushes, native to Tizira." icon_state = "seed-korta" species = "kortanut" @@ -29,7 +29,7 @@ //Sweet Korta Nut /obj/item/seeds/korta_nut/sweet - name = "pack of sweet korta nut seeds" + name = "sweet korta nut seed pack" desc = "These seeds grow into sweet korta nuts, a mutation of the original species that produces a thick syrup that Tizirans use for desserts." icon_state = "seed-sweetkorta" species = "kortanut" diff --git a/code/modules/hydroponics/grown/kronkus.dm b/code/modules/hydroponics/grown/kronkus.dm index 90d264230e7..b4ba30a5edd 100644 --- a/code/modules/hydroponics/grown/kronkus.dm +++ b/code/modules/hydroponics/grown/kronkus.dm @@ -1,5 +1,5 @@ /obj/item/seeds/kronkus - name = "pack of kronkus seeds" + name = "kronkus seed pack" desc = "A pack of highly illegal kronkus seeds.\nPossession of these seeds carries the death penalty in 7 sectors." icon_state = "seed-kronkus" plant_icon_offset = 6 diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index 0e59231141f..3aca50ae1be 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -1,6 +1,6 @@ // Watermelon /obj/item/seeds/watermelon - name = "pack of watermelon seeds" + name = "watermelon seed pack" desc = "These seeds grow into watermelon plants." icon_state = "seed-watermelon" species = "watermelon" @@ -27,6 +27,7 @@ name = "watermelon" desc = "It's full of watery goodness." icon_state = "watermelon" + inhand_icon_state = "watermelon" bite_consumption_mod = 2 w_class = WEIGHT_CLASS_NORMAL foodtypes = FRUIT @@ -39,9 +40,41 @@ /obj/item/food/grown/watermelon/make_dryable() return //No drying +/obj/item/food/grown/watermelon/attackby(obj/item/I, mob/user, params) + if(!istype(I, /obj/item/kitchen/spoon)) + return ..() + + var/melon_pulp_count = 1 + if(seed) + melon_pulp_count += round(seed.potency / 25) + + user.balloon_alert(user, "scooped out [melon_pulp_count] pulp(s)") + for(var/i in 1 to melon_pulp_count) + new /obj/item/food/watermelonmush(user.loc) + + /// The piece of armour melon turns into; either chetsplate or helmet + var/obj/item/clothing/melon_armour + /// Chance for the armour to be a chestplate instead of the helmet + var/melon_chestplate_chance = (max(0, seed.potency - 50) / 50) + if (prob(melon_chestplate_chance)) + if(seed.resistance_flags & FIRE_PROOF) + melon_armour = new /obj/item/clothing/suit/armor/durability/watermelon/fire_resist + else + melon_armour = new /obj/item/clothing/suit/armor/durability/watermelon + to_chat(user, span_notice("You hollow the melon into a helmet with [I].")) + else + if(seed.resistance_flags & FIRE_PROOF) + melon_armour = new /obj/item/clothing/head/helmet/durability/watermelon/fire_resist + else + melon_armour = new /obj/item/clothing/head/helmet/durability/watermelon + to_chat(user, span_notice("You hollow the melon into a chestplate with [I].")) + remove_item_from_storage(user) + qdel(src) + user.put_in_hands(melon_armour) + // Holymelon /obj/item/seeds/watermelon/holy - name = "pack of holymelon seeds" + name = "holymelon seed pack" desc = "These seeds grow into holymelon plants." icon_state = "seed-holymelon" species = "holymelon" @@ -66,6 +99,9 @@ wine_power = 70 //Water to wine, baby. wine_flavor = "divinity" +/obj/item/food/grown/holymelon/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/holymelonslice, 5, 20, screentip_verb = "Slice") + /obj/item/food/grown/holymelon/make_dryable() return //No drying @@ -73,6 +109,39 @@ . = ..() AddComponent(/datum/component/edible, check_liked = CALLBACK(src, PROC_REF(check_holyness))) + +/obj/item/food/grown/holymelon/attackby(obj/item/I, mob/user, params) + if(!istype(I, /obj/item/kitchen/spoon)) + return ..() + + var/holymelon_pulp_count = 1 + if(seed) + holymelon_pulp_count += round(seed.potency / 25) + + user.balloon_alert(user, "scooped out [holymelon_pulp_count] pulp(s)") + for(var/i in 1 to holymelon_pulp_count) + new /obj/item/food/holymelonmush(user.loc) + + /// The piece of armour holymelon turns into; either chetsplate or helmet + var/obj/item/clothing/holymelon_armour + /// Chance for the armour to be a chestplate instead of the helmet + var/holymelon_chestplate_chance = (max(0, seed.potency - 50) / 50) + if (prob(holymelon_chestplate_chance)) + if(seed.resistance_flags & FIRE_PROOF) + holymelon_armour = new /obj/item/clothing/suit/armor/durability/holymelon/fire_resist + else + holymelon_armour = new /obj/item/clothing/suit/armor/durability/holymelon + to_chat(user, span_notice("You hollow the holymelon into a helmet with [I].")) + else + if(seed.resistance_flags & FIRE_PROOF) + holymelon_armour = new /obj/item/clothing/head/helmet/durability/holymelon/fire_resist + else + holymelon_armour = new /obj/item/clothing/head/helmet/durability/holymelon + to_chat(user, span_notice("You hollow the holymelon into a chestplate with [I].")) + remove_item_from_storage(user) + qdel(src) + user.put_in_hands(holymelon_armour) + /* * Callback to be used with the edible component. * Checks whether or not the person eating the holymelon @@ -90,7 +159,7 @@ /// Barrel melon Seeds /obj/item/seeds/watermelon/barrel - name = "pack of barrelmelon seeds" + name = "barrelmelon seed pack" desc = "These seeds grow into barrelmelon plants." icon_state = "seed-barrelmelon" species = "barrelmelon" @@ -108,4 +177,41 @@ name = "barrelmelon" desc = "The nutriments within this melon have been compressed and fermented into rich alcohol." icon_state = "barrelmelon" + inhand_icon_state = "barrelmelon" distill_reagent = /datum/reagent/medicine/antihol //You can call it a integer overflow. + +/obj/item/food/grown/barrelmelon/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/barrelmelonslice, 5, 20, screentip_verb = "Chop") + +/obj/item/food/grown/barrelmelon/attackby(obj/item/I, mob/user, params) + if(!istype(I, /obj/item/kitchen/spoon)) + return ..() + + var/barrelmelon_pulp_count = 1 + if(seed) + barrelmelon_pulp_count += round(seed.potency / 25) + + user.balloon_alert(user, "scooped out [barrelmelon_pulp_count] pulp(s)") + for(var/i in 1 to barrelmelon_pulp_count) + new /obj/item/food/barrelmelonmush(user.loc) + + /// The piece of armour barrelmelon turns into; either chetsplate or helmet + var/obj/item/clothing/barrelmelon_armour + /// Chance for the armour to be a chestplate instead of the helmet + var/barrelmelon_chestplate_chance = (max(0, seed.potency - 50) / 50) + if (prob(barrelmelon_chestplate_chance)) + if(seed.resistance_flags & FIRE_PROOF) + barrelmelon_armour = new /obj/item/clothing/suit/armor/durability/barrelmelon/fire_resist + else + barrelmelon_armour = new /obj/item/clothing/suit/armor/durability/barrelmelon + to_chat(user, span_notice("You hollow the barrelmelon into a helmet with [I].")) + else + if(seed.resistance_flags & FIRE_PROOF) + barrelmelon_armour = new /obj/item/clothing/head/helmet/durability/barrelmelon/fire_resist + else + barrelmelon_armour = new /obj/item/clothing/head/helmet/durability/barrelmelon + to_chat(user, span_notice("You hollow the barrelmelon into a chestplate with [I].")) + + remove_item_from_storage(user) + qdel(src) + user.put_in_hands(barrelmelon_armour) diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index bfc50f0c483..9d1d802916b 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -11,7 +11,7 @@ // Reishi /obj/item/seeds/reishi - name = "pack of reishi mycelium" + name = "reishi mycelium pack" desc = "This mycelium grows into something medicinal and relaxing." icon_state = "mycelium-reishi" species = "reishi" @@ -38,7 +38,7 @@ // Fly Amanita /obj/item/seeds/amanita - name = "pack of fly amanita mycelium" + name = "fly amanita mycelium pack" desc = "This mycelium grows into something horrible." icon_state = "mycelium-amanita" species = "amanita" @@ -65,7 +65,7 @@ // Destroying Angel /obj/item/seeds/angel - name = "pack of destroying angel mycelium" + name = "destroying angel mycelium pack" desc = "This mycelium grows into something devastating." icon_state = "mycelium-angel" species = "angel" @@ -93,7 +93,7 @@ // Liberty Cap /obj/item/seeds/liberty - name = "pack of liberty-cap mycelium" + name = "liberty-cap mycelium pack" desc = "This mycelium grows into liberty-cap mushrooms." icon_state = "mycelium-liberty" species = "liberty" @@ -119,7 +119,7 @@ // Plump Helmet /obj/item/seeds/plump - name = "pack of plump-helmet mycelium" + name = "plump-helmet mycelium pack" desc = "This mycelium grows into helmets... maybe." icon_state = "mycelium-plump" species = "plump" @@ -145,7 +145,7 @@ // Walking Mushroom /obj/item/seeds/plump/walkingmushroom - name = "pack of walking mushroom mycelium" + name = "walking mushroom mycelium pack" desc = "This mycelium will grow into huge stuff!" icon_state = "mycelium-walkingmushroom" species = "walkingmushroom" @@ -171,7 +171,7 @@ // Chanterelle /obj/item/seeds/chanter - name = "pack of chanterelle mycelium" + name = "chanterelle mycelium pack" desc = "This mycelium grows into chanterelle mushrooms." icon_state = "mycelium-chanter" species = "chanter" @@ -197,9 +197,23 @@ desc = "Cantharellus Cibarius: These jolly yellow little shrooms sure look tasty!" icon_state = "chanterelle" +/obj/item/food/grown/mushroom/chanterelle/attackby(obj/item/I, mob/user, params) + if(!istype(I, /obj/item/kitchen/spoon)) + return ..() + if(seed.potency < 95) + return ..() + + to_chat(user, span_notice("You hollow up the chanterelle with [I].")) + remove_item_from_storage(user) + qdel(src) + if(seed.resistance_flags & FIRE_PROOF) + user.put_in_hands(new /obj/item/clothing/head/wizard/chanterelle/fr()) + else + user.put_in_hands(new /obj/item/clothing/head/wizard/chanterelle()) + //Jupiter Cup /obj/item/seeds/chanter/jupitercup - name = "pack of jupiter cup mycelium" + name = "jupiter cup mycelium pack" desc = "This mycelium grows into jupiter cups. Zeus would be envious at the power at your fingertips." icon_state = "mycelium-jupitercup" species = "jupitercup" @@ -224,7 +238,7 @@ // Glowshroom /obj/item/seeds/glowshroom - name = "pack of glowshroom mycelium" + name = "glowshroom mycelium pack" desc = "This mycelium -glows- into mushrooms!" icon_state = "mycelium-glowshroom" species = "glowshroom" @@ -279,7 +293,7 @@ // Glowcap /obj/item/seeds/glowshroom/glowcap - name = "pack of glowcap mycelium" + name = "glowcap mycelium pack" desc = "This mycelium -powers- into mushrooms!" icon_state = "mycelium-glowcap" species = "glowcap" @@ -303,7 +317,7 @@ //Shadowshroom /obj/item/seeds/glowshroom/shadowshroom - name = "pack of shadowshroom mycelium" + name = "shadowshroom mycelium pack" desc = "This mycelium will grow into something shadowy." icon_state = "mycelium-shadowshroom" species = "shadowshroom" @@ -332,7 +346,7 @@ investigate_log("was planted by [key_name(user)] at [AREACOORD(user)]", INVESTIGATE_BOTANY) /obj/item/seeds/odious_puffball - name = "pack of odious pullball spores" + name = "odious pullball spore pack" desc = "These spores reek! Disgusting." icon_state = "seed-odiouspuffball" species = "odiouspuffball" diff --git a/code/modules/hydroponics/grown/olive.dm b/code/modules/hydroponics/grown/olive.dm index 38102cacb24..0b2f52c7a5e 100644 --- a/code/modules/hydroponics/grown/olive.dm +++ b/code/modules/hydroponics/grown/olive.dm @@ -1,6 +1,6 @@ // Olive /obj/item/seeds/olive - name = "pack of olive seeds" + name = "olive seed pack" desc = "These seeds grow into olive trees." icon_state = "seed-olive" species = "olive" diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm index 8f948407a37..0d33c3e1f39 100644 --- a/code/modules/hydroponics/grown/onion.dm +++ b/code/modules/hydroponics/grown/onion.dm @@ -1,5 +1,5 @@ /obj/item/seeds/onion - name = "pack of onion seeds" + name = "onion seed pack" desc = "These seeds grow into onions." icon_state = "seed-onion" species = "onion" @@ -29,7 +29,7 @@ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/onion_slice, 2, 15, screentip_verb = "Cut") /obj/item/seeds/onion/red - name = "pack of red onion seeds" + name = "red onion seed pack" desc = "For growing exceptionally potent onions." icon_state = "seed-onionred" species = "onion_red" diff --git a/code/modules/hydroponics/grown/peanut.dm b/code/modules/hydroponics/grown/peanut.dm index 69cf6d9e056..6560ec196c9 100644 --- a/code/modules/hydroponics/grown/peanut.dm +++ b/code/modules/hydroponics/grown/peanut.dm @@ -1,6 +1,6 @@ // Peanuts! /obj/item/seeds/peanut - name = "pack of peanut seeds" + name = "peanut seed pack" desc = "These seeds grow into peanut plants." icon_state = "seed-peanut" species = "peanut" diff --git a/code/modules/hydroponics/grown/peas.dm b/code/modules/hydroponics/grown/peas.dm index c232ed247c6..66eaec6ff1d 100644 --- a/code/modules/hydroponics/grown/peas.dm +++ b/code/modules/hydroponics/grown/peas.dm @@ -1,6 +1,6 @@ // Finally, peas. Base plant. /obj/item/seeds/peas - name = "pack of pea pods" + name = "pea pod pack" desc = "These seeds grows into vitamin rich peas!" icon_state = "seed-peas" species = "peas" @@ -29,7 +29,7 @@ // Laughin' Peas /obj/item/seeds/peas/laugh - name = "pack of laughin' peas" + name = "laughin' pea pack" desc = "These seeds give off a very soft purple glow.. they should grow into Laughin' Peas." icon_state = "seed-laughpeas" species = "laughpeas" @@ -61,7 +61,7 @@ // World Peas - Peace at last, peace at last... /obj/item/seeds/peas/laugh/peace - name = "pack of world peas" + name = "world pea pack" desc = "These rather large seeds give off a soothing blue glow..." icon_state = "seed-worldpeas" species = "worldpeas" diff --git a/code/modules/hydroponics/grown/pineapple.dm b/code/modules/hydroponics/grown/pineapple.dm index 3c0e462f388..5de85e9168f 100644 --- a/code/modules/hydroponics/grown/pineapple.dm +++ b/code/modules/hydroponics/grown/pineapple.dm @@ -1,6 +1,6 @@ // Pineapple! /obj/item/seeds/pineapple - name = "pack of pineapple seeds" + name = "pineapple seed pack" desc = "Oooooooooooooh!" icon_state = "seed-pineapple" species = "pineapple" diff --git a/code/modules/hydroponics/grown/plum.dm b/code/modules/hydroponics/grown/plum.dm index cac12bdb1eb..c11acdf2db5 100644 --- a/code/modules/hydroponics/grown/plum.dm +++ b/code/modules/hydroponics/grown/plum.dm @@ -1,6 +1,6 @@ // Plum /obj/item/seeds/plum - name = "pack of plum seeds" + name = "plum seed pack" desc = "These seeds grow into plum trees." icon_state = "seed-plum" species = "plum" @@ -28,7 +28,7 @@ // Plumb /obj/item/seeds/plum/plumb - name = "pack of plumb seeds" + name = "plumb seed pack" desc = "These seeds grow into plumb trees." icon_state = "seed-plumb" species = "plumb" diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm index 837937e41d1..c57111b86d0 100644 --- a/code/modules/hydroponics/grown/potato.dm +++ b/code/modules/hydroponics/grown/potato.dm @@ -1,6 +1,6 @@ // Potato /obj/item/seeds/potato - name = "pack of potato seeds" + name = "potato seed pack" desc = "Boil 'em! Mash 'em! Stick 'em in a stew!" icon_state = "seed-potato" species = "potato" @@ -50,7 +50,7 @@ // Sweet Potato /obj/item/seeds/potato/sweet - name = "pack of sweet potato seeds" + name = "sweet potato seed pack" desc = "These seeds grow into sweet potato plants." icon_state = "seed-sweetpotato" species = "sweetpotato" diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm index 11130c15334..dce207302c3 100644 --- a/code/modules/hydroponics/grown/pumpkin.dm +++ b/code/modules/hydroponics/grown/pumpkin.dm @@ -1,6 +1,6 @@ // Pumpkin /obj/item/seeds/pumpkin - name = "pack of pumpkin seeds" + name = "pumpkin seed pack" desc = "These seeds grow into pumpkin vines." icon_state = "seed-pumpkin" plant_icon_offset = 4 @@ -40,7 +40,7 @@ // Blumpkin /obj/item/seeds/pumpkin/blumpkin - name = "pack of blumpkin seeds" + name = "blumpkin seed pack" desc = "These seeds grow into blumpkin vines." icon_state = "seed-blumpkin" species = "blumpkin" diff --git a/code/modules/hydroponics/grown/rainbow_bunch.dm b/code/modules/hydroponics/grown/rainbow_bunch.dm index 4ffad4583c7..c3d21347bf9 100644 --- a/code/modules/hydroponics/grown/rainbow_bunch.dm +++ b/code/modules/hydroponics/grown/rainbow_bunch.dm @@ -1,5 +1,5 @@ /obj/item/seeds/rainbow_bunch - name = "pack of rainbow bunch seeds" + name = "rainbow bunch seed pack" desc = "A pack of seeds that'll grow into a beautiful bush of various colored flowers." icon_state = "seed-rainbowbunch" species = "rainbowbunch" diff --git a/code/modules/hydroponics/grown/random.dm b/code/modules/hydroponics/grown/random.dm index 560e3c71e5c..3a97277f0d8 100644 --- a/code/modules/hydroponics/grown/random.dm +++ b/code/modules/hydroponics/grown/random.dm @@ -1,7 +1,7 @@ //Random seeds; stats, traits, and plant type are randomized for each seed. /obj/item/seeds/random - name = "pack of strange seeds" + name = "strange seed pack" desc = "Mysterious seeds as strange as their name implies. Spooky." icon_state = "seed-x" species = "?????" diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index 88c8572a3ae..47047f2e48c 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -2,7 +2,7 @@ // Yes, i'm talking about cabbage, baby! No, just kidding, but cabbages are the precursor to replica pods, so they are here as well. /obj/item/seeds/cabbage - name = "pack of cabbage seeds" + name = "cabbage seed pack" desc = "These seeds grow into cabbages." icon_state = "seed-cabbage" species = "cabbage" @@ -31,7 +31,7 @@ ///The actual replica pods themselves! /obj/item/seeds/replicapod - name = "pack of replica pod seeds" + name = "replica pod seed pack" desc = "These seeds grow into replica pods. They say these are used to harvest humans." icon_state = "seed-replicapod" plant_icon_offset = 2 diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm index c272b1e4484..4393d76a5fa 100644 --- a/code/modules/hydroponics/grown/root.dm +++ b/code/modules/hydroponics/grown/root.dm @@ -1,6 +1,6 @@ // Carrot /obj/item/seeds/carrot - name = "pack of carrot seeds" + name = "carrot seed pack" desc = "These seeds grow into carrots." icon_state = "seed-carrot" species = "carrot" @@ -12,7 +12,7 @@ instability = 15 growthstages = 3 growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi' - mutatelist = list(/obj/item/seeds/carrot/parsnip) + mutatelist = list(/obj/item/seeds/carrot/parsnip, /obj/item/seeds/carrot/cahnroot) reagents_add = list(/datum/reagent/medicine/oculine = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05) /obj/item/food/grown/carrot @@ -26,24 +26,26 @@ wine_power = 30 /obj/item/food/grown/carrot/attackby(obj/item/I, mob/user, params) - if(I.get_sharpness()) - var/carrot_blade - var/carrot_sword_chance = (max(0, seed.potency - 50) / 50) - if (prob(carrot_sword_chance)) - carrot_blade = new /obj/item/claymore/carrot - to_chat(user, span_notice("You sharpen the carrot into a sword with [I].")) - else - carrot_blade = new /obj/item/knife/shiv/carrot - to_chat(user, span_notice("You sharpen the carrot into a shiv with [I].")) - remove_item_from_storage(user) - qdel(src) - user.put_in_hands(carrot_blade) - else + if(!I.get_sharpness()) return ..() + /// The blade carrot will turn into once sharpened + var/obj/item/carrot_blade + /// Chance for it to become a sword rather than a shiv + var/carrot_sword_chance = (max(0, seed.potency - 50) / 50) + if (prob(carrot_sword_chance)) + carrot_blade = new /obj/item/claymore/carrot + to_chat(user, span_notice("You sharpen the carrot into a sword with [I].")) + else + carrot_blade = new /obj/item/knife/shiv/carrot + to_chat(user, span_notice("You sharpen the carrot into a shiv with [I].")) + remove_item_from_storage(user) + qdel(src) + user.put_in_hands(carrot_blade) + // Parsnip /obj/item/seeds/carrot/parsnip - name = "pack of parsnip seeds" + name = "parsnip seed pack" desc = "These seeds grow into parsnips." icon_state = "seed-parsnip" species = "parsnip" @@ -62,10 +64,73 @@ juice_typepath = /datum/reagent/consumable/parsnipjuice wine_power = 35 +/obj/item/food/grown/parsnip/attackby(obj/item/I, mob/user, params) + if(!I.get_sharpness()) + return ..() + + /// The blade parsnip will turn into once sharpened + var/obj/item/parsnip_blade + /// Chance for it to become a sabre rather than a shiv + var/parsnip_sabre_chance = (max(0, seed.potency - 50) / 50) + if (prob(parsnip_sabre_chance)) + parsnip_blade = new /obj/item/melee/parsnip_sabre + to_chat(user, span_notice("You sharpen the parsnip into a sabre with [I].")) + else + parsnip_blade = new /obj/item/knife/shiv/parsnip + to_chat(user, span_notice("You sharpen the parsnip into a shiv with [I].")) + remove_item_from_storage(user) + qdel(src) + user.put_in_hands(parsnip_blade) + + +// Cahn'root +/obj/item/seeds/carrot/cahnroot + name = "cahn'root seed pack" + desc = "These seeds grow into cahn'roots." + icon_state = "seed-cahn'root" + species = "cahn'root" + plantname = "Cahn'root" + product = /obj/item/food/grown/cahnroot + genes = list(/datum/plant_gene/trait/plant_type/weed_hardy) + endurance = 50 + instability = 10 + icon_dead = "cahn'root-dead" + mutatelist = null + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.05, /datum/reagent/consumable/nutriment = 0.05, /datum/reagent/cellulose = 0.01, /datum/reagent/consumable/sugar = 0.01) + rarity = 10 + graft_gene = /datum/plant_gene/trait/plant_type/weed_hardy + +/obj/item/food/grown/cahnroot + seed = /obj/item/seeds/carrot/cahnroot + name = "cahn'root" + desc = "Heavily modified version of terran carrot, originally made to survive the scarciest of environments by an enterprising scientist of Moth Flotilla, Cahn'Mang." + icon_state = "cahn'root" + foodtypes = VEGETABLES + juice_typepath = null + tastes = list("sweet dirt" = 1) + distill_reagent = /datum/reagent/consumable/rootbeer + +/obj/item/food/grown/cahnroot/attackby(obj/item/I, mob/user, params) + if(!I.get_sharpness()) + return ..() + + /// The blade cahn'root will turn into once sharpened + var/obj/item/knife/root_blade + /// Chance for it to become a dagger rather than a shiv + var/root_dagger_chance = (max(0, seed.potency - 25) / 50) + if (prob(root_dagger_chance)) + root_blade = new /obj/item/knife/combat/root + to_chat(user, span_notice("You sharpen the cahn'root into a dagger with [I].")) + else + root_blade = new /obj/item/knife/shiv/root + to_chat(user, span_notice("You sharpen the cahn'root into a shiv with [I].")) + remove_item_from_storage(user) + qdel(src) + user.put_in_hands(root_blade) // White-Beet /obj/item/seeds/whitebeet - name = "pack of white-beet seeds" + name = "white-beet seed pack" desc = "These seeds grow into sugary beet producing plants." icon_state = "seed-whitebeet" species = "whitebeet" @@ -91,7 +156,7 @@ // Red Beet /obj/item/seeds/redbeet - name = "pack of redbeet seeds" + name = "redbeet seed pack" desc = "These seeds grow into red beet producing plants." icon_state = "seed-redbeet" species = "redbeet" diff --git a/code/modules/hydroponics/grown/seedling.dm b/code/modules/hydroponics/grown/seedling.dm index 57fd11280b6..9ce83acfa9e 100644 --- a/code/modules/hydroponics/grown/seedling.dm +++ b/code/modules/hydroponics/grown/seedling.dm @@ -1,5 +1,5 @@ /obj/item/seeds/seedling - name = "pack of seedling seeds" + name = "seedling seed pack" desc = "These seeds grow into a floral assistant which can help look after other plants!" icon_state = "seed-seedling" growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' diff --git a/code/modules/hydroponics/grown/sugarcane.dm b/code/modules/hydroponics/grown/sugarcane.dm index 1c5c55fece0..e7845f1e556 100644 --- a/code/modules/hydroponics/grown/sugarcane.dm +++ b/code/modules/hydroponics/grown/sugarcane.dm @@ -1,7 +1,7 @@ // Sugarcane /obj/item/seeds/sugarcane - name = "pack of sugarcane seeds" + name = "sugarcane seed pack" desc = "These seeds grow into sugarcane." icon_state = "seed-sugarcane" species = "sugarcane" @@ -28,7 +28,7 @@ ///and bamboo! /obj/item/seeds/bamboo - name = "pack of bamboo seeds" + name = "bamboo seed pack" desc = "A plant known for its flexible and resistant logs." icon_state = "seed-bamboo" species = "bamboo" @@ -59,7 +59,7 @@ //Saltcane - Gross, salty shafts! /obj/item/seeds/sugarcane/saltcane - name = "pack of saltcane seeds" + name = "saltcane seed pack" desc = "These seeds grow into saltcane." icon_state = "seed-saltcane" species = "saltcane" diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm index 366dd8b4523..26a215be720 100644 --- a/code/modules/hydroponics/grown/tea_coffee.dm +++ b/code/modules/hydroponics/grown/tea_coffee.dm @@ -1,6 +1,6 @@ // Tea /obj/item/seeds/tea - name = "pack of tea aspera seeds" + name = "tea aspera seed pack" desc = "These seeds grow into tea plants." icon_state = "seed-teaaspera" species = "teaaspera" @@ -27,7 +27,7 @@ // Tea Astra /obj/item/seeds/tea/astra - name = "pack of tea astra seeds" + name = "tea astra seed pack" icon_state = "seed-teaastra" species = "teaastra" plantname = "Tea Astra Plant" @@ -46,7 +46,7 @@ // Coffee /obj/item/seeds/coffee - name = "pack of coffee arabica seeds" + name = "coffee arabica seed pack" desc = "These seeds grow into coffee arabica bushes." icon_state = "seed-coffeea" species = "coffeea" @@ -75,7 +75,7 @@ // Coffee Robusta /obj/item/seeds/coffee/robusta - name = "pack of coffee robusta seeds" + name = "coffee robusta seed pack" desc = "These seeds grow into coffee robusta bushes." icon_state = "seed-coffeer" species = "coffeer" diff --git a/code/modules/hydroponics/grown/tobacco.dm b/code/modules/hydroponics/grown/tobacco.dm index 87f8253a4d9..29e8fba6d6a 100644 --- a/code/modules/hydroponics/grown/tobacco.dm +++ b/code/modules/hydroponics/grown/tobacco.dm @@ -1,6 +1,6 @@ // Tobacco /obj/item/seeds/tobacco - name = "pack of tobacco seeds" + name = "tobacco seed pack" desc = "These seeds grow into tobacco plants." icon_state = "seed-tobacco" species = "tobacco" @@ -24,7 +24,7 @@ // Space Tobacco /obj/item/seeds/tobacco/space - name = "pack of space tobacco seeds" + name = "space tobacco seed pack" desc = "These seeds grow into space tobacco plants." icon_state = "seed-stobacco" species = "stobacco" diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index e676d822bbf..1459887d6fa 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -1,6 +1,6 @@ // Tomato /obj/item/seeds/tomato - name = "pack of tomato seeds" + name = "tomato seed pack" desc = "These seeds grow into tomato plants." icon_state = "seed-tomato" species = "tomato" @@ -29,7 +29,7 @@ // Blood Tomato /obj/item/seeds/tomato/blood - name = "pack of blood-tomato seeds" + name = "blood-tomato seed pack" desc = "These seeds grow into blood-tomato plants." icon_state = "seed-bloodtomato" species = "bloodtomato" @@ -52,7 +52,7 @@ // Blue Tomato /obj/item/seeds/tomato/blue - name = "pack of blue-tomato seeds" + name = "blue-tomato seed pack" desc = "These seeds grow into blue-tomato plants." icon_state = "seed-bluetomato" species = "bluetomato" @@ -77,7 +77,7 @@ // Bluespace Tomato /obj/item/seeds/tomato/blue/bluespace - name = "pack of bluespace tomato seeds" + name = "bluespace tomato seed pack" desc = "These seeds grow into bluespace tomato plants." icon_state = "seed-bluespacetomato" species = "bluespacetomato" @@ -101,7 +101,7 @@ // Killer Tomato /obj/item/seeds/tomato/killer - name = "pack of killer-tomato seeds" + name = "killer-tomato seed pack" desc = "These seeds grow into killer-tomato plants." icon_state = "seed-killertomato" species = "killertomato" diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 1082b51665f..a09e4e61b4d 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -1,5 +1,5 @@ /obj/item/seeds/tower - name = "pack of tower-cap mycelium" + name = "tower-cap mycelium pack" desc = "This mycelium grows into tower-cap mushrooms." icon_state = "mycelium-tower" species = "towercap" @@ -20,7 +20,7 @@ graft_gene = /datum/plant_gene/trait/plant_type/fungal_metabolism /obj/item/seeds/tower/steel - name = "pack of steel-cap mycelium" + name = "steel-cap mycelium pack" desc = "This mycelium grows into steel logs." icon_state = "mycelium-steelcap" species = "steelcap" diff --git a/code/modules/hydroponics/grown/weeds/kudzu.dm b/code/modules/hydroponics/grown/weeds/kudzu.dm index 86b49672705..a0a3c940571 100644 --- a/code/modules/hydroponics/grown/weeds/kudzu.dm +++ b/code/modules/hydroponics/grown/weeds/kudzu.dm @@ -1,7 +1,7 @@ // A very special plant, deserving its own file. /obj/item/seeds/kudzu - name = "pack of kudzu seeds" + name = "kudzu seed pack" desc = "These seeds grow into a weed that grows incredibly fast." icon_state = "seed-kudzu" plant_icon_offset = 2 diff --git a/code/modules/hydroponics/grown/weeds/nettle.dm b/code/modules/hydroponics/grown/weeds/nettle.dm index 98868b8d6e7..33a0f628891 100644 --- a/code/modules/hydroponics/grown/weeds/nettle.dm +++ b/code/modules/hydroponics/grown/weeds/nettle.dm @@ -1,5 +1,5 @@ /obj/item/seeds/nettle - name = "pack of nettle seeds" + name = "nettle seed pack" desc = "These seeds grow into nettles." icon_state = "seed-nettle" plant_icon_offset = 0 @@ -17,7 +17,7 @@ graft_gene = /datum/plant_gene/trait/plant_type/weed_hardy /obj/item/seeds/nettle/death - name = "pack of death-nettle seeds" + name = "death-nettle seed pack" desc = "These seeds grow into death-nettles." icon_state = "seed-deathnettle" species = "deathnettle" diff --git a/code/modules/hydroponics/grown/weeds/starthistle.dm b/code/modules/hydroponics/grown/weeds/starthistle.dm index 74627a31f88..af94cf3d985 100644 --- a/code/modules/hydroponics/grown/weeds/starthistle.dm +++ b/code/modules/hydroponics/grown/weeds/starthistle.dm @@ -1,6 +1,6 @@ // Starthistle /obj/item/seeds/starthistle - name = "pack of starthistle seeds" + name = "starthistle seed pack" desc = "A robust species of weed that often springs up in-between the cracks of spaceship parking lots." icon_state = "seed-starthistle" plant_icon_offset = 3 @@ -33,7 +33,7 @@ // Corpse flower /obj/item/seeds/starthistle/corpse_flower - name = "pack of corpse flower seeds" + name = "corpse flower seed pack" desc = "A species of plant that emits a horrible odor. The odor stops being produced in difficult atmospheric conditions." icon_state = "seed-corpse-flower" species = "corpse-flower" @@ -46,7 +46,7 @@ //Galaxy Thistle /obj/item/seeds/galaxythistle - name = "pack of galaxythistle seeds" + name = "galaxythistle seed pack" desc = "An impressive species of weed that is thought to have evolved from the simple milk thistle. Contains flavolignans that can help repair a damaged liver." icon_state = "seed-galaxythistle" species = "galaxythistle" diff --git a/code/modules/jobs/job_types/assistant/gimmick_assistants.dm b/code/modules/jobs/job_types/assistant/gimmick_assistants.dm index 17bd554f39b..16c0e037844 100644 --- a/code/modules/jobs/job_types/assistant/gimmick_assistants.dm +++ b/code/modules/jobs/job_types/assistant/gimmick_assistants.dm @@ -167,6 +167,7 @@ belt = /obj/item/storage/belt/utility/full head = /obj/item/clothing/head/utility/hardhat uniform = /obj/item/clothing/under/color/yellow + l_pocket = /obj/item/modular_computer/pda/assistant outfit_weight = 6 diff --git a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm index df658d71ddd..b02dee12cf8 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm @@ -564,7 +564,7 @@ /obj/item/nullrod/bostaff name = "monk's staff" desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts, it is now used to harass the clown." - force = 15 + force = 14 block_chance = 40 block_sound = 'sound/weapons/genhit.ogg' slot_flags = ITEM_SLOT_BACK @@ -574,11 +574,25 @@ attack_verb_simple = list("smash", "slam", "whack", "thwack") icon = 'icons/obj/weapons/staff.dmi' icon_state = "bostaff0" + base_icon_state = "bostaff" inhand_icon_state = "bostaff0" worn_icon_state = "bostaff0" lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' - menu_description = "A staff which provides a medium-low chance of blocking incoming melee attacks and deals a little less damage. Can be worn on the back." + menu_description = "A staff which provides a medium-low chance of blocking incoming melee attacks and deals less damage, unless dual-wielded. Can be worn on the back." + +/obj/item/nullrod/bostaff/Initialize(mapload) + . = ..() + AddComponent(/datum/component/two_handed, \ + force_unwielded = 14, \ + force_wielded = 18, \ + icon_wielded = "[base_icon_state]1", \ + ) + +/obj/item/nullrod/bostaff/update_icon_state() + icon_state = "[base_icon_state]0" + return ..() + // Arrhythmic Knife - Lets your walk without rhythm by varying your walk speed. Can't be put away. diff --git a/code/modules/loadout/categories/pocket.dm b/code/modules/loadout/categories/pocket.dm index 8206192bb81..2689c2b726e 100644 --- a/code/modules/loadout/categories/pocket.dm +++ b/code/modules/loadout/categories/pocket.dm @@ -106,10 +106,6 @@ name = "Plush (Moth)" item_path = /obj/item/toy/plush/moth -/datum/loadout_item/pocket_items/plush/narsie - name = "Plush (Nar'sie)" - item_path = /obj/item/toy/plush/narplush - /datum/loadout_item/pocket_items/plush/nukie name = "Plush (Nukie)" item_path = /obj/item/toy/plush/nukeplushie @@ -122,10 +118,6 @@ name = "Plush (Plasmaman)" item_path = /obj/item/toy/plush/plasmamanplushie -/datum/loadout_item/pocket_items/plush/ratvar - name = "Plush (Ratvar)" - item_path = /obj/item/toy/plush/ratplush - /datum/loadout_item/pocket_items/plush/rouny name = "Plush (Rouny)" item_path = /obj/item/toy/plush/rouny diff --git a/code/modules/lootpanel/contents.dm b/code/modules/lootpanel/contents.dm index 44f4acd47f2..2fcd4201d8a 100644 --- a/code/modules/lootpanel/contents.dm +++ b/code/modules/lootpanel/contents.dm @@ -21,6 +21,8 @@ if(!istype(thing)) stack_trace("Non-atom in the contents of [source_turf]!") continue + if(QDELETED(thing)) + continue if(thing.mouse_opacity == MOUSE_OPACITY_TRANSPARENT) continue if(thing.IsObscured()) diff --git a/code/modules/lootpanel/search_object.dm b/code/modules/lootpanel/search_object.dm index 149be76e710..2cb0bdf85db 100644 --- a/code/modules/lootpanel/search_object.dm +++ b/code/modules/lootpanel/search_object.dm @@ -62,6 +62,7 @@ /datum/search_object/Destroy(force) item = null + icon = null return ..() @@ -75,6 +76,9 @@ /datum/search_object/proc/on_item_moved(atom/source) SIGNAL_HANDLER + if(QDELETED(src)) + return + qdel(src) @@ -82,4 +86,4 @@ /datum/search_object/proc/on_turf_change(turf/source, path, list/new_baseturfs, flags, list/post_change_callbacks) SIGNAL_HANDLER - post_change_callbacks += CALLBACK(src, GLOBAL_PROC_REF(qdel), src) + post_change_callbacks += CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src) diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index 81f02ec7bab..1401f8a5139 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -276,7 +276,7 @@ graft_gene = /datum/plant_gene/trait/fire_resistance /obj/item/seeds/lavaland/cactus - name = "pack of fruiting cactus seeds" + name = "fruiting cactus seed pack" desc = "These seeds grow into fruiting cacti." icon_state = "seed-cactus" species = "cactus" @@ -290,7 +290,7 @@ ///Star Cactus seeds, mutation of lavaland cactus. /obj/item/seeds/star_cactus - name = "pack of star cacti seeds" + name = "star cacti seed pack" desc = "These seeds grow into star cacti." icon_state = "seed-starcactus" species = "starcactus" @@ -318,7 +318,7 @@ distill_reagent = /datum/reagent/consumable/ethanol/tequila /obj/item/seeds/lavaland/polypore - name = "pack of polypore mycelium" + name = "polypore mycelium pack" desc = "This mycelium grows into bracket mushrooms, also known as polypores. Woody and firm, shaft miners often use them for makeshift crafts." icon_state = "mycelium-polypore" species = "polypore" @@ -329,7 +329,7 @@ reagents_add = list(/datum/reagent/consumable/nutriment = 0.04, /datum/reagent/consumable/ethanol = 0.04, /datum/reagent/stabilizing_agent = 0.06, /datum/reagent/consumable/mintextract = 0.02) /obj/item/seeds/lavaland/porcini - name = "pack of porcini mycelium" + name = "porcini mycelium pack" desc = "This mycelium grows into Boletus edulus, also known as porcini. Native to the late Earth, but discovered on Lavaland. Has culinary, medicinal and relaxant effects." icon_state = "mycelium-porcini" species = "porcini" @@ -340,7 +340,7 @@ reagents_add = list(/datum/reagent/consumable/nutriment = 0.06, /datum/reagent/consumable/sugar = 0.06, /datum/reagent/consumable/vitfro = 0.04, /datum/reagent/drug/nicotine = 0.04) /obj/item/seeds/lavaland/inocybe - name = "pack of inocybe mycelium" + name = "inocybe mycelium pack" desc = "This mycelium grows into an inocybe mushroom, a species of Lavaland origin with hallucinatory and toxic effects." icon_state = "mycelium-inocybe" species = "inocybe" @@ -351,7 +351,7 @@ reagents_add = list(/datum/reagent/toxin/mindbreaker = 0.04, /datum/reagent/consumable/entpoly = 0.08, /datum/reagent/drug/mushroomhallucinogen = 0.04) /obj/item/seeds/lavaland/ember - name = "pack of embershroom mycelium" + name = "embershroom mycelium pack" desc = "This mycelium grows into embershrooms, a species of bioluminescent mushrooms native to Lavaland." icon_state = "mycelium-ember" species = "ember" @@ -362,7 +362,7 @@ reagents_add = list(/datum/reagent/consumable/tinlux = 0.04, /datum/reagent/consumable/nutriment/vitamin = 0.02, /datum/reagent/drug/space_drugs = 0.02) /obj/item/seeds/lavaland/seraka - name = "pack of seraka mycelium" + name = "seraka mycelium pack" desc = "This mycelium grows into seraka mushrooms, a species of savoury mushrooms originally native to Tizira used in food and traditional medicine." icon_state = "mycelium-seraka" species = "seraka" @@ -373,7 +373,7 @@ reagents_add = list(/datum/reagent/toxin/mushroom_powder = 0.1, /datum/reagent/medicine/coagulant/seraka_extract = 0.02) /obj/item/seeds/lavaland/fireblossom - name = "pack of fire blossom seeds" + name = "fire blossom seed pack" desc = "These seeds grow into fire blossoms." plantname = "Fire Blossom" icon_state = "seed-fireblossom" diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm index 6e42d2adc97..7d67e8a4ae5 100644 --- a/code/modules/mob/living/basic/basic.dm +++ b/code/modules/mob/living/basic/basic.dm @@ -318,3 +318,9 @@ /mob/living/basic/get_body_temp_cold_damage_limit() return minimum_survivable_temperature + +/mob/living/basic/proc/hop_on_nearby_turf() + var/dir = pick(GLOB.cardinals) + Move(get_step(src, dir), dir) + animate(src, pixel_y = 18, time = 0.4 SECONDS, flags = ANIMATION_RELATIVE, easing = CUBIC_EASING|EASE_OUT) + animate(pixel_y = -18, time = 0.4 SECONDS, flags = ANIMATION_RELATIVE, easing = CUBIC_EASING|EASE_IN) diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm index 031ec3d4525..7dcbc4ae325 100644 --- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm @@ -41,8 +41,6 @@ /mob/living/basic/mining/lobstrosity/Initialize(mapload) . = ..() - var/static/list/food_types = list(/obj/item/fish/lavaloop) - ai_controller.set_blackboard_key(BB_BASIC_FOODS, typecacheof(food_types)) AddComponent(/datum/component/profound_fisher) AddElement(/datum/element/mob_grabber) AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm index 5ca1ca2cfd5..32ec66a62cc 100644 --- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm @@ -34,6 +34,14 @@ /datum/ai_planning_subtree/find_and_hunt_target/lobster_fishing, /datum/ai_planning_subtree/find_fingers, ) + +/datum/ai_controller/basic_controller/lobstrosity/TryPossessPawn(atom/new_pawn) + . = ..() + if(. & AI_CONTROLLER_INCOMPATIBLE) + return + var/static/list/food_types = typecacheof(list(/obj/item/fish/lavaloop)) + set_blackboard_key(BB_BASIC_FOODS, food_types) + ///Ensure that juveline lobstrosities witll charge at things they can reach. /datum/ai_controller/basic_controller/lobstrosity/juvenile blackboard = list( diff --git a/code/modules/mob/living/basic/lavaland/node_drone/node_drone.dm b/code/modules/mob/living/basic/lavaland/node_drone/node_drone.dm index b149c6d0972..87687c56999 100644 --- a/code/modules/mob/living/basic/lavaland/node_drone/node_drone.dm +++ b/code/modules/mob/living/basic/lavaland/node_drone/node_drone.dm @@ -74,6 +74,31 @@ if(flying_state == FLY_IN_STATE || flying_state == FLY_OUT_STATE) icon_state = "mining_node_flying" +/mob/living/basic/node_drone/update_overlays() + . = ..() + if(attached_vent) + var/time_remaining = COOLDOWN_TIMELEFT(attached_vent, wave_cooldown) + var/wave_timers + switch(attached_vent?.boulder_size) + if(BOULDER_SIZE_SMALL) + wave_timers = WAVE_DURATION_SMALL + if(BOULDER_SIZE_MEDIUM) + wave_timers = WAVE_DURATION_MEDIUM + if(BOULDER_SIZE_LARGE) + wave_timers = WAVE_DURATION_LARGE + var/remaining_fraction = (time_remaining / wave_timers) + if(remaining_fraction <= 0.3) + . += "node_progress_4" + return + if(remaining_fraction <= 0.55) + . += "node_progress_3" + return + if(remaining_fraction <= 0.80) + . += "node_progress_2" + return + . += "node_progress_1" + return + /mob/living/basic/node_drone/proc/arrive(obj/structure/ore_vent/parent_vent) attached_vent = parent_vent maxHealth = 300 + ((attached_vent.boulder_size/BOULDER_SIZE_SMALL) * 100) diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index 3717cfcb89a..630171ba2c1 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -33,7 +33,6 @@ In all, this is a lot like the monkey code. /N to_chat(user, span_danger("You bite [src]!")) adjustBruteLoss(1) log_combat(user, src, "attacked") - updatehealth() else to_chat(user, span_warning("[name] is too injured for that.")) diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 2dec4eae1f7..faa61cfe01a 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -1260,10 +1260,9 @@ GLOBAL_LIST_EMPTY(features_by_species) //SKYRAT EDIT END // Get the insulation value based on the area's temp var/thermal_protection = humi.get_insulation_protection(area_temp) - var/original_bodytemp = humi.bodytemperature // Changes to the skin temperature based on the area - var/area_skin_diff = area_temp - original_bodytemp + var/area_skin_diff = area_temp - humi.bodytemperature if(!humi.on_fire || area_skin_diff > 0) // change rate of 0.05 as area temp has large impact on the surface var/area_skin_change = get_temp_change_amount(area_skin_diff, 0.05 * seconds_per_tick) @@ -1283,7 +1282,7 @@ GLOBAL_LIST_EMPTY(features_by_species) // Core to skin temp transfer, when not on fire if(!humi.on_fire) // Get the changes to the skin from the core temp - var/core_skin_diff = humi.coretemperature - original_bodytemp + var/core_skin_diff = humi.coretemperature - humi.bodytemperature // change rate of 0.045 to reflect temp back to the skin at the slight higher rate then core to skin var/core_skin_change = (1 + thermal_protection) * get_temp_change_amount(core_skin_diff, 0.045 * seconds_per_tick) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 737d5f055e1..76c390d6abc 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -174,13 +174,8 @@ if(now_pushing) return TRUE - var/they_can_move = TRUE - var/their_combat_mode = FALSE - if(isliving(M)) var/mob/living/L = M - their_combat_mode = L.combat_mode - they_can_move = L.mobility_flags & MOBILITY_MOVE //Also spread diseases for(var/thing in diseases) var/datum/disease/D = thing @@ -226,22 +221,7 @@ return TRUE if(!M.buckled && !M.has_buckled_mobs()) - var/mob_swap = FALSE - var/too_strong = (M.move_resist > move_force) //can't swap with immovable objects unless they help us - if(!they_can_move) //we have to physically move them - if(!too_strong) - mob_swap = TRUE - else - //You can swap with the person you are dragging on grab intent, and restrained people in most cases - if(M.pulledby == src && !too_strong) - mob_swap = TRUE - else if( - !(HAS_TRAIT(M, TRAIT_NOMOBSWAP) || HAS_TRAIT(src, TRAIT_NOMOBSWAP)) &&\ - ((HAS_TRAIT(M, TRAIT_RESTRAINED) && !too_strong) || !their_combat_mode) &&\ - (HAS_TRAIT(src, TRAIT_RESTRAINED) || !combat_mode) - ) - mob_swap = TRUE - if(mob_swap) + if(can_mobswap_with(M)) //switch our position with M if(loc && !loc.Adjacent(M.loc)) return TRUE @@ -294,6 +274,46 @@ if(prob(I.block_chance*2)) return +/mob/living/proc/can_mobswap_with(mob/other) + if (HAS_TRAIT(other, TRAIT_NOMOBSWAP) || HAS_TRAIT(src, TRAIT_NOMOBSWAP)) + return FALSE + + var/they_can_move = TRUE + var/their_combat_mode = FALSE + + if(isliving(other)) + var/mob/living/other_living = other + their_combat_mode = other_living.combat_mode + they_can_move = other_living.mobility_flags & MOBILITY_MOVE + + var/too_strong = other.move_resist > move_force + + // They cannot move, see if we can push through them + if (!they_can_move) + return !too_strong + + // We are pulling them and can move through + if (other.pulledby == src && !too_strong) + return TRUE + + // If we're in combat mode and not restrained we don't try to pass through people + if (combat_mode && !HAS_TRAIT(src, TRAIT_RESTRAINED)) + return FALSE + + // Nor can we pass through non-restrained people in combat mode (or if they're restrained but still too strong for us) + if (their_combat_mode && (!HAS_TRAIT(other, TRAIT_RESTRAINED) || too_strong)) + return FALSE + + if (isnull(other.client) || isnull(client)) + return TRUE + + // If both of us are trying to move in the same direction, let the fastest one through first + if (client.intended_direction == other.client.intended_direction) + return cached_multiplicative_slowdown < other.cached_multiplicative_slowdown + + // Else, sure, let us pass + return TRUE + /mob/living/get_photo_description(obj/item/camera/camera) var/list/holding = list() var/len = length(held_items) diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index 7dea684e569..0c5eb6ec164 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -14,7 +14,6 @@ /mob/living/silicon/ai/blob_act(obj/structure/blob/B) if (stat != DEAD) adjustBruteLoss(60) - updatehealth() return TRUE return FALSE diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index 3a8cec66efd..5c4384302b8 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -21,18 +21,30 @@ else logevent("FATAL -- SYSTEM HALT") modularInterface.shutdown_computer() + eye_flash_timer = addtimer(CALLBACK(src, PROC_REF(flash_headlamp)), 2 SECONDS, TIMER_STOPPABLE | TIMER_LOOP) . = ..() locked = FALSE //unlock cover if(!QDELETED(builtInCamera) && builtInCamera.camera_enabled) builtInCamera.toggle_cam(src,0) + toggle_headlamp(TRUE) //So borg lights are disabled when killed. - drop_all_held_items() // particularly to ensure sight modes are cleared - update_icons() - unbuckle_all_mobs(TRUE) - SSblackbox.ReportDeath(src) + +/mob/living/silicon/robot/proc/flash_headlamp() + if(eye_lights) + eye_lights = null + regenerate_icons() + return + + eye_lights = new() + eye_lights.icon_state = "[model.special_light_key ? "[model.special_light_key]":"[model.cyborg_base_icon]"]_e_r" + eye_lights.color = COLOR_WHITE + SET_PLANE_EXPLICIT(eye_lights, ABOVE_GAME_PLANE, src) + eye_lights.icon = icon + regenerate_icons() + add_overlay(eye_lights) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 38c18c17ed1..20e1be9823a 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -594,6 +594,7 @@ /mob/living/silicon/robot/updatehealth() ..() + update_damage_particles() if(!model.breakable_modules) return @@ -691,6 +692,9 @@ builtInCamera.toggle_cam(src, 0) if(full_heal_flags & HEAL_ADMIN) locked = TRUE + if(eye_flash_timer) + deltimer(eye_flash_timer) + eye_flash_timer = null src.set_stat(CONSCIOUS) notify_ai(AI_NOTIFICATION_NEW_BORG) toggle_headlamp(FALSE, TRUE) //This will reenable borg headlamps if doomsday is currently going on still. diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 549762fd7a9..16da8d89783 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -186,6 +186,52 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real return ..() +#define LOW_DAMAGE_UPPER_BOUND 1/3 +#define MODERATE_DAMAGE_UPPER_BOUND 2/3 + +/mob/living/silicon/robot/proc/update_damage_particles() + var/brute_percent = bruteloss / maxHealth + var/burn_percent = fireloss / maxHealth + + if (brute_percent > MODERATE_DAMAGE_UPPER_BOUND) + if(!smoke_particles) + smoke_particles = new(src, /particles/smoke/cyborg/heavy_damage, PARTICLE_ATTACH_MOB) + else if(!istype(smoke_particles.particles, /particles/smoke/cyborg/heavy_damage)) //TODO: needs to be darker + QDEL_NULL(smoke_particles) + smoke_particles = new(src, /particles/smoke/cyborg/heavy_damage, PARTICLE_ATTACH_MOB) + + else if (brute_percent > LOW_DAMAGE_UPPER_BOUND) + if(!smoke_particles) + smoke_particles = new(src, /particles/smoke/cyborg, PARTICLE_ATTACH_MOB) + else if(!istype(smoke_particles.particles, /particles/smoke/cyborg)) + QDEL_NULL(smoke_particles) + smoke_particles = new(src, /particles/smoke/cyborg, PARTICLE_ATTACH_MOB) + + else + if(smoke_particles) + QDEL_NULL(smoke_particles) + + if (burn_percent > MODERATE_DAMAGE_UPPER_BOUND) + if(!spark_particles) + spark_particles = new(src, /particles/embers/spark/severe, PARTICLE_ATTACH_MOB) + else if(!istype(spark_particles.particles, /particles/embers/spark/severe)) //TODO: needs to be more dramatic + QDEL_NULL(spark_particles) + spark_particles = new(src, /particles/embers/spark/severe, PARTICLE_ATTACH_MOB) + + else if (burn_percent > LOW_DAMAGE_UPPER_BOUND) + if(!spark_particles) + spark_particles = new(src, /particles/embers/spark, PARTICLE_ATTACH_MOB) + else if(!istype(spark_particles.particles, /particles/embers/spark)) + QDEL_NULL(spark_particles) + spark_particles = new(src, /particles/embers/spark, PARTICLE_ATTACH_MOB) + + else + if(spark_particles) + QDEL_NULL(spark_particles) + +#undef LOW_DAMAGE_UPPER_BOUND +#undef MODERATE_DAMAGE_UPPER_BOUND + /mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers) if (LAZYACCESS(modifiers, RIGHT_CLICK)) if(body_position == STANDING_UP) @@ -401,7 +447,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real if(stat != DEAD) adjustBruteLoss(30) else - investigate_log("has been gibbed a blob.", INVESTIGATE_DEATHS) + investigate_log("has been gibbed by a blob.", INVESTIGATE_DEATHS) gib(DROP_ALL_REMAINS) return TRUE diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm index 6f8abfc7254..f41f4bd8ffc 100644 --- a/code/modules/mob/living/silicon/robot/robot_defines.dm +++ b/code/modules/mob/living/silicon/robot/robot_defines.dm @@ -57,6 +57,8 @@ // Overlay for borg eye lights var/mutable_appearance/eye_lights + ///Holds a reference to the timer taking care of blinking lights on dead cyborgs + var/eye_flash_timer = null // Overlay for borg hat var/mutable_appearance/hat_overlay @@ -115,6 +117,10 @@ var/low_power_mode = FALSE ///So they can initialize sparks whenever/N var/datum/effect_system/spark_spread/spark_system + ///Smoke particle holder for brute damage + var/obj/effect/abstract/particle_holder/smoke_particles = null + ///Spark particle holder for burn damage + var/obj/effect/abstract/particle_holder/spark_particles = null ///Jetpack-like effect. var/ionpulse = FALSE diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index bccde4f862f..b7e6bd6a8ed 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -18,7 +18,6 @@ flash_act(affect_silicon = 1) log_combat(user, src, "attacked") adjustBruteLoss(damage) - updatehealth() else playsound(loc, 'sound/weapons/slashmiss.ogg', 25, TRUE, -1) visible_message(span_danger("[user]'s swipe misses [src]!"), \ diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index 2fea2871c03..baaf1b39b3c 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -27,7 +27,6 @@ playsound(loc, attacked_sound, 25, TRUE, -1) apply_damage(harm_intent_damage) log_combat(user, src, "attacked") - updatehealth() return TRUE /mob/living/simple_animal/get_shoving_message(mob/living/shover, obj/item/weapon, shove_flags) diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index f62992a9557..96efa91f1b4 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -548,7 +548,7 @@ radial_anchor = get_turf(user.loc) //they're phased out via some module, anchor the radial on the turf so it may still display if (!isnull(anchor_override)) radial_anchor = anchor_override - var/pick = show_radial_menu(user, radial_anchor, items, custom_check = FALSE, require_near = isnull(anchor_override), tooltips = TRUE) + var/pick = show_radial_menu(user, radial_anchor, items, custom_check = FALSE, require_near = isnull(anchor_override), tooltips = TRUE, user_space = !isnull(anchor_override)) if(!pick) return var/module_reference = display_names[pick] diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 8b475ed6324..d94993c2d38 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -13,6 +13,13 @@ throw_range = 7 slot_flags = ITEM_SLOT_BELT resistance_flags = FLAMMABLE + + unique_reskin = list( + "Brown" = "clipboard", + "Black" = "clipboard_black", + "White" = "clipboard_white", + ) + /// The stored pen var/obj/item/pen/pen /// Is the pen integrated? diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index e4063d45200..c3a6af04dc6 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -5,6 +5,8 @@ name = "projectile gun" icon_state = "debug" w_class = WEIGHT_CLASS_NORMAL + pickup_sound = 'sound/items/gun_pick_up.ogg' + drop_sound = 'sound/items/gun_drop.ogg' ///sound when inserting magazine var/load_sound = 'sound/weapons/gun/general/magazine_insert_full.ogg' diff --git a/code/modules/projectiles/guns/ballistic/bows/_bow.dm b/code/modules/projectiles/guns/ballistic/bows/_bow.dm index 15c89ddb855..358e87929e2 100644 --- a/code/modules/projectiles/guns/ballistic/bows/_bow.dm +++ b/code/modules/projectiles/guns/ballistic/bows/_bow.dm @@ -27,7 +27,18 @@ /obj/item/gun/ballistic/bow/update_icon_state() . = ..() - icon_state = chambered ? "[base_icon_state]_[drawn ? "drawn" : "nocked"]" : "[base_icon_state]" + icon_state = "[base_icon_state][drawn ? "_drawn" : ""]" + +/obj/item/gun/ballistic/bow/update_overlays() + . = ..() + if(chambered) + // . += "[chambered.base_icon_state][drawn ? "_drawn" : ""]" SKYRAT EDIT REMOVAL + // SKYRAT EDIT START + var/icon_state = icon_exists(/obj/item/gun/ballistic/bow::icon, chambered.base_icon_state) ? chambered.base_icon_state : "arrow" + if(drawn) + icon_state += "_drawn" + . += icon(/obj/item/gun/ballistic/bow::icon, icon_state) + // SKYRAT EDIT END /obj/item/gun/ballistic/bow/click_alt(mob/user) if(isnull(chambered)) @@ -72,6 +83,11 @@ return FALSE return ..() //fires, removing the arrow +/obj/item/gun/ballistic/bow/postfire_empty_checks(last_shot_succeeded) + if(!chambered && !get_ammo()) + drawn = FALSE + update_appearance() + /obj/item/gun/ballistic/bow/equipped(mob/user, slot, initial) . = ..() if(slot != ITEM_SLOT_HANDS && chambered) diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm b/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm index 4ed74bc9793..4f5a01b1ebd 100644 --- a/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm +++ b/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm @@ -45,6 +45,60 @@ jostle_pain_mult = 3 rip_time = 1 SECONDS +/// sticky arrows +/obj/item/ammo_casing/arrow/sticky + name = "sticky arrow" + desc = "A sticky arrow. Not sharp-ended, but ripping it off yourself once hit would be rather difficult and painful." + icon_state = "sticky_arrow" + inhand_icon_state = "sticky_arrow" + base_icon_state = "sticky_arrow" + projectile_type = /obj/projectile/bullet/arrow/sticky + +///sticky arrow projectile +/obj/projectile/bullet/arrow/sticky + name = "sticky arrow" + desc = "Quite the sticky situation..." + icon_state = "sticky_arrow_projectile" + damage = 30 + speed = 0.75 + range = 20 + embed_type = /datum/embed_data/arrow/sticky + +/datum/embed_data/arrow/sticky + embed_chance = 99 + fall_chance = 0 + jostle_chance = 1 + ignore_throwspeed_threshold = TRUE + pain_stam_pct = 0.7 + pain_mult = 3 + jostle_pain_mult = 3 + rip_time = 8 SECONDS + +/// poison arrows +/obj/item/ammo_casing/arrow/poison + name = "poisonous arrow" + desc = "A poisonous arrow." + icon_state = "poison_arrow" + inhand_icon_state = "poison_arrow" + base_icon_state = "poison_arrow" + projectile_type = /obj/projectile/bullet/arrow/poison + +/// poison arrow projctile +/obj/projectile/bullet/arrow/poison + name = "poisonous arrow" + desc = "Better to not get hit with this!" + icon_state = "poison_arrow_projectile" + damage = 40 + embed_type = /datum/embed_data/arrow + +/obj/projectile/bullet/arrow/poison/on_hit(atom/target, blocked, pierce_hit) + . = ..() + if(!ishuman(target)) + return + + target.reagents?.add_reagent(/datum/reagent/toxin/cyanide, 8) + target.reagents?.add_reagent(/datum/reagent/toxin/staminatoxin, 1) + /// holy arrows /obj/item/ammo_casing/arrow/holy name = "holy arrow" @@ -59,22 +113,34 @@ name = "holy arrow" desc = "Here it comes, cultist scum!" icon_state = "holy_arrow_projectile" - damage = 20 //still a lot but this is roundstart gear so far less - -/datum/embed_data/holy_arrow - embed_chance = 50 - fall_chance = 2 - jostle_chance = 0 - ignore_throwspeed_threshold = TRUE - pain_stam_pct = 0.5 - pain_mult = 3 - rip_time = 1 SECONDS /obj/projectile/bullet/arrow/holy/Initialize(mapload) . = ..() //50 damage to revenants AddElement(/datum/element/bane, target_type = /mob/living/basic/revenant, damage_multiplier = 0, added_damage = 30) +/// plastic arrows +// completely dogshit quality and they break when they hit something. +/obj/item/ammo_casing/arrow/plastic + name = "plastic arrow" + desc = "The earliest mining teams within the Spinward Sector were the somewhat stout ancestors of the modern settlers. These teams \ + found themselves often unable to access the quality materials they were digging up for equipment maintenance, all being sent off-site. \ + Left with few options, and in need of a way to protect themselves in the hostile work enviroments of the Spinward, they turned \ + to the one material they had in abundance." + icon_state = "plastic_arrow" + base_icon_state = "plastic_arrow" + projectile_type = /obj/projectile/bullet/arrow/plastic + reusable = FALSE //cheap shit + +/// plastic arrow projectile +/obj/projectile/bullet/arrow/plastic + name = "plastic arrow" + desc = "If this is about to kill you, you should feel genuine shame." + damage = 5 + stamina = 50 + weak_against_armour = TRUE + icon_state = "plastic_arrow_projectile" + /// special pyre sect arrow /// in the future, this needs a special sprite, but bows don't support non-hardcoded arrow sprites /obj/item/ammo_casing/arrow/holy/blazing @@ -100,5 +166,5 @@ human_target.adjust_fire_stacks(2) human_target.ignite_mob() return - to_chat(human_target, span_danger("[src] reacts with the flames on y-")) + to_chat(human_target, span_danger("[src] reacts with the flames enveloping you! Oh shit!")) explosion(src, light_impact_range = 1, flame_range = 2) //ow diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm b/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm index 07d7cc93ce1..2492f0d4276 100644 --- a/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm +++ b/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm @@ -8,6 +8,7 @@ worn_icon_state = "harpoon_quiver" /// type of arrow the quivel should hold var/arrow_path = /obj/item/ammo_casing/arrow + var/max_slots = 40 /obj/item/storage/bag/quiver/Initialize(mapload) . = ..() @@ -17,7 +18,10 @@ atom_storage.max_total_storage = 100 atom_storage.set_holdable(/obj/item/ammo_casing/arrow) -/obj/item/storage/bag/quiver/PopulateContents() +/obj/item/storage/bag/quiver/lesser + max_slots = 10 + +/obj/item/storage/bag/quiver/full/PopulateContents() . = ..() for(var/i in 1 to 10) new arrow_path(src) @@ -29,3 +33,8 @@ inhand_icon_state = "holyquiver" worn_icon_state = "holyquiver" arrow_path = /obj/item/ammo_casing/arrow/holy + +/obj/item/storage/bag/quiver/holy/PopulateContents() + . = ..() + for(var/i in 1 to 10) + new arrow_path(src) diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_types.dm b/code/modules/projectiles/guns/ballistic/bows/bow_types.dm index b9ac1af0cca..cc6bfbb6477 100644 --- a/code/modules/projectiles/guns/ballistic/bows/bow_types.dm +++ b/code/modules/projectiles/guns/ballistic/bows/bow_types.dm @@ -4,6 +4,12 @@ name = "longbow" desc = "While pretty finely crafted, surely you can find something better to use in the current year." +/// Shortbow, made via the crafting recipe +/obj/item/gun/ballistic/bow/shortbow + name = "shortbow" + desc = "A simple homemade shortbow. Great for LARPing. Or poking out someones eye." + projectile_damage_multiplier = 0.36 + ///chaplain's divine archer bow /obj/item/gun/ballistic/bow/divine name = "divine bow" @@ -15,6 +21,7 @@ slot_flags = ITEM_SLOT_BACK obj_flags = UNIQUE_RENAME accepted_magazine_type = /obj/item/ammo_box/magazine/internal/bow/holy + //projectile_damage_multiplier = 0.4 // SKYRAT EDIT REMOVAL /obj/item/ammo_box/magazine/internal/bow/holy name = "divine bowstring" diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 6eb9849c7e1..e3b7cc44d59 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -3,6 +3,8 @@ name = "energy gun" desc = "A basic energy-based gun." icon = 'icons/obj/weapons/guns/energy.dmi' + pickup_sound = 'sound/items/gun_pick_up.ogg' + drop_sound = 'sound/items/gun_drop.ogg' /// What type of power cell this uses var/obj/item/stock_parts/power_store/cell diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 93748a33043..51adc8d68a5 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -255,11 +255,6 @@ /obj/machinery/chem_master/attack_ai_secondary(mob/user, list/modifiers) return attack_hand_secondary(user, modifiers) -/obj/machinery/chem_master/ui_assets(mob/user) - return list( - get_asset_datum(/datum/asset/spritesheet/chemmaster) - ) - /obj/machinery/chem_master/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) @@ -281,9 +276,10 @@ //add containers to this category for(var/obj/item/reagent_containers/container as anything in printable_containers[category]) category_list["containers"] += list(list( - "icon" = sanitize_css_class_name("[container]"), "ref" = REF(container), "name" = initial(container.name), + "icon" = initial(container.icon), + "icon_state" = initial(container.icon_state), "volume" = initial(container.volume), )) diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm index 8d48e3da78a..8cfb482cd66 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm @@ -784,7 +784,10 @@ Basically, we fill the time between now and 2s from now with hands based off the if(!isnull(speaker) && HAS_TRAIT(speaker, TRAIT_SIGN_LANG)) return - hearing_args[HEARING_SPANS] |= random_span + var/list/spans = hearing_args[HEARING_SPANS] + var/list/copied_spans = spans.Copy() + copied_spans |= random_span + hearing_args[HEARING_SPANS] = copied_spans /datum/reagent/inverse/sal_acid name = "Benzoic Acid" diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index c207a6e25cb..62c9dfbb05c 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -229,6 +229,8 @@ stream_range = 4 amount_per_transfer_from_this = 5 list_reagents = list(/datum/reagent/consumable/condensedcapsaicin = 50) + pickup_sound = 'sound/items/pepper_spray_pick_up.ogg' + drop_sound = 'sound/items/pepper_spray_drop.ogg' /obj/item/reagent_containers/spray/pepper/empty //for protolathe printing list_reagents = null diff --git a/code/modules/research/techweb/_techweb_node.dm b/code/modules/research/techweb/_techweb_node.dm index 9b26ca860d8..23ad6fd213d 100644 --- a/code/modules/research/techweb/_techweb_node.dm +++ b/code/modules/research/techweb/_techweb_node.dm @@ -90,8 +90,7 @@ var/list/boostlist = host.boosted_nodes[id] for(var/booster in boostlist) if(actual_costs[booster]) - var/delta = max(0, actual_costs[booster] - 250) - actual_costs[booster] -= min(boostlist[booster], delta) + actual_costs[booster] = max(actual_costs[booster] - boostlist[booster], 0) return actual_costs diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index be805ae9da8..6ec7fca37e3 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -715,13 +715,10 @@ if(!dumb_mob.compare_sentience_type(sentience_type)) // Will also return false if not a basic or simple mob, which are the only two we want anyway balloon_alert(user, "invalid creature!") return - if(isnull(potion_reason)) - balloon_alert(user, "no reason for offering set!") - return balloon_alert(user, "offering...") being_used = TRUE var/mob/chosen_one = SSpolling.poll_ghosts_for_target( - question = "[span_danger(user.name)] is offering [span_notice(dumb_mob.name)] an intelligence potion! Reason: [span_boldnotice(potion_reason)]", + question = "[span_danger(user.name)] is offering [span_notice(dumb_mob.name)] an intelligence potion![potion_reason ? " Reason: [span_boldnotice(potion_reason)]" : ""]", check_jobban = ROLE_SENTIENCE, poll_time = 20 SECONDS, checked_target = dumb_mob, diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm index e4ab654cb5e..4a7dcab80f2 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm @@ -2,7 +2,7 @@ name = "arm-mounted implant" desc = "You shouldn't see this! Adminhelp and report this as an issue on github!" zone = BODY_ZONE_R_ARM - icon_state = "implant-toolkit" + icon_state = "toolkit_generic" w_class = WEIGHT_CLASS_SMALL actions_types = list(/datum/action/item_action/organ_action/toggle) ///A ref for the arm we're taking up. Mostly for the unregister signal upon removal @@ -264,6 +264,7 @@ /obj/item/organ/internal/cyberimp/arm/toolset name = "integrated toolset implant" desc = "A stripped-down version of the engineering cyborg toolset, designed to be installed on subject's arm. Contain advanced versions of every tool." + icon_state = "toolkit_engineering" actions_types = list(/datum/action/item_action/organ_action/toggle/toolkit) items_to_create = list( /obj/item/screwdriver/cyborg, @@ -349,6 +350,7 @@ /obj/item/organ/internal/cyberimp/arm/surgery name = "surgical toolset implant" desc = "A set of surgical tools hidden behind a concealed panel on the user's arm." + icon_state = "toolkit_surgical" actions_types = list(/datum/action/item_action/organ_action/toggle/toolkit) items_to_create = list( /obj/item/retractor/augment, diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm b/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm index 046c84200d1..060499936d5 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm @@ -1,15 +1,12 @@ /obj/item/organ/internal/cyberimp/chest name = "cybernetic torso implant" desc = "Implants for the organs in your torso." - icon_state = "chest_implant" - implant_overlay = "chest_implant_overlay" zone = BODY_ZONE_CHEST /obj/item/organ/internal/cyberimp/chest/nutriment - name = "Nutriment pump implant" + name = "nutriment pump implant" desc = "This implant will synthesize and pump into your bloodstream a small amount of nutriment when you are starving." - icon_state = "chest_implant" - implant_color = "#00AA00" + icon_state = "nutriment_implant" var/hunger_threshold = NUTRITION_LEVEL_STARVING var/synthesizing = 0 var/poison_amount = 5 @@ -37,18 +34,16 @@ /obj/item/organ/internal/cyberimp/chest/nutriment/plus - name = "Nutriment pump implant PLUS" + name = "nutriment pump implant PLUS" desc = "This implant will synthesize and pump into your bloodstream a small amount of nutriment when you are hungry." - icon_state = "chest_implant" - implant_color = "#006607" + icon_state = "adv_nutriment_implant" hunger_threshold = NUTRITION_LEVEL_HUNGRY poison_amount = 10 /obj/item/organ/internal/cyberimp/chest/reviver - name = "Reviver implant" + name = "reviver implant" desc = "This implant will attempt to revive and heal you if you lose consciousness. For the faint of heart!" - icon_state = "chest_implant" - implant_color = "#AD0000" + icon_state = "reviver_implant" slot = ORGAN_SLOT_HEART_AID var/revive_cost = 0 var/reviving = FALSE @@ -164,7 +159,6 @@ slot = ORGAN_SLOT_THRUSTERS icon_state = "imp_jetpack" base_icon_state = "imp_jetpack" - implant_overlay = null implant_color = null actions_types = list(/datum/action/item_action/organ_action/toggle) w_class = WEIGHT_CLASS_NORMAL @@ -265,7 +259,7 @@ name = "\improper Herculean gravitronic spinal implant" desc = "This gravitronic spinal interface is able to improve the athletics of a user, allowing them greater physical ability. \ Contains a slot which can be upgraded with a gravity anomaly core, improving its performance." - implant_color = "#15704c" + icon_state = "herculean_implant" slot = ORGAN_SLOT_SPINE /// How much faster does the spinal implant improve our lifting speed, workout ability, reducing falling damage and improving climbing and standing speed var/athletics_boost_multiplier = 0.8 @@ -315,5 +309,7 @@ name = "\improper Atlas gravitonic spinal implant" desc = "This gravitronic spinal interface is able to improve the athletics of a user, allowing them greater physical ability. \ This one has been improved through the installation of a gravity anomaly core, allowing for personal gravity manipulation." + icon_state = "herculean_implant_core" + update_appearance() qdel(tool) return ITEM_INTERACT_SUCCESS diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm b/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm index 401e951a853..d4c4b57d75f 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm @@ -2,7 +2,6 @@ name = "cybernetic eye implant" desc = "Implants for your eyes." icon_state = "eye_implant" - implant_overlay = "eye_implant_overlay" slot = ORGAN_SLOT_EYES zone = BODY_ZONE_PRECISE_EYES w_class = WEIGHT_CLASS_TINY @@ -41,21 +40,25 @@ toggled_on = FALSE /obj/item/organ/internal/cyberimp/eyes/hud/medical - name = "Medical HUD implant" + name = "medical HUD implant" desc = "These cybernetic eye implants will display a medical HUD over everything you see." + icon_state = "eye_implant_medical" HUD_traits = list(TRAIT_MEDICAL_HUD) /obj/item/organ/internal/cyberimp/eyes/hud/security - name = "Security HUD implant" + name = "security HUD implant" desc = "These cybernetic eye implants will display a security HUD over everything you see." + icon_state = "eye_implant_security" HUD_traits = list(TRAIT_SECURITY_HUD) /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic - name = "Diagnostic HUD implant" + name = "diagnostic HUD implant" desc = "These cybernetic eye implants will display a diagnostic HUD over everything you see." + icon_state = "eye_implant_diagnostic" HUD_traits = list(TRAIT_DIAGNOSTIC_HUD, TRAIT_BOT_PATH_HUD) /obj/item/organ/internal/cyberimp/eyes/hud/security/syndicate - name = "Contraband Security HUD Implant" + name = "contraband security HUD implant" desc = "A Cybersun Industries brand Security HUD Implant. These illicit cybernetic eye implants will display a security HUD over everything you see." + icon_state = "eye_implant_syndicate" organ_flags = ORGAN_ROBOTIC | ORGAN_HIDDEN diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm index f36c6cfe838..f71e29631b3 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm @@ -22,8 +22,6 @@ /obj/item/organ/internal/cyberimp/brain name = "cybernetic brain implant" desc = "Injectors of extra sub-routines for the brain." - icon_state = "brain_implant" - implant_overlay = "brain_implant_overlay" zone = BODY_ZONE_HEAD w_class = WEIGHT_CLASS_TINY @@ -39,9 +37,9 @@ /obj/item/organ/internal/cyberimp/brain/anti_drop name = "anti-drop implant" desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." + icon_state = "brain_implant_antidrop" var/active = FALSE var/list/stored_items = list() - implant_color = "#DE7E00" slot = ORGAN_SLOT_BRAIN_ANTIDROP actions_types = list(/datum/action/item_action/organ_action/toggle) @@ -99,9 +97,9 @@ stored_items -= source /obj/item/organ/internal/cyberimp/brain/anti_stun - name = "CNS Rebooter implant" + name = "CNS rebooter implant" desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned." - implant_color = COLOR_YELLOW + icon_state = "brain_implant_rebooter" slot = ORGAN_SLOT_BRAIN_ANTISTUN var/static/list/signalCache = list( diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm index 5dcf070ccd2..ff4715edd87 100644 --- a/code/modules/surgery/revival.dm +++ b/code/modules/surgery/revival.dm @@ -92,8 +92,7 @@ span_notice("[user] send a powerful shock to [target]'s brain with [tool]..."), ) target.grab_ghost() - target.adjustOxyLoss(-50, 0) - target.updatehealth() + target.adjustOxyLoss(-50) if(iscarbon(target)) var/mob/living/carbon/carbon_target = target carbon_target.set_heartattack(FALSE) diff --git a/code/modules/tgui_input/text.dm b/code/modules/tgui_input/text.dm index 4b3e59a6028..806696dcf4f 100644 --- a/code/modules/tgui_input/text.dm +++ b/code/modules/tgui_input/text.dm @@ -140,9 +140,9 @@ switch(action) if("submit") if(max_length) - if(length(params["entry"]) > max_length) + if(length_char(params["entry"]) > max_length) CRASH("[usr] typed a text string longer than the max length") - if(encode && (length(html_encode(params["entry"])) > max_length)) + if(encode && (length_char(html_encode(params["entry"])) > max_length)) to_chat(usr, span_notice("Your message was clipped due to special character usage.")) set_entry(params["entry"]) closed = TRUE diff --git a/code/modules/transport/elevator/elev_music_zone.dm b/code/modules/transport/elevator/elev_music_zone.dm index 8379e742cae..f5b3de8a67c 100644 --- a/code/modules/transport/elevator/elev_music_zone.dm +++ b/code/modules/transport/elevator/elev_music_zone.dm @@ -83,6 +83,8 @@ GLOBAL_LIST_EMPTY(elevator_music) /datum/proximity_monitor/advanced/elevator_music_area/field_turf_uncrossed(mob/exited, turf/old_location, turf/new_location) if (!(exited in tracked_mobs)) return + if ((new_location in field_turfs) || (new_location in edge_turfs)) + return qdel(tracked_mobs[exited]) tracked_mobs -= exited UnregisterSignal(exited, COMSIG_QDELETING) diff --git a/code/modules/unit_tests/fish_unit_tests.dm b/code/modules/unit_tests/fish_unit_tests.dm index 1db534c5e07..5cb582ca969 100644 --- a/code/modules/unit_tests/fish_unit_tests.dm +++ b/code/modules/unit_tests/fish_unit_tests.dm @@ -226,10 +226,11 @@ /datum/unit_test/raise_a_chasm_crab/Run() var/obj/structure/aquarium/crab/aquarium = allocate(/obj/structure/aquarium/crab) - var/mob/living/basic/mining/lobstrosity/juvenile/lobster = aquarium.crabbie.grow_up(1) //one stands for a second - TEST_ASSERT(lobster, "The test aquarium's chasm crab didn't grow up into a lobstrosity.[aquarium.crabbie ? " The aquarium crab is still here and at about [aquarium.crabbie.maturation]% maturation" : ""]") - allocated |= lobster //make sure it's allocated and thus properly deleted when the test is over + SEND_SIGNAL(aquarium.crabbie, COMSIG_FISH_LIFE, 1) //give the fish growth component a small push. + var/mob/living/basic/mining/lobstrosity/juvenile/lobster = locate() in aquarium.loc TEST_ASSERT_EQUAL(lobster.loc, get_turf(aquarium), "The lobstrosity didn't spawn on the aquarium's turf") + TEST_ASSERT(QDELETED(aquarium.crabbie), "The test aquarium's chasm crab didn't delete itself.") + allocated |= lobster //make sure it's allocated and thus properly deleted when the test is over //While ideally impossible to have all traits because of incompatible ones, I want to be sure they don't error out. for(var/trait_type in GLOB.fish_traits) var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] diff --git a/code/modules/uplink/uplink_items/bundle.dm b/code/modules/uplink/uplink_items/bundle.dm index dae6166d49c..b6cdc2fd3d6 100644 --- a/code/modules/uplink/uplink_items/bundle.dm +++ b/code/modules/uplink/uplink_items/bundle.dm @@ -40,18 +40,7 @@ // Don't add telecrystals to the purchase_log since // it's just used to buy more items (including itself!) purchase_log_vis = FALSE - -/datum/uplink_item/bundles_tc/telecrystal/five - name = "5 Raw Telecrystals" - desc = "Five telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count." - item = /obj/item/stack/telecrystal/five - cost = 5 - -/datum/uplink_item/bundles_tc/telecrystal/twenty - name = "20 Raw Telecrystals" - desc = "Twenty telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count." - item = /obj/item/stack/telecrystal/twenty - cost = 20 + purchasable_from = NONE /datum/uplink_item/bundles_tc/bundle_a name = "Syndi-kit Tactical" diff --git a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm index cd36624a34c..054abba77e8 100644 --- a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm @@ -122,7 +122,6 @@ if(isnull(victim)) //get gibbed stoopid return ..() victim.adjustOxyLoss(round(clamp_damage/2)) - victim.updatehealth() victim.visible_message(span_danger("[chassis] squeezes [victim]!"), \ span_userdanger("[chassis] squeezes you!"),\ span_hear("You hear something crack.")) diff --git a/code/modules/vehicles/mecha/mech_fabricator.dm b/code/modules/vehicles/mecha/mech_fabricator.dm index c2d37ee6e83..b4c29220254 100644 --- a/code/modules/vehicles/mecha/mech_fabricator.dm +++ b/code/modules/vehicles/mecha/mech_fabricator.dm @@ -149,8 +149,9 @@ /obj/machinery/mecha_part_fabricator/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) return FALSE - if(user.job != JOB_ROBOTICIST) - to_chat(user, span_warning("You clicking and typing but don’t understand what to do with it")) + if(!HAS_TRAIT(user, TRAIT_KNOW_ROBO_WIRES)) + to_chat(user, span_warning("You're unsure about [emag_card ? "where to swipe [emag_card] over" : "how to override"] [src] for any effect. Maybe if you had more knowledge of robotics...")) + return FALSE obj_flags |= EMAGGED for(var/found_illegal_mech_nods in SSresearch.techweb_nodes) @@ -179,6 +180,9 @@ if(design.build_type & MECHFAB) cached_designs |= design + for(var/datum/design/illegal_disign in illegal_local_designs) + cached_designs |= illegal_disign + var/design_delta = cached_designs.len - previous_design_count if(design_delta > 0) diff --git a/code/modules/vehicles/mecha/mech_melee_attack.dm b/code/modules/vehicles/mecha/mech_melee_attack.dm index 6fe64c879fa..f37d092b83f 100644 --- a/code/modules/vehicles/mecha/mech_melee_attack.dm +++ b/code/modules/vehicles/mecha/mech_melee_attack.dm @@ -72,6 +72,22 @@ return return ..() +/obj/vehicle/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) + if(!user.combat_mode) + return FALSE + + mecha_attacker.do_attack_animation(src) + switch(mecha_attacker.damtype) + if(BRUTE) + playsound(src, 'sound/weapons/punch4.ogg', 50, TRUE) + if(BURN) + playsound(src, 'sound/items/welder.ogg', 50, TRUE) + else + return + mecha_attacker.visible_message(span_danger("[mecha_attacker] hits [src]!"), span_danger("You hit [src]!"), null, COMBAT_MESSAGE_RANGE) + ..() + return take_damage(mecha_attacker.force, mecha_attacker.damtype, "melee", FALSE, get_dir(src, mecha_attacker)) + /mob/living/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) if(istype(user) && !user.combat_mode) step_away(src, mecha_attacker) diff --git a/code/modules/vehicles/mecha/mecha_ai_interaction.dm b/code/modules/vehicles/mecha/mecha_ai_interaction.dm index 3a681cac97d..cec3d867e2b 100644 --- a/code/modules/vehicles/mecha/mecha_ai_interaction.dm +++ b/code/modules/vehicles/mecha/mecha_ai_interaction.dm @@ -12,7 +12,7 @@ to_chat(user, "[span_userdanger("ASSUME DIRECT CONTROL?")]
") return examine(user) - if(length(return_drivers()) > 0) + if(length(return_occupants()) >= max_occupants) to_chat(user, span_warning("This exosuit has a pilot and cannot be controlled.")) return var/can_control_mech = FALSE @@ -103,6 +103,7 @@ AI.controlled_equipment = src AI.remote_control = src AI.ShutOffDoomsdayDevice() + add_occupant(AI) to_chat(AI, AI.can_dominate_mechs ? span_greenannounce("Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!") :\ span_notice("You have been uploaded to a mech's onboard computer.")) to_chat(AI, "Use Middle-Mouse or the action button in your HUD to toggle equipment safety. Clicks with safety enabled will pass AI commands.") diff --git a/code/modules/vending/subtype.dm b/code/modules/vending/subtype.dm index 9b4f212224e..3a1a04ff6e7 100644 --- a/code/modules/vending/subtype.dm +++ b/code/modules/vending/subtype.dm @@ -10,6 +10,7 @@ circuit = null product_slogans = "Spawn \" too annoying? Too lazy to open game panel? This one's for you!;Subtype vendor, for all your debugging woes!" default_price = 0 + onstation = FALSE /// Spawns coders by default var/type_to_vend = /obj/item/food/grown/citrus diff --git a/html/changelogs/AutoChangeLog-pr-29238.yml b/html/changelogs/AutoChangeLog-pr-29238.yml new file mode 100644 index 00000000000..4d3e207b344 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-29238.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "Smartfridges properly dispense `\\Improper` items" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-29239.yml b/html/changelogs/AutoChangeLog-pr-29239.yml new file mode 100644 index 00000000000..313a0eb2916 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-29239.yml @@ -0,0 +1,4 @@ +author: "xXPawnStarrXx" +delete-after: True +changes: + - bugfix: "fixed gaian soilbins losing their autotend function by making it togglable." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-29240.yml b/html/changelogs/AutoChangeLog-pr-29240.yml new file mode 100644 index 00000000000..b61ee0fd1ab --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-29240.yml @@ -0,0 +1,4 @@ +author: "Majkl-J" +delete-after: True +changes: + - bugfix: "Prescription huds work again" \ No newline at end of file diff --git a/html/changelogs/archive/2024-08.yml b/html/changelogs/archive/2024-08.yml index 0099a426511..9e6ae4da4bc 100644 --- a/html/changelogs/archive/2024-08.yml +++ b/html/changelogs/archive/2024-08.yml @@ -94,3 +94,172 @@ - sound: leather, skins and cardboard have their own sound now grungussuss and Kayozz: - sound: more maintenance ambience has been added +2024-08-02: + SkyratBot: + - bugfix: Flashdarks now broduce darkness upon toggling + StrangeWeirdKitten: + - bugfix: Emote sounds will no longer play twice + yooriss, Erol509, Majkl-J: + - rscadd: The Echolocation quirk is now available with several levels of customization, + granting 5 tiles of pulsing view distance and significantly enhanced hearing + at the downside of being blind when deafened and twice as vulnerable to ear + damage. + - code_imp: Moves quirks to a standalone folder +2024-08-05: + Bisar: + - qol: Machines check their parts during initialization now; this will usually apply + in cases such as a machine in a prefab having been varedited to be upgraded. + - code_imp: All machines check their parts during initialization. + LT3: + - bugfix: Bouncer now shows up as part of the service department + - bugfix: Synths have their own version of Blessed Lobotomy + Majkl-J: + - bugfix: Fixed harpy wing subtypes incorrectly fetching their icons + ReturnToZender (code): + - bugfix: Runechat now properly has its saturation capped at 90%. + Rhials: + - qol: Sentience potions can now be used without a provided summon reason. + SkyratBot: + - admin: Adds some missing traits to the mob trait list in VV + - bugfix: Silicons and simplemobs can also hear radio chatter now + - bugfix: Emergency climbing hooks now shouldn't spawn on non multi-z stations. + - bugfix: rod sounds will now vary in pitch + - qol: NODE drones summoned to tap a vent within ore vents now display a green status + light to show how much longer they need the vent defended for. + - qol: Skills are passed down to bitrunning avatars and then back to the original + body. + - bugfix: Fixed NT Frontier discounts not applying + - bugfix: Justice design no longer disappears + - bugfix: Mechs can attack other mechs in melee + - bugfix: birdshot engineering feedback has been applied + - image: All implants have received a fresh coat of paint + - bugfix: Putting people you're fireman carrying into contractor pods no longer + sends both of you to zelda's shadow realm + - bugfix: Shoving someone onto a table now causes them to become vulnerable to being + stunned. + - rscadd: Fletching starter kit! Make your own bow, shoot your friends in an unfortunate + workplace accident. Replace all those holy arrows you lost. + - bugfix: Bows now properly undraw once they have fired an arrow. + - code_imp: Bows now utilize overlays in order to display loaded arrows. Unique + overlays per arrow. + - qol: You no longer goofily swap with others trying to move in the same direction + as you if you're not faster than them + - code_imp: Moved mobswap check logic into a separate proc and made it more readable + - bugfix: Lizards no longer die from cold on icebox despite wearing insulation + - image: Made chem master container icons not blurry + - bugfix: Stop clientless lobstrosities from fishing other lobstrosities, which + in turn can fish other lobstrosities and so on. + - balance: Stop clientless lobstrosities from fishing the lavaland fishing spot + chest. + - qol: new uplink UI + - qol: made it possible to buy a custom amount of TC, instead of bundles with fixed + amounts + - rscadd: All the melons are now sliceable, and have inhands, instead of just watermelon + and holymelon respectively. + - rscadd: You can now hollow out melons of all kinds with a spoon to make helmets + or chestplates, based on the potency! If you are unlucky, you can tie up three + helmets into a chestplate with durathread using the crafting menu. + - rscadd: You can now make a bo staff out of bamboo and steelcap logs. + - rscadd: You can now make a moonflower buckler out of moonflowers and steelcap + logs. + - rscadd: You can also hollow out chantarelle to make mock-up wizard hat. + - rscadd: Parsnips, as mutation of carrots, become equaly able to be sharpaned, + turning into shivs, or with potency and luck, sabres. + - rscadd: You can now craft a durathread robe, and customize it into different variants + using specific plants in crafting menu. + - rscadd: Carrots gain a new possible mutation; cahn'root, brewable into root beer + and sharpanable into shivs or daggers! + - rscadd: Rice hat, made from bamboo, now has an alternative style, allowing you + to wear it in reverse and be much cooler. + - rscadd: Two new arrow variants appear in the crafting menu; sticky and poisonous + ones! If you want to make arrows at all though, remember to order bow-maker's + crate at cargo. + - bugfix: Fixed advanced pods showing up as cultist pods + - admin: Subtype vendor no longer requries an ID + - bugfix: wawastation pharmacy now has a hand labeller + - rscadd: RD can emag mech fabricator(like roboticist). + - qol: Callouts and MODsuit quick module pickers now track user + - bugfix: Existing gas flow meters have been recalled and replaced due to a faulty + screen connection, and once again convey pressure and temperature + - rscadd: Adds a bronze dimensional theme + - bugfix: AI mech control beacons and malf AI dominate mech work again. + Tattle: + - qol: dead cyborgs now blink yellow lights + - qol: damaged cyborgs have smoke particles when they've taken brute damage, and + sparks for burn + Varoxus: + - rscadd: increased maximum penis and testicle size. + jupyterkat: + - bugfix: fixed vibrators turning invisible on use + - bugfix: fixed toys not applying mood events on certain traits + - bugfix: fixed grammar on toys + - bugfix: toys now show that they are customizable and how to do it when available + - bugfix: 'toys interactions panel is no longer hidden under a scroll, and is now + a separate component + + :cl:' + xXPawnStarrXx: + - bugfix: fixed bounty pads accepting synthetic organs, which are basically cybernetic + tier 1's. +2024-08-06: + NullDagaf: + - code_imp: simple_farms now respect your skill level + - refactor: refactored simple_farm code + SkyratBot: + - bugfix: Bitrunning crate capture zones can no longer be destroyed + - image: added and updated belt/suit/mask storage sprites for several knives missing + them +2024-08-07: + HometownFunky: + - image: added shading to valeborg sprites and updated the colors for the vale jani/medical + models. + Leathergnome: + - rscadd: Wallet to the Loadout menu in the accesory tab + MrMelbert, SmArtKar: + - bugfix: Holding someone at gunpoint no longer makes all shots count as point blank + Odairu: + - rscadd: adds pixel shifting items, and pixel tilting mobs + - code_imp: optimizes pixelshifting + SkyratBot: + - image: Resprited teleporter beacons + - bugfix: Fixes the echolocation screen overlay not appearing with default arguments + due to using the wrong icon state + - bugfix: Fixed handyman assistants spawning without a PDA + - bugfix: Plasmamen helmets now display their smiles + can be painted with spraycans + - admin: fix hard restart option + - bugfix: Fixed an infinite TC glitch dupe + - bugfix: Elevator music no longer restarts when you take a step + - bugfix: Rice hat no longer disappears upon being toggled and can be raised back + up. Toggling sprites is now done by alt-clicking + - code_imp: Removed multiple cases of unnecessary updatehealth + - bugfix: Tinacusiate no longer changes hearing spans for every single person in-game + - bugfix: Grass sheath now holds parsnip sabres like its supposed to + - spellcheck: Fixed up parsnip sabre description grammar + - image: Ash Blade has received a new sprite. + - bugfix: Fixed a runtime error after draining a heretic influence. + - rscadd: Added tadpoles, which can be scooped from puddles with right-click. Functionally + they're like most fish, which require an aquarium to survive, and also need + to be fed fairly frequently, however they quickly become frogs after about 3 + minutes of care. + - rscadd: Every station now has a couple puddles. One at the public garden and the + other in prison. + - qol: Changed the name of an aquarium UI button from "Reproduction Prevention" + to "Reproduction and Growth", as it controls both fish breeding and growth. + - bugfix: juvenile lobstrosities will now look for food + - qol: Renamed seed packs to have the plant name at the beginning + - bugfix: Bamboo staves can now be wielded + - bugfix: Bostaff no longer disappears forever when wielded + - rscdel: Remove narsie and ratvar plushies from loadout +2024-08-08: + LT3: + - bugfix: Fixed players being incorrectly immune to certain virus severities + Majkl-J: + - bugfix: Fixes guest accounts not having keybinds and getting constant runtimes + Odairu: + - qol: SAD now applies quirks + - rscadd: Adds a name pref for interdyne and lone infiltrators + Rhials: + - sound: Zipties no longer make handcuff noises when picked up or dropped. + SkyratBot: + - image: Updated clipboard sprite, adds white and black clipboard skins for med/sci + and security diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index 8f0b121cb7f..1b92bfabd7b 100644 Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index a2d318adfb7..724a29de21b 100644 Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ diff --git a/icons/mob/clothing/belt_mirror.dmi b/icons/mob/clothing/belt_mirror.dmi index 9594f622773..0507a030194 100644 Binary files a/icons/mob/clothing/belt_mirror.dmi and b/icons/mob/clothing/belt_mirror.dmi differ diff --git a/icons/mob/clothing/head/costume.dmi b/icons/mob/clothing/head/costume.dmi index 1de2281271f..09c11ca0acb 100644 Binary files a/icons/mob/clothing/head/costume.dmi and b/icons/mob/clothing/head/costume.dmi differ diff --git a/icons/mob/clothing/head/helmet.dmi b/icons/mob/clothing/head/helmet.dmi index 116f0256a62..579f4c53f0f 100644 Binary files a/icons/mob/clothing/head/helmet.dmi and b/icons/mob/clothing/head/helmet.dmi differ diff --git a/icons/mob/clothing/head/wizard.dmi b/icons/mob/clothing/head/wizard.dmi index 785ed63ca5b..cafde2136f7 100644 Binary files a/icons/mob/clothing/head/wizard.dmi and b/icons/mob/clothing/head/wizard.dmi differ diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi index 5f577c7e255..ac40c153dd7 100644 Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ diff --git a/icons/mob/clothing/suits/armor.dmi b/icons/mob/clothing/suits/armor.dmi index eb7a525e4b7..ea80204c2cd 100644 Binary files a/icons/mob/clothing/suits/armor.dmi and b/icons/mob/clothing/suits/armor.dmi differ diff --git a/icons/mob/clothing/suits/wizard.dmi b/icons/mob/clothing/suits/wizard.dmi index 454bc1f3cf1..9e8c8224130 100644 Binary files a/icons/mob/clothing/suits/wizard.dmi and b/icons/mob/clothing/suits/wizard.dmi differ diff --git a/icons/mob/inhands/64x64_lefthand.dmi b/icons/mob/inhands/64x64_lefthand.dmi index d15a47206f9..14f35aa9ef0 100644 Binary files a/icons/mob/inhands/64x64_lefthand.dmi and b/icons/mob/inhands/64x64_lefthand.dmi differ diff --git a/icons/mob/inhands/64x64_righthand.dmi b/icons/mob/inhands/64x64_righthand.dmi index 88ad954734b..102417e36f5 100644 Binary files a/icons/mob/inhands/64x64_righthand.dmi and b/icons/mob/inhands/64x64_righthand.dmi differ diff --git a/icons/mob/inhands/clothing/hats_lefthand.dmi b/icons/mob/inhands/clothing/hats_lefthand.dmi index 4fa05fa6cd6..6ad1f8886c9 100644 Binary files a/icons/mob/inhands/clothing/hats_lefthand.dmi and b/icons/mob/inhands/clothing/hats_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing/hats_righthand.dmi b/icons/mob/inhands/clothing/hats_righthand.dmi index dfb0b71ef4b..3aba15568ef 100644 Binary files a/icons/mob/inhands/clothing/hats_righthand.dmi and b/icons/mob/inhands/clothing/hats_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/belt_lefthand.dmi b/icons/mob/inhands/equipment/belt_lefthand.dmi index 9f306a2777d..d5c4f7c4424 100644 Binary files a/icons/mob/inhands/equipment/belt_lefthand.dmi and b/icons/mob/inhands/equipment/belt_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/belt_righthand.dmi b/icons/mob/inhands/equipment/belt_righthand.dmi index 7b519f7cf69..0e0c7b817ee 100644 Binary files a/icons/mob/inhands/equipment/belt_righthand.dmi and b/icons/mob/inhands/equipment/belt_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/shields_lefthand.dmi b/icons/mob/inhands/equipment/shields_lefthand.dmi index 1aa27021b9e..a19d5f46245 100644 Binary files a/icons/mob/inhands/equipment/shields_lefthand.dmi and b/icons/mob/inhands/equipment/shields_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/shields_righthand.dmi b/icons/mob/inhands/equipment/shields_righthand.dmi index 4227ba00792..b4d080345c5 100644 Binary files a/icons/mob/inhands/equipment/shields_righthand.dmi and b/icons/mob/inhands/equipment/shields_righthand.dmi differ diff --git a/icons/mob/inhands/items/food_lefthand.dmi b/icons/mob/inhands/items/food_lefthand.dmi index 8e2b19c4dd4..5dabacf53db 100644 Binary files a/icons/mob/inhands/items/food_lefthand.dmi and b/icons/mob/inhands/items/food_lefthand.dmi differ diff --git a/icons/mob/inhands/items/food_righthand.dmi b/icons/mob/inhands/items/food_righthand.dmi index 12063ad38a8..7cd6569508c 100644 Binary files a/icons/mob/inhands/items/food_righthand.dmi and b/icons/mob/inhands/items/food_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 86bd5020f4f..ebcfea59675 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index a6de8b97464..b8fd65ec072 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/staves_lefthand.dmi b/icons/mob/inhands/weapons/staves_lefthand.dmi index 5e4eb552f2a..917b46ae893 100644 Binary files a/icons/mob/inhands/weapons/staves_lefthand.dmi and b/icons/mob/inhands/weapons/staves_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/staves_righthand.dmi b/icons/mob/inhands/weapons/staves_righthand.dmi index 9de32d8cd95..da1765fe800 100644 Binary files a/icons/mob/inhands/weapons/staves_righthand.dmi and b/icons/mob/inhands/weapons/staves_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi index b9552c754c0..82c98f057c0 100644 Binary files a/icons/mob/inhands/weapons/swords_lefthand.dmi and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi index f132e997658..3f6e471e83e 100644 Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ diff --git a/icons/mob/silicon/robots.dmi b/icons/mob/silicon/robots.dmi index 5c79a0f95e3..c2780ce26ab 100644 Binary files a/icons/mob/silicon/robots.dmi and b/icons/mob/silicon/robots.dmi differ diff --git a/icons/mob/simple/corgi_head.dmi b/icons/mob/simple/corgi_head.dmi index 2e14a3ed0bb..c07f1227a3d 100644 Binary files a/icons/mob/simple/corgi_head.dmi and b/icons/mob/simple/corgi_head.dmi differ diff --git a/icons/obj/aquarium/fish.dmi b/icons/obj/aquarium/fish.dmi index ab282e1681b..638c8300f30 100644 Binary files a/icons/obj/aquarium/fish.dmi and b/icons/obj/aquarium/fish.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 5ccdf2c186f..14ed534744f 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/head/helmet.dmi b/icons/obj/clothing/head/helmet.dmi index fe52d505e43..cc54b2bf929 100644 Binary files a/icons/obj/clothing/head/helmet.dmi and b/icons/obj/clothing/head/helmet.dmi differ diff --git a/icons/obj/clothing/head/wizard.dmi b/icons/obj/clothing/head/wizard.dmi index 29595f02fc2..82ea73b68ba 100644 Binary files a/icons/obj/clothing/head/wizard.dmi and b/icons/obj/clothing/head/wizard.dmi differ diff --git a/icons/obj/clothing/suits/armor.dmi b/icons/obj/clothing/suits/armor.dmi index 0484cf060d0..b1763f5453f 100644 Binary files a/icons/obj/clothing/suits/armor.dmi and b/icons/obj/clothing/suits/armor.dmi differ diff --git a/icons/obj/clothing/suits/wizard.dmi b/icons/obj/clothing/suits/wizard.dmi index fcfa748d3b3..94fc99b01b4 100644 Binary files a/icons/obj/clothing/suits/wizard.dmi and b/icons/obj/clothing/suits/wizard.dmi differ diff --git a/icons/obj/devices/tracker.dmi b/icons/obj/devices/tracker.dmi index 39be63ef4de..16190482573 100644 Binary files a/icons/obj/devices/tracker.dmi and b/icons/obj/devices/tracker.dmi differ diff --git a/icons/obj/medical/organs/organs.dmi b/icons/obj/medical/organs/organs.dmi index fd1f5af2dde..a9366894d7b 100644 Binary files a/icons/obj/medical/organs/organs.dmi and b/icons/obj/medical/organs/organs.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index 1f6393a8c51..991762dba3d 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/icons/obj/pipes_n_cables/meter.dmi b/icons/obj/pipes_n_cables/meter.dmi index 0535fda8010..fa0d5e3bf4d 100644 Binary files a/icons/obj/pipes_n_cables/meter.dmi and b/icons/obj/pipes_n_cables/meter.dmi differ diff --git a/icons/obj/service/bureaucracy.dmi b/icons/obj/service/bureaucracy.dmi index b400b7aee8b..f52379a72b3 100644 Binary files a/icons/obj/service/bureaucracy.dmi and b/icons/obj/service/bureaucracy.dmi differ diff --git a/icons/obj/service/hydroponics/growing_vegetables.dmi b/icons/obj/service/hydroponics/growing_vegetables.dmi index 30f02e862e0..37ddd825a82 100644 Binary files a/icons/obj/service/hydroponics/growing_vegetables.dmi and b/icons/obj/service/hydroponics/growing_vegetables.dmi differ diff --git a/icons/obj/service/hydroponics/harvest.dmi b/icons/obj/service/hydroponics/harvest.dmi index b15a34105de..dd3cd5865de 100644 Binary files a/icons/obj/service/hydroponics/harvest.dmi and b/icons/obj/service/hydroponics/harvest.dmi differ diff --git a/icons/obj/service/hydroponics/seeds.dmi b/icons/obj/service/hydroponics/seeds.dmi index 4de1a757e1f..c18c361b0ec 100644 Binary files a/icons/obj/service/hydroponics/seeds.dmi and b/icons/obj/service/hydroponics/seeds.dmi differ diff --git a/icons/obj/toys/dice.dmi b/icons/obj/toys/dice.dmi index d41e503242d..26cf08af5b9 100644 Binary files a/icons/obj/toys/dice.dmi and b/icons/obj/toys/dice.dmi differ diff --git a/icons/obj/weapons/bows/arrows.dmi b/icons/obj/weapons/bows/arrows.dmi index 4453d4ca5f2..a6d7678e2f0 100644 Binary files a/icons/obj/weapons/bows/arrows.dmi and b/icons/obj/weapons/bows/arrows.dmi differ diff --git a/icons/obj/weapons/bows/bows.dmi b/icons/obj/weapons/bows/bows.dmi index 81b2fc48220..5e2dda9cef6 100644 Binary files a/icons/obj/weapons/bows/bows.dmi and b/icons/obj/weapons/bows/bows.dmi differ diff --git a/icons/obj/weapons/khopesh.dmi b/icons/obj/weapons/khopesh.dmi index 3c4ba40b34a..6f4a040f6a4 100644 Binary files a/icons/obj/weapons/khopesh.dmi and b/icons/obj/weapons/khopesh.dmi differ diff --git a/icons/obj/weapons/shields.dmi b/icons/obj/weapons/shields.dmi index 99e9b06aa40..eec85e9bea1 100644 Binary files a/icons/obj/weapons/shields.dmi and b/icons/obj/weapons/shields.dmi differ diff --git a/icons/obj/weapons/stabby.dmi b/icons/obj/weapons/stabby.dmi index 24d4e0aef31..be125b5f31d 100644 Binary files a/icons/obj/weapons/stabby.dmi and b/icons/obj/weapons/stabby.dmi differ diff --git a/icons/obj/weapons/staff.dmi b/icons/obj/weapons/staff.dmi index 2d1460cf7e9..45c20ae17e5 100644 Binary files a/icons/obj/weapons/staff.dmi and b/icons/obj/weapons/staff.dmi differ diff --git a/icons/obj/weapons/sword.dmi b/icons/obj/weapons/sword.dmi index d9a443cfc26..9464c7b4745 100644 Binary files a/icons/obj/weapons/sword.dmi and b/icons/obj/weapons/sword.dmi differ diff --git a/modular_skyrat/master_files/code/modules/cargo/bounties/medical.dm b/modular_skyrat/master_files/code/modules/cargo/bounties/medical.dm index e1b032bbc33..4ef9b0d1620 100644 --- a/modular_skyrat/master_files/code/modules/cargo/bounties/medical.dm +++ b/modular_skyrat/master_files/code/modules/cargo/bounties/medical.dm @@ -1,2 +1,28 @@ /datum/bounty/item/medical/tongue - description = "A recent attack by Mime extremists has left staff at Station 23 speechless. Ship some spare tongues. We'll accept cybernetic variants if need be." \ No newline at end of file + description = "A recent attack by Mime extremists has left staff at Station 23 speechless. Ship some spare tongues. We'll accept cybernetic variants if need be." + wanted_types = list(/obj/item/organ/internal/tongue/synth = FALSE,) + +/datum/bounty/item/medical/heart + wanted_types = list( + /obj/item/organ/internal/heart/synth = FALSE, + ) + +/datum/bounty/item/medical/lung + wanted_types = list( + /obj/item/organ/internal/lungs/synth = FALSE, + ) + +/datum/bounty/item/medical/ears + wanted_types = list( + /obj/item/organ/internal/ears/synth = FALSE, + ) + +/datum/bounty/item/medical/liver + wanted_types = list( + /obj/item/organ/internal/liver/synth = FALSE, + ) + +/datum/bounty/item/medical/eye + wanted_types = list( + /obj/item/organ/internal/eyes/synth = FALSE, + ) diff --git a/modular_skyrat/master_files/code/modules/client/preferences/genitals.dm b/modular_skyrat/master_files/code/modules/client/preferences/genitals.dm index 9f7926b9795..8c89617fa16 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/genitals.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/genitals.dm @@ -199,9 +199,24 @@ var/part_enabled = is_factual_sprite_accessory(relevant_mutant_bodypart, preferences.read_preference(/datum/preference/choiced/genital/penis)) return erp_allowed && part_enabled && (passed_initial_check || allowed) -/datum/preference/numeric/penis_length/apply_to_human(mob/living/carbon/human/target, value) +/// The difference between the absolute max length and the length for normal sized mobs +#define PENIS_LENGTH_ABOVE_NORMAL PENIS_MAX_LENGTH - PENIS_MAX_LENGTH_NORMAL_SIZED + +/datum/preference/numeric/penis_length/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) + // Adjust allowed size based on character size + var/body_size = preferences?.read_preference(/datum/preference/numeric/body_size) || BODY_SIZE_NORMAL + var/has_oversized_quirk = preferences?.all_quirks.Find(/datum/quirk/oversized::name) + // Clamp this for normal sized characters. Max allowed size is proportional to the mob's body_size, rounded up. + if(!has_oversized_quirk) + var/adjusted_size = PENIS_MAX_LENGTH_NORMAL_SIZED + if(body_size > 1) + adjusted_size = ceil(round(PENIS_MAX_LENGTH_NORMAL_SIZED, step) + ((((body_size - round(1, step)) * round(2, step))) * round(PENIS_LENGTH_ABOVE_NORMAL, step))) // floating point inaccuracy fun + if(value > adjusted_size) + value = adjusted_size target.dna.features["penis_size"] = value +#undef PENIS_LENGTH_ABOVE_NORMAL + /datum/preference/numeric/penis_length/create_default_value() // if you change from this to PENIS_MAX_LENGTH the game should laugh at you return round(max(PENIS_MIN_LENGTH, PENIS_DEFAULT_LENGTH)) @@ -220,9 +235,24 @@ var/part_enabled = is_factual_sprite_accessory(relevant_mutant_bodypart, preferences.read_preference(/datum/preference/choiced/genital/penis)) return erp_allowed && part_enabled && (passed_initial_check || allowed) -/datum/preference/numeric/penis_girth/apply_to_human(mob/living/carbon/human/target, value) +/// The difference between the absolute max girth and the girth for normal sized mobs +#define PENIS_GIRTH_ABOVE_NORMAL PENIS_MAX_GIRTH - PENIS_MAX_GIRTH_NORMAL_SIZED + +/datum/preference/numeric/penis_girth/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) + // Adjust allowed size based on character size + var/body_size = preferences?.read_preference(/datum/preference/numeric/body_size) || BODY_SIZE_NORMAL + var/has_oversized_quirk = preferences?.all_quirks.Find(/datum/quirk/oversized::name) + // Clamp this for normal sized characters. Max allowed size is proportional to the mob's body_size, rounded up. + if(!has_oversized_quirk) + var/adjusted_size = PENIS_MAX_GIRTH_NORMAL_SIZED + if(body_size > 1) + adjusted_size = ceil(round(PENIS_MAX_GIRTH_NORMAL_SIZED, step) + ((((body_size - round(1, step)) * round(2, step))) * round(PENIS_GIRTH_ABOVE_NORMAL, step))) // floating point inaccuracy fun + if(value > adjusted_size) + value = adjusted_size target.dna.features["penis_girth"] = value +#undef PENIS_GIRTH_ABOVE_NORMAL + /datum/preference/numeric/penis_girth/create_default_value() return round(max(PENIS_MIN_GIRTH, PENIS_DEFAULT_GIRTH)) @@ -323,7 +353,7 @@ savefile_key = "balls_size" relevant_mutant_bodypart = ORGAN_SLOT_TESTICLES minimum = 0 - maximum = 3 + maximum = 6 /datum/preference/numeric/balls_size/is_accessible(datum/preferences/preferences) var/passed_initial_check = ..(preferences) diff --git a/modular_skyrat/master_files/code/modules/client/preferences/names.dm b/modular_skyrat/master_files/code/modules/client/preferences/names.dm new file mode 100644 index 00000000000..b3082d1ce2b --- /dev/null +++ b/modular_skyrat/master_files/code/modules/client/preferences/names.dm @@ -0,0 +1,11 @@ +//a new name alias that can be added to ghost roles so the lone infil is not the same doctor that healed you last round. + +/datum/preference/name/syndicate + explanation = "Syndicate name" + group = "backup_human" + savefile_key = "antag_name" + +/datum/preference/name/syndicate/create_informed_default_value(datum/preferences/preferences) + var/gender = preferences.read_preference(/datum/preference/choiced/gender) + + return generate_random_name(gender) diff --git a/modular_skyrat/master_files/code/modules/loadout/categories/accessories.dm b/modular_skyrat/master_files/code/modules/loadout/categories/accessories.dm index beec66ae715..e824fa3831d 100644 --- a/modular_skyrat/master_files/code/modules/loadout/categories/accessories.dm +++ b/modular_skyrat/master_files/code/modules/loadout/categories/accessories.dm @@ -54,3 +54,7 @@ name = "Heirloom Sinew Skirt" item_path = /obj/item/clothing/accessory/skilt/armourless additional_displayed_text = list(TOOLTIP_NO_ARMOR) + +/datum/loadout_item/accessory/wallet + name = "Wallet" + item_path = /obj/item/storage/wallet diff --git a/modular_skyrat/master_files/code/modules/projectiles/guns/ballistic/bows/_bow.dm b/modular_skyrat/master_files/code/modules/projectiles/guns/ballistic/bows/_bow.dm index 2161b681105..802e7820d4a 100644 --- a/modular_skyrat/master_files/code/modules/projectiles/guns/ballistic/bows/_bow.dm +++ b/modular_skyrat/master_files/code/modules/projectiles/guns/ballistic/bows/_bow.dm @@ -6,3 +6,12 @@ . = ..() if(chambered) playsound(src, 'modular_skyrat/modules/tribal_extended/sound/sound_weapons_bowdraw.ogg', 75, 0) + +/obj/item/gun/ballistic/bow/click_alt(mob/user) + . = ..() + SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) + +/obj/item/gun/ballistic/bow/drop_arrow() + . = ..() + SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) + diff --git a/modular_skyrat/master_files/icons/mob/sprite_accessory/genitals/taur_testicles_onmob.dmi b/modular_skyrat/master_files/icons/mob/sprite_accessory/genitals/taur_testicles_onmob.dmi index 3018b88aeee..eadcbcdd58c 100644 Binary files a/modular_skyrat/master_files/icons/mob/sprite_accessory/genitals/taur_testicles_onmob.dmi and b/modular_skyrat/master_files/icons/mob/sprite_accessory/genitals/taur_testicles_onmob.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/sprite_accessory/genitals/testicles_onmob.dmi b/modular_skyrat/master_files/icons/mob/sprite_accessory/genitals/testicles_onmob.dmi index 885c1b903c9..17ccc9df8b2 100644 Binary files a/modular_skyrat/master_files/icons/mob/sprite_accessory/genitals/testicles_onmob.dmi and b/modular_skyrat/master_files/icons/mob/sprite_accessory/genitals/testicles_onmob.dmi differ diff --git a/modular_skyrat/modules/Midroundtraitor/code/datum_traitor.dm b/modular_skyrat/modules/Midroundtraitor/code/datum_traitor.dm index 866df2cf362..2e72a8896fc 100644 --- a/modular_skyrat/modules/Midroundtraitor/code/datum_traitor.dm +++ b/modular_skyrat/modules/Midroundtraitor/code/datum_traitor.dm @@ -6,9 +6,10 @@ /datum/antagonist/traitor/lone_infiltrator/on_gain() var/mob/living/carbon/human/current = owner.current + if(iscarbon(current)) + current.apply_pref_name(/datum/preference/name/syndicate, current.client) + current.dna.update_dna_identity() current.equipOutfit(infil_outfit) - var/chosen_name = generate_random_name_species_based(current.gender, TRUE, species_type = current.dna.species.type) - current.fully_replace_character_name(current.real_name, chosen_name) return ..() /datum/outfit/lone_infiltrator_preview diff --git a/modular_skyrat/modules/ashwalkers/code/buildings/ash_farming.dm b/modular_skyrat/modules/ashwalkers/code/buildings/ash_farming.dm index ddd3f209358..bc838bef5ec 100644 --- a/modular_skyrat/modules/ashwalkers/code/buildings/ash_farming.dm +++ b/modular_skyrat/modules/ashwalkers/code/buildings/ash_farming.dm @@ -82,6 +82,11 @@ var/atom/attached_atom ///the seed that is held within var/obj/item/seeds/planted_seed + /// The amount of worms we're storing + var/stored_worms = 0 + /// the farm level we're at + var/farm_level = SKILL_LEVEL_NONE + ///the max amount harvested from the plants var/max_harvest = 3 ///the cooldown amount between each harvest @@ -114,12 +119,10 @@ /obj/structure/simple_farm/examine(mob/user) . = ..() . += span_notice("
[src] will be ready for harvest in [DisplayTimeText(COOLDOWN_TIMELEFT(src, harvest_timer))]") - if(max_harvest < 6) - . += span_notice("
You can use sinew or worm fertilizer to lower the time between each harvest!") - if(harvest_cooldown > 30 SECONDS) - . += span_notice("You can use goliath hides or worm fertilizer to increase the amount dropped per harvest!") - if(bonus_potency < 50) - . += span_notice("You can use worm fertilizer to increase the potency of dropped crops!") + if(farm_level < SKILL_LEVEL_LEGENDARY) + . += span_notice("
You can use worm fertilizer to increase the level of the farm.") + if(stored_worms < 5) + . += span_notice("
You can use worms to increase the performance of the farm.") /obj/structure/simple_farm/process(seconds_per_tick) update_appearance() @@ -164,129 +167,87 @@ Destroy() return - //if its sinew, lower the cooldown - else if(istype(attacking_item, /obj/item/stack/sheet/sinew)) - var/obj/item/stack/sheet/sinew/use_item = attacking_item - - if(!use_item.use(1)) - return - - decrease_cooldown(user) - user.mind.adjust_experience(/datum/skill/primitive, 5) - return - - //if its goliath hide, increase the amount dropped - else if(istype(attacking_item, /obj/item/stack/sheet/animalhide/goliath_hide)) - var/obj/item/stack/sheet/animalhide/goliath_hide/use_item = attacking_item - - if(!use_item.use(1)) - return - - increase_yield(user) - user.mind.adjust_experience(/datum/skill/primitive, 5) - return - - else if(istype(attacking_item, /obj/item/stack/worm_fertilizer)) - - var/obj/item/stack/attacking_stack = attacking_item - - if(!allow_yield_increase() && !allow_decrease_cooldown()) - balloon_alert(user, "plant is already fully upgraded") - return - - if(!attacking_stack.use(1)) - balloon_alert(user, "unable to use [attacking_item]") - return - - if(!decrease_cooldown(user, silent = TRUE) && !increase_yield(user, silent = TRUE) && !increase_potency(user, silent = TRUE)) - balloon_alert(user, "plant is already fully upgraded") - - else - balloon_alert(user, "plant was upgraded") - user.mind.adjust_experience(/datum/skill/primitive, 5) - - return - + //if its a bag, harvest else if(istype(attacking_item, /obj/item/storage/bag/plants)) if(!COOLDOWN_FINISHED(src, harvest_timer)) return COOLDOWN_START(src, harvest_timer, harvest_cooldown) create_harvest(attacking_item, user) - user.mind.adjust_experience(/datum/skill/primitive, 5) + user.mind.adjust_experience(/datum/skill/primitive, 15) update_appearance() return + //if its fertilizer, boost our level + else if(istype(attacking_item, /obj/item/stack/worm_fertilizer)) + user.mind.adjust_experience(/datum/skill/primitive, 5) + if(farm_level >= SKILL_LEVEL_LEGENDARY) + balloon_alert(user, "farm already max level!") + return + + var/obj/item/stack/worm_fertilizer/fertilizer = attacking_item + if(!fertilizer.use(1)) + return + + balloon_alert(user, "increased farm level") + farm_level++ + return + + //if its worms, increase our worms + else if(istype(attacking_item, /obj/item/food/bait/worm)) + user.mind.adjust_experience(/datum/skill/primitive, 5) + if(stored_worms >= 5) + balloon_alert(user, "plant already full on worms!") + return + + balloon_alert(user, "applied worm") + qdel(attacking_item) + stored_worms++ + return + return ..() -/** - * a proc that will check if we can increase the yield-- without increasing it - */ -/obj/structure/simple_farm/proc/allow_yield_increase() - if(max_harvest >= 6) - return FALSE +/obj/structure/simple_farm/proc/increase_level(new_level) + while(new_level > farm_level) + farm_level++ + switch(farm_level) + if(SKILL_LEVEL_NOVICE) + //you figure out the weird red color these apples have doesnt make them inedible + max_harvest += 1 + bonus_potency += 10 - return TRUE + if(SKILL_LEVEL_APPRENTICE) + //hey these plants are the most ripe at this time in the season + max_harvest += 1 -/** - * a proc that will increase the amount of items the crop could produce (at a maximum of 6, from base of 3) - */ -/obj/structure/simple_farm/proc/increase_yield(mob/user, var/silent = FALSE) - if(!allow_yield_increase()) - if(!silent) - balloon_alert(user, "plant is at maximum yield") + if(SKILL_LEVEL_JOURNEYMAN) + //HEY, LADDERS EXIST, GO GET THOSE TREETOP FRUITS + harvest_cooldown -= 10 SECONDS + bonus_potency += 10 - return FALSE + if(SKILL_LEVEL_EXPERT) + //oh so THATS why im getting mold on produce + max_harvest += 1 - max_harvest++ + if(SKILL_LEVEL_MASTER) + //you realize you can let some frogs eat pests for you + harvest_cooldown -= 10 SECONDS + bonus_potency += 10 - if(!silent) - balloon_alert_to_viewers("plant will have increased yield") + if(SKILL_LEVEL_LEGENDARY) + //the PLANTS know who's their TENDER + var/static/list/color_matrix_were_rich = list( + 1.5, 1, 0, 0, + 1.5, 1, 0, 0, + 0, 0, 0.5, 0, + 0, 0, 0, 1, + 0, 0, 0, 0 + ) + add_atom_colour(color_matrix_were_rich, FIXED_COLOUR_PRIORITY) + bonus_potency += 20 + harvest_cooldown -= 15 SECONDS + balloon_alert_to_viewers("[src] gains a golden glow!") - return TRUE - -/** - * a proc that will check if we can decrease the time-- without increasing it - */ -/obj/structure/simple_farm/proc/allow_decrease_cooldown() - if(harvest_cooldown <= 30 SECONDS) - return FALSE - - return TRUE - -/** - * a proc that will decrease the amount of time it takes to be ready for harvest (at a maximum of 30 seconds, from a base of 1 minute) - */ -/obj/structure/simple_farm/proc/decrease_cooldown(mob/user, var/silent = FALSE) - if(!allow_decrease_cooldown()) - if(!silent) - balloon_alert(user, "already at maximum growth speed!") - - return FALSE - - harvest_cooldown -= 10 SECONDS - - if(!silent) - balloon_alert_to_viewers("plant will grow faster") - - return TRUE - -/** - * a proc that will increase the potency the crop grows at - */ -/obj/structure/simple_farm/proc/increase_potency(mob/user, var/silent = FALSE) - if(bonus_potency >= 50) - if(!silent) - balloon_alert(user, "plant is at maximum potency") - - return FALSE - - bonus_potency += 10 - - if(!silent) - balloon_alert_to_viewers("plant will have increased potency") - - return TRUE /** * used during the component so that it can move when its attached atom moves @@ -309,7 +270,16 @@ if(!planted_seed) return - for(var/i in 1 to rand(1, max_harvest)) + var/lower_cap = rand(1, max_harvest) + for(var/i in 0 to stored_worms) + if(prob(15)) + continue + lower_cap = max(1, lower_cap - 1) + + if(farm_level >= SKILL_LEVEL_LEGENDARY) + lower_cap = 1 + + for(var/i in lower_cap to max_harvest) var/obj/item/seeds/seed if(prob(15) && length(planted_seed.mutatelist)) var/type = pick(planted_seed.mutatelist) @@ -318,7 +288,16 @@ else seed = new planted_seed.type(null) + //we're ASHIE GAMING, we do not concern ourselves with such puny concepts as purity + seed.endurance = 100 + seed.lifespan = 100 + seed.instability = 0 + //also that + seed.yield = 5 + max_harvest + seed.potency = 50 + bonus_potency + if(stored_worms) + seed.potency += stored_worms * 4 var/harvest_type = seed.product || seed.type var/harvest = new harvest_type(get_turf(src), seed) diff --git a/modular_skyrat/modules/borgs/icons/widerobot_eng.dmi b/modular_skyrat/modules/borgs/icons/widerobot_eng.dmi index 6b1e971faa9..1d673d14b0b 100644 Binary files a/modular_skyrat/modules/borgs/icons/widerobot_eng.dmi and b/modular_skyrat/modules/borgs/icons/widerobot_eng.dmi differ diff --git a/modular_skyrat/modules/borgs/icons/widerobot_jani.dmi b/modular_skyrat/modules/borgs/icons/widerobot_jani.dmi index f0c7f0bb252..ea97b8f973e 100644 Binary files a/modular_skyrat/modules/borgs/icons/widerobot_jani.dmi and b/modular_skyrat/modules/borgs/icons/widerobot_jani.dmi differ diff --git a/modular_skyrat/modules/borgs/icons/widerobot_med.dmi b/modular_skyrat/modules/borgs/icons/widerobot_med.dmi index ea893a92894..d0f8aa9ce3b 100644 Binary files a/modular_skyrat/modules/borgs/icons/widerobot_med.dmi and b/modular_skyrat/modules/borgs/icons/widerobot_med.dmi differ diff --git a/modular_skyrat/modules/borgs/icons/widerobot_mine.dmi b/modular_skyrat/modules/borgs/icons/widerobot_mine.dmi index b72fb56d41c..b8e7a5c5ed5 100644 Binary files a/modular_skyrat/modules/borgs/icons/widerobot_mine.dmi and b/modular_skyrat/modules/borgs/icons/widerobot_mine.dmi differ diff --git a/modular_skyrat/modules/borgs/icons/widerobot_pk.dmi b/modular_skyrat/modules/borgs/icons/widerobot_pk.dmi index fad43b6d1e6..ae69a3fa7a0 100644 Binary files a/modular_skyrat/modules/borgs/icons/widerobot_pk.dmi and b/modular_skyrat/modules/borgs/icons/widerobot_pk.dmi differ diff --git a/modular_skyrat/modules/borgs/icons/widerobot_sec.dmi b/modular_skyrat/modules/borgs/icons/widerobot_sec.dmi index 44e5f13d190..5959fa59105 100644 Binary files a/modular_skyrat/modules/borgs/icons/widerobot_sec.dmi and b/modular_skyrat/modules/borgs/icons/widerobot_sec.dmi differ diff --git a/modular_skyrat/modules/borgs/icons/widerobot_serv.dmi b/modular_skyrat/modules/borgs/icons/widerobot_serv.dmi index f212892b9a9..6ab5d2a2f9b 100644 Binary files a/modular_skyrat/modules/borgs/icons/widerobot_serv.dmi and b/modular_skyrat/modules/borgs/icons/widerobot_serv.dmi differ diff --git a/modular_skyrat/modules/borgs/icons/widerobots_cargo.dmi b/modular_skyrat/modules/borgs/icons/widerobots_cargo.dmi index cd1e46bea44..d4e8298eba3 100644 Binary files a/modular_skyrat/modules/borgs/icons/widerobots_cargo.dmi and b/modular_skyrat/modules/borgs/icons/widerobots_cargo.dmi differ diff --git a/modular_skyrat/modules/cargo/code/packs.dm b/modular_skyrat/modules/cargo/code/packs.dm index 423ffec0c2d..9f1236ab7b5 100644 --- a/modular_skyrat/modules/cargo/code/packs.dm +++ b/modular_skyrat/modules/cargo/code/packs.dm @@ -698,8 +698,8 @@ /obj/item/clothing/suit/armor/vest/cuirass/larp, /obj/item/gun/ballistic/bow/longbow, /obj/item/gun/ballistic/bow/longbow, - /obj/item/storage/bag/quiver, - /obj/item/storage/bag/quiver, + /obj/item/storage/bag/quiver/full, + /obj/item/storage/bag/quiver/full, /obj/item/clothing/head/helmet/knight/red, /obj/item/clothing/head/helmet/knight/blue, /obj/item/food/bread/plain, diff --git a/modular_skyrat/modules/chat_colors/code/chat_color.dm b/modular_skyrat/modules/chat_colors/code/chat_color.dm index 8d17d3b46c9..a103a0456bb 100644 --- a/modular_skyrat/modules/chat_colors/code/chat_color.dm +++ b/modular_skyrat/modules/chat_colors/code/chat_color.dm @@ -78,7 +78,7 @@ var/luminance = hsl_color[NCM_COLOR_LUMINANCE] // Cap the saturation at 90% - saturation = min(saturation, CM_COLOR_SAT_MAX) + saturation = min(saturation, NCM_COLOR_SAT_MAX) // Now clamp the luminance according to the hue var/processed_luminance diff --git a/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/seeds.dm b/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/seeds.dm index f64ba01c5ff..11c0c996316 100644 --- a/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/seeds.dm +++ b/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/seeds.dm @@ -1,5 +1,5 @@ /datum/design/organic_parsnip_seed - name = "Pack of Parsnip Seeds" + name = "Parsnip Seed Pack" id = "oganic_parsnip_seed" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 25) @@ -10,7 +10,7 @@ ) /datum/design/organic_beet_seed - name = "Pack of White-Beet Seeds" + name = "White-Beet Seed Pack" id = "oganic_beet_seed" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 25) @@ -21,7 +21,7 @@ ) /datum/design/organic_potato_seed - name = "Pack of Potato Seeds" + name = "Potato Seed Pack" id = "oganic_potato_seed" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 25) @@ -32,7 +32,7 @@ ) /datum/design/organic_soy_seed - name = "Pack of Soybean Seeds" + name = "Soybean Seed Pack" id = "oganic_soy_seed" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 25) @@ -43,7 +43,7 @@ ) /datum/design/organic_rice_seed - name = "Pack of Rice Seeds" + name = "Rice Seed Pack" id = "oganic_rice_seed" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 25) @@ -54,7 +54,7 @@ ) /datum/design/organic_oat_seed - name = "Pack of Oat Seeds" + name = "Oat Seed Pack" id = "oganic_oat_seed" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 25) @@ -65,7 +65,7 @@ ) /datum/design/organic_korta_seed - name = "Pack of Korta Seeds" + name = "Korta Seed Pack" id = "oganic_korta_seed" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 25) @@ -76,7 +76,7 @@ ) /datum/design/organic_plump_helmet - name = "Pack of Plump-Helmet Seeds" + name = "Plump-Helmet Seed Pack" id = "oganic_plump_helmet" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 25) diff --git a/modular_skyrat/modules/customization/_globalvars/lists.dm b/modular_skyrat/modules/customization/_globalvars/lists.dm index 4c3e57bdc8c..e9b99ba7645 100644 --- a/modular_skyrat/modules/customization/_globalvars/lists.dm +++ b/modular_skyrat/modules/customization/_globalvars/lists.dm @@ -45,7 +45,10 @@ GLOBAL_LIST_INIT(balls_size_translation, list( "0" = "Small", "1" = "Average", "2" = "Big", - "3" = "Enormous" + "3" = "Very Big", + "4" = "Enormous", + "5" = "Immense", + "6" = "Gargantuan" )) GLOBAL_LIST_INIT(marking_zone_to_bitflag, list( @@ -74,7 +77,10 @@ GLOBAL_LIST_INIT(preference_balls_sizes, list( "Small", "Average", "Big", + "Very Big", "Enormous", + "Immense", + "Gargantuan" )) GLOBAL_LIST_INIT(robotic_styles_list, list( diff --git a/modular_skyrat/modules/customization/modules/hydroponics/grown/bananaspider.dm b/modular_skyrat/modules/customization/modules/hydroponics/grown/bananaspider.dm index 9fdf3ab1e19..c065960f7c1 100644 --- a/modular_skyrat/modules/customization/modules/hydroponics/grown/bananaspider.dm +++ b/modular_skyrat/modules/customization/modules/hydroponics/grown/bananaspider.dm @@ -1,5 +1,5 @@ /obj/item/seeds/banana/spider_banana - name = "pack of leggy banana seeds" + name = "leggy banana seed pack" desc = "They're seeds that grow into banana trees. However, those bananas might be alive." icon = 'modular_skyrat/master_files/icons/obj/hydroponics/seeds.dmi' icon_state = "seed-spibanana" diff --git a/modular_skyrat/modules/customization/modules/hydroponics/grown/tea_coffee.dm b/modular_skyrat/modules/customization/modules/hydroponics/grown/tea_coffee.dm index 6c2ba4244c4..6adf7a0f79b 100644 --- a/modular_skyrat/modules/customization/modules/hydroponics/grown/tea_coffee.dm +++ b/modular_skyrat/modules/customization/modules/hydroponics/grown/tea_coffee.dm @@ -2,7 +2,7 @@ // Catnip /obj/item/seeds/tea/catnip - name = "pack of catnip seeds" + name = "catnip seed pack" icon = 'modular_skyrat/master_files/icons/obj/hydroponics/seeds.dmi' icon_state = "seed-catnip" growing_icon = 'modular_skyrat/master_files/icons/obj/hydroponics/growing.dmi' diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/wings.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/wings.dm index 53deb332370..ce776e72110 100644 --- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/wings.dm +++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/wings.dm @@ -200,6 +200,7 @@ /datum/sprite_accessory/wings/mammal/harpy/bat name = "Harpy (Bat)" icon_state = "harpybat" + color_src = USE_MATRIXED_COLORS /datum/sprite_accessory/wings/mammal/top/harpy/alt name = "Harpy (Top - Alt)" @@ -212,6 +213,7 @@ /datum/sprite_accessory/wings/mammal/top/harpy/bat name = "Harpy (Top - Bat)" icon_state = "harpybat_top" + color_src = USE_MATRIXED_COLORS /datum/sprite_accessory/wings/mammal/pterodactyl name = "Pterodactyl" diff --git a/modular_skyrat/modules/customization/modules/surgery/organs/genitals.dm b/modular_skyrat/modules/customization/modules/surgery/organs/genitals.dm index 1c9131e5698..68e72da16c2 100644 --- a/modular_skyrat/modules/customization/modules/surgery/organs/genitals.dm +++ b/modular_skyrat/modules/customization/modules/surgery/organs/genitals.dm @@ -259,7 +259,7 @@ layers = EXTERNAL_ADJACENT | EXTERNAL_BEHIND /obj/item/organ/external/genital/testicles/update_genital_icon_state() - var/measured_size = clamp(genital_size, 1, 3) + var/measured_size = clamp(genital_size, 1, 6) var/passed_string = "testicles_[genital_type]_[measured_size]" if(uses_skintones) passed_string += "_s" @@ -283,7 +283,7 @@ /obj/item/organ/external/genital/testicles/get_sprite_size_string() var/measured_size = FLOOR(genital_size,1) - measured_size = clamp(measured_size, 0, 3) + measured_size = clamp(measured_size, 0, 6) var/passed_string = "[genital_type]_[measured_size]" if(uses_skintones) passed_string += "_s" diff --git a/modular_skyrat/modules/goofsec/code/department_guards.dm b/modular_skyrat/modules/goofsec/code/department_guards.dm index c5818361ad9..c8b84a773c6 100644 --- a/modular_skyrat/modules/goofsec/code/department_guards.dm +++ b/modular_skyrat/modules/goofsec/code/department_guards.dm @@ -145,7 +145,7 @@ icon = 'modular_skyrat/master_files/icons/mob/landmarks.dmi' /obj/effect/landmark/start/bouncer - name = "Service Guard" + name = "Bouncer" icon_state = "Bouncer" icon = 'modular_skyrat/master_files/icons/mob/landmarks.dmi' diff --git a/modular_skyrat/modules/huds/code/glasses/HUD_Glasses.dm b/modular_skyrat/modules/huds/code/glasses/HUD_Glasses.dm index 1fc3e621418..5dd50c93ee8 100644 --- a/modular_skyrat/modules/huds/code/glasses/HUD_Glasses.dm +++ b/modular_skyrat/modules/huds/code/glasses/HUD_Glasses.dm @@ -4,7 +4,10 @@ icon = 'modular_skyrat/modules/huds/icons/huds.dmi' icon_state = "glasses_healthhud" worn_icon = 'modular_skyrat/modules/huds/icons/hudeyes.dmi' - clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) + +/obj/item/clothing/glasses/hud/health/prescription/Initialize(mapload) + . = ..() + clothing_traits += list(TRAIT_NEARSIGHTED_CORRECTED) /obj/item/clothing/glasses/hud/diagnostic/prescription name = "prescription diagnostic HUD" @@ -12,7 +15,10 @@ icon = 'modular_skyrat/modules/huds/icons/huds.dmi' icon_state = "glasses_diagnostichud" worn_icon = 'modular_skyrat/modules/huds/icons/hudeyes.dmi' - clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) + +/obj/item/clothing/glasses/hud/diagnostic/prescription/Initialize(mapload) + . = ..() + clothing_traits += list(TRAIT_NEARSIGHTED_CORRECTED) /obj/item/clothing/glasses/hud/security/prescription name = "prescription security HUD" @@ -20,7 +26,10 @@ icon = 'modular_skyrat/modules/huds/icons/huds.dmi' icon_state = "glasses_securityhud" worn_icon = 'modular_skyrat/modules/huds/icons/hudeyes.dmi' - clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) + +/obj/item/clothing/glasses/hud/security/prescription/Initialize(mapload) + . = ..() + clothing_traits += list(TRAIT_NEARSIGHTED_CORRECTED) /obj/item/clothing/glasses/hud/science/prescription name = "prescription science glasses" @@ -32,7 +41,7 @@ glass_colour_type = /datum/client_colour/glass_colour/purple resistance_flags = ACID_PROOF armor_type = /datum/armor/prescription_science - clothing_traits = list(TRAIT_REAGENT_SCANNER, TRAIT_RESEARCH_SCANNER, TRAIT_NEARSIGHTED_CORRECTED) + clothing_traits = list(TRAIT_REAGENT_SCANNER, TRAIT_MEDICAL_HUD, TRAIT_NEARSIGHTED_CORRECTED) /datum/armor/prescription_science fire = 80 @@ -41,14 +50,23 @@ /obj/item/clothing/glasses/meson/prescription name = "prescription optical meson scanner" desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting conditions. This one has prescription lens fitted in." - clothing_traits = list(TRAIT_MADNESS_IMMUNE, TRAIT_NEARSIGHTED_CORRECTED) + +/obj/item/clothing/glasses/meson/prescription/Initialize(mapload) + . = ..() + clothing_traits += list(TRAIT_NEARSIGHTED_CORRECTED) /obj/item/clothing/glasses/meson/engine/prescription name = "prescription engineering scanner goggles" desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, the T-ray Scanner mode lets you see underfloor objects such as cables and pipes, and the Radiation Scanner mode let's you see objects contaminated by radiation. Each lens has been replaced with a corrective lens." - clothing_traits = list(TRAIT_MADNESS_IMMUNE, TRAIT_NEARSIGHTED_CORRECTED) + +/obj/item/clothing/glasses/meson/engine/prescription/Initialize(mapload) + . = ..() + clothing_traits += list(TRAIT_NEARSIGHTED_CORRECTED) /obj/item/clothing/glasses/meson/engine/tray/prescription name = "prescription optical t-ray scanner" desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, the T-ray Scanner mode lets you see underfloor objects such as cables and pipes, and the Radiation Scanner mode let's you see objects contaminated by radiation. This one has a lens that help correct eye sight." - clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) + +/obj/item/clothing/glasses/meson/engine/tray/prescription/Initialize(mapload) + . = ..() + clothing_traits += list(TRAIT_NEARSIGHTED_CORRECTED) diff --git a/modular_skyrat/modules/implants/code/augments_internal.dm b/modular_skyrat/modules/implants/code/augments_internal.dm index 1523ee7cbc0..ea4158bfc23 100644 --- a/modular_skyrat/modules/implants/code/augments_internal.dm +++ b/modular_skyrat/modules/implants/code/augments_internal.dm @@ -1,35 +1,36 @@ /obj/item/organ/internal/cyberimp/brain/anti_sleep name = "CNS jumpstarter" desc = "This implant will automatically attempt to jolt you awake when it detects you have fallen unconscious outside of REM sleeping cycles. Has a short cooldown. Conflicts with the CNS Rebooter, making them incompatible with eachother." + icon_state = "brain_implant_rebooter" implant_color = "#0356fc" slot = ORGAN_SLOT_BRAIN_ANTISTUN //One or the other, not both. - var/cooldown = FALSE + var/cooldown -/obj/item/organ/internal/cyberimp/brain/anti_sleep/on_life(mob/living/carbon/human/H) - H = owner - if(H.stat == UNCONSCIOUS && cooldown==FALSE) - H.AdjustUnconscious(-100, FALSE) - H.AdjustSleeping(-100, FALSE) - to_chat(owner, span_notice("You feel a rush of energy course through your body!")) - cooldown = TRUE - addtimer(CALLBACK(src, PROC_REF(sleepytimerend)), 5 SECONDS) - else +/obj/item/organ/internal/cyberimp/brain/anti_sleep/on_life(seconds_per_tick, times_fired) + if(timeleft(cooldown)) return -/obj/item/organ/internal/cyberimp/brain/anti_sleep/proc/sleepytimerend() - cooldown = FALSE - to_chat(owner, span_notice("You hear a small beep in your head as your CNS Jumpstarter finishes recharging.")) + var/mob/living/carbon/human/human_owner = owner + if(human_owner.stat != UNCONSCIOUS) + return -/obj/item/organ/internal/cyberimp/brain/anti_sleep/emp_act(severity, mob/living/carbon/human/H) + human_owner.AdjustUnconscious(-50 * seconds_per_tick, FALSE) + human_owner.AdjustSleeping(-50 * seconds_per_tick, FALSE) + to_chat(owner, span_notice("You feel a rush of energy course through your body!")) + cooldown = addtimer(CALLBACK(src, PROC_REF(sleepytimerend)), 5 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_STOPPABLE | TIMER_DELETE_ME) + +/obj/item/organ/internal/cyberimp/brain/anti_sleep/proc/sleepytimerend() + to_chat(owner, span_notice("You hear a small beep in your head as your CNS Jumpstarter finishes recharging.")) + cooldown = null + +/obj/item/organ/internal/cyberimp/brain/anti_sleep/emp_act(severity) . = ..() - H = owner + var/mob/living/carbon/human/human_owner = owner if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF) return organ_flags |= ORGAN_FAILING - H.AdjustUnconscious(200) - cooldown = TRUE - addtimer(CALLBACK(src, PROC_REF(reboot)), 90 / severity) + human_owner.AdjustUnconscious(200) + cooldown = addtimer(CALLBACK(src, PROC_REF(reboot)), (9 SECONDS / severity), TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_STOPPABLE | TIMER_DELETE_ME) /obj/item/organ/internal/cyberimp/brain/anti_sleep/proc/reboot() organ_flags &= ~ORGAN_FAILING - cooldown = FALSE diff --git a/modular_skyrat/modules/mapping/code/mob_spawns.dm b/modular_skyrat/modules/mapping/code/mob_spawns.dm index 958ce456fad..f8a172ee005 100644 --- a/modular_skyrat/modules/mapping/code/mob_spawns.dm +++ b/modular_skyrat/modules/mapping/code/mob_spawns.dm @@ -171,7 +171,7 @@ id_card.registered_name = syndicate.real_name id_card.update_label() id_card.update_icon() - + syndicate.apply_pref_name(/datum/preference/name/syndicate, syndicate.client) handlebank(syndicate) return ..() diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/attachable_vibrator.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/attachable_vibrator.dm index 1db92a08430..bcff9841d2a 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/attachable_vibrator.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/attachable_vibrator.dm @@ -2,6 +2,11 @@ * VIBRATING EGG */ +#define EGGVIB_OFF "off" +#define EGGVIB_LOW "low" +#define EGGVIB_MEDIUM "medium" +#define EGGVIB_HIGH "high" + /obj/item/clothing/sextoy/eggvib name = "vibrating egg" desc = "A simple, vibrating sex toy." @@ -20,9 +25,7 @@ /// Bool of if the color's been changed or not before var/color_changed = FALSE /// The current mode of the toy, affects sprite - var/vibration_mode = "off" - /// Assoc list of modes, used to transfer between them - var/list/modes = list("low" = "medium", "medium" = "high", "high" = "off", "off" = "low") + var/vibration_mode = EGGVIB_OFF /// A looping sound called on process() var/datum/looping_sound/lewd/vibrator/low/soundloop1 /// A looping sound called on process() @@ -39,6 +42,13 @@ "pink" = image(icon = src.icon, icon_state = "[initial(base_icon_state)]_pink_low[(istype(src, /obj/item/clothing/sextoy/eggvib/signalvib)) ? "_on" : ""]"), "teal" = image(icon = src.icon, icon_state = "[initial(base_icon_state)]_teal_low[(istype(src, /obj/item/clothing/sextoy/eggvib/signalvib)) ? "_on" : ""]")) +/obj/item/clothing/sextoy/eggvib/examine(mob/user) + . = ..() + if(!color_changed) + . += span_notice("Alt-click to change it's colors.") + else + . += span_notice("Alt-click to toggle vibration modes.") + /obj/item/clothing/sextoy/eggvib/click_alt(mob/user) if(!color_changed) var/choice = show_radial_menu(user, src, vib_designs, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 36, require_near = TRUE) @@ -50,13 +60,13 @@ else toggle_mode() switch(vibration_mode) - if("low") + if(EGGVIB_LOW) to_chat(user, span_notice("You set the vibration mode to low. Bzzz...")) - if("medium") + if(EGGVIB_MEDIUM) to_chat(user, span_notice("You set the vibration mode to medium. Bzzzz!")) - if("high") + if(EGGVIB_HIGH) to_chat(user, span_notice("You set the vibration mode to high. Careful with that thing.")) - if("off") + if(EGGVIB_OFF) to_chat(user, span_notice("You turn off the vibrating egg. Fun time's over.")) update_icon() update_icon_state() @@ -87,26 +97,27 @@ /// Toggles between vibration modes seuentially /obj/item/clothing/sextoy/eggvib/proc/toggle_mode() - vibration_mode = modes[vibration_mode] - soundloop1.stop() - soundloop2.stop() - soundloop3.stop() switch(vibration_mode) - if("low") + if(EGGVIB_OFF) + vibration_mode = EGGVIB_LOW toy_on = TRUE play_lewd_sound(loc, 'sound/weapons/magin.ogg', 20, TRUE) soundloop1.start() - if("medium") - toy_on = TRUE + if(EGGVIB_LOW) + vibration_mode = EGGVIB_MEDIUM play_lewd_sound(loc, 'sound/weapons/magin.ogg', 20, TRUE) + soundloop1.stop() soundloop2.start() - if("high") - toy_on = TRUE + if(EGGVIB_MEDIUM) + vibration_mode = EGGVIB_HIGH play_lewd_sound(loc, 'sound/weapons/magin.ogg', 20, TRUE) + soundloop2.stop() soundloop3.start() - if("off") + if(EGGVIB_HIGH) + vibration_mode = EGGVIB_OFF toy_on = FALSE play_lewd_sound(loc, 'sound/weapons/magout.ogg', 20, TRUE) + soundloop3.stop() /obj/item/clothing/sextoy/eggvib/lewd_equipped(mob/living/carbon/human/user, slot, initial) . = ..() @@ -125,15 +136,16 @@ var/mob/living/carbon/human/target = loc if(!istype(target)) return - if(vibration_mode == "low") - target.adjust_arousal(0.5 * seconds_per_tick) - target.adjust_pleasure(0.5 * seconds_per_tick) - if(vibration_mode == "medium") - target.adjust_arousal(0.6 * seconds_per_tick) - target.adjust_pleasure(0.6 * seconds_per_tick) - if(vibration_mode == "high") - target.adjust_arousal(0.7 * seconds_per_tick) - target.adjust_pleasure(0.7 * seconds_per_tick) + switch(vibration_mode) + if(EGGVIB_LOW) + target.adjust_arousal(0.5 * seconds_per_tick) + target.adjust_pleasure(0.5 * seconds_per_tick) + if(EGGVIB_MEDIUM) + target.adjust_arousal(0.6 * seconds_per_tick) + target.adjust_pleasure(0.6 * seconds_per_tick) + if(EGGVIB_HIGH) + target.adjust_arousal(0.7 * seconds_per_tick) + target.adjust_pleasure(0.7 * seconds_per_tick) /* * SIGNALLER CONTROLLED EGG @@ -145,8 +157,7 @@ icon_state = "signalvib_pink_low_off" base_icon_state = "signalvib" inhand_icon_state = "signalvib_pink" - modes = list("low" = "medium", "medium" = "high", "high" = "low") - vibration_mode = "low" + vibration_mode = EGGVIB_LOW /// If TRUE, the code and frequency will be random on initialize() var/random = TRUE /// If TRUE, the set code and frequency will be appended to the toy's name @@ -175,7 +186,7 @@ /obj/item/clothing/sextoy/eggvib/signalvib/update_icon_state() . = ..() - icon_state = "[base_icon_state]_[current_color]_[vibration_mode == "off" ? "low_off" : (toy_on ? "[vibration_mode]_on" : "[vibration_mode]_off")]" + icon_state = "[base_icon_state]_[current_color]_[vibration_mode == EGGVIB_OFF ? "low_off" : (toy_on ? "[vibration_mode]_on" : "[vibration_mode]_off")]" inhand_icon_state = "[base_icon_state]_[current_color]" /obj/item/clothing/sextoy/eggvib/signalvib/proc/set_frequency(new_frequency) @@ -205,13 +216,13 @@ soundloop2.stop() soundloop3.stop() switch(vibration_mode) - if("low") + if(EGGVIB_LOW) to_chat(user, span_notice("You set the vibration mode to low. Bzzz...")) soundloop1.start() - if("medium") + if(EGGVIB_MEDIUM) to_chat(user, span_notice("You set the vibration mode to medium. Bzzzz!")) soundloop2.start() - if("high") + if(EGGVIB_HIGH) to_chat(user, span_notice("You set the vibration mode to high. Careful with that thing!")) soundloop3.start() update_icon() @@ -230,11 +241,11 @@ soundloop1.stop() soundloop2.stop() soundloop3.stop() - if(vibration_mode == "low") + if(vibration_mode == EGGVIB_LOW) soundloop1.start() - if(vibration_mode == "medium") + if(vibration_mode == EGGVIB_MEDIUM) soundloop2.start() - if(vibration_mode == "high") + if(vibration_mode == EGGVIB_HIGH) soundloop3.start() else soundloop1.stop() @@ -289,14 +300,13 @@ soundloop2.stop() soundloop3.stop() if(toy_on) - if(vibration_mode == "low") + if(vibration_mode == EGGVIB_LOW) soundloop1.start() - if(vibration_mode == "medium") + if(vibration_mode == EGGVIB_MEDIUM) soundloop2.start() - if(vibration_mode == "high") + if(vibration_mode == EGGVIB_HIGH) soundloop3.start() - - if(!toy_on) + else soundloop1.stop() soundloop2.stop() soundloop3.stop() @@ -322,14 +332,18 @@ . = TRUE /obj/item/clothing/sextoy/eggvib/signalvib/toggle_mode() - vibration_mode = modes[vibration_mode] switch(vibration_mode) - if("low") - vibration_mode = "low" + if(EGGVIB_LOW) + vibration_mode = EGGVIB_MEDIUM play_lewd_sound(loc, 'sound/weapons/magin.ogg', 20, TRUE) - if("medium") - vibration_mode = "medium" + if(EGGVIB_MEDIUM) + vibration_mode = EGGVIB_HIGH play_lewd_sound(loc, 'sound/weapons/magin.ogg', 20, TRUE) - if("high") - vibration_mode = "high" + if(EGGVIB_HIGH) + vibration_mode = EGGVIB_LOW play_lewd_sound(loc, 'sound/weapons/magin.ogg', 20, TRUE) + +#undef EGGVIB_OFF +#undef EGGVIB_LOW +#undef EGGVIB_HIGH +#undef EGGVIB_MEDIUM diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/buttplug.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/buttplug.dm index 5bcc5129e03..f36ae0f6baf 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/buttplug.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/buttplug.dm @@ -40,6 +40,13 @@ "medium" = image(icon = src.icon, icon_state = "buttplug_pink_medium"), "big" = image(icon = src.icon, icon_state = "buttplug_pink_big")) +/obj/item/clothing/sextoy/buttplug/examine(mob/user) + . = ..() + if(!color_changed) + . += span_notice("Alt-click to change it's colors.") + else if(!form_changed) + . += span_notice("Alt-click to change it's size.") + /obj/item/clothing/sextoy/buttplug/click_alt(mob/user) if(!color_changed) var/choice = show_radial_menu(user, src, buttplug_designs, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 36, require_near = TRUE) @@ -53,7 +60,7 @@ color_changed = TRUE return CLICK_ACTION_SUCCESS else - if(form_changed == FALSE) + if(!form_changed) var/choice = show_radial_menu(user, src, buttplug_forms, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 36, require_near = TRUE) if(!choice) return CLICK_ACTION_BLOCKING diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/clamps.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/clamps.dm index 7e7b6dda7ca..00f5c762858 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/clamps.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/clamps.dm @@ -26,7 +26,7 @@ update_icon_state() - clamps_overlay = mutable_appearance('modular_skyrat/modules/modular_items/lewd_items/icons/mob/lewd_items/lewd_items.dmi', "[initial(icon_state)]_[breast_type]_[breast_size]", ABOVE_ALL_MOB_LAYER + 0.1) //two arguments. Yes, all mob layer. Fuck person who was working on genitals, they're working wrong.ABOVE_NORMAL_TURF_LAYER + clamps_overlay = mutable_appearance('modular_skyrat/modules/modular_items/lewd_items/icons/mob/lewd_items/lewd_items.dmi', "[initial(icon_state)]_[breast_type]_[breast_size]", -BODY_FRONT_UNDER_CLOTHES) //two arguments. Yes, all mob layer. Fuck person who was working on genitals, they're working wrong.ABOVE_NORMAL_TURF_LAYER update_icon() update_appearance() @@ -52,7 +52,7 @@ update_icon_state() - clamps_overlay = mutable_appearance('modular_skyrat/modules/modular_items/lewd_items/icons/mob/lewd_items/lewd_items.dmi', "[initial(icon_state)]_[breast_type]_[breast_size]", ABOVE_ALL_MOB_LAYER + 0.1) //two arguments + clamps_overlay = mutable_appearance('modular_skyrat/modules/modular_items/lewd_items/icons/mob/lewd_items/lewd_items.dmi', "[initial(icon_state)]_[breast_type]_[breast_size]", -BODY_FRONT_UNDER_CLOTHES) //two arguments update_icon() update_appearance() diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/dildo.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/dildo.dm index 9feeb963a09..6ddd3f8c3b6 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/dildo.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/dildo.dm @@ -41,6 +41,11 @@ "human" = image(icon = src.icon, icon_state = "[base_icon_state]_human"), "tentacle" = image(icon = src.icon, icon_state = "[base_icon_state]_tentacle")) +/obj/item/clothing/sextoy/dildo/examine(mob/user) + . = ..() + if(!color_changed && change_sprite) + . += span_notice("Alt-click to change it's designs.") + /obj/item/clothing/sextoy/dildo/click_alt(mob/user) if(color_changed) return CLICK_ACTION_BLOCKING @@ -91,14 +96,16 @@ /obj/item/clothing/sextoy/dildo/attack(mob/living/carbon/human/target, mob/living/carbon/human/user) . = ..() - if(!ishuman(target) || (target.stat == DEAD)) //Don't. + if(target.stat == DEAD) + return + if(!ishuman(target)) //Don't. return - var/message = "" if(!target.check_erp_prefs(/datum/preference/toggle/erp/sex_toy, user, src)) to_chat(user, span_danger("[target] doesn't want you to do that.")) return + var/message = "" var/arousal_adjustment = 4 var/pleasure_adjustment = 5 var/emote_probability = 20 @@ -106,50 +113,63 @@ switch(user.zone_selected) //to let code know what part of body we gonna fuck if(BODY_ZONE_PRECISE_GROIN) var/obj/item/organ/external/genital/vagina = target.get_organ_slot(ORGAN_SLOT_VAGINA) - if(!vagina) - to_chat(user, span_danger("[target] don't have suitable genitalia for that!")) + if(!vagina?.is_exposed()) + to_chat(user, span_danger("Looks like [target]'s groin is covered!")) return FALSE - if(!(target.is_bottomless() || vagina.visibility_preference == GENITAL_ALWAYS_SHOW)) - to_chat(user, span_danger("[target]'s groin is covered!")) - return FALSE + message = (user == target) ? pick("rubs [target.p_their()] vagina with [src]", + "gently jams [target.p_their()] pussy with [src]", + "fucks [target.p_their()] vagina with [src]") \ + : pick("delicately rubs [target]'s vagina with [src]", + "shoves [src] deep into [target]'s vagina", + "jams [src] into [target]'s pussy", + "teases [target]'s pussy with [src]") - message = (user == target) ? pick("rubs [target.p_their()] vagina with [src]", "gently jams [target.p_their()] pussy with [src]", "fucks [target.p_their()] vagina with a [src]") : pick("delicately rubs [target]'s vagina with [src]", "uses [src] to fuck [target]'s vagina", "jams [target]'s pussy with [src]", "teasing [target]'s pussy with [src]") - - if(poly_size == "medium") - arousal_adjustment = 6 - pleasure_adjustment = 8 - emote_probability = 40 - possible_emotes = list("moan","twitch_s") - - if(poly_size == "big") - arousal_adjustment = 8 - pleasure_adjustment = 10 - emote_probability = 60 - possible_emotes = list("moan","twitch_s", "gasp") - target.adjust_pain(2) + switch(poly_size) + if("medium") + arousal_adjustment = 6 + pleasure_adjustment = 8 + emote_probability = 40 + possible_emotes = list("moan","twitch_s") + if("big") + arousal_adjustment = 8 + pleasure_adjustment = 10 + emote_probability = 60 + possible_emotes = list("moan","twitch_s", "gasp") + target.adjust_pain(2) if(side_double) - user.adjust_arousal(6) - user.adjust_pleasure(8) + arousal_adjustment += 6 + pleasure_adjustment += 8 if(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_PRECISE_EYES) //Mouth only. Sorry, perverts. No eye/ear penetration for you today. if(target.is_mouth_covered()) to_chat(user, span_danger("Looks like [target]'s mouth is covered!")) return FALSE - message = (user == target) ? pick("licks [src] erotically", "sucks on [src], slowly inserting it into [target.p_their()] throat") : pick("fucks [target]'s mouth with [src]", "inserts [src] into [target]'s throat, choking [target.p_them()]", "forces [target] to suck [src]", "inserts [src] into [target]'s throat") + message = (user == target) ? pick("licks [src] seductively", + "sucks on [src], slowly inserting it into [target.p_their()] throat") \ + : pick("fucks [target]'s mouth with [src]", + "shoves [src] into [target]'s throat, choking [target.p_them()]", + "forces [target] to suck [src]", + "inserts [src] into [target]'s throat") arousal_adjustment = 4 pleasure_adjustment = 1 emote_probability = 70 possible_emotes = list("gasp", "moan") else - if(!target.is_bottomless()) - to_chat(user, span_danger("[target]'s anus is covered!")) + var/obj/item/organ/external/genital/anus = target.get_organ_slot(ORGAN_SLOT_ANUS) + if(!anus?.is_exposed()) + to_chat(user, span_danger("Looks like [target]'s anus is covered!")) return FALSE - message = (user == target) ? pick("puts [src] into [target.p_their()] anus", "slowly inserts [src] into [target.p_their()] ass") : pick("fucks [target]'s ass with [src]", "uses [src] to fuck [target]'s anus", "jams [target]'s ass with [src]", "roughly fucks [target]'s ass with [src], making [target.p_their()] eyes roll back") + message = (user == target) ? pick("puts [src] into [target.p_their()] anus", + "slowly inserts [src] into [target.p_their()] ass") \ + : pick("fucks [target]'s ass with [src]", + "uses [src] to fuck [target]'s anus", + "jams [target]'s ass with [src]", + "fucks [target]'s ass with [src], making [target.p_their()] eyes roll back") arousal_adjustment = 5 pleasure_adjustment = 5 emote_probability = 60 @@ -207,21 +227,24 @@ GLOBAL_LIST_INIT(dildo_colors, list(//mostly neon colors "medium" = image(icon = src.icon, icon_state = "[base_icon_state]_medium"), "big" = image(icon = src.icon, icon_state = "[base_icon_state]_big")) +/obj/item/clothing/sextoy/dildo/custom_dildo/examine(mob/user) + . = ..() + if(!size_changed && color_changed && change_sprite) + . += span_notice("Alt-click to change it's size.") + /obj/item/clothing/sextoy/dildo/custom_dildo/click_alt(mob/living/user) - if(!size_changed) + if(!color_changed) + if(!istype(user) || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) + return CLICK_ACTION_BLOCKING + customize(user) + color_changed = TRUE + else if (!size_changed) var/choice = show_radial_menu(user, src, dildo_sizes, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 36, require_near = TRUE) if(!choice) return CLICK_ACTION_BLOCKING poly_size = choice update_icon() size_changed = TRUE - else - if(color_changed) - return CLICK_ACTION_BLOCKING - if(!istype(user) || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return CLICK_ACTION_BLOCKING - customize(user) - color_changed = TRUE return CLICK_ACTION_SUCCESS /obj/item/clothing/sextoy/dildo/custom_dildo/Initialize(mapload) @@ -248,10 +271,6 @@ GLOBAL_LIST_INIT(dildo_colors, list(//mostly neon colors update_icon_state() return TRUE -/obj/item/clothing/sextoy/dildo/custom_dildo/examine(mob/user) - . = ..() - . += span_notice("
Alt-Click \the [src.name] to customize it.") - /obj/item/clothing/sextoy/dildo/custom_dildo/update_icon_state() . = ..() icon_state = "[base_icon_state]_[poly_size]" diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/feather.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/feather.dm index 575ccc7e6cc..0502508dff3 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/feather.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/feather.dm @@ -10,78 +10,69 @@ /obj/item/tickle_feather/attack(mob/living/target, mob/living/user) . = ..() - var/mob/living/carbon/human/carbon_target - if(istype(target,/mob/living/carbon/human)) - carbon_target = target - else if(istype(target,/mob/living/silicon/robot)) - // Just use target var, return if it isn't human or robot - else + if(target.stat == DEAD) return - if(!istype(user,/mob/living/carbon/human) && !istype(user,/mob/living/silicon/robot)) + var/mob/living/carbon/human/carbon_target = target + if(!carbon_target && !iscyborg(target)) return var/message = "" - var/targetedsomewhere = FALSE switch(user.zone_selected) //to let code know what part of body we gonna tickle if(BODY_ZONE_PRECISE_GROIN) - targetedsomewhere = TRUE - if(carbon_target && !carbon_target.is_bottomless()) - to_chat(user, span_danger("[target]'s groin is covered!")) + if(!carbon_target?.is_bottomless()) + to_chat(user, span_danger("Looks like [target]'s groin is covered!")) return - message = (user == target) ? pick("tickles [target.p_them()]self with [src]", "gently teases [target.p_their()] belly with [src]") : pick("teases [target]'s belly with [src]", "uses [src] to tickle [target]'s belly", "tickles [target] with [src]") - if(target.stat == DEAD) - return - if(prob(70)) - target.try_lewd_autoemote(pick("laugh", "giggle", "twitch", "twitch_s")) + message = (user == target) ? pick("tickles [target.p_them()]self with [src]", + "gently teases [target.p_their()] belly with [src]") \ + : pick("teases [target]'s belly with [src]", + "uses [src] to tickle [target]'s belly", + "tickles [target] with [src]") if(BODY_ZONE_CHEST) - targetedsomewhere = TRUE if(carbon_target) var/obj/item/organ/external/genital/badonkers = carbon_target.get_organ_slot(ORGAN_SLOT_BREASTS) - if(!(carbon_target.is_topless() || badonkers.visibility_preference == GENITAL_ALWAYS_SHOW)) - to_chat(user, span_danger("[target]'s chest is covered!")) + if(!badonkers?.is_exposed()) + to_chat(user, span_danger("Looks like [target]'s chest is covered!")) return - message = (user == target) ? pick("tickles [target.p_them()]self with [src]", "gently teases [target.p_their()] own nipples with [src]") : pick("teases [target]'s nipples with [src]", "uses [src] to tickle [target]'s left nipple", "uses [src] to tickle [target]'s right nipple") + + message = (user == target) ? pick("tickles [target.p_them()]self with [src]", + "gently teases [target.p_their()] own nipples with [src]") \ + : pick("teases [target]'s nipples with [src]", + "uses [src] to tickle [target]'s left nipple", + "uses [src] to tickle [target]'s right nipple") else - message = (user == target) ? pick("tickles [target.p_them()]self with [src]", "gently teases [target.p_their()] synthetic body with [src]") : pick("teases [target]'s touch sensors with [src]") - - if(target.stat == DEAD) - return - if(prob(70)) - target.try_lewd_autoemote(pick("laugh", "giggle", "twitch", "twitch_s", "moan", )) - + message = (user == target) ? pick("tickles [target.p_them()]self with [src]", + "gently teases [target.p_their()] synthetic body with [src]") \ + : pick("teases [target]'s touch sensors with [src]") if(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) - targetedsomewhere = TRUE - if(carbon_target && !carbon_target.has_feet()) - to_chat(user, span_danger("[target] doesn't have any feet!")) + if(!carbon_target?.has_feet(REQUIRE_GENITAL_EXPOSED)) + to_chat(user, span_danger("Looks like [target]'s feets are covered!")) return - if(carbon_target && !carbon_target.is_barefoot()) - to_chat(user, span_danger("[target]'s feet are covered!")) - return - message = (user == target) ? pick("tickles [target.p_them()]self with [src]", "gently teases [target.p_their()] own feet with [src]") : pick("teases [target]'s feet with [src]", "uses [src] to tickle [target]'s [user.zone_selected == BODY_ZONE_L_LEG ? "left" : "right"] foot", "uses [src] to tickle [target]'s toes") - if(target.stat == DEAD) - return - if(prob(70)) - target.try_lewd_autoemote(pick("laugh", "giggle", "twitch", "twitch_s", "moan", )) - + message = (user == target) ? pick("tickles [target.p_them()]self with [src]", + "gently teases [target.p_their()] own feet with [src]") \ + : pick("teases [target]'s feet with [src]", + "uses [src] to tickle [target]'s [user.zone_selected == BODY_ZONE_L_LEG ? "left" : "right"] foot", + "uses [src] to tickle [target]'s toes") if(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM) - targetedsomewhere = TRUE - if(carbon_target && !carbon_target.is_topless()) - to_chat(user, span_danger("[target]'s armpits are covered!")) + if(!carbon_target?.is_topless()) + to_chat(user, span_danger("Looks like [target]'s armpits are covered!")) return - message = (user == target) ? pick("tickles [target.p_them()]self with [src]", "gently teases [target.p_their()] own armpit with [src]") : pick("teases [target]'s right armpit with [src]", "uses [src] to tickle [target]'s [user.zone_selected == BODY_ZONE_L_ARM ? "left" : "right"] armpit", "uses [src] to tickle [target]'s underarm") - if(target.stat == DEAD) - return - if(prob(70)) - target.try_lewd_autoemote(pick("laugh", "giggle", "twitch", "twitch_s", "moan", )) - if(!targetedsomewhere) - return + + message = (user == target) ? pick("tickles [target.p_them()]self with [src]", + "gently teases [target.p_their()] own armpit with [src]") \ + : pick("teases [target]'s right armpit with [src]", + "uses [src] to tickle [target]'s [user.zone_selected == BODY_ZONE_L_ARM ? "left" : "right"] armpit", + "uses [src] to tickle [target]'s underarm") + else + return + + if(prob(70)) + target.try_lewd_autoemote(pick("laugh", "giggle", "twitch", "twitch_s", "moan", )) target.do_jitter_animation() target.adjustStaminaLoss(4) target.add_mood_event("tickled", /datum/mood_event/tickled) - if(carbon_target) - carbon_target.adjust_arousal(3) + carbon_target?.adjust_arousal(3) user.visible_message(span_purple("[user] [message]!")) play_lewd_sound(loc, \ pick( diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/fleshlight.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/fleshlight.dm index 02b25ecefd4..a30b4b671b7 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/fleshlight.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/fleshlight.dm @@ -27,6 +27,11 @@ "yellow" = image(icon = src.icon, icon_state = "[base_icon_state]_yellow"), ) +/obj/item/clothing/sextoy/fleshlight/examine(mob/user) + . = ..() + if(!color_changed) + . += span_notice("Alt-click to change it's color.") + /obj/item/clothing/sextoy/fleshlight/Initialize(mapload) . = ..() update_icon() @@ -54,30 +59,33 @@ . = ..() if(!istype(target)) return + if(target.stat == DEAD) + return - var/message = "" if(!target.check_erp_prefs(/datum/preference/toggle/erp/sex_toy, user, src)) to_chat(user, span_danger("[target] doesn't want you to do that!")) return - switch(user.zone_selected) //to let code know what part of body we gonna... Uhh... You get the point. - if(BODY_ZONE_PRECISE_GROIN) - var/obj/item/organ/external/genital/penis = target.get_organ_slot(ORGAN_SLOT_PENIS) - if(!penis) - to_chat(user, span_danger("[target] doesn't have a penis!")) - return - if(!(target.is_bottomless() || penis.visibility_preference == GENITAL_ALWAYS_SHOW)) - to_chat(user, span_danger("[target]'s groin is covered!")) - return - message = (user == target) ? pick("moans in ecstasy as [target.p_they()] use the [src]", "slowly moves [src] up and down on [target]'s penis, causing [target.p_them()] to bend in pleasure", "slightly shivers in pleasure as [target.p_they()] use [src]") : pick("uses [src] on [target]'s penis", "fucks [target] with [src]", "masturbates [target] with [src], causing [target.p_them()] to moan in ecstasy") - if(!(prob(40) && (target.stat != DEAD))) - return - target.try_lewd_autoemote(pick("twitch_s", "moan", "blush")) - target.adjust_arousal(6) - target.adjust_pleasure(9) - user.visible_message(span_purple("[user] [message]!")) - play_lewd_sound(loc, pick('modular_skyrat/modules/modular_items/lewd_items/sounds/bang1.ogg', - 'modular_skyrat/modules/modular_items/lewd_items/sounds/bang2.ogg', - 'modular_skyrat/modules/modular_items/lewd_items/sounds/bang3.ogg', - 'modular_skyrat/modules/modular_items/lewd_items/sounds/bang4.ogg', - 'modular_skyrat/modules/modular_items/lewd_items/sounds/bang5.ogg', - 'modular_skyrat/modules/modular_items/lewd_items/sounds/bang6.ogg'), 70, 1, -1) + + var/obj/item/organ/external/genital/penis = target.get_organ_slot(ORGAN_SLOT_PENIS) + if(!penis?.is_exposed()) + to_chat(user, span_danger("Looks like [target]'s groin is covered!")) + return + + var/message = (user == target) ? pick("moans in ecstasy as [target.p_they()] fuck the [src]", + "slowly moves [src] up and down on [target]'s penis, causing [target.p_them()] to bend in pleasure", + "shivers in pleasure as [target.p_they()] move [src] on their penis") \ + : pick("uses [src] on [target]'s penis", + "fucks [target] with [src]", + "masturbates [target] with [src], causing [target.p_them()] to moan in ecstasy") + + if(prob(70)) + target.try_lewd_autoemote(pick("twitch_s", "moan", "blush")) + target.adjust_arousal(6) + target.adjust_pleasure(9) + user.visible_message(span_purple("[user] [message]!")) + play_lewd_sound(loc, pick('modular_skyrat/modules/modular_items/lewd_items/sounds/bang1.ogg', + 'modular_skyrat/modules/modular_items/lewd_items/sounds/bang2.ogg', + 'modular_skyrat/modules/modular_items/lewd_items/sounds/bang3.ogg', + 'modular_skyrat/modules/modular_items/lewd_items/sounds/bang4.ogg', + 'modular_skyrat/modules/modular_items/lewd_items/sounds/bang5.ogg', + 'modular_skyrat/modules/modular_items/lewd_items/sounds/bang6.ogg'), 70, 1, -1) diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/kinky_shocker.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/kinky_shocker.dm index 1a6db2dcd12..1b4df0da2d7 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/kinky_shocker.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/kinky_shocker.dm @@ -108,193 +108,121 @@ /obj/item/kinky_shocker/attack(mob/living/target, mob/living/user) . = ..() - var/mob/living/carbon/human/carbon_target - if(istype(target,/mob/living/carbon/human)) - carbon_target = target - else if(istype(target,/mob/living/silicon/robot)) - // Just use target var, return if it isn't human or robot - else + var/mob/living/carbon/human/carbon_target = target + if(!carbon_target && !iscyborg(target)) return - if(!istype(user,/mob/living/carbon/human) && !istype(user,/mob/living/silicon/robot)) + if(target.stat == DEAD) return if(!shocker_on) to_chat(user, span_danger("[src] must be enabled before use!")) return - var/message = "" - var/targetedsomewhere = FALSE + if(!target.check_erp_prefs(/datum/preference/toggle/erp/sex_toy, user, src)) to_chat(user, span_danger("[target] doesn't want you to do that.")) return - deductcharge(cell_hit_cost) - play_lewd_sound(loc, 'sound/weapons/taserhit.ogg', 70, 1, -1) + + var/message = "" switch(user.zone_selected) //to let code know what part of body we gonna tickle if(BODY_ZONE_PRECISE_GROIN) - targetedsomewhere = TRUE - if(carbon_target) - var/obj/item/organ/external/genital/penis = carbon_target.get_organ_slot(ORGAN_SLOT_PENIS) - var/obj/item/organ/external/genital/vagina = carbon_target.get_organ_slot(ORGAN_SLOT_VAGINA) - if(vagina && penis) - if(carbon_target.is_bottomless() || (penis.visibility_preference == GENITAL_ALWAYS_SHOW && vagina.visibility_preference == GENITAL_ALWAYS_SHOW)) - message = (user == target) ? pick("leans [src] against [target.p_their()] penis, letting it shock it. Ouch...", - "shocks [target.p_their()] penis with [src]", - "leans [src] against [target.p_their()] vagina, letting it shock it. Ouch...", - "shocks [target.p_their()] pussy with [src]") : pick("uses [src] to shock [target]'s penis", "shocks [target]'s penis with [src]", - "leans [src] against [target]'s penis, turning it on", - "uses [src] to shock [target]'s vagina", - "shocks [target]'s pussy with [src]", - "leans the shocker against [target]'s vagina, turning it on") + var/obj/item/organ/external/genital/penis = target.get_organ_slot(ORGAN_SLOT_PENIS) + var/obj/item/organ/external/genital/vagina = target.get_organ_slot(ORGAN_SLOT_VAGINA) + var/penis_message = (user == target) ? pick("leans [src] against [target.p_their()] penis, letting it shock [target.p_them()]. Ouch...", + "shocks [target.p_their()] penis with [src]") \ + : pick("uses [src] to shock [target]'s penis", + "shocks [target]'s penis with [src]", + "leans [src] against [target]'s penis, turning it on") - else if(carbon_target.is_bottomless() || penis.visibility_preference == GENITAL_ALWAYS_SHOW) - message = (user == target) ? pick("leans [src] against [target.p_their()] penis, letting it shock it. Ouch...", - "shocks [target.p_their()] penis with [src]") : pick("uses [src] to shock [target]'s penis", - "shocks [target]'s penis with [src]", - "leans [src] against [target]'s penis, turning shocker on") + var/vagina_message = (user == target) ? pick("leans [src] against [target.p_their()] vagina, letting it shock [target.p_them()]. Ouch...", + "shocks [target.p_their()] pussy with [src]") \ + : pick("uses [src] to shock [target]'s vagina", + "shocks [target]'s pussy with [src]", + "leans [src] against [target]'s vagina, turning it on") - else if(carbon_target.is_bottomless() || vagina.visibility_preference == GENITAL_ALWAYS_SHOW) - message = (user == target) ? pick("leans [src] against [target.p_their()] vagina, letting it shock it. Ouch...", - "shocks [target.p_their()] pussy with [src]") : pick("uses [src] to shock [target]'s vagina", - "shocks [target]'s pussy with [src]", - "leans [src] against [target]'s vagina, turning it on") - else - to_chat(user, span_danger("Looks like [target]'s groin is covered!")) - return - - else if(penis) - if(carbon_target.is_bottomless() || penis.visibility_preference == GENITAL_ALWAYS_SHOW) - message = (user == target) ? pick("leans [src] against [target.p_their()] penis, letting it shock it. Ouch...", - "shocks [target.p_their()] penis with [src]") : pick("uses [src] to shock [target]'s penis", - "shocks [target]'s penis with [src]", - "leans [src] against [target]'s penis, turning shocker on") - else - to_chat(user, span_danger("Looks like [target]'s groin is covered!")) - return - - else if(vagina) - if(carbon_target.is_bottomless() || vagina.visibility_preference == GENITAL_ALWAYS_SHOW) - message = (user == target) ? pick("leans [src] against [target.p_their()] vagina, letting it shock it. Ouch...", - "shocks [target.p_their()] pussy with [src]") : pick("uses [src] to shock [target]'s vagina", - "shocks [target]'s pussy with [src]", - "leans [src] against [target]'s vagina, turning it on") - else - to_chat(user, span_danger("Looks like [target]'s groin is covered!")) - return - - else - if(carbon_target.is_bottomless()) - message = (user == target) ? pick("leans [src] against [target.p_their()] belly, letting it shock it. Ouch...", - "shocks [target.p_their()] tummy with [src]") : pick("uses [src] to shock [target]'s belly", - "shocks [target]'s tummy with [src]", - "leans [src] against [target]'s belly, turning it on") - else - to_chat(user, span_danger("Looks like [target]'s groin is covered!")) - return + if(penis?.is_exposed() && vagina?.is_exposed()) + message = pick(penis_message, vagina_message) + else if(vagina?.is_exposed()) + message = vagina_message + else if(penis?.is_exposed()) + message = penis_message + else if(carbon_target?.is_bottomless()) + message = (user == target) ? pick("leans [src] against [target.p_their()] belly, letting it shock [target.p_them()]. Ouch...", + "shocks [target.p_their()] tummy with [src]") \ + : pick("uses [src] to shock [target]'s belly", + "shocks [target]'s tummy with [src]", + "leans [src] against [target]'s belly, turning it on") + else if(iscyborg(target)) + message = (user == target) ? pick("leans [src] against [target.p_their()] synthetic genitals, letting it shock [target.p_them()]. Ouch...", + "shocks [target.p_their()] tummy with [src]") \ + : pick("uses [src] to shock [target]'s synthetic genitals", + "shocks [target]'s tummy with [src]", + "leans [src] against [target]'s synthetic genitals, turning it on") else - message = (user == target) ? pick("leans [src] against [target.p_their()] synthetic genitals, letting it shock them. Ouch...", - "shocks [target.p_their()] tummy with [src]") : pick("uses [src] to shock [target]'s synthetic genitals", - "shocks [target]'s tummy with [src]", - "leans [src] against [target]'s synthetic genitals, turning it on") + to_chat(user, span_danger("Looks like [target]'s groin is covered!")) + return if(BODY_ZONE_CHEST) - targetedsomewhere = TRUE - if(carbon_target) - var/obj/item/organ/external/genital/breasts = target.get_organ_slot(ORGAN_SLOT_BREASTS) - if(breasts) - if(breasts.visibility_preference == GENITAL_ALWAYS_SHOW || carbon_target.is_topless()) - message = (user == target) ? pick("leans [src] against [target.p_their()] breasts, letting it shock them.", - "shocks [target.p_their()] tits with [src]") : pick("uses [src] to shock [target]'s breasts", - "shocks [target]'s nipples with [src]", - "leans [src] against [target]'s tits, turning it on") - else - to_chat(user, span_danger("Looks like [target]'s chest is covered!")) - return - - else - if(carbon_target.is_topless()) - message = (user == target) ? pick("leans [src] against [target.p_their()] chest, letting it shock it.", - "shocks [target.p_their()] nipples with [src]") : pick("uses [src] to shock [target]'s chest", - "shocks [target]'s nipples with [src]", - "leans [src] against [target]'s chest, turning it on") - else - to_chat(user, span_danger("Looks like [target]'s chest is covered!")) - return + var/obj/item/organ/external/genital/breasts = target.get_organ_slot(ORGAN_SLOT_BREASTS) + if(breasts?.is_exposed()) + message = (user == target) ? pick("leans [src] against [target.p_their()] breasts, letting it shock [target.p_them()].", + "shocks [target.p_their()] tits with [src]") \ + : pick("uses [src] to shock [target]'s breasts", + "shocks [target]'s nipples with [src]", + "leans [src] against [target]'s tits, turning it on") + else if(carbon_target?.is_topless() || iscyborg(target)) + message = (user == target) ? pick("leans [src] against [target.p_their()] chest, letting it shock [target.p_them()].", + "shocks [target.p_their()] nipples with [src]") \ + : pick("uses [src] to shock [target]'s chest", + "shocks [target]'s nipples with [src]", + "leans [src] against [target]'s chest, turning it on") else - message = (user == target) ? pick("leans [src] against [target.p_their()] chest, letting it shock them.", - "shocks [target.p_their()] body with [src]") : pick("uses [src] to shock [target]'s chest", - "shocks [target]'s body with [src]", - "leans [src] against [target]'s chest, turning it on") + to_chat(user, span_danger("Looks like [target]'s chest is covered!")) + return - if(BODY_ZONE_R_ARM) - targetedsomewhere = TRUE - if(carbon_target) - if(!carbon_target.has_arms()) - to_chat(user, span_danger("[target] doesn't have any arms!")) - return - if(!carbon_target.is_hands_uncovered()) - to_chat(user, span_danger("[target]'s arms are covered!")) - return - message = (user == target) ? pick("leans [src] against [target.p_their()] right arm, letting it shock it.", - "shocks [target.p_their()] arm with [src]") : pick("uses [src] to shock [target]'s right arm", - "shocks [target]'s right arm with [src]", - "leans [src] against [target]'s right arm, turning it on") - - if(BODY_ZONE_L_ARM) - targetedsomewhere = TRUE - if(carbon_target) - if(!carbon_target.has_arms()) - to_chat(user, span_danger("[target] doesn't have any arms!")) - return - if(!carbon_target.is_hands_uncovered()) - to_chat(user, span_danger("[target]'s arms are covered!")) - return - message = (user == target) ? pick("leans [src] against [target.p_their()] left arm, letting it shock it.", - "shocks [target.p_their()] arm with [src]") : pick("uses [src] to shock [target]'s left arm", - "shocks [target]'s left arm with [src]", - "leans [src] against [target]'s left arm, turning it on") + if(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) + if(!carbon_target?.has_arms()) + to_chat(user, span_danger("Looks like [target] doesn't have any arms!")) + return + if(!carbon_target?.is_hands_uncovered()) + to_chat(user, span_danger("Looks like [target]'s arms are covered!")) + return + var/arm = user.zone_selected == BODY_ZONE_L_ARM ? "left arm" : "right arm" + message = (user == target) ? pick("leans [src] against [target.p_their()] [arm], letting it shock [target.p_them()].", + "shocks [target.p_their()] arm with [src]") \ + : pick("uses [src] to shock [target]'s [arm]", + "shocks [target]'s [arm] with [src]", + "leans [src] against [target]'s [arm], turning it on") if(BODY_ZONE_HEAD) - targetedsomewhere = TRUE - if(carbon_target && !carbon_target.is_head_uncovered()) - to_chat(user, span_danger("[target]'s head is covered!")) + if(!carbon_target?.is_head_uncovered()) + to_chat(user, span_danger("Looks like [target]'s head is covered!")) return - message = (user == target) ? pick("leans [src] against [target.p_their()] head, letting it shock it. Ouch! Why would they do that?!", - "shocks [target.p_their()] head with [src]") : pick("uses [src] to shock [target]'s head", - "shocks [target]'s neck with [src]", - "leans [src] against [target]'s neck, turning it on") + message = (user == target) ? pick("leans [src] against [target.p_their()] head, letting it shock [target.p_them()]. Ouch! Why would [target.p_they()] do that?!", + "shocks [target.p_their()] head with [src]") \ + : pick("uses [src] to shock [target]'s head", + "shocks [target]'s neck with [src]", + "leans [src] against [target]'s neck, turning it on") + if(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + if(!carbon_target?.has_feet()) + to_chat(user, span_danger("Looks like [target] doesn't have any legs!")) + return + if(!carbon_target?.is_barefoot()) + to_chat(user, span_danger("Looks like [target]'s toes are covered!")) + return + var/leg = user.zone_selected == BODY_ZONE_L_LEG ? "left leg" : "right leg" + message = (user == target) ? pick("leans [src] against [target.p_their()] [leg], letting it shock [target.p_them()].", + "shocks [target.p_their()] leg with [src]") \ + : pick("uses [src] to shock [target]'s [leg]", + "shocks [target]'s [user.zone_selected == BODY_ZONE_L_LEG ? "left foot" : "right foot"] with [src]", + "leans [src] against [target]'s [leg], turning it on") + else + to_chat(user, span_danger("You can't shock [target] there!")) + return - if(BODY_ZONE_L_LEG) - targetedsomewhere = TRUE - if(carbon_target && !carbon_target.has_feet()) - to_chat(user, span_danger("[target] doesn't have any legs!")) - return - if(carbon_target && !carbon_target.is_barefoot()) - to_chat(user, span_danger("[target]'s toes are covered!")) - return - message = (user == target) ? pick("leans [src] against [target.p_their()] left leg, letting it shock it.", - "shocks [target.p_their()] leg with [src]") : pick("uses [src] to shock [target]'s left leg", - "shocks [target]'s left foot with [src]", - "leans [src] against [target]'s left leg, turning it on") - - if(BODY_ZONE_R_LEG) - targetedsomewhere = TRUE - if(carbon_target && !carbon_target.has_feet()) - to_chat(user, span_danger("[target] doesn't have any legs!")) - return - if(carbon_target && !carbon_target.is_barefoot()) - to_chat(user, span_danger("[target]'s toes are covered!")) - return - message = (user == target) ? pick("leans [src] against [target.p_their()] right leg, letting it shock it.", - "shocks [target.p_their()] leg with [src]") : pick("uses [src] to shock [target]'s right leg", - "shocks [target]'s right foot with [src]", - "leans [src] against [target]'s right leg, turning it on") - - if(!targetedsomewhere) - return user.visible_message(span_purple("[user] [message]!")) - play_lewd_sound(loc, 'sound/weapons/taserhit.ogg') - if(target.stat == DEAD) - return + play_lewd_sound(loc, 'sound/weapons/taserhit.ogg', 70, 1, -1) + deductcharge(cell_hit_cost) if(prob(80)) target.try_lewd_autoemote(pick("twitch", "twitch_s", "shiver", "scream")) target.do_jitter_animation() diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/leather_whip.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/leather_whip.dm index 475936eb6ff..8d50933f73f 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/leather_whip.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/leather_whip.dm @@ -35,8 +35,6 @@ /// Mutable appearance containing the whip's overlay var/mutable_appearance/whip_overlay - /// Assoc list of pain modes - var/list/modes = list("hard" = "weak", "weak" = "hard") /// Phrases to be said when the player attempts to talk when their speech is being modified var/list/moans = list("Mmmph...", "Hmmphh", "Mmmfhg", "Gmmmh...") /// Lower probability phrases to be said when talking. @@ -73,19 +71,19 @@ /// Radial menu helper /obj/item/clothing/mask/leatherwhip/proc/populate_whip_designs() whip_designs = list( - "pink" = image (icon = src.icon, icon_state = "leather_whip_pink_hard"), + "pink" = image(icon = src.icon, icon_state = "leather_whip_pink_hard"), "teal" = image(icon = src.icon, icon_state = "leather_whip_teal_hard")) /// Radial menu helper /obj/item/clothing/mask/leatherwhip/proc/populate_whip_forms() whip_forms = list( - "whip" = image (icon = src.icon, icon_state = "leather_whip_pink_hard"), + "whip" = image(icon = src.icon, icon_state = "leather_whip_pink_hard"), "crotch" = image(icon = src.icon, icon_state = "leather_crotch_pink_hard")) /// Radial menu helper /obj/item/clothing/mask/leatherwhip/proc/populate_whip_types() whip_types = list( - "weak" = image (icon = src.icon, icon_state = "leather_whip_pink_weak"), + "weak" = image(icon = src.icon, icon_state = "leather_whip_pink_weak"), "hard" = image(icon = src.icon, icon_state = "leather_crotch_pink_hard")) /obj/item/clothing/mask/leatherwhip/equipped(mob/target, slot) @@ -99,6 +97,13 @@ update_appearance() update_overlays() +/obj/item/clothing/mask/leatherwhip/examine(mob/user) + . = ..() + if(!color_changed) + . += span_notice("Alt-click to change it's color.") + else if(!form_changed) + . += span_notice("Alt-click to change it's form.") + //to change color /obj/item/clothing/mask/leatherwhip/click_alt(mob/user) if(!color_changed) @@ -110,9 +115,7 @@ update_icon_state() color_changed = TRUE return CLICK_ACTION_SUCCESS - else - if(form_changed) - return CLICK_ACTION_BLOCKING + else if(!form_changed) var/choice = show_radial_menu(user, src, whip_forms, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 36, require_near = TRUE) if(!choice) return CLICK_ACTION_BLOCKING @@ -121,6 +124,7 @@ update_icon_state() form_changed = TRUE return CLICK_ACTION_SUCCESS + return CLICK_ACTION_BLOCKING /// A check to see if the radial menu can be used /obj/item/clothing/mask/leatherwhip/proc/check_menu(mob/living/user) @@ -159,152 +163,135 @@ //safely discipline someone without damage /obj/item/clothing/mask/leatherwhip/attack(mob/living/target, mob/living/user) . = ..() - var/mob/living/carbon/human/carbon_target - if(istype(target,/mob/living/carbon/human)) - carbon_target = target - else if(istype(target,/mob/living/silicon/robot)) - // Just use target var, return if it isn't human or robot - else + if(target.stat == DEAD) return - if(!istype(user,/mob/living/carbon/human) && !istype(user,/mob/living/silicon/robot)) + var/mob/living/carbon/human/carbon_target = target + if(!carbon_target && !iscyborg(target)) return var/message = "" -//and there is code for successful check, so we are whipping someone + //and there is code for successful check, so we are whipping someone if(!target.check_erp_prefs(/datum/preference/toggle/erp/sex_toy, user, src)) to_chat(user, span_danger("[target] doesn't want you to do that.")) return - switch(user.zone_selected) //to let code know what part of body we gonna whip - if(BODY_ZONE_L_LEG) - if(carbon_target && !carbon_target.has_feet()) - to_chat(user, span_danger("[target] is missing their left leg!")) - return - if(current_whip_type == "hard") - message = (user == target) ? pick("Knocks [target.p_them()]self down with [src]", "Uses [src] to knock [target.p_them()]self on the ground") : pick("drops [target] to the ground with [src]", "uses [src] to put [target] on [target.p_their()] knees") - if(target.stat != DEAD) - if(prob(60)) - target.try_lewd_autoemote(pick("gasp", "shiver")) - if(prob(10)) - target.apply_status_effect(/datum/status_effect/subspace) - target.Paralyze(1)//don't touch it. It's domination tool, it should have ability to put someone on kneels. I already inserted check for PREF YOU CAN'T ABUSE THIS ITEM - target.adjust_pain(5) - play_lewd_sound(loc, 'sound/weapons/whip.ogg', 100) - else - message = (user == target) ? pick("knocks [target.p_them()]self down with [src]", "gently uses [src] to knock [target.p_them()]self on the ground") : pick("drops [target] to the ground with [src]", "uses [src] to put [target] on [target.p_their()] knees") - if(target.stat != DEAD) - if(prob(30)) - target.try_lewd_autoemote(pick("gasp", "shiver")) - if(prob(10)) - target.apply_status_effect(/datum/status_effect/subspace) - target.Paralyze(1) - target.adjust_pain(3) - play_lewd_sound(loc, 'sound/weapons/whip.ogg', 60) - if(BODY_ZONE_R_LEG) - if(carbon_target && !carbon_target.has_feet()) - to_chat(user, span_danger("[target] is missing their right leg!")) + switch(user.zone_selected) //to let code know what part of body we gonna whip + if(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + if(!carbon_target?.has_feet()) + to_chat(user, span_danger("Looks like [target] is missing their legs!")) return + if(current_whip_type == "hard") - message = (user == target) ? pick("knocks [target.p_them()]self down with [src]", "uses [src] to knock [target.p_them()]self on the ground") : pick("Hardly drops [target] on the ground with [src]", "uses [src] to put [target] on [target.p_their()] knees") - if(target.stat != DEAD) - if(prob(60)) - target.try_lewd_autoemote(pick("gasp", "shiver")) - if(prob(10)) - target.apply_status_effect(/datum/status_effect/subspace) + message = (user == target) ? pick("Knocks [target.p_them()]self down with [src]", + "Uses [src] to knock [target.p_them()]self on the ground") \ + : pick("drops [target] to the ground with [src]", + "Uses [src] to put [target] on [target.p_their()] knees") + + if(prob(60)) + target.try_lewd_autoemote(pick("gasp", "shiver")) + if(prob(10)) + target.apply_status_effect(/datum/status_effect/subspace) target.Paralyze(1)//don't touch it. It's domination tool, it should have ability to put someone on kneels. I already inserted check for PREF YOU CAN'T ABUSE THIS ITEM target.adjust_pain(5) play_lewd_sound(loc, 'sound/weapons/whip.ogg', 100) else - message = (user == target) ? pick("Knocks [target.p_them()]self down with [src]", "gently uses [src] to knock [target.p_them()]self on the ground") : pick("drops [target] to the ground with [src]", "uses [src] to put [target] on [target.p_their()] knees") - if(target.stat != DEAD) - if(prob(30)) - target.try_lewd_autoemote(pick("gasp", "shiver")) - if(prob(10)) - target.apply_status_effect(/datum/status_effect/subspace) + message = (user == target) ? pick("knocks [target.p_them()]self down with [src]", + "gently uses [src] to knock [target.p_them()]self on the ground") \ + : pick("drops [target] to the ground with [src]", + "uses [src] to put [target] on [target.p_their()] knees") + if(prob(30)) + target.try_lewd_autoemote(pick("gasp", "shiver")) + if(prob(10)) + target.apply_status_effect(/datum/status_effect/subspace) target.Paralyze(1) target.adjust_pain(3) play_lewd_sound(loc, 'sound/weapons/whip.ogg', 60) if(BODY_ZONE_HEAD) - message = (user == target) ? pick("wraps [src] around [target.p_their()] neck, choking [target.p_them()]self", "chokes [target.p_them()]self with [src]") : pick("chokes [target] with [src]", "twines [src] around [target]'s neck!") - if(prob(70) && (target.stat != DEAD)) + message = (user == target) ? pick("wraps [src] around [target.p_their()] neck, choking [target.p_them()]self", + "chokes [target.p_them()]self with [src]") \ + : pick("chokes [target] with [src]", + "twines [src] around [target]'s neck!") + if(prob(70)) target.try_lewd_autoemote(pick("gasp", "choke", "moan")) - if(carbon_target) - carbon_target.adjust_arousal(3) + carbon_target?.adjust_arousal(3) target.adjust_pain(5) play_lewd_sound(loc, 'modular_skyrat/modules/modular_items/lewd_items/sounds/latex.ogg', 80) if(BODY_ZONE_PRECISE_GROIN) - if(carbon_target && !carbon_target.is_bottomless()) - to_chat(user, span_danger("[target]'s butt is covered!")) + if(!carbon_target?.is_bottomless()) + to_chat(user, span_danger("Looks like [target]'s butt is covered!")) return if(current_whip_type == "weak") - message = (user == target) ? pick("whips [target.p_them()]self with [src]", "flogs [target.p_them()]self with [src]") :pick("playfully flogs [target]'s thighs with [src]", "flogs [target] with [src]", "mercilessly flogs [target] with [src]") - if(target.stat != DEAD) - if(prob(70)) - target.try_lewd_autoemote(pick("moan", "twitch")) - if(prob(10)) - target.apply_status_effect(/datum/status_effect/subspace) - if(carbon_target) - carbon_target.adjust_arousal(5) + message = (user == target) ? pick("whips [target.p_them()]self with [src]", + "flogs [target.p_them()]self with [src]") \ + : pick("playfully flogs [target]'s thighs with [src]", + "flogs [target] with [src]", "mercilessly flogs [target] with [src]") + if(prob(70)) + target.try_lewd_autoemote(pick("moan", "twitch")) + if(prob(10)) + target.apply_status_effect(/datum/status_effect/subspace) + carbon_target?.adjust_arousal(5) target.adjust_pain(5) target.apply_status_effect(/datum/status_effect/spanked) - if(HAS_TRAIT(target, TRAIT_MASOCHISM || TRAIT_BIMBO)) + if(HAS_TRAIT(target, TRAIT_MASOCHISM) || HAS_TRAIT(target, TRAIT_BIMBO)) target.add_mood_event("pervert spanked", /datum/mood_event/perv_spanked) play_lewd_sound(loc, 'sound/weapons/whip.ogg', 60) - if(current_whip_type == "hard") - message = (user == target) ? pick("roughly flogs [target.p_them()]self with [src]", "flogs [target.p_them()]self with [src]") : pick("playfully flogs [target]'s thighs with [src]", "flogs [target] with [src]", "mercilessly flogs [target] with [src]") - if(target.stat != DEAD) - if(prob(70)) - target.try_lewd_autoemote(pick("moan", "twitch", "twitch_s", "scream")) - if(prob(10)) - target.apply_status_effect(/datum/status_effect/subspace) - if(carbon_target) - carbon_target.adjust_arousal(3) + else + message = (user == target) ? pick("roughly flogs [target.p_them()]self with [src]", + "flogs [target.p_them()]self with [src]") \ + : pick("playfully flogs [target]'s thighs with [src]", + "flogs [target] with [src]", + "mercilessly flogs [target] with [src]") + if(prob(70)) + target.try_lewd_autoemote(pick("moan", "twitch", "twitch_s", "scream")) + if(prob(10)) + target.apply_status_effect(/datum/status_effect/subspace) + carbon_target?.adjust_arousal(3) target.adjust_pain(8) target.apply_status_effect(/datum/status_effect/spanked) - if(HAS_TRAIT(target, TRAIT_MASOCHISM || TRAIT_BIMBO)) + if(HAS_TRAIT(target, TRAIT_MASOCHISM) || HAS_TRAIT(target, TRAIT_BIMBO)) target.add_mood_event("pervert spanked", /datum/mood_event/perv_spanked) play_lewd_sound(loc, 'sound/weapons/whip.ogg', 100) else if(current_whip_type == "hard") - message = (user == target) ? pick("disciplines [target.p_them()]self with [src]", "lashes [target.p_them()]self with [src]") : pick("lashes [target] with [src]", "Uses [src] to discipline [target]", "disciplines [target] with [src]") - if(target.stat != DEAD) - if(prob(50)) - target.try_lewd_autoemote(pick("moan", "twitch", "twitch_s", "scream")) - if(prob(10)) - target.apply_status_effect(/datum/status_effect/subspace) - target.do_jitter_animation() + message = (user == target) ? pick("disciplines [target.p_them()]self with [src]", + "lashes [target.p_them()]self with [src]") \ + : pick("lashes [target] with [src]", + "Uses [src] to discipline [target]", + "disciplines [target] with [src]") + if(prob(10)) + target.apply_status_effect(/datum/status_effect/subspace) + target.do_jitter_animation() target.adjust_pain(7) play_lewd_sound(loc, 'sound/weapons/whip.ogg', 100) else - message = (user == target) ? pick("whips [target.p_them()]self with [src]", "lashes [target.p_them()]self with [src]") : pick("playfully lashes [target] with [src]", "disciplines [target] with [src]", "gently lashes [target] with [src]") - if(target.stat != DEAD) - if(prob(30)) - target.try_lewd_autoemote(pick("moan", "twitch")) - if(prob(10)) - target.apply_status_effect(/datum/status_effect/subspace) - target.do_jitter_animation() + message = (user == target) ? pick("whips [target.p_them()]self with [src]", + "lashes [target.p_them()]self with [src]") \ + : pick("playfully lashes [target] with [src]", + "disciplines [target] with [src]", + "gently lashes [target] with [src]") + if(prob(30)) + target.try_lewd_autoemote(pick("moan", "twitch")) + if(prob(10)) + target.apply_status_effect(/datum/status_effect/subspace) + target.do_jitter_animation() target.adjust_pain(4) - if(carbon_target) - carbon_target.adjust_arousal(5) + carbon_target?.adjust_arousal(5) play_lewd_sound(loc, 'sound/weapons/whip.ogg', 60) user.visible_message(span_purple("[user] [message]!")) //toggle low pain mode. Because sometimes screaming isn't good /obj/item/clothing/mask/leatherwhip/attack_self(mob/user) - toggle_mode() switch(current_whip_type) if("hard") - to_chat(user, span_notice("[src] is now hard. Someone need to be punished!")) - if("weak") + current_whip_type = "weak" to_chat(user, span_notice("[src] feels softer. Easy mode!")) + if("weak") + current_whip_type = "hard" + to_chat(user, span_notice("[src] is now hard. Someone need to be punished!")) update_icon() update_icon_state() - -/// Switches between hard and weak mode -/obj/item/clothing/mask/leatherwhip/proc/toggle_mode() - current_whip_type = modes[current_whip_type] diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/magic_wand.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/magic_wand.dm index 47edb7c10fa..aa56c1409af 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/magic_wand.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/magic_wand.dm @@ -1,3 +1,8 @@ +#define MAGIC_WAND_MODE_OFF "off" +#define MAGIC_WAND_MODE_LOW "low" +#define MAGIC_WAND_MODE_MEDIUM "medium" +#define MAGIC_WAND_MODE_HIGH "high" + /obj/item/clothing/sextoy/magic_wand name = "magic wand" desc = "Not sure where is magic in this thing, but if you press button - it makes funny vibrations" @@ -10,7 +15,7 @@ lefthand_file = 'modular_skyrat/modules/modular_items/lewd_items/icons/mob/lewd_inhands/lewd_inhand_left.dmi' righthand_file = 'modular_skyrat/modules/modular_items/lewd_items/icons/mob/lewd_inhands/lewd_inhand_right.dmi' /// What mode the vibrator is on - var/vibration_mode = "off" + var/vibration_mode = MAGIC_WAND_MODE_OFF /// Looping sound called on process() var/datum/looping_sound/lewd/vibrator/low/soundloop1 /// Looping sound called on process() @@ -33,7 +38,7 @@ /obj/item/clothing/sextoy/magic_wand/Initialize(mapload) . = ..() - magicwand_overlay = mutable_appearance('modular_skyrat/modules/modular_items/lewd_items/icons/mob/lewd_items/lewd_items.dmi', "magicwand", ABOVE_MOB_LAYER + 0.1) //two arguments + magicwand_overlay = mutable_appearance('modular_skyrat/modules/modular_items/lewd_items/icons/mob/lewd_items/lewd_items.dmi', "magicwand", -BODY_FRONT_UNDER_CLOTHES) //two arguments update_icon_state() update_icon() @@ -56,7 +61,7 @@ /obj/item/clothing/sextoy/magic_wand/lewd_equipped(mob/living/carbon/human/user, slot) . = ..() - if(vibration_mode == "off" || !istype(user)) + if(vibration_mode == MAGIC_WAND_MODE_OFF || !istype(user)) return if(src == user.penis || src == user.vagina) START_PROCESSING(SSobj, src) @@ -72,15 +77,15 @@ var/adjustment_amount = 0 switch(vibration_mode) - if("low") + if(MAGIC_WAND_MODE_LOW) if(current_user.arousal < 30) adjustment_amount = 0.6 - if("medium") + if(MAGIC_WAND_MODE_MEDIUM) if(current_user.arousal < 60) adjustment_amount = 0.8 - if("high") + if(MAGIC_WAND_MODE_HIGH) adjustment_amount = 1 if(!adjustment_amount) @@ -91,37 +96,32 @@ /obj/item/clothing/sextoy/magic_wand/attack(mob/living/target, mob/living/user) . = ..() - - var/mob/living/carbon/human/carbon_target - if(istype(target,/mob/living/carbon/human)) - carbon_target = target - else if(istype(target,/mob/living/silicon/robot)) - // Just use target var, return if it isn't human or robot - else - return FALSE - if(!istype(user,/mob/living/carbon/human) && !istype(user,/mob/living/silicon/robot)) - return FALSE - - var/message = "" - if(vibration_mode == "off") - to_chat(user, span_warning("You must turn on the toy, to use it!")) + if(target.stat == DEAD) + return + var/mob/living/carbon/human/carbon_target = target + if(!carbon_target && !iscyborg(target)) return FALSE if(!target.check_erp_prefs(/datum/preference/toggle/erp/sex_toy, user, src)) to_chat(user, span_danger("Looks like [target] don't want you to do that.")) return FALSE + var/message = "" + if(vibration_mode == MAGIC_WAND_MODE_OFF) + to_chat(user, span_warning("You must turn on the toy, to use it!")) + return FALSE + var/first_adjective = "" var/second_adjective = "" switch(vibration_mode) - if("low") - first_adjective = "gently " - second_adjective = "delicately " + if(MAGIC_WAND_MODE_LOW) + first_adjective = "gently" + second_adjective = "delicately" - if("high") - first_adjective = "roughly " - second_adjective = "aggressively " + if(MAGIC_WAND_MODE_HIGH) + first_adjective = "roughly" + second_adjective = "aggressively" switch(user.zone_selected) if(BODY_ZONE_PRECISE_GROIN) @@ -132,59 +132,75 @@ if(!vagina && !penis) return FALSE - var/currently_bottomless = carbon_target.is_bottomless() - if(!currently_bottomless && !vagina?.visibility_preference && !penis?.visibility_preference) + if(!(vagina?.is_exposed() || penis?.is_exposed())) to_chat(user, span_danger("Looks like [carbon_target]'s groin is covered!")) return FALSE var/target_organs = list() - if(currently_bottomless || penis.visibility_preference == GENITAL_ALWAYS_SHOW) + if(penis?.is_exposed()) target_organs += "penis" - if(currently_bottomless || vagina.visibility_preference == GENITAL_ALWAYS_SHOW) + if(vagina?.is_exposed()) target_organs += "vagina" if(!length(target_organs)) return FALSE var/organ_to_use = pick(target_organs) - message = (user == target) ? pick("massages their [organ_to_use] with the [src]", "[first_adjective]teases their [organ_to_use] with [src]") : pick("[second_adjective]massages [target]'s [organ_to_use] with [src]", "uses [src] to [first_adjective]massage [target]'s [organ_to_use]", "leans the vibrator against [target]'s [organ_to_use]") - carbon_target.adjust_arousal((vibration_mode == "low" ? 4 : (vibration_mode == "high" ? 8 : 5))) - carbon_target.adjust_pleasure((vibration_mode == "low" ? 2 : (vibration_mode == "high" ? 10 : 5))) + message = (user == target) ? pick("massages their [organ_to_use] with the [src]", + "[first_adjective] teases their [organ_to_use] with [src]") \ + : pick("[second_adjective] massages [target]'s [organ_to_use] with [src]", + "uses [src] to [first_adjective] massage [target]'s [organ_to_use]", + "leans the vibrator against [target]'s [organ_to_use]") + carbon_target.adjust_arousal(vibration_mode == MAGIC_WAND_MODE_LOW ? 4 : (vibration_mode == MAGIC_WAND_MODE_HIGH ? 8 : 5)) + carbon_target.adjust_pleasure(vibration_mode == MAGIC_WAND_MODE_LOW ? 2 : (vibration_mode == MAGIC_WAND_MODE_HIGH ? 10 : 5)) else - message = (user == target) ? pick("massages their synthetic genitals with the [src]", "[first_adjective]teases their synthetic genitals with [src]") : pick("[second_adjective]massages [target]'s synthetic genitals with [src]", "uses [src] to [first_adjective]massage [target]'s synthetic genitals", "leans the vibrator against [target]'s synthetic genitals") + message = (user == target) ? pick("massages their synthetic genitals with the [src]", + "[first_adjective] teases their synthetic genitals with [src]") \ + : pick("[second_adjective] massages [target]'s synthetic genitals with [src]", + "uses [src] to [first_adjective] massage [target]'s synthetic genitals", + "leans the vibrator against [target]'s synthetic genitals") if(BODY_ZONE_CHEST) if(carbon_target) var/obj/item/organ/external/genital/breasts = carbon_target.get_organ_slot(ORGAN_SLOT_BREASTS) - if(!(carbon_target.is_topless() || breasts.visibility_preference == GENITAL_ALWAYS_SHOW)) + if(!breasts?.is_exposed()) to_chat(user, span_danger("Looks like [target]'s chest is covered!")) return FALSE var/breasts_or_nipples = breasts ? ORGAN_SLOT_BREASTS : ORGAN_SLOT_NIPPLES - message = (user == target) ? pick("massages their [breasts_or_nipples] with the [src]", "[first_adjective]teases their [breasts ? "tits" : ORGAN_SLOT_NIPPLES] with [src]") : pick("[second_adjective]teases [target]'s [breasts_or_nipples] with [src]", "uses [src] to[vibration_mode == " low" ? " slowly" : ""] massage [target]'s [breasts ? "tits" : ORGAN_SLOT_NIPPLES]", "uses [src] to tease [target]'s [breasts ? "boobs" : ORGAN_SLOT_NIPPLES]") - carbon_target.adjust_arousal((vibration_mode == "low" ? 3 : (vibration_mode == "high" ? 7 : 4))) - carbon_target.adjust_pleasure((vibration_mode == "low" ? 1 : (vibration_mode == "high" ? 9 : 4))) + message = (user == target) ? pick("massages their [breasts_or_nipples] with the [src]", + "[first_adjective] teases their [breasts ? "tits" : ORGAN_SLOT_NIPPLES] with [src]") \ + : pick("[second_adjective] teases [target]'s [breasts_or_nipples] with [src]", + "uses [src] to [vibration_mode == MAGIC_WAND_MODE_LOW ? "slowly" : ""] massage [target]'s [breasts ? "tits" : ORGAN_SLOT_NIPPLES]", + "uses [src] to tease [target]'s [breasts ? "boobs" : ORGAN_SLOT_NIPPLES]") + carbon_target.adjust_arousal((vibration_mode == MAGIC_WAND_MODE_LOW ? 3 : (vibration_mode == MAGIC_WAND_MODE_HIGH ? 7 : 4))) + carbon_target.adjust_pleasure((vibration_mode == MAGIC_WAND_MODE_LOW ? 1 : (vibration_mode == MAGIC_WAND_MODE_HIGH ? 9 : 4))) else - message = (user == target) ? pick("massages their bodily touch sensors with the [src]", "[first_adjective]teases their bodily touch sensors with [src]") : pick("[second_adjective]teases [target]'s bodily touch sensors with [src]", "uses [src] to[vibration_mode == " low" ? " slowly" : ""] massage [target]'s bodily touch sensors", "uses [src] to tease [target]'s bodily touch sensors") + message = (user == target) ? pick("massages their touch sensors with the [src]", + "[first_adjective] teases their touch sensors with [src]") \ + : pick("[second_adjective] teases [target]'s touch sensors with [src]", + "uses [src] to [vibration_mode == MAGIC_WAND_MODE_LOW ? "slowly" : ""] massage [target]'s touch sensors", + "uses [src] to tease [target]'s touch sensors") if(prob(30)) target.try_lewd_autoemote(pick("twitch_s", "moan")) user.visible_message(span_purple("[user] [message]!")) - play_lewd_sound(loc, 'modular_skyrat/modules/modular_items/lewd_items/sounds/vibrate.ogg', (vibration_mode == "low" ? 10 : (vibration_mode == "high" ? 30 : 20)), TRUE, pref_to_check = /datum/preference/toggle/erp/sex_toy_sounds) + play_lewd_sound(loc, 'modular_skyrat/modules/modular_items/lewd_items/sounds/vibrate.ogg', (vibration_mode == MAGIC_WAND_MODE_LOW ? 10 : (vibration_mode == MAGIC_WAND_MODE_HIGH ? 30 : 20)), TRUE, pref_to_check = /datum/preference/toggle/erp/sex_toy_sounds) /obj/item/clothing/sextoy/magic_wand/attack_self(mob/user) toggle_mode() + switch(vibration_mode) - if("low") - to_chat(user, span_notice("Vibration mode now is low. Bzzz...")) - if("medium") - to_chat(user, span_notice("Vibration mode now is medium. Bzzzz!")) - if("high") - to_chat(user, span_notice("Vibration mode now is high. Careful with that thing.")) - if("off") - to_chat(user, span_notice("[src] is now turned off. Fun time's over?")) + if(MAGIC_WAND_MODE_LOW) + to_chat(user, span_notice("Vibrator mode switched to low. Bzzz...")) + if(MAGIC_WAND_MODE_MEDIUM) + to_chat(user, span_notice("Vibrator mode switched to medium. Bzzzz!")) + if(MAGIC_WAND_MODE_HIGH) + to_chat(user, span_notice("Vibrator mode switched to high. Careful with that thing.")) + if(MAGIC_WAND_MODE_OFF) + to_chat(user, span_notice("[src] is turned off. Fun time's over?")) update_icon() update_icon_state() @@ -197,19 +213,24 @@ switch(vibration_mode) if("off") soundloop1.start() - vibration_mode = "low" + vibration_mode = MAGIC_WAND_MODE_LOW if("low") soundloop1.stop() soundloop2.start() - vibration_mode = "medium" + vibration_mode = MAGIC_WAND_MODE_MEDIUM if("medium") soundloop2.stop() soundloop3.start() - vibration_mode = "high" + vibration_mode = MAGIC_WAND_MODE_HIGH if("high") play_lewd_sound(loc, 'sound/weapons/magout.ogg', 20, TRUE) soundloop3.stop() - vibration_mode = "off" + vibration_mode = MAGIC_WAND_MODE_OFF + +#undef MAGIC_WAND_MODE_OFF +#undef MAGIC_WAND_MODE_LOW +#undef MAGIC_WAND_MODE_MEDIUM +#undef MAGIC_WAND_MODE_HIGH diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/spanking_pad.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/spanking_pad.dm index 81952e5b210..e55d3f3b762 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/spanking_pad.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/spanking_pad.dm @@ -43,6 +43,11 @@ icon_state = "[base_icon_state]_[current_color]" inhand_icon_state = "[base_icon_state]_[current_color]" +/obj/item/spanking_pad/examine(mob/user) + . = ..() + if(!color_changed) + . += span_notice("Alt-click to change it's color.") + /obj/item/spanking_pad/click_alt(mob/user) if(color_changed) return CLICK_ACTION_BLOCKING @@ -57,35 +62,35 @@ /obj/item/spanking_pad/attack(mob/living/target, mob/living/user) . = ..() - var/mob/living/carbon/human/carbon_target - if(istype(target,/mob/living/carbon/human)) - carbon_target = target - else if(istype(target,/mob/living/silicon/robot)) - // Just use target var, return if it isn't human or robot - else + if(target.stat == DEAD) return - if(!istype(user,/mob/living/carbon/human) && !istype(user,/mob/living/silicon/robot)) + var/mob/living/carbon/human/carbon_target = target + if(!carbon_target && !iscyborg(target)) return var/message = "" if(!target.check_erp_prefs(/datum/preference/toggle/erp/sex_toy, user, src)) to_chat(user, span_danger("[target] doesn't want you to do that.")) return - switch(user.zone_selected) //to let code know what part of body we gonna spank. - if(BODY_ZONE_PRECISE_GROIN) - if(carbon_target && !carbon_target.is_bottomless()) - to_chat(user, span_danger("[target]'s butt is covered!")) - return - message = (user == target) ? pick("spanks themselves with [src]", "uses [src] to slap their hips") : pick("slaps [target]'s hips with [src]", "uses [src] to slap [target]'s butt", "spanks [target] with [src], making a loud slapping noise", "slaps [target]'s thighs with [src]") - if(prob(40) && (target.stat != DEAD)) - target.try_lewd_autoemote(pick("twitch_s", "moan", "blush", "gasp")) - if(carbon_target) - carbon_target.adjust_arousal(2) - target.adjust_pain(4) - target.apply_status_effect(/datum/status_effect/spanked) - if(HAS_TRAIT(target, TRAIT_MASOCHISM || TRAIT_BIMBO)) - target.add_mood_event("pervert spanked", /datum/mood_event/perv_spanked) - if(prob(10) && (target.stat != DEAD)) - target.apply_status_effect(/datum/status_effect/subspace) - user.visible_message(span_purple("[user] [message]!")) - play_lewd_sound(loc, 'modular_skyrat/modules/modular_items/lewd_items/sounds/slap.ogg', 100, 1, -1) + + if(!carbon_target?.is_bottomless() && !iscyborg(target)) + to_chat(user, span_danger("[target]'s butt is covered!")) + return + + message = (user == target) ? pick("spanks themselves with [src]", + "uses [src] to slap their hips") \ + : pick("slaps [target]'s hips with [src]", + "uses [src] to slap [target]'s butt", + "spanks [target] with [src], making a loud slapping noise", + "slaps [target]'s thighs with [src]") + user.visible_message(span_purple("[user] [message]!")) + play_lewd_sound(loc, 'modular_skyrat/modules/modular_items/lewd_items/sounds/slap.ogg', 100, 1, -1) + if(prob(40)) + target.try_lewd_autoemote(pick("twitch_s", "moan", "blush", "gasp")) + if(prob(10)) + target.apply_status_effect(/datum/status_effect/subspace) + if(HAS_TRAIT(target, TRAIT_MASOCHISM) || HAS_TRAIT(target, TRAIT_BIMBO)) + target.add_mood_event("pervert spanked", /datum/mood_event/perv_spanked) + carbon_target?.adjust_arousal(2) + target.adjust_pain(4) + target.apply_status_effect(/datum/status_effect/spanked) diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/torture_candle.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/torture_candle.dm index 3d24a3b649e..ee76fd9a070 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/torture_candle.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/torture_candle.dm @@ -108,10 +108,15 @@ open_flame() update_brightness() +/obj/item/bdsm_candle/examine(mob/user) + . = ..() + if(!color_changed && !lit) + . += span_notice("Alt-click to change it's color.") + else if(lit) + . += span_notice("Alt-click to snuff the flame out.") + /obj/item/bdsm_candle/click_alt(mob/user) - if(!lit) - if(color_changed) - return CLICK_ACTION_BLOCKING + if(!lit && !color_changed) var/choice = show_radial_menu(user, src, candle_designs, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 36, require_near = TRUE) if(!choice) return CLICK_ACTION_BLOCKING @@ -133,69 +138,70 @@ /obj/item/bdsm_candle/attack(mob/living/carbon/human/attacked, mob/living/carbon/human/user) . = ..() + if(attacked.stat == DEAD) + return if(!istype(attacked)) return var/message = "" - var/targeted_somewhere - if(!lit) - to_chat(user, span_danger("[src] needs to be lit to produce wax!")) - return if(!attacked.check_erp_prefs(/datum/preference/toggle/erp/sex_toy, user, src)) to_chat(user, span_danger("It looks like [attacked] don't want you to do that.")) return + if(!lit) + to_chat(user, span_danger("[src] needs to be lit to produce wax!")) + return switch(user.zone_selected) //to let code know what part of body we gonna wax if(BODY_ZONE_PRECISE_GROIN) - targeted_somewhere = TRUE var/obj/item/organ/external/genital/penis = attacked.get_organ_slot(ORGAN_SLOT_PENIS) var/obj/item/organ/external/genital/vagina = attacked.get_organ_slot(ORGAN_SLOT_VAGINA) - if((vagina && penis) && (attacked.is_bottomless() || vagina.visibility_preference == GENITAL_ALWAYS_SHOW && penis.visibility_preference == GENITAL_ALWAYS_SHOW)) - message = (user == attacked) ? pick("drips some wax on [attacked.p_their()] genitals, moaning in pleasure", - "drips some wax on [attacked.p_them()]self, moaning in pleasure as it reaches [attacked.p_their()] genitals") : pick( - "drips wax right on [attacked]'s genitalia. It slightly itches", - "drips hot wax from the [src] onto [attacked]'s genitalia, causing [attacked.p_them()] to shiver", - "tilts [src], dripping wax right onto [attacked]'s genitals, causing [attacked.p_them()] to moan", - "drips some wax onto [attacked]'s genitals, making [attacked.p_them()] moan in pleasure") - attacked.adjust_pain(PAIN_DEFAULT) + var/penis_message = (user == attacked) ? pick("drips some wax on [attacked.p_their()] penis, causing [attacked.p_them()] to moan in pleasure.", + "drips some wax on [attacked.p_them()]self, letting it reach [attacked.p_their()] penis.") \ + : pick("drips wax right on [attacked]'s penis. It slightly itches.", + "drips hot wax from [src] onto [attacked]'s penis, [attacked.p_they()] shivers slightly.", + "tilts the candle. Drops of wax, dripping from [src] onto [attacked]'s penis, made [attacked.p_them()] moan.") - else if(penis && (attacked.is_bottomless() || penis.visibility_preference == GENITAL_ALWAYS_SHOW)) - message = (user == attacked) ? pick("drips some wax on [attacked.p_their()] penis, causing [attacked.p_them()] to moan in pleasure", - "drips some wax on themselves, letting it reach his penis. he moans in pleasure.") : pick( - "drips wax right on [attacked]'s penis. It slightly itches.", - "drips hot wax from the [src] on the [attacked]'s penis, he slightly shivers.", - "tilts the candle. Drops of wax, dripping right from [src] right on the [attacked]'s penis, made him moan.") - attacked.adjust_pain(PAIN_DEFAULT) - - else if(vagina && (attacked.is_bottomless() || vagina.visibility_preference == GENITAL_ALWAYS_SHOW)) - message = (user == attacked) ? pick("drips some wax on themselves, letting it reach his vagina. He moans in pleasure.", "drips some wax on the [attacked]'s pussy, he moans in pleasure") : pick("drips some wax on the [attacked]'s vagina, he moans in pleasure", "tilts the candle. Wax slowly goes down, reaching the [attacked]'s vagina.", "tilts the candle. Drops of wax, dripping right from [src] right on the [attacked]'s pussy, made him moan.") - attacked.adjust_pain(PAIN_DEFAULT) + var/vagina_message = (user == attacked) ? pick("drips some wax on [attacked.p_them()]self, letting it reach [attacked.p_their()] vagina.", + "drips some wax onto [attacked.p_their()] pussy as [attacked.p_they()] moan in pleasure") \ + : pick("drips some wax on [attacked]'s vagina.", + "tilts the candle as the wax slowly drops down, reaching [attacked]'s vagina.", + "tilts the candle. Drops of wax, dripping from [src] onto [attacked]'s pussy, made [attacked.p_them()] moan.") + if(vagina?.is_exposed() && penis?.is_exposed()) + message = pick(penis_message, vagina_message) + else if(penis?.is_exposed()) + message = penis_message + else if(vagina?.is_exposed()) + message = vagina_message else if(attacked.is_bottomless()) - message = (user == attacked) ? pick("drips some wax on themselves, letting it reach his belly. He moans in pleasure.", "drips some wax on the [attacked]'s tummy, he moans in pleasure") : pick("drips some wax on the [attacked]'s belly, he moans in pleasure", "tilts the candle. Wax slowly goes down, reaching the [attacked]'s tummy.", "tilts the candle. Drops of wax, dripping right from [src] right on the [attacked]'s groin, made him moan.") - attacked.adjust_pain(PAIN_DEFAULT) - + message = (user == attacked) ? pick("drips some wax on [attacked.p_them()]self, letting it reach [attacked.p_their()] belly as [attacked.p_they()] moan in pleasure.", + "drips some wax on [attacked]'s tummy") \ + : pick("drips some wax on [attacked]'s belly", + "tilts the candle as the wax slowly drops down, reaching [attacked]'s tummy.", + "tilts the candle. Drops of wax, dripping from [src] onto [attacked]'s groin, made [attacked.p_them()] moan.") else to_chat(user, span_danger("Looks like [attacked]'s groin is covered!")) return + attacked.adjust_pain(PAIN_DEFAULT) if(BODY_ZONE_CHEST) - targeted_somewhere = TRUE var/obj/item/organ/external/genital/breasts = attacked.get_organ_slot(ORGAN_SLOT_BREASTS) - if(attacked.is_topless() || breasts.visibility_preference == GENITAL_ALWAYS_SHOW) + if(breasts?.is_exposed()) var/breasts_or_nipples = breasts ? ORGAN_SLOT_BREASTS : ORGAN_SLOT_NIPPLES - message = (user == attacked) ? pick("drips some wax on [attacked.p_their()] [breasts_or_nipples], releasing all [attacked.p_their()] lustness", "drips some wax right on [attacked.p_their()] [breasts ? "tits" : "chest"], making [attacked.p_their()] feel faint.") : pick("pours the wax that is slowly dripping from [src] onto [attacked]'s [breasts_or_nipples], [attacked.p_they()] shows pure enjoyment.", "tilts the candle. Right in the moment when wax drips on [attacked]'s [breasts_or_nipples], [attacked.p_they()] shivers", "tilts the candle. Just when hot drops of wax fell on [attacked]'s [breasts_or_nipples], [attacked.p_they()] quietly moans in pleasure") + message = (user == attacked) ? pick("drips some wax on [attacked.p_their()] [breasts_or_nipples], releasing all [attacked.p_their()] lustness", + "drips some wax right on [attacked.p_their()] [breasts ? "tits" : "chest"], making [attacked.p_their()] feel faint.") \ + : pick("pours the wax that is slowly dripping from [src] onto [attacked]'s [breasts_or_nipples], [attacked.p_they()] shows pure enjoyment.", + "tilts the candle. Right in the moment when wax drips on [attacked]'s [breasts_or_nipples], [attacked.p_they()] shivers", + "tilts the candle. Just when hot drops of wax fell on [attacked]'s [breasts_or_nipples], [attacked.p_they()] quietly moans in pleasure") attacked.adjust_pain(PAIN_DEFAULT * 0.66) else to_chat(user, span_danger("Looks like [attacked]'s chest is covered!")) return - - if(!targeted_somewhere) - return - if(attacked.stat != DEAD) - attacked.do_jitter_animation() - if(prob(50)) - attacked.try_lewd_autoemote(pick("twitch_s" , "gasp", "shiver")) + else + return + attacked.do_jitter_animation() + if(prob(50)) + attacked.try_lewd_autoemote(pick("twitch_s" , "gasp", "shiver")) user.visible_message(span_purple("[user] [message]!")) play_lewd_sound(loc, pick('modular_skyrat/modules/modular_items/lewd_items/sounds/vax1.ogg', 'modular_skyrat/modules/modular_items/lewd_items/sounds/vax2.ogg'), 70, TRUE) diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/vibrator.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/vibrator.dm index 35b8ce8855e..c723119054c 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/vibrator.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/vibrator.dm @@ -1,6 +1,11 @@ #define DEFAULT_AROUSAL_INCREASE 4 #define DEFAULT_PLEASURE_INCREASE 2 +#define VIB_OFF "off" +#define VIB_LOW "low" +#define VIB_MEDIUM "medium" +#define VIB_HIGH "hard" + //This code huge and blocky, but we're working on update for... my god, 4 months. If you can upgrade it - do it, but don't remove or break something, test carefully. This item is insertable. /obj/item/clothing/sextoy/vibrator name = "vibrator" @@ -19,9 +24,7 @@ /// If the color has been changed before var/color_changed = FALSE /// Current vibration mode of the toy - var/vibration_mode = "off" - /// Assoc list of modes and what they'll convert to - var/list/modes = list("low" = "medium", "medium" = "hard", "hard" = "off", "off" = "low") + var/vibration_mode = VIB_OFF /// Looping sound used for the toy's audible bit var/datum/looping_sound/lewd/vibrator/low/soundloop1 /// Looping sound used for the toy's audible bit @@ -42,6 +45,11 @@ "yellow" = image(icon = src.icon, icon_state = "vibrator_yellow_low"), "green" = image(icon = src.icon, icon_state = "vibrator_green_low")) +/obj/item/clothing/sextoy/vibrator/examine(mob/user) + . = ..() + if(!color_changed) + . += span_notice("Alt-click to change it's design.") + /obj/item/clothing/sextoy/vibrator/click_alt(mob/user) if(color_changed) return @@ -93,13 +101,13 @@ if(!istype(user)) return if(toy_on) - if(vibration_mode == "low" && user.arousal < 40) //prevent non-stop cumming from wearing this thing + if(vibration_mode == VIB_LOW && user.arousal < 40) //prevent non-stop cumming from wearing this thing user.adjust_arousal(0.7 * seconds_per_tick) user.adjust_pleasure(0.7 * seconds_per_tick) - if(vibration_mode == "medium" && user.arousal < 70) + if(vibration_mode == VIB_MEDIUM && user.arousal < 70) user.adjust_arousal(1 * seconds_per_tick) user.adjust_pleasure(1 * seconds_per_tick) - if(vibration_mode == "hard") //no mercy + if(vibration_mode == VIB_HIGH) //no mercy user.adjust_arousal(1.5 * seconds_per_tick) user.adjust_pleasure(1.5 * seconds_per_tick) else if(!toy_on && user.arousal < 30) @@ -109,11 +117,12 @@ //SHITCODESHITCODESHITCODESHITCODESHITCODESHITCODESHITCODESHITCODESHITCODESHITCODESHITCODESHITCODESHITCODESHITCODESHITCODESHITCODE /obj/item/clothing/sextoy/vibrator/attack(mob/living/carbon/human/target, mob/living/carbon/human/user) . = ..() + if(target.stat == DEAD) + return if(!istype(target)) return var/message = "" - var/targetedsomewhere = FALSE if(!toy_on) to_chat(user, span_notice("[src] must be on to use it!")) return @@ -121,87 +130,106 @@ to_chat(user, span_danger("Looks like [target] don't want you to do that.")) return + var/vibration_adj = "" + switch(vibration_mode) + if(VIB_LOW) + vibration_adj = pick("gently", "delicately") + if(VIB_HIGH) + vibration_adj = pick("roughly", "aggressively") + switch(user.zone_selected) //to let code know what part of body we gonna vibe if(BODY_ZONE_PRECISE_GROIN) - targetedsomewhere = TRUE var/obj/item/organ/external/genital/penis = target.get_organ_slot(ORGAN_SLOT_PENIS) var/obj/item/organ/external/genital/vagina = target.get_organ_slot(ORGAN_SLOT_VAGINA) - if((vagina && penis) && (vagina.visibility_preference == GENITAL_ALWAYS_SHOW && penis.visibility_preference == GENITAL_ALWAYS_SHOW || target.is_bottomless())) - message = (user == target) ? pick("massages their vagina with the [src]", "[vibration_mode == "low" ? "gently" : ""][vibration_mode = "hard" ? "roughly" : ""] teases their pussy with [src]", "massages their penis with the [src]", "[vibration_mode == "low" ? "gently" : ""][vibration_mode = "hard" ? "roughly" : ""] teases their penis with [src]") : pick("[vibration_mode == "low" ? "delicately" : ""][vibration_mode = "hard" ? "aggressively" : ""] massages [target]'s vagina with [src]", "uses [src] to [vibration_mode == "low" ? "gently" : ""][vibration_mode = "hard" ? "roughly" : ""] massage [target]'s crotch", "leans the massager against [target]'s pussy", "[vibration_mode == "low" ? "delicately" : ""][vibration_mode = "hard" ? "aggressively" : ""] massages [target]'s penis with [src]", "uses [src] to [vibration_mode == "low" ? "gently" : ""][vibration_mode = "hard" ? "roughly" : ""] massage [target]'s penis", "leans the massager against [target]'s penis") - target.adjust_arousal(DEFAULT_AROUSAL_INCREASE) - target.adjust_pleasure(DEFAULT_PLEASURE_INCREASE) - - else if(vagina && (vagina.visibility_preference == GENITAL_ALWAYS_SHOW || target.is_bottomless())) - message = (user == target) ? pick("massages their vagina with the [src]", "[vibration_mode == "low" ? "gently" : ""][vibration_mode = "hard" ? "roughly" : ""] teases their pussy with [src]") : pick("[vibration_mode == "low" ? "delicately" : ""][vibration_mode = "hard" ? "aggressively" : ""] massages [target]'s vagina with [src]", "uses [src] to [vibration_mode == "low" ? "gently" : ""][vibration_mode = "hard" ? "roughly" : ""] massage [target]'s crotch", "leans the massager against [target]'s pussy") - target.adjust_arousal(DEFAULT_AROUSAL_INCREASE) - target.adjust_pleasure(DEFAULT_PLEASURE_INCREASE) - - else if(penis && (penis.visibility_preference == GENITAL_ALWAYS_SHOW || target.is_bottomless())) - message = (user == target) ? pick("massages their penis with the [src]", "[vibration_mode == "low" ? "gently" : ""][vibration_mode = "hard" ? "roughly" : ""] teases their penis with [src]") : pick("[vibration_mode == "low" ? "delicately" : ""][vibration_mode = "hard" ? "aggressively" : ""] massages [target]'s penis with [src]", "uses [src] to [vibration_mode == "low" ? "gently" : ""][vibration_mode = "hard" ? "roughly" : ""] massage [target]'s penis", "leans the massager against [target]'s penis") - target.adjust_arousal(DEFAULT_AROUSAL_INCREASE) - target.adjust_pleasure(DEFAULT_PLEASURE_INCREASE) - + var/penis_message = (user == target) ? pick("massages their penis with the [src]", + "[vibration_adj] teases their penis with [src]") \ + : pick("[vibration_adj] massages [target]'s penis with [src]", + "uses [src] to [vibration_adj] massage [target]'s penis", + "leans the massager against [target]'s penis") + var/vagina_message = (user == target) ? pick("massages their vagina with the [src]", + "[vibration_adj] teases their pussy with [src]") \ + : pick("[vibration_adj] massages [target]'s vagina with [src]", + "uses [src] to [vibration_adj] massage [target]'s crotch", + "leans the massager against [target]'s pussy") + if(vagina?.is_exposed() && penis?.is_exposed()) + message = pick(penis_message, vagina_message) + else if(vagina?.is_exposed()) + message = vagina_message + else if(penis?.is_exposed()) + message = penis_message else to_chat(user, span_danger("Looks like [target]'s groin is covered!")) return - if(prob(50) && (target.stat != DEAD)) + target.adjust_arousal(DEFAULT_AROUSAL_INCREASE) + target.adjust_pleasure(DEFAULT_PLEASURE_INCREASE) + if(prob(50)) target.try_lewd_autoemote(pick("twitch_s", "moan", "blush")) if(BODY_ZONE_CHEST) - targetedsomewhere = TRUE var/obj/item/organ/external/genital/breasts = target.get_organ_slot(ORGAN_SLOT_BREASTS) - if(target.is_topless() || breasts.visibility_preference == GENITAL_ALWAYS_SHOW) + if(breasts?.is_exposed()) var/breasts_or_nipples = breasts ? ORGAN_SLOT_BREASTS : ORGAN_SLOT_NIPPLES - message = (user == target) ? pick("massages their [breasts_or_nipples] with the [src]", "[vibration_mode == "low" ? "gently" : ""][vibration_mode = "hard" ? "roughly" : ""] teases their tits with [src]") : pick("[vibration_mode == "low" ? "delicately" : ""][vibration_mode = "hard" ? "aggressively" : ""] teases [target]'s [breasts_or_nipples] with [src]", "uses [src] to[vibration_mode == "low" ? " slowly" : ""] massage [target]'s [breasts ? "tits" : ORGAN_SLOT_NIPPLES]", "uses [src] to tease [target]'s [breasts ? "boobs" : ORGAN_SLOT_NIPPLES]", "rubs [target]'s [breasts ? "tits" : ORGAN_SLOT_NIPPLES] with [src]") - target.adjust_arousal(DEFAULT_AROUSAL_INCREASE) - target.adjust_pleasure(DEFAULT_PLEASURE_INCREASE * 0.5) - if(prob(30) && (target.stat != DEAD)) - target.try_lewd_autoemote(pick("twitch_s", "moan")) - + message = (user == target) ? pick("massages their [breasts_or_nipples] with the [src]", + "[vibration_adj] teases their tits with [src]") \ + : pick("[vibration_adj] teases [target]'s [breasts_or_nipples] with [src]", + "uses [src] to [vibration_adj] massage [target]'s [breasts ? "tits" : ORGAN_SLOT_NIPPLES]", + "uses [src] to tease [target]'s [breasts ? "boobs" : ORGAN_SLOT_NIPPLES]", + "rubs [target]'s [breasts ? "tits" : ORGAN_SLOT_NIPPLES] with [src]") else to_chat(user, span_danger("Looks like [target]'s chest is covered!")) return - if(!targetedsomewhere) - return + + target.adjust_arousal(DEFAULT_AROUSAL_INCREASE) + target.adjust_pleasure(DEFAULT_PLEASURE_INCREASE * 0.5) + if(prob(30)) + target.try_lewd_autoemote(pick("twitch_s", "moan")) + else + return user.visible_message(span_purple("[user] [message]!")) play_lewd_sound(loc, 'modular_skyrat/modules/modular_items/lewd_items/sounds/vibrate.ogg', 10, TRUE) /obj/item/clothing/sextoy/vibrator/attack_self(mob/user, obj/item/attack_item) toggle_mode() switch(vibration_mode) - if("low") + if(VIB_LOW) to_chat(user, span_notice("Vibration mode now is low. Bzzz...")) - if("medium") + if(VIB_MEDIUM) to_chat(user, span_notice("Vibration mode now is medium. Bzzzz!")) - if("hard") - to_chat(user, span_notice("Vibration mode now is hard. Careful with that thing.")) - if("off") + if(VIB_HIGH) + to_chat(user, span_notice("Vibration mode now is high. Careful with that thing.")) + if(VIB_OFF) to_chat(user, span_notice("Vibrator turned off. Fun's over?")) update_icon() update_icon_state() /obj/item/clothing/sextoy/vibrator/proc/toggle_mode() - vibration_mode = modes[vibration_mode] switch(vibration_mode) - if("low") + if(VIB_OFF) + vibration_mode = VIB_LOW toy_on = TRUE play_lewd_sound(loc, 'sound/weapons/magin.ogg', 20, TRUE) soundloop1.start() - if("medium") - toy_on = TRUE + if(VIB_LOW) + vibration_mode = VIB_MEDIUM play_lewd_sound(loc, 'sound/weapons/magin.ogg', 20, TRUE) soundloop1.stop() soundloop2.start() - if("hard") - toy_on = TRUE + if(VIB_MEDIUM) + vibration_mode = VIB_HIGH play_lewd_sound(loc, 'sound/weapons/magin.ogg', 20, TRUE) soundloop2.stop() soundloop3.start() - if("off") + if(VIB_HIGH) + vibration_mode = VIB_OFF toy_on = FALSE play_lewd_sound(loc, 'sound/weapons/magout.ogg', 20, TRUE) soundloop3.stop() #undef DEFAULT_AROUSAL_INCREASE #undef DEFAULT_PLEASURE_INCREASE + +#undef VIB_OFF +#undef VIB_LOW +#undef VIB_MEDIUM +#undef VIB_HIGH diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/vibroring.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/vibroring.dm index 03b1ca6ade5..5bdf297bd7b 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/vibroring.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/vibroring.dm @@ -36,6 +36,11 @@ "pink" = image(icon = src.icon, icon_state = "vibroring_pink_off"), "teal" = image(icon = src.icon, icon_state = "vibroring_teal_off")) +/obj/item/clothing/sextoy/vibroring/examine(mob/user) + . = ..() + if(!color_changed) + . += span_notice("Alt-click to change it's color.") + /obj/item/clothing/sextoy/vibroring/click_alt(mob/user) if(color_changed) return CLICK_ACTION_BLOCKING diff --git a/modular_skyrat/modules/morenarcotics/code/cocoleaves.dm b/modular_skyrat/modules/morenarcotics/code/cocoleaves.dm index f35046fcac5..33f2264c138 100644 --- a/modular_skyrat/modules/morenarcotics/code/cocoleaves.dm +++ b/modular_skyrat/modules/morenarcotics/code/cocoleaves.dm @@ -1,5 +1,5 @@ /obj/item/seeds/cocaleaf - name = "pack of coca leaf seeds" + name = "coca leaf seed pack" desc = "These seeds grow into coca shrubs. They make you feel energized just looking at them..." icon = 'modular_skyrat/master_files/icons/obj/hydroponics/seeds.dmi' growing_icon = 'modular_skyrat/master_files/icons/obj/hydroponics/growing.dmi' diff --git a/modular_skyrat/modules/morenarcotics/code/opiumpoppy.dm b/modular_skyrat/modules/morenarcotics/code/opiumpoppy.dm index 76cae58a0ea..3bff79f065a 100644 --- a/modular_skyrat/modules/morenarcotics/code/opiumpoppy.dm +++ b/modular_skyrat/modules/morenarcotics/code/opiumpoppy.dm @@ -1,5 +1,5 @@ /obj/item/seeds/poppy/opiumpoppy - name = "pack of opium poppy seeds" + name = "opium poppy seed pack" desc = "These seeds grow into real opium poppies." icon = 'modular_skyrat/master_files/icons/obj/hydroponics/seeds.dmi' growing_icon = 'modular_skyrat/master_files/icons/obj/hydroponics/growing.dmi' diff --git a/modular_skyrat/modules/pixel_shift/code/pixel_shift_component.dm b/modular_skyrat/modules/pixel_shift/code/pixel_shift_component.dm index 9603d3d5a20..a66e188a336 100644 --- a/modular_skyrat/modules/pixel_shift/code/pixel_shift_component.dm +++ b/modular_skyrat/modules/pixel_shift/code/pixel_shift_component.dm @@ -1,15 +1,23 @@ +#define SHIFTING_ITEMS 1 +#define SHIFTING_PARENT 2 +#define TILTING_PARENT 3 + /datum/component/pixel_shift dupe_mode = COMPONENT_DUPE_UNIQUE - /// Whether the mob is pixel shifted or not - var/is_shifted = FALSE - /// If we are in the shifting setting. - var/shifting = TRUE - /// Takes the four cardinal direction defines. Any atoms moving into this atom's tile will be allowed to from the added directions. - var/passthroughable = NONE - /// The maximum amount of pixels allowed to move in the turf. + //whether or not parent is shifting + var/shifting = FALSE + //how tilted the parent is + var/how_tilted + //the maximum amount of tilt parent can achieve + var/maximum_tilt = 45 + //the maximum amount we/an item can move var/maximum_pixel_shift = 16 - /// The amount of pixel shift required to make the parent passthroughable. - var/passable_shift_threshold = 8 + //If we are shifted + var/is_shifted = FALSE + //Allows atoms entering Parent's turf to pass through freely from given directions + var/passthroughable = NONE + //Amount of shifting necessary to make the parent passthroughable + var/passthrough_threshold = 8 /datum/component/pixel_shift/Initialize(...) . = ..() @@ -17,28 +25,61 @@ return COMPONENT_INCOMPATIBLE /datum/component/pixel_shift/RegisterWithParent() + RegisterSignal(parent, COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_DOWN, PROC_REF(item_pixel_shift_down)) + RegisterSignal(parent, COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_UP, PROC_REF(item_pixel_shift_up)) RegisterSignal(parent, COMSIG_KB_MOB_PIXEL_SHIFT_DOWN, PROC_REF(pixel_shift_down)) RegisterSignal(parent, COMSIG_KB_MOB_PIXEL_SHIFT_UP, PROC_REF(pixel_shift_up)) + RegisterSignal(parent, COMSIG_KB_MOB_PIXEL_TILT_DOWN, PROC_REF(pixel_tilt_down)) + RegisterSignal(parent, COMSIG_KB_MOB_PIXEL_TILT_UP, PROC_REF(pixel_tilt_up)) RegisterSignals(parent, list(COMSIG_LIVING_RESET_PULL_OFFSETS, COMSIG_LIVING_SET_PULL_OFFSET, COMSIG_MOVABLE_MOVED), PROC_REF(unpixel_shift)) RegisterSignal(parent, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, PROC_REF(pre_move_check)) RegisterSignal(parent, COMSIG_LIVING_CAN_ALLOW_THROUGH, PROC_REF(check_passable)) - /datum/component/pixel_shift/UnregisterFromParent() - UnregisterSignal(parent, COMSIG_KB_MOB_PIXEL_SHIFT_DOWN) - UnregisterSignal(parent, COMSIG_KB_MOB_PIXEL_SHIFT_UP) - UnregisterSignal(parent, COMSIG_LIVING_RESET_PULL_OFFSETS) - UnregisterSignal(parent, COMSIG_LIVING_SET_PULL_OFFSET) - UnregisterSignal(parent, COMSIG_MOVABLE_MOVED) - UnregisterSignal(parent, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE) - UnregisterSignal(parent, COMSIG_LIVING_CAN_ALLOW_THROUGH) + UnregisterSignal(parent, list( + COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_DOWN, + COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_UP, + COMSIG_KB_MOB_PIXEL_TILT_DOWN, + COMSIG_KB_MOB_PIXEL_TILT_UP, + COMSIG_KB_MOB_PIXEL_SHIFT_DOWN, + COMSIG_KB_MOB_PIXEL_SHIFT_UP, + COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, + COMSIG_LIVING_RESET_PULL_OFFSETS, + COMSIG_LIVING_SET_PULL_OFFSET, + COMSIG_MOVABLE_MOVED, + COMSIG_LIVING_CAN_ALLOW_THROUGH, + )) -/// Overrides Move to Pixel Shift. +//locks our movement when holding our keybinds /datum/component/pixel_shift/proc/pre_move_check(mob/source, new_loc, direct) SIGNAL_HANDLER if(shifting) pixel_shift(source, direct) return COMSIG_MOB_CLIENT_BLOCK_PRE_LIVING_MOVE +//procs for tilting parent + +/datum/component/pixel_shift/proc/pixel_tilt_down() + SIGNAL_HANDLER + shifting = TILTING_PARENT + return COMSIG_KB_ACTIVATED + +/datum/component/pixel_shift/proc/pixel_tilt_up() + SIGNAL_HANDLER + shifting = FALSE + +//Procs for shifting items + +/datum/component/pixel_shift/proc/item_pixel_shift_down() + SIGNAL_HANDLER + shifting = SHIFTING_ITEMS + return COMSIG_KB_ACTIVATED + +/datum/component/pixel_shift/proc/item_pixel_shift_up() + SIGNAL_HANDLER + shifting = FALSE + +//Procs for shifting mobs + /// Checks if the parent is considered passthroughable from a direction. Projectiles will ignore the check and hit. /datum/component/pixel_shift/proc/check_passable(mob/source, atom/movable/mover, border_dir) SIGNAL_HANDLER @@ -48,7 +89,7 @@ /// Activates Pixel Shift on Keybind down. Only Pixel Shift movement will be allowed. /datum/component/pixel_shift/proc/pixel_shift_down() SIGNAL_HANDLER - shifting = TRUE + shifting = SHIFTING_PARENT return COMSIG_KB_ACTIVATED /// Disables Pixel Shift on Keybind up. Allows to Move. @@ -64,37 +105,74 @@ var/mob/living/owner = parent owner.pixel_x = owner.body_position_pixel_x_offset + owner.base_pixel_x owner.pixel_y = owner.body_position_pixel_y_offset + owner.base_pixel_y + owner.transform = turn(owner.transform, -how_tilted) qdel(src) /// In-turf pixel movement which can allow things to pass through if the threshold is met. /datum/component/pixel_shift/proc/pixel_shift(mob/source, direct) passthroughable = NONE var/mob/living/owner = parent - switch(direct) - if(NORTH) - if(owner.pixel_y <= maximum_pixel_shift + owner.base_pixel_y) - owner.pixel_y++ - is_shifted = TRUE - if(EAST) - if(owner.pixel_x <= maximum_pixel_shift + owner.base_pixel_x) - owner.pixel_x++ - is_shifted = TRUE - if(SOUTH) - if(owner.pixel_y >= -maximum_pixel_shift + owner.base_pixel_y) - owner.pixel_y-- - is_shifted = TRUE - if(WEST) - if(owner.pixel_x >= -maximum_pixel_shift + owner.base_pixel_x) - owner.pixel_x-- - is_shifted = TRUE + switch(shifting) + if(SHIFTING_ITEMS) + var/atom/pulled_atom = source.pulling + if(!isitem(pulled_atom)) + return + var/obj/item/pulled_item = pulled_atom + switch(direct) + if(NORTH) + if(pulled_item.pixel_y <= maximum_pixel_shift + pulled_item.base_pixel_y) + pulled_item.pixel_y++ + if(EAST) + if(pulled_item.pixel_x <= maximum_pixel_shift + pulled_item.base_pixel_x) + pulled_item.pixel_x++ + if(SOUTH) + if(pulled_item.pixel_y >= -maximum_pixel_shift + pulled_item.base_pixel_y) + pulled_item.pixel_y-- + if(WEST) + if(pulled_item.pixel_x >= -maximum_pixel_shift + pulled_item.base_pixel_x) + pulled_item.pixel_x-- + if(SHIFTING_PARENT) + switch(direct) + if(NORTH) + if(owner.pixel_y <= maximum_pixel_shift + owner.base_pixel_y) + owner.pixel_y++ + is_shifted = TRUE + if(EAST) + if(owner.pixel_x <= maximum_pixel_shift + owner.base_pixel_x) + owner.pixel_x++ + is_shifted = TRUE + if(SOUTH) + if(owner.pixel_y >= -maximum_pixel_shift + owner.base_pixel_y) + owner.pixel_y-- + is_shifted = TRUE + if(WEST) + if(owner.pixel_x >= -maximum_pixel_shift + owner.base_pixel_x) + owner.pixel_x-- + is_shifted = TRUE + if(TILTING_PARENT) + switch(direct) + if(EAST) + if(how_tilted <= maximum_tilt) + owner.transform = turn(owner.transform, 1) + how_tilted++ + is_shifted = TRUE + if(WEST) + if(how_tilted >= -maximum_tilt) + owner.transform = turn(owner.transform, -1) + how_tilted-- + is_shifted = TRUE // Yes, I know this sets it to true for everything if more than one is matched. // Movement doesn't check diagonals, and instead just checks EAST or WEST, depending on where you are for those. - if(owner.pixel_y > passable_shift_threshold) + if(owner.pixel_y > passthrough_threshold) passthroughable |= EAST | SOUTH | WEST - else if(owner.pixel_y < -passable_shift_threshold) + else if(owner.pixel_y < -passthrough_threshold) passthroughable |= NORTH | EAST | WEST - if(owner.pixel_x > passable_shift_threshold) + if(owner.pixel_x > passthrough_threshold) passthroughable |= NORTH | SOUTH | WEST - else if(owner.pixel_x < -passable_shift_threshold) + else if(owner.pixel_x < -passthrough_threshold) passthroughable |= NORTH | EAST | SOUTH + +#undef SHIFTING_ITEMS +#undef SHIFTING_PARENT +#undef TILTING_PARENT diff --git a/modular_skyrat/modules/pixel_shift/code/pixel_shift_keybind.dm b/modular_skyrat/modules/pixel_shift/code/pixel_shift_keybind.dm index 2375b350a33..149e97a9223 100644 --- a/modular_skyrat/modules/pixel_shift/code/pixel_shift_keybind.dm +++ b/modular_skyrat/modules/pixel_shift/code/pixel_shift_keybind.dm @@ -1,3 +1,22 @@ +/datum/keybinding/mob/item_pixel_shift + hotkey_keys = list("V") + name = "item_pixel_shift" + full_name = "Item Pixel Shift" + description = "Shift a pulled item's offset" + category = CATEGORY_MISC + keybind_signal = COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_DOWN + +/datum/keybinding/mob/item_pixel_shift/down(client/user) + . = ..() + if(.) + return + user.mob.AddComponent(/datum/component/pixel_shift) + SEND_SIGNAL(user.mob, COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_DOWN) + +/datum/keybinding/mob/item_pixel_shift/up(client/user) + . = ..() + SEND_SIGNAL(user.mob, COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_UP) + /datum/keybinding/mob/pixel_shift hotkey_keys = list("B") name = "pixel_shift" @@ -10,8 +29,28 @@ . = ..() if(.) return - user.mob.add_pixel_shift_component() + user.mob.AddComponent(/datum/component/pixel_shift) + SEND_SIGNAL(user.mob, COMSIG_KB_MOB_PIXEL_SHIFT_DOWN) /datum/keybinding/mob/pixel_shift/up(client/user) . = ..() SEND_SIGNAL(user.mob, COMSIG_KB_MOB_PIXEL_SHIFT_UP) + +/datum/keybinding/mob/pixel_tilting + hotkey_keys = list("N") + name = "Pixel Tilting" + full_name = "Pixel Tilt" + description = "Shift a mob's rotational value" + category = CATEGORY_MOVEMENT + keybind_signal = COMSIG_KB_MOB_PIXEL_TILT_DOWN + +/datum/keybinding/mob/pixel_tilting/down(client/user) + . = ..() + if(.) + return + user.mob.AddComponent(/datum/component/pixel_shift) + SEND_SIGNAL(user.mob, COMSIG_KB_MOB_PIXEL_TILT_DOWN) + +/datum/keybinding/mob/pixel_tilting/up(client/user) + . = ..() + SEND_SIGNAL(user.mob, COMSIG_KB_MOB_PIXEL_TILT_UP) diff --git a/modular_skyrat/modules/pixel_shift/code/pixel_shift_mob.dm b/modular_skyrat/modules/pixel_shift/code/pixel_shift_mob.dm deleted file mode 100644 index dbdd1e8d83f..00000000000 --- a/modular_skyrat/modules/pixel_shift/code/pixel_shift_mob.dm +++ /dev/null @@ -1,6 +0,0 @@ -/// Adds pixel_shift component on call. Default proc does nothing. -/mob/proc/add_pixel_shift_component() - return - -/mob/living/add_pixel_shift_component() - AddComponent(/datum/component/pixel_shift) diff --git a/modular_skyrat/modules/primitive_production/code/hydroponics.dm b/modular_skyrat/modules/primitive_production/code/hydroponics.dm index f4c56206f8a..b4165e8f04d 100644 --- a/modular_skyrat/modules/primitive_production/code/hydroponics.dm +++ b/modular_skyrat/modules/primitive_production/code/hydroponics.dm @@ -45,6 +45,12 @@ maxnutri = 50 maxwater = 500 +/obj/machinery/hydroponics/soil/soilbin/gaia/click_ctrl(mob/user) + if(!anchored) + return NONE + set_self_sustaining(!self_sustaining) + return CLICK_ACTION_SUCCESS + /datum/crafting_recipe/soilbin/gaia name = "Primitive gaian soilbin" result = /obj/machinery/hydroponics/soil/soilbin/gaia diff --git a/modular_skyrat/modules/primitive_production/code/primitive.dm b/modular_skyrat/modules/primitive_production/code/primitive.dm index f1260e7b9ac..71defc64471 100644 --- a/modular_skyrat/modules/primitive_production/code/primitive.dm +++ b/modular_skyrat/modules/primitive_production/code/primitive.dm @@ -8,6 +8,34 @@ ) skill_item_path = /obj/item/clothing/neck/cloak/skill_reward/primitive +/datum/skill/primitive/level_gained(datum/mind/mind, new_level, old_level, silent) + . = ..() + mind.current.apply_status_effect(/datum/status_effect/primitive_skill, new_level) + + +/datum/status_effect/primitive_skill + status_type = STATUS_EFFECT_REFRESH + tick_interval = 0.2 SECONDS + alert_type = null + var/stored_level = SKILL_LEVEL_NOVICE + +/datum/status_effect/primitive_skill/refresh(effect, new_level) + . = ..() + stored_level = new_level + + +/datum/status_effect/primitive_skill/tick(seconds_between_ticks) + for(var/atom/potential_farm in view(3, owner)) + var/datum/component/simple_farm/farm_component = potential_farm.GetComponent(/datum/component/simple_farm) + if(!farm_component) + continue + + var/obj/structure/simple_farm/farm = locate() in get_turf(farm_component.atom_parent) + farm?.increase_level(stored_level) + + + + /obj/item/clothing/neck/cloak/skill_reward/primitive name = "legendary survivalist's cloak" desc = "Those who wear this cloak take the responsibility that comes with it: that they may be last survivor of their race. \ diff --git a/modular_skyrat/modules/quirks/echolocation/echolocation.dm b/modular_skyrat/modules/quirks/echolocation/echolocation.dm new file mode 100644 index 00000000000..2fa3f5fc30a --- /dev/null +++ b/modular_skyrat/modules/quirks/echolocation/echolocation.dm @@ -0,0 +1,106 @@ +/datum/quirk/echolocation + name = "Echolocation" + desc = "Though your eyes no longer function, you accommodate for it by some means of extrasensory echolocation and sensitive hearing. Beware: if you're ever deafened, you'll also lose your echolocation until you recover!" + gain_text = span_notice("The slightest sounds map your surroundings.") + lose_text = span_notice("The world resolves into colour and clarity.") + value = -14 + icon = FA_ICON_EAR_LISTEN + mob_trait = TRAIT_GOOD_HEARING + medical_record_text = "Patient's eyes are biologically nonfunctional. Hearing tests indicate almost supernatural acuity." + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE + mail_goodies = list(/obj/item/clothing/glasses/sunglasses, /obj/item/cane/white) + /// where we store easy access to the character's echolocation component (for stuff like drugs) + var/datum/component/echolocation/esp + /// where we store access to the client colour we make + var/datum/client_colour/echolocation_custom/esp_color + /// The action we add with this quirk in add(), used for easy deletion later + var/datum/action/cooldown/spell/added_action + +/datum/quirk/echolocation/add(client/client_source) + // echolocation component handles blinding us already so we don't need to worry about that + var/mob/living/carbon/human/human_holder = quirk_holder + // set up the desired echo group from our quirk preferences + var/client_echo_group = LOWER_TEXT(client_source?.prefs.read_preference(/datum/preference/choiced/echolocation_key)) + if (isnull(client_echo_group)) + client_echo_group = "echolocation" + if (client_echo_group == "psychic") + client_echo_group = "psyker" // set this non-player-facing so they share echolocation with coded chaplain psykers/pirates and the like + + // Get the prefs + var/client_show_outline = client_source?.prefs.read_preference(/datum/preference/toggle/echolocation_overlay) + var/col = color_hex2color_matrix(client_source?.prefs.read_preference(/datum/preference/color/echolocation_outline)) + + human_holder.AddComponent(\ + /datum/component/echolocation, \ + blocking_trait = TRAIT_DEAF, \ + cooldown_time = 2 SECONDS, \ + echo_range = 7, \ + echo_group = client_echo_group, \ + images_are_static = FALSE, \ + use_echo = FALSE, \ + show_own_outline = client_show_outline, \ + personal_color = col \ + ) + esp = human_holder.GetComponent(/datum/component/echolocation) + + human_holder.remove_client_colour(/datum/client_colour/monochrome/blind) + esp_color = human_holder.add_client_colour(/datum/client_colour/echolocation_custom) + esp_color.update_colour(col) + + // add an action/spell to allow the player to toggle echolocation off for a bit (eyestrain on longer rounds, or just roleplay) + var/datum/action/cooldown/spell/echolocation_toggle/toggle_action = new /datum/action/cooldown/spell/echolocation_toggle() + toggle_action.Grant(human_holder) + added_action = toggle_action + RegisterSignal(human_holder, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine_text)) + +/datum/quirk/echolocation/remove() + QDEL_NULL(esp) // echolocation component removal handles graceful disposal of everything above + QDEL_NULL(added_action) // remove the stall action, too + var/mob/living/carbon/human/human_holder = quirk_holder + human_holder.remove_client_colour(/datum/client_colour/echolocation_custom) // clean up the custom colour override we added + UnregisterSignal(human_holder, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine_text)) + +/datum/quirk/echolocation/proc/on_examine_text(client/client_source, mob/user, list/examine_list) + SIGNAL_HANDLER + var/mob/living/carbon/human/human_holder = quirk_holder + var/datum/quirk/echolocation/echo = human_holder.get_quirk(/datum/quirk/echolocation) + var/datum/component/echolocation/quirk_esp = echo.esp + + if(quirk_esp.stall == TRUE) + return + examine_list += span_cyan("[human_holder.p_They()] [human_holder.p_have()] [human_holder.p_their()] ears perked up, listening closely to even slightest noise.") + +/datum/client_colour/echolocation_custom + colour = COLOR_MATRIX_SEPIATONE + priority = 1 + override = TRUE + +/datum/action/cooldown/spell/echolocation_toggle + name = "Toggle echolocation" + desc = "Decide whether you want to stop echolocating (or start again). Useful if you need a break - it's not an easy process!" + spell_requirements = NONE + cooldown_time = 2 SECONDS + check_flags = AB_CHECK_CONSCIOUS + button_icon_state = "blink" + +/datum/action/cooldown/spell/echolocation_toggle/is_valid_target(atom/cast_on) + return ishuman(cast_on) + +/datum/action/cooldown/spell/echolocation_toggle/cast(mob/living/carbon/human/cast_on) + . = ..() + var/datum/quirk/echolocation/echo = cast_on.get_quirk(/datum/quirk/echolocation) + if (isnull(echo)) + return + + var/datum/component/echolocation/quirk_esp = echo.esp + if (isnull(quirk_esp)) + return + + if (quirk_esp.stall) + quirk_esp.stall = FALSE + cast_on.balloon_alert(cast_on, "started echolocating!") + cast_on.visible_message(span_notice("[cast_on] perks up, suddenly seeming more vigilant!")) + else + quirk_esp.stall = TRUE + cast_on.balloon_alert(cast_on, "stopped echolocating!") + cast_on.visible_message(span_notice("[cast_on] relaxes slightly, seeming less vigilant for the moment.")) diff --git a/modular_skyrat/modules/quirks/echolocation/echolocation_component.dm b/modular_skyrat/modules/quirks/echolocation/echolocation_component.dm new file mode 100644 index 00000000000..9edecdd9014 --- /dev/null +++ b/modular_skyrat/modules/quirks/echolocation/echolocation_component.dm @@ -0,0 +1,7 @@ +/datum/component/echolocation + /// Should the mob see itself outlined? + var/show_own_outline = FALSE + /// Are we temporarily halting visual processing on this component? + var/stall = FALSE + /// The color of the echolocation user when seen by other echolocators + var/echo_color = "#ffffff" diff --git a/modular_skyrat/modules/quirks/echolocation/echolocation_pref.dm b/modular_skyrat/modules/quirks/echolocation/echolocation_pref.dm new file mode 100644 index 00000000000..1806e3a305a --- /dev/null +++ b/modular_skyrat/modules/quirks/echolocation/echolocation_pref.dm @@ -0,0 +1,52 @@ +/datum/quirk_constant_data/echolocation + associated_typepath = /datum/quirk/echolocation + customization_options = list(/datum/preference/color/echolocation_outline, /datum/preference/choiced/echolocation_key, /datum/preference/toggle/echolocation_overlay) + +// Client preference for echolocation outline colour +/datum/preference/color/echolocation_outline + savefile_key = "echolocation_outline" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + +/datum/preference/color/echolocation_outline/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + return "Echolocation" in preferences.all_quirks + +/datum/preference/color/echolocation_outline/apply_to_human(mob/living/carbon/human/target, value) + return + +// Client preference for echolocation key type +/datum/preference/choiced/echolocation_key + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + savefile_key = "echolocation_key" + savefile_identifier = PREFERENCE_CHARACTER + +/datum/preference/choiced/echolocation_key/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + return "Echolocation" in preferences.all_quirks + +/datum/preference/choiced/echolocation_key/init_possible_values() + var/list/values = list("Extrasensory", "Psychic", "Auditory/Vibrational") + return values + +/datum/preference/choiced/echolocation_key/apply_to_human(mob/living/carbon/human/target, value) + return + +// Client preference for whether we display the echolocation overlay or not +/datum/preference/toggle/echolocation_overlay + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + savefile_key = "echolocation_use_echo" + savefile_identifier = PREFERENCE_CHARACTER + +/datum/preference/toggle/echolocation_overlay/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + return "Echolocation" in preferences.all_quirks + +/datum/preference/toggle/echolocation_overlay/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/modular_skyrat/master_files/code/datums/traits/good.dm b/modular_skyrat/modules/quirks/good.dm similarity index 100% rename from modular_skyrat/master_files/code/datums/traits/good.dm rename to modular_skyrat/modules/quirks/good.dm diff --git a/modular_skyrat/master_files/code/datums/traits/negative.dm b/modular_skyrat/modules/quirks/negative.dm similarity index 100% rename from modular_skyrat/master_files/code/datums/traits/negative.dm rename to modular_skyrat/modules/quirks/negative.dm diff --git a/modular_skyrat/master_files/code/datums/traits/neutral.dm b/modular_skyrat/modules/quirks/neutral.dm similarity index 100% rename from modular_skyrat/master_files/code/datums/traits/neutral.dm rename to modular_skyrat/modules/quirks/neutral.dm diff --git a/modular_skyrat/modules/reagent_forging/code/forge_items.dm b/modular_skyrat/modules/reagent_forging/code/forge_items.dm index efa4bfd997d..4db2587dc29 100644 --- a/modular_skyrat/modules/reagent_forging/code/forge_items.dm +++ b/modular_skyrat/modules/reagent_forging/code/forge_items.dm @@ -263,7 +263,7 @@ icon_state = "coil" /obj/item/forging/incomplete_bow - name = "incomplete bow" + name = "incomplete longbow" desc = "A wooden bow that has yet to be strung." icon_state = "nostring_bow" diff --git a/modular_skyrat/modules/self_actualization_device/code/self_actualization_device.dm b/modular_skyrat/modules/self_actualization_device/code/self_actualization_device.dm index 4651c32fb17..359c4b89b56 100644 --- a/modular_skyrat/modules/self_actualization_device/code/self_actualization_device.dm +++ b/modular_skyrat/modules/self_actualization_device/code/self_actualization_device.dm @@ -213,12 +213,17 @@ patient.client?.prefs?.safe_transfer_prefs_to_with_damage(patient) patient.dna.update_dna_identity() + SSquirks.AssignQuirks(patient, patient.client) log_game("[key_name(patient)] used a Self-Actualization Device at [loc_name(src)].") if(patient.dna.real_name != original_name) message_admins("[key_name_admin(patient)] has used the Self-Actualization Device, and changed the name of their character. \ Original Name: [original_name], New Name: [patient.dna.real_name]. \ This may be a false positive from changing from a humanized monkey into a character, so be careful.") + else + message_admins("[key_name_admin(patient)] has used the Self-Actualization Device, and potentially changed their quirks. \ + This may be a false positive from restoring an altered body of the same name, so be careful.") + playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, FALSE) say("Procedure complete! Enjoy your life being a new you!") diff --git a/modular_skyrat/modules/synths/code/surgery/mechanic_steps.dm b/modular_skyrat/modules/synths/code/surgery/mechanic_steps.dm index 8389c9e1a79..35309a62670 100644 --- a/modular_skyrat/modules/synths/code/surgery/mechanic_steps.dm +++ b/modular_skyrat/modules/synths/code/surgery/mechanic_steps.dm @@ -1,6 +1,6 @@ //cut wires /datum/surgery_step/cut_wires - name = "cut wires" + name = "cut wires (wirecutters)" implements = list( TOOL_WIRECUTTER = 100, TOOL_SCALPEL = 75, @@ -25,7 +25,7 @@ //pry off plating /datum/surgery_step/pry_off_plating - name = "pry off plating" + name = "pry off plating (crowbar)" implements = list( TOOL_CROWBAR = 100, TOOL_HEMOSTAT = 10, @@ -47,7 +47,7 @@ //weld plating /datum/surgery_step/weld_plating - name = "weld plating" + name = "weld plating (welder)" implements = list( TOOL_WELDER = 100, ) @@ -69,7 +69,7 @@ //replace wires /datum/surgery_step/replace_wires - name = "replace wires" + name = "replace wires (cable coil)" implements = list(/obj/item/stack/cable_coil = 100) time = 2.4 SECONDS var/cableamount = 5 @@ -98,7 +98,7 @@ //add plating /datum/surgery_step/add_plating - name = "add plating" + name = "add plating (iron sheet)" implements = list(/obj/item/stack/sheet/iron = 100) time = 2.4 SECONDS var/ironamount = 5 diff --git a/modular_skyrat/modules/synths/code/surgery/robot_brain_surgery.dm b/modular_skyrat/modules/synths/code/surgery/robot_brain_surgery.dm index 6dfd7f291bc..bffd2e715fe 100644 --- a/modular_skyrat/modules/synths/code/surgery/robot_brain_surgery.dm +++ b/modular_skyrat/modules/synths/code/surgery/robot_brain_surgery.dm @@ -26,7 +26,7 @@ return TRUE /datum/surgery_step/fix_robot_brain - name = "fix posibrain" + name = "fix posibrain (multitool)" implements = list( TOOL_MULTITOOL = 100, TOOL_HEMOSTAT = 35, @@ -79,3 +79,42 @@ user.visible_message(span_warning("[user] suddenly notices that the posibrain [user.p_they()] [user.p_were()] working on is not there anymore."), span_warning("You suddenly notice that the posibrain you were working on is not there anymore.")) return FALSE + +/datum/surgery/robot_trauma_surgery + name = "Reticulate Posibrain Splines (Blessed Lobotomy)" + desc = "A surgical procedure that refurbishes low level components in the posibrain, to fix the strongest trauma errors." + possible_locs = list(BODY_ZONE_CHEST) // The brains are in the chest + requires_bodypart_type = BODYTYPE_ROBOTIC + target_mobtypes = list(/mob/living/carbon/human) + steps = list( + /datum/surgery_step/mechanic_open, + /datum/surgery_step/mechanic_unwrench, + /datum/surgery_step/pry_off_plating, + /datum/surgery_step/prepare_electronics, + /datum/surgery_step/fix_robot_brain/advanced, + /datum/surgery_step/mechanic_close, + ) + +/datum/surgery_step/fix_robot_brain/advanced + name = "reticulate splines (multitool)" + repeatable = FALSE + chems_needed = list( + /datum/reagent/catalyst_agent/speed/medicine, + ) + +/datum/surgery_step/fix_robot_brain/advanced/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results(user, + target, + span_notice("You succeed in reticulating [target]'s splines."), + "[user] successfully fixes [target]'s posibrain!", + "[user] completes the surgery on [target]'s posibrain.", + ) + + target.setOrganLoss(ORGAN_SLOT_BRAIN, target.get_organ_loss(ORGAN_SLOT_BRAIN) - 60) //we set damage in this case in order to clear the "failing" flag + target.cure_all_traumas(TRAUMA_RESILIENCE_MAGIC) + playsound(source = get_turf(target), soundin = 'sound/magic/repulse.ogg', vol = 75, vary = TRUE, falloff_distance = 2) + if(target.mind && target.mind.has_antag_datum(/datum/antagonist/brainwashed)) + target.mind.remove_antag_datum(/datum/antagonist/brainwashed) + if(prob(75)) + target.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_MAGIC) + return ..() diff --git a/modular_skyrat/modules/tribal_extended/code/ammo/reusable/arrow.dm b/modular_skyrat/modules/tribal_extended/code/ammo/reusable/arrow.dm index 5fd451bb0f4..9ab3c46d87e 100644 --- a/modular_skyrat/modules/tribal_extended/code/ammo/reusable/arrow.dm +++ b/modular_skyrat/modules/tribal_extended/code/ammo/reusable/arrow.dm @@ -17,8 +17,8 @@ /obj/projectile/bullet/arrow/ash name = "ashen arrow" desc = "An arrow made of hardened ash." - faction_bonus_force = 60 - damage = 15//lower me to 20 or 15 + faction_bonus_force = 90 + damage = 30 nemesis_paths = list( /mob/living/simple_animal/hostile/asteroid, /mob/living/basic/mining, @@ -29,7 +29,7 @@ /obj/projectile/bullet/arrow/bone name = "bone arrow" desc = "An arrow made from bone and sinew." - faction_bonus_force = 35 + faction_bonus_force = 120 damage = 35 armour_penetration = 20 wound_bonus = -30 @@ -42,7 +42,7 @@ embed_type = /datum/embed_data/bone_arrow /datum/embed_data/bone_arrow - embed_chance = 33 + embed_chance = 35 fall_chance = 3 jostle_chance = 4 ignore_throwspeed_threshold = TRUE @@ -54,7 +54,7 @@ /obj/projectile/bullet/arrow/bronze name = "bronze arrow" desc = "A bronze-tipped arrow." - faction_bonus_force = 90 + faction_bonus_force = 140 damage = 30 armour_penetration = 30 nemesis_paths = list( diff --git a/modular_skyrat/modules/tribal_extended/code/crafting.dm b/modular_skyrat/modules/tribal_extended/code/crafting.dm index adf21657bd9..3a029eed7f8 100644 --- a/modular_skyrat/modules/tribal_extended/code/crafting.dm +++ b/modular_skyrat/modules/tribal_extended/code/crafting.dm @@ -3,3 +3,10 @@ desc = "A long piece of string that looks like a cable coil." icon = 'modular_skyrat/modules/tribal_extended/icons/crafting.dmi' icon_state = "silkstring" + +/obj/item/dice/d6/bone + name = "bone die" + desc = "A die carved from a creature's bone. Dried blood marks the indented pits." + icon = 'modular_skyrat/modules/tribal_extended/icons/dice.dmi' + icon_state = "db6" + microwave_riggable = FALSE // You can't melt bone in the microwave diff --git a/modular_skyrat/modules/tribal_extended/code/recipes.dm b/modular_skyrat/modules/tribal_extended/code/recipes.dm index e9739121276..0266edca53b 100644 --- a/modular_skyrat/modules/tribal_extended/code/recipes.dm +++ b/modular_skyrat/modules/tribal_extended/code/recipes.dm @@ -5,16 +5,6 @@ time = 5 SECONDS category = CAT_MISC -/datum/crafting_recipe/wood_bow - name = "Wooden Bow" - result = /obj/item/gun/ballistic/bow/longbow - reqs = list( - /obj/item/stack/sheet/mineral/wood = 25, - /obj/item/weaponcrafting/silkstring = 2, - ) - time = 30 SECONDS - category = CAT_WEAPON_RANGED - /datum/crafting_recipe/pipebow name = "Pipe Bow" result = /obj/item/gun/ballistic/bow/tribalbow/pipe @@ -26,47 +16,38 @@ time = 45 SECONDS category = CAT_WEAPON_RANGED -/datum/crafting_recipe/arrow - name = "Arrow" - result = /obj/item/ammo_casing/arrow - reqs = list( - /obj/item/stack/sheet/mineral/wood = 1, - /obj/item/stack/sheet/cloth= 1, - /obj/item/stack/rods = 1, - ) - time = 1.5 SECONDS - category = CAT_WEAPON_AMMO - /datum/crafting_recipe/bone_arrow name = "Bone Arrow" result = /obj/item/ammo_casing/arrow/bone reqs = list( /obj/item/stack/sheet/bone = 1, - /obj/item/ammo_casing/arrow/ash = 1, + /obj/item/ammo_casing/arrow = 1, ) - time = 1.5 SECONDS category = CAT_WEAPON_AMMO + non_craftable = TRUE + steps = list("Reinforce the arrow with sinew.") /datum/crafting_recipe/ashen_arrow name = "Ashen Arrow" result = /obj/item/ammo_casing/arrow/ash reqs = list( - /obj/item/stack/rods = 2, + /obj/item/ammo_casing/arrow = 1, /obj/item/stack/sheet/sinew = 1, - /obj/item/stack/ore/glass/basalt = 10, ) - time = 1.5 SECONDS category = CAT_WEAPON_AMMO + non_craftable = TRUE + steps = list("Reinforce the arrow with sinew.") /datum/crafting_recipe/bronze_arrow name = "Bronze arrow" result = /obj/item/ammo_casing/arrow/bronze reqs = list( - /obj/item/ammo_casing/arrow/ash = 1, + /obj/item/ammo_casing/arrow = 1, /obj/item/stack/tile/bronze = 1, ) - time = 1.5 SECONDS category = CAT_WEAPON_AMMO + non_craftable = TRUE + steps = list("Reinforce the arrowhead with bronze.") /datum/crafting_recipe/goliathshield name = "Goliath shield" @@ -108,3 +89,12 @@ ) time = 20 SECONDS category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/bonedice + name = "Bone Die" + result = /obj/item/dice/d6/bone + time = 5 SECONDS + reqs = list( + /obj/item/stack/sheet/bone = 1, + ) + category = CAT_EQUIPMENT diff --git a/modular_skyrat/modules/tribal_extended/code/weapons/bow.dm b/modular_skyrat/modules/tribal_extended/code/weapons/bow.dm index d44b35ee1ff..4c8655d4430 100644 --- a/modular_skyrat/modules/tribal_extended/code/weapons/bow.dm +++ b/modular_skyrat/modules/tribal_extended/code/weapons/bow.dm @@ -4,33 +4,37 @@ righthand_file = 'modular_skyrat/modules/tribal_extended/icons/bows_righthand.dmi' worn_icon = 'modular_skyrat/modules/tribal_extended/icons/back.dmi' inhand_icon_state = "bow" - icon_state = "bow_unloaded" + icon_state = null base_icon_state = "bow" worn_icon_state = "bow" slot_flags = ITEM_SLOT_BACK + projectile_damage_multiplier = 0.5 + force = 20 /obj/item/gun/ballistic/bow/tribalbow/update_icon() . = ..() - icon_state = "[base_icon_state]_[get_ammo() ? (chambered ? "firing" : "loaded") : "unloaded"]" + icon_state = "[base_icon_state][drawn ? "_drawn" : ""]" + +/obj/item/gun/ballistic/bow/tribalbow/update_overlays() + . = ..() + if(chambered) + . += "[chambered.base_icon_state][drawn ? "_drawn" : ""]" /obj/item/gun/ballistic/bow/tribalbow/ashen name = "bone bow" desc = "Some sort of primitive projectile weapon made of bone and wrapped sinew, oddly robust." icon = 'modular_skyrat/modules/tribal_extended/icons/projectile.dmi' - icon_state = "ashenbow_unloaded" + icon_state = "ashenbow" base_icon_state = "ashenbow" inhand_icon_state = "ashenbow" worn_icon_state = "ashenbow" - force = 20 /obj/item/gun/ballistic/bow/tribalbow/pipe name = "pipe bow" desc = "Portable and sleek, but you'd be better off hitting someone with a pool noodle." icon = 'modular_skyrat/modules/tribal_extended/icons/projectile.dmi' - icon_state = "pipebow_unloaded" + icon_state = "pipebow" base_icon_state = "pipebow" - inhand_icon_state = "pipebow" worn_icon_state = "pipebow" - force = 10 slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_SUITSTORE diff --git a/modular_skyrat/modules/tribal_extended/icons/ammo.dmi b/modular_skyrat/modules/tribal_extended/icons/ammo.dmi index 08720fe1fb0..8fb9d7a695a 100644 Binary files a/modular_skyrat/modules/tribal_extended/icons/ammo.dmi and b/modular_skyrat/modules/tribal_extended/icons/ammo.dmi differ diff --git a/modular_skyrat/modules/tribal_extended/icons/dice.dmi b/modular_skyrat/modules/tribal_extended/icons/dice.dmi new file mode 100644 index 00000000000..f597bc60c02 Binary files /dev/null and b/modular_skyrat/modules/tribal_extended/icons/dice.dmi differ diff --git a/modular_skyrat/modules/tribal_extended/icons/projectile.dmi b/modular_skyrat/modules/tribal_extended/icons/projectile.dmi index 9cb037bce25..3dfc194ae30 100644 Binary files a/modular_skyrat/modules/tribal_extended/icons/projectile.dmi and b/modular_skyrat/modules/tribal_extended/icons/projectile.dmi differ diff --git a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/amauri.dm b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/amauri.dm index f0a94c1ea79..ef30511b3a6 100644 --- a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/amauri.dm +++ b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/amauri.dm @@ -1,5 +1,5 @@ /obj/item/seeds/amauri - name = "pack of amauri seeds" + name = "amauri seed pack" desc = "These seeds grow into amauri plants. Grows bulbs full of potent toxins." icon = 'modular_skyrat/modules/xenoarch/icons/seeds.dmi' icon_state = "amauri" diff --git a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/gelthi.dm b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/gelthi.dm index 8fed3e82863..9cc68c28d80 100644 --- a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/gelthi.dm +++ b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/gelthi.dm @@ -1,5 +1,5 @@ /obj/item/seeds/gelthi - name = "pack of gelthi seeds" + name = "gelthi seed pack" desc = "These seeds grow into gelthi plants. Lauded by chefs for its unique ability to produce honey, and often hoarded for this very reason." icon = 'modular_skyrat/modules/xenoarch/icons/seeds.dmi' icon_state = "gelthi" diff --git a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/jurlmah.dm b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/jurlmah.dm index 5e9bcd3f68b..4d78b0b65c5 100644 --- a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/jurlmah.dm +++ b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/jurlmah.dm @@ -1,5 +1,5 @@ /obj/item/seeds/jurlmah - name = "pack of jurlmah seeds" + name = "jurlmah seed pack" desc = "These seeds grow into jurlmah plants. Often used as makeshift cryo-treatment in areas where a dedicated cryotube setup is impossible." icon = 'modular_skyrat/modules/xenoarch/icons/seeds.dmi' icon_state = "jurlmah" diff --git a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/nofruit.dm b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/nofruit.dm index c22b032d287..996a2ba1011 100644 --- a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/nofruit.dm +++ b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/nofruit.dm @@ -1,5 +1,5 @@ /obj/item/seeds/nofruit - name = "pack of nofruit seeds" + name = "nofruit seed pack" desc = "These seeds grow into nofruit plants. A strange plant often cultivated by silent performers." icon = 'modular_skyrat/modules/xenoarch/icons/seeds.dmi' icon_state = "nofruit" diff --git a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/shand.dm b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/shand.dm index faa59ef21c0..f3e4f9b04df 100644 --- a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/shand.dm +++ b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/shand.dm @@ -1,6 +1,6 @@ /obj/item/seeds/shand - name = "pack of shand seeds" - desc = "These seeds grow into shand plants. While not very useful on it's own, it is full of chemicals that no other plant can produce. A good candidate for crossbreeding." + name = "shand seed pack" + desc = "These seeds grow into shand plants. While not very useful on its own, it is full of chemicals that no other plant can produce. A good candidate for crossbreeding." icon = 'modular_skyrat/modules/xenoarch/icons/seeds.dmi' icon_state = "shand" species = "shand" diff --git a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/surik.dm b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/surik.dm index cb1717fd887..e5b86555fd3 100644 --- a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/surik.dm +++ b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/surik.dm @@ -1,5 +1,5 @@ /obj/item/seeds/surik - name = "pack of surik seeds" + name = "surik seed pack" desc = "These seeds grow into surik plants. Said to contain the very essence of Indecipheres." icon = 'modular_skyrat/modules/xenoarch/icons/seeds.dmi' icon_state = "surik" diff --git a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/telriis.dm b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/telriis.dm index a0b3d621dc6..e1d1101441f 100644 --- a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/telriis.dm +++ b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/telriis.dm @@ -1,5 +1,5 @@ /obj/item/seeds/telriis - name = "pack of telriis seeds" + name = "telriis seed pack" desc = "These seeds grow into telriis plants. A distant relative of milkweed, this grass can actually be juiced into milk." icon = 'modular_skyrat/modules/xenoarch/icons/seeds.dmi' icon_state = "telriis" diff --git a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/thaadra.dm b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/thaadra.dm index da3b11d8fd5..5bbb997f3f8 100644 --- a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/thaadra.dm +++ b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/thaadra.dm @@ -1,5 +1,5 @@ /obj/item/seeds/thaadra - name = "pack of thaadra seeds" + name = "thaadra seed pack" desc = "These seeds grow into thaadra plants. A strange flower full of unique medicines and silver." icon = 'modular_skyrat/modules/xenoarch/icons/seeds.dmi' icon_state = "thaadra" diff --git a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/vale.dm b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/vale.dm index aa0d333a7a6..2d10dcf6c74 100644 --- a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/vale.dm +++ b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/vale.dm @@ -1,5 +1,5 @@ /obj/item/seeds/vale - name = "pack of vale seeds" + name = "vale seed pack" desc = "These seeds grow into vale plants. Once sold as a luxury for their unique aesthetics, after the trees suddenly combusted they were taken off of the market." icon = 'modular_skyrat/modules/xenoarch/icons/seeds.dmi' icon_state = "vale" diff --git a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/vaporsac.dm b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/vaporsac.dm index cbc12ab3288..41a7138f612 100644 --- a/modular_skyrat/modules/xenoarch/code/modules/hydroponics/vaporsac.dm +++ b/modular_skyrat/modules/xenoarch/code/modules/hydroponics/vaporsac.dm @@ -1,5 +1,5 @@ /obj/item/seeds/vaporsac - name = "pack of vaporsac seeds" + name = "vaporsac seed pack" desc = "These seeds grow into vaporsac plants. Normally vaporsac plants spread by floating through the air and exploding, but this strand of vaporsac thankfully does not." icon = 'modular_skyrat/modules/xenoarch/icons/seeds.dmi' icon_state = "vaporsac" diff --git a/sound/items/attributions.txt b/sound/items/attributions.txt index a9e708c477c..9ad1a09d8cb 100644 --- a/sound/items/attributions.txt +++ b/sound/items/attributions.txt @@ -24,6 +24,21 @@ plastic_pick_up.ogg - https://freesound.org/people/Jessica190091/sounds/491304/ plastic_drop.ogg - https://freesound.org/people/martian/sounds/338854/ , License: CC0 } - edited by sadboysuss +{ +gun_drop.ogg - FN FAL Rifle Load and Cock 01.mp3 by PNMCarrieRailfan -- https://freesound.org/s/682029/ -- License: Attribution NonCommercial 4.0 +gun_pick_up.ogg - FN FAL Rifle Unload and Cock.mp3 by PNMCarrieRailfan -- https://freesound.org/s/682031/ -- License: Attribution NonCommercial 4.0 +handcuffs_drop.ogg - handcuffs.ogg by kimuracarter -- https://freesound.org/s/528749/ -- License: Attribution 3.0 +handcuffs_pick_up.ogg - handcuffs.ogg by kimuracarter -- https://freesound.org/s/528749/ -- License: Attribution 3.0 +plastic_shield_drop.ogg - made by sadboysuss -- License: CC-by-SA +plastic_shield_pick_up.ogg - made by sadboysuss -- License: CC-by-SA +stun_baton_drop.ogg - Fn P90 Submachine Gun 5.7Mm. Mechan; Empty Mag Inserted Into And Pulled Out Slow And Various 02 by PNMCarrieRailfan -- https://freesound.org/s/682041/ -- License: Attribution NonCommercial 4.0 +stun_baton_pick_up.ogg - Fn P90 Submachine Gun 5.7Mm. Mechan; Empty Mag Inserted Into And Pulled Out Slow And Various 02 by PNMCarrieRailfan -- https://freesound.org/s/682041/ -- License: Attribution NonCommercial 4.0 +pepper_spray_drop.ogg - Spray Paint Shake Slow Five.wav by cbakos -- https://freesound.org/s/200376/ -- License: Creative Commons 0 +pepper_spray_pick_up.ogg - Spray Paint Shake Slow Five.wav by cbakos -- https://freesound.org/s/200376/ -- License: Creative Commons 0 +grenade_drop.ogg - made by sadboysuss -- License: CC-by-SA +grenade_pick_up.ogg - made by sadboysuss -- License: CC-by-SA +} - edited by sadboysuss + { skin_drop.ogg - https://freesound.org/people/Crinkem/sounds/501015/ , License: CC4 skin_pick_up.ogg - https://freesound.org/people/Crinkem/sounds/501015/ , License CC3 diff --git a/sound/items/grenade_drop.ogg b/sound/items/grenade_drop.ogg new file mode 100644 index 00000000000..04627811cd1 Binary files /dev/null and b/sound/items/grenade_drop.ogg differ diff --git a/sound/items/grenade_pick_up.ogg b/sound/items/grenade_pick_up.ogg new file mode 100644 index 00000000000..d257659f761 Binary files /dev/null and b/sound/items/grenade_pick_up.ogg differ diff --git a/sound/items/gun_drop.ogg b/sound/items/gun_drop.ogg new file mode 100644 index 00000000000..21b83bc91d6 Binary files /dev/null and b/sound/items/gun_drop.ogg differ diff --git a/sound/items/gun_pick_up.ogg b/sound/items/gun_pick_up.ogg new file mode 100644 index 00000000000..6bf6b45a16b Binary files /dev/null and b/sound/items/gun_pick_up.ogg differ diff --git a/sound/items/handcuff_finish.ogg b/sound/items/handcuff_finish.ogg new file mode 100644 index 00000000000..92096837835 Binary files /dev/null and b/sound/items/handcuff_finish.ogg differ diff --git a/sound/items/handcuffs_drop.ogg b/sound/items/handcuffs_drop.ogg new file mode 100644 index 00000000000..85b7f172e48 Binary files /dev/null and b/sound/items/handcuffs_drop.ogg differ diff --git a/sound/items/handcuffs_pick_up.ogg b/sound/items/handcuffs_pick_up.ogg new file mode 100644 index 00000000000..d3fdc3450bd Binary files /dev/null and b/sound/items/handcuffs_pick_up.ogg differ diff --git a/sound/items/holster.ogg b/sound/items/holster.ogg new file mode 100644 index 00000000000..984e7ad4fea Binary files /dev/null and b/sound/items/holster.ogg differ diff --git a/sound/items/pepper_spray_drop.ogg b/sound/items/pepper_spray_drop.ogg new file mode 100644 index 00000000000..e071c65d3bc Binary files /dev/null and b/sound/items/pepper_spray_drop.ogg differ diff --git a/sound/items/pepper_spray_pick_up.ogg b/sound/items/pepper_spray_pick_up.ogg new file mode 100644 index 00000000000..a474bbd91b3 Binary files /dev/null and b/sound/items/pepper_spray_pick_up.ogg differ diff --git a/sound/items/plastic_shield_drop.ogg b/sound/items/plastic_shield_drop.ogg new file mode 100644 index 00000000000..4d07b48d481 Binary files /dev/null and b/sound/items/plastic_shield_drop.ogg differ diff --git a/sound/items/plastic_shield_pick_up.ogg b/sound/items/plastic_shield_pick_up.ogg new file mode 100644 index 00000000000..e18e9617b77 Binary files /dev/null and b/sound/items/plastic_shield_pick_up.ogg differ diff --git a/sound/items/stun_baton_drop.ogg b/sound/items/stun_baton_drop.ogg new file mode 100644 index 00000000000..1d5d59e9012 Binary files /dev/null and b/sound/items/stun_baton_drop.ogg differ diff --git a/sound/items/stun_baton_pick_up.ogg b/sound/items/stun_baton_pick_up.ogg new file mode 100644 index 00000000000..6b87e531fc4 Binary files /dev/null and b/sound/items/stun_baton_pick_up.ogg differ diff --git a/tgstation.dme b/tgstation.dme index db7a7596a64..d5575ea8626 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1218,6 +1218,7 @@ #include "code\datums\components\explode_on_attack.dm" #include "code\datums\components\faction_granter.dm" #include "code\datums\components\fertile_egg.dm" +#include "code\datums\components\fish_growth.dm" #include "code\datums\components\fishing_spot.dm" #include "code\datums\components\focused_attacker.dm" #include "code\datums\components\food_storage.dm" @@ -2612,6 +2613,7 @@ #include "code\game\objects\items\granters\crafting\combat_baking.dm" #include "code\game\objects\items\granters\crafting\death_sandwich.dm" #include "code\game\objects\items\granters\crafting\desserts.dm" +#include "code\game\objects\items\granters\crafting\fletching.dm" #include "code\game\objects\items\granters\crafting\pipegun.dm" #include "code\game\objects\items\granters\crafting\rebarxbowsyndie.dm" #include "code\game\objects\items\granters\crafting\regal_condor.dm" @@ -6532,9 +6534,6 @@ #include "modular_skyrat\master_files\code\datums\status_effects\debuffs\debuffs.dm" #include "modular_skyrat\master_files\code\datums\storage\storage.dm" #include "modular_skyrat\master_files\code\datums\storage\subtypes\pockets.dm" -#include "modular_skyrat\master_files\code\datums\traits\good.dm" -#include "modular_skyrat\master_files\code\datums\traits\negative.dm" -#include "modular_skyrat\master_files\code\datums\traits\neutral.dm" #include "modular_skyrat\master_files\code\datums\votes\_vote_datum.dm" #include "modular_skyrat\master_files\code\datums\votes\map_vote.dm" #include "modular_skyrat\master_files\code\game\atoms.dm" @@ -6643,6 +6642,7 @@ #include "modular_skyrat\master_files\code\modules\client\preferences\loadout_override_preference.dm" #include "modular_skyrat\master_files\code\modules\client\preferences\looc.dm" #include "modular_skyrat\master_files\code\modules\client\preferences\mutant_parts.dm" +#include "modular_skyrat\master_files\code\modules\client\preferences\names.dm" #include "modular_skyrat\master_files\code\modules\client\preferences\out_of_combat_fov_darkness.dm" #include "modular_skyrat\master_files\code\modules\client\preferences\scream.dm" #include "modular_skyrat\master_files\code\modules\client\preferences\tgui_prefs_migration.dm" @@ -8231,7 +8231,6 @@ #include "modular_skyrat\modules\pet_owner\pet_owner.dm" #include "modular_skyrat\modules\pixel_shift\code\pixel_shift_component.dm" #include "modular_skyrat\modules\pixel_shift\code\pixel_shift_keybind.dm" -#include "modular_skyrat\modules\pixel_shift\code\pixel_shift_mob.dm" #include "modular_skyrat\modules\player_ranks\code\preferences.dm" #include "modular_skyrat\modules\player_ranks\code\world_topic.dm" #include "modular_skyrat\modules\player_ranks\code\player_rank_controller\_player_rank_controller.dm" @@ -8300,6 +8299,12 @@ #include "modular_skyrat\modules\QOL\code\_under.dm" #include "modular_skyrat\modules\QOL\code\datums\components\crafting\recipes\recipes_misc.dm" #include "modular_skyrat\modules\QOL\code\game\objects\items\mop.dm" +#include "modular_skyrat\modules\quirks\good.dm" +#include "modular_skyrat\modules\quirks\negative.dm" +#include "modular_skyrat\modules\quirks\neutral.dm" +#include "modular_skyrat\modules\quirks\echolocation\echolocation.dm" +#include "modular_skyrat\modules\quirks\echolocation\echolocation_component.dm" +#include "modular_skyrat\modules\quirks\echolocation\echolocation_pref.dm" #include "modular_skyrat\modules\radiosound\code\headset.dm" #include "modular_skyrat\modules\reagent_forging\code\anvil.dm" #include "modular_skyrat\modules\reagent_forging\code\crafting_bench.dm" diff --git a/tgui/packages/tgui/interfaces/AntagInfoMalf.tsx b/tgui/packages/tgui/interfaces/AntagInfoMalf.tsx index 7b799e96552..88520752b1e 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoMalf.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoMalf.tsx @@ -188,6 +188,8 @@ export const AntagInfoMalf = (props) => { items.push({ id: item.name, name: item.name, + icon: item.icon, + icon_state: item.icon_state, category: category.name, cost: `${item.cost} PT`, desc: item.desc, diff --git a/tgui/packages/tgui/interfaces/Aquarium.tsx b/tgui/packages/tgui/interfaces/Aquarium.tsx index caa0c65d75f..6f29920fc0b 100644 --- a/tgui/packages/tgui/interfaces/Aquarium.tsx +++ b/tgui/packages/tgui/interfaces/Aquarium.tsx @@ -71,10 +71,10 @@ export const Aquarium = (props) => { ))} - + diff --git a/tgui/packages/tgui/interfaces/InteractionMenu.tsx b/tgui/packages/tgui/interfaces/InteractionMenu.tsx index 7b83319cfbe..27605655420 100644 --- a/tgui/packages/tgui/interfaces/InteractionMenu.tsx +++ b/tgui/packages/tgui/interfaces/InteractionMenu.tsx @@ -48,7 +48,7 @@ export const InteractionMenu = (props) => { {(block_interact && Unable to Interact) || ( Able to Interact )} - +
{categories.map((category) => ( @@ -78,59 +78,60 @@ export const InteractionMenu = (props) => { ))}
-
- {lewd_slots.length > 0 ? ( -
- - {lewd_slots.map((element: LewdSlot) => { - return ( - - - - ); - })} - -
- ) : ( - '' - )} + + {element.img ? ( + + ) : ( + + )} + + + + ); + })} +
+ + ) : ( + '' + )} + ); diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/echolocation.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/echolocation.tsx new file mode 100644 index 00000000000..f232cb16e5b --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/echolocation.tsx @@ -0,0 +1,24 @@ +// THIS IS A Skyrat SECTOR UI FILE +import { + CheckboxInput, + Feature, + FeatureChoiced, + FeatureColorInput, + FeatureToggle, +} from '../../base'; +import { FeatureDropdownInput } from '../../dropdowns'; + +export const echolocation_outline: Feature = { + name: 'Echo outline color', + component: FeatureColorInput, +}; + +export const echolocation_key: FeatureChoiced = { + name: 'Echolocation group', + component: FeatureDropdownInput, +}; + +export const echolocation_use_echo: FeatureToggle = { + name: 'Display own overlay', + component: CheckboxInput, +}; diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/genitals.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/genitals.tsx index 60818536339..28ae2fe2179 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/genitals.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/genitals.tsx @@ -54,11 +54,21 @@ export const penis_sheath: Feature = { export const penis_length: FeatureNumeric = { name: 'Penis Length', + description: + 'Value is measured in inches.\ + This value is limited to 20 for characters with a body size <= 1, \ + or without the oversized trait. The maximum allowed value scales up\ + based on the body size of a character, up to a max of 36.', component: FeatureNumberInput, }; export const penis_girth: FeatureNumeric = { name: 'Penis Girth', + description: + 'Value is circumference, measured in inches.\ + This value is limited to 15 for characters with a body size <= 1, \ + or without the oversized trait. The maximum allowed value scales up\ + based on the body size of a character, up to a max of 20.', component: FeatureNumberInput, }; diff --git a/tgui/packages/tgui/interfaces/Uplink/GenericUplink.tsx b/tgui/packages/tgui/interfaces/Uplink/GenericUplink.tsx index 6f69b6671eb..c6558321b69 100644 --- a/tgui/packages/tgui/interfaces/Uplink/GenericUplink.tsx +++ b/tgui/packages/tgui/interfaces/Uplink/GenericUplink.tsx @@ -1,9 +1,13 @@ import { BooleanLike } from 'common/react'; import { useState } from 'react'; +import { Tooltip } from 'tgui-core/components'; +import { useBackend } from '../../backend'; import { Box, Button, + DmIcon, + Icon, Input, NoticeBox, Section, @@ -19,6 +23,7 @@ type GenericUplinkProps = { }; export const GenericUplink = (props: GenericUplinkProps) => { + const { act } = useBackend(); const { currency = 'cr', categories, @@ -36,43 +41,71 @@ export const GenericUplink = (props: GenericUplinkProps) => { }); return ( -
{currency}} - buttons={ - <> - Search - setSearchText(value)} - mx={1} - /> - - - } - > - - {searchText.length === 0 && ( - - + + + + + + + + + +
+ + + ); }; export type Item = { id: string | number; name: string; + icon: string; + icon_state: string; category: string; cost: JSX.Element | string; desc: JSX.Element | string; @@ -109,22 +144,86 @@ export type ItemListProps = { const ItemList = (props: ItemListProps) => { const { compactMode, items, handleBuy } = props; + const fallback = ( + + ); return ( - + {items.map((item, index) => ( - -
handleBuy(item)} - /> - } - > - {compactMode ? null : item.desc} + +
+ + + + + + + + {compactMode ? ( + + + {item.name} + + + + + + + + + + + ) : ( +
handleBuy(item)} + > + {item.cost} + + } + > + + {item.desc} + +
+ )} +
+
))} diff --git a/tgui/packages/tgui/interfaces/Uplink/PrimaryObjectiveMenu.tsx b/tgui/packages/tgui/interfaces/Uplink/PrimaryObjectiveMenu.tsx index ee6e81160d3..f0364e88d9f 100644 --- a/tgui/packages/tgui/interfaces/Uplink/PrimaryObjectiveMenu.tsx +++ b/tgui/packages/tgui/interfaces/Uplink/PrimaryObjectiveMenu.tsx @@ -12,19 +12,17 @@ export const PrimaryObjectiveMenu = (props: PrimaryObjectiveMenuProps) => { const { act } = useBackend(); const { primary_objectives, final_objective, can_renegotiate } = props; return ( -
-
- - { - 'Agent, your Primary Objectives are as follows. Complete these at all costs.' - } - - - { - 'Completing Secondary Objectives may allow you to aquire additional equipment.' - } - -
+
+ + WELCOME, AGENT. + + + Your Primary Objectives are as follows. Complete these at all costs. + + + Completing Secondary Objectives may allow you to aquire additional + equipment. + {final_objective && ( { )} -
- - {primary_objectives.map((prim_obj, index) => ( - - - - ))} - -
+ + {primary_objectives.map((prim_obj, index) => ( + + + + ))} + {!!can_renegotiate && (
); }; diff --git a/tgui/packages/tgui/interfaces/Uplink/calculateDangerLevel.tsx b/tgui/packages/tgui/interfaces/Uplink/calculateDangerLevel.tsx index e8951e367a9..d67dd37391e 100644 --- a/tgui/packages/tgui/interfaces/Uplink/calculateDangerLevel.tsx +++ b/tgui/packages/tgui/interfaces/Uplink/calculateDangerLevel.tsx @@ -90,7 +90,7 @@ export const dangerLevelsTooltip = ( color="white" className={value.gradient} style={{ - borderRadius: '5px', + borderRadius: '2px', display: 'inline-block', }} px={0.8} @@ -137,11 +137,12 @@ export const calculateDangerLevel = ( color="white" className={dangerLevel.gradient} style={{ - borderRadius: '5px', + borderRadius: '2px', display: 'inline-block', }} px={0.8} py={0.6} + textAlign="center" > {dangerLevel.title} ({displayedProgression}) diff --git a/tgui/packages/tgui/interfaces/Uplink/index.tsx b/tgui/packages/tgui/interfaces/Uplink/index.tsx index 4949fc94ee7..3ed7d34a214 100644 --- a/tgui/packages/tgui/interfaces/Uplink/index.tsx +++ b/tgui/packages/tgui/interfaces/Uplink/index.tsx @@ -7,6 +7,7 @@ import { Box, Button, Dimmer, + NoticeBox, Section, Stack, Tabs, @@ -27,6 +28,8 @@ import { PrimaryObjectiveMenu } from './PrimaryObjectiveMenu'; type UplinkItem = { id: string; name: string; + icon: string; + icon_state: string; cost: number; desc: string; category: string; @@ -90,6 +93,8 @@ type ServerData = { type ItemExtraData = Item & { extraData: { ref?: string; + icon: string; + icon_state: string; }; }; @@ -198,7 +203,6 @@ export class Uplink extends Component<{}, UplinkState> { shop_locked, } = data; const { allItems, allCategories, currentTab } = this.state as UplinkState; - const itemsToAdd = [...allItems]; const items: ItemExtraData[] = []; itemsToAdd.push(...extra_purchasable); @@ -224,19 +228,21 @@ export class Uplink extends Component<{}, UplinkState> { items.push({ id: item.id, name: item.name, + icon: item.icon, + icon_state: item.icon_state, category: item.category, desc: ( - - {item.desc} + <> + {item.desc} {(item.lock_other_purchases && ( - + Taking this item will lock you from further purchasing from the marketplace. Additionally, if you have already purchased an item, you will not be able to purchase this. - + )) || null} - + ), cost: ( @@ -259,6 +265,8 @@ export class Uplink extends Component<{}, UplinkState> { (item.lock_other_purchases && purchased_items > 0), extraData: { ref: item.ref, + icon: item.icon, + icon_state: item.icon_state, }, }); } @@ -274,25 +282,14 @@ export class Uplink extends Component<{}, UplinkState> { // Round it and convert it into a percentage progressionPercentage = Math.round(progressionPercentage * 1000) / 10; return ( - - - - -
- - - - SyndOS Version 3.17   - - Connection Secure - - - - WELCOME, AGENT. - - - - + + + + {!!has_progression && ( + +
+ + { } > {/* If we have no progression, - just give them a generic title */} + just give them a generic title */} {has_progression ? calculateDangerLevel(progression_points, false) : calculateDangerLevel(dangerDefault, false)} - - - {telecrystals} TC - - - -
-
- -
- - - - {!!has_objectives && ( - <> - this.setState({ currentTab: 0 })} - > - Primary Objectives - - this.setState({ currentTab: 1 })} - > - Secondary Objectives - - - )} - this.setState({ currentTab: 2 })} - > - Market - - - - {!!lockable && ( - -
-
+ + + + {!!has_objectives && ( + <> + this.setState({ currentTab: 0 })} + > + Primary Objectives + + this.setState({ currentTab: 1 })} + > + Secondary Objectives + + + )} + this.setState({ currentTab: 2 })} + > + Market + + + + + {!!lockable && ( + + + + )} +
+
+
+ )} {(currentTab === 0 && has_objectives && ( { handleRequestObjectives={() => act('regenerate_objectives')} /> )) || ( -
+ <> { @@ -471,7 +483,7 @@ export class Uplink extends Component<{}, UplinkState> { )) || null} -
+ )}