diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm
index 6f3ac43d0dc..80ebdb040f0 100644
--- a/_maps/map_files/Birdshot/birdshot.dmm
+++ b/_maps/map_files/Birdshot/birdshot.dmm
@@ -152,16 +152,6 @@
},
/turf/open/floor/grass/Airless,
/area/station/hallway/primary/central/aft)
-"ael" = (
-/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior,
-/obj/effect/mapping_helpers/airlock/locked,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible,
-/turf/open/floor/engine,
-/area/station/maintenance/disposal/incinerator)
"aem" = (
/obj/machinery/power/terminal,
/obj/structure/cable,
@@ -201,14 +191,6 @@
},
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
-"aeH" = (
-/obj/machinery/atmospherics/components/trinary/filter/flipped/layer2{
- dir = 4
- },
-/obj/structure/extinguisher_cabinet/directional/north,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/plating,
-/area/station/maintenance/disposal/incinerator)
"aeX" = (
/obj/structure/window/spawner/directional/east,
/obj/item/kirbyplants/random,
@@ -531,12 +513,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{
@@ -2456,6 +2432,12 @@
},
/turf/open/floor/engine,
/area/station/science/ordnance/burnchamber)
+"aVV" = (
+/obj/machinery/atmospherics/pipe/layer_manifold/supply/visible{
+ dir = 4
+ },
+/turf/closed/wall/r_wall,
+/area/station/maintenance/department/engine/atmos)
"aVX" = (
/obj/structure/cable,
/obj/structure/chair,
@@ -2661,6 +2643,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
@@ -3581,6 +3570,12 @@
/obj/item/airlock_painter/decal,
/turf/open/floor/iron/smooth,
/area/station/cargo/sorting)
+"btT" = (
+/obj/machinery/camera/directional/east{
+ c_tag = "Atmospherics Tank - Mix"
+ },
+/turf/open/floor/engine/vacuum,
+/area/station/engineering/atmos)
"btV" = (
/obj/effect/turf_decal/siding/wideplating,
/obj/structure/railing/corner,
@@ -4380,26 +4375,6 @@
/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood,
/area/station/service/chapel)
-"bJH" = (
-/obj/effect/turf_decal/tile/brown/opposingcorners,
-/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/door/airlock/engineering{
- name = "Engineering Office"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
- cycle_id = "atmos_airlock_1"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/office)
"bJK" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -4942,6 +4917,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
@@ -4949,11 +4931,6 @@
/obj/machinery/chem_heater/withbuffer,
/turf/open/floor/iron,
/area/station/science/xenobiology)
-"bXb" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/decal/cleanable/dirt/dust,
-/turf/open/floor/plating,
-/area/station/maintenance/department/electrical)
"bXi" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -5111,24 +5088,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/department/engine)
-"cag" = (
-/obj/effect/turf_decal/tile/brown/opposingcorners,
-/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{
- dir = 4
- },
-/obj/machinery/door/airlock/engineering{
- name = "Engineering Office"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
- cycle_id = "atmos_airlock_1"
- },
-/obj/structure/cable,
-/obj/machinery/door/firedoor,
-/obj/structure/disposalpipe/segment{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos/office)
"cam" = (
/obj/machinery/flasher/directional/east{
id = "AI";
@@ -5429,6 +5388,10 @@
/obj/effect/spawner/structure/window/survival_pod,
/turf/open/floor/plating,
/area/station/ai_monitored/turret_protected/ai)
+"cfD" = (
+/obj/item/pickaxe,
+/turf/open/floor/plating,
+/area/station/maintenance/department/electrical)
"cfH" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
@@ -5708,16 +5671,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/port)
-"ckR" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Plasma to Pure"
- },
-/obj/machinery/atmospherics/pipe/bridge_pipe/green{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"ckV" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -6199,6 +6152,11 @@
/obj/machinery/light/cold/directional/north,
/turf/open/floor/iron,
/area/station/security/prison/rec)
+"cva" = (
+/obj/structure/cable,
+/obj/machinery/airalarm/directional/south,
+/turf/open/floor/plating,
+/area/station/maintenance/disposal/incinerator)
"cvc" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -6689,6 +6647,16 @@
},
/turf/open/floor/plating,
/area/station/engineering/atmos/pumproom)
+"cEm" = (
+/obj/machinery/atmospherics/components/binary/pump/on{
+ name = "O2 to Airmix"
+ },
+/obj/machinery/light/no_nightlight/directional/north,
+/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"cEn" = (
/obj/structure/disposalpipe/segment,
/obj/effect/decal/cleanable/dirt,
@@ -7324,14 +7292,6 @@
},
/turf/open/floor/plating,
/area/station/ai_monitored/turret_protected/aisat/maint)
-"cQV" = (
-/obj/machinery/door/airlock/engineering/glass{
- name = "Engineering Storage"
- },
-/turf/open/floor/iron/smooth_half{
- dir = 8
- },
-/area/station/engineering/main)
"cRc" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -7542,6 +7502,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 +7710,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 +8345,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,
@@ -8542,6 +8524,14 @@
/obj/structure/sign/poster/official/random/directional/north,
/turf/open/floor/iron,
/area/station/hallway/secondary/dock)
+"dlM" = (
+/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)
"dmk" = (
/obj/machinery/holopad,
/obj/effect/landmark/start/depsec/medical,
@@ -9215,10 +9205,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
-"dzH" = (
-/obj/machinery/portable_atmospherics/canister/plasma,
-/turf/open/floor/engine/plasma,
-/area/station/engineering/atmos)
"dAn" = (
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
@@ -9639,6 +9625,10 @@
/obj/effect/spawner/random/structure/girder,
/turf/open/floor/plating,
/area/station/maintenance/fore/lesser)
+"dJl" = (
+/obj/machinery/air_sensor/mix_tank,
+/turf/open/floor/engine/vacuum,
+/area/station/engineering/atmos)
"dJn" = (
/obj/machinery/light/small/directional/south{
dir = 4
@@ -10677,6 +10667,16 @@
/obj/structure/broken_flooring/singular/directional/east,
/turf/open/floor/iron,
/area/station/hallway/secondary/dock)
+"eeu" = (
+/obj/machinery/door/airlock/maintenance{
+ name = "Atmospherics Maintenance"
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/turf/open/floor/plating,
+/area/station/maintenance/disposal/incinerator)
"eeD" = (
/obj/structure/showcase/cyborg/old{
pixel_y = 20
@@ -10844,13 +10844,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";
@@ -11440,6 +11433,27 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/dark/side,
/area/station/hallway/primary/central/fore)
+"est" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/door/airlock/engineering{
+ name = "Engineering Office"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ 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)
"esv" = (
/obj/docking_port/stationary{
dwidth = 4;
@@ -12412,11 +12426,6 @@
/obj/effect/turf_decal/stripes/asteroid/end,
/turf/open/floor/circuit/green,
/area/station/science/robotics/mechbay)
-"eKd" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/engine,
-/area/station/maintenance/disposal/incinerator)
"eKf" = (
/obj/structure/table,
/obj/item/storage/box/donkpockets/donkpocketpizza,
@@ -12445,9 +12454,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 +12605,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 +12726,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{
@@ -13375,6 +13381,17 @@
"feR" = (
/turf/open/floor/carpet,
/area/station/service/library)
+"feY" = (
+/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)
"ffi" = (
/obj/structure/cable,
/obj/machinery/power/apc/auto_name/directional/north,
@@ -14363,13 +14380,6 @@
"fxi" = (
/turf/open/floor/iron/dark/small,
/area/station/science/xenobiology)
-"fxp" = (
-/obj/effect/spawner/structure/window/reinforced/plasma,
-/obj/machinery/atmospherics/pipe/smart/simple/orange{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/station/engineering/supermatter/room)
"fxF" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -14425,14 +14435,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
@@ -16670,6 +16672,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,
@@ -16794,6 +16803,12 @@
"gmf" = (
/turf/open/floor/iron/white/small,
/area/station/commons/toilet/restrooms)
+"gmg" = (
+/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/wall/r_wall,
+/area/station/maintenance/department/engine/atmos)
"gmm" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -16935,15 +16950,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,
@@ -18153,6 +18159,10 @@
},
/turf/open/floor/iron/freezer,
/area/station/command/corporate_suite)
+"gJq" = (
+/obj/effect/spawner/random/structure/crate_loot,
+/turf/open/floor/plating,
+/area/station/maintenance/department/electrical)
"gJu" = (
/obj/structure/closet,
/obj/effect/mapping_helpers/broken_floor,
@@ -18698,13 +18708,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
@@ -18845,12 +18848,6 @@
/obj/machinery/atmospherics/pipe/smart/simple/green/visible,
/turf/open/floor/engine/o2,
/area/station/engineering/atmos)
-"gUQ" = (
-/obj/machinery/atmospherics/pipe/layer_manifold/supply/visible{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/station/engineering/atmos/pumproom)
"gUV" = (
/obj/structure/cable,
/obj/structure/chair/stool/directional/south{
@@ -19669,12 +19666,6 @@
/obj/effect/mapping_helpers/airlock/access/all/security/general,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"hhr" = (
-/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/station/engineering/atmos/pumproom)
"hhL" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -19864,6 +19855,10 @@
/obj/machinery/status_display/ai/directional/west,
/turf/open/floor/iron/dark/herringbone,
/area/station/ai_monitored/command/nuke_storage)
+"hkX" = (
+/obj/machinery/button/ignition/incinerator/atmos,
+/turf/closed/wall/r_wall,
+/area/station/maintenance/disposal/incinerator)
"hlC" = (
/obj/effect/spawner/structure/window,
/obj/effect/turf_decal/bot{
@@ -20154,11 +20149,6 @@
dir = 8
},
/area/station/science/lobby)
-"hqH" = (
-/obj/structure/reagent_dispensers/watertank,
-/obj/item/reagent_containers/cup/watering_can/wood,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/greater)
"hqM" = (
/obj/structure/toiletbong{
dir = 1
@@ -20987,6 +20977,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,
@@ -21364,6 +21362,21 @@
/obj/machinery/status_display/ai/directional/east,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
+"hMB" = (
+/obj/machinery/atmospherics/components/trinary/filter/flipped/layer2{
+ dir = 4
+ },
+/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)
"hMK" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/item/kirbyplants/organic/applebush,
@@ -21865,13 +21878,6 @@
/obj/machinery/light/small/directional/north,
/turf/open/floor/iron/dark,
/area/station/science/genetics)
-"hWa" = (
-/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/bridge_pipe/green,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"hWk" = (
/obj/machinery/vending/coffee,
/obj/structure/extinguisher_cabinet/directional/south,
@@ -22194,6 +22200,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
@@ -22926,6 +22939,11 @@
/obj/structure/chair/stool/directional/west,
/turf/open/floor/iron,
/area/station/security/prison/rec)
+"iof" = (
+/obj/effect/spawner/structure/window/reinforced/plasma,
+/obj/machinery/atmospherics/pipe/smart/simple/orange/visible,
+/turf/open/floor/plating,
+/area/station/engineering/supermatter/room)
"ioo" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -23295,13 +23313,6 @@
"itb" = (
/turf/closed/wall/r_wall/rust,
/area/station/ai_monitored/turret_protected/aisat/maint)
-"itr" = (
-/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/bridge_pipe/green,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"itw" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -25617,13 +25628,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,
@@ -27087,6 +27091,15 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
+"jCB" = (
+/obj/machinery/door/airlock/engineering{
+ name = "Engineering Office"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/engineering/engine_equipment,
+/turf/open/floor/iron/smooth_half{
+ dir = 8
+ },
+/area/station/maintenance/department/engine/atmos)
"jCH" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
@@ -27811,15 +27824,6 @@
/obj/structure/spider/stickyweb,
/turf/open/floor/iron/small,
/area/station/maintenance/department/engine/atmos)
-"jMQ" = (
-/obj/machinery/atmospherics/components/binary/pump/off{
- name = "O2 To Pure"
- },
-/obj/machinery/atmospherics/pipe/bridge_pipe/green{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"jMX" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -28232,6 +28236,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
@@ -30250,6 +30261,9 @@
/obj/effect/turf_decal/trimline/neutral/line,
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
+"kyS" = (
+/turf/closed/wall/r_wall/rust,
+/area/station/maintenance/department/electrical)
"kzs" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -30962,13 +30976,6 @@
/obj/structure/closet/firecloset,
/turf/open/floor/plating,
/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" = (
/turf/open/floor/engine/o2,
/area/station/engineering/atmos)
@@ -31500,6 +31507,9 @@
/obj/structure/sign/poster/official/random/directional/north,
/turf/open/floor/plating,
/area/station/hallway/secondary/dock)
+"kXX" = (
+/turf/open/floor/engine/vacuum,
+/area/station/engineering/atmos)
"kYa" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -31881,14 +31891,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,
@@ -32121,6 +32123,15 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/small,
/area/station/maintenance/department/electrical)
+"lgs" = (
+/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
+ },
+/area/station/engineering/main)
"lgw" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -32323,6 +32334,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
@@ -32462,6 +32482,16 @@
/obj/item/pen,
/turf/open/floor/iron,
/area/station/security/prison/rec)
+"lkE" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "CO2 to Pure"
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"lkI" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -33213,9 +33243,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"
@@ -33895,12 +33922,6 @@
/obj/machinery/light/cold/directional/north,
/turf/open/floor/iron,
/area/station/science/lower)
-"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" = (
/obj/structure/chair/stool/directional/south,
/obj/effect/decal/cleanable/dirt,
@@ -35503,13 +35524,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 +36648,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 +37277,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
@@ -38513,6 +38516,25 @@
dir = 4
},
/area/station/science/xenobiology)
+"nlP" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/engineering{
+ name = "Engineering Office"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "atmos_airlock_1"
+ },
+/obj/structure/cable,
+/obj/machinery/door/firedoor,
+/obj/structure/disposalpipe/segment{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/office)
"nlQ" = (
/obj/machinery/holopad,
/obj/effect/turf_decal/siding/thinplating{
@@ -39090,6 +39112,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 +39883,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
@@ -39934,15 +39961,6 @@
/obj/machinery/light_switch/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
-"nKe" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/smart/simple/orange{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/station/engineering/supermatter/room)
"nKj" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -40414,6 +40432,16 @@
/obj/machinery/camera/autoname/directional/south,
/turf/open/floor/iron,
/area/station/hallway/secondary/dock)
+"nTx" = (
+/obj/machinery/portable_atmospherics/canister/air,
+/obj/effect/turf_decal/bot{
+ dir = 1
+ },
+/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)
"nTy" = (
/obj/machinery/transport/power_rectifier{
configured_transport_id = "bird_1"
@@ -40885,15 +40913,6 @@
/obj/machinery/computer/records/security,
/turf/open/floor/iron,
/area/station/security/brig/entrance)
-"ocZ" = (
-/obj/machinery/portable_atmospherics/canister/air,
-/obj/effect/turf_decal/bot{
- dir = 1
- },
-/obj/machinery/power/apc/auto_name/directional/west,
-/obj/structure/cable,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/storage)
"odh" = (
/obj/effect/landmark/atmospheric_sanity/ignore_area,
/turf/open/floor/plating,
@@ -40924,6 +40943,17 @@
/obj/machinery/firealarm/directional/west,
/turf/open/floor/iron/dark/small,
/area/station/medical/morgue)
+"odS" = (
+/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 = 4
+ },
+/turf/open/floor/engine,
+/area/station/engineering/supermatter)
"odX" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -43190,12 +43220,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{
@@ -43643,6 +43667,14 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
+"pbU" = (
+/obj/machinery/door/airlock/engineering{
+ 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)
"pca" = (
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/stripes/red/line{
@@ -44329,10 +44361,6 @@
/obj/structure/flora/bush/jungle/c/style_random,
/turf/open/floor/grass,
/area/station/service/chapel)
-"pnO" = (
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/maintenance/disposal/incinerator)
"pnQ" = (
/obj/effect/turf_decal/stripes/white/line{
dir = 6
@@ -46119,6 +46147,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 +46179,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 +46500,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,
@@ -46931,16 +46985,6 @@
/obj/machinery/power/apc/auto_name/directional/north,
/turf/open/floor/iron/white,
/area/station/science/cytology)
-"qht" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "CO2 to Pure"
- },
-/obj/machinery/atmospherics/pipe/bridge_pipe/green{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"qhD" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -47557,14 +47601,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{
@@ -47970,6 +48006,10 @@
name = "Holodeck Projector Floor"
},
/area/station/holodeck/rec_center)
+"qBv" = (
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/iron/smooth_large,
+/area/station/engineering/supermatter/room)
"qBz" = (
/obj/effect/turf_decal/siding/wood,
/obj/structure/mannequin/plastic,
@@ -48755,6 +48795,15 @@
/obj/machinery/door/firedoor/heavy,
/turf/open/floor/iron/dark/textured,
/area/station/engineering/atmos/office)
+"qPF" = (
+/obj/machinery/atmospherics/components/binary/pump/off{
+ name = "O2 To Pure"
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"qPJ" = (
/obj/machinery/status_display/ai/directional/north,
/turf/open/floor/iron,
@@ -48794,6 +48843,12 @@
"qQv" = (
/turf/open/floor/iron,
/area/station/security/prison/rec)
+"qQy" = (
+/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)
"qQB" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -49086,13 +49141,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
@@ -50563,6 +50611,11 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/iron/small,
/area/station/ai_monitored/command/storage/eva)
+"rty" = (
+/obj/machinery/portable_atmospherics/canister/plasma,
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible,
+/turf/open/floor/engine/plasma,
+/area/station/engineering/atmos)
"rtI" = (
/turf/open/floor/iron/white/corner{
dir = 8
@@ -50645,13 +50698,6 @@
"ruD" = (
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
-"ruR" = (
-/obj/machinery/door/airlock/engineering{
- name = "Engine Airlock"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plating,
-/area/station/engineering/supermatter/room)
"ruS" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -51556,11 +51602,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 +52957,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,
@@ -53427,9 +53473,6 @@
/obj/structure/disposalpipe/segment,
/turf/closed/wall,
/area/station/maintenance/port/greater)
-"srw" = (
-/turf/closed/wall/r_wall/rust,
-/area/station/engineering/atmospherics_engine)
"srx" = (
/obj/machinery/power/port_gen/pacman,
/obj/effect/turf_decal/bot{
@@ -53549,13 +53592,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,
@@ -53580,6 +53616,13 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
+"stW" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/orange/visible,
+/turf/open/floor/engine,
+/area/station/engineering/supermatter/room)
"stX" = (
/obj/effect/landmark/start/chief_medical_officer,
/turf/open/floor/wood/parquet,
@@ -53603,6 +53646,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
@@ -53638,6 +53689,12 @@
/obj/effect/mapping_helpers/airlock/access/any/service/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
+"svj" = (
+/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)
"svo" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/dna_scannernew,
@@ -54317,6 +54374,20 @@
/obj/effect/spawner/random/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/department/engine)
+"sHB" = (
+/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior,
+/obj/effect/mapping_helpers/airlock/locked,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/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)
"sHH" = (
/obj/effect/turf_decal/stripes/line,
/obj/machinery/portable_atmospherics/canister/plasma,
@@ -56170,6 +56241,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,
@@ -56711,18 +56788,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,
@@ -59145,6 +59210,11 @@
dir = 1
},
/area/station/science/research)
+"uiV" = (
+/obj/structure/reagent_dispensers/watertank,
+/obj/item/reagent_containers/cup/watering_can/wood,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/greater)
"uiY" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -59941,6 +60011,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 +60150,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 +60158,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)
@@ -60811,6 +60868,13 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/plating/rust,
/area/station/engineering/main)
+"uLl" = (
+/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"uLD" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -61472,15 +61536,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 +61772,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,
@@ -61997,6 +62048,12 @@
/obj/item/toy/crayon/purple,
/turf/open/floor/iron/white,
/area/station/science/research)
+"vge" = (
+/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)
"vgf" = (
/obj/machinery/portable_atmospherics/scrubber,
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
@@ -63898,15 +63955,6 @@
/obj/machinery/light/cold/directional/east,
/turf/open/floor/engine,
/area/station/science/xenobiology)
-"vHU" = (
-/obj/machinery/door/airlock/engineering{
- name = "Engineering Office"
- },
-/obj/effect/mapping_helpers/airlock/access/any/engineering/general,
-/turf/open/floor/iron/smooth_half{
- dir = 8
- },
-/area/station/maintenance/department/engine/atmos)
"vHV" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -65436,14 +65484,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,
@@ -65753,6 +65793,13 @@
/obj/effect/spawner/random/structure/crate,
/turf/open/floor/plating,
/area/station/maintenance/aft)
+"wmi" = (
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"wmq" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -66902,17 +66949,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{
@@ -67700,16 +67736,6 @@
},
/turf/open/floor/iron/smooth,
/area/station/engineering/main)
-"wPO" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- name = "O2 to Airmix"
- },
-/obj/machinery/atmospherics/pipe/bridge_pipe/green{
- dir = 4
- },
-/obj/machinery/light/no_nightlight/directional/north,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"wPP" = (
/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{
dir = 1
@@ -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,
@@ -69147,6 +69166,10 @@
/obj/item/kirbyplants/random,
/turf/open/floor/iron/white,
/area/station/science/cytology)
+"xkQ" = (
+/obj/effect/spawner/random/structure/girder,
+/turf/open/floor/plating,
+/area/station/maintenance/department/electrical)
"xkU" = (
/obj/effect/turf_decal/siding/thinplating_new/terracotta{
dir = 9
@@ -69514,6 +69537,16 @@
dir = 1
},
/area/station/command/bridge)
+"xqy" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "Plasma to Pure"
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"xqC" = (
/turf/closed/wall,
/area/station/maintenance/hallway/abandoned_command)
@@ -70293,13 +70326,6 @@
/obj/effect/spawner/random/trash,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
-"xAx" = (
-/obj/machinery/door/airlock/engineering/glass/critical{
- heat_proof = 1;
- name = "Supermatter Chamber"
- },
-/turf/open/floor/engine,
-/area/station/engineering/supermatter)
"xAA" = (
/obj/effect/turf_decal/tile/green/half/contrasted{
dir = 1
@@ -72320,16 +72346,6 @@
"yeh" = (
/turf/closed/wall,
/area/station/hallway/primary/starboard)
-"yei" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Transit Tube Station"
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/turf/open/floor/plating,
-/area/station/maintenance/disposal/incinerator)
"yel" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
@@ -79360,7 +79376,7 @@ ybp
qBK
jMp
cor
-wPO
+cEm
wLw
udH
gbh
@@ -79601,7 +79617,7 @@ rDU
hYC
bLp
wGx
-qht
+lkE
nrn
lCT
trX
@@ -79617,7 +79633,7 @@ kNx
tyc
dJn
nrn
-jMQ
+qPF
wmL
civ
gbh
@@ -81403,7 +81419,7 @@ fAD
jWm
ybO
kVB
-dzH
+rty
rPg
nrn
trY
@@ -81646,7 +81662,7 @@ wWm
mPB
pit
wWm
-pnO
+cva
pCn
teV
dix
@@ -81657,7 +81673,7 @@ ykk
hYC
egC
nlt
-ckR
+xqy
nrn
ktJ
saq
@@ -81899,7 +81915,7 @@ wBo
sRf
wBo
hFO
-wBo
+hkX
mPB
wWm
nlR
@@ -82155,9 +82171,9 @@ wBo
fgX
uFS
wBo
-eKd
+dlM
wBo
-aeH
+hMB
dOP
pit
dHx
@@ -82413,7 +82429,7 @@ bTI
jnI
gya
qBM
-ael
+sHB
wcF
eqr
mUe
@@ -83454,8 +83470,8 @@ oVm
fjf
sRW
fjf
-itr
-hWa
+uLl
+wmi
wFK
ybO
qOr
@@ -83959,7 +83975,7 @@ pWm
pRw
pnl
pxz
-yei
+eeu
ybO
ybO
qKA
@@ -83992,7 +84008,7 @@ kjW
fcE
ceN
cDV
-kUN
+bNq
ybs
knv
knv
@@ -84218,8 +84234,8 @@ wzv
wzv
fjh
dfd
-ybO
-jbE
+pnl
+ooo
ukP
ooo
jZl
@@ -84230,7 +84246,7 @@ wmq
vMI
pKW
kiP
-wmq
+svj
dYv
jZl
feu
@@ -84240,7 +84256,7 @@ bGX
jhj
cGV
tkU
-ocZ
+nTx
pqr
tkU
kUN
@@ -84249,7 +84265,7 @@ tKn
eWr
xcW
prP
-kUN
+bNq
ybs
knv
aJq
@@ -84475,9 +84491,9 @@ wzv
wzv
fjh
wzv
-ybO
+pnl
dpH
-kNv
+dJl
gAy
jZl
bKK
@@ -84506,7 +84522,7 @@ hBi
bzF
gzM
svd
-kUN
+bNq
liX
jqd
lxP
@@ -84732,10 +84748,10 @@ pWm
pWm
uEH
dfd
-ybO
-ybO
-ybO
-ybO
+pnl
+kXX
+kXX
+kXX
jZl
bEG
rCk
@@ -84763,7 +84779,7 @@ isC
bPd
vDG
rry
-kUN
+bNq
olj
cmf
gBh
@@ -84988,11 +85004,11 @@ wzv
wzv
wzv
yil
-yil
-wfB
-kNn
-yil
-kNn
+wzv
+pnl
+kXX
+btT
+kXX
jZl
oqq
tmK
@@ -85020,7 +85036,7 @@ uqg
cjS
gqS
kmL
-eKU
+ecq
olj
gBh
gBh
@@ -85241,16 +85257,16 @@ dDB
aWx
tdY
qcF
-wzv
+kNn
yil
xnL
yil
-pWm
-pWm
-pWm
-mMF
-mDb
-srw
+qQy
+pnl
+pnl
+pnl
+pnl
+kyS
tXF
qaU
yew
@@ -85277,7 +85293,7 @@ hMQ
tNm
nWa
iua
-kUN
+bNq
bJK
dez
gBh
@@ -85498,14 +85514,14 @@ pWm
pWm
pWm
pWm
-pWm
rjo
pWm
pWm
pWm
-bvt
-bvt
-bXb
+qQy
+qQy
+qQy
+qQy
yil
fTJ
qpp
@@ -85534,7 +85550,7 @@ kti
iwR
oQK
dFG
-kUN
+bNq
cvJ
olj
knv
@@ -85753,18 +85769,18 @@ dDB
dDB
tYT
aJq
-aJq
-pWm
+gcs
ako
mmT
vtJ
acg
pWm
-bvt
-bvt
-vcm
+gJq
+wzv
+wzv
+wzv
oii
-jZl
+pnl
sZP
wvZ
mDS
@@ -85791,7 +85807,7 @@ lkN
rjw
vSt
kOH
-kUN
+bNq
cvJ
aIk
knv
@@ -86010,8 +86026,7 @@ dDB
dDB
tYT
aJq
-aJq
-pWm
+gcs
arN
wOz
viE
@@ -86019,9 +86034,10 @@ bOa
pWm
bvt
bvt
-bvt
+xkQ
+cfD
oii
-jZl
+pnl
gmv
jrD
jrD
@@ -86048,7 +86064,7 @@ vuV
xLS
lfq
cHt
-kUN
+bNq
xxt
liX
knv
@@ -86267,8 +86283,7 @@ dDB
dDB
tYT
aJq
-aJq
-pWm
+gcs
pWm
hDg
qMG
@@ -86277,35 +86292,36 @@ bvt
bvt
bvt
bvt
+bvt
yil
-jZl
+pnl
wFZ
oLc
jDi
jDi
jDi
-jZl
-srw
-jZl
-jZl
+pnl
+kyS
+pnl
+pnl
jZl
xck
-cag
+nlP
xck
-bJH
+est
xck
cGV
-cGV
-cGV
-lwK
-cGV
-kUN
-hhr
-kUN
-gUQ
-kUN
-kUN
-kUN
+bNq
+bNq
+ecq
+bNq
+bNq
+gmg
+bNq
+aVV
+bNq
+bNq
+bNq
knv
tZE
knv
@@ -86526,22 +86542,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
@@ -86792,13 +86808,13 @@ bvt
bvt
pWm
yil
-jZl
+pnl
urP
kLr
wkj
tuu
kHd
-jZl
+pnl
oCE
pWm
pWm
@@ -86963,7 +86979,7 @@ eua
izh
xAG
jWd
-lGO
+vge
cZA
hyX
tBm
@@ -87050,11 +87066,11 @@ bvt
pWm
qjp
kNn
-jZl
-jZl
-jZl
-srw
-jZl
+pnl
+pnl
+pnl
+kyS
+pnl
tOc
oCE
pWm
@@ -88349,14 +88365,14 @@ oYv
jJg
bsG
wqW
-cQV
+lgs
tdb
tdb
tdb
tdb
qyr
mLZ
-vHU
+jCB
lER
hRO
knv
@@ -88839,7 +88855,7 @@ ayK
ayK
ayK
lQU
-ruR
+pbU
lQU
ayK
lQU
@@ -88847,7 +88863,7 @@ lQU
lQU
ayK
lQU
-ruR
+pbU
lQU
ayK
rDV
@@ -89606,8 +89622,8 @@ uqe
uLW
blb
aKm
-fxp
-nKe
+iof
+stW
guh
cBl
fJe
@@ -90393,7 +90409,7 @@ szg
tpW
pUM
kMe
-kMe
+qBv
fGf
ayK
izf
@@ -91156,7 +91172,7 @@ dyI
dyI
ozQ
ozQ
-xAx
+odS
brA
brA
dyI
@@ -91670,7 +91686,7 @@ cBd
cBd
dyI
ozQ
-xAx
+feY
brA
dyI
oer
@@ -92701,7 +92717,7 @@ buI
kjs
xUK
vni
-uAM
+nHH
lHd
nHH
xTr
@@ -112293,14 +112309,14 @@ fcW
jVY
cvk
nFW
-uAD
-rKa
+uvG
+siN
jpp
-wDO
-ldP
+nuV
+sue
jpp
-amT
-mgO
+cUB
+baO
pzd
gMz
rem
@@ -112550,14 +112566,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 +112825,10 @@ nFW
nFW
pzd
pzd
-oTK
-uXe
-gTa
-wYb
+tlJ
+cYp
+jTC
+eOX
pzd
xQJ
xQJ
@@ -113067,7 +113083,7 @@ fsq
iRl
pzd
pzd
-tuI
+pTk
pzd
pzd
pzd
@@ -113324,7 +113340,7 @@ fLg
tHi
tfc
wOp
-goY
+ljc
xQJ
ejn
vJx
@@ -113581,7 +113597,7 @@ pot
rUq
lyq
wOp
-goY
+ljc
xQJ
mbV
vJx
@@ -113838,7 +113854,7 @@ iqi
cUY
dnk
wOp
-qux
+pYi
xXT
ihv
rdw
@@ -129055,7 +129071,7 @@ uxL
lhl
jxD
ylD
-hqH
+uiV
vzv
brz
cgM
diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm
index 5e78718c948..823ada46192 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,
@@ -5239,6 +5229,34 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
+"bSi" = (
+/obj/structure/table/reinforced,
+/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
+ },
+/area/station/medical/pharmacy)
"bSr" = (
/obj/effect/turf_decal/siding/purple{
dir = 4
@@ -10265,22 +10283,6 @@
},
/turf/open/floor/carpet/orange,
/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
- },
-/turf/open/floor/iron/white/smooth_edge{
- dir = 4
- },
-/area/station/medical/pharmacy)
"dGt" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 8
@@ -10747,6 +10749,20 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/cargo/storage)
+"dPo" = (
+/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)
"dPq" = (
/obj/machinery/camera/autoname/directional/east,
/turf/open/floor/grass,
@@ -17273,10 +17289,6 @@
dir = 1
},
/area/station/science/research)
-"ggl" = (
-/obj/machinery/camera/autoname/directional/west,
-/turf/open/floor/grass,
-/area/station/service/hydroponics/garden)
"ggu" = (
/obj/machinery/door/airlock/public/glass{
name = "Library"
@@ -34379,6 +34391,11 @@
/obj/machinery/computer/station_alert,
/turf/open/floor/iron,
/area/station/engineering/atmos/upper)
+"miq" = (
+/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)
"mit" = (
/obj/structure/weightmachine/weightlifter,
/obj/machinery/newscaster/directional/east,
@@ -39202,6 +39219,19 @@
},
/turf/open/floor/iron,
/area/station/maintenance/disposal/incinerator)
+"nUW" = (
+/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)
"nVa" = (
/obj/structure/closet/secure_closet/brig/genpop,
/obj/machinery/firealarm/directional/south,
@@ -42471,20 +42501,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,
@@ -49567,12 +49583,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{
@@ -49759,6 +49769,10 @@
/obj/machinery/firealarm/directional/north,
/turf/open/floor/iron,
/area/station/engineering/storage)
+"rEm" = (
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/grass,
+/area/station/service/hydroponics/garden)
"rEp" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
@@ -49937,6 +49951,16 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron,
/area/station/cargo/sorting)
+"rHk" = (
+/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)
"rHm" = (
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -53807,11 +53831,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 +58851,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 +66467,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,
@@ -82777,7 +82789,7 @@ mBj
jHx
iJF
kFT
-rBL
+uJq
sGt
ltj
fvo
@@ -87401,7 +87413,7 @@ xlw
qfB
vyO
hjW
-dGs
+bSi
rdP
qfB
rgx
@@ -88940,7 +88952,7 @@ tIH
tIH
tIH
iuv
-ggl
+rEm
tIH
tIH
kAg
@@ -103815,7 +103827,7 @@ tdk
hkc
swi
dHy
-atk
+rHk
trL
nMP
xOU
@@ -104319,7 +104331,7 @@ vfJ
xbu
gMK
cPt
-pfz
+dPo
wtu
dfr
mKF
@@ -104340,7 +104352,7 @@ qnQ
xcb
wCO
tld
-xvO
+nUW
azv
azv
azv
@@ -177836,7 +177848,7 @@ gmH
rXS
tOL
fPv
-sXs
+miq
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/jobs.dm b/code/__DEFINES/jobs.dm
index 13d0f1c9063..f7700da8441 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 7caf94b70d8..17f9c742da1 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 b615cf3ce63..3fd9993c018 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,23 +145,28 @@ 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_MEDICAL_HUD" = TRAIT_MEDICAL_HUD,
"TRAIT_MIME_FAN" = TRAIT_MIME_FAN,
"TRAIT_MIMING" = TRAIT_MIMING,
"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,
@@ -139,13 +175,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,
@@ -154,7 +195,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,
@@ -163,7 +207,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,
@@ -175,6 +221,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,
@@ -185,16 +232,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,
@@ -209,23 +262,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,
@@ -241,7 +299,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/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/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 144b2ea2aef..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,8 +291,6 @@
return
item = SStraitor.uplink_items_by_type[item_path]
uplink_handler.purchase_item(ui.user, item, parent)
-<<<<<<< HEAD
-=======
if("buy_raw_tc")
if (uplink_handler.telecrystals <= 0)
return
@@ -297,7 +298,6 @@
if(!desired_amount || desired_amount < 1)
return
uplink_handler.purchase_raw_tc(ui.user, desired_amount, parent)
->>>>>>> 63e3e2b25636 (Fixes an infinite tc glitch (#85543))
if("lock")
if(!lockable)
return TRUE
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/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index 40e06362d97..6395323efc7 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -186,6 +186,7 @@
/obj/machinery/LateInitialize()
SHOULD_NOT_OVERRIDE(TRUE)
post_machine_initialize()
+ CheckParts()
/obj/machinery/Destroy(force)
SSmachines.unregister_machine(src)
diff --git a/code/game/machinery/medipen_refiller.dm b/code/game/machinery/medipen_refiller.dm
index 57c3fa2f8d4..bbe331db506 100644
--- a/code/game/machinery/medipen_refiller.dm
+++ b/code/game/machinery/medipen_refiller.dm
@@ -25,7 +25,6 @@
. = ..()
AddComponent(/datum/component/plumbing/simple_demand)
register_context()
- CheckParts()
/obj/machinery/medipen_refiller/add_context(atom/source, list/context, obj/item/held_item, mob/user)
if(held_item)
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/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..dfcd6031d87 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]."),
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 7992aa95a7f..6bef1b35f3b 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..cd8247af3df 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -505,6 +505,36 @@ 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"
+ 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/nullrod/bostaff/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = 10, \
+ force_wielded = 14, \
+ icon_wielded = "[base_icon_state]1", \
+ )
+
+/obj/item/nullrod/bostaff/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/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 350c694012e..6184879a358 100644
--- a/code/modules/antagonists/heretic/influences.dm
+++ b/code/modules/antagonists/heretic/influences.dm
@@ -251,7 +251,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)
@@ -283,15 +283,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 4274893e998..6254427af39 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
@@ -66,6 +66,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
@@ -281,6 +284,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/packs/imports.dm b/code/modules/cargo/packs/imports.dm
index a7853ad55ab..0ae09f0dc6e 100644
--- a/code/modules/cargo/packs/imports.dm
+++ b/code/modules/cargo/packs/imports.dm
@@ -313,11 +313,12 @@
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/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/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/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..7cc067ed0a2 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
@@ -578,7 +578,20 @@
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/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 ab777d3ed9c..879ac86afc5 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 66deda41155..a502ab1df2e 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 71c7aa9fc89..dcfea298f20 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -591,6 +591,7 @@
/mob/living/silicon/robot/updatehealth()
..()
+ update_damage_particles()
if(!model.breakable_modules)
return
@@ -688,6 +689,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/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 899e1f8b615..71a68c77c28 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/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-29102.yml b/html/changelogs/AutoChangeLog-pr-29102.yml
new file mode 100644
index 00000000000..2254f481f7e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29102.yml
@@ -0,0 +1,5 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "Grass sheath now holds parsnip sabres like its supposed to"
+ - spellcheck: "Fixed up parsnip sabre description grammar"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-29165.yml b/html/changelogs/AutoChangeLog-pr-29165.yml
new file mode 100644
index 00000000000..fa481ea9640
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29165.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - qol: "Renamed seed packs to have the plant name at the beginning"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-29171.yml b/html/changelogs/AutoChangeLog-pr-29171.yml
new file mode 100644
index 00000000000..2acb367dbff
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29171.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "Fixes the echolocation screen overlay not appearing with default arguments due to using the wrong icon state"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-29188.yml b/html/changelogs/AutoChangeLog-pr-29188.yml
new file mode 100644
index 00000000000..0f0f3f7fece
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29188.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "Rice hat no longer disappears upon being toggled and can be raised back up. Toggling sprites is now done by alt-clicking"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-29203.yml b/html/changelogs/AutoChangeLog-pr-29203.yml
new file mode 100644
index 00000000000..7a1d5a3ca08
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29203.yml
@@ -0,0 +1,4 @@
+author: "Leathergnome"
+delete-after: True
+changes:
+ - rscadd: "Wallet to the Loadout menu in the accesory tab"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-29213.yml b/html/changelogs/AutoChangeLog-pr-29213.yml
new file mode 100644
index 00000000000..e534777fb44
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29213.yml
@@ -0,0 +1,4 @@
+author: "HometownFunky"
+delete-after: True
+changes:
+ - image: "added shading to valeborg sprites and updated the colors for the vale jani/medical models."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-29214.yml b/html/changelogs/AutoChangeLog-pr-29214.yml
new file mode 100644
index 00000000000..63dce6443c2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29214.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "Fixed handyman assistants spawning without a PDA"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-29215.yml b/html/changelogs/AutoChangeLog-pr-29215.yml
new file mode 100644
index 00000000000..91227bce656
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29215.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "juvenile lobstrosities will now look for food"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-29217.yml b/html/changelogs/AutoChangeLog-pr-29217.yml
new file mode 100644
index 00000000000..6397648a6a4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29217.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "Elevator music no longer restarts when you take a step"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-29218.yml b/html/changelogs/AutoChangeLog-pr-29218.yml
new file mode 100644
index 00000000000..fdaca89d371
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29218.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - rscdel: "Remove narsie and ratvar plushies from loadout"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-29220.yml b/html/changelogs/AutoChangeLog-pr-29220.yml
new file mode 100644
index 00000000000..64d9e85e67d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29220.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - code_imp: "Removed multiple cases of unnecessary updatehealth"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-29222.yml b/html/changelogs/AutoChangeLog-pr-29222.yml
new file mode 100644
index 00000000000..aabb51ad52d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29222.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "Plasmamen helmets now display their smiles + can be painted with spraycans"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-29223.yml b/html/changelogs/AutoChangeLog-pr-29223.yml
new file mode 100644
index 00000000000..e2396d394b5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29223.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - admin: "fix hard restart option"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-29224.yml b/html/changelogs/AutoChangeLog-pr-29224.yml
new file mode 100644
index 00000000000..4f3e7895da6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29224.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - image: "Ash Blade has received a new sprite."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-29225.yml b/html/changelogs/AutoChangeLog-pr-29225.yml
new file mode 100644
index 00000000000..ed6cf7587ca
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29225.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - image: "Resprited teleporter beacons"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-29226.yml b/html/changelogs/AutoChangeLog-pr-29226.yml
new file mode 100644
index 00000000000..2a846bd19db
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29226.yml
@@ -0,0 +1,4 @@
+author: "Odairu"
+delete-after: True
+changes:
+ - rscadd: "adds pixel shifting items, and pixel tilting mobs"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-29227.yml b/html/changelogs/AutoChangeLog-pr-29227.yml
new file mode 100644
index 00000000000..d00aa3d2685
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29227.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "Tinacusiate no longer changes hearing spans for every single person in-game"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-29228.yml b/html/changelogs/AutoChangeLog-pr-29228.yml
new file mode 100644
index 00000000000..5fe6ae41bc0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29228.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "Fixed a runtime error after draining a heretic influence."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-29229.yml b/html/changelogs/AutoChangeLog-pr-29229.yml
new file mode 100644
index 00000000000..b96e1a6dd78
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-29229.yml
@@ -0,0 +1,4 @@
+author: "MrMelbert, SmArtKar"
+delete-after: True
+changes:
+ - bugfix: "Holding someone at gunpoint no longer makes all shots count as point blank"
\ No newline at end of file
diff --git a/html/changelogs/archive/2024-08.yml b/html/changelogs/archive/2024-08.yml
index a60294e8930..04551b0504d 100644
--- a/html/changelogs/archive/2024-08.yml
+++ b/html/changelogs/archive/2024-08.yml
@@ -105,3 +105,107 @@
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
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..86396dcaa8c 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..2cbe944aecc 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/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/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/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/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 b684abf4e1c..ae6b2478c32 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/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/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..3a8808bd257 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 @@
/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
+ //whether or not parent is shifting items
+ var/shifting_items
+ //whether or not parent is tilting
+ var/tilting
+ //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,59 @@
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_ITEM_PIXEL_SHIFT_DOWN)
+ UnregisterSignal(parent, COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_UP)
+ UnregisterSignal(parent, COMSIG_KB_MOB_PIXEL_TILT_DOWN)
+ UnregisterSignal(parent, COMSIG_KB_MOB_PIXEL_TILT_UP)
UnregisterSignal(parent, COMSIG_KB_MOB_PIXEL_SHIFT_DOWN)
UnregisterSignal(parent, COMSIG_KB_MOB_PIXEL_SHIFT_UP)
+ UnregisterSignal(parent, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE)
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)
-/// 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)
+ if(shifting_items || shifting || tilting)
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
+ tilting = TRUE
+ return COMSIG_KB_ACTIVATED
+
+/datum/component/pixel_shift/proc/pixel_tilt_up()
+ SIGNAL_HANDLER
+ tilting = FALSE
+
+//Procs for shifting items
+
+/datum/component/pixel_shift/proc/item_pixel_shift_down()
+ SIGNAL_HANDLER
+ shifting_items = TRUE
+ return COMSIG_KB_ACTIVATED
+
+/datum/component/pixel_shift/proc/item_pixel_shift_up()
+ SIGNAL_HANDLER
+ shifting_items = 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
@@ -64,37 +103,69 @@
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
+ 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--
+ else if(shifting)
+ 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
+ else if(tilting)
+ 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
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/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/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/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 c4d61fc2f0f..f7b938a27a0 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2590,6 +2590,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"
@@ -8206,7 +8207,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"
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/ChemMaster.tsx b/tgui/packages/tgui/interfaces/ChemMaster.tsx
index 62692588c65..6a2becf3eb0 100644
--- a/tgui/packages/tgui/interfaces/ChemMaster.tsx
+++ b/tgui/packages/tgui/interfaces/ChemMaster.tsx
@@ -5,6 +5,8 @@ import {
Button,
ColorBox,
Divider,
+ DmIcon,
+ Icon,
LabeledList,
NumberInput,
ProgressBar,
@@ -13,7 +15,7 @@ import {
Table,
Tooltip,
} from 'tgui-core/components';
-import { BooleanLike, classes } from 'tgui-core/react';
+import { BooleanLike } from 'tgui-core/react';
import { capitalize } from 'tgui-core/string';
import { useBackend } from '../backend';
@@ -22,6 +24,7 @@ import { Beaker, BeakerReagent } from './common/BeakerDisplay';
type Container = {
icon: string;
+ icon_state: string;
ref: string;
name: string;
volume: number;
@@ -375,6 +378,8 @@ const ContainerButton = (props: CategoryButtonProps) => {
const { isPrinting, selectedContainerRef, suggestedContainerRef } = data;
const { category, container, showPreferredContainer } = props;
const isPillPatch = ['pills', 'patches'].includes(category.name);
+ const fallback = ;
+ const fallbackPillPatch = ;
return (
{
});
}}
>
-
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/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 (
-
+
+
+
);
};
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}
+
+
+
+ ) : (
+ 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 && (
{
/>
)}
+
+ SyndOS Version 3.17
+ Connection Secure
+
);
};
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 && (
-
- act('lock')}
- />
- )}
-
-
-
+
+
+
+ {!!has_objectives && (
+ <>
+ this.setState({ currentTab: 0 })}
+ >
+ Primary Objectives
+
+ this.setState({ currentTab: 1 })}
+ >
+ Secondary Objectives
+
+ >
+ )}
+ this.setState({ currentTab: 2 })}
+ >
+ Market
+
+
+
+
+ {!!lockable && (
+
+ act('lock')}
+ >
+ Lock
+
+
+ )}
+
+
+
+ )}
{(currentTab === 0 && has_objectives && (
{
handleRequestObjectives={() => act('regenerate_objectives')}
/>
)) || (
-
+ <>
{
@@ -471,7 +483,7 @@ export class Uplink extends Component<{}, UplinkState> {
)) ||
null}
-
+ >
)}