diff --git a/.github/gbp.toml b/.github/gbp.toml
index 70032056dfe..fe086e79b55 100644
--- a/.github/gbp.toml
+++ b/.github/gbp.toml
@@ -9,6 +9,7 @@ reset_label = "GBP: Reset"
"Code Improvement" = 2
"Documentation" = 1
"Feature" = -6
+"Good First PR" = 6
"Feedback" = 2
"Fix" = 3
"Grammar and Formatting" = 1
diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml
index 420cf0c9688..f317e6b1a1a 100644
--- a/.github/workflows/ci_suite.yml
+++ b/.github/workflows/ci_suite.yml
@@ -79,8 +79,12 @@ jobs:
- name: Check Define Sanity
if: steps.linter-setup.conclusion == 'success' && !cancelled()
run: tools/bootstrap/python -m define_sanity.check
+ - name: Check Trait Validity
+ if: steps.linter-setup.conclusion == 'success' && !cancelled()
+ run: tools/bootstrap/python -m trait_validity.check
- name: Run DreamChecker
if: steps.linter-setup.conclusion == 'success' && !cancelled()
+ shell: bash
run: ~/dreamchecker 2>&1 | bash tools/ci/annotate_dm.sh
- name: Run Map Checks
if: steps.linter-setup.conclusion == 'success' && !cancelled()
diff --git a/_maps/skyrat/automapper/automapper_config.toml b/_maps/skyrat/automapper/automapper_config.toml
index 1683d43dae8..00c9ae33593 100644
--- a/_maps/skyrat/automapper/automapper_config.toml
+++ b/_maps/skyrat/automapper/automapper_config.toml
@@ -197,39 +197,6 @@ required_map = "IceBoxStation.dmm"
coordinates = [202, 16, 2]
trait_name = "Station"
-# KILOSTATION MAP EDITS
-# Kilostation Arrivals
-[templates.kilostation_arrivals]
-map_files = ["kilostation_arrivals.dmm"]
-directory = "_maps/skyrat/automapper/templates/kilostation/"
-required_map = "KiloStation.dmm"
-coordinates = [151, 80, 1]
-trait_name = "Station"
-
-# Kilostation ERT Bay and Barber
-[templates.kilostation_ert_bay]
-map_files = ["kilostation_ert_bay.dmm"]
-directory = "_maps/skyrat/automapper/templates/kilostation/"
-required_map = "KiloStation.dmm"
-coordinates = [77, 151, 1]
-trait_name = "Station"
-
-# Kilostation Cryo
-[templates.kilostation_cryo]
-map_files = ["kilostation_cryo.dmm"]
-directory = "_maps/skyrat/automapper/templates/kilostation/"
-required_map = "KiloStation.dmm"
-coordinates = [59, 118, 1]
-trait_name = "Station"
-
-# Kilostation Armory
-[templates.kilostation_armory]
-map_files = ["kilostation_armory.dmm"]
-directory = "_maps/skyrat/automapper/templates/kilostation/"
-required_map = "KiloStation.dmm"
-coordinates = [81, 80, 1]
-trait_name = "Station"
-
# TRAMSTATION MAP EDITS
# Tramstation Arrivals
[templates.tramstation_arrivals]
diff --git a/_maps/skyrat/automapper/templates/kilostation/kilostation_armory.dmm b/_maps/skyrat/automapper/templates/kilostation/kilostation_armory.dmm
deleted file mode 100644
index 229c3d31bd0..00000000000
--- a/_maps/skyrat/automapper/templates/kilostation/kilostation_armory.dmm
+++ /dev/null
@@ -1,144 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"e" = (
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/bot,
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/secure_closet/armory_kiboko,
-/turf/open/floor/iron/showroomfloor,
-/area/station/ai_monitored/security/armory)
-"q" = (
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/bot,
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/structure/rack/gunrack,
-/obj/effect/spawner/armory_spawn/microfusion,
-/turf/open/floor/iron/showroomfloor,
-/area/station/ai_monitored/security/armory)
-"u" = (
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/bot,
-/obj/structure/rack,
-/obj/item/clothing/head/helmet/sec{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/clothing/head/helmet/sec,
-/obj/item/clothing/head/helmet/sec{
- pixel_x = 3;
- pixel_y = -3
- },
-/obj/item/clothing/suit/armor/vest/alt/sec{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/clothing/suit/armor/vest/alt/sec,
-/obj/item/clothing/suit/armor/vest/alt/sec{
- pixel_x = 3;
- pixel_y = -3
- },
-/turf/open/floor/iron/dark,
-/area/station/ai_monitored/security/armory)
-"w" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/bot,
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/structure/rack/gunrack,
-/obj/effect/spawner/armory_spawn/smg,
-/turf/open/floor/iron/showroomfloor,
-/area/station/ai_monitored/security/armory)
-"G" = (
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/bot,
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/structure/rack/gunrack,
-/obj/effect/spawner/armory_spawn/shotguns,
-/turf/open/floor/iron/showroomfloor,
-/area/station/ai_monitored/security/armory)
-"N" = (
-/obj/item/clothing/mask/gas/sechailer{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/clothing/mask/gas/sechailer,
-/obj/item/clothing/mask/gas/sechailer{
- pixel_x = 3;
- pixel_y = -3
- },
-/obj/item/flashlight/seclite,
-/obj/item/flashlight/seclite,
-/obj/item/flashlight/seclite,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/decal/cleanable/cobweb,
-/obj/machinery/airalarm/directional/west,
-/obj/structure/table,
-/obj/item/storage/barricade{
- pixel_y = -5
- },
-/obj/item/storage/barricade,
-/obj/item/storage/barricade{
- pixel_y = 5
- },
-/turf/open/floor/iron/dark,
-/area/station/ai_monitored/security/armory)
-"S" = (
-/turf/template_noop,
-/area/template_noop)
-
-(1,1,1) = {"
-N
-S
-S
-S
-"}
-(2,1,1) = {"
-u
-S
-S
-S
-"}
-(3,1,1) = {"
-S
-S
-w
-e
-"}
-(4,1,1) = {"
-S
-S
-q
-G
-"}
diff --git a/_maps/skyrat/automapper/templates/kilostation/kilostation_arrivals.dmm b/_maps/skyrat/automapper/templates/kilostation/kilostation_arrivals.dmm
deleted file mode 100644
index dc4d9060ab2..00000000000
--- a/_maps/skyrat/automapper/templates/kilostation/kilostation_arrivals.dmm
+++ /dev/null
@@ -1,357 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"a" = (
-/turf/open/floor/plating/airless,
-/area/space)
-"e" = (
-/obj/effect/turf_decal/bot,
-/obj/machinery/computer/shuttle/arrivals/recall{
- dir = 1
- },
-/turf/open/floor/iron/dark,
-/area/station/hallway/secondary/entry)
-"f" = (
-/turf/closed/wall/rust,
-/area/station/hallway/secondary/entry)
-"h" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 1
- },
-/obj/effect/turf_decal/box,
-/turf/open/floor/iron,
-/area/station/hallway/secondary/entry)
-"i" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/stripes/line,
-/obj/item/radio/intercom/directional/east,
-/turf/open/floor/iron,
-/area/station/hallway/secondary/entry)
-"j" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/light/small/directional/west,
-/obj/machinery/status_display/shuttle/directional/west{
- shuttle_id = "arrivals_shuttle"
- },
-/turf/open/floor/iron,
-/area/station/hallway/secondary/entry)
-"k" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/sign/warning/vacuum/external,
-/turf/open/floor/plating,
-/area/station/hallway/secondary/entry)
-"n" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = -4;
- pixel_y = 4
- },
-/obj/item/pen,
-/obj/effect/turf_decal/loading_area{
- dir = 1
- },
-/turf/open/floor/iron/dark,
-/area/station/hallway/secondary/entry)
-"p" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/stripes/corner,
-/obj/effect/landmark/start/hangover,
-/turf/open/floor/iron,
-/area/station/hallway/secondary/entry)
-"q" = (
-/turf/closed/wall,
-/area/station/hallway/secondary/entry)
-"r" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/bluespace_vendor/directional/west,
-/turf/open/floor/iron,
-/area/station/hallway/secondary/entry)
-"s" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/flora/bush/pale/style_random,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/misc/asteroid/airless,
-/area/space/nearstation)
-"t" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/light/small/directional/east,
-/obj/machinery/status_display/shuttle/directional/east{
- shuttle_id = "arrivals_shuttle"
- },
-/turf/open/floor/iron,
-/area/station/hallway/secondary/entry)
-"v" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/flora/grass/jungle/a/style_random,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/misc/asteroid/airless,
-/area/space/nearstation)
-"x" = (
-/obj/effect/turf_decal/bot,
-/obj/structure/closet/emcloset,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/machinery/light/small/directional/south,
-/obj/structure/sign/poster/contraband/random/directional/south,
-/turf/open/floor/iron/dark,
-/area/station/hallway/secondary/entry)
-"z" = (
-/obj/effect/spawner/random/vending/colavend,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron/dark,
-/area/station/hallway/secondary/entry)
-"A" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/hallway/secondary/entry)
-"D" = (
-/obj/effect/turf_decal/stripes/line,
-/turf/open/misc/asteroid/airless,
-/area/space/nearstation)
-"E" = (
-/obj/machinery/door/airlock/external{
- name = "Arrival Shuttle Airlock"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/iron/dark,
-/area/station/hallway/secondary/entry)
-"F" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/hallway/secondary/entry)
-"G" = (
-/obj/machinery/door/airlock/external{
- name = "Arrival Shuttle Airlock";
- space_dir = 2
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/turf/open/floor/iron/dark,
-/area/station/hallway/secondary/entry)
-"I" = (
-/obj/structure/sign/warning/docking,
-/turf/closed/wall,
-/area/station/hallway/secondary/entry)
-"J" = (
-/obj/effect/turf_decal/tile/red,
-/turf/open/floor/iron,
-/area/station/hallway/secondary/entry)
-"M" = (
-/turf/closed/mineral/random/labormineral,
-/area/space/nearstation)
-"O" = (
-/obj/docking_port/stationary{
- dir = 4;
- dwidth = 1;
- height = 13;
- shuttle_id = "arrivals_stationary";
- name = "arrivals";
- width = 5
- },
-/turf/open/floor/plating/airless,
-/area/space)
-"S" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/flora/grass/jungle/b/style_random,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/misc/asteroid/airless,
-/area/space/nearstation)
-"T" = (
-/obj/structure/sign/warning/secure_area{
- name = "EMERGENCY STORAGE"
- },
-/turf/closed/wall,
-/area/station/hallway/secondary/entry)
-"V" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/vending/clothing,
-/turf/open/floor/iron/dark,
-/area/station/hallway/secondary/entry)
-"W" = (
-/obj/machinery/door/airlock/external{
- name = "Arrival Shuttle Airlock"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/effect/landmark/navigate_destination,
-/turf/open/floor/iron/dark,
-/area/station/hallway/secondary/entry)
-"X" = (
-/obj/effect/turf_decal/bot,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/structure/closet/firecloset,
-/turf/open/floor/iron/dark,
-/area/station/hallway/secondary/entry)
-"Y" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/iron,
-/area/station/hallway/secondary/entry)
-
-(1,1,1) = {"
-x
-f
-M
-S
-a
-a
-a
-a
-"}
-(2,1,1) = {"
-X
-q
-M
-v
-a
-O
-a
-a
-"}
-(3,1,1) = {"
-T
-f
-q
-I
-a
-a
-a
-a
-"}
-(4,1,1) = {"
-r
-E
-j
-G
-a
-a
-a
-a
-"}
-(5,1,1) = {"
-A
-F
-F
-F
-a
-a
-a
-a
-"}
-(6,1,1) = {"
-h
-n
-F
-s
-a
-a
-a
-a
-"}
-(7,1,1) = {"
-Y
-V
-k
-v
-a
-a
-a
-a
-"}
-(8,1,1) = {"
-J
-z
-F
-D
-a
-a
-a
-a
-"}
-(9,1,1) = {"
-J
-e
-F
-v
-a
-a
-a
-a
-"}
-(10,1,1) = {"
-p
-F
-F
-F
-a
-a
-a
-a
-"}
-(11,1,1) = {"
-i
-W
-t
-G
-a
-a
-a
-a
-"}
-(12,1,1) = {"
-f
-q
-f
-I
-a
-a
-a
-a
-"}
diff --git a/_maps/skyrat/automapper/templates/kilostation/kilostation_cryo.dmm b/_maps/skyrat/automapper/templates/kilostation/kilostation_cryo.dmm
deleted file mode 100644
index d3035bcc07a..00000000000
--- a/_maps/skyrat/automapper/templates/kilostation/kilostation_cryo.dmm
+++ /dev/null
@@ -1,204 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"a" = (
-/turf/closed/wall,
-/area/station/common/cryopods)
-"c" = (
-/obj/structure/table,
-/obj/item/clipboard,
-/obj/item/screwdriver{
- pixel_y = 16
- },
-/turf/open/floor/iron/dark,
-/area/station/maintenance/port/greater)
-"d" = (
-/obj/effect/turf_decal/bot,
-/obj/structure/frame/computer{
- anchored = 1;
- dir = 1
- },
-/obj/structure/cable,
-/turf/open/floor/iron/dark,
-/area/station/maintenance/port/greater)
-"e" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "greylair";
- name = "Lair Privacy Shutter"
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/maintenance/port/greater)
-"g" = (
-/turf/open/floor/iron,
-/area/station/common/cryopods)
-"j" = (
-/obj/machinery/computer/cryopod/directional/east,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/common/cryopods)
-"l" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/common/cryopods)
-"o" = (
-/obj/machinery/power/apc/auto_name/directional/west,
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/common/cryopods)
-"r" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "greylair";
- name = "Lair Privacy Shutter"
- },
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/maintenance/port/greater)
-"u" = (
-/obj/effect/turf_decal/bot,
-/obj/structure/frame/computer{
- anchored = 1;
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/dark,
-/area/station/maintenance/port/greater)
-"x" = (
-/obj/machinery/cryopod,
-/obj/effect/turf_decal/siding/white,
-/obj/machinery/airalarm/directional/east,
-/turf/open/floor/iron/dark,
-/area/station/common/cryopods)
-"z" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Cryopods"
- },
-/obj/effect/landmark/navigate_destination,
-/turf/open/floor/iron,
-/area/station/common/cryopods)
-"A" = (
-/obj/machinery/cryopod,
-/obj/effect/turf_decal/siding/white,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/dark,
-/area/station/common/cryopods)
-"D" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/common/cryopods)
-"J" = (
-/obj/effect/turf_decal/siding/white{
- dir = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 1
- },
-/obj/machinery/camera/directional/east,
-/obj/machinery/time_clock/directional/east,
-/obj/item/kirbyplants/random,
-/turf/open/floor/iron/dark,
-/area/station/common/cryopods)
-"O" = (
-/obj/machinery/cryopod,
-/obj/effect/turf_decal/siding/white,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark,
-/area/station/common/cryopods)
-"Q" = (
-/obj/structure/table,
-/obj/item/storage/briefcase/secure,
-/obj/item/taperecorder,
-/obj/structure/sign/warning/electric_shock/directional/south,
-/turf/open/floor/iron/dark,
-/area/station/maintenance/port/greater)
-"R" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "greylair";
- name = "Lair Privacy Shutter"
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/maintenance/port/greater)
-"S" = (
-/obj/machinery/cryopod{
- dir = 1
- },
-/obj/effect/turf_decal/siding/white{
- dir = 9
- },
-/turf/open/floor/iron/dark,
-/area/station/common/cryopods)
-"U" = (
-/turf/closed/wall,
-/area/station/maintenance/port/greater)
-"W" = (
-/obj/machinery/cryopod,
-/obj/effect/turf_decal/siding/white,
-/obj/structure/cable,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 4
- },
-/obj/machinery/light/directional/west,
-/turf/open/floor/iron/dark,
-/area/station/common/cryopods)
-"X" = (
-/obj/effect/turf_decal/bot,
-/obj/structure/frame/computer{
- anchored = 1;
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark,
-/area/station/maintenance/port/greater)
-
-(1,1,1) = {"
-Q
-a
-a
-a
-a
-a
-"}
-(2,1,1) = {"
-d
-r
-W
-o
-g
-l
-"}
-(3,1,1) = {"
-X
-e
-O
-g
-g
-z
-"}
-(4,1,1) = {"
-u
-R
-A
-D
-S
-l
-"}
-(5,1,1) = {"
-c
-r
-x
-j
-J
-l
-"}
-(6,1,1) = {"
-U
-a
-a
-a
-a
-a
-"}
diff --git a/_maps/skyrat/automapper/templates/kilostation/kilostation_ert_bay.dmm b/_maps/skyrat/automapper/templates/kilostation/kilostation_ert_bay.dmm
deleted file mode 100644
index 34e0fbcad74..00000000000
--- a/_maps/skyrat/automapper/templates/kilostation/kilostation_ert_bay.dmm
+++ /dev/null
@@ -1,3119 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"ad" = (
-/obj/structure/transit_tube/diagonal/topleft,
-/obj/structure/lattice/catwalk,
-/turf/open/space/basic,
-/area/space/nearstation)
-"an" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/sign/poster/official/random/directional/east,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"aK" = (
-/obj/machinery/newscaster/directional/east,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
-/turf/open/floor/carpet/executive,
-/area/station/command/heads_quarters/nt_rep)
-"bb" = (
-/obj/machinery/door/airlock/maintenance/external{
- name = "Transit Intersection"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/effect/mapping_helpers/airlock/unres{
- dir = 8
- },
-/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/lesser)
-"bj" = (
-/obj/machinery/bluespace_vendor/directional/east,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/airlock/public/glass{
- name = "Salon Hallway"
- },
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/caution/stand_clear,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"bB" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/sign/poster/contraband/random/directional/south,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/burnt_floor,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/plating,
-/area/station/maintenance/fore)
-"bH" = (
-/obj/structure/transit_tube/diagonal/crossing/topleft,
-/obj/structure/lattice/catwalk,
-/turf/open/space/basic,
-/area/space/nearstation)
-"bV" = (
-/obj/structure/chair/sofa/bench/right{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/hallway/primary/fore)
-"ca" = (
-/obj/machinery/airalarm/directional/north,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/turf/open/floor/carpet/executive,
-/area/station/command/heads_quarters/nt_rep)
-"cc" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 4
- },
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"cf" = (
-/obj/machinery/firealarm/directional/west,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"cm" = (
-/obj/structure/filingcabinet/employment,
-/turf/open/floor/carpet/executive,
-/area/station/command/heads_quarters/nt_rep)
-"cW" = (
-/obj/structure/fans/tiny/forcefield{
- dir = 1
- },
-/obj/structure/sign/warning/vacuum/external/directional/east,
-/obj/machinery/door/poddoor/preopen{
- name = "Dock Shutter"
- },
-/turf/open/floor/plating,
-/area/station/hallway/primary/fore)
-"cX" = (
-/obj/structure/closet/secure_closet/nanotrasen_consultant/station,
-/obj/item/assembly/flash/handheld,
-/obj/machinery/status_display/ai/directional/north,
-/turf/open/floor/carpet/executive,
-/area/station/command/heads_quarters/nt_rep)
-"df" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/effect/turf_decal/delivery,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/structure/sign/poster/official/random/directional/north,
-/turf/open/floor/iron/dark/corner{
- dir = 1
- },
-/area/station/hallway/primary/fore)
-"ds" = (
-/obj/structure/chair/sofa/bench/right{
- dir = 8
- },
-/obj/effect/landmark/start/assistant,
-/obj/effect/turf_decal/tile/green,
-/turf/open/floor/iron/dark/corner,
-/area/station/hallway/primary/fore)
-"dC" = (
-/obj/effect/turf_decal/tile/purple/opposingcorners{
- dir = 8
- },
-/turf/open/floor/iron/cafeteria,
-/area/station/service/barber)
-"dG" = (
-/obj/machinery/camera/directional/north,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"dV" = (
-/obj/effect/spawner/structure/window/hollow/reinforced/middle,
-/obj/structure/transit_tube,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/lesser)
-"dY" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/iron/dark/corner{
- dir = 4
- },
-/area/station/hallway/primary/fore)
-"dZ" = (
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/space/nearstation)
-"ew" = (
-/obj/structure/sign/departments/custodian,
-/turf/closed/wall,
-/area/station/maintenance/fore)
-"ey" = (
-/obj/effect/turf_decal/tile/purple/opposingcorners{
- dir = 8
- },
-/obj/machinery/vending/barbervend,
-/obj/item/radio/intercom/directional/north,
-/turf/open/floor/iron/cafeteria,
-/area/station/service/barber)
-"eL" = (
-/obj/structure/closet{
- name = "maid locker"
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/bot,
-/obj/effect/decal/cleanable/dirt,
-/obj/item/clothing/gloves/color/white,
-/obj/item/clothing/accessory/maidapron{
- pixel_x = -4;
- pixel_y = -4
- },
-/obj/item/clothing/shoes/laceup,
-/obj/structure/mirror/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/maintenance/fore)
-"eQ" = (
-/obj/structure/table,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/item/storage/box/mousetraps{
- pixel_x = -4;
- pixel_y = 4
- },
-/obj/item/flashlight,
-/obj/structure/noticeboard/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/maintenance/fore)
-"eZ" = (
-/obj/machinery/door/airlock/maintenance,
-/obj/effect/mapping_helpers/airlock/abandoned,
-/obj/structure/barricade/wooden/crude,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/airlock/unres{
- dir = 4
- },
-/obj/effect/mapping_helpers/airlock/access/all/service/janitor,
-/turf/open/floor/iron/dark,
-/area/station/maintenance/fore)
-"fb" = (
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark/corner{
- dir = 4
- },
-/area/station/hallway/primary/fore)
-"fc" = (
-/obj/effect/turf_decal/siding/white{
- dir = 5
- },
-/obj/machinery/vending/coffee,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"fr" = (
-/obj/machinery/light/directional/west,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"fx" = (
-/obj/structure/cable,
-/obj/machinery/light/directional/south,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/wood,
-/area/station/command/heads_quarters/nt_rep)
-"fA" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/window/reinforced/spawner/directional/north,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/lesser)
-"fF" = (
-/obj/effect/turf_decal/siding/white{
- dir = 4
- },
-/obj/effect/spawner/random/vending/snackvend,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"fR" = (
-/obj/structure/sign/warning/secure_area,
-/turf/closed/wall,
-/area/space/nearstation)
-"fT" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/burnt_floor,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/plating,
-/area/station/maintenance/fore)
-"gk" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/closet/firecloset,
-/obj/effect/turf_decal/bot,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/item/radio/intercom/directional/north,
-/turf/open/floor/iron/dark/corner{
- dir = 1
- },
-/area/station/hallway/primary/fore)
-"gv" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/iron/dark/corner{
- dir = 8
- },
-/area/station/hallway/primary/fore)
-"gw" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/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/iron,
-/area/station/hallway/primary/fore)
-"gx" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark/corner{
- dir = 4
- },
-/area/station/hallway/primary/fore)
-"gy" = (
-/obj/structure/chair/sofa/bench{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"gH" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/lesser)
-"gW" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"gX" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 1
- },
-/obj/machinery/holopad,
-/turf/open/floor/wood,
-/area/station/command/heads_quarters/nt_rep)
-"ha" = (
-/obj/structure/sign/departments/holy{
- pixel_y = 30
- },
-/turf/open/floor/iron/stairs/right{
- dir = 4
- },
-/area/station/hallway/primary/fore)
-"hd" = (
-/obj/machinery/firealarm/directional/south,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"hg" = (
-/obj/structure/window/reinforced/spawner/directional/south,
-/turf/open/misc/asteroid/airless,
-/area/space/nearstation)
-"hj" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"hs" = (
-/obj/machinery/light/directional/south,
-/obj/effect/turf_decal/siding/white{
- dir = 4
- },
-/obj/structure/sign/poster/official/random/directional/south,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"hS" = (
-/obj/structure/transit_tube/diagonal/crossing/topleft,
-/turf/open/misc/asteroid/airless,
-/area/space/nearstation)
-"iv" = (
-/obj/structure/cable,
-/turf/open/floor/iron/stairs/old{
- dir = 8
- },
-/area/station/maintenance/fore/lesser)
-"iy" = (
-/obj/machinery/door/airlock/maintenance,
-/obj/effect/mapping_helpers/airlock/unres{
- dir = 8
- },
-/obj/structure/cable,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance,
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/lesser)
-"iD" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/plating,
-/area/station/hallway/primary/fore)
-"iM" = (
-/obj/structure/fans/tiny/forcefield{
- dir = 1
- },
-/obj/machinery/door/poddoor/preopen{
- name = "Dock Shutter"
- },
-/turf/open/floor/plating,
-/area/station/hallway/primary/fore)
-"iV" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/hallway/primary/fore)
-"jA" = (
-/obj/structure/table,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/item/storage/box/lights/mixed{
- pixel_x = -4;
- pixel_y = 4
- },
-/obj/item/storage/belt/janitor,
-/obj/item/storage/bag/trash,
-/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6/directional/north,
-/obj/effect/decal/cleanable/cobweb,
-/turf/open/floor/iron/dark,
-/area/station/maintenance/fore)
-"jC" = (
-/obj/structure/chair/sofa/bench{
- dir = 8
- },
-/obj/effect/turf_decal/siding/white{
- dir = 4
- },
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"jJ" = (
-/obj/structure/transit_tube/crossing,
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/station/maintenance/fore/lesser)
-"jK" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"jS" = (
-/obj/machinery/light/directional/north,
-/obj/effect/turf_decal/siding/white{
- dir = 4
- },
-/obj/machinery/airalarm/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"jV" = (
-/turf/open/floor/plating,
-/area/station/hallway/primary/fore)
-"jY" = (
-/obj/effect/landmark/carpspawn,
-/turf/open/space/basic,
-/area/space)
-"kh" = (
-/obj/effect/turf_decal/siding/white{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/station/hallway/primary/fore)
-"ku" = (
-/obj/machinery/camera/directional/north,
-/obj/item/radio/intercom/directional/north,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"kz" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- name = "Privacy Shutter";
- id = "nt_rep_priv_2"
- },
-/turf/open/floor/plating,
-/area/station/command/heads_quarters/nt_rep)
-"kE" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/station/hallway/primary/fore)
-"kI" = (
-/obj/effect/turf_decal/siding/white{
- dir = 6
- },
-/obj/effect/spawner/random/vending/colavend,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"kP" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/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/iron,
-/area/station/hallway/primary/fore)
-"lr" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/machinery/newscaster/directional/north,
-/obj/machinery/camera/directional/north{
- c_tag = "Fore Hallway Monastary Tube";
- name = "fore camera"
- },
-/obj/structure/chair/sofa/bench,
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/iron/dark/corner{
- dir = 4
- },
-/area/station/hallway/primary/fore)
-"lw" = (
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/transit_tube/crossing,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/lesser)
-"lU" = (
-/obj/effect/turf_decal/tile/purple/opposingcorners{
- dir = 8
- },
-/obj/structure/closet/secure_closet/barber,
-/obj/effect/decal/cleanable/dirt,
-/obj/item/pushbroom,
-/obj/item/reagent_containers/spray/cleaner,
-/obj/machinery/firealarm/directional/west,
-/obj/effect/decal/cleanable/cobweb,
-/obj/machinery/light_switch/directional/north,
-/turf/open/floor/iron/cafeteria,
-/area/station/service/barber)
-"mi" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/grille,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"mU" = (
-/obj/structure/chair/sofa/bench{
- dir = 8
- },
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"mZ" = (
-/turf/open/floor/carpet/executive,
-/area/station/command/heads_quarters/nt_rep)
-"nc" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/structure/disposalpipe/segment,
-/obj/structure/window/reinforced/spawner/directional/south,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"ne" = (
-/turf/closed/wall,
-/area/space/nearstation)
-"nv" = (
-/obj/machinery/airalarm/directional/east,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"nA" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/bot,
-/obj/structure/sink/directional/east,
-/obj/item/reagent_containers/cup/bucket,
-/obj/item/mop,
-/obj/effect/turf_decal/stripes/corner,
-/obj/machinery/button/door/directional/south{
- id = "maidbay";
- name = "Maid Bay Toggle"
- },
-/obj/structure/sign/poster/contraband/random/directional/west,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/fore)
-"nE" = (
-/obj/structure/chair/sofa/bench{
- dir = 8
- },
-/obj/effect/turf_decal/siding/white{
- dir = 4
- },
-/obj/effect/landmark/start/assistant,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"nF" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/iron/dark/corner{
- dir = 8
- },
-/area/station/hallway/primary/fore)
-"nN" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/hallway/primary/fore)
-"nS" = (
-/obj/structure/chair/sofa/bench/corner{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green,
-/obj/machinery/camera/directional/south,
-/turf/open/floor/iron/dark/corner,
-/area/station/hallway/primary/fore)
-"nW" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"oi" = (
-/obj/effect/turf_decal/tile/neutral,
-/obj/structure/extinguisher_cabinet/directional/east,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/iron/dark/corner{
- dir = 4
- },
-/area/station/hallway/primary/fore)
-"oR" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- name = "Privacy Shutter";
- id = "nt_rep_priv"
- },
-/turf/open/floor/plating,
-/area/station/command/heads_quarters/nt_rep)
-"oZ" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/closed/wall/r_wall/rust,
-/area/station/command/heads_quarters/nt_rep)
-"pf" = (
-/turf/closed/wall,
-/area/station/maintenance/fore)
-"qg" = (
-/obj/structure/closet/crate,
-/obj/item/hand_labeler,
-/obj/item/storage/crayons,
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/turf/open/floor/plating,
-/area/station/maintenance/fore)
-"qj" = (
-/obj/structure/chair/sofa/bench/right{
- dir = 8
- },
-/obj/effect/turf_decal/siding/white{
- dir = 4
- },
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"qr" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/fore)
-"qM" = (
-/obj/machinery/button/door/directional/north{
- name = "Privacy Shutters Control";
- id = "nt_rep_priv"
- },
-/obj/structure/table/wood,
-/obj/item/folder/yellow{
- pixel_x = 8;
- pixel_y = -1
- },
-/obj/item/folder/red{
- pixel_x = -4;
- pixel_y = -2
- },
-/obj/item/folder/white{
- pixel_x = 4;
- pixel_y = 3
- },
-/obj/item/folder/blue{
- pixel_y = 6;
- pixel_x = -2
- },
-/turf/open/floor/wood,
-/area/station/command/heads_quarters/nt_rep)
-"qS" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/structure/noticeboard/directional/north{
- dir = 2;
- name = "Chapel Notice Board"
- },
-/obj/machinery/light/directional/north,
-/obj/structure/chair/sofa/bench/right,
-/turf/open/floor/iron/dark/corner{
- dir = 4
- },
-/area/station/hallway/primary/fore)
-"qU" = (
-/obj/effect/turf_decal/tile/green,
-/turf/open/floor/iron/dark/corner,
-/area/station/hallway/primary/fore)
-"rk" = (
-/obj/effect/turf_decal/siding/white{
- dir = 1
- },
-/obj/machinery/newscaster/directional/west,
-/obj/effect/landmark/start/barber,
-/turf/open/floor/iron/dark,
-/area/station/service/barber)
-"rt" = (
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/cable,
-/obj/machinery/power/apc/auto_name/directional/east,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/lesser)
-"rz" = (
-/obj/structure/closet/crate/bin,
-/obj/machinery/camera/directional/north,
-/obj/structure/noticeboard/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"rE" = (
-/obj/effect/turf_decal/siding/white{
- dir = 4
- },
-/obj/item/kirbyplants/random,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"rL" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 8
- },
-/obj/machinery/light_switch/directional/south,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/wood,
-/area/station/command/heads_quarters/nt_rep)
-"rT" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"su" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/iron/dark/corner{
- dir = 4
- },
-/area/station/hallway/primary/fore)
-"sz" = (
-/obj/effect/turf_decal/stripes/line{
- 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/iron,
-/area/station/hallway/primary/fore)
-"tg" = (
-/turf/closed/wall/rust,
-/area/station/maintenance/fore)
-"tx" = (
-/obj/structure/transit_tube/crossing,
-/obj/effect/turf_decal/sand/plating,
-/obj/structure/window/reinforced/spawner/directional/south,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"tz" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/structure/sign/warning/secure_area/directional/east,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"tU" = (
-/obj/item/radio/intercom/directional/south,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"ud" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"uf" = (
-/obj/effect/landmark/start/nanotrasen_consultant,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
-/turf/open/floor/wood,
-/area/station/command/heads_quarters/nt_rep)
-"uj" = (
-/obj/structure/lattice,
-/obj/structure/grille/broken,
-/turf/open/space/basic,
-/area/space/nearstation)
-"uI" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/landmark/blobstart,
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/fore)
-"uM" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/machinery/button/curtain{
- id = "barbershopcurtains1";
- pixel_x = -25;
- pixel_y = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/landmark/start/hangover,
-/turf/open/floor/iron/dark,
-/area/station/service/barber)
-"uX" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/machinery/firealarm/directional/north,
-/obj/structure/chair/sofa/bench,
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/iron/dark/corner{
- dir = 4
- },
-/area/station/hallway/primary/fore)
-"vp" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable,
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/lesser)
-"vs" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"vE" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"vJ" = (
-/obj/effect/turf_decal/tile/purple/opposingcorners{
- dir = 8
- },
-/obj/machinery/airalarm/directional/west,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/cafeteria,
-/area/station/service/barber)
-"vS" = (
-/obj/effect/turf_decal/siding/wood/corner{
- dir = 8
- },
-/obj/structure/table/wood,
-/obj/item/camera_film{
- pixel_x = -5;
- pixel_y = 9
- },
-/obj/item/camera_film,
-/turf/open/floor/wood,
-/area/station/command/heads_quarters/nt_rep)
-"vV" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/fore)
-"wh" = (
-/obj/effect/turf_decal/siding/white{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"wF" = (
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"wK" = (
-/obj/machinery/door/airlock/public{
- name = "Massage Parlour"
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/door/firedoor,
-/turf/open/floor/iron,
-/area/station/service/barber)
-"wL" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Ferry Dock"
- },
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/caution/stand_clear,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"wQ" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Barbershop"
- },
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/door/firedoor,
-/turf/open/floor/iron,
-/area/station/service/barber)
-"wT" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/siding/wood/corner{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/turf/open/floor/wood,
-/area/station/command/heads_quarters/nt_rep)
-"xV" = (
-/turf/closed/wall/r_wall/rust,
-/area/station/command/heads_quarters/nt_rep)
-"yd" = (
-/obj/structure/chair/sofa/bench/left{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green,
-/turf/open/floor/iron/dark/corner,
-/area/station/hallway/primary/fore)
-"yC" = (
-/turf/closed/wall/rust,
-/area/station/service/barber)
-"yM" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"zb" = (
-/turf/closed/wall/r_wall,
-/area/station/command/heads_quarters/nt_rep)
-"ze" = (
-/obj/machinery/light/directional/south,
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"zf" = (
-/obj/structure/lattice,
-/obj/structure/sign/warning/secure_area/directional/south,
-/turf/open/space/basic,
-/area/space/nearstation)
-"zu" = (
-/obj/machinery/light/directional/east,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/carpet/executive,
-/area/station/command/heads_quarters/nt_rep)
-"zF" = (
-/obj/structure/table/wood,
-/obj/item/paper_bin{
- pixel_y = 4
- },
-/obj/item/pen/fountain,
-/turf/open/floor/carpet/executive,
-/area/station/command/heads_quarters/nt_rep)
-"zR" = (
-/obj/effect/spawner/structure/window,
-/obj/structure/curtain/cloth/fancy/mechanical{
- id = "barbershopcurtains1";
- name = "Massage Parlour Drapes"
- },
-/turf/open/floor/plating,
-/area/station/service/barber)
-"zZ" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/grimy,
-/area/station/hallway/primary/fore)
-"Ag" = (
-/turf/closed/wall/rust,
-/area/station/maintenance/fore/lesser)
-"AB" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"Be" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/structure/bed/pod,
-/obj/machinery/firealarm/directional/north,
-/obj/machinery/camera/directional/west,
-/turf/open/floor/iron/dark,
-/area/station/service/barber)
-"Bs" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 1
- },
-/obj/machinery/camera/directional/east{
- c_tag = "NT Consultant's Office";
- name = "command camera"
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/wood,
-/area/station/command/heads_quarters/nt_rep)
-"Bx" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"BU" = (
-/obj/effect/turf_decal/siding/white{
- dir = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 1
- },
-/obj/effect/landmark/start/barber,
-/turf/open/floor/iron/dark,
-/area/station/service/barber)
-"BZ" = (
-/obj/structure/transit_tube/diagonal/crossing/topleft,
-/turf/open/space/basic,
-/area/space/nearstation)
-"Ce" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/iron/dark/corner{
- dir = 4
- },
-/area/station/hallway/primary/fore)
-"Cf" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/firealarm/directional/south,
-/turf/open/floor/wood,
-/area/station/command/heads_quarters/nt_rep)
-"Cm" = (
-/obj/structure/flora/rock/style_random,
-/turf/open/misc/asteroid/airless,
-/area/space/nearstation)
-"Da" = (
-/obj/structure/chair/sofa/bench/left{
- dir = 8
- },
-/obj/effect/turf_decal/siding/white{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"Dh" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"Dl" = (
-/turf/open/misc/asteroid/airless,
-/area/space/nearstation)
-"Dp" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/item/radio/intercom/directional/east,
-/obj/machinery/camera/directional/east,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"DC" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Salon Hallway"
- },
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/caution/stand_clear,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"DJ" = (
-/turf/closed/wall/rust,
-/area/station/command/heads_quarters/nt_rep)
-"Ef" = (
-/obj/machinery/light/directional/north,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"Eg" = (
-/turf/closed/wall,
-/area/station/hallway/primary/fore)
-"Eh" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/iron/dark/corner{
- dir = 8
- },
-/area/station/hallway/primary/fore)
-"Ek" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/fore)
-"En" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Ferry Dock"
- },
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/caution/stand_clear,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"Ev" = (
-/obj/structure/chair/office,
-/obj/effect/landmark/start/nanotrasen_consultant,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/carpet/executive,
-/area/station/command/heads_quarters/nt_rep)
-"EG" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 1
- },
-/obj/structure/chair/office{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/wood,
-/area/station/command/heads_quarters/nt_rep)
-"EI" = (
-/obj/effect/turf_decal/tile/purple/opposingcorners{
- dir = 8
- },
-/obj/machinery/power/apc/auto_name/directional/west,
-/obj/structure/cable,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/camera/directional/west,
-/turf/open/floor/iron/cafeteria,
-/area/station/service/barber)
-"EO" = (
-/obj/structure/transit_tube/curved/flipped,
-/turf/open/space/basic,
-/area/space/nearstation)
-"EP" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/hallway/primary/fore)
-"EX" = (
-/obj/structure/table/wood,
-/obj/item/stamp{
- pixel_y = 8;
- pixel_x = -6
- },
-/obj/item/stamp/denied{
- pixel_x = -6;
- pixel_y = 2
- },
-/obj/item/stamp/centcom{
- pixel_x = 6;
- pixel_y = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/carpet/executive,
-/area/station/command/heads_quarters/nt_rep)
-"Fg" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/iron/dark/corner{
- dir = 8
- },
-/area/station/hallway/primary/fore)
-"Fi" = (
-/turf/closed/wall,
-/area/station/service/barber)
-"Fl" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"Fz" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/lesser)
-"FM" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/structure/cable,
-/turf/open/floor/iron/dark/corner{
- dir = 4
- },
-/area/station/hallway/primary/fore)
-"FQ" = (
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"FU" = (
-/obj/effect/turf_decal/tile/purple/opposingcorners{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/cafeteria,
-/area/station/service/barber)
-"Gh" = (
-/turf/open/space/basic,
-/area/space)
-"Gw" = (
-/obj/structure/chair/sofa/bench/left,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/turf/open/floor/iron/dark/corner{
- dir = 4
- },
-/area/station/hallway/primary/fore)
-"GN" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/door/airlock/maintenance,
-/obj/effect/mapping_helpers/airlock/unres{
- dir = 4
- },
-/obj/structure/cable,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance,
-/obj/effect/mapping_helpers/burnt_floor,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/plating,
-/area/station/maintenance/fore)
-"GU" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/sign/poster/random/directional/north,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/lesser)
-"GX" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/iron/dark/corner{
- dir = 8
- },
-/area/station/hallway/primary/fore)
-"Ho" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/item/radio/intercom/directional/west,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light/small/directional/south,
-/turf/open/floor/iron/dark,
-/area/station/service/barber)
-"HJ" = (
-/obj/machinery/light/directional/south,
-/obj/effect/turf_decal/stripes/corner,
-/obj/structure/noticeboard/directional/south,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"HV" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/structure/table/reinforced/rglass,
-/obj/item/hairbrush{
- pixel_x = 6;
- pixel_y = 9
- },
-/obj/item/clothing/gloves/latex,
-/turf/open/floor/iron/dark,
-/area/station/service/barber)
-"HW" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"Ia" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"Ib" = (
-/turf/closed/wall,
-/area/station/maintenance/fore/lesser)
-"Iv" = (
-/obj/machinery/light/directional/north,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"IX" = (
-/obj/structure/table/wood,
-/obj/item/taperecorder{
- pixel_y = 5;
- pixel_x = 5
- },
-/obj/item/camera{
- pixel_x = -4
- },
-/turf/open/floor/wood,
-/area/station/command/heads_quarters/nt_rep)
-"Ja" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/landmark/event_spawn,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/fore)
-"Jl" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"Jm" = (
-/obj/structure/cable,
-/obj/machinery/status_display/ai/directional/south,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/wood,
-/area/station/command/heads_quarters/nt_rep)
-"Jn" = (
-/obj/structure/chair/sofa/bench{
- dir = 8
- },
-/obj/effect/turf_decal/siding/white{
- dir = 4
- },
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"Jq" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"JP" = (
-/obj/machinery/camera/directional/south,
-/obj/effect/decal/cleanable/dirt,
-/obj/item/radio/intercom/directional/south,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"KA" = (
-/obj/machinery/photocopier,
-/obj/machinery/button/door/directional/north{
- id = "nt_rep_priv_2";
- name = "Privacy Shutters Control"
- },
-/turf/open/floor/carpet/executive,
-/area/station/command/heads_quarters/nt_rep)
-"KE" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/hallway/primary/fore)
-"KL" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/effect/turf_decal/bot,
-/obj/structure/reagent_dispensers/fueltank,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/fore)
-"Lw" = (
-/obj/structure/transit_tube/diagonal/topleft,
-/turf/open/space/basic,
-/area/space/nearstation)
-"LI" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"Me" = (
-/obj/structure/lattice,
-/obj/structure/grille,
-/turf/open/space/basic,
-/area/space/nearstation)
-"Mt" = (
-/turf/closed/wall/rust,
-/area/station/hallway/primary/fore)
-"Mu" = (
-/obj/structure/flora/rock/pile/style_2,
-/turf/open/misc/asteroid/airless,
-/area/space/nearstation)
-"Mw" = (
-/obj/effect/turf_decal/tile/purple/opposingcorners{
- dir = 8
- },
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/cafeteria,
-/area/station/service/barber)
-"MG" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"MO" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/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/hallway/primary/fore)
-"MP" = (
-/turf/closed/wall/rust,
-/area/space/nearstation)
-"Ng" = (
-/obj/machinery/power/apc/auto_name/directional/north,
-/obj/structure/cable,
-/obj/effect/turf_decal/siding/wood{
- dir = 4
- },
-/obj/structure/filingcabinet/chestdrawer,
-/turf/open/floor/wood,
-/area/station/command/heads_quarters/nt_rep)
-"Nu" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 8
- },
-/obj/effect/landmark/generic_maintenance_landmark,
-/turf/open/floor/plating,
-/area/station/maintenance/fore)
-"NU" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark/corner{
- dir = 4
- },
-/area/station/hallway/primary/fore)
-"Op" = (
-/obj/machinery/light/directional/east,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"Oq" = (
-/obj/docking_port/stationary{
- dheight = 3;
- dir = 8;
- dwidth = 8;
- height = 11;
- shuttle_id = "ferry_home";
- name = "Port Bay 2";
- width = 20
- },
-/turf/open/floor/plating,
-/area/station/hallway/primary/fore)
-"Oy" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/iron/dark/corner{
- dir = 8
- },
-/area/station/hallway/primary/fore)
-"OJ" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"OO" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/light/directional/north,
-/obj/structure/closet/emcloset,
-/obj/effect/turf_decal/bot,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/turf/open/floor/iron/dark/corner{
- dir = 1
- },
-/area/station/hallway/primary/fore)
-"OR" = (
-/obj/machinery/modular_computer/preset/command{
- dir = 4
- },
-/turf/open/floor/carpet/executive,
-/area/station/command/heads_quarters/nt_rep)
-"OY" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/structure/cable,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/fore)
-"Pd" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/structure/sign/poster/official/random/directional/west,
-/turf/open/floor/iron/dark/corner{
- dir = 8
- },
-/area/station/hallway/primary/fore)
-"Po" = (
-/obj/structure/table/reinforced/rglass,
-/obj/item/reagent_containers/dropper,
-/obj/item/hairbrush/comb{
- pixel_y = 10
- },
-/obj/machinery/button/curtain{
- id = "barbershopcurtains";
- pixel_x = 10;
- pixel_y = -26
- },
-/turf/open/floor/iron/dark,
-/area/station/service/barber)
-"Pt" = (
-/obj/structure/fans/tiny/forcefield{
- dir = 1
- },
-/obj/structure/sign/warning/vacuum/external/directional/west,
-/obj/machinery/door/poddoor/preopen{
- name = "Dock Shutter"
- },
-/turf/open/floor/plating,
-/area/station/hallway/primary/fore)
-"Pw" = (
-/obj/structure/transit_tube,
-/obj/effect/turf_decal/sand/plating,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"PD" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/fore)
-"Qy" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"Re" = (
-/obj/effect/turf_decal/tile/purple/opposingcorners{
- dir = 8
- },
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/cafeteria,
-/area/station/service/barber)
-"Rf" = (
-/obj/structure/chair/sofa/bench{
- dir = 8
- },
-/obj/effect/turf_decal/siding/white{
- dir = 4
- },
-/obj/effect/landmark/start/assistant,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"Rj" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 4
- },
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"Ry" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/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/iron,
-/area/station/hallway/primary/fore)
-"RA" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/lesser)
-"Sa" = (
-/obj/structure/chair/sofa/bench/left{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"Sg" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"SC" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark,
-/area/station/service/barber)
-"SH" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 1
- },
-/obj/structure/chair/office{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/station/command/heads_quarters/nt_rep)
-"Th" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/item/radio/intercom/directional/east,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"TD" = (
-/obj/structure/transit_tube,
-/obj/structure/disposalpipe/segment,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/cobweb,
-/turf/open/floor/iron/grimy,
-/area/station/hallway/primary/fore)
-"TG" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"TS" = (
-/turf/template_noop,
-/area/template_noop)
-"TU" = (
-/obj/structure/table/reinforced/rglass,
-/obj/item/razor{
- pixel_x = -6
- },
-/obj/item/reagent_containers/spray/barbers_aid{
- pixel_x = 6
- },
-/obj/machinery/light/directional/south,
-/turf/open/floor/iron/dark,
-/area/station/service/barber)
-"Uc" = (
-/obj/structure/transit_tube/diagonal/topleft,
-/turf/open/misc/asteroid/airless,
-/area/space/nearstation)
-"Ul" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/food/pie_smudge,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/fore)
-"Um" = (
-/obj/structure/flora/rock/pile/style_random,
-/turf/open/misc/asteroid/airless,
-/area/space/nearstation)
-"Uw" = (
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/fore)
-"UZ" = (
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark/corner{
- dir = 4
- },
-/area/station/hallway/primary/fore)
-"Vp" = (
-/obj/structure/chair/comfy/barber_chair,
-/obj/effect/turf_decal/siding/white{
- dir = 1
- },
-/obj/effect/landmark/start/hangover,
-/turf/open/floor/iron/dark,
-/area/station/service/barber)
-"VG" = (
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/hallway/primary/fore)
-"Wi" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/plating,
-/area/station/hallway/primary/fore)
-"WA" = (
-/obj/effect/spawner/structure/window,
-/obj/structure/curtain/cloth/fancy/mechanical{
- id = "barbershopcurtains";
- name = "Barber Shop Drapes"
- },
-/turf/open/floor/plating,
-/area/station/service/barber)
-"WE" = (
-/obj/machinery/door/airlock/corporate{
- name = "NT Consultant's Office"
- },
-/obj/effect/mapping_helpers/airlock/access/all/cent_com/rep_door,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/door/firedoor,
-/turf/open/floor/iron/dark/corner{
- dir = 4
- },
-/area/station/command/heads_quarters/nt_rep)
-"WY" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/structure/chair/office/light{
- dir = 8
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 8
- },
-/obj/effect/landmark/start/barber,
-/turf/open/floor/iron/dark,
-/area/station/service/barber)
-"Xo" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/firealarm/directional/east,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark/corner{
- dir = 4
- },
-/area/station/hallway/primary/fore)
-"Xp" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"XI" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"XJ" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/corner,
-/obj/effect/spawner/random/structure/crate,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/fore)
-"XL" = (
-/turf/closed/mineral/random/labormineral,
-/area/space/nearstation)
-"XP" = (
-/obj/effect/turf_decal/sand/plating,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"Yl" = (
-/obj/structure/table/reinforced/rglass,
-/obj/structure/mirror/directional/south,
-/obj/item/lipstick/random{
- pixel_x = -6;
- pixel_y = -5
- },
-/obj/item/lipstick/random,
-/obj/item/reagent_containers/spray/quantum_hair_dye{
- pixel_x = 9
- },
-/turf/open/floor/iron/dark,
-/area/station/service/barber)
-"YD" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/wood,
-/area/station/command/heads_quarters/nt_rep)
-"YS" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"Zb" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/wood,
-/area/station/command/heads_quarters/nt_rep)
-"Ze" = (
-/obj/structure/transit_tube/crossing,
-/obj/effect/turf_decal/sand/plating,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"Zv" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/station/hallway/primary/fore)
-"ZN" = (
-/obj/structure/table/wood,
-/turf/open/floor/carpet/executive,
-/area/station/command/heads_quarters/nt_rep)
-
-(1,1,1) = {"
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-jY
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-BZ
-dZ
-Gh
-Gh
-Gh
-Gh
-Dl
-Dl
-vs
-XL
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-"}
-(2,1,1) = {"
-XL
-Gh
-Gh
-Gh
-Gh
-Dl
-Dl
-Gh
-Gh
-Gh
-nN
-nN
-nN
-nN
-nN
-nN
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-ad
-dZ
-dZ
-dZ
-dZ
-dZ
-XP
-gW
-vE
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-"}
-(3,1,1) = {"
-XL
-Dl
-Gh
-Gh
-Dl
-Dl
-Dl
-Dl
-Gh
-nN
-nN
-rE
-wh
-kh
-rE
-nN
-nN
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Lw
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-hj
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-"}
-(4,1,1) = {"
-XL
-Dl
-Dl
-Gh
-Mu
-Dl
-Dl
-Dl
-Dl
-nN
-Uw
-Rj
-jK
-jK
-cc
-Uw
-nN
-Dl
-Dl
-Dl
-Dl
-Gh
-Dl
-Dl
-hS
-Dl
-Dl
-Dl
-Dl
-Dl
-hj
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-"}
-(5,1,1) = {"
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-nN
-nN
-jK
-bV
-mU
-gy
-Sa
-jV
-nN
-nN
-Dl
-Mu
-Dl
-Dl
-Dl
-Dl
-Dl
-Uc
-Dl
-Dl
-Dl
-XL
-hj
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-"}
-(6,1,1) = {"
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Eg
-rz
-jK
-LI
-Uw
-jK
-ud
-Uw
-tU
-Eg
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Uc
-Dl
-Gh
-Gh
-yM
-OJ
-YS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-"}
-(7,1,1) = {"
-Dl
-Dl
-Mt
-Mt
-Eg
-nN
-nN
-nN
-Eg
-jS
-qj
-Rf
-Jn
-jC
-nE
-Da
-hs
-Mt
-Mt
-nN
-nN
-nN
-Eg
-Eg
-nN
-Eg
-Gh
-bH
-dZ
-dZ
-dZ
-fR
-hj
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-"}
-(8,1,1) = {"
-Gh
-Gh
-Eg
-ku
-cf
-EP
-nW
-MG
-nW
-nW
-wF
-rT
-wF
-wF
-XI
-nW
-nW
-jV
-fc
-fF
-kI
-wF
-fr
-EP
-nW
-nN
-Gh
-dZ
-Lw
-Gh
-Gh
-dZ
-hj
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-TS
-"}
-(9,1,1) = {"
-Gh
-Gh
-Eg
-Ef
-AB
-Jl
-Jl
-Fl
-Fl
-Fl
-sz
-sz
-Fl
-Fl
-Fl
-sz
-sz
-Fl
-Fl
-Fl
-Fl
-Fl
-Fl
-Dh
-MG
-nN
-Gh
-dZ
-dZ
-Lw
-Gh
-XP
-yM
-OJ
-OJ
-OJ
-OJ
-nc
-fA
-RA
-TS
-TS
-"}
-(10,1,1) = {"
-Gh
-Gh
-Pt
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-HW
-iD
-nN
-Gh
-Gh
-dZ
-dZ
-EO
-Ze
-Pw
-Pw
-Ze
-Pw
-Pw
-tx
-lw
-jJ
-dV
-TD
-"}
-(11,1,1) = {"
-Gh
-Gh
-iM
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-HW
-hd
-Eg
-dZ
-dZ
-dZ
-dZ
-dZ
-XP
-tz
-Dl
-Dl
-Dl
-Dl
-hg
-rt
-gH
-Fz
-zZ
-"}
-(12,1,1) = {"
-Gh
-Gh
-iM
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-HW
-JP
-Eg
-Gh
-Gh
-dZ
-Gh
-dZ
-dZ
-Fi
-Fi
-yC
-Fi
-Fi
-yC
-Ib
-bb
-Ag
-ha
-"}
-(13,1,1) = {"
-Gh
-Gh
-iM
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-Wi
-kE
-nN
-Gh
-Gh
-Fi
-yC
-Fi
-yC
-yC
-lU
-EI
-vJ
-rk
-Po
-Ib
-vp
-Ib
-qS
-"}
-(14,1,1) = {"
-Gh
-Gh
-iM
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-MO
-nW
-nN
-Gh
-Gh
-yC
-Be
-uM
-Ho
-yC
-ey
-Mw
-dC
-Vp
-Yl
-Ib
-iv
-Ag
-uX
-"}
-(15,1,1) = {"
-Gh
-Gh
-iM
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-gw
-nW
-nN
-Gh
-Gh
-yC
-HV
-WY
-SC
-wK
-FU
-Re
-Re
-BU
-TU
-Ib
-GU
-Ib
-lr
-"}
-(16,1,1) = {"
-Gh
-Gh
-iM
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-gw
-HJ
-Eg
-nN
-nN
-Fi
-zR
-zR
-zR
-Fi
-WA
-WA
-wQ
-WA
-WA
-Ag
-iy
-Ib
-Gw
-"}
-(17,1,1) = {"
-Gh
-Gh
-iM
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-Oq
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-HW
-FQ
-En
-gv
-Oy
-En
-gv
-GX
-GX
-Pd
-GX
-GX
-Fg
-nF
-nF
-nF
-Eh
-DC
-Ce
-"}
-(18,1,1) = {"
-Gh
-Gh
-iM
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-gw
-TG
-wL
-gx
-NU
-wL
-UZ
-fb
-Bx
-Zv
-Zv
-Xo
-su
-su
-FM
-su
-dY
-bj
-oi
-"}
-(19,1,1) = {"
-Gh
-Gh
-iM
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-gw
-ze
-Eg
-nN
-nN
-Eg
-Eg
-Eg
-OO
-wF
-qU
-zb
-oR
-oR
-WE
-oZ
-GN
-pf
-tg
-"}
-(20,1,1) = {"
-Gh
-Gh
-cW
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-jV
-gw
-VG
-nN
-Dl
-Dl
-Dl
-Dl
-Mt
-gk
-wF
-yd
-xV
-qM
-vS
-rL
-zb
-bB
-pf
-qg
-"}
-(21,1,1) = {"
-Gh
-Gh
-Eg
-Iv
-iV
-Sg
-Sg
-Qy
-Qy
-Qy
-kP
-Jq
-kP
-kP
-kP
-kP
-Jq
-Jq
-Jq
-KE
-Jq
-Jq
-Jq
-Ry
-wF
-nN
-Dl
-Dl
-Dl
-Um
-Mt
-df
-ds
-nS
-zb
-IX
-uf
-Jm
-xV
-fT
-pf
-pf
-"}
-(22,1,1) = {"
-Gh
-Gh
-Eg
-dG
-nW
-nW
-Th
-an
-kE
-nW
-Ia
-Op
-wF
-wF
-wF
-wF
-nv
-Dp
-nW
-nW
-kE
-wF
-Op
-Xp
-wF
-nN
-Dl
-Dl
-Dl
-Dl
-Eg
-Mt
-xV
-kz
-xV
-Ng
-wT
-fx
-zb
-Ek
-Ja
-qr
-"}
-(23,1,1) = {"
-Gh
-Gh
-Mt
-nN
-nN
-nN
-Eg
-Mt
-nN
-nN
-nN
-Eg
-Eg
-nN
-nN
-nN
-Eg
-Eg
-nN
-nN
-nN
-Eg
-Eg
-nN
-nN
-Mt
-Dl
-Dl
-Gh
-XL
-XL
-XL
-xV
-KA
-OR
-ZN
-gX
-Zb
-zb
-XJ
-OY
-KL
-"}
-(24,1,1) = {"
-Gh
-Gh
-Gh
-Gh
-Gh
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Cm
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Gh
-Gh
-XL
-XL
-XL
-zb
-ca
-Ev
-EX
-EG
-Cf
-xV
-ew
-eZ
-pf
-"}
-(25,1,1) = {"
-Gh
-Gh
-Gh
-Gh
-Gh
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-jY
-Gh
-XL
-XL
-DJ
-cX
-mZ
-zF
-SH
-YD
-zb
-jA
-PD
-nA
-"}
-(26,1,1) = {"
-Gh
-Gh
-Gh
-Gh
-Dl
-Dl
-Dl
-Um
-XL
-XL
-Dl
-Dl
-Dl
-Dl
-Dl
-Dl
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-Gh
-XL
-zb
-cm
-aK
-zu
-Bs
-YD
-zb
-eL
-Nu
-vV
-"}
-(27,1,1) = {"
-Gh
-Gh
-Gh
-Gh
-Dl
-Dl
-XL
-XL
-XL
-MP
-mi
-fR
-XL
-Dl
-Um
-XL
-fR
-dZ
-uj
-Me
-Me
-Me
-dZ
-fR
-dZ
-uj
-Me
-Me
-Me
-Me
-zf
-ne
-xV
-zb
-zb
-zb
-zb
-zb
-xV
-eQ
-Ul
-uI
-"}
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index d619da64d48..5df4128be62 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -171,9 +171,9 @@ DEFINE_BITFIELD(status_flags, list(
#define SHOVE_KNOCKDOWN_TABLE 20
#define SHOVE_KNOCKDOWN_COLLATERAL 1
#define SHOVE_CHAIN_PARALYZE 30
-//Shove slowdown
-#define SHOVE_SLOWDOWN_LENGTH 30
-#define SHOVE_SLOWDOWN_STRENGTH 0.85 //multiplier
+//Staggered slowdown, an effect caused by shoving and a few other features, such as tackling
+#define STAGGERED_SLOWDOWN_LENGTH 30
+#define STAGGERED_SLOWDOWN_STRENGTH 0.85 //multiplier
//Shove disarming item list
GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
/obj/item/gun)))
diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm
index c1d9e88786a..903182b21db 100644
--- a/code/__DEFINES/dcs/signals/signals_object.dm
+++ b/code/__DEFINES/dcs/signals/signals_object.dm
@@ -310,6 +310,8 @@
#define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency"
///called from base of /obj/item/radio/proc/talk_into(): (atom/movable/M, message, channel)
#define COMSIG_RADIO_NEW_MESSAGE "radio_new_message"
+///called from base of /obj/item/radio/proc/on_receive_messgae(): (list/data)
+#define COMSIG_RADIO_RECEIVE_MESSAGE "radio_receive_message"
// /obj/item/pen signals
@@ -499,19 +501,5 @@
/// from /datum/component/dart_insert/remove_from_dart() : (obj/ammo_casing/dart, mob/user)
#define COMSIG_DART_INSERT_REMOVED "dart_insert_removed"
-/**
- * from /datum/component/dart_insert/get_dart_var_modifiers() : (list/out_modifiers)
- *
- * valid indices for `out_modifiers` are:
- * - `damage`: number
- * - `speed`: number
- * - `armour_penetration`: number
- * - `wound_bonus`: number
- * - `bare_wound_bonus`: number
- * - `demolition_mod`: number
- * - `embedding`: list with embedding params
- */
-#define COMSIG_DART_INSERT_GET_VAR_MODIFIERS "dart_insert_get_var_modifiers"
-
/// from /datum/component/dart_insert/on_reskin()
#define COMSIG_DART_INSERT_PARENT_RESKINNED "dart_insert_parent_reskinned"
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index 03a3bf49ebb..768f1faa514 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -114,6 +114,11 @@
#define set_dizzy(duration) set_timed_status_effect(duration, /datum/status_effect/dizziness)
#define set_dizzy_if_lower(duration) set_timed_status_effect(duration, /datum/status_effect/dizziness, TRUE)
+#define adjust_staggered(duration) adjust_timed_status_effect(duration, /datum/status_effect/staggered)
+#define adjust_staggered_up_to(duration, up_to) adjust_timed_status_effect(duration, /datum/status_effect/staggered, up_to)
+#define set_staggered(duration) set_timed_status_effect(duration, /datum/status_effect/staggered)
+#define set_staggered_if_lower(duration) set_timed_status_effect(duration, /datum/status_effect/staggered, TRUE)
+
#define adjust_jitter(duration) adjust_timed_status_effect(duration, /datum/status_effect/jitter)
#define adjust_jitter_up_to(duration, up_to) adjust_timed_status_effect(duration, /datum/status_effect/jitter, up_to)
#define set_jitter(duration) set_timed_status_effect(duration, /datum/status_effect/jitter)
diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm
index bb0a65fc5d2..98a8df19b7c 100644
--- a/code/__DEFINES/traits/declarations.dm
+++ b/code/__DEFINES/traits/declarations.dm
@@ -164,6 +164,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_NOBLOOD "noblood"
/// This just means that the carbon will always have functional liverless metabolism
#define TRAIT_LIVERLESS_METABOLISM "liverless_metabolism"
+/// This carbon can't be overdosed by chems
+#define TRAIT_OVERDOSEIMMUNE "overdose_immune"
/// Humans with this trait cannot be turned into zombies
#define TRAIT_NO_ZOMBIFY "no_zombify"
/// Carbons with this trait can't have their DNA copied by diseases nor changelings
@@ -212,6 +214,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
///Added to mob or mind, changes the icons of the fish shown in the minigame UI depending on the possible reward.
#define TRAIT_REVEAL_FISH "reveal_fish"
+/// Added to a mob, allows that mob to experience flavour-based moodlets when examining food
+#define TRAIT_REMOTE_TASTING "remote_tasting"
+
/// Stops the mob from slipping on water, or banana peels, or pretty much anything that doesn't have [GALOSHES_DONT_HELP] set
#define TRAIT_NO_SLIP_WATER "noslip_water"
/// Stops the mob from slipping on permafrost ice (not any other ice) (but anything with [SLIDE_ICE] set)
diff --git a/code/__DEFINES/~skyrat_defines/DNA.dm b/code/__DEFINES/~skyrat_defines/DNA.dm
index 6ac4d165ee6..62ad2f08429 100644
--- a/code/__DEFINES/~skyrat_defines/DNA.dm
+++ b/code/__DEFINES/~skyrat_defines/DNA.dm
@@ -6,10 +6,6 @@
// Defines for whether an accessory should have one or three colors to choose for
#define USE_ONE_COLOR 31
#define USE_MATRIXED_COLORS 32
-// Defines for some extra inherent traits
-#define TRAIT_REVIVES_BY_HEALING "trait_revives_by_healing"
-#define TRAIT_ROBOTIC_DNA_ORGANS "trait_robotic_dna_organs"
-//Also.. yes for some reason specie traits and accessory defines are together
//Defines for processing reagents, for synths, IPC's and Vox
#define PROCESS_ORGANIC 1 //Only processes reagents with "ORGANIC" or "ORGANIC | SYNTHETIC"
@@ -38,6 +34,10 @@
#define MUTANT_INDEX_COLOR_LIST "color"
#define MUTANT_INDEX_EMISSIVE_LIST "emissive"
+// Defines for default mutant bodyparts indexes
+#define MUTANTPART_NAME 1
+#define MUTANTPART_CAN_RANDOMIZE 2
+
// Defines for markings indexes
#define MARKING_INDEX_COLOR 1
#define MARKING_INDEX_EMISSIVE 2
diff --git a/code/__DEFINES/~skyrat_defines/lewd_defines.dm b/code/__DEFINES/~skyrat_defines/lewd_defines.dm
index a1edae8aa01..7674131b090 100644
--- a/code/__DEFINES/~skyrat_defines/lewd_defines.dm
+++ b/code/__DEFINES/~skyrat_defines/lewd_defines.dm
@@ -11,23 +11,6 @@
#define REQUIRE_GENITAL_UNEXPOSED 2
#define REQUIRE_GENITAL_ANY 3
-#define TRAIT_MASOCHISM "masochism"
-#define TRAIT_SADISM "sadism"
-#define TRAIT_NEVERBONER "neverboner"
-#define TRAIT_BIMBO "bimbo"
-#define TRAIT_RIGGER "rigger"
-#define TRAIT_ROPEBUNNY "rope bunny"
-///traits gained by brain traumas, can be removed if the brain trauma is gone
-#define APHRO_TRAIT "aphro"
-///traits gained by quirks, cannot be removed unless the quirk itself is gone
-#define LEWDQUIRK_TRAIT "lewdquirks"
-///traits gained by chemicals, you get the idea
-#define LEWDCHEM_TRAIT "lewdchem"
-
-#define STRAPON_TRAIT "strapon"
-
-#define CONDOM_BROKEN "broken"
-
#define BREAST_SIZE_FLATCHESTED "Flatchested"
#define BREAST_SIZE_A "A"
#define BREAST_SIZE_B "B"
diff --git a/code/__DEFINES/~skyrat_defines/robot_defines.dm b/code/__DEFINES/~skyrat_defines/robot_defines.dm
index 8dde8079fb6..935fe1db1c8 100644
--- a/code/__DEFINES/~skyrat_defines/robot_defines.dm
+++ b/code/__DEFINES/~skyrat_defines/robot_defines.dm
@@ -6,20 +6,6 @@
#define SKIN_FEATURES "skin_features" //for the new system of borg making
-//Defines for model features, set in the model_features list of a robot model datum. Are they a dogborg? Is the model small? etc.
-/// Cyborgs with unique sprites for when they get totally broken down.
-#define R_TRAIT_UNIQUEWRECK "unique_wreck"
-/// Or when tipped over.
-#define R_TRAIT_UNIQUETIP "unique_tip"
-/// 64x32 skins
-#define R_TRAIT_WIDE "wide_borg"
-/// 32x64 skins
-#define R_TRAIT_TALL "tall_borg"
-/// Any model small enough to reject the shrinker upgrade.
-#define R_TRAIT_SMALL "small_chassis"
-/// Any model that has a custom front panel
-#define R_TRAIT_UNIQUEPANEL "unique_openpanel"
-
// Icon file locations for modular borg icons
#define CYBORG_ICON_STANDARD 'modular_skyrat/modules/borgs/icons/robots.dmi'
diff --git a/code/__DEFINES/~skyrat_defines/traits.dm b/code/__DEFINES/~skyrat_defines/traits.dm
index f099b57f260..f49d0bbe413 100644
--- a/code/__DEFINES/~skyrat_defines/traits.dm
+++ b/code/__DEFINES/~skyrat_defines/traits.dm
@@ -1,101 +1,5 @@
-// Defines for some extra traits
-#define TRAIT_NO_HUSK "no_husk"
-#define TRAIT_NORUNNING "norunning" // You walk!
-#define TRAIT_EXCITABLE "wagwag" //Will wag when patted!
-#define TRAIT_OXYIMMUNE "oxyimmune" // Immune to oxygen damage, ideally give this to all non-breathing species or bad stuff will happen
-#define TRAIT_PERSONALSPACE "personalspace" // Block/counter-attack ass-slaps
-#define TRAIT_MOOD_NOEXAMINE "mood_noexamine" // Can't assess your own mood
-#define TRAIT_DNR "do_not_revive" // Can't be revived without supernatural means or admin intervention
-#define TRAIT_HARD_SOLES "hard_soles" // No step on glass
-#define TRAIT_SENSITIVESNOUT "sensitive_snout" // Snout hurts when booped
-#define TRAIT_DETECTIVE "detective_ability" //Given to the detective, if they have this, they can see syndicate special descriptions.
-#define TRAIT_FREE_GHOST "free_ghost" // Can ghost and return freely with this trait
-#define GLOVES_TRAIT "gloves_trait" //Traits associated with wearing gloves
-#define QUIRK_LINGUIST "Linguist" // Extra language point.
-#define GLUED_ITEM_TRAIT "glued-item" // This is for glued items, undroppable. Syndie glue applies this.
-#define TRAIT_STICKY_FINGERS "sticky_fingers" //This is so a mob can strip items faster and picks them up after
-/// This makes trait makes it so that the person cannot be infected by the zombie virus.
-#define TRAIT_MUTANT_IMMUNE "mutant_immune"
-/// adds -6 quirk to negative quirks for free points.
-#define TRAIT_GIFTED "gifted"
-
-//AdditionalEmotes *turf traits
-#define TRAIT_WATER_ASPECT "water_aspect"
-#define TRAIT_WEBBING_ASPECT "webbing_aspect"
-#define TRAIT_FLORAL_ASPECT "floral_aspect"
-#define TRAIT_ASH_ASPECT "ash_aspect"
-#define TRAIT_SPARKLE_ASPECT "sparkle_aspect"
-
-/// Allows the user to instantly reload.
-#define TRAIT_INSTANT_RELOAD "instant_reload"
-
-// Trait sources
-#define GHOSTROLE_TRAIT "ghostrole" // SKYRAT EDIT ADDITION -- Ghost Cafe Traits
-
-/// One can breath under water, you get me?
-#define TRAIT_WATER_BREATHING "water_breathing"
-
-/// The trait which Akulas inherit, for their species mechanic revolving around wet_stacks
-#define TRAIT_SLICK_SKIN "slick_skin"
-/// The trait which is applied when a `slick skin` trait haver actually gets wet_stacks
-#define TRAIT_SLIPPERY "slippery"
/// The minimum amount of tiles a TRAIT_SLIPPERY haver will slide on slip
#define SLIPPERY_MIN 5
/// The maximum amount of tiles a TRAIT_SLIPPERY haver will slide on slip
#define SLIPPERY_MAX 9
-
-/// Under the effect of a numbling agent, such as morphine, for surgery.
-#define TRAIT_NUMBED "numbed"
-
-// felinid traits
-#define TRAIT_FELINE "feline_aspect"
-
-// canine traits
-#define TRAIT_CANINE "canine_aspect"
-
-// avian traits
-#define TRAIT_AVIAN "avian_aspect"
-
-// chameleon mutation
-#define TRAIT_CHAMELEON_SKIN "chameleon_skin"
-
-//Makes sure that people cant be cult sacrificed twice.
-#define TRAIT_SACRIFICED "sacrificed"
-
-/// The trait that determines if someone has the oversized quirk.
-#define TRAIT_OVERSIZED "trait_oversized"
-
-/// Cargo Loader trait
-#define TRAIT_TRASHMAN "trait_trashman"
-
-/// Trait source for xeno innate abilities
-#define TRAIT_XENO_INNATE "xeno_innate"
-/// Trait source for something added BY a xeno ability
-#define TRAIT_XENO_ABILITY_GIVEN "xeno_ability_given"
-/// Determines if something can receive healing from a xeno
-#define TRAIT_XENO_HEAL_AURA "trait_xeno_heal_aura"
-
-/// Trait that was granted by a reagent.
-#define REAGENT_TRAIT "reagent"
-
-/// trait that lets you do flips with a style meter
-#define TRAIT_STYLISH "stylish"
-
-/// trait that lets you do xenoarch magnification
-#define TRAIT_XENOARCH_QUALIFIED "trait_xenoarch_qualified"
-
-/// Traits granted by glassblowing
-#define GLASSBLOWING_TRAIT "glassblowing"
-
-/// Trait that is applied whenever someone or something is glassblowing
-#define TRAIT_CURRENTLY_GLASSBLOWING "currently_glassblowing"
-
-/// Trait that was granted by a NIFSoft
-#define NIFSOFT_TRAIT "nifsoft"
-
-/// Trait given to a piece of eyewear that allows the user to use NIFSoft HUDs
-#define TRAIT_NIFSOFT_HUD_GRANTER "nifsoft_hud_granter"
-
-/// Trait given to a brain that is able to accept souls from a RSD
-#define TRAIT_RSD_COMPATIBLE "rsd_compatible"
diff --git a/code/__DEFINES/~skyrat_defines/traits/declarations.dm b/code/__DEFINES/~skyrat_defines/traits/declarations.dm
new file mode 100644
index 00000000000..01e684f5a90
--- /dev/null
+++ b/code/__DEFINES/~skyrat_defines/traits/declarations.dm
@@ -0,0 +1,147 @@
+// This file contains all of the "static" define strings that tie to a trait.
+// WARNING: The sections here actually matter in this file as it's tested by CI. Please do not toy with the sections."
+
+// BEGIN TRAIT DEFINES
+
+/*
+Remember to update _globalvars/traits.dm if you're adding/removing/renaming traits.
+*/
+
+//mob traits
+
+// Defines for some extra traits
+#define TRAIT_NO_HUSK "no_husk"
+#define TRAIT_NORUNNING "norunning" // You walk!
+#define TRAIT_EXCITABLE "wagwag" //Will wag when patted!
+#define TRAIT_OXYIMMUNE "oxyimmune" // Immune to oxygen damage, ideally give this to all non-breathing species or bad stuff will happen
+#define TRAIT_PERSONALSPACE "personalspace" // Block/counter-attack ass-slaps
+#define TRAIT_MOOD_NOEXAMINE "mood_noexamine" // Can't assess your own mood
+#define TRAIT_DNR "do_not_revive" // Can't be revived without supernatural means or admin intervention
+#define TRAIT_HARD_SOLES "hard_soles" // No step on glass
+#define TRAIT_SENSITIVESNOUT "sensitive_snout" // Snout hurts when booped
+#define TRAIT_DETECTIVE "detective_ability" //Given to the detective, if they have this, they can see syndicate special descriptions.
+#define TRAIT_FREE_GHOST "free_ghost" // Can ghost and return freely with this trait
+#define TRAIT_GLOVES "gloves_trait" //Traits associated with wearing gloves
+#define TRAIT_LINGUIST "Linguist" // Extra language point.
+#define TRAIT_GLUED_ITEM "glued-item" // This is for glued items, undroppable. Syndie glue applies this.
+#define TRAIT_STICKY_FINGERS "sticky_fingers" //This is so a mob can strip items faster and picks them up after
+/// This makes trait makes it so that the person cannot be infected by the zombie virus.
+#define TRAIT_MUTANT_IMMUNE "mutant_immune"
+#define TRAIT_HYDRA_HEADS "hydrahead"
+
+/// adds -6 quirk to negative quirks for free points.
+#define TRAIT_GIFTED "gifted"
+
+//AdditionalEmotes *turf traits
+#define TRAIT_WATER_ASPECT "water_aspect"
+#define TRAIT_WEBBING_ASPECT "webbing_aspect"
+#define TRAIT_FLORAL_ASPECT "floral_aspect"
+#define TRAIT_ASH_ASPECT "ash_aspect"
+#define TRAIT_SPARKLE_ASPECT "sparkle_aspect"
+
+/// Allows the user to instantly reload.
+#define TRAIT_INSTANT_RELOAD "instant_reload"
+
+// Trait sources
+#define TRAIT_GHOSTROLE "ghostrole" // SKYRAT EDIT ADDITION -- Ghost Cafe Traits
+
+/// One can breath under water, you get me?
+#define TRAIT_WATER_BREATHING "water_breathing"
+
+/// The trait which Akulas inherit, for their species mechanic revolving around wet_stacks
+#define TRAIT_SLICK_SKIN "slick_skin"
+/// The trait which is applied when a `slick skin` trait haver actually gets wet_stacks
+#define TRAIT_SLIPPERY "slippery"
+
+/// Under the effect of a numbling agent, such as morphine, for surgery.
+#define TRAIT_NUMBED "numbed"
+
+// felinid traits
+#define TRAIT_FELINE "feline_aspect"
+
+// canine traits
+#define TRAIT_CANINE "canine_aspect"
+
+// avian traits
+#define TRAIT_AVIAN "avian_aspect"
+
+// chameleon mutation
+#define TRAIT_CHAMELEON_SKIN "chameleon_skin"
+
+//Makes sure that people cant be cult sacrificed twice.
+#define TRAIT_SACRIFICED "sacrificed"
+
+/// The trait that determines if someone has the oversized quirk.
+#define TRAIT_OVERSIZED "trait_oversized"
+
+/// Cargo Loader trait
+#define TRAIT_TRASHMAN "trait_trashman"
+
+/// Trait source for xeno innate abilities
+#define TRAIT_XENO_INNATE "xeno_innate"
+/// Trait source for something added BY a xeno ability
+#define TRAIT_XENO_ABILITY_GIVEN "xeno_ability_given"
+/// Determines if something can receive healing from a xeno
+#define TRAIT_XENO_HEAL_AURA "trait_xeno_heal_aura"
+
+/// Trait that was granted by a reagent.
+#define TRAIT_REAGENT "reagent"
+
+/// trait that lets you do flips with a style meter
+#define TRAIT_STYLISH "stylish"
+
+/// trait that lets you do xenoarch magnification
+#define TRAIT_XENOARCH_QUALIFIED "trait_xenoarch_qualified"
+
+/// Traits granted by glassblowing
+#define TRAIT_GLASSBLOWING "glassblowing"
+
+/// Trait that is applied whenever someone or something is glassblowing
+#define TRAIT_CURRENTLY_GLASSBLOWING "currently_glassblowing"
+
+/// Trait that was granted by a NIFSoft
+#define TRAIT_NIFSOFT "nifsoft"
+
+/// Trait given to a piece of eyewear that allows the user to use NIFSoft HUDs
+#define TRAIT_NIFSOFT_HUD_GRANTER "nifsoft_hud_granter"
+
+/// Trait given to a brain that is able to accept souls from a RSD
+#define TRAIT_RSD_COMPATIBLE "rsd_compatible"
+
+// Defines for some extra inherent traits
+#define TRAIT_REVIVES_BY_HEALING "trait_revives_by_healing"
+#define TRAIT_ROBOTIC_DNA_ORGANS "trait_robotic_dna_organs"
+
+//Defines for model features, set in the model_features list of a robot model datum. Are they a dogborg? Is the model small? etc.
+/// Cyborgs with unique sprites for when they get totally broken down.
+#define TRAIT_R_UNIQUEWRECK "unique_wreck"
+/// Or when tipped over.
+#define TRAIT_R_UNIQUETIP "unique_tip"
+/// 64x32 skins
+#define TRAIT_R_WIDE "wide_borg"
+/// 32x64 skins
+#define TRAIT_R_TALL "tall_borg"
+/// Any model small enough to reject the shrinker upgrade.
+#define TRAIT_R_SMALL "small_chassis"
+/// Any model that has a custom front panel
+#define TRAIT_R_UNIQUEPANEL "unique_openpanel"
+
+// Lewd traits
+#define TRAIT_MASOCHISM "masochism"
+#define TRAIT_SADISM "sadism"
+#define TRAIT_NEVERBONER "neverboner"
+#define TRAIT_BIMBO "bimbo"
+#define TRAIT_RIGGER "rigger"
+#define TRAIT_ROPEBUNNY "rope bunny"
+///traits gained by brain traumas, can be removed if the brain trauma is gone
+#define TRAIT_APHRO "aphro"
+///traits gained by quirks, cannot be removed unless the quirk itself is gone
+#define TRAIT_LEWDQUIRK "lewdquirks"
+///traits gained by chemicals, you get the idea
+#define TRAIT_LEWDCHEM "lewdchem"
+
+#define TRAIT_STRAPON "strapon"
+
+#define TRAIT_CONDOM_BROKEN "broken"
+
+// END TRAIT DEFINES
diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm
index a54799b7bb1..05aa4e419a2 100644
--- a/code/_globalvars/lists/maintenance_loot.dm
+++ b/code/_globalvars/lists/maintenance_loot.dm
@@ -351,6 +351,7 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items
/obj/item/disk/nuclear/fake = 1,
/obj/item/disk/surgery/advanced_plastic_surgery = 1,
/obj/item/skillchip/brainwashing = 1,
+ /obj/item/skillchip/intj = 1,
/obj/item/tattoo_kit = 1,
/obj/item/folder/ancient_paperwork = 1,
) = 1,
diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm
index 7ec768e619a..972201a6f33 100644
--- a/code/_globalvars/traits/_traits.dm
+++ b/code/_globalvars/traits/_traits.dm
@@ -204,7 +204,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_GARLIC_BREATH" = TRAIT_GARLIC_BREATH,
"TRAIT_GENELESS" = TRAIT_GENELESS,
"TRAIT_GIANT" = TRAIT_GIANT,
- "TRAIT_GIFTED" = TRAIT_GIFTED, // SKYRAT EDIT ADDITION
"TRAIT_GONE_FISHING" = TRAIT_GONE_FISHING,
"TRAIT_GOOD_HEARING" = TRAIT_GOOD_HEARING,
"TRAIT_GRABWEAKNESS" = TRAIT_GRABWEAKNESS,
@@ -275,6 +274,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_NEVER_WOUNDED" = TRAIT_NEVER_WOUNDED,
"TRAIT_NICE_SHOT" = TRAIT_NICE_SHOT,
"TRAIT_NIGHT_VISION" = TRAIT_NIGHT_VISION,
+ "TRAIT_NO_ACCENT" = TRAIT_NO_ACCENT, //FF add - autoaccent
"TRAIT_NO_AUGMENTS" = TRAIT_NO_AUGMENTS,
"TRAIT_NO_BLOOD_OVERLAY" = TRAIT_NO_BLOOD_OVERLAY,
"TRAIT_NO_DEBRAIN_OVERLAY" = TRAIT_NO_DEBRAIN_OVERLAY,
@@ -288,6 +288,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_NO_JUMPSUIT" = TRAIT_NO_JUMPSUIT,
"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,
@@ -320,6 +321,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_NUKEIMMUNE" = TRAIT_NUKEIMMUNE,
"TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED,
"TRAIT_ORBITING_FORBIDDEN" = TRAIT_ORBITING_FORBIDDEN,
+ "TRAIT_OVERDOSEIMMUNE" = TRAIT_OVERDOSEIMMUNE,
"TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE,
"TRAIT_OVERWATCHED" = TRAIT_OVERWATCHED,
"TRAIT_PACIFISM" = TRAIT_PACIFISM,
@@ -327,6 +329,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_PARALYSIS_L_LEG" = TRAIT_PARALYSIS_L_LEG,
"TRAIT_PARALYSIS_R_ARM" = TRAIT_PARALYSIS_R_ARM,
"TRAIT_PARALYSIS_R_LEG" = TRAIT_PARALYSIS_R_LEG,
+ "TRAIT_PARROT_PERCHED" = TRAIT_PARROT_PERCHED,
"TRAIT_PASSTABLE" = TRAIT_PASSTABLE,
"TRAIT_PERFECT_ATTACKER" = TRAIT_PERFECT_ATTACKER,
"TRAIT_PERMANENTLY_MORTAL" = TRAIT_PERMANENTLY_MORTAL,
@@ -351,6 +354,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_REAGENT_SCANNER" = TRAIT_REAGENT_SCANNER,
"TRAIT_RECENTLY_BLOCKED_MAGIC" = TRAIT_RECENTLY_BLOCKED_MAGIC,
"TRAIT_RELAYING_ATTACKER" = TRAIT_RELAYING_ATTACKER,
+ "TRAIT_REMOTE_TASTING" = TRAIT_REMOTE_TASTING,
"TRAIT_RESEARCH_SCANNER" = TRAIT_RESEARCH_SCANNER,
"TRAIT_RESISTCOLD" = TRAIT_RESISTCOLD,
"TRAIT_RESISTHEAT" = TRAIT_RESISTHEAT,
@@ -373,7 +377,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_SETTLER" = TRAIT_SETTLER,
"TRAIT_SHAVED" = TRAIT_SHAVED,
"TRAIT_SHIFTY_EYES" = TRAIT_SHIFTY_EYES,
- "TRAIT_OVERSIZED" = TRAIT_OVERSIZED, //SKYRAT EDIT ADDITION - Leaving this here so that it hopefully doesn't cause conflicts again in the future(?)
"TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE,
"TRAIT_SIGN_LANG" = TRAIT_SIGN_LANG,
"TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS,
@@ -553,6 +556,76 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_TURF_IGNORE_SLIPPERY" = TRAIT_TURF_IGNORE_SLIPPERY,
"TRAIT_TURF_IGNORE_SLOWDOWN" = TRAIT_TURF_IGNORE_SLOWDOWN,
),
+ // SKYRAT EDIT ADDITION START - SKYRAT TRAITS
+ /obj/item/toy/plush/skyrat = list(
+ "TRAIT_APHRO" = TRAIT_APHRO,
+ "TRAIT_AVIAN" = TRAIT_AVIAN,
+ "TRAIT_ASH_ASPECT" = TRAIT_ASH_ASPECT,
+ "TRAIT_BIMBO" = TRAIT_BIMBO,
+ "TRAIT_CANINE" = TRAIT_CANINE,
+ "TRAIT_CHAMELEON_SKIN" = TRAIT_CHAMELEON_SKIN,
+ "TRAIT_CONDOM_BROKEN" = TRAIT_CONDOM_BROKEN,
+ "TRAIT_CURRENTLY_GLASSBLOWING" = TRAIT_CURRENTLY_GLASSBLOWING,
+ "TRAIT_DETECTIVE" = TRAIT_DETECTIVE,
+ "TRAIT_DNR" = TRAIT_DNR,
+ "TRAIT_EXCITABLE" = TRAIT_EXCITABLE,
+ "TRAIT_FELINE" = TRAIT_FELINE,
+ "TRAIT_FLORAL_ASPECT" = TRAIT_FLORAL_ASPECT,
+ "TRAIT_FREE_GHOST" = TRAIT_FREE_GHOST,
+ "TRAIT_GHOSTROLE" = TRAIT_GHOSTROLE,
+ "TRAIT_GIFTED" = TRAIT_GIFTED,
+ "TRAIT_GLASSBLOWING" = TRAIT_GLASSBLOWING,
+ "TRAIT_GLOVES" = TRAIT_GLOVES,
+ "TRAIT_GLUED_ITEM" = TRAIT_GLUED_ITEM,
+ "TRAIT_HARD_SOLES" = TRAIT_HARD_SOLES,
+ "TRAIT_HYDRA_HEADS" = TRAIT_HYDRA_HEADS,
+ "TRAIT_INSTANT_RELOAD" = TRAIT_INSTANT_RELOAD,
+ "TRAIT_LINGUIST" = TRAIT_LINGUIST,
+ "TRAIT_LEWDCHEM" = TRAIT_LEWDCHEM,
+ "TRAIT_LEWDQUIRK" = TRAIT_LEWDQUIRK,
+ "TRAIT_MASOCHISM" = TRAIT_MASOCHISM,
+ "TRAIT_MOOD_NOEXAMINE" = TRAIT_MOOD_NOEXAMINE,
+ "TRAIT_MUTANT_IMMUNE" = TRAIT_MUTANT_IMMUNE,
+ "TRAIT_NEVERBONER" = TRAIT_NEVERBONER,
+ "TRAIT_NIFSOFT" = TRAIT_NIFSOFT,
+ "TRAIT_NIFSOFT_HUD_GRANTER" = TRAIT_NIFSOFT_HUD_GRANTER,
+ "TRAIT_NO_HUSK" = TRAIT_NO_HUSK,
+ "TRAIT_NORUNNING" = TRAIT_NORUNNING,
+ "TRAIT_NUMBED" = TRAIT_NUMBED,
+ "TRAIT_OVERSIZED" = TRAIT_OVERSIZED,
+ "TRAIT_OXYIMMUNE" = TRAIT_OXYIMMUNE,
+ "TRAIT_PERSONALSPACE" = TRAIT_PERSONALSPACE,
+ "TRAIT_R_UNIQUEWRECK" = TRAIT_R_UNIQUEWRECK,
+ "TRAIT_R_UNIQUETIP" = TRAIT_R_UNIQUETIP,
+ "TRAIT_R_WIDE" = TRAIT_R_WIDE,
+ "TRAIT_R_TALL" = TRAIT_R_TALL,
+ "TRAIT_R_SMALL" = TRAIT_R_SMALL,
+ "TRAIT_R_UNIQUEPANEL" = TRAIT_R_UNIQUEPANEL,
+ "TRAIT_REAGENT" = TRAIT_REAGENT,
+ "TRAIT_REVIVES_BY_HEALING" = TRAIT_REVIVES_BY_HEALING,
+ "TRAIT_RIGGER" = TRAIT_RIGGER,
+ "TRAIT_ROBOTIC_DNA_ORGANS" = TRAIT_ROBOTIC_DNA_ORGANS,
+ "TRAIT_ROPEBUNNY" = TRAIT_ROPEBUNNY,
+ "TRAIT_RSD_COMPATIBLE" = TRAIT_RSD_COMPATIBLE,
+ "TRAIT_SACRIFICED" = TRAIT_SACRIFICED ,
+ "TRAIT_SADISM" = TRAIT_SADISM,
+ "TRAIT_SENSITIVESNOUT" = TRAIT_SENSITIVESNOUT,
+ "TRAIT_SLICK_SKIN" = TRAIT_SLICK_SKIN,
+ "TRAIT_SLIPPERY" = TRAIT_SLIPPERY,
+ "TRAIT_SPARKLE_ASPECT" = TRAIT_SPARKLE_ASPECT,
+ "TRAIT_STICKY_FINGERS" = TRAIT_STICKY_FINGERS,
+ "TRAIT_STRAPON" = TRAIT_STRAPON,
+ "TRAIT_STYLISH" = TRAIT_STYLISH,
+ "TRAIT_TRASHMAN" = TRAIT_TRASHMAN,
+ "TRAIT_WATER_ASPECT" = TRAIT_WATER_ASPECT,
+ "TRAIT_WATER_BREATHING" = TRAIT_WATER_BREATHING,
+ "TRAIT_WEBBING_ASPECT" = TRAIT_WEBBING_ASPECT,
+ "TRAIT_XENO_ABILITY_GIVEN" = TRAIT_XENO_ABILITY_GIVEN,
+ "TRAIT_XENOARCH_QUALIFIED" = TRAIT_XENOARCH_QUALIFIED,
+ "TRAIT_XENO_HEAL_AURA" = TRAIT_XENO_HEAL_AURA,
+ "TRAIT_XENO_INNATE" = TRAIT_XENO_INNATE,
+ ),
+ // SKYRAT EDIT ADDITION END
))
/// value -> trait name, list of ALL traits that exist in the game, used for any type of accessing.
diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm
index 26c419723cb..09901bc161d 100644
--- a/code/_globalvars/traits/admin_tooling.dm
+++ b/code/_globalvars/traits/admin_tooling.dm
@@ -276,6 +276,76 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
/obj/item/organ/internal/lungs = list(
"TRAIT_SPACEBREATHING" = TRAIT_SPACEBREATHING,
),
+ // SKYRAT EDIT ADDITION START - SKYRAT TRAITS
+ /obj/item/toy/plush/skyrat = list(
+ "TRAIT_APHRO" = TRAIT_APHRO,
+ "TRAIT_AVIAN" = TRAIT_AVIAN,
+ "TRAIT_ASH_ASPECT" = TRAIT_ASH_ASPECT,
+ "TRAIT_BIMBO" = TRAIT_BIMBO,
+ "TRAIT_CANINE" = TRAIT_CANINE,
+ "TRAIT_CHAMELEON_SKIN" = TRAIT_CHAMELEON_SKIN,
+ "TRAIT_CONDOM_BROKEN" = TRAIT_CONDOM_BROKEN,
+ "TRAIT_CURRENTLY_GLASSBLOWING" = TRAIT_CURRENTLY_GLASSBLOWING,
+ "TRAIT_DETECTIVE" = TRAIT_DETECTIVE,
+ "TRAIT_DNR" = TRAIT_DNR,
+ "TRAIT_EXCITABLE" = TRAIT_EXCITABLE,
+ "TRAIT_FELINE" = TRAIT_FELINE,
+ "TRAIT_FLORAL_ASPECT" = TRAIT_FLORAL_ASPECT,
+ "TRAIT_FREE_GHOST" = TRAIT_FREE_GHOST,
+ "TRAIT_GHOSTROLE" = TRAIT_GHOSTROLE,
+ "TRAIT_GIFTED" = TRAIT_GIFTED,
+ "TRAIT_GLASSBLOWING" = TRAIT_GLASSBLOWING,
+ "TRAIT_GLOVES" = TRAIT_GLOVES,
+ "TRAIT_GLUED_ITEM" = TRAIT_GLUED_ITEM,
+ "TRAIT_HARD_SOLES" = TRAIT_HARD_SOLES,
+ "TRAIT_HYDRA_HEADS" = TRAIT_HYDRA_HEADS,
+ "TRAIT_INSTANT_RELOAD" = TRAIT_INSTANT_RELOAD,
+ "TRAIT_LINGUIST" = TRAIT_LINGUIST,
+ "TRAIT_LEWDCHEM" = TRAIT_LEWDCHEM,
+ "TRAIT_LEWDQUIRK" = TRAIT_LEWDQUIRK,
+ "TRAIT_MASOCHISM" = TRAIT_MASOCHISM,
+ "TRAIT_MOOD_NOEXAMINE" = TRAIT_MOOD_NOEXAMINE,
+ "TRAIT_MUTANT_IMMUNE" = TRAIT_MUTANT_IMMUNE,
+ "TRAIT_NEVERBONER" = TRAIT_NEVERBONER,
+ "TRAIT_NIFSOFT" = TRAIT_NIFSOFT,
+ "TRAIT_NIFSOFT_HUD_GRANTER" = TRAIT_NIFSOFT_HUD_GRANTER,
+ "TRAIT_NO_HUSK" = TRAIT_NO_HUSK,
+ "TRAIT_NORUNNING" = TRAIT_NORUNNING,
+ "TRAIT_NUMBED" = TRAIT_NUMBED,
+ "TRAIT_OVERSIZED" = TRAIT_OVERSIZED,
+ "TRAIT_OXYIMMUNE" = TRAIT_OXYIMMUNE,
+ "TRAIT_PERSONALSPACE" = TRAIT_PERSONALSPACE,
+ "TRAIT_R_UNIQUEWRECK" = TRAIT_R_UNIQUEWRECK,
+ "TRAIT_R_UNIQUETIP" = TRAIT_R_UNIQUETIP,
+ "TRAIT_R_WIDE" = TRAIT_R_WIDE,
+ "TRAIT_R_TALL" = TRAIT_R_TALL,
+ "TRAIT_R_SMALL" = TRAIT_R_SMALL,
+ "TRAIT_R_UNIQUEPANEL" = TRAIT_R_UNIQUEPANEL,
+ "TRAIT_REAGENT" = TRAIT_REAGENT,
+ "TRAIT_REVIVES_BY_HEALING" = TRAIT_REVIVES_BY_HEALING,
+ "TRAIT_RIGGER" = TRAIT_RIGGER,
+ "TRAIT_ROBOTIC_DNA_ORGANS" = TRAIT_ROBOTIC_DNA_ORGANS,
+ "TRAIT_ROPEBUNNY" = TRAIT_ROPEBUNNY,
+ "TRAIT_RSD_COMPATIBLE" = TRAIT_RSD_COMPATIBLE,
+ "TRAIT_SACRIFICED" = TRAIT_SACRIFICED ,
+ "TRAIT_SADISM" = TRAIT_SADISM,
+ "TRAIT_SENSITIVESNOUT" = TRAIT_SENSITIVESNOUT,
+ "TRAIT_SLICK_SKIN" = TRAIT_SLICK_SKIN,
+ "TRAIT_SLIPPERY" = TRAIT_SLIPPERY,
+ "TRAIT_SPARKLE_ASPECT" = TRAIT_SPARKLE_ASPECT,
+ "TRAIT_STICKY_FINGERS" = TRAIT_STICKY_FINGERS,
+ "TRAIT_STRAPON" = TRAIT_STRAPON,
+ "TRAIT_STYLISH" = TRAIT_STYLISH,
+ "TRAIT_TRASHMAN" = TRAIT_TRASHMAN,
+ "TRAIT_WATER_ASPECT" = TRAIT_WATER_ASPECT,
+ "TRAIT_WATER_BREATHING" = TRAIT_WATER_BREATHING,
+ "TRAIT_WEBBING_ASPECT" = TRAIT_WEBBING_ASPECT,
+ "TRAIT_XENO_ABILITY_GIVEN" = TRAIT_XENO_ABILITY_GIVEN,
+ "TRAIT_XENOARCH_QUALIFIED" = TRAIT_XENOARCH_QUALIFIED,
+ "TRAIT_XENO_HEAL_AURA" = TRAIT_XENO_HEAL_AURA,
+ "TRAIT_XENO_INNATE" = TRAIT_XENO_INNATE,
+ ),
+ // SKYRAT EDIT ADDITION END
))
/// value -> trait name, generated as needed for adminning.
diff --git a/code/datums/components/dart_insert.dm b/code/datums/components/dart_insert.dm
index 03d1d689357..19eea67ab3a 100644
--- a/code/datums/components/dart_insert.dm
+++ b/code/datums/components/dart_insert.dm
@@ -20,14 +20,17 @@
var/projectile_overlay_icon
/// The icon state used for the overlay applied over the containing projectile
var/projectile_overlay_icon_state
+ /// Optional callback to invoke when acquiring projectile var modifiers
+ var/datum/callback/modifier_getter
-/datum/component/dart_insert/Initialize(_casing_overlay_icon, _casing_overlay_icon_state, _projectile_overlay_icon, _projectile_overlay_icon_state)
+/datum/component/dart_insert/Initialize(_casing_overlay_icon, _casing_overlay_icon_state, _projectile_overlay_icon, _projectile_overlay_icon_state, datum/callback/_modifier_getter)
if(!isitem(parent))
return COMPONENT_INCOMPATIBLE
casing_overlay_icon = _casing_overlay_icon
casing_overlay_icon_state = _casing_overlay_icon_state
projectile_overlay_icon = _projectile_overlay_icon
projectile_overlay_icon_state = _projectile_overlay_icon_state
+ modifier_getter = _modifier_getter
/datum/component/dart_insert/RegisterWithParent()
. = ..()
@@ -130,8 +133,7 @@
new_overlays += mutable_appearance(projectile_overlay_icon, projectile_overlay_icon_state)
/datum/component/dart_insert/proc/apply_var_modifiers(obj/projectile/projectile)
- LAZYINITLIST(var_modifiers)
- SEND_SIGNAL(parent, COMSIG_DART_INSERT_GET_VAR_MODIFIERS, var_modifiers)
+ var_modifiers = istype(modifier_getter) ? modifier_getter.Invoke() : list()
projectile.damage += var_modifiers["damage"]
if(var_modifiers["speed"])
var_modifiers["speed"] = reciprocal_add(projectile.speed, var_modifiers["speed"]) - projectile.speed
diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm
index 1e724f0e404..9986b2a4d43 100644
--- a/code/datums/components/food/edible.dm
+++ b/code/datums/components/food/edible.dm
@@ -264,6 +264,16 @@ Behavior that's still missing from this component that original food items had t
for(var/datum/reagent/reagent as anything in owner.reagents.reagent_list)
examine_list += span_notice("- [reagent.name] [reagent.volume]u: [round(reagent.purity * 100)]% pure")
+ if(!HAS_TRAIT(user, TRAIT_REMOTE_TASTING))
+ return
+ var/fraction = min(bite_consumption / owner.reagents.total_volume, 1)
+ checkLiked(fraction, user)
+ if (!owner.reagents.get_reagent_amount(/datum/reagent/consumable/salt))
+ examine_list += span_notice("It could use a little more Sodium Chloride...")
+ if (isliving(user))
+ var/mob/living/living_user = user
+ living_user.taste(owner.reagents)
+
/datum/component/edible/proc/UseFromHand(obj/item/source, mob/living/M, mob/living/user)
SIGNAL_HANDLER
diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm
index a5b5606bf72..1148e2b5993 100644
--- a/code/datums/components/tackle.dm
+++ b/code/datums/components/tackle.dm
@@ -96,7 +96,7 @@
to_chat(user, span_warning("You're not ready to tackle!"))
return
- if(user.has_movespeed_modifier(/datum/movespeed_modifier/shove)) // can't tackle if you just got shoved
+ if(user.get_timed_status_effect_duration(/datum/status_effect/staggered)) // can't tackle if you're staggered
to_chat(user, span_warning("You're too off balance to tackle!"))
return
@@ -131,12 +131,9 @@
* Check [rollTackle()][/datum/component/tackler/proc/rollTackle] for a more thorough explanation on the modifiers at play.
*
* Then, we figure out what effect we want, and we get to work! Note that with standard gripper gloves and no modifiers, the range of rolls is (-3, 3). The results are as follows, based on what we rolled:
- * * -inf to -5: Seriously botched tackle, tackler suffers a concussion, brute damage, and a 3 second paralyze, target suffers nothing
- * * -4 to -2: weak tackle, tackler gets 3 second knockdown, target gets shove slowdown but is otherwise fine
- * * -1 to 0: decent tackle, tackler gets up a bit quicker than the target
- * * 1: solid tackle, tackler has more of an advantage getting up quicker
- * * 2 to 4: expert tackle, tackler has sizeable advantage and lands on their feet with a free passive grab
- * * 5 to inf: MONSTER tackle, tackler gets up immediately and gets a free aggressive grab, target takes sizeable stamina damage from the hit and is paralyzed for one and a half seconds and knocked down for three seconds
+ * * -inf to -1: We have a negative roll result, which means something unfortunate or less than ideal happens to our sacker! Could mean just getting knocked down, but it could also mean they get a concussion. Ouch.
+ * * 0: We get a relatively neutral result, mildly favouring the tackler.
+ * * 1 to inf: We get a positive roll result, which means we get a reasonable to significant advantage against the target!
*
* Finally, we return a bitflag to [COMSIG_MOVABLE_IMPACT] that forces the hitpush to false so that we don't knock them away.
*/
@@ -155,53 +152,74 @@
return
var/mob/living/carbon/target = hit
- var/mob/living/carbon/human/T = target
- var/mob/living/carbon/human/S = user
- var/tackle_word = isfeline(user) ? "pounce" : "tackle" //If cat, "pounce" instead of "tackle". // SKYRAT EDIT - FELINE TRAITS. Was: isfelinid(user)
+ var/tackle_word = isfeline(user) ? "pounce" : "tackle" //If cat, "pounce" instead of "tackle". // SKYRAT EDIT - FELINE TRAITS - ORIGINAL : var/tackle_word = isfelinid(user) ? "pounce" : "tackle"
+
+ if(target.check_block(user, 0, user.name, attack_type = LEAP_ATTACK))
+ user.visible_message(span_danger("[user]'s tackle is blocked by [target], softening the effect!"), span_userdanger("Your tackle is blocked by [target], softening the effect!"), ignored_mobs = target)
+ to_chat(target, span_userdanger("[target] blocks [user]'s tackle attempt, softening the effect!"))
+ neutral_outcome(user, target, tackle_word) //Forces a neutral outcome so you're not screwed too much from being blocked while tackling
+ return
var/roll = rollTackle(target)
tackling = FALSE
tackle.gentle = TRUE
switch(roll)
- if(-INFINITY to -5)
- user.visible_message(span_danger("[user] botches [user.p_their()] [tackle_word] and slams [user.p_their()] head into [target], knocking [user.p_them()]self silly!"), span_userdanger("You botch your [tackle_word] and slam your head into [target], knocking yourself silly!"), ignored_mobs = target)
- to_chat(target, span_userdanger("[user] botches [user.p_their()] [tackle_word] and slams [user.p_their()] head into you, knocking [user.p_them()]self silly!"))
+ if(-INFINITY to -1)
+ negative_outcome(user, target, roll, tackle_word) //OOF
- user.Paralyze(3 SECONDS)
- var/obj/item/bodypart/head/hed = user.get_bodypart(BODY_ZONE_HEAD)
- if(hed)
- hed.receive_damage(brute = 15, updating_health = TRUE, wound_bonus = CANT_WOUND)
- user.gain_trauma(/datum/brain_trauma/mild/concussion)
+ if(0) //nothing good, nothing bad
+ neutral_outcome(user, target, tackle_word)
- if(-4 to -2) // glancing blow at best
- user.visible_message(span_warning("[user] lands a weak [tackle_word] on [target], briefly knocking [target.p_them()] off-balance!"), span_userdanger("You land a weak [tackle_word] on [target], briefly knocking [target.p_them()] off-balance!"), ignored_mobs = target)
- to_chat(target, span_userdanger("[user] lands a weak [tackle_word] on you, briefly knocking you off-balance!"))
+ if(1 to INFINITY)
+ positive_outcome(user, target, roll, tackle_word)
- user.Knockdown(30)
- if(ishuman(target) && !T.has_movespeed_modifier(/datum/movespeed_modifier/shove))
- T.add_movespeed_modifier(/datum/movespeed_modifier/shove) // maybe define a slightly more severe/longer slowdown for this
- addtimer(CALLBACK(T, TYPE_PROC_REF(/mob/living/carbon, clear_shove_slowdown)), SHOVE_SLOWDOWN_LENGTH * 2)
+ return COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH
- if(-1 to 0) // decent hit, both parties are about equally inconvenienced
- user.visible_message(span_warning("[user] lands a passable [tackle_word] on [target], sending them both tumbling!"), span_userdanger("You land a passable [tackle_word] on [target], sending you both tumbling!"), ignored_mobs = target)
- to_chat(target, span_userdanger("[user] lands a passable [tackle_word] on you, sending you both tumbling!"))
+/**
+ * Our positive tackling outcomes.
+ *
+ * We pass our tackle result here to determine the potential outcome of the tackle. Typically, this results in a very poor state for the tackled, and a positive outcome for the tackler.
+ *
+ * First, we determine severity by taking our roll result, multiplying it by 10, and then rolling within that value.
+ *
+ * If our target is human, their armor will reduce the severity of the roll. We pass along any MELEE armor as a percentage reduction.
+ * If they're not human (such as a carbon), we give them a small grace of a 10% reduction.
+ *
+ * Finally, we figure out what effect our target receives. Note that all positive outcomes inflict staggered, resulting in a much harder time escaping the potential grab:
+ * * 1 to 20: Our target is briefly stunned and knocked down. suffers 30 stamina damage, and our tackler is also knocked down.
+ * * 21 to 49: Our target is knocked down, dealt 40 stamina damage, and put into a passive grab. Given they are staggered, this means the target must resist to escape!
+ * * 50 to inf: Our target is hit with a significant chunk of stamina damage, put into an aggressive grab, and knocked down. They're probably not escaping after this. If our tackler is stamcrit when they land this, so is our target.
+*/
- target.adjustStaminaLoss(stamina_cost)
- target.Paralyze(0.5 SECONDS)
- user.Knockdown(2 SECONDS)
- target.Knockdown(2.5 SECONDS)
+/datum/component/tackler/proc/positive_outcome(mob/living/carbon/user, mob/living/carbon/target, roll = 1, tackle_word = "tackle")
+ var/potential_outcome = (roll * 10)
- if(1 to 2) // solid hit, tackler has a slight advantage
+ if(ishuman(target))
+ var/mob/living/carbon/human/human_target = target
+ var/target_armor = human_target.run_armor_check(BODY_ZONE_CHEST, MELEE)
+ potential_outcome *= ((100 - target_armor) /100)
+ else
+ potential_outcome *= 0.9
+
+ var/mob/living/carbon/human/human_target = target
+ var/mob/living/carbon/human/human_sacker = user
+
+ switch(potential_outcome)
+ if(-INFINITY to 0) //I don't want to know how this has happened, okay?
+ neutral_outcome(user, target, roll, tackle_word) //Default to neutral
+
+ if(1 to 20)
user.visible_message(span_warning("[user] lands a solid [tackle_word] on [target], knocking them both down hard!"), span_userdanger("You land a solid [tackle_word] on [target], knocking you both down hard!"), ignored_mobs = target)
to_chat(target, span_userdanger("[user] lands a solid [tackle_word] on you, knocking you both down hard!"))
- target.adjustStaminaLoss(30)
+ target.apply_damage(30, STAMINA)
target.Paralyze(0.5 SECONDS)
user.Knockdown(1 SECONDS)
target.Knockdown(2 SECONDS)
+ target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS)
- if(3 to 4) // really good hit, the target is definitely worse off here. Without positive modifiers, this is as good a tackle as you can land
+ if(21 to 49) // really good hit, the target is definitely worse off here. Without positive modifiers, this is as good a tackle as you can land
user.visible_message(span_warning("[user] lands an expert [tackle_word] on [target], knocking [target.p_them()] down hard while landing on [user.p_their()] feet with a passive grip!"), span_userdanger("You land an expert [tackle_word] on [target], knocking [target.p_them()] down hard while landing on your feet with a passive grip!"), ignored_mobs = target)
to_chat(target, span_userdanger("[user] lands an expert [tackle_word] on you, knocking you down hard and maintaining a passive grab!"))
@@ -209,22 +227,24 @@
user.SetKnockdown(0, ignore_canstun = TRUE)
user.get_up(TRUE)
user.forceMove(get_turf(target))
- target.adjustStaminaLoss(40)
+ target.apply_damage(40, STAMINA)
target.Paralyze(0.5 SECONDS)
target.Knockdown(3 SECONDS)
+ target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS)
if(ishuman(target) && ishuman(user))
- INVOKE_ASYNC(S.dna.species, TYPE_PROC_REF(/datum/species, grab), S, T)
- S.setGrabState(GRAB_PASSIVE)
+ INVOKE_ASYNC(human_sacker.dna.species, TYPE_PROC_REF(/datum/species, grab), human_sacker, human_target)
+ human_sacker.setGrabState(GRAB_PASSIVE)
- if(5 to INFINITY) // absolutely BODIED
+ if(50 to INFINITY) // absolutely BODIED
var/stamcritted_user = HAS_TRAIT_FROM(user, TRAIT_INCAPACITATED, STAMINA)
- if(stamcritted_user) // in case the user went into stamcrit from the tackle itself and cannot actually aggro grab (since they will be crit) we make the tackle a bit more effective on the target
+ if(stamcritted_user) // in case the user went into stamcrit from the tackle itself and cannot actually aggro grab (since they will be crit) we make the tackle effectivelly mutually assured...stamina crit
user.visible_message(span_warning("[user] lands a monsterly reckless [tackle_word] on [target], knocking both of them senseless!"), span_userdanger("You land a monsterly reckless [tackle_word] on [target], knocking both of you senseless!"), ignored_mobs = target)
to_chat(target, span_userdanger("[user] lands a monsterly reckless [tackle_word] on you, knocking the both of you senseless!"))
user.forceMove(get_turf(target))
- target.adjustStaminaLoss(60)
+ target.apply_damage(100, STAMINA) // CRASHING THIS PLANE WITH NO SURVIVORS
target.Paralyze(1 SECONDS)
target.Knockdown(5 SECONDS)
+ target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 3, 10 SECONDS)
else
user.visible_message(span_warning("[user] lands a monster [tackle_word] on [target], knocking [target.p_them()] senseless and applying an aggressive pin!"), span_userdanger("You land a monster [tackle_word] on [target], knocking [target.p_them()] senseless and applying an aggressive pin!"), ignored_mobs = target)
to_chat(target, span_userdanger("[user] lands a monster [tackle_word] on you, knocking you senseless and aggressively pinning you!"))
@@ -233,15 +253,90 @@
user.SetKnockdown(0, ignore_canstun = TRUE)
user.get_up(TRUE)
user.forceMove(get_turf(target))
- target.adjustStaminaLoss(40)
+ target.apply_damage(60, STAMINA)
target.Paralyze(0.5 SECONDS)
target.Knockdown(3 SECONDS)
+ target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 3, 10 SECONDS)
if(ishuman(target) && ishuman(user))
- INVOKE_ASYNC(S.dna.species, TYPE_PROC_REF(/datum/species, grab), S, T)
- S.setGrabState(GRAB_AGGRESSIVE)
+ INVOKE_ASYNC(human_sacker.dna.species, TYPE_PROC_REF(/datum/species, grab), human_sacker, human_target)
+ human_sacker.setGrabState(GRAB_AGGRESSIVE)
+/**
+ * Our neutral tackling outcome.
+ *
+ * Our tackler and our target are staggered. The target longer than the tackler. However, the tackler stands up after this outcome. This is maybe less neutral than it appears, but the tackler initiated, so...
+ * This outcome also occurs when our target has blocked the tackle in some way, preventing situations where someone tackling into a blocker is too severely punished as a result. Hence, this has its own proc.
+*/
- return COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH
+/datum/component/tackler/proc/neutral_outcome(mob/living/carbon/user, mob/living/carbon/target, roll = 1, tackle_word = "tackle")
+
+
+ user.visible_message(span_warning("[user] lands a [tackle_word] on [target], briefly staggering them both!"), span_userdanger("You land a [tackle_word] on [target], briefly staggering [target.p_them()] and yourself!"), ignored_mobs = target)
+ to_chat(target, span_userdanger("[user] lands a [tackle_word] on you, briefly staggering you both!"))
+
+ user.get_up(TRUE)
+ user.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH, 10 SECONDS)
+ target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS) //okay maybe slightly good for the sacker, it's a mild benefit okay?
+
+/**
+ * Our negative tackling outcomes.
+ *
+ * We pass our tackle result here to determine the potential outcome of the tackle. Typically, this results in a very poor state for the tackler, and a mostly okay outcome for the tackled.
+ *
+ * First, we determine severity by taking our roll result, multiplying it by -10, and then rolling within that value.
+ *
+ * If our tackler is human, their armor will reduce the severity of the roll. We pass along any MELEE armor as a percentage reduction.
+ * If they're not human (such as a carbon), we give them a small grace of a 10% reduction.
+ *
+ * Finally, we figure out what effect our target receives and what our tackler receives:
+ * * 1 to 20: Our tackler is knocked down and become staggered, and our target suffers stamina damage and is knocked staggered. So not all bad, but the target most likely can punish you for this.
+ * * 21 to 49: Our tackler is knocked down, suffers stamina damage, and is staggered. Ouch.
+ * * 50 to inf: Our tackler suffers a catastrophic failure, receiving significant stamina damage, a concussion, and is paralyzed for 3 seconds. Oh, and they're staggered for a LONG time.
+*/
+
+/datum/component/tackler/proc/negative_outcome(mob/living/carbon/user, mob/living/carbon/target, roll = -1, tackle_word = "tackle")
+ var/potential_roll_outcome = (roll * -10)
+
+ if(ishuman(user))
+ var/mob/living/carbon/human/human_sacker = target
+ var/attacker_armor = human_sacker.run_armor_check(BODY_ZONE_CHEST, MELEE)
+ potential_roll_outcome *= ((100 - attacker_armor) /100)
+ else
+ potential_roll_outcome *= 0.9
+
+ var/actual_roll = rand(1, potential_roll_outcome)
+
+ switch(actual_roll)
+
+ if(-INFINITY to 0) //I don't want to know how this has happened, okay?
+ neutral_outcome(user, target, roll, tackle_word) //Default to neutral
+
+ if(1 to 20) // It's not completely terrible! But you are somewhat vulernable for doing it.
+ user.visible_message(span_warning("[user] lands a weak [tackle_word] on [target], briefly staggering [target.p_them()]!"), span_userdanger("You land a weak [tackle_word] on [target], briefly staggering [target.p_them()]!"), ignored_mobs = target)
+ to_chat(target, span_userdanger("[user] lands a weak [tackle_word] on you, staggering you!"))
+
+ user.Knockdown(1 SECONDS)
+ user.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS)
+ target.apply_damage(20, STAMINA)
+ target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS)
+
+ if(21 to 49) // oughe
+ user.visible_message(span_warning("[user] lands a dreadful [tackle_word] on [target], briefly knocking [user.p_them()] to the ground!"), span_userdanger("You land a dreadful [tackle_word] on [target], briefly knocking you to the ground!"), ignored_mobs = target)
+ to_chat(target, span_userdanger("[user] lands a dreadful [tackle_word] on you, briefly knocking [user.p_them()] to the ground!"))
+
+ user.Knockdown(3 SECONDS)
+ user.apply_damage(40, STAMINA)
+ user.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS)
+
+ if(50 to INFINITY) // It has been decided that you will suffer
+ user.visible_message(span_danger("[user] botches [user.p_their()] [tackle_word] and slams [user.p_their()] head into [target], knocking [user.p_them()]self silly!"), span_userdanger("You botch your [tackle_word] and slam your head into [target], knocking yourself silly!"), ignored_mobs = target)
+ to_chat(target, span_userdanger("[user] botches [user.p_their()] [tackle_word] and slams [user.p_their()] head into you, knocking [user.p_them()]self silly!"))
+
+ user.Paralyze(3 SECONDS)
+ user.apply_damage(80, STAMINA)
+ user.apply_damage(20, BRUTE, BODY_ZONE_HEAD)
+ user.gain_trauma(/datum/brain_trauma/mild/concussion)
+ user.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 3, 10 SECONDS)
/**
* This handles all of the modifiers for the actual carbon-on-carbon tackling, and gets its own proc because of how many there are (with plenty more in mind!)
@@ -266,14 +361,21 @@
else if(target_drunkenness > 30)
defense_mod -= 1
+ //Arms contribute a great deal to potential tackling prowess and defense. Better arms = better bonus
+ var/obj/item/bodypart/arm/defender_arm = target.get_active_hand()
+
+ if(defender_arm) //the target may not actually have arms
+ defense_mod += (defender_arm.unarmed_effectiveness/10)
+ else //sucks to be you if you don't though haha
+ defense_mod -= 2
+
if(HAS_TRAIT(target, TRAIT_CLUMSY))
defense_mod -= 2
if(HAS_TRAIT(target, TRAIT_FAT)) // chonkers are harder to knock over
defense_mod += 1
if(HAS_TRAIT(target, TRAIT_GRABWEAKNESS))
defense_mod -= 2
- if(HAS_TRAIT(target, TRAIT_DWARF))
- defense_mod -= 2
+
if(HAS_TRAIT(target, TRAIT_GIANT))
defense_mod += 2
if(target.get_organic_health() < 50)
@@ -289,15 +391,15 @@
if(ishuman(target))
var/mob/living/carbon/human/tackle_target = target
+ if(tackle_target.get_mob_height() <= HUMAN_HEIGHT_SHORTEST) //WHO ARE YOU CALLING SHORT?
+ defense_mod -= 2
+
if(isnull(tackle_target.wear_suit) && isnull(tackle_target.w_uniform)) // who honestly puts all of their effort into tackling a naked guy?
defense_mod += 2
if(tackle_target.mob_negates_gravity())
defense_mod += 1
if(tackle_target.is_shove_knockdown_blocked()) // riot armor and such
defense_mod += 5
- if(tackle_target.is_holding_item_of_type(/obj/item/shield))
- defense_mod += 2
-
var/obj/item/organ/external/tail/lizard/el_tail = tackle_target.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
if(HAS_TRAIT(tackle_target, TRAIT_TACKLING_TAILED_DEFENDER) && !el_tail)
@@ -308,6 +410,15 @@
// OF-FENSE
var/mob/living/carbon/sacker = parent
var/sacker_drunkenness = sacker.get_drunk_amount()
+
+ //Arms contribute a great deal to potential tackling prowess and defense. Better arms = better bonus
+ var/obj/item/bodypart/arm/sacker_arm = sacker.get_active_hand()
+
+ if(sacker_arm) //I have no idea how you would be tackling without hands, but just in case
+ attack_mod += (sacker_arm.unarmed_effectiveness/10)
+ else //I don't want to know how you got to this point but if you have, fuck you, good luck tackling without ARMS
+ attack_mod -= 4
+
if(sacker_drunkenness > 60) // you're far too drunk to hold back!
attack_mod += 1
else if(sacker_drunkenness > 30) // if you're only a bit drunk though, you're just sloppy
@@ -315,10 +426,10 @@
if(HAS_TRAIT(sacker, TRAIT_CLUMSY))
attack_mod -= 2
- if(HAS_TRAIT(sacker, TRAIT_DWARF))
- attack_mod -= 2
if(HAS_TRAIT(sacker, TRAIT_GIANT))
attack_mod += 2
+ if(HAS_TRAIT(sacker, TRAIT_NOGUNS)) //Those dedicated to martial combat are particularly skilled tacklers
+ attack_mod += 2
if(HAS_TRAIT(sacker, TRAIT_TACKLING_WINGED_ATTACKER))
var/obj/item/organ/external/wings/moth/sacker_moth_wing = sacker.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
@@ -328,16 +439,22 @@
if(sacker_wing)
attack_mod += 2
- if(ishuman(target))
- var/mob/living/carbon/human/S = sacker
+ if(ishuman(sacker))
+ var/mob/living/carbon/human/human_sacker = sacker
- var/suit_slot = S.get_item_by_slot(ITEM_SLOT_OCLOTHING)
- if(suit_slot && (istype(suit_slot,/obj/item/clothing/suit/armor/riot))) // tackling in riot armor is more effective, but tiring
+ if(human_sacker.get_mob_height() <= HUMAN_HEIGHT_SHORTEST) //JUST YOU WAIT TILL I FIND A CHAIR, BUDDY, THEN YOU'LL BE SORRY
+ attack_mod -= 2
+
+ if(human_sacker.mob_mood.sanity_level == SANITY_INSANE) //I've gone COMPLETELY INSANE
+ attack_mod += 15
+ human_sacker.adjustStaminaLoss(100) //AHAHAHAHAHAHAHAHA
+
+ if(human_sacker.is_shove_knockdown_blocked()) // tackling with riot specialized armor, like riot armor, is effective but tiring
attack_mod += 2
- sacker.adjustStaminaLoss(20)
+ human_sacker.adjustStaminaLoss(20)
- var/r = rand(-3, 3) - defense_mod + attack_mod + skill_mod
- return r
+ var/randomized_tackle_roll = rand(-3, 3) - defense_mod + attack_mod + skill_mod
+ return randomized_tackle_roll
/**
diff --git a/code/datums/memory/key_memories.dm b/code/datums/memory/key_memories.dm
index 5cc581f14c7..d777df72e38 100644
--- a/code/datums/memory/key_memories.dm
+++ b/code/datums/memory/key_memories.dm
@@ -191,3 +191,25 @@
"[protagonist_name] being implanted by a scientist.",
"[protagonist_name] having surgery done on them by a scientist.",
)
+
+/datum/memory/key/permabrig_crimes
+ var/crimes
+
+/datum/memory/key/permabrig_crimes/New(
+ datum/mind/memorizer_mind,
+ atom/protagonist,
+ atom/deuteragonist,
+ atom/antagonist,
+ crimes,
+)
+ src.crimes = crimes
+ return ..()
+
+/datum/memory/key/permabrig_crimes/get_names()
+ return list("[protagonist_name]'s crime of \"[crimes]\".")
+
+/datum/memory/key/permabrig_crimes/get_starts()
+ return list(
+ "[protagonist_name] being arrested by security for [crimes].",
+ "[protagonist_name] committing the crimes of [crimes].",
+ )
diff --git a/code/datums/status_effects/debuffs/staggered.dm b/code/datums/status_effects/debuffs/staggered.dm
new file mode 100644
index 00000000000..5723bc16013
--- /dev/null
+++ b/code/datums/status_effects/debuffs/staggered.dm
@@ -0,0 +1,41 @@
+/datum/status_effect/staggered
+ id = "staggered"
+ tick_interval = 0.5 SECONDS
+ alert_type = null
+ remove_on_fullheal = TRUE
+
+/datum/status_effect/staggered/on_creation(mob/living/new_owner, duration = 10 SECONDS)
+ src.duration = duration
+ return ..()
+
+/datum/status_effect/staggered/on_apply()
+
+ //a very mild animation, but you can't stagger the dead.
+ if(owner.stat == DEAD)
+ owner.do_stagger_animation(duration / 10)
+ return FALSE
+
+ RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(clear_staggered))
+ owner.add_movespeed_modifier(/datum/movespeed_modifier/staggered)
+ return TRUE
+
+/datum/status_effect/staggered/on_remove()
+ UnregisterSignal(owner, COMSIG_LIVING_DEATH)
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/staggered)
+ // Resetting both X on remove so we're back to normal
+ owner.pixel_x = owner.base_pixel_x
+
+/// Signal proc that self deletes our staggered effect
+/datum/status_effect/staggered/proc/clear_staggered(datum/source)
+ SIGNAL_HANDLER
+
+ qdel(src)
+
+/datum/status_effect/staggered/tick(seconds_between_ticks)
+ owner.do_stagger_animation()
+
+/// Helper proc that causes the mob to do a stagger animation.
+/// Doesn't change significantly, just meant to represent swaying back and forth
+/mob/living/proc/do_stagger_animation()
+ animate(src, pixel_x = 4, time = 0.2 SECONDS, loop = 6, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL)
+ animate(pixel_x = -4, time = 0.2 SECONDS, flags = ANIMATION_RELATIVE)
diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm
index 97ecd19e470..e8ecb72393f 100644
--- a/code/game/machinery/telecomms/broadcasting.dm
+++ b/code/game/machinery/telecomms/broadcasting.dm
@@ -155,7 +155,7 @@
radios += independent_radio
for(var/obj/item/radio/called_radio as anything in radios)
- called_radio.on_recieve_message()
+ called_radio.on_recieve_message(data)
// From the list of radios, find all mobs who can hear those.
var/list/receive = get_hearers_in_radio_ranges(radios)
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 1bc96c35122..1a356686a74 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -388,7 +388,8 @@
return TRUE
return FALSE
-/obj/item/radio/proc/on_recieve_message()
+/obj/item/radio/proc/on_recieve_message(list/data)
+ SEND_SIGNAL(src, COMSIG_RADIO_RECEIVE_MESSAGE, data)
flick_overlay_view(overlay_speaker_active, 5 SECONDS)
/obj/item/radio/ui_state(mob/user)
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index b029a099875..b1aff8deff5 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -555,7 +555,7 @@
if(robot.model.model_select_icon == "nomod")
to_chat(usr, span_warning("Default models cannot take expand or shrink upgrades."))
return FALSE
- if((R_TRAIT_WIDE in robot.model.model_features) || (R_TRAIT_TALL in robot.model.model_features))
+ if((TRAIT_R_WIDE in robot.model.model_features) || (TRAIT_R_TALL in robot.model.model_features))
to_chat(usr, span_warning("This unit's chassis cannot be enlarged any further."))
return FALSE
// SKYRAT EDIT END
diff --git a/code/game/objects/items/storage/garment.dm b/code/game/objects/items/storage/garment.dm
index 9398b675b1b..e9ff2f28ce1 100644
--- a/code/game/objects/items/storage/garment.dm
+++ b/code/game/objects/items/storage/garment.dm
@@ -82,6 +82,7 @@
new /obj/item/clothing/under/rank/security/head_of_security/grey(src)
new /obj/item/clothing/under/rank/security/head_of_security/parade(src)
new /obj/item/clothing/under/rank/security/head_of_security/parade/female(src)
+ new /obj/item/clothing/gloves/tackler/combat(src)
new /obj/item/clothing/suit/armor/hos(src)
new /obj/item/clothing/suit/armor/hos/hos_formal(src)
new /obj/item/clothing/suit/armor/hos/trenchcoat/winter(src)
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index b9c80fd7f6c..ddb588db782 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -380,11 +380,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0)
new /obj/item/stack/rods(get_turf(loc), 2)
qdel(src)
-
-
-
/obj/item/chair/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 == UNARMED_ATTACK && prob(hit_reaction_chance))
+ if(attack_type == UNARMED_ATTACK && prob(hit_reaction_chance) || attack_type == LEAP_ATTACK && prob(hit_reaction_chance))
owner.visible_message(span_danger("[owner] fends off [attack_text] with [src]!"))
return TRUE
return FALSE
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index f25c9cfec5d..3a2b54b74f5 100755
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -109,6 +109,7 @@
new /obj/item/radio/headset/headset_sec/alt(src)
new /obj/item/clothing/glasses/hud/security/sunglasses(src)
new /obj/item/flashlight/seclite(src)
+ new /obj/item/clothing/gloves/tackler(src)
/obj/structure/closet/secure_closet/security/sec
diff --git a/code/game/world.dm b/code/game/world.dm
index de638624319..99cffb74ad2 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -190,7 +190,7 @@ GLOBAL_VAR(restart_counter)
data["tick_usage"] = world.tick_usage
data["tick_lag"] = world.tick_lag
data["time"] = world.time
- data["timestamp"] = logger.unix_timestamp_string()
+ data["timestamp"] = rustg_unix_timestamp()
return data
/world/proc/SetupLogs()
diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm
index 888ecac39ee..986d8356b1a 100644
--- a/code/modules/clothing/gloves/tacklers.dm
+++ b/code/modules/clothing/gloves/tacklers.dm
@@ -21,7 +21,7 @@
/// See: [/datum/component/tackler/var/speed]
var/tackle_speed = 1
/// See: [/datum/component/tackler/var/skill_mod]
- var/skill_mod = 0
+ var/skill_mod = 1
/obj/item/clothing/gloves/tackler/Destroy()
tackler = null
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index 118c28c0e51..e7d87f34bca 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -254,9 +254,7 @@
if(14 to 25) // 1.3ish% chance to stumble and be a bit off balance (like being disarmed)
to_chat(our_guy, span_danger("You stumble a bit on your untied shoelaces!"))
- if(!our_guy.has_movespeed_modifier(/datum/movespeed_modifier/shove))
- our_guy.add_movespeed_modifier(/datum/movespeed_modifier/shove)
- addtimer(CALLBACK(our_guy, TYPE_PROC_REF(/mob/living/carbon, clear_shove_slowdown)), SHOVE_SLOWDOWN_LENGTH)
+ our_guy.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH, 10 SECONDS)
if(26 to 1000)
wiser = FALSE
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index e2af151e49d..ae8b786fbef 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -369,13 +369,14 @@
/obj/item/clothing/suit/armor/swat
name = "MK.I SWAT Suit"
- desc = "A tactical suit first developed in a joint effort by the defunct IS-ERI and Nanotrasen in 2321 for military operations. It has a minor slowdown, but offers decent protection."
+ desc = "A tactical suit first developed in a joint effort by the defunct IS-ERI and Nanotrasen in 2321 for military operations. \
+ It has a minor slowdown, but offers decent protection and helps the wearer resist shoving in close quarters."
icon_state = "heavy"
inhand_icon_state = "swat_suit"
armor_type = /datum/armor/armor_swat
strip_delay = 120
resistance_flags = FIRE_PROOF | ACID_PROOF
- clothing_flags = THICKMATERIAL
+ clothing_flags = BLOCKS_SHOVE_KNOCKDOWN | THICKMATERIAL
cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT_OFF
heat_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm
index 33369d44ce4..cf4c9f65910 100644
--- a/code/modules/jobs/job_types/prisoner.dm
+++ b/code/modules/jobs/job_types/prisoner.dm
@@ -45,6 +45,7 @@
var/datum/crime/past_crime = new(crime.name, crime.desc, "Central Command", "Indefinite.")
target_record.crimes += past_crime
to_chat(crewmember, span_warning("You are imprisoned for \"[crime_name]\"."))
+ crewmember.add_mob_memory(/datum/memory/key/permabrig_crimes, crimes = crime_name)
/datum/outfit/job/prisoner
name = "Prisoner"
@@ -69,7 +70,6 @@
if(!crime_name)
return
var/datum/prisoner_crime/crime = GLOB.prisoner_crimes[crime_name]
-
var/list/limbs_to_tat = new_prisoner.bodyparts.Copy()
for(var/i in 1 to crime.tattoos)
if(!length(SSpersistence.prison_tattoos_to_use) || visualsOnly)
diff --git a/code/modules/library/skill_learning/skillchip.dm b/code/modules/library/skill_learning/skillchip.dm
index 762e8e0162c..89822976993 100644
--- a/code/modules/library/skill_learning/skillchip.dm
+++ b/code/modules/library/skill_learning/skillchip.dm
@@ -498,4 +498,13 @@
activate_message = span_notice("You feel the knowledge and passion of several sunbaked, seasoned fishermen burn within you.")
deactivate_message = span_notice("You no longer feel like casting a fishing rod by the sunny riverside.")
+/obj/item/skillchip/intj
+ name = "Integrated Intuitive Thinking and Judging skillchip"
+ auto_traits = list(TRAIT_REMOTE_TASTING)
+ skill_name = "Mental Flavour Calculus"
+ skill_description = "When examining food, you can experience the flavours just as well as if you were eating it."
+ skill_icon = FA_ICON_DRUMSTICK_BITE
+ activate_message = span_notice("You think of your favourite food and realise that you can rotate its flavour in your mind.")
+ deactivate_message = span_notice("You feel your food-based mind palace crumbling...")
+
#undef SKILLCHIP_CATEGORY_GENERAL
diff --git a/code/modules/logging/log_holder.dm b/code/modules/logging/log_holder.dm
index 7d8386e77b6..1cea0e554be 100644
--- a/code/modules/logging/log_holder.dm
+++ b/code/modules/logging/log_holder.dm
@@ -107,7 +107,7 @@ GENERAL_PROTECT_DATUM(/datum/log_holder)
return
switch(action)
- if("re-render")
+ if("refresh")
cache_ui_data()
SStgui.update_uis(src)
return TRUE
@@ -121,7 +121,7 @@ GENERAL_PROTECT_DATUM(/datum/log_holder)
CRASH("Attempted to call init_logging twice!")
round_id = GLOB.round_id
- logging_start_timestamp = unix_timestamp_string()
+ logging_start_timestamp = rustg_unix_timestamp()
log_categories = list()
disabled_categories = list()
@@ -243,13 +243,10 @@ GENERAL_PROTECT_DATUM(/datum/log_holder)
if(human_readable_enabled)
rustg_file_write("\[[human_readable_timestamp()]\] Starting up round ID [round_id].\n - -------------------------\n", category_instance.get_output_file(null, "log"))
-/datum/log_holder/proc/unix_timestamp_string() // pending change to rust-g
- return RUSTG_CALL(RUST_G, "unix_timestamp")()
-
/datum/log_holder/proc/human_readable_timestamp(precision = 3)
var/start = time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")
// now we grab the millis from the rustg timestamp
- var/rustg_stamp = unix_timestamp_string()
+ var/rustg_stamp = rustg_unix_timestamp()
var/list/timestamp = splittext(rustg_stamp, ".")
#ifdef UNIT_TESTS
if(length(timestamp) != 2)
diff --git a/code/modules/mafia/controller_ui.dm b/code/modules/mafia/controller_ui.dm
index cc901392d22..578555d21f4 100644
--- a/code/modules/mafia/controller_ui.dm
+++ b/code/modules/mafia/controller_ui.dm
@@ -29,6 +29,8 @@
if(turn)
data["turn"] = " - Day [turn]"
+ if(phase == MAFIA_PHASE_JUDGEMENT)
+ data["person_voted_up_ref"] = REF(on_trial)
if(phase == MAFIA_PHASE_SETUP)
data["lobbydata"] = list()
for(var/key in GLOB.mafia_signup + GLOB.mafia_bad_signup + GLOB.pda_mafia_signup)
@@ -41,8 +43,10 @@
data["timeleft"] = next_phase_timer ? timeleft(next_phase_timer) : 0
var/datum/mafia_role/user_role = get_role_player(user)
+
if(user_role)
data["user_notes"] = user_role.written_notes
+ data["player_voted_up"] = (user_role == on_trial)
var/list/ui_messages = list()
for(var/i = user_role.role_messages.len to 1 step -1)
ui_messages.Add(list(list(
@@ -56,6 +60,9 @@
player_info["name"] = role.body.real_name
player_info["ref"] = REF(role)
player_info["alive"] = role.game_status == MAFIA_ALIVE
+ player_info["role_revealed"] = FALSE
+ if(role.role_flags & ROLE_REVEALED)
+ player_info["role_revealed"] = role.name
player_info["possible_actions"] = list()
if(user_role) //not observer
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index 9d54d95516d..8f29a7d2be7 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -433,6 +433,7 @@
desc = "A piece of juicy meat found in an ayy lmao's head."
icon_state = "brain-x"
brain_size = 1.3
+ organ_traits = list(TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, TRAIT_LITERATE, TRAIT_REMOTE_TASTING)
////////////////////////////////////TRAUMAS////////////////////////////////////////
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 2032eb511ff..0eb3945af8c 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -383,21 +383,14 @@
if(!is_type_in_typecache(target_held_item, GLOB.shove_disarming_types)) //It's too expensive we'll get caught
target_held_item = null
- if(!target.has_movespeed_modifier(/datum/movespeed_modifier/shove))
- target.add_movespeed_modifier(/datum/movespeed_modifier/shove)
- target.emote("sway")
- if(target_held_item)
- append_message = "loosening [target.p_their()] grip on [target_held_item]"
- target.visible_message(span_danger("[target.name]'s grip on \the [target_held_item] loosens!"), //He's already out what are you doing
- span_warning("Your grip on \the [target_held_item] loosens!"), null, COMBAT_MESSAGE_RANGE)
- addtimer(CALLBACK(target, TYPE_PROC_REF(/mob/living/carbon, clear_shove_slowdown)), SHOVE_SLOWDOWN_LENGTH)
-
- else if(target_held_item)
+ if(target_held_item && target.get_timed_status_effect_duration(/datum/status_effect/staggered))
target.dropItemToGround(target_held_item)
append_message = "causing [target.p_them()] to drop [target_held_item]"
target.visible_message(span_danger("[target.name] drops \the [target_held_item]!"),
span_warning("You drop \the [target_held_item]!"), null, COMBAT_MESSAGE_RANGE)
+ target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH, 10 SECONDS)
+
log_combat(src, target, "shoved", append_message)
/mob/living/carbon/proc/is_shove_knockdown_blocked() //If you want to add more things that block shove knockdown, extend this
@@ -406,12 +399,6 @@
return TRUE
return FALSE
-/mob/living/carbon/proc/clear_shove_slowdown()
- remove_movespeed_modifier(/datum/movespeed_modifier/shove)
- var/active_item = get_active_held_item()
- if(is_type_in_typecache(active_item, GLOB.shove_disarming_types))
- visible_message(span_warning("[name] regains their grip on \the [active_item]!"), span_warning("You regain your grip on \the [active_item]"), null, COMBAT_MESSAGE_RANGE)
-
/mob/living/carbon/blob_act(obj/structure/blob/B)
if (stat == DEAD)
return
diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm
index 2d4518bd034..a5a41ef0b1f 100644
--- a/code/modules/mob/living/carbon/human/_species.dm
+++ b/code/modules/mob/living/carbon/human/_species.dm
@@ -1068,7 +1068,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
affected.blood_volume = min(affected.blood_volume + round(chem.volume, 0.1), BLOOD_VOLUME_MAXIMUM)
affected.reagents.del_reagent(chem.type)
return COMSIG_MOB_STOP_REAGENT_CHECK
- if(!chem.overdosed && chem.overdose_threshold && chem.volume >= chem.overdose_threshold)
+ if(!chem.overdosed && chem.overdose_threshold && chem.volume >= chem.overdose_threshold && !HAS_TRAIT(affected, TRAIT_OVERDOSEIMMUNE))
chem.overdosed = TRUE
chem.overdose_start(affected)
affected.log_message("has started overdosing on [chem.name] at [chem.volume] units.", LOG_GAME)
@@ -1175,14 +1175,14 @@ GLOBAL_LIST_EMPTY(features_by_species)
return FALSE
user.do_attack_animation(target, atk_effect)
- //has our target been shoved recently? If so, they're off-balance and we get an easy hit.
- var/off_balance = FALSE
+ //has our target been shoved recently? If so, they're staggered and we get an easy hit.
+ var/staggered = FALSE
//Someone in a grapple is much more vulnerable to being harmed by punches.
var/grappled = FALSE
- if(target.has_movespeed_modifier(/datum/movespeed_modifier/shove))
- off_balance = TRUE
+ if(target.get_timed_status_effect_duration(/datum/status_effect/staggered))
+ staggered = TRUE
if(target.pulledby && target.pulledby.grab_state >= GRAB_AGGRESSIVE)
grappled = TRUE
@@ -1194,7 +1194,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
var/miss_chance = 100//calculate the odds that a punch misses entirely. considers stamina and brute damage of the puncher. punches miss by default to prevent weird cases
if(attacking_bodypart.unarmed_damage_low)
- if((target.body_position == LYING_DOWN) || HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER) || off_balance) //kicks and attacks against off-balance targets never miss (provided your species deals more than 0 damage)
+ if((target.body_position == LYING_DOWN) || HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER) || staggered) //kicks and attacks against staggered targets never miss (provided your species deals more than 0 damage)
miss_chance = 0
else
miss_chance = clamp(UNARMED_MISS_CHANCE_BASE - limb_accuracy + user.getStaminaLoss() + (user.getBruteLoss()*0.5), 0, UNARMED_MISS_CHANCE_MAX) //Limb miss chance + various damage. capped at 80 so there is at least a chance to land a hit.
@@ -1237,8 +1237,8 @@ GLOBAL_LIST_EMPTY(features_by_species)
target.force_say()
log_combat(user, target, "punched")
- //If we rolled a punch high enough to hit our stun threshold, or our target is off-balance and they have at least 40 damage+stamina loss, we knock them down
- if((target.stat != DEAD) && prob(limb_accuracy) || (target.stat != DEAD) && off_balance && (target.getStaminaLoss() + user.getBruteLoss()) >= 40)
+ //If we rolled a punch high enough to hit our stun threshold, or our target is staggered and they have at least 40 damage+stamina loss, we knock them down
+ if((target.stat != DEAD) && prob(limb_accuracy) || (target.stat != DEAD) && staggered && (target.getStaminaLoss() + user.getBruteLoss()) >= 40)
target.visible_message(span_danger("[user] knocks [target] down!"), \
span_userdanger("You're knocked down by [user]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, user)
to_chat(user, span_danger("You knock [target] down!"))
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index aed1beafd16..602ab7d24c1 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -181,7 +181,7 @@
gloves = equipping
//SKYRAT EDIT ADDITION - ERP UPDATE
if(gloves.breakouttime)
- ADD_TRAIT(src, TRAIT_RESTRAINED, GLOVES_TRAIT)
+ ADD_TRAIT(src, TRAIT_RESTRAINED, TRAIT_GLOVES)
stop_pulling()
update_mob_action_buttons()
//SKYRAT EDIT ADDITION END
@@ -280,7 +280,7 @@
else if(I == gloves)
//SKYRAT EDIT ADDITION - ERP UPDATE
if(gloves.breakouttime) //when unequipping a straightjacket
- REMOVE_TRAIT(src, TRAIT_RESTRAINED, GLOVES_TRAIT)
+ REMOVE_TRAIT(src, TRAIT_RESTRAINED, TRAIT_GLOVES)
drop_all_held_items() //suit is restraining
update_mob_action_buttons() //certain action buttons may be usable again.
//SKYRAT EDIT ADDITION END
diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm
index 345e30264ba..74d2bedf3a7 100644
--- a/code/modules/mob/living/carbon/human/species_types/abductors.dm
+++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm
@@ -3,14 +3,15 @@
id = SPECIES_ABDUCTOR
sexes = FALSE
inherent_traits = list(
- TRAIT_NO_UNDERWEAR,
+ TRAIT_CHUNKYFINGERS_IGNORE_BATON,
+ TRAIT_NEVER_WOUNDED,
+ TRAIT_NOBLOOD,
TRAIT_NOBREATH,
+ TRAIT_NODISMEMBER,
TRAIT_NOHUNGER,
+ TRAIT_NO_UNDERWEAR,
+ TRAIT_REMOTE_TASTING,
TRAIT_VIRUSIMMUNE,
- TRAIT_NOBLOOD,
- TRAIT_CHUNKYFINGERS_IGNORE_BATON,
- TRAIT_NODISMEMBER,
- TRAIT_NEVER_WOUNDED
)
mutanttongue = /obj/item/organ/internal/tongue/abductor
mutantstomach = null
diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm
index dec4fd9e306..5988ad3b890 100644
--- a/code/modules/mob/living/carbon/human/species_types/android.dm
+++ b/code/modules/mob/living/carbon/human/species_types/android.dm
@@ -15,6 +15,7 @@
TRAIT_NO_DNA_COPY,
TRAIT_NO_PLASMA_TRANSFORM,
TRAIT_NO_UNDERWEAR,
+ TRAIT_OVERDOSEIMMUNE,
TRAIT_PIERCEIMMUNE,
TRAIT_RADIMMUNE,
TRAIT_RESISTCOLD,
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 5e4a564125c..8611bf85eb4 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1163,7 +1163,8 @@
/mob/living/resist_grab(moving_resist)
. = TRUE
- if(pulledby.grab_state || body_position == LYING_DOWN || HAS_TRAIT(src, TRAIT_GRABWEAKNESS) || has_movespeed_modifier(/datum/movespeed_modifier/shove) && getStaminaLoss() > STAMINA_THRESHOLD_HARD_RESIST) //SKYRAT EDIT CHANGE - ORIGINAL : if(pulledby.grab_state || body_position == LYING_DOWN || HAS_TRAIT(src, TRAIT_GRABWEAKNESS) || has_movespeed_modifier(/datum/movespeed_modifier/shove) && getStaminaLoss() >= 30)
+ //If we're in an aggressive grab or higher, we're lying down, we're vulnerable to grabs, or we're staggered and we have some amount of stamina loss, we must resist
+ if(pulledby.grab_state || body_position == LYING_DOWN || HAS_TRAIT(src, TRAIT_GRABWEAKNESS) || get_timed_status_effect_duration(/datum/status_effect/staggered) && getStaminaLoss() > STAMINA_THRESHOLD_HARD_RESIST) //SKYRAT EDIT CHANGE - ORIGINAL : if(pulledby.grab_state || body_position == LYING_DOWN || HAS_TRAIT(src, TRAIT_GRABWEAKNESS) || get_timed_status_effect_duration(/datum/status_effect/staggered) && getStaminaLoss() >= 30)
var/altered_grab_state = pulledby.grab_state
if(body_position == LYING_DOWN || HAS_TRAIT(src, TRAIT_GRABWEAKNESS) && pulledby.grab_state < GRAB_KILL) //If prone, resisting out of a grab is equivalent to 1 grab state higher. won't make the grab state exceed the normal max, however - SKYRAT EDIT CHANGE: if((resting || HAS_TRAIT(src, TRAIT_GRABWEAKNESS)) && pulledby.grab_state < GRAB_KILL) //If resting, resisting out of a grab is equivalent to 1 grab state higher. won't make the grab state exceed the normal max, however
altered_grab_state++
diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm
index 50b4abf8035..de01642f0c6 100644
--- a/code/modules/mob/living/living_say.dm
+++ b/code/modules/mob/living/living_say.dm
@@ -283,7 +283,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list(
var/dist = get_dist(speaker, src) - message_range
if(dist > 0 && dist <= EAVESDROP_EXTRA_RANGE && !HAS_TRAIT(src, TRAIT_GOOD_HEARING) && !isobserver(src)) // ghosts can hear all messages clearly
raw_message = stars(raw_message)
- if (dist > EAVESDROP_EXTRA_RANGE && !HAS_TRAIT(src, TRAIT_GOOD_HEARING) && !isobserver(src))
+ if (message_range != INFINITY && dist > EAVESDROP_EXTRA_RANGE && !HAS_TRAIT(src, TRAIT_GOOD_HEARING) && !isobserver(src))
return FALSE // Too far away and don't have good hearing, you can't hear anything
// we need to send this signal before compose_message() is used since other signals need to modify
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index b320f500701..31ead7ef718 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -349,7 +349,7 @@
eye_lights.icon = icon
add_overlay(eye_lights)
- if(opened && !(R_TRAIT_UNIQUEPANEL in model.model_features))
+ if(opened && !(TRAIT_R_UNIQUEPANEL in model.model_features))
if(wiresexposed)
add_overlay("ov-opencover +w")
else if(cell)
diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm
index 2aeb97a89fe..80809bb5a40 100644
--- a/code/modules/mob/living/silicon/robot/robot_model.dm
+++ b/code/modules/mob/living/silicon/robot/robot_model.dm
@@ -248,7 +248,7 @@
reskin_icons[skin] = image(icon = details[SKIN_ICON] || 'icons/mob/silicon/robots.dmi', icon_state = details[SKIN_ICON_STATE])
//SKYRAT EDIT ADDITION BEGIN - ALTBORGS
if (!isnull(details[SKIN_FEATURES]))
- if (R_TRAIT_WIDE in details[SKIN_FEATURES])
+ if (TRAIT_R_WIDE in details[SKIN_FEATURES])
var/image/reskin = reskin_icons[skin]
reskin.pixel_x -= 16
//SKYRAT EDIT END
@@ -257,7 +257,7 @@
return FALSE
var/list/details = borg_skins[borg_skin]
//SKYRAT EDIT START
- if(cyborg.hasExpanded && (((R_TRAIT_WIDE in details[SKIN_FEATURES]) && (R_TRAIT_WIDE in model_features)) || ((R_TRAIT_TALL in details[SKIN_FEATURES]) && (R_TRAIT_TALL in model_features))))
+ if(cyborg.hasExpanded && (((TRAIT_R_WIDE in details[SKIN_FEATURES]) && (TRAIT_R_WIDE in model_features)) || ((TRAIT_R_TALL in details[SKIN_FEATURES]) && (TRAIT_R_TALL in model_features))))
to_chat(cyborg, span_warning("You can't make yourself into a larger frame when you've already used an expander!"))
return FALSE
//SKYRAT EDIT END
diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm
index 49358223e35..b782f2fc959 100644
--- a/code/modules/movespeed/modifiers/mobs.dm
+++ b/code/modules/movespeed/modifiers/mobs.dm
@@ -81,8 +81,8 @@
blacklisted_movetypes = FLOATING
variable = TRUE
-/datum/movespeed_modifier/shove
- multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH
+/datum/movespeed_modifier/staggered
+ multiplicative_slowdown = STAGGERED_SLOWDOWN_STRENGTH
/datum/movespeed_modifier/human_carry
multiplicative_slowdown = HUMAN_CARRY_SLOWDOWN
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 3750acddc42..40e99eefe6a 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -37,23 +37,29 @@
/obj/item/pen/Initialize(mapload)
. = ..()
- AddComponent(/datum/component/dart_insert, dart_insert_icon, dart_insert_casing_icon_state, dart_insert_icon, dart_insert_projectile_icon_state)
+ AddComponent(/datum/component/dart_insert, \
+ dart_insert_icon, \
+ dart_insert_casing_icon_state, \
+ dart_insert_icon, \
+ dart_insert_projectile_icon_state, \
+ CALLBACK(src, PROC_REF(get_dart_var_modifiers))\
+ )
RegisterSignal(src, COMSIG_DART_INSERT_ADDED, PROC_REF(on_inserted_into_dart))
RegisterSignal(src, COMSIG_DART_INSERT_REMOVED, PROC_REF(on_removed_from_dart))
- RegisterSignal(src, COMSIG_DART_INSERT_GET_VAR_MODIFIERS, PROC_REF(get_dart_var_modifiers))
/obj/item/pen/proc/on_inserted_into_dart(datum/source, obj/projectile/dart, mob/user, embedded = FALSE)
SIGNAL_HANDLER
-/obj/item/pen/proc/get_dart_var_modifiers(datum/source, list/modifiers)
- SIGNAL_HANDLER
- modifiers["damage"] = max(5, throwforce)
- modifiers["speed"] = max(0, throw_speed - 3)
- modifiers["embedding"] = embedding
- modifiers["armour_penetration"] = armour_penetration
- modifiers["wound_bonus"] = wound_bonus
- modifiers["bare_wound_bonus"] = bare_wound_bonus
- modifiers["demolition_mod"] = demolition_mod
+/obj/item/pen/proc/get_dart_var_modifiers()
+ return list(
+ "damage" = max(5, throwforce),
+ "speed" = max(0, throw_speed - 3),
+ "embedding" = embedding,
+ "armour_penetration" = armour_penetration,
+ "wound_bonus" = wound_bonus,
+ "bare_wound_bonus" = bare_wound_bonus,
+ "demolition_mod" = demolition_mod,
+ )
/obj/item/pen/proc/on_removed_from_dart(datum/source, obj/projectile/dart, mob/user)
SIGNAL_HANDLER
@@ -366,12 +372,12 @@
if(istype(projectile))
UnregisterSignal(projectile, list(COMSIG_PROJECTILE_FIRE, COMSIG_PROJECTILE_ON_SPAWN_DROP, COMSIG_PROJECTILE_ON_SPAWN_EMBEDDED))
-/obj/item/pen/edagger/get_dart_var_modifiers(datum/source, list/modifiers)
+/obj/item/pen/edagger/get_dart_var_modifiers()
. = ..()
var/datum/component/transforming/transform_comp = GetComponent(/datum/component/transforming)
- modifiers["damage"] = max(5, transform_comp.throwforce_on)
- modifiers["speed"] = max(0, transform_comp.throw_speed_on - 3)
- var/list/embed_params = modifiers["embedding"]
+ .["damage"] = max(5, transform_comp.throwforce_on)
+ .["speed"] = max(0, transform_comp.throw_speed_on - 3)
+ var/list/embed_params = .["embedding"]
embed_params["embed_chance"] = 100
/obj/item/pen/edagger/proc/on_containing_dart_fired(obj/projectile/source)
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 580d2a66f96..c38036e6eab 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -243,8 +243,15 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
/obj/machinery/power/supermatter_crystal/examine(mob/user)
. = ..()
var/immune = HAS_MIND_TRAIT(user, TRAIT_MADNESS_IMMUNE)
- if(isliving(user) && !immune && (get_dist(user, src) < SM_HALLUCINATION_RANGE(internal_energy)))
- . += span_danger("You get headaches just from looking at it.")
+ if(isliving(user))
+ if (!immune && (get_dist(user, src) < SM_HALLUCINATION_RANGE(internal_energy)))
+ . += span_danger("You get headaches just from looking at it.")
+ var/mob/living/living_user = user
+ if (HAS_TRAIT(user, TRAIT_REMOTE_TASTING))
+ to_chat(user, span_warning("The taste is overwhelming and indescribable!"))
+ living_user.electrocute_act(shock_damage = 15, source = src, flags = SHOCK_KNOCKDOWN | SHOCK_NOGLOVES)
+ . += span_notice("It could use a little more Sodium Chloride...")
+
. += delamination_strategy.examine(src)
return .
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 20d4da62f2b..5f9d7f81995 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -765,7 +765,7 @@
if(!reagent.metabolizing)
reagent.metabolizing = TRUE
reagent.on_mob_metabolize(owner)
- if(can_overdose)
+ if(can_overdose && !HAS_TRAIT(owner, TRAIT_OVERDOSEIMMUNE))
if(reagent.overdose_threshold)
if(reagent.volume >= reagent.overdose_threshold && !reagent.overdosed)
reagent.overdosed = TRUE
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index 5234018bbd9..d58df6a1d6b 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -61,13 +61,16 @@
reagents.add_reagent(/datum/reagent/blood, disease_amount, data)
add_initial_reagents()
-/obj/item/reagent_containers/examine()
+/obj/item/reagent_containers/examine(mob/user)
. = ..()
if(has_variable_transfer_amount)
if(possible_transfer_amounts.len > 1)
. += span_notice("Left-click or right-click in-hand to increase or decrease its transfer amount.")
else if(possible_transfer_amounts.len)
. += span_notice("Left-click or right-click in-hand to view its transfer amount.")
+ if(isliving(user) && HAS_TRAIT(user, TRAIT_REMOTE_TASTING))
+ var/mob/living/living_user = user
+ living_user.taste(reagents)
/obj/item/reagent_containers/create_reagents(max_vol, flags)
. = ..()
diff --git a/code/modules/unit_tests/say.dm b/code/modules/unit_tests/say.dm
index 3ae55a12e37..ec58dcedc88 100644
--- a/code/modules/unit_tests/say.dm
+++ b/code/modules/unit_tests/say.dm
@@ -58,12 +58,15 @@
/// This runs some simple speech tests on a speaker and listener and determines if a person can hear whispering or speaking as they are moved a distance away
/datum/unit_test/speech
- var/list/handle_speech_result = null
- var/list/handle_hearing_result = null
var/mob/living/carbon/human/speaker
var/mob/living/carbon/human/listener
+ var/list/handle_speech_result = null
+ var/list/handle_hearing_result = null
+
var/obj/item/radio/speaker_radio
var/obj/item/radio/listener_radio
+ var/speaker_radio_heard_message = FALSE
+ var/listener_radio_received_message = FALSE
/datum/unit_test/speech/proc/handle_speech(datum/source, list/speech_args)
SIGNAL_HANDLER
@@ -99,6 +102,16 @@
handle_hearing_result = list()
handle_hearing_result += hearing_args
+/datum/unit_test/speech/proc/handle_radio_hearing(datum/source, mob/living/user, message, channel)
+ SIGNAL_HANDLER
+
+ speaker_radio_heard_message = TRUE
+
+/datum/unit_test/speech/proc/handle_radio_speech(datum/source, list/data)
+ SIGNAL_HANDLER
+
+ listener_radio_received_message = TRUE
+
/datum/unit_test/speech/Run()
speaker = allocate(/mob/living/carbon/human/consistent)
// Name changes to make understanding breakpoints easier
@@ -114,7 +127,10 @@
listener.mock_client = mock_client
RegisterSignal(speaker, COMSIG_MOB_SAY, PROC_REF(handle_speech))
+ RegisterSignal(speaker_radio, COMSIG_RADIO_NEW_MESSAGE, PROC_REF(handle_radio_hearing))
+
RegisterSignal(listener, COMSIG_MOVABLE_HEAR, PROC_REF(handle_hearing))
+ RegisterSignal(listener_radio, COMSIG_RADIO_RECEIVE_MESSAGE, PROC_REF(handle_radio_speech))
// speaking and whispering should be hearable
conversation(distance = 1)
@@ -169,6 +185,9 @@
handle_hearing_result = null
/datum/unit_test/speech/proc/radio_test()
+ speaker_radio_heard_message = FALSE
+ listener_radio_received_message = FALSE
+
speaker.forceMove(run_loc_floor_bottom_left)
listener.forceMove(locate((run_loc_floor_bottom_left.x + 10), run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z))
@@ -186,11 +205,15 @@
speaker.say(pangram_quote)
TEST_ASSERT(handle_speech_result, "Handle speech signal was not fired (radio test)")
- TEST_ASSERT(islist(handle_hearing_result), "Listener failed to hear radio message (radio test)")
+ TEST_ASSERT(speaker_radio_heard_message, "Speaker's radio did not hear them speak (radio test)")
TEST_ASSERT_EQUAL(speaker_radio.get_frequency(), listener_radio.get_frequency(), "Radio frequencies were not equal (radio test)")
+ TEST_ASSERT(listener_radio_received_message, "Listener's radio did not receive the broadcast (radio test)")
+ TEST_ASSERT(islist(handle_hearing_result), "Listener failed to hear radio message (radio test)")
handle_speech_result = null
handle_hearing_result = null
+ speaker_radio_heard_message = FALSE
+ listener_radio_received_message = FALSE
speaker_radio.set_frequency(FREQ_CTF_RED)
speaker.say(pangram_quote)
@@ -200,6 +223,8 @@
handle_speech_result = null
handle_hearing_result = null
+ speaker_radio_heard_message = FALSE
+ listener_radio_received_message = FALSE
speaker_radio.set_broadcasting(FALSE)
#undef NORMAL_HEARING_RANGE
diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm
index e51205c00e4..5e3d9d3b055 100644
--- a/code/modules/vending/games.dm
+++ b/code/modules/vending/games.dm
@@ -52,11 +52,12 @@
/obj/item/skillchip/appraiser = 2,
/obj/item/skillchip/basketweaving = 2,
/obj/item/skillchip/bonsai = 2,
+ /obj/item/skillchip/intj = 2,
/obj/item/skillchip/light_remover = 2,
+ /obj/item/skillchip/master_angler = 2,
/obj/item/skillchip/sabrage = 2,
/obj/item/skillchip/useless_adapter = 5,
/obj/item/skillchip/wine_taster = 2,
- /obj/item/skillchip/master_angler = 2,
),
),
list(
diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm
index b54edffe4c0..feae0499655 100644
--- a/code/modules/vending/security.dm
+++ b/code/modules/vending/security.dm
@@ -16,6 +16,7 @@
/obj/item/storage/box/evidence = 6,
/obj/item/flashlight/seclite = 4,
/obj/item/restraints/legcuffs/bola/energy = 7,
+ /obj/item/clothing/gloves/tackler = 5,
)
contraband = list(
/obj/item/clothing/glasses/sunglasses = 2,
@@ -26,7 +27,6 @@
/obj/item/coin/antagtoken = 1,
/obj/item/clothing/head/helmet/blueshirt = 1,
/obj/item/clothing/suit/armor/vest/blueshirt = 1,
- /obj/item/clothing/gloves/tackler = 5,
/obj/item/grenade/stingbang = 1,
/obj/item/watertank/pepperspray = 2,
/obj/item/storage/belt/holster/energy = 4,
diff --git a/html/changelogs/AutoChangeLog-pr-504.yml b/html/changelogs/AutoChangeLog-pr-504.yml
deleted file mode 100644
index 2c3a0bcb2e3..00000000000
--- a/html/changelogs/AutoChangeLog-pr-504.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "LovliestPlant"
-delete-after: True
-changes:
- - rscadd: "Adds links to any special rules or metaprotections to antag's objective panels."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-764.yml b/html/changelogs/AutoChangeLog-pr-764.yml
deleted file mode 100644
index 8a41e1c0adc..00000000000
--- a/html/changelogs/AutoChangeLog-pr-764.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "Melbert"
-delete-after: True
-changes:
- - balance: "Transformation sting now lasts 8 minutes, down from permanent. However, the effect is paused for dead and stasis mobs, making it permanent SO LONG AS they stay dead or in stasis. The effect is also permanent if used on a monkey."
- - balance: "Transformation sting now costs 33 chemicals, down from 50."
- - balance: "Transformation sting now costs 2 dna points, down from 3."
- - bugfix: "Transformation sting works on monkeys again."
- - refactor: "Refactored a bit of human randomization."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-768.yml b/html/changelogs/AutoChangeLog-pr-768.yml
deleted file mode 100644
index 5cf1a7ecd62..00000000000
--- a/html/changelogs/AutoChangeLog-pr-768.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "SyncIt21"
-delete-after: True
-changes:
- - bugfix: "autolathe does not diminish materials from custom material items like toolboxes when printing them in bulk. Also does not gray out that item in the UI"
- - bugfix: "autloathe correctly updates UI after inserting items into it"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-769.yml b/html/changelogs/AutoChangeLog-pr-769.yml
deleted file mode 100644
index eb9509a7aa4..00000000000
--- a/html/changelogs/AutoChangeLog-pr-769.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "aaaa1023"
-delete-after: True
-changes:
- - qol: "adds pixel perfect 4x, 4.5x, and 5x"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-771.yml b/html/changelogs/AutoChangeLog-pr-771.yml
deleted file mode 100644
index 0c02064c9b3..00000000000
--- a/html/changelogs/AutoChangeLog-pr-771.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "vinylspiders"
-delete-after: True
-changes:
- - bugfix: "fullupgrade chem dispensers will now spawn with all their chems"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-772.yml b/html/changelogs/AutoChangeLog-pr-772.yml
deleted file mode 100644
index 07ed14a6044..00000000000
--- a/html/changelogs/AutoChangeLog-pr-772.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "lizardqueenlexi"
-delete-after: True
-changes:
- - bugfix: "Skillsoft's skillchip stations are now ADA-compliant (Astronauts with Disabilities Act). Paraplegic characters can now implant themselves with skillchips, the same as anyone else."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-773.yml b/html/changelogs/AutoChangeLog-pr-773.yml
deleted file mode 100644
index 2b841d6dd8d..00000000000
--- a/html/changelogs/AutoChangeLog-pr-773.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Y0SH1M4S73R"
-delete-after: True
-changes:
- - rscadd: "Certain types of pens now function like you expect they would when inserted into a foam dart"
- - qol: "Examining a foam dart closely will show you how to modify it, or what it is modified with"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-784.yml b/html/changelogs/AutoChangeLog-pr-784.yml
deleted file mode 100644
index 2d911e132c8..00000000000
--- a/html/changelogs/AutoChangeLog-pr-784.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "RatFromTheJungle"
-delete-after: True
-changes:
- - bugfix: "fixes punches doing like triple stamina damage, by removing a 2.6x multiplier."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-786.yml b/html/changelogs/AutoChangeLog-pr-786.yml
deleted file mode 100644
index 9cb91ae6647..00000000000
--- a/html/changelogs/AutoChangeLog-pr-786.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Nerev4r"
-delete-after: True
-changes:
- - bugfix: "Chameleon mutation is toggleable again."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-787.yml b/html/changelogs/AutoChangeLog-pr-787.yml
deleted file mode 100644
index da74cef81fe..00000000000
--- a/html/changelogs/AutoChangeLog-pr-787.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "TwistedSilicon"
-delete-after: True
-changes:
- - bugfix: "Window damage overlays have been fixed."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-788.yml b/html/changelogs/AutoChangeLog-pr-788.yml
deleted file mode 100644
index e9429200cfc..00000000000
--- a/html/changelogs/AutoChangeLog-pr-788.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "jjpark-kb"
-delete-after: True
-changes:
- - rscadd: "you can craft the gutlunch trough"
- - qol: "you can fill the gutlunch trough with a mining bag"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-790.yml b/html/changelogs/AutoChangeLog-pr-790.yml
deleted file mode 100644
index db441e24d90..00000000000
--- a/html/changelogs/AutoChangeLog-pr-790.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Smol42"
-delete-after: True
-changes:
- - rscadd: "Added four acrador snouts."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-793.yml b/html/changelogs/AutoChangeLog-pr-793.yml
deleted file mode 100644
index f375987f1c4..00000000000
--- a/html/changelogs/AutoChangeLog-pr-793.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xander3359"
-delete-after: True
-changes:
- - admin: "Remove \"Make AI\" from VV dropdown"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-794.yml b/html/changelogs/AutoChangeLog-pr-794.yml
deleted file mode 100644
index 5575fc89378..00000000000
--- a/html/changelogs/AutoChangeLog-pr-794.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SyncIt21"
-delete-after: True
-changes:
- - bugfix: "RCD can build directional windows on top of existing grills & without them."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-795.yml b/html/changelogs/AutoChangeLog-pr-795.yml
deleted file mode 100644
index 01610a2bd18..00000000000
--- a/html/changelogs/AutoChangeLog-pr-795.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "jjpark-kb"
-delete-after: True
-changes:
- - bugfix: "gutlunches now produce miner salve instead of milk, as well as the other reagents if fed the correct ore"
\ No newline at end of file
diff --git a/html/changelogs/archive/2023-11.yml b/html/changelogs/archive/2023-11.yml
index 9764f72e362..239c9a20bce 100644
--- a/html/changelogs/archive/2023-11.yml
+++ b/html/changelogs/archive/2023-11.yml
@@ -1164,3 +1164,103 @@
- code_imp: 'The currently operating rust-g version on a live server is posted to
places like the runtime.log, in the same place where the revision information
and any applicable test merges already were. /:cl:'
+2023-11-24:
+ Jacquerel:
+ - bugfix: The plasma river is about as deadly for animals as it is for humans.
+ - bugfix: Golems can now wade in the plasma river unscathed.
+ - bugfix: Undismemberable limbs will no longer be dismembered by the plasma river.
+ - balance: Golems and plasmamen cannot become husked.
+ - image: Robotic and Skeletal parts will remain distinct while the rest of the body
+ is husked.
+ - rscadd: A new skill chip can be found in maintenance or purchased from the vendor,
+ allowing you to experience food in new and exciting ways.
+ - rscadd: Abductors also have access to this incredible power, simply using their
+ genius level brains.
+ JohnFulpWillard:
+ - qol: Mafia panel no longer shows vote buttons if you're on stand, shows the roles
+ of revealed players, and list out who is on the stand, if any.
+ LovliestPlant:
+ - rscadd: Adds links to any special rules or metaprotections to antag's objective
+ panels.
+ Melbert:
+ - balance: Transformation sting now lasts 8 minutes, down from permanent. However,
+ the effect is paused for dead and stasis mobs, making it permanent SO LONG AS
+ they stay dead or in stasis. The effect is also permanent if used on a monkey.
+ - balance: Transformation sting now costs 33 chemicals, down from 50.
+ - balance: Transformation sting now costs 2 dna points, down from 3.
+ - bugfix: Transformation sting works on monkeys again.
+ - refactor: Refactored a bit of human randomization.
+ - refactor: Refactors how ethereals update their color when damaged.
+ Nerev4r:
+ - bugfix: Chameleon mutation is toggleable again.
+ - rscadd: Certain firmware updates rolled out, finally, in Sector 13 have allowed
+ machines to emulate personal computers within their brains.
+ RatFromTheJungle:
+ - bugfix: fixes punches doing like triple stamina damage, by removing a 2.6x multiplier.
+ Smol42:
+ - rscadd: Added four acrador snouts.
+ Steals-The-PRs:
+ - bugfix: Androids cannot have overdose effect by any chems.
+ SyncIt21:
+ - bugfix: autolathe does not diminish materials from custom material items like
+ toolboxes when printing them in bulk. Also does not gray out that item in the
+ UI
+ - bugfix: autloathe correctly updates UI after inserting items into it
+ - bugfix: RCD can build directional windows on top of existing grills & without
+ them.
+ The Sharkening:
+ - refactor: Removes unused Kilostation Automapper templates
+ TwistedSilicon:
+ - bugfix: Window damage overlays have been fixed.
+ Xander3359:
+ - admin: Remove "Make AI" from VV dropdown
+ Y0SH1M4S73R:
+ - rscadd: Certain types of pens now function like you expect they would when inserted
+ into a foam dart
+ - qol: Examining a foam dart closely will show you how to modify it, or what it
+ is modified with
+ aaaa1023:
+ - qol: adds pixel perfect 4x, 4.5x, and 5x
+ dieamond13:
+ - qol: gives roundstart prisoners a key memory of what their crime is
+ jjpark-kb:
+ - bugfix: gutlunches now produce miner salve instead of milk, as well as the other
+ reagents if fed the correct ore
+ - rscadd: you can craft the gutlunch trough
+ - qol: you can fill the gutlunch trough with a mining bag
+ - rscadd: you can hammer glass shards to get back sand
+ lizardqueenlexi:
+ - bugfix: Skillsoft's skillchip stations are now ADA-compliant (Astronauts with
+ Disabilities Act). Paraplegic characters can now implant themselves with skillchips,
+ the same as anyone else.
+ necromanceranne:
+ - balance: Judo Joe, archnemesis of Maint Khan, has begun re-airing his midnight
+ infomercials shilling his extremely expensive Tackle Supreme Judo Karate Training
+ video tapes. Unable to pass up a 'bargain', Nanotrasen has purchased these tapes
+ en masse. Tackling techniques have started to improve, as well as Nanotrasen's
+ tackling instructional algorithms within tackle gloves.
+ - balance: The outcomes for tackling are more equalized. It isn't as feast or famine,
+ and should be somewhat more controllable without becoming too severe.
+ - rscadd: Blocking successfully against a tackle will force the tackle to be a neutral
+ outcome.
+ - rscadd: Unarmed effectiveness from arms now contributes to attacking with and
+ defending from tackles.
+ - rscadd: Those who refuse to use firearms (like Sleeping Carp users and insane
+ unholy berzerkers) are better at tackling others.
+ - rscadd: Riot specialized armor, and not just riot armor, now contributes meaningfully
+ to tackling effectiveness.
+ - balance: MK.1 Swat Suits, the ones that come in SWAT crates, now functions similarly
+ to riot armor.
+ - rscadd: Settlers from the outer rims have noticed they aren't very good at protecting
+ themselves against Judo Joe's clearly discriminatory tackling techniques.
+ - rscadd: Security lockers come with gripper gloves, security vendors now sell them
+ as standard items, and the HoS' garment bag now has a pair of gorilla gloves.
+ Gripper gloves have a positive skill bonus to tackling.
+ - rscadd: Being insane also makes you INSANELY good at tackling but also INSANELY
+ likely to eat shit on a whiff. DO OR DIE, BITCH.
+ - refactor: Shoving slowdown and all its implementations now use a status effect,
+ Staggered.
+ vinylspiders:
+ - bugfix: fullupgrade chem dispensers will now spawn with all their chems
+ vvvv-vvvv:
+ - bugfix: Fix refresh button in log viewer
diff --git a/modular_skyrat/master_files/code/datums/components/tippable.dm b/modular_skyrat/master_files/code/datums/components/tippable.dm
index 09013130f1e..e911914c1ce 100644
--- a/modular_skyrat/master_files/code/datums/components/tippable.dm
+++ b/modular_skyrat/master_files/code/datums/components/tippable.dm
@@ -8,14 +8,14 @@
var/mob/living/silicon/robot/robot = tipped_mob
if(is_tipped)
ADD_TRAIT(robot, TRAIT_IMMOBILIZED, TIPPED_OVER)
- if(R_TRAIT_UNIQUETIP in robot.model.model_features)
+ if(TRAIT_R_UNIQUETIP in robot.model.model_features)
robot.icon_state = "[robot.model.cyborg_base_icon]-tipped"
robot.cut_overlays() // Cut eye-lights
return
robot.transform = turn(robot.transform, 180)
else
REMOVE_TRAIT(robot, TRAIT_IMMOBILIZED, TIPPED_OVER)
- if(R_TRAIT_UNIQUETIP in robot.model.model_features)
+ if(TRAIT_R_UNIQUETIP in robot.model.model_features)
robot.icon_state = "[robot.model.cyborg_base_icon]"
robot.regenerate_icons() // Return eye-lights
return
diff --git a/modular_skyrat/master_files/code/datums/traits/good.dm b/modular_skyrat/master_files/code/datums/traits/good.dm
index 08f265145a9..1a5a6d9d26e 100644
--- a/modular_skyrat/master_files/code/datums/traits/good.dm
+++ b/modular_skyrat/master_files/code/datums/traits/good.dm
@@ -14,7 +14,7 @@
name = "Linguist"
desc = "You're a student of numerous languages and come with an additional language point."
value = 4
- mob_trait = QUIRK_LINGUIST
+ mob_trait = TRAIT_LINGUIST
gain_text = span_notice("Your brain seems more equipped to handle different modes of conversation.")
lose_text = span_danger("Your grasp of the finer points of Draconic idioms fades away.")
medical_record_text = "Patient demonstrates a high brain plasticity in regards to language learning."
diff --git a/modular_skyrat/master_files/code/datums/traits/neutral.dm b/modular_skyrat/master_files/code/datums/traits/neutral.dm
index e37161a1986..ea2f50d870f 100644
--- a/modular_skyrat/master_files/code/datums/traits/neutral.dm
+++ b/modular_skyrat/master_files/code/datums/traits/neutral.dm
@@ -1,5 +1,3 @@
-#define TRAIT_HYDRA_HEADS "hydrahead" // We still dont have a centralised trait file
-
GLOBAL_VAR_INIT(DNR_trait_overlay, generate_DNR_trait_overlay())
/// Instantiates GLOB.DNR_trait_overlay by creating a new mutable_appearance instance of the overlay.
diff --git a/modular_skyrat/master_files/code/modules/client/preferences.dm b/modular_skyrat/master_files/code/modules/client/preferences.dm
index 2532bc4c308..52a70bd907c 100644
--- a/modular_skyrat/master_files/code/modules/client/preferences.dm
+++ b/modular_skyrat/master_files/code/modules/client/preferences.dm
@@ -123,17 +123,17 @@
mutant_bodyparts -= key
continue
if(!GLOB.sprite_accessories[key][mutant_bodyparts[key][MUTANT_INDEX_NAME]]) // The individual accessory no longer exists
- mutant_bodyparts[key][MUTANT_INDEX_NAME] = GLOB.default_mutant_bodyparts[pref_species.name[key][MUTANT_INDEX_NAME]]
+ mutant_bodyparts[key][MUTANT_INDEX_NAME] = GLOB.default_mutant_bodyparts[pref_species.name[key][MUTANTPART_NAME]]
validate_color_keys_for_part(key) // Validate the color count of each accessory that wasnt removed
// Add any missing accessories
for(var/key in target_bodyparts)
if(!mutant_bodyparts[key])
var/datum/sprite_accessory/SA
- if(target_bodyparts[key][MUTANT_INDEX_CAN_RANDOMIZE])
+ if(target_bodyparts[key][MUTANTPART_CAN_RANDOMIZE])
SA = random_accessory_of_key_for_species(key, pref_species)
else
- SA = GLOB.sprite_accessories[key][target_bodyparts[key][MUTANT_INDEX_NAME]]
+ SA = GLOB.sprite_accessories[key][target_bodyparts[key][MUTANTPART_NAME]]
var/final_list = list()
final_list[MUTANT_INDEX_NAME] = SA.name
final_list[MUTANT_INDEX_COLOR_LIST] = SA.get_default_color(features, pref_species)
diff --git a/modular_skyrat/master_files/code/modules/client/preferences/middleware/languages.dm b/modular_skyrat/master_files/code/modules/client/preferences/middleware/languages.dm
index 22a0854e88d..d9412fd8066 100644
--- a/modular_skyrat/master_files/code/modules/client/preferences/middleware/languages.dm
+++ b/modular_skyrat/master_files/code/modules/client/preferences/middleware/languages.dm
@@ -65,7 +65,7 @@
var/list/data = list()
- var/max_languages = preferences.all_quirks.Find(QUIRK_LINGUIST) ? MAX_LANGUAGES_LINGUIST : MAX_LANGUAGES_NORMAL
+ var/max_languages = preferences.all_quirks.Find(TRAIT_LINGUIST) ? MAX_LANGUAGES_LINGUIST : MAX_LANGUAGES_NORMAL
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
var/datum/species/species = new species_type()
var/datum/language_holder/lang_holder = preferences.get_adjusted_language_holder()
@@ -125,7 +125,7 @@
*/
/datum/preference_middleware/languages/proc/give_language(list/params)
var/language_name = params["language_name"]
- var/max_languages = preferences.all_quirks.Find(QUIRK_LINGUIST) ? MAX_LANGUAGES_LINGUIST : MAX_LANGUAGES_NORMAL
+ var/max_languages = preferences.all_quirks.Find(TRAIT_LINGUIST) ? MAX_LANGUAGES_LINGUIST : MAX_LANGUAGES_NORMAL
if(preferences.languages && preferences.languages.len == max_languages) // too many languages
return TRUE
diff --git a/modular_skyrat/modules/ashwalkers/code/items/ash_seedmesh.dm b/modular_skyrat/modules/ashwalkers/code/items/ash_seedmesh.dm
index a0882c288a1..205e357313e 100644
--- a/modular_skyrat/modules/ashwalkers/code/items/ash_seedmesh.dm
+++ b/modular_skyrat/modules/ashwalkers/code/items/ash_seedmesh.dm
@@ -9,23 +9,26 @@
/obj/item/seed_mesh/attackby(obj/item/attacking_item, mob/user, params)
if(istype(attacking_item, /obj/item/stack/ore/glass))
- var/obj/item/stack/stack_item = attacking_item
+ var/obj/item/stack/ore/ore_item = attacking_item
+ if(ore_item.points == 0)
+ user.balloon_alert(user, "[ore_item] is worthless!")
+ return
- while(stack_item.amount >= 5)
+ while(ore_item.amount >= 5)
if(!do_after(user, 5 SECONDS, src))
user.balloon_alert(user, "have to stand still!")
return
- if(!stack_item.use(5))
- user.balloon_alert(user, "unable to use five of [stack_item]!")
+ if(!ore_item.use(5))
+ user.balloon_alert(user, "unable to use five of [ore_item]!")
return
if(prob(70))
- user.balloon_alert(user, "[stack_item] reveals nothing!")
+ user.balloon_alert(user, "[ore_item] reveals nothing!")
continue
var/spawn_seed = pick(subtypesof(/obj/item/seeds) - seeds_blacklist)
new spawn_seed(get_turf(src))
- user.balloon_alert(user, "[stack_item] revealed something!")
+ user.balloon_alert(user, "[ore_item] revealed something!")
return ..()
diff --git a/modular_skyrat/modules/better_vox/code/vox_species.dm b/modular_skyrat/modules/better_vox/code/vox_species.dm
index 8fdd3506cc0..a8c2d4c0e2e 100644
--- a/modular_skyrat/modules/better_vox/code/vox_species.dm
+++ b/modular_skyrat/modules/better_vox/code/vox_species.dm
@@ -49,7 +49,7 @@
/datum/species/vox_primalis/get_default_mutant_bodyparts()
return list(
- "tail" = list(MUTANT_INDEX_NAME = "Vox Primalis Tail", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "tail" = list("Vox Primalis Tail", FALSE),
)
/datum/species/vox_primalis/pre_equip_species_outfit(datum/job/job, mob/living/carbon/human/equipping, visuals_only)
diff --git a/modular_skyrat/modules/borgs/code/robot.dm b/modular_skyrat/modules/borgs/code/robot.dm
index 3de94b08d8c..8bddf039f4d 100644
--- a/modular_skyrat/modules/borgs/code/robot.dm
+++ b/modular_skyrat/modules/borgs/code/robot.dm
@@ -13,7 +13,7 @@
layer = LYING_MOB_LAYER //so mob lying always appear behind standing mobs
density = FALSE // We lose density and stop bumping passable dense things.
- if(model && model.model_features && (R_TRAIT_TALL in model.model_features))
+ if(model && model.model_features && (TRAIT_R_TALL in model.model_features))
maptext_height = 32 //Offset base chat-height value
// Resting effects
@@ -44,7 +44,7 @@
if(layer == LYING_MOB_LAYER)
layer = initial(layer)
density = initial(density) // We were prone before, so we become dense and things can bump into us again.
- if(model && model.model_features && (R_TRAIT_TALL in model.model_features))
+ if(model && model.model_features && (TRAIT_R_TALL in model.model_features))
maptext_height = 48 //Offset value of tallborgs
/mob/living/silicon/robot/proc/rest_style()
@@ -103,7 +103,7 @@
* model_features is defined in modular_skyrat\modules\altborgs\code\modules\mob\living\silicon\robot\robot_model.dm.
*/
/mob/living/silicon/robot/proc/can_rest()
- if(model && model.model_features && ((R_TRAIT_WIDE in model.model_features) || (R_TRAIT_TALL in model.model_features)))
+ if(model && model.model_features && ((TRAIT_R_WIDE in model.model_features) || (TRAIT_R_TALL in model.model_features)))
if(TRAIT_IMMOBILIZED in _status_traits)
return FALSE
return TRUE
diff --git a/modular_skyrat/modules/borgs/code/robot_items.dm b/modular_skyrat/modules/borgs/code/robot_items.dm
index 96a03b2e38d..1e04b3103ad 100644
--- a/modular_skyrat/modules/borgs/code/robot_items.dm
+++ b/modular_skyrat/modules/borgs/code/robot_items.dm
@@ -681,7 +681,7 @@
var/list/details = disguise_model.borg_skins[skin]
var/image/reskin = image(icon = details[SKIN_ICON] || 'icons/mob/silicon/robots.dmi', icon_state = details[SKIN_ICON_STATE])
if (!isnull(details[SKIN_FEATURES]))
- if (R_TRAIT_WIDE in details[SKIN_FEATURES])
+ if (TRAIT_R_WIDE in details[SKIN_FEATURES])
reskin.pixel_x -= 16
reskin_icons[skin] = reskin
var/borg_skin = show_radial_menu(cyborg, cyborg, reskin_icons, custom_check = CALLBACK(src, PROC_REF(check_menu), cyborg), radius = 38, require_near = TRUE)
diff --git a/modular_skyrat/modules/borgs/code/robot_model.dm b/modular_skyrat/modules/borgs/code/robot_model.dm
index ffdd2d5e684..8c94520ad0d 100644
--- a/modular_skyrat/modules/borgs/code/robot_model.dm
+++ b/modular_skyrat/modules/borgs/code/robot_model.dm
@@ -11,7 +11,7 @@
var/mob/living/silicon/robot/cyborg = robot || loc
if (!istype(robot))
return
- if (model_features && (R_TRAIT_TALL in model_features))
+ if (model_features && (TRAIT_R_TALL in model_features))
cyborg.maptext_height = 48 //Runechat blabla
cyborg.AddElement(/datum/element/footstep, FOOTSTEP_MOB_SHOE, 2, -6, sound_vary = TRUE)
add_verb(cyborg, /mob/living/silicon/robot/proc/robot_lay_down)
@@ -33,7 +33,7 @@
var/mob/living/silicon/robot/cyborg = robot || loc
if (!istype(robot))
return
- if (model_features && (R_TRAIT_WIDE in model_features))
+ if (model_features && (TRAIT_R_WIDE in model_features))
hat_offset = INFINITY
cyborg.set_base_pixel_x(-16)
add_verb(cyborg, /mob/living/silicon/robot/proc/robot_lay_down)
@@ -47,16 +47,16 @@
/obj/item/robot_model/standard
name = "Standard"
borg_skins = list(
- "Default" = list(SKIN_ICON_STATE = "robot", SKIN_FEATURES = list(R_TRAIT_SMALL)),
- "Marina" = list(SKIN_ICON_STATE = "marinasd", SKIN_ICON = CYBORG_ICON_STANDARD, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK)),
- "Heavy" = list(SKIN_ICON_STATE = "heavysd", SKIN_ICON = CYBORG_ICON_STANDARD, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK)),
- "Eyebot" = list(SKIN_ICON_STATE = "eyebotsd", SKIN_ICON = CYBORG_ICON_STANDARD, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL)),
- "Robot" = list(SKIN_ICON_STATE = "robot_old", SKIN_ICON = CYBORG_ICON_STANDARD, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK)),
+ "Default" = list(SKIN_ICON_STATE = "robot", SKIN_FEATURES = list(TRAIT_R_SMALL)),
+ "Marina" = list(SKIN_ICON_STATE = "marinasd", SKIN_ICON = CYBORG_ICON_STANDARD, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK)),
+ "Heavy" = list(SKIN_ICON_STATE = "heavysd", SKIN_ICON = CYBORG_ICON_STANDARD, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK)),
+ "Eyebot" = list(SKIN_ICON_STATE = "eyebotsd", SKIN_ICON = CYBORG_ICON_STANDARD, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_SMALL)),
+ "Robot" = list(SKIN_ICON_STATE = "robot_old", SKIN_ICON = CYBORG_ICON_STANDARD, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK)),
"Bootyborg" = list(SKIN_ICON_STATE = "bootysd", SKIN_ICON = CYBORG_ICON_STANDARD),
"Male Bootyborg" = list(SKIN_ICON_STATE = "male_bootysd", SKIN_ICON = CYBORG_ICON_STANDARD),
"Protectron" = list(SKIN_ICON_STATE = "protectron_standard", SKIN_ICON = CYBORG_ICON_STANDARD),
"Miss M" = list(SKIN_ICON_STATE = "missm_sd", SKIN_ICON = CYBORG_ICON_STANDARD),
- "Partyhound" = list(SKIN_ICON_STATE = "k69", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE))
+ "Partyhound" = list(SKIN_ICON_STATE = "k69", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE))
)
//SERVICE
@@ -72,7 +72,7 @@
"Heavy" = list(SKIN_ICON_STATE = "heavyserv", SKIN_ICON = CYBORG_ICON_SERVICE),
"Kent" = list(SKIN_ICON_STATE = "kent", SKIN_LIGHT_KEY = "medical", SKIN_HAT_OFFSET = 3),
"Can" = list(SKIN_ICON_STATE = "kent", SKIN_LIGHT_KEY = "medical", SKIN_HAT_OFFSET = 3),
- "Zoomba" = list(SKIN_ICON_STATE = "zoomba_green", SKIN_ICON = CYBORG_ICON_SERVICE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
+ "Zoomba" = list(SKIN_ICON_STATE = "zoomba_green", SKIN_ICON = CYBORG_ICON_SERVICE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_SMALL), SKIN_HAT_OFFSET = -13),
"ARACHNE" = list(SKIN_ICON_STATE = "arachne_service", SKIN_ICON = CYBORG_ICON_SERVICE),
"Slipper" = list(SKIN_ICON_STATE = "slipper_service", SKIN_ICON = CYBORG_ICON_SERVICE),
"Bootyborg" = list(SKIN_ICON_STATE = "bootyservice", SKIN_ICON = CYBORG_ICON_SERVICE),
@@ -83,20 +83,20 @@
"Mech" = list(SKIN_ICON_STATE = "lloyd", SKIN_ICON = CYBORG_ICON_SERVICE),
"Handy" = list(SKIN_ICON_STATE = "handy-service", SKIN_ICON = CYBORG_ICON_SERVICE),
/// 64x32 skins
- "Borgi" = list(SKIN_ICON_STATE = "borgi-serv", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE, R_TRAIT_SMALL)),
- "Drake" = list(SKIN_ICON_STATE = "drakeserv", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Vale" = list(SKIN_ICON_STATE = "valeserv", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "ValeDark" = list(SKIN_ICON_STATE = "valeservdark", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Darkhound" = list(SKIN_ICON_STATE = "k50", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Partyhound" = list(SKIN_ICON_STATE = "k69", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
+ "Borgi" = list(SKIN_ICON_STATE = "borgi-serv", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE, TRAIT_R_SMALL)),
+ "Drake" = list(SKIN_ICON_STATE = "drakeserv", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Vale" = list(SKIN_ICON_STATE = "valeserv", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "ValeDark" = list(SKIN_ICON_STATE = "valeservdark", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Darkhound" = list(SKIN_ICON_STATE = "k50", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Partyhound" = list(SKIN_ICON_STATE = "k69", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
/// 32x64 skins
- "Meka" = list(SKIN_ICON_STATE = "mekaserve", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "Meka (Alt)" = list(SKIN_ICON_STATE = "mekaserve_alt", SKIN_LIGHT_KEY = "mekaserve", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKA" = list(SKIN_ICON_STATE = "fmekaserv", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKO" = list(SKIN_ICON_STATE = "mmekaserv", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "K4T (Barista)" = list(SKIN_ICON_STATE = "k4tserve", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "K4T (80s)" = list(SKIN_ICON_STATE = "k4tserve_alt1", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "K4T (Dispenser)" = list(SKIN_ICON_STATE = "k4tserve_alt2", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
+ "Meka" = list(SKIN_ICON_STATE = "mekaserve", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "Meka (Alt)" = list(SKIN_ICON_STATE = "mekaserve_alt", SKIN_LIGHT_KEY = "mekaserve", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKA" = list(SKIN_ICON_STATE = "fmekaserv", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKO" = list(SKIN_ICON_STATE = "mmekaserv", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "K4T (Barista)" = list(SKIN_ICON_STATE = "k4tserve", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "K4T (80s)" = list(SKIN_ICON_STATE = "k4tserve_alt1", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "K4T (Dispenser)" = list(SKIN_ICON_STATE = "k4tserve_alt2", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15)
)
//MINING
@@ -106,8 +106,8 @@
/// 32x32 Skins
"Lavaland" = list(SKIN_ICON_STATE = "miner", SKIN_LIGHT_KEY = "miner"),
"Asteroid" = list(SKIN_ICON_STATE = "minerOLD", SKIN_LIGHT_KEY = "miner"),
- "Drone" = list(SKIN_ICON_STATE = "miningdrone", SKIN_ICON = CYBORG_ICON_MINING, SKIN_FEATURES = list(R_TRAIT_SMALL)),
- "Zoomba" = list(SKIN_ICON_STATE = "zoomba_miner", SKIN_ICON = CYBORG_ICON_MINING, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
+ "Drone" = list(SKIN_ICON_STATE = "miningdrone", SKIN_ICON = CYBORG_ICON_MINING, SKIN_FEATURES = list(TRAIT_R_SMALL)),
+ "Zoomba" = list(SKIN_ICON_STATE = "zoomba_miner", SKIN_ICON = CYBORG_ICON_MINING, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_SMALL), SKIN_HAT_OFFSET = -13),
"Slipper" = list(SKIN_ICON_STATE = "slipper_mine", SKIN_ICON = CYBORG_ICON_MINING),
"Spider Miner" = list(SKIN_ICON_STATE = "spidermin", SKIN_LIGHT_KEY = "miner"),
"Droid" = list(SKIN_ICON_STATE = "miner", SKIN_ICON = CYBORG_ICON_MINING, SKIN_HAT_OFFSET = 4),
@@ -123,18 +123,18 @@
"Miss M" = list(SKIN_ICON_STATE = "missm_miner", SKIN_ICON = CYBORG_ICON_MINING),
"Mech" = list(SKIN_ICON_STATE = "ishimura", SKIN_ICON = CYBORG_ICON_MINING),
/// 64x32 skins
- "Blade" = list(SKIN_ICON_STATE = "blade", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Vale" = list(SKIN_ICON_STATE = "valemine", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Drake" = list(SKIN_ICON_STATE = "drakemine", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Hound" = list(SKIN_ICON_STATE = "cargohound", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Darkhound" = list(SKIN_ICON_STATE = "cargohounddark", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Otie" = list(SKIN_ICON_STATE = "otiec", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
+ "Blade" = list(SKIN_ICON_STATE = "blade", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Vale" = list(SKIN_ICON_STATE = "valemine", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Drake" = list(SKIN_ICON_STATE = "drakemine", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Hound" = list(SKIN_ICON_STATE = "cargohound", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Darkhound" = list(SKIN_ICON_STATE = "cargohounddark", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Otie" = list(SKIN_ICON_STATE = "otiec", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
/// 32x64 skins
- "Meka" = list(SKIN_ICON_STATE = "mekamine", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "K4T (Rookie)" = list(SKIN_ICON_STATE = "k4tmine", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "K4T (Veteran)" = list(SKIN_ICON_STATE = "k4tmine_alt1", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKA" = list(SKIN_ICON_STATE = "fmekamine", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKO" = list(SKIN_ICON_STATE = "mmekamine", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
+ "Meka" = list(SKIN_ICON_STATE = "mekamine", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "K4T (Rookie)" = list(SKIN_ICON_STATE = "k4tmine", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "K4T (Veteran)" = list(SKIN_ICON_STATE = "k4tmine_alt1", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKA" = list(SKIN_ICON_STATE = "fmekamine", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKO" = list(SKIN_ICON_STATE = "mmekamine", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15)
)
//CLOWN
@@ -145,22 +145,22 @@
"Male Bootyborg" = list(SKIN_ICON_STATE = "male_bootyclown", SKIN_ICON = 'modular_skyrat/modules/borgs/icons/robots_clown.dmi'),
"ARACHNE" = list(SKIN_ICON_STATE = "arachne_clown", SKIN_ICON = 'modular_skyrat/modules/borgs/icons/robots_clown.dmi'),
"Slipper" = list(SKIN_ICON_STATE = "slipper_clown", SKIN_ICON = 'modular_skyrat/modules/borgs/icons/robots_clown.dmi'),
- "Marina" = list(SKIN_ICON_STATE = "marina_mommy", SKIN_ICON = 'modular_skyrat/modules/borgs/icons/robots_clown.dmi', SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK)),
+ "Marina" = list(SKIN_ICON_STATE = "marina_mommy", SKIN_ICON = 'modular_skyrat/modules/borgs/icons/robots_clown.dmi', SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK)),
"Garish" = list(SKIN_ICON_STATE = "garish", SKIN_ICON = 'modular_skyrat/modules/borgs/icons/robots_clown.dmi'),
"Robot" = list(SKIN_ICON_STATE = "clownbot", SKIN_ICON = 'modular_skyrat/modules/borgs/icons/robots_clown.dmi'),
- "Sleek" = list(SKIN_ICON_STATE = "clownman", SKIN_ICON = 'modular_skyrat/modules/borgs/icons/robots_clown.dmi', SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK)),
+ "Sleek" = list(SKIN_ICON_STATE = "clownman", SKIN_ICON = 'modular_skyrat/modules/borgs/icons/robots_clown.dmi', SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK)),
/// 32x64 skins
- "K4T" = list(SKIN_ICON_STATE = "k4tclown", SKIN_ICON = CYBORG_ICON_CLOWN_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
+ "K4T" = list(SKIN_ICON_STATE = "k4tclown", SKIN_ICON = CYBORG_ICON_CLOWN_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15)
)
//ENGINEERING
/obj/item/robot_model/engineering
borg_skins = list(
/// 32x32 Skins
- "Default" = list(SKIN_ICON_STATE = "engineer", SKIN_FEATURES = list(R_TRAIT_SMALL)),
- "Zoomba" = list(SKIN_ICON_STATE = "zoomba_engi", SKIN_ICON = CYBORG_ICON_ENG, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
+ "Default" = list(SKIN_ICON_STATE = "engineer", SKIN_FEATURES = list(TRAIT_R_SMALL)),
+ "Zoomba" = list(SKIN_ICON_STATE = "zoomba_engi", SKIN_ICON = CYBORG_ICON_ENG, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_SMALL), SKIN_HAT_OFFSET = -13),
"Default - Treads" = list(SKIN_ICON_STATE = "engi-tread", SKIN_LIGHT_KEY = "engineer", SKIN_ICON = CYBORG_ICON_ENG),
- "Loader" = list(SKIN_ICON_STATE = "loaderborg", SKIN_ICON = CYBORG_ICON_ENG, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK)),
+ "Loader" = list(SKIN_ICON_STATE = "loaderborg", SKIN_ICON = CYBORG_ICON_ENG, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK)),
"Handy" = list(SKIN_ICON_STATE = "handyeng", SKIN_ICON = CYBORG_ICON_ENG),
"Sleek" = list(SKIN_ICON_STATE = "sleekeng", SKIN_ICON = CYBORG_ICON_ENG),
"Can" = list(SKIN_ICON_STATE = "caneng", SKIN_ICON = CYBORG_ICON_ENG),
@@ -176,22 +176,22 @@
"Wide" = list(SKIN_ICON_STATE = "wide-engi", SKIN_ICON = CYBORG_ICON_ENG),
"ARACHNE" = list(SKIN_ICON_STATE = "arachne_engi", SKIN_ICON = CYBORG_ICON_ENG),
"Slipper" = list(SKIN_ICON_STATE = "slipper_engi", SKIN_ICON = CYBORG_ICON_ENG),
- "Alina" = list(SKIN_ICON_STATE = "alina-eng", SKIN_LIGHT_KEY = "alina", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Eyebot" = list(SKIN_ICON_STATE = "eyeboteng", SKIN_ICON = CYBORG_ICON_ENG, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL)),
+ "Alina" = list(SKIN_ICON_STATE = "alina-eng", SKIN_LIGHT_KEY = "alina", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Eyebot" = list(SKIN_ICON_STATE = "eyeboteng", SKIN_ICON = CYBORG_ICON_ENG, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_SMALL)),
/// 64x32 Skins
- "Borgi" = list(SKIN_ICON_STATE = "borgi-eng", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE, R_TRAIT_SMALL)),
- "Otie" = list(SKIN_ICON_STATE = "otiee", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Pup Dozer" = list(SKIN_ICON_STATE = "pupdozer", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Vale" = list(SKIN_ICON_STATE = "valeeng", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Hound" = list(SKIN_ICON_STATE = "engihound", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Darkhound" = list(SKIN_ICON_STATE = "engihounddark", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Drake" = list(SKIN_ICON_STATE = "drakeeng", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
+ "Borgi" = list(SKIN_ICON_STATE = "borgi-eng", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE, TRAIT_R_SMALL)),
+ "Otie" = list(SKIN_ICON_STATE = "otiee", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Pup Dozer" = list(SKIN_ICON_STATE = "pupdozer", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Vale" = list(SKIN_ICON_STATE = "valeeng", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Hound" = list(SKIN_ICON_STATE = "engihound", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Darkhound" = list(SKIN_ICON_STATE = "engihounddark", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Drake" = list(SKIN_ICON_STATE = "drakeeng", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
/// 32x64 Skins
- "Meka" = list(SKIN_ICON_STATE = "mekaengi", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "K4T (Technician)" = list(SKIN_ICON_STATE = "k4tengi", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "K4T (Hazard)" = list(SKIN_ICON_STATE = "k4tengi_alt1", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKA" = list(SKIN_ICON_STATE = "fmekaeng", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKO" = list(SKIN_ICON_STATE = "mmekaeng", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
+ "Meka" = list(SKIN_ICON_STATE = "mekaengi", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "K4T (Technician)" = list(SKIN_ICON_STATE = "k4tengi", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "K4T (Hazard)" = list(SKIN_ICON_STATE = "k4tengi_alt1", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKA" = list(SKIN_ICON_STATE = "fmekaeng", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKO" = list(SKIN_ICON_STATE = "mmekaeng", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15)
)
/obj/item/robot_model/janitor
@@ -200,7 +200,7 @@
"Default" = list(SKIN_ICON_STATE = "janitor"),
"ARACHNE" = list(SKIN_ICON_STATE = "arachne_jani", SKIN_ICON = CYBORG_ICON_JANI),
"Slipper" = list(SKIN_ICON_STATE = "slipper_janitor", SKIN_ICON = CYBORG_ICON_JANI),
- "Zoomba" = list(SKIN_ICON_STATE = "zoomba_jani", SKIN_ICON = CYBORG_ICON_JANI, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
+ "Zoomba" = list(SKIN_ICON_STATE = "zoomba_jani", SKIN_ICON = CYBORG_ICON_JANI, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_SMALL), SKIN_HAT_OFFSET = -13),
"Marina" = list(SKIN_ICON_STATE = "marinajan", SKIN_ICON = CYBORG_ICON_JANI),
"Sleek" = list(SKIN_ICON_STATE = "sleekjan", SKIN_ICON = CYBORG_ICON_JANI),
"Can" = list(SKIN_ICON_STATE = "canjan", SKIN_ICON = CYBORG_ICON_JANI),
@@ -211,37 +211,37 @@
"Protectron" = list(SKIN_ICON_STATE = "protectron_janitor", SKIN_ICON = CYBORG_ICON_JANI),
"Miss M" = list(SKIN_ICON_STATE = "missm_janitor", SKIN_ICON = CYBORG_ICON_JANI),
"Mech" = list(SKIN_ICON_STATE = "flynn", SKIN_ICON = CYBORG_ICON_JANI),
- "Eyebot" = list(SKIN_ICON_STATE = "eyebotjani", SKIN_ICON = CYBORG_ICON_JANI, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL)),
+ "Eyebot" = list(SKIN_ICON_STATE = "eyebotjani", SKIN_ICON = CYBORG_ICON_JANI, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_SMALL)),
"Insekt" = list(SKIN_ICON_STATE = "insekt-Sci", SKIN_ICON = CYBORG_ICON_JANI),
"Wide" = list(SKIN_ICON_STATE = "wide-jani", SKIN_ICON = CYBORG_ICON_JANI),
"Spider" = list(SKIN_ICON_STATE = "spidersci", SKIN_ICON = CYBORG_ICON_JANI),
/// 64x32 Skins
- "Borgi" = list(SKIN_ICON_STATE = "borgi-jani", SKIN_ICON = CYBORG_ICON_JANI_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE, R_TRAIT_SMALL)),
- "Scrubpuppy" = list(SKIN_ICON_STATE = "scrubpup", SKIN_ICON = CYBORG_ICON_JANI_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Drake" = list(SKIN_ICON_STATE = "drakejanit", SKIN_ICON = CYBORG_ICON_JANI_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Vale" = list(SKIN_ICON_STATE = "J9", SKIN_ICON = CYBORG_ICON_JANI_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Otie" = list(SKIN_ICON_STATE = "otiej", SKIN_ICON = CYBORG_ICON_JANI_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
+ "Borgi" = list(SKIN_ICON_STATE = "borgi-jani", SKIN_ICON = CYBORG_ICON_JANI_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE, TRAIT_R_SMALL)),
+ "Scrubpuppy" = list(SKIN_ICON_STATE = "scrubpup", SKIN_ICON = CYBORG_ICON_JANI_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Drake" = list(SKIN_ICON_STATE = "drakejanit", SKIN_ICON = CYBORG_ICON_JANI_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Vale" = list(SKIN_ICON_STATE = "J9", SKIN_ICON = CYBORG_ICON_JANI_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Otie" = list(SKIN_ICON_STATE = "otiej", SKIN_ICON = CYBORG_ICON_JANI_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
/// 32x64 Skins
- "Meka" = list(SKIN_ICON_STATE = "mekajani", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "K4T (Viscera)" = list(SKIN_ICON_STATE = "k4tjani", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "K4T (Domestic)" = list(SKIN_ICON_STATE = "k4tjani_alt1", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKA" = list(SKIN_ICON_STATE = "fmekajani", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKO" = list(SKIN_ICON_STATE = "mmekajani", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
+ "Meka" = list(SKIN_ICON_STATE = "mekajani", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "K4T (Viscera)" = list(SKIN_ICON_STATE = "k4tjani", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "K4T (Domestic)" = list(SKIN_ICON_STATE = "k4tjani_alt1", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKA" = list(SKIN_ICON_STATE = "fmekajani", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKO" = list(SKIN_ICON_STATE = "mmekajani", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15)
)
//MEDICAL
/obj/item/robot_model/medical
borg_skins = list(
/// 32x32 Skins
- "Machinified Doctor" = list(SKIN_ICON_STATE = "medical", SKIN_TRAITS = list(R_TRAIT_SMALL)),
+ "Machinified Doctor" = list(SKIN_ICON_STATE = "medical", SKIN_TRAITS = list(TRAIT_R_SMALL)),
"Qualified Doctor" = list(SKIN_ICON_STATE = "qualified_doctor"),
"ARACHNE" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "arachne_med"),
"Slipper" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "slipper_med"),
- "Zoomba" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "zoomba_med", SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
+ "Zoomba" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "zoomba_med", SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_SMALL), SKIN_HAT_OFFSET = -13),
"Droid" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "medical", SKIN_HAT_OFFSET = 4),
"Sleek" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "sleekmed"),
"Marina" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "marinamed"),
- "Eyebot" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "eyebotmed", SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL)),
+ "Eyebot" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "eyebotmed", SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_SMALL)),
"Heavy" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "heavymed"),
"Bootyborg" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "bootymedical"),
"Birdborg" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "bird_med"),
@@ -251,18 +251,18 @@
"Insekt" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "insekt-Med"),
"Mech" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "gibbs"),
/// 64x32 Skins
- "Borgi" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "borgi-medi", SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Drake" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "drakemed", SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Hound" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "medihound", SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "DarkHound" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "medihounddark", SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Vale" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "valemed", SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Alina" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "alina-med", SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
+ "Borgi" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "borgi-medi", SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Drake" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "drakemed", SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Hound" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "medihound", SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "DarkHound" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "medihounddark", SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Vale" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "valemed", SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Alina" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "alina-med", SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
/// 32x64 Skins
- "Meka" = list(SKIN_ICON_STATE = "mekamed", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "K4T (Doc)" = list(SKIN_ICON_STATE = "k4tmed", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "K4T (Field Medic)" = list(SKIN_ICON_STATE = "k4tmed_alt1", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKA" = list(SKIN_ICON_STATE = "fmekamed", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKO" = list(SKIN_ICON_STATE = "mmekamed", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
+ "Meka" = list(SKIN_ICON_STATE = "mekamed", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "K4T (Doc)" = list(SKIN_ICON_STATE = "k4tmed", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "K4T (Field Medic)" = list(SKIN_ICON_STATE = "k4tmed_alt1", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKA" = list(SKIN_ICON_STATE = "fmekamed", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKO" = list(SKIN_ICON_STATE = "mmekamed", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15)
)
//PEACEKEEPER
@@ -270,33 +270,33 @@
borg_skins = list(
/// 32x32 Skins
"Default" = list(SKIN_ICON_STATE = "peace"),
- "Zoomba" = list(SKIN_ICON_STATE = "zoomba_peace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
+ "Zoomba" = list(SKIN_ICON_STATE = "zoomba_peace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_SMALL), SKIN_HAT_OFFSET = -13),
"ARACHNE" = list(SKIN_ICON_STATE = "arachne_peacekeeper", SKIN_ICON = CYBORG_ICON_PEACEKEEPER),
- "Sleek" = list(SKIN_ICON_STATE = "sleekpeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK)),
- "Spider" = list(SKIN_ICON_STATE = "whitespider", SKIN_ICON = CYBORG_ICON_PEACEKEEPER, SKIN_FEATURES = list(R_TRAIT_SMALL)),
- "Marina" = list(SKIN_ICON_STATE = "marinapeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK)),
+ "Sleek" = list(SKIN_ICON_STATE = "sleekpeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK)),
+ "Spider" = list(SKIN_ICON_STATE = "whitespider", SKIN_ICON = CYBORG_ICON_PEACEKEEPER, SKIN_FEATURES = list(TRAIT_R_SMALL)),
+ "Marina" = list(SKIN_ICON_STATE = "marinapeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK)),
"Bootyborg" = list(SKIN_ICON_STATE = "bootypeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER),
"Male Bootyborg" = list(SKIN_ICON_STATE = "male_bootypeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER),
"Birdborg" = list(SKIN_ICON_STATE = "bird_pk", SKIN_ICON = CYBORG_ICON_PEACEKEEPER),
"Protectron" = list(SKIN_ICON_STATE = "protectron_peacekeeper", SKIN_ICON = CYBORG_ICON_PEACEKEEPER),
"Insekt" = list(SKIN_ICON_STATE = "insekt-Default", SKIN_ICON = CYBORG_ICON_PEACEKEEPER),
- "Omni" = list(SKIN_ICON_STATE = "omoikane", SKIN_ICON = CYBORG_ICON_PEACEKEEPER, SKIN_FEATURES = list(R_TRAIT_SMALL)),
+ "Omni" = list(SKIN_ICON_STATE = "omoikane", SKIN_ICON = CYBORG_ICON_PEACEKEEPER, SKIN_FEATURES = list(TRAIT_R_SMALL)),
/// 64x32 Skins
- "Drake" = list(SKIN_ICON_STATE = "drakepeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Borgi" = list(SKIN_ICON_STATE = "borgi", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE, R_TRAIT_SMALL)),
- "Vale" = list(SKIN_ICON_STATE = "valepeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
+ "Drake" = list(SKIN_ICON_STATE = "drakepeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Borgi" = list(SKIN_ICON_STATE = "borgi", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE, TRAIT_R_SMALL)),
+ "Vale" = list(SKIN_ICON_STATE = "valepeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
/// 32x64 Skins
- "Meka" = list(SKIN_ICON_STATE = "mekapeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "K4T" = list(SKIN_ICON_STATE = "k4tpeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKA" = list(SKIN_ICON_STATE = "fmekapeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKO" = list(SKIN_ICON_STATE = "mmekapeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
+ "Meka" = list(SKIN_ICON_STATE = "mekapeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "K4T" = list(SKIN_ICON_STATE = "k4tpeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKA" = list(SKIN_ICON_STATE = "fmekapeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKO" = list(SKIN_ICON_STATE = "mmekapeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15)
)
/obj/item/robot_model/security
borg_skins = list(
/// 32x32 Skins
"Default" = list(SKIN_ICON_STATE = "sec"),
- "Zoomba" = list(SKIN_ICON_STATE = "zoomba_sec", SKIN_ICON = CYBORG_ICON_SEC, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
+ "Zoomba" = list(SKIN_ICON_STATE = "zoomba_sec", SKIN_ICON = CYBORG_ICON_SEC, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_SMALL), SKIN_HAT_OFFSET = -13),
"Default - Treads" = list(SKIN_ICON_STATE = "sec-tread", SKIN_LIGHT_KEY = "sec", SKIN_ICON = CYBORG_ICON_SEC),
"Sleek" = list(SKIN_ICON_STATE = "sleeksec", SKIN_ICON = CYBORG_ICON_SEC),
"Marina" = list(SKIN_ICON_STATE = "marinasec", SKIN_ICON = CYBORG_ICON_SEC),
@@ -307,22 +307,22 @@
"Male Bootyborg" = list(SKIN_ICON_STATE = "male_bootysecurity", SKIN_ICON = CYBORG_ICON_SEC),
"Protectron" = list(SKIN_ICON_STATE = "protectron_security", SKIN_ICON = CYBORG_ICON_SEC),
"Miss M" = list(SKIN_ICON_STATE = "missm_security", SKIN_ICON = CYBORG_ICON_SEC),
- "Eyebot" = list(SKIN_ICON_STATE = "eyebotsec", SKIN_ICON = CYBORG_ICON_SEC, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL)),
+ "Eyebot" = list(SKIN_ICON_STATE = "eyebotsec", SKIN_ICON = CYBORG_ICON_SEC, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_SMALL)),
"Insekt" = list(SKIN_ICON_STATE = "insekt-Sec", SKIN_ICON = CYBORG_ICON_SEC),
"Mech" = list(SKIN_ICON_STATE = "woody", SKIN_ICON = CYBORG_ICON_SEC),
/// 64x32 Skins
- "Borgi" = list(SKIN_ICON_STATE = "borgi-sec", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE, R_TRAIT_SMALL)),
- "Hound" = list(SKIN_ICON_STATE = "k9", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Darkhound" = list(SKIN_ICON_STATE = "k9dark", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Drake" = list(SKIN_ICON_STATE = "drakesec", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Otie" = list(SKIN_ICON_STATE = "oties", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Alina" = list(SKIN_ICON_STATE = "alina-sec", SKIN_LIGHT_KEY = "alina", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Vale" = list(SKIN_ICON_STATE = "valesec", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
+ "Borgi" = list(SKIN_ICON_STATE = "borgi-sec", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE, TRAIT_R_SMALL)),
+ "Hound" = list(SKIN_ICON_STATE = "k9", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Darkhound" = list(SKIN_ICON_STATE = "k9dark", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Drake" = list(SKIN_ICON_STATE = "drakesec", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Otie" = list(SKIN_ICON_STATE = "oties", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Alina" = list(SKIN_ICON_STATE = "alina-sec", SKIN_LIGHT_KEY = "alina", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Vale" = list(SKIN_ICON_STATE = "valesec", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
/// 32x64 Skins
- "Meka" = list(SKIN_ICON_STATE = "mekasec", SKIN_ICON = CYBORG_ICON_SEC_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "K4T" = list(SKIN_ICON_STATE = "k4tsec", SKIN_ICON = CYBORG_ICON_SEC_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKA" = list(SKIN_ICON_STATE = "fmekasec", SKIN_ICON = CYBORG_ICON_SEC_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKO" = list(SKIN_ICON_STATE = "mmekasec", SKIN_ICON = CYBORG_ICON_SEC_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
+ "Meka" = list(SKIN_ICON_STATE = "mekasec", SKIN_ICON = CYBORG_ICON_SEC_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "K4T" = list(SKIN_ICON_STATE = "k4tsec", SKIN_ICON = CYBORG_ICON_SEC_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKA" = list(SKIN_ICON_STATE = "fmekasec", SKIN_ICON = CYBORG_ICON_SEC_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKO" = list(SKIN_ICON_STATE = "mmekasec", SKIN_ICON = CYBORG_ICON_SEC_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15)
)
// CARGO
@@ -358,20 +358,20 @@
/// 32x32 Skins
"Technician" = list(SKIN_ICON_STATE = "cargoborg", SKIN_ICON = CYBORG_ICON_CARGO),
"Miss M" = list(SKIN_ICON_STATE = "missm_cargo", SKIN_ICON = CYBORG_ICON_CARGO),
- "Zoomba" = list(SKIN_ICON_STATE = "zoomba_cargo", SKIN_ICON = CYBORG_ICON_CARGO, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
+ "Zoomba" = list(SKIN_ICON_STATE = "zoomba_cargo", SKIN_ICON = CYBORG_ICON_CARGO, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_SMALL), SKIN_HAT_OFFSET = -13),
"Birdborg" = list(SKIN_ICON_STATE = "bird_cargo", SKIN_ICON = CYBORG_ICON_CARGO),
/// 64x32 Skins
- "Borgi" = list(SKIN_ICON_STATE = "borgi-cargo", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE, R_TRAIT_SMALL)),
- "Drake" = list(SKIN_ICON_STATE = "drakecargo", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Hound" = list(SKIN_ICON_STATE = "cargohound", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Darkhound" = list(SKIN_ICON_STATE = "cargohounddark", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
- "Vale" = list(SKIN_ICON_STATE = "valecargo", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
+ "Borgi" = list(SKIN_ICON_STATE = "borgi-cargo", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE, TRAIT_R_SMALL)),
+ "Drake" = list(SKIN_ICON_STATE = "drakecargo", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Hound" = list(SKIN_ICON_STATE = "cargohound", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Darkhound" = list(SKIN_ICON_STATE = "cargohounddark", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
+ "Vale" = list(SKIN_ICON_STATE = "valecargo", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE)),
/// 32x64 Skins
- "Meka" = list(SKIN_ICON_STATE = "mekacargo", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "K4T (Loader)" = list(SKIN_ICON_STATE = "k4tcargo", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "K4T (Turtleneck)" = list(SKIN_ICON_STATE = "k4tcargo_alt1", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKA" = list(SKIN_ICON_STATE = "fmekacargo", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKO" = list(SKIN_ICON_STATE = "mmekacargo", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
+ "Meka" = list(SKIN_ICON_STATE = "mekacargo", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "K4T (Loader)" = list(SKIN_ICON_STATE = "k4tcargo", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "K4T (Turtleneck)" = list(SKIN_ICON_STATE = "k4tcargo_alt1", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKA" = list(SKIN_ICON_STATE = "fmekacargo", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKO" = list(SKIN_ICON_STATE = "mmekacargo", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15)
)
@@ -430,10 +430,10 @@
"Male Booty Syndicate" = list(SKIN_ICON_STATE = "male_bootysyndie", SKIN_ICON = CYBORG_ICON_SYNDIE),
"Mech" = list(SKIN_ICON_STATE = "chesty", SKIN_ICON = CYBORG_ICON_SYNDIE),
/// 32x64 Skins
- "Meka" = list(SKIN_ICON_STATE = "mekasyndi", SKIN_ICON = CYBORG_ICON_SYNDIE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "K4T" = list(SKIN_ICON_STATE = "k4tsyndi", SKIN_ICON = CYBORG_ICON_SYNDIE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKA" = list(SKIN_ICON_STATE = "fmekasyndi", SKIN_ICON = CYBORG_ICON_SYNDIE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKO" = list(SKIN_ICON_STATE = "mmekasyndi", SKIN_ICON = CYBORG_ICON_SYNDIE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
+ "Meka" = list(SKIN_ICON_STATE = "mekasyndi", SKIN_ICON = CYBORG_ICON_SYNDIE_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "K4T" = list(SKIN_ICON_STATE = "k4tsyndi", SKIN_ICON = CYBORG_ICON_SYNDIE_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKA" = list(SKIN_ICON_STATE = "fmekasyndi", SKIN_ICON = CYBORG_ICON_SYNDIE_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKO" = list(SKIN_ICON_STATE = "mmekasyndi", SKIN_ICON = CYBORG_ICON_SYNDIE_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15)
)
/obj/item/robot_model/syndicatejack/rebuild_modules()
@@ -475,10 +475,10 @@
"BootyBorg" = list(SKIN_ICON_STATE = "bootyninja", SKIN_ICON = CYBORG_ICON_NINJA),
"Male Bootyborg" = list(SKIN_ICON_STATE = "male_bootyninja", SKIN_ICON = CYBORG_ICON_NINJA),
/// 32x64 Skins
- "Meka" = list(SKIN_ICON_STATE = "mekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "K4T" = list(SKIN_ICON_STATE = "k4tninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKA" = list(SKIN_ICON_STATE = "fmekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKO" = list(SKIN_ICON_STATE = "mmekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
+ "Meka" = list(SKIN_ICON_STATE = "mekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "K4T" = list(SKIN_ICON_STATE = "k4tninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKA" = list(SKIN_ICON_STATE = "fmekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKO" = list(SKIN_ICON_STATE = "mmekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15)
)
/obj/item/robot_model/ninja/rebuild_modules()
@@ -559,10 +559,10 @@
"BootyBorg" = list(SKIN_ICON_STATE = "bootyninja", SKIN_ICON = CYBORG_ICON_NINJA),
"Male Bootyborg" = list(SKIN_ICON_STATE = "male_bootyninja", SKIN_ICON = CYBORG_ICON_NINJA),
/// 32x64 Skins
- "Meka" = list(SKIN_ICON_STATE = "mekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "K4T" = list(SKIN_ICON_STATE = "k4tninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKA" = list(SKIN_ICON_STATE = "fmekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
- "NiKO" = list(SKIN_ICON_STATE = "mmekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
+ "Meka" = list(SKIN_ICON_STATE = "mekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "K4T" = list(SKIN_ICON_STATE = "k4tninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKA" = list(SKIN_ICON_STATE = "fmekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15),
+ "NiKO" = list(SKIN_ICON_STATE = "mmekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15)
)
/obj/item/robot_model/ninja_saboteur/do_transform_animation()
diff --git a/modular_skyrat/modules/borgs/code/robot_upgrade.dm b/modular_skyrat/modules/borgs/code/robot_upgrade.dm
index 2d0cb42c6c2..23e0c11758d 100644
--- a/modular_skyrat/modules/borgs/code/robot_upgrade.dm
+++ b/modular_skyrat/modules/borgs/code/robot_upgrade.dm
@@ -315,7 +315,7 @@
if(borg.hasAffection)
to_chat(usr, span_warning("This unit already has a affection module installed!"))
return FALSE
- if(!(R_TRAIT_WIDE in borg.model.model_features))
+ if(!(TRAIT_R_WIDE in borg.model.model_features))
to_chat(usr, span_warning("This unit's chassis does not support this module."))
return FALSE
@@ -396,7 +396,7 @@
if(borg.hasShrunk)
to_chat(usr, span_warning("This unit already has a shrink module installed!"))
return FALSE
- if(R_TRAIT_SMALL in borg.model.model_features)
+ if(TRAIT_R_SMALL in borg.model.model_features)
to_chat(usr, span_warning("This unit's chassis cannot be shrunk any further."))
return FALSE
diff --git a/modular_skyrat/modules/borgs/code/update_icons.dm b/modular_skyrat/modules/borgs/code/update_icons.dm
index a9c3ffefb04..dc982cbdabe 100644
--- a/modular_skyrat/modules/borgs/code/update_icons.dm
+++ b/modular_skyrat/modules/borgs/code/update_icons.dm
@@ -2,7 +2,7 @@
icon = (model.cyborg_icon_override ? model.cyborg_icon_override : initial(icon))
. = ..()
/// Let's give custom borgs the ability to have flavor panels for their model
- if(opened && (R_TRAIT_UNIQUEPANEL in model.model_features))
+ if(opened && (TRAIT_R_UNIQUEPANEL in model.model_features))
if(wiresexposed)
add_overlay("[model.cyborg_base_icon]_w")
else if(cell)
@@ -52,13 +52,13 @@
else
icon_state = "[model.cyborg_base_icon]"
- if((R_TRAIT_UNIQUETIP in model.model_features) && (TRAIT_IMMOBILIZED in _status_traits))
+ if((TRAIT_R_UNIQUETIP in model.model_features) && (TRAIT_IMMOBILIZED in _status_traits))
icon_state = "[model.cyborg_base_icon]-tipped"
if(particles)
dissipate()
cut_overlays()
- if(stat == DEAD && (R_TRAIT_UNIQUEWRECK in model.model_features))
+ if(stat == DEAD && (TRAIT_R_UNIQUEWRECK in model.model_features))
icon_state = "[model.cyborg_base_icon]-wreck"
diff --git a/modular_skyrat/modules/customization/__HELPERS/global_lists.dm b/modular_skyrat/modules/customization/__HELPERS/global_lists.dm
index cc2c6c9e3e8..d203c1ea805 100644
--- a/modular_skyrat/modules/customization/__HELPERS/global_lists.dm
+++ b/modular_skyrat/modules/customization/__HELPERS/global_lists.dm
@@ -40,7 +40,7 @@
GLOB.default_mutant_bodyparts[species_instance.name] = species_instance.get_default_mutant_bodyparts()
if(species_instance.can_have_genitals)
for(var/genital in GLOB.possible_genitals)
- GLOB.default_mutant_bodyparts[species_instance.name] += list((genital) = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE))
+ GLOB.default_mutant_bodyparts[species_instance.name] += list((genital) = list("None", FALSE))
qdel(species_instance)
/proc/make_body_marking_references()
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm
index 08d83bd7313..9568aec0bd0 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm
@@ -45,8 +45,8 @@ GLOBAL_LIST_EMPTY(customizable_races)
/datum/species/human/felinid/get_default_mutant_bodyparts()
return list(
- "tail" = list(MUTANT_INDEX_NAME = "Cat", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "ears" = list(MUTANT_INDEX_NAME = "Cat", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "tail" = list("Cat", FALSE),
+ "ears" = list("Cat", FALSE),
)
/datum/species/human
@@ -54,9 +54,9 @@ GLOBAL_LIST_EMPTY(customizable_races)
/datum/species/human/get_default_mutant_bodyparts()
return list(
- "ears" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "tail" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "wings" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "ears" = list("None", FALSE),
+ "tail" = list("None", FALSE),
+ "wings" = list("None", FALSE),
)
/datum/species/mush
@@ -105,10 +105,10 @@ GLOBAL_LIST_EMPTY(customizable_races)
if(LAZYLEN(existing_mutant_bodyparts) && existing_mutant_bodyparts[key])
continue
var/datum/sprite_accessory/SP
- if(default_bodypart_data[key][MUTANT_INDEX_CAN_RANDOMIZE])
+ if(default_bodypart_data[key][MUTANTPART_CAN_RANDOMIZE])
SP = random_accessory_of_key_for_species(key, src)
else
- SP = GLOB.sprite_accessories[key][bodyparts_to_add[key][MUTANT_INDEX_NAME]]
+ SP = GLOB.sprite_accessories[key][bodyparts_to_add[key][MUTANTPART_NAME]]
if(!SP)
CRASH("Cant find accessory of [key] key, [bodyparts_to_add[key]] name, for species [id]")
var/list/color_list = SP.get_default_color(features, src)
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm
index 95733d3df2b..7a9181b75a9 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm
@@ -45,8 +45,8 @@
/datum/species/akula/get_default_mutant_bodyparts()
return list(
- "tail" = list(MUTANT_INDEX_NAME = "Akula", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "legs" = list(MUTANT_INDEX_NAME = "Normal Legs", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "tail" = list("Akula", TRUE),
+ "legs" = list("Normal Legs", FALSE),
)
/datum/species/akula/get_species_description()
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm
index 2fa8525ff48..29df861b8bf 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm
@@ -25,12 +25,12 @@
/datum/species/aquatic/get_default_mutant_bodyparts()
return list(
- "tail" = list(MUTANT_INDEX_NAME = "Shark", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "snout" = list(MUTANT_INDEX_NAME = "Shark", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "horns" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "ears" = list(MUTANT_INDEX_NAME = "Hammerhead", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "legs" = list(MUTANT_INDEX_NAME = "Normal Legs", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "wings" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "tail" = list("Shark", TRUE),
+ "snout" = list("Shark", TRUE),
+ "horns" = list("None", FALSE),
+ "ears" = list("Hammerhead", TRUE),
+ "legs" = list("Normal Legs", FALSE),
+ "wings" = list("None", FALSE),
)
/obj/item/organ/internal/tongue/aquatic
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/ghoul.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/ghoul.dm
index f0b2c18d297..a1574f895a4 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/ghoul.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/ghoul.dm
@@ -33,9 +33,9 @@
/datum/species/ghoul/get_default_mutant_bodyparts()
return list(
- "tail" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "ears" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "legs" = list(MUTANT_INDEX_NAME = "Normal Legs", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "tail" = list("None", FALSE),
+ "ears" = list("None", FALSE),
+ "legs" = list("Normal Legs", FALSE),
)
/proc/proof_ghoul_features(list/inFeatures)
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/hemophage_species.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/hemophage_species.dm
index a74eb02b7fd..35ad767efab 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/hemophage_species.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/hemophage_species.dm
@@ -30,7 +30,7 @@
/datum/species/hemophage/get_default_mutant_bodyparts()
return list(
- "legs" = list(MUTANT_INDEX_NAME = "Normal Legs", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "legs" = list("Normal Legs", FALSE),
)
/datum/species/hemophage/check_roundstart_eligible()
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/humanoid.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/humanoid.dm
index 33d15682332..0bdecf35227 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/humanoid.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/humanoid.dm
@@ -15,13 +15,13 @@
/datum/species/humanoid/get_default_mutant_bodyparts()
return list(
- "tail" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "snout" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "ears" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "legs" = list(MUTANT_INDEX_NAME = "Normal Legs", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "wings" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "taur" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "horns" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "tail" = list("None", FALSE),
+ "snout" = list("None", FALSE),
+ "ears" = list("None", FALSE),
+ "legs" = list("Normal Legs", FALSE),
+ "wings" = list("None", FALSE),
+ "taur" = list("None", FALSE),
+ "horns" = list("None", FALSE),
)
/datum/species/humanoid/get_species_description()
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/insect.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/insect.dm
index 880ecec4ca4..97b21607c27 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/insect.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/insect.dm
@@ -25,15 +25,15 @@
/datum/species/insect/get_default_mutant_bodyparts()
return list(
- "tail" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "snout" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "horns" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "ears" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "legs" = list(MUTANT_INDEX_NAME = "Normal Legs", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "taur" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "fluff" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "wings" = list(MUTANT_INDEX_NAME = "Bee", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "moth_antennae" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "tail" = list("None", FALSE),
+ "snout" = list("None", FALSE),
+ "horns" = list("None", FALSE),
+ "ears" = list("None", FALSE),
+ "legs" = list("Normal Legs", FALSE),
+ "taur" = list("None", FALSE),
+ "fluff" = list("None", FALSE),
+ "wings" = list("Bee", FALSE),
+ "moth_antennae" = list("None", FALSE),
)
/datum/species/insect/get_species_description()
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/lizard.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/lizard.dm
index 82ea0cf9c31..55f20d16e6b 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/lizard.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/lizard.dm
@@ -5,15 +5,15 @@
/datum/species/lizard/get_default_mutant_bodyparts()
return list(
- "tail" = list(MUTANT_INDEX_NAME = "Smooth", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "snout" = list(MUTANT_INDEX_NAME = "Sharp + Light", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "spines" = list(MUTANT_INDEX_NAME = "Long + Membrane", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "frills" = list(MUTANT_INDEX_NAME = "Short", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "horns" = list(MUTANT_INDEX_NAME = "Curled", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "body_markings" = list(MUTANT_INDEX_NAME = "Light Belly", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "legs" = list(MUTANT_INDEX_NAME = DIGITIGRADE_LEGS, MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "taur" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "wings" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "tail" = list("Smooth", TRUE),
+ "snout" = list("Sharp + Light", TRUE),
+ "spines" = list("Long + Membrane", TRUE),
+ "frills" = list("Short", TRUE),
+ "horns" = list("Curled", TRUE),
+ "body_markings" = list("Light Belly", TRUE),
+ "legs" = list(DIGITIGRADE_LEGS,FALSE),
+ "taur" = list("None", FALSE),
+ "wings" = list("None", FALSE),
)
/datum/species/lizard/randomize_features()
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/mammal.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/mammal.dm
index 7bf7d0014d6..d450093819b 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/mammal.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/mammal.dm
@@ -23,16 +23,16 @@
/datum/species/mammal/get_default_mutant_bodyparts()
return list(
- "tail" = list(MUTANT_INDEX_NAME = "Husky", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "snout" = list(MUTANT_INDEX_NAME = "Husky", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "horns" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "ears" = list(MUTANT_INDEX_NAME = "Husky", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "legs" = list(MUTANT_INDEX_NAME = "Normal Legs", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "taur" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "fluff" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "wings" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "head_acc" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "neck_acc" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "tail" = list("Husky", TRUE),
+ "snout" = list("Husky", TRUE),
+ "horns" = list("None", FALSE),
+ "ears" = list("Husky", TRUE),
+ "legs" = list("Normal Legs", TRUE),
+ "taur" = list("None", FALSE),
+ "fluff" = list("None", FALSE),
+ "wings" = list("None", FALSE),
+ "head_acc" = list("None", FALSE),
+ "neck_acc" = list("None", FALSE),
)
/obj/item/organ/internal/tongue/mammal
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/monkey.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/monkey.dm
index fdcb5630d31..76126e02192 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/monkey.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/monkey.dm
@@ -1,6 +1,6 @@
/datum/species/monkey/get_default_mutant_bodyparts()
return list(
- "tail" = list(MUTANT_INDEX_NAME = "Monkey", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "tail" = list("Monkey", FALSE),
)
/datum/species/monkey/prepare_human_for_preview(mob/living/carbon/human/monke)
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/moth.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/moth.dm
index 04a452712a4..562ba54398d 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/moth.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/moth.dm
@@ -9,9 +9,9 @@
/datum/species/moth/get_default_mutant_bodyparts()
return list(
- "fluff" = list(MUTANT_INDEX_NAME = "Plain", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "wings" = list(MUTANT_INDEX_NAME = "Moth (Plain)", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "moth_antennae" = list(MUTANT_INDEX_NAME = "Plain", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
+ "fluff" = list("Plain", FALSE),
+ "wings" = list("Moth (Plain)", TRUE),
+ "moth_antennae" = list("Plain", TRUE),
)
/datum/species/moth/randomize_features()
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm
index 73b66a22c57..6e4615f99a5 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm
@@ -11,8 +11,8 @@
/datum/species/pod/get_default_mutant_bodyparts()
return list(
- "pod_hair" = list(MUTANT_INDEX_NAME = "Ivy", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "legs" = list(MUTANT_INDEX_NAME = "Normal Legs", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "pod_hair" = list("Ivy", TRUE),
+ "legs" = list("Normal Legs", FALSE),
)
/datum/species/pod/podweak
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/roundstartslime.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/roundstartslime.dm
index eec5fb6e5c7..5490654ef96 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/roundstartslime.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/roundstartslime.dm
@@ -6,15 +6,15 @@
/datum/species/jelly/get_default_mutant_bodyparts()
return list(
- "tail" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "snout" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "ears" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "legs" = list(MUTANT_INDEX_NAME = "Normal Legs", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "taur" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "wings" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "horns" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "spines" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "frills" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "tail" = list("None", FALSE),
+ "snout" = list("None", FALSE),
+ "ears" = list("None", FALSE),
+ "legs" = list("Normal Legs", FALSE),
+ "taur" = list("None", FALSE),
+ "wings" = list("None", FALSE),
+ "horns" = list("None", FALSE),
+ "spines" = list("None", FALSE),
+ "frills" = list("None", FALSE),
)
/datum/species/jelly/get_species_description()
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/skrell.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/skrell.dm
index b489e6a1c74..c92c46a1406 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/skrell.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/skrell.dm
@@ -35,7 +35,7 @@
/datum/species/skrell/get_default_mutant_bodyparts()
return list(
- "skrell_hair" = list(MUTANT_INDEX_NAME = "Male", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
+ "skrell_hair" = list("Male", TRUE),
)
/datum/species/skrell/get_species_description()
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm
index e26208ec567..7f9cfb7664b 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm
@@ -26,10 +26,10 @@
/datum/species/tajaran/get_default_mutant_bodyparts()
return list(
- "tail" = list(MUTANT_INDEX_NAME = "Cat (Big)", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "snout" = list(MUTANT_INDEX_NAME = "Cat, normal", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "ears" = list(MUTANT_INDEX_NAME = "Cat, normal", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "legs" = list(MUTANT_INDEX_NAME = "Normal Legs", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "tail" = list("Cat (Big)", TRUE),
+ "snout" = list("Cat, normal", TRUE),
+ "ears" = list("Cat, normal", TRUE),
+ "legs" = list("Normal Legs", FALSE),
)
/obj/item/organ/internal/tongue/cat/tajaran
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/unathi.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/unathi.dm
index e2638e06e3e..ccbb0dd1416 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/unathi.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/unathi.dm
@@ -26,13 +26,13 @@
/datum/species/unathi/get_default_mutant_bodyparts()
return list(
- "tail" = list(MUTANT_INDEX_NAME = "Smooth", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "snout" = list(MUTANT_INDEX_NAME = "Sharp + Light", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "spines" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "frills" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "horns" = list(MUTANT_INDEX_NAME = "Curled", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "body_markings" = list(MUTANT_INDEX_NAME = "Smooth Belly", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "legs" = list(MUTANT_INDEX_NAME = "Normal Legs", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "tail" = list("Smooth", TRUE),
+ "snout" = list("Sharp + Light", TRUE),
+ "spines" = list("None", FALSE),
+ "frills" = list("None", FALSE),
+ "horns" = list("Curled", TRUE),
+ "body_markings" = list("Smooth Belly", TRUE),
+ "legs" = list("Normal Legs", FALSE),
)
/obj/item/organ/internal/tongue/unathi
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm
index ecf2d84f623..60c0eee37cd 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm
@@ -47,10 +47,10 @@
/datum/species/vox/get_default_mutant_bodyparts()
return list(
- "tail" = list(MUTANT_INDEX_NAME = "Vox Tail", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "legs" = list(MUTANT_INDEX_NAME = DIGITIGRADE_LEGS, MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "snout" = list(MUTANT_INDEX_NAME = "Vox Snout", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "spines" = list(MUTANT_INDEX_NAME = "Vox Bands", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
+ "tail" = list("Vox Tail", FALSE),
+ "legs" = list(DIGITIGRADE_LEGS,FALSE),
+ "snout" = list("Vox Snout", FALSE),
+ "spines" = list("Vox Bands", TRUE),
)
/datum/species/vox/pre_equip_species_outfit(datum/job/job, mob/living/carbon/human/equipping, visuals_only)
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm
index 410d5200eed..48b2b3d327b 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm
@@ -25,10 +25,10 @@
/datum/species/vulpkanin/get_default_mutant_bodyparts()
return list(
- "tail" = list(MUTANT_INDEX_NAME = "Fox", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "snout" = list(MUTANT_INDEX_NAME = "Mammal, Long", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "ears" = list(MUTANT_INDEX_NAME = "Fox", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "legs" = list(MUTANT_INDEX_NAME = "Normal Legs", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "tail" = list("Fox", TRUE),
+ "snout" = list("Mammal, Long", TRUE),
+ "ears" = list("Fox", TRUE),
+ "legs" = list("Normal Legs", FALSE),
)
/obj/item/organ/internal/tongue/vulpkanin
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/xeno.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/xeno.dm
index cb73afdc4e1..4b2052bd083 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/xeno.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/xeno.dm
@@ -29,11 +29,11 @@
/datum/species/xeno/get_default_mutant_bodyparts()
return list(
- "tail" = list(MUTANT_INDEX_NAME = "Xenomorph Tail", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "xenodorsal" = list(MUTANT_INDEX_NAME = "Standard", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "xenohead" = list(MUTANT_INDEX_NAME = "Standard", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "legs" = list(MUTANT_INDEX_NAME = DIGITIGRADE_LEGS, MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "taur" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "tail" = list("Xenomorph Tail", FALSE),
+ "xenodorsal" = list("Standard", TRUE),
+ "xenohead" = list("Standard", TRUE),
+ "legs" = list(DIGITIGRADE_LEGS,FALSE),
+ "taur" = list("None", FALSE),
)
/datum/species/xeno/get_species_description()
diff --git a/modular_skyrat/modules/ghostcafe/code/ghost_role_spawners.dm b/modular_skyrat/modules/ghostcafe/code/ghost_role_spawners.dm
index 33896dd331f..74cde1544a3 100644
--- a/modular_skyrat/modules/ghostcafe/code/ghost_role_spawners.dm
+++ b/modular_skyrat/modules/ghostcafe/code/ghost_role_spawners.dm
@@ -30,8 +30,8 @@
new_spawn.AddElement(/datum/element/dusts_on_catatonia)
new_spawn.AddElement(/datum/element/dusts_on_leaving_area,list(A.type, /area/misc/hilbertshotel, /area/centcom/holding/cafe, /area/centcom/holding/cafewar, /area/centcom/holding/cafebotany,
/area/centcom/holding/cafebuild, /area/centcom/holding/cafevox, /area/centcom/holding/cafedorms, /area/centcom/holding/cafepark, /area/centcom/holding/cafeplumbing))
- ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, GHOSTROLE_TRAIT)
- ADD_TRAIT(new_spawn, TRAIT_FREE_GHOST, GHOSTROLE_TRAIT)
+ ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, TRAIT_GHOSTROLE)
+ ADD_TRAIT(new_spawn, TRAIT_FREE_GHOST, TRAIT_GHOSTROLE)
to_chat(new_spawn,span_warning("Ghosting is free!"))
var/datum/action/toggle_dead_chat_mob/D = new(new_spawn)
D.Grant(new_spawn)
@@ -58,8 +58,8 @@
new_spawn.AddElement(/datum/element/dusts_on_catatonia)
new_spawn.AddElement(/datum/element/dusts_on_leaving_area,list(A.type, /area/misc/hilbertshotel, /area/centcom/holding/cafe, /area/centcom/holding/cafewar, /area/centcom/holding/cafebotany,
/area/centcom/holding/cafebuild, /area/centcom/holding/cafevox, /area/centcom/holding/cafedorms, /area/centcom/holding/cafepark, /area/centcom/holding/cafeplumbing))
- ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, GHOSTROLE_TRAIT)
- ADD_TRAIT(new_spawn, TRAIT_FREE_GHOST, GHOSTROLE_TRAIT)
+ ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, TRAIT_GHOSTROLE)
+ ADD_TRAIT(new_spawn, TRAIT_FREE_GHOST, TRAIT_GHOSTROLE)
to_chat(new_spawn,span_warning("Ghosting is free!"))
var/datum/action/toggle_dead_chat_mob/D = new(new_spawn)
SSquirks.AssignQuirks(new_spawn, new_spawn.client, TRUE, TRUE, null, FALSE, new_spawn)
@@ -83,11 +83,11 @@
if(!..())
return 0
var/mob/M = target
- if(HAS_TRAIT_FROM(M,TRAIT_SIXTHSENSE,GHOSTROLE_TRAIT))
- REMOVE_TRAIT(M,TRAIT_SIXTHSENSE,GHOSTROLE_TRAIT)
+ if(HAS_TRAIT_FROM(M,TRAIT_SIXTHSENSE,TRAIT_GHOSTROLE))
+ REMOVE_TRAIT(M,TRAIT_SIXTHSENSE,TRAIT_GHOSTROLE)
to_chat(M,span_notice("You're no longer hearing deadchat."))
else
- ADD_TRAIT(M,TRAIT_SIXTHSENSE,GHOSTROLE_TRAIT)
+ ADD_TRAIT(M,TRAIT_SIXTHSENSE,TRAIT_GHOSTROLE)
to_chat(M,span_notice("You're once again hearing deadchat."))
/obj/item/storage/box/syndie_kit/chameleon/ghostcafe
diff --git a/modular_skyrat/modules/ghostcafe/code/ghostcafeturf.dm b/modular_skyrat/modules/ghostcafe/code/ghostcafeturf.dm
index 68a03c5f6d1..0af43268ca5 100644
--- a/modular_skyrat/modules/ghostcafe/code/ghostcafeturf.dm
+++ b/modular_skyrat/modules/ghostcafe/code/ghostcafeturf.dm
@@ -6,6 +6,6 @@
lava_damage = 0
lava_firestacks = 0
temperature_damage = 0
- immunity_trait = GHOSTROLE_TRAIT
+ immunity_trait = TRAIT_GHOSTROLE
immunity_resistance_flags = LAVA_PROOF
diff --git a/modular_skyrat/modules/modular_implants/code/nif_persistence.dm b/modular_skyrat/modules/modular_implants/code/nif_persistence.dm
index fd24fd3b579..ce4d865f7cf 100644
--- a/modular_skyrat/modules/modular_implants/code/nif_persistence.dm
+++ b/modular_skyrat/modules/modular_implants/code/nif_persistence.dm
@@ -22,7 +22,7 @@
/mob/living/carbon/human/proc/save_nif_data(datum/modular_persistence/persistence, remove_nif = FALSE)
var/obj/item/organ/internal/cyberimp/brain/nif/installed_nif = get_organ_by_type(/obj/item/organ/internal/cyberimp/brain/nif)
- if(HAS_TRAIT(src, GHOSTROLE_TRAIT)) //Nothing is lost from playing a ghost role
+ if(HAS_TRAIT(src, TRAIT_GHOSTROLE)) //Nothing is lost from playing a ghost role
return FALSE
if(remove_nif)
@@ -69,7 +69,7 @@
/// Loads the NIF data for an individual user.
/mob/living/carbon/human/proc/load_nif_data(datum/modular_persistence/persistence)
- if(HAS_TRAIT(src, GHOSTROLE_TRAIT))
+ if(HAS_TRAIT(src, TRAIT_GHOSTROLE))
return FALSE
if(!persistence.nif_path)
diff --git a/modular_skyrat/modules/modular_implants/code/nifsofts/huds.dm b/modular_skyrat/modules/modular_implants/code/nifsofts/huds.dm
index 719a87c44b5..d34131f9a74 100644
--- a/modular_skyrat/modules/modular_implants/code/nifsofts/huds.dm
+++ b/modular_skyrat/modules/modular_implants/code/nifsofts/huds.dm
@@ -24,7 +24,7 @@
ADD_TRAIT(linked_mob, trait, GLASSES_TRAIT)
for(var/trait as anything in added_eyewear_traits)
- ADD_TRAIT(linked_mob, trait, NIFSOFT_TRAIT)
+ ADD_TRAIT(linked_mob, trait, TRAIT_NIFSOFT)
linked_mob.update_sight()
@@ -34,16 +34,11 @@
var/datum/atom_hud/hud = GLOB.huds[hud_type]
hud.hide_from(linked_mob)
-<<<<<<< HEAD
- if(hud_trait)
- REMOVE_TRAIT(linked_mob, hud_trait, NIFSOFT_TRAIT)
-=======
for(var/trait in hud_traits)
REMOVE_TRAIT(linked_mob, trait, TRAIT_NIFSOFT)
->>>>>>> 83f49e097 (Deprecates hud_trait where possible, introduces lists where not (#25204))
for(var/trait in added_eyewear_traits)
- REMOVE_TRAIT(linked_mob, trait, NIFSOFT_TRAIT)
+ REMOVE_TRAIT(linked_mob, trait, TRAIT_NIFSOFT)
linked_mob.update_sight()
return TRUE
diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/hexacrocin.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/hexacrocin.dm
index 5323a8ddc86..c55deb402fa 100644
--- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/hexacrocin.dm
+++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/hexacrocin.dm
@@ -43,7 +43,7 @@
to_chat(exposed_mob, span_purple("Your libido is going haywire! It feels like speaking is much harder..."))
exposed_mob.gain_trauma(/datum/brain_trauma/very_special/bimbo, TRAUMA_RESILIENCE_BASIC)
- ADD_TRAIT(exposed_mob, TRAIT_BIMBO, LEWDCHEM_TRAIT)
+ ADD_TRAIT(exposed_mob, TRAIT_BIMBO, TRAIT_LEWDCHEM)
/datum/chemical_reaction/hexacrocin
results = list(/datum/reagent/drug/aphrodisiac/crocin/hexacrocin = 1)
diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/pentacamphor.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/pentacamphor.dm
index 2c2e6083c8c..88161435704 100644
--- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/pentacamphor.dm
+++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/pentacamphor.dm
@@ -23,11 +23,11 @@
if(HAS_TRAIT(exposed_mob, TRAIT_BIMBO))
exposed_mob.cure_trauma_type(/datum/brain_trauma/very_special/bimbo, TRAUMA_RESILIENCE_ABSOLUTE)
to_chat(exposed_mob, span_notice("Your mind is free. Your thoughts are pure and innocent once more."))
- REMOVE_TRAIT(exposed_mob, TRAIT_BIMBO, LEWDCHEM_TRAIT)
+ REMOVE_TRAIT(exposed_mob, TRAIT_BIMBO, TRAIT_LEWDCHEM)
return
if(!HAS_TRAIT(exposed_mob, TRAIT_NEVERBONER))
to_chat(exposed_mob, span_notice("You feel like you'll never feel aroused again..."))
- ADD_TRAIT(exposed_mob, TRAIT_NEVERBONER, LEWDCHEM_TRAIT)
+ ADD_TRAIT(exposed_mob, TRAIT_NEVERBONER, TRAIT_LEWDCHEM)
/datum/chemical_reaction/pentacamphor
results = list(/datum/reagent/drug/aphrodisiac/camphor/pentacamphor = 1)
diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/strapon.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/strapon.dm
index f499d5ba973..ec2fc7c0d9b 100644
--- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/strapon.dm
+++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/strapon.dm
@@ -182,7 +182,7 @@
. = ..()
update_icon_state()
update_icon()
- ADD_TRAIT(src, TRAIT_NODROP, STRAPON_TRAIT)
+ ADD_TRAIT(src, TRAIT_NODROP, TRAIT_STRAPON)
/obj/item/strapon_dildo/update_icon_state()
. = ..()
diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_helpers/human.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_helpers/human.dm
index c861b924d6f..d38656878af 100644
--- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_helpers/human.dm
+++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_helpers/human.dm
@@ -371,7 +371,7 @@
return FALSE
var/obj/item/clothing/sextoy/condom/condom = penis
- return condom.condom_state == CONDOM_BROKEN
+ return condom.condom_state == TRAIT_CONDOM_BROKEN
// For handling things that don't already have handcuff handlers.
/mob/living/carbon/human/set_handcuffed(new_value)
diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/condom.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/condom.dm
index c6ca46a83ab..21c2023f198 100644
--- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/condom.dm
+++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/condom.dm
@@ -76,13 +76,13 @@
condom_state = "dirty"
if(prob(10)) //chance of condom to break on first time.
name = "broken condom"
- condom_state = CONDOM_BROKEN
+ condom_state = TRAIT_CONDOM_BROKEN
update_icon_state()
update_icon()
if("dirty")
name = "broken condom"
- condom_state = CONDOM_BROKEN
+ condom_state = TRAIT_CONDOM_BROKEN
update_icon_state()
update_icon()
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 a94c833cc9b..c7256be1610 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
@@ -430,7 +430,7 @@ GLOBAL_LIST_INIT(dildo_colors, list(//mostly neon colors
/obj/item/clothing/sextoy/dildo/double_dildo_end/Initialize(mapload)
. = ..()
- ADD_TRAIT(src, TRAIT_NODROP, STRAPON_TRAIT)
+ ADD_TRAIT(src, TRAIT_NODROP, TRAIT_STRAPON)
/obj/item/clothing/sextoy/dildo/double_dildo_end/update_icon_state()
. = ..()
diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_quirks.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_quirks.dm
index 3473ce277da..d85e0db56d7 100644
--- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_quirks.dm
+++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_quirks.dm
@@ -155,19 +155,19 @@
/datum/brain_trauma/very_special/bimbo/on_gain()
owner.add_mood_event("bimbo", /datum/mood_event/bimbo)
- if(!HAS_TRAIT_FROM(owner, TRAIT_BIMBO, LEWDCHEM_TRAIT))
- ADD_TRAIT(owner, TRAIT_BIMBO, LEWDCHEM_TRAIT)
+ if(!HAS_TRAIT_FROM(owner, TRAIT_BIMBO, TRAIT_LEWDCHEM))
+ ADD_TRAIT(owner, TRAIT_BIMBO, TRAIT_LEWDCHEM)
RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech))
- if(!HAS_TRAIT_FROM(owner, TRAIT_MASOCHISM, APHRO_TRAIT))
- ADD_TRAIT(owner, TRAIT_MASOCHISM, APHRO_TRAIT)
+ if(!HAS_TRAIT_FROM(owner, TRAIT_MASOCHISM, TRAIT_APHRO))
+ ADD_TRAIT(owner, TRAIT_MASOCHISM, TRAIT_APHRO)
/datum/brain_trauma/very_special/bimbo/on_lose()
owner.clear_mood_event("bimbo")
- if(HAS_TRAIT_FROM(owner, TRAIT_BIMBO, LEWDCHEM_TRAIT))
- REMOVE_TRAIT(owner, TRAIT_BIMBO, LEWDCHEM_TRAIT)
+ if(HAS_TRAIT_FROM(owner, TRAIT_BIMBO, TRAIT_LEWDCHEM))
+ REMOVE_TRAIT(owner, TRAIT_BIMBO, TRAIT_LEWDCHEM)
UnregisterSignal(owner, COMSIG_MOB_SAY)
- if(HAS_TRAIT_FROM(owner, TRAIT_MASOCHISM, APHRO_TRAIT))
- REMOVE_TRAIT(owner, TRAIT_MASOCHISM, APHRO_TRAIT)
+ if(HAS_TRAIT_FROM(owner, TRAIT_MASOCHISM, TRAIT_APHRO))
+ REMOVE_TRAIT(owner, TRAIT_MASOCHISM, TRAIT_APHRO)
//Mood boost
/datum/mood_event/bimbo
@@ -195,13 +195,13 @@
/datum/quirk/masochism/post_add()
. = ..()
var/mob/living/carbon/human/affected_human = quirk_holder
- ADD_TRAIT(affected_human, TRAIT_MASOCHISM, LEWDQUIRK_TRAIT)
+ ADD_TRAIT(affected_human, TRAIT_MASOCHISM, TRAIT_LEWDQUIRK)
affected_human.pain_limit = 60
/datum/quirk/masochism/remove()
. = ..()
var/mob/living/carbon/human/affected_human = quirk_holder
- REMOVE_TRAIT(affected_human, TRAIT_MASOCHISM, LEWDQUIRK_TRAIT)
+ REMOVE_TRAIT(affected_human, TRAIT_MASOCHISM, TRAIT_LEWDQUIRK)
affected_human.pain_limit = 0
/*
@@ -219,11 +219,11 @@
/datum/brain_trauma/very_special/neverboner/on_gain()
var/mob/living/carbon/human/affected_human = owner
- ADD_TRAIT(affected_human, TRAIT_NEVERBONER, APHRO_TRAIT)
+ ADD_TRAIT(affected_human, TRAIT_NEVERBONER, TRAIT_APHRO)
/datum/brain_trauma/very_special/neverboner/on_lose()
var/mob/living/carbon/human/affected_human = owner
- REMOVE_TRAIT(affected_human, TRAIT_NEVERBONER, APHRO_TRAIT)
+ REMOVE_TRAIT(affected_human, TRAIT_NEVERBONER, TRAIT_APHRO)
/*
* SADISM
@@ -297,12 +297,12 @@
/datum/quirk/ropebunny/post_add()
. = ..()
var/mob/living/carbon/human/affected_mob = quirk_holder
- ADD_TRAIT(affected_mob, TRAIT_ROPEBUNNY, LEWDQUIRK_TRAIT)
+ ADD_TRAIT(affected_mob, TRAIT_ROPEBUNNY, TRAIT_LEWDQUIRK)
/datum/quirk/ropebunny/remove()
. = ..()
var/mob/living/carbon/human/affected_mob = quirk_holder
- REMOVE_TRAIT(affected_mob, TRAIT_ROPEBUNNY, LEWDQUIRK_TRAIT)
+ REMOVE_TRAIT(affected_mob, TRAIT_ROPEBUNNY, TRAIT_LEWDQUIRK)
//Rigger code
/datum/quirk/rigger
@@ -318,12 +318,12 @@
/datum/quirk/rigger/post_add()
. = ..()
var/mob/living/carbon/human/affected_mob = quirk_holder
- ADD_TRAIT(affected_mob, TRAIT_RIGGER, LEWDQUIRK_TRAIT)
+ ADD_TRAIT(affected_mob, TRAIT_RIGGER, TRAIT_LEWDQUIRK)
/datum/quirk/rigger/remove()
. = ..()
var/mob/living/carbon/human/affected_mob = quirk_holder
- REMOVE_TRAIT(affected_mob, TRAIT_RIGGER, LEWDQUIRK_TRAIT)
+ REMOVE_TRAIT(affected_mob, TRAIT_RIGGER, TRAIT_LEWDQUIRK)
/datum/mood_event/sadistic
description = span_purple("Others' suffering makes me happier\n")
diff --git a/modular_skyrat/modules/moretraitoritems/code/glue.dm b/modular_skyrat/modules/moretraitoritems/code/glue.dm
index 75867bca825..01a1c9983c1 100644
--- a/modular_skyrat/modules/moretraitoritems/code/glue.dm
+++ b/modular_skyrat/modules/moretraitoritems/code/glue.dm
@@ -17,11 +17,11 @@
return
if(istype(target, /obj/item))
var/obj/item/I = target
- if(HAS_TRAIT_FROM(I, TRAIT_NODROP, GLUED_ITEM_TRAIT))
+ if(HAS_TRAIT_FROM(I, TRAIT_NODROP, TRAIT_GLUED_ITEM))
to_chat(user, span_warning("[I] is already sticky!"))
return
uses -= 1
- ADD_TRAIT(I, TRAIT_NODROP, GLUED_ITEM_TRAIT)
+ ADD_TRAIT(I, TRAIT_NODROP, TRAIT_GLUED_ITEM)
I.desc += " It looks sticky."
to_chat(user, span_notice("You smear the [I] with glue, making it incredibly sticky!"))
if(uses == 0)
diff --git a/modular_skyrat/modules/primitive_production/code/glassblowing.dm b/modular_skyrat/modules/primitive_production/code/glassblowing.dm
index a887b063dab..3898b4f25de 100644
--- a/modular_skyrat/modules/primitive_production/code/glassblowing.dm
+++ b/modular_skyrat/modules/primitive_production/code/glassblowing.dm
@@ -392,7 +392,7 @@
to_chat(user, span_notice("You begin to [step_id] [src]."))
if(!do_after(user, actioning_speed, target = src))
fail_message("You interrupt an action!", user)
- REMOVE_TRAIT(tool_to_use, TRAIT_CURRENTLY_GLASSBLOWING, GLASSBLOWING_TRAIT)
+ REMOVE_TRAIT(tool_to_use, TRAIT_CURRENTLY_GLASSBLOWING, TRAIT_GLASSBLOWING)
return FALSE
if(glass.steps_remaining)
@@ -402,7 +402,7 @@
if(check_finished(glass))
glass.is_finished = TRUE
- REMOVE_TRAIT(tool_to_use, TRAIT_CURRENTLY_GLASSBLOWING, GLASSBLOWING_TRAIT)
+ REMOVE_TRAIT(tool_to_use, TRAIT_CURRENTLY_GLASSBLOWING, TRAIT_GLASSBLOWING)
in_use = FALSE
to_chat(user, span_notice("You finish trying to [step_id] [src]."))
@@ -447,7 +447,7 @@
balloon_alert(user, "already glassblowing!")
return FALSE
- ADD_TRAIT(user, TRAIT_CURRENTLY_GLASSBLOWING, GLASSBLOWING_TRAIT)
+ ADD_TRAIT(user, TRAIT_CURRENTLY_GLASSBLOWING, TRAIT_GLASSBLOWING)
return user
var/obj/item/glassblowing/used_tool
@@ -467,7 +467,7 @@
balloon_alert(user, "already in use!")
return FALSE
- ADD_TRAIT(used_tool, TRAIT_CURRENTLY_GLASSBLOWING, GLASSBLOWING_TRAIT)
+ ADD_TRAIT(used_tool, TRAIT_CURRENTLY_GLASSBLOWING, TRAIT_GLASSBLOWING)
return used_tool
/**
diff --git a/modular_skyrat/modules/primitive_production/code/misc.dm b/modular_skyrat/modules/primitive_production/code/misc.dm
new file mode 100644
index 00000000000..18bcafa8664
--- /dev/null
+++ b/modular_skyrat/modules/primitive_production/code/misc.dm
@@ -0,0 +1,35 @@
+/obj/item/shard/attackby(obj/item/item, mob/user, params)
+ //xenoarch hammer, forging hammer, etc.
+ if(item.tool_behaviour == TOOL_HAMMER)
+ var/added_color
+ switch(src.type)
+ if(/obj/item/shard)
+ added_color = "#88cdf1"
+
+ if(/obj/item/shard/plasma)
+ added_color = "#ff80f4"
+
+ if(/obj/item/shard/plastitanium)
+ added_color = "#5d3369"
+
+ if(/obj/item/shard/titanium)
+ added_color = "#cfbee0"
+
+ var/obj/colored_item = new /obj/item/stack/ore/glass/zero_cost(get_turf(src))
+ colored_item.add_atom_colour(added_color, FIXED_COLOUR_PRIORITY)
+ new /obj/effect/decal/cleanable/glass(get_turf(src))
+ user.balloon_alert(user, "[src] shatters!")
+ playsound(src, SFX_SHATTER, 30, TRUE)
+ qdel(src)
+ return TRUE
+
+ return ..()
+
+/obj/item/stack/ore/glass/zero_cost
+ points = 0
+ merge_type = /obj/item/stack/ore/glass/zero_cost
+
+/obj/item/stack/ore/examine(mob/user)
+ . = ..()
+ if(points == 0)
+ . += span_warning("
[src] is worthless and will not reward any mining points!")
diff --git a/modular_skyrat/modules/synths/code/bodyparts/internal_computer/brain.dm b/modular_skyrat/modules/synths/code/bodyparts/internal_computer/brain.dm
new file mode 100644
index 00000000000..9b65b3f6772
--- /dev/null
+++ b/modular_skyrat/modules/synths/code/bodyparts/internal_computer/brain.dm
@@ -0,0 +1,11 @@
+/obj/item/organ/internal/brain/synth
+ var/obj/item/modular_computer/pda/synth/internal_computer
+ actions_types = list(/datum/action/item_action/synth/open_internal_computer)
+
+/obj/item/organ/internal/brain/synth/Initialize(mapload)
+ . = ..()
+ internal_computer = new(src)
+
+/obj/item/organ/internal/brain/synth/Destroy()
+ QDEL_NULL(internal_computer)
+ return ..()
diff --git a/modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm b/modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm
new file mode 100644
index 00000000000..89f24cdcede
--- /dev/null
+++ b/modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm
@@ -0,0 +1,117 @@
+/// Custom computer for synth brains
+/obj/item/modular_computer/pda/synth
+ name = "virtual persocom"
+
+ base_active_power_usage = 0
+ base_idle_power_usage = 0
+
+ long_ranged = TRUE //Synths have good antennae
+
+ max_idle_programs = 3
+
+ max_capacity = 32
+
+/obj/item/modular_computer/pda/synth/Initialize(mapload)
+ . = ..()
+
+ // prevent these from being created outside of synth brains
+ if(!istype(loc, /obj/item/organ/internal/brain/synth))
+ return INITIALIZE_HINT_QDEL
+
+/datum/action/item_action/synth/open_internal_computer
+ name = "Open persocom emulation"
+ desc = "Accesses your built-in virtual machine."
+ check_flags = AB_CHECK_CONSCIOUS
+
+/datum/action/item_action/synth/open_internal_computer/Trigger(trigger_flags)
+ . = ..()
+ var/obj/item/organ/internal/brain/synth/targetmachine = target
+ targetmachine.internal_computer.interact(owner)
+
+/obj/item/modular_computer/pda/synth/ui_state(mob/user)
+ return GLOB.default_state
+
+/obj/item/modular_computer/pda/synth/ui_status(mob/user)
+ var/obj/item/organ/internal/brain/synth/brain_loc = loc
+ if(!istype(brain_loc))
+ return UI_CLOSE
+
+ if(!QDELETED(brain_loc.owner))
+ if(brain_loc.owner == user)
+ return min(
+ ui_status_user_is_abled(user, src),
+ ui_status_only_living(user),
+ )
+ else return UI_CLOSE
+ return ..()
+
+/obj/item/modular_computer/pda/synth/RemoveID(mob/user)
+ var/obj/item/organ/internal/brain/synth/brain_loc = loc
+ if(!istype(brain_loc))
+ return ..()
+
+ if(!computer_id_slot)
+ return ..()
+
+ if(crew_manifest_update)
+ GLOB.manifest.modify(computer_id_slot.registered_name, computer_id_slot.assignment, computer_id_slot.get_trim_assignment())
+
+ if(user && !issilicon(user) && in_range(brain_loc.owner || brain_loc, user))
+ user.put_in_hands(computer_id_slot)
+ else
+ computer_id_slot.forceMove(brain_loc.owner ? brain_loc.owner.drop_location() : brain_loc.drop_location()) //We actually update the physical on brain removal/insert
+
+ computer_id_slot = null
+ playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE)
+ balloon_alert(user, "removed ID")
+
+/obj/item/modular_computer/pda/synth/get_ntnet_status()
+ . = NTNET_NO_SIGNAL
+ // NTNet is down and we are not connected via wired connection. The synth is no more
+ var/obj/item/organ/internal/brain/synth/brain_loc = loc
+ if(!istype(brain_loc))
+ return
+ if(!find_functional_ntnet_relay() || isnull(brain_loc.owner))
+ return
+ var/turf/current_turf = get_turf(brain_loc.owner || brain_loc)
+ if(is_station_level(current_turf.z))
+ return NTNET_GOOD_SIGNAL
+ else if(long_ranged && !is_centcom_level(current_turf.z)) // Centcom is excluded because cafe
+ return NTNET_LOW_SIGNAL
+
+/*
+So, I am not snowflaking more code.. except this
+Attacking a synth with an id loads it into its slot.. pain and probably shitcode
+*/
+
+/obj/item/card/id/attack(mob/living/target_mob, mob/living/user, params)
+ var/mob/living/carbon/human/targetmachine = target_mob
+ if(!istype(targetmachine))
+ return ..()
+
+ var/obj/item/organ/internal/brain/synth/robotbrain = targetmachine.get_organ_slot(ORGAN_SLOT_BRAIN)
+ if(istype(robotbrain))
+ if(user.zone_selected == BODY_ZONE_PRECISE_EYES)
+ balloon_alert(user, "Inserting ID into persocom slot...")
+ if(do_after(user, 5 SECONDS))
+ balloon_alert(user, "ID slot interface registered!")
+ to_chat(targetmachine, span_notice("[user] inserts [src] into your persocom's card slot."))
+ robotbrain.internal_computer.InsertID(src, user)
+ return
+ return ..()
+
+/obj/item/modular_computer/pda/attack(mob/living/target_mob, mob/living/user, params)
+ var/mob/living/carbon/human/targetmachine = target_mob
+ if(!istype(targetmachine))
+ return ..()
+
+ var/obj/item/organ/internal/brain/synth/robotbrain = targetmachine.get_organ_slot(ORGAN_SLOT_BRAIN)
+ if(istype(robotbrain))
+ if(user.zone_selected == BODY_ZONE_PRECISE_EYES)
+ balloon_alert(user, "Establishing SSH login with persocom...")
+ if(do_after(user, 5 SECONDS))
+ balloon_alert(user, "Connection established!")
+ to_chat(targetmachine, span_notice("[user] establishes an SSH connection between [src] and your persocom emulation."))
+ robotbrain.internal_computer.interact(user)
+ return
+ return ..()
diff --git a/modular_skyrat/modules/synths/code/reagents/reagents.dm b/modular_skyrat/modules/synths/code/reagents/reagents.dm
index ef48f0bf947..54be7648ada 100644
--- a/modular_skyrat/modules/synths/code/reagents/reagents.dm
+++ b/modular_skyrat/modules/synths/code/reagents/reagents.dm
@@ -98,10 +98,10 @@
/datum/reagent/medicine/taste_suppressor/on_mob_metabolize(mob/living/affected_mob)
. = ..()
- ADD_TRAIT(affected_mob, TRAIT_AGEUSIA, REAGENT_TRAIT)
+ ADD_TRAIT(affected_mob, TRAIT_AGEUSIA, TRAIT_REAGENT)
/datum/reagent/medicine/taste_suppressor/on_mob_end_metabolize(mob/living/affected_mob)
. = ..()
- REMOVE_TRAIT(affected_mob, TRAIT_AGEUSIA, REAGENT_TRAIT)
+ REMOVE_TRAIT(affected_mob, TRAIT_AGEUSIA, TRAIT_REAGENT)
diff --git a/modular_skyrat/modules/synths/code/species/synthetic.dm b/modular_skyrat/modules/synths/code/species/synthetic.dm
index e3167ab4a4f..9a362621327 100644
--- a/modular_skyrat/modules/synths/code/species/synthetic.dm
+++ b/modular_skyrat/modules/synths/code/species/synthetic.dm
@@ -54,14 +54,14 @@
/datum/species/synthetic/get_default_mutant_bodyparts()
return list(
- "tail" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "ears" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "legs" = list(MUTANT_INDEX_NAME = "Normal Legs", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- "snout" = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- MUTANT_SYNTH_ANTENNA = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- MUTANT_SYNTH_SCREEN = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- MUTANT_SYNTH_CHASSIS = list(MUTANT_INDEX_NAME = "Default Chassis", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
- MUTANT_SYNTH_HEAD = list(MUTANT_INDEX_NAME = "Default Head", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "tail" = list("None", FALSE),
+ "ears" = list("None", FALSE),
+ "legs" = list("Normal Legs", FALSE),
+ "snout" = list("None", FALSE),
+ MUTANT_SYNTH_ANTENNA = list("None", FALSE),
+ MUTANT_SYNTH_SCREEN = list("None", FALSE),
+ MUTANT_SYNTH_CHASSIS = list("Default Chassis", FALSE),
+ MUTANT_SYNTH_HEAD = list("Default Head", FALSE),
)
/datum/species/synthetic/spec_life(mob/living/carbon/human/human)
diff --git a/modular_skyrat/modules/teshari/code/_teshari.dm b/modular_skyrat/modules/teshari/code/_teshari.dm
index ed1663d6f9a..1b09214e5f7 100644
--- a/modular_skyrat/modules/teshari/code/_teshari.dm
+++ b/modular_skyrat/modules/teshari/code/_teshari.dm
@@ -50,9 +50,9 @@
/datum/species/teshari/get_default_mutant_bodyparts()
return list(
- "tail" = list(MUTANT_INDEX_NAME = "Teshari (Default)", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "ears" = list(MUTANT_INDEX_NAME = "Teshari Regular", MUTANT_INDEX_CAN_RANDOMIZE = TRUE),
- "legs" = list(MUTANT_INDEX_NAME = "Normal Legs", MUTANT_INDEX_CAN_RANDOMIZE = FALSE),
+ "tail" = list("Teshari (Default)", TRUE),
+ "ears" = list("Teshari Regular", TRUE),
+ "legs" = list("Normal Legs", FALSE),
)
diff --git a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_tool.dm b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_tool.dm
index 50f695c2011..5d58fa29b84 100644
--- a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_tool.dm
+++ b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_tool.dm
@@ -7,6 +7,7 @@
/obj/item/xenoarch/hammer
name = "parent dev item"
desc = "A hammer that can be used to remove dirt from strange rocks."
+ tool_behaviour = TOOL_HAMMER
var/dig_amount = 1
var/dig_speed = 1 SECONDS
var/advanced = FALSE
diff --git a/tff_modular/modules/blooper/atoms_movable.dm b/tff_modular/modules/blooper/atoms_movable.dm
index e73058c3e93..a7446f60efb 100644
--- a/tff_modular/modules/blooper/atoms_movable.dm
+++ b/tff_modular/modules/blooper/atoms_movable.dm
@@ -59,7 +59,7 @@
blooper_pitch_range = BLOOPER_VARIANCE_RAND
blooper_speed = rand(BLOOPER_DEFAULT_MINSPEED, BLOOPER_DEFAULT_MAXSPEED)
-/randomize_human(mob/living/carbon/human/human)
+/randomize_human(mob/living/carbon/human/human, randomize_mutations = FALSE)
. = ..()
human.set_blooper(pick(GLOB.blooper_list))
human.blooper_pitch = BLOOPER_PITCH_RAND(human.gender)
diff --git a/tgstation.dme b/tgstation.dme
index 35b9780d62d..15d9b0c59d3 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -471,6 +471,7 @@
#include "code\__DEFINES\~skyrat_defines\_HELPERS\atmos_mapping_helpers.dm"
#include "code\__DEFINES\~skyrat_defines\_HELPERS\lighting.dm"
#include "code\__DEFINES\~skyrat_defines\_HELPERS\offset_index.dm"
+#include "code\__DEFINES\~skyrat_defines\traits\declarations.dm"
#include "code\__HELPERS\_auxtools_api.dm"
#include "code\__HELPERS\_lists.dm"
#include "code\__HELPERS\_planes.dm"
@@ -1850,6 +1851,7 @@
#include "code\datums\status_effects\debuffs\slimed.dm"
#include "code\datums\status_effects\debuffs\spacer.dm"
#include "code\datums\status_effects\debuffs\speech_debuffs.dm"
+#include "code\datums\status_effects\debuffs\staggered.dm"
#include "code\datums\status_effects\debuffs\static_vision.dm"
#include "code\datums\status_effects\debuffs\strandling.dm"
#include "code\datums\status_effects\debuffs\terrified.dm"
@@ -7749,6 +7751,7 @@
#include "modular_skyrat\modules\primitive_cooking_additions\code\stone_stove.dm"
#include "modular_skyrat\modules\primitive_production\code\ceramics.dm"
#include "modular_skyrat\modules\primitive_production\code\glassblowing.dm"
+#include "modular_skyrat\modules\primitive_production\code\misc.dm"
#include "modular_skyrat\modules\primitive_production\code\production_skill.dm"
#include "modular_skyrat\modules\primitive_structures\code\fencing.dm"
#include "modular_skyrat\modules\primitive_structures\code\storage_structures.dm"
@@ -7867,6 +7870,8 @@
#include "modular_skyrat\modules\synths\code\bodyparts\silicon_alt_brains.dm"
#include "modular_skyrat\modules\synths\code\bodyparts\stomach.dm"
#include "modular_skyrat\modules\synths\code\bodyparts\tongue.dm"
+#include "modular_skyrat\modules\synths\code\bodyparts\internal_computer\brain.dm"
+#include "modular_skyrat\modules\synths\code\bodyparts\internal_computer\internal_computer.dm"
#include "modular_skyrat\modules\synths\code\reagents\blood_pack.dm"
#include "modular_skyrat\modules\synths\code\reagents\pill.dm"
#include "modular_skyrat\modules\synths\code\reagents\pill_bottles.dm"
diff --git a/tgui/packages/tgui-dev-server/dreamseeker.js b/tgui/packages/tgui-dev-server/dreamseeker.js
index c81f51e35c5..2b25b155ae0 100644
--- a/tgui/packages/tgui-dev-server/dreamseeker.js
+++ b/tgui/packages/tgui-dev-server/dreamseeker.js
@@ -6,8 +6,8 @@
import { exec } from 'child_process';
import { promisify } from 'util';
-import { createLogger } from './logging';
-import { require } from './require';
+import { createLogger } from './logging.js';
+import { require } from './require.js';
const axios = require('axios');
const logger = createLogger('dreamseeker');
diff --git a/tgui/packages/tgui-dev-server/index.js b/tgui/packages/tgui-dev-server/index.js
index 460b15d99ad..199e93d8363 100644
--- a/tgui/packages/tgui-dev-server/index.js
+++ b/tgui/packages/tgui-dev-server/index.js
@@ -4,8 +4,8 @@
* @license MIT
*/
-import { createCompiler } from './webpack';
-import { reloadByondCache } from './reloader';
+import { createCompiler } from './webpack.js';
+import { reloadByondCache } from './reloader.js';
const noHot = process.argv.includes('--no-hot');
const noTmp = process.argv.includes('--no-tmp');
diff --git a/tgui/packages/tgui-dev-server/link/retrace.js b/tgui/packages/tgui-dev-server/link/retrace.js
index 949835c7002..842de228fdf 100644
--- a/tgui/packages/tgui-dev-server/link/retrace.js
+++ b/tgui/packages/tgui-dev-server/link/retrace.js
@@ -6,9 +6,9 @@
import fs from 'fs';
import { basename } from 'path';
-import { createLogger } from '../logging';
-import { require } from '../require';
-import { resolveGlob } from '../util';
+import { createLogger } from '../logging.js';
+import { require } from '../require.js';
+import { resolveGlob } from '../util.js';
const SourceMap = require('source-map');
const { parse: parseStackTrace } = require('stacktrace-parser');
diff --git a/tgui/packages/tgui-dev-server/link/server.js b/tgui/packages/tgui-dev-server/link/server.js
index f0c0d153d3a..60cc78c1bd9 100644
--- a/tgui/packages/tgui-dev-server/link/server.js
+++ b/tgui/packages/tgui-dev-server/link/server.js
@@ -6,9 +6,9 @@
import http from 'http';
import { inspect } from 'util';
-import { createLogger, directLog } from '../logging';
-import { require } from '../require';
-import { loadSourceMaps, retrace } from './retrace';
+import { createLogger, directLog } from '../logging.js';
+import { require } from '../require.js';
+import { loadSourceMaps, retrace } from './retrace.js';
const WebSocket = require('ws');
diff --git a/tgui/packages/tgui-dev-server/reloader.js b/tgui/packages/tgui-dev-server/reloader.js
index aed9a7dcd77..c13a8afdfcf 100644
--- a/tgui/packages/tgui-dev-server/reloader.js
+++ b/tgui/packages/tgui-dev-server/reloader.js
@@ -7,10 +7,10 @@
import fs from 'fs';
import os from 'os';
import { basename } from 'path';
-import { DreamSeeker } from './dreamseeker';
-import { createLogger } from './logging';
-import { resolveGlob, resolvePath } from './util';
-import { regQuery } from './winreg';
+import { DreamSeeker } from './dreamseeker.js';
+import { createLogger } from './logging.js';
+import { resolveGlob, resolvePath } from './util.js';
+import { regQuery } from './winreg.js';
const logger = createLogger('reloader');
diff --git a/tgui/packages/tgui-dev-server/util.js b/tgui/packages/tgui-dev-server/util.js
index d60ebb212fa..9d07b96c71a 100644
--- a/tgui/packages/tgui-dev-server/util.js
+++ b/tgui/packages/tgui-dev-server/util.js
@@ -6,7 +6,7 @@
import fs from 'fs';
import path from 'path';
-import { require } from './require';
+import { require } from './require.js';
const globPkg = require('glob');
diff --git a/tgui/packages/tgui-dev-server/webpack.js b/tgui/packages/tgui-dev-server/webpack.js
index 1c16345a892..139610b79ce 100644
--- a/tgui/packages/tgui-dev-server/webpack.js
+++ b/tgui/packages/tgui-dev-server/webpack.js
@@ -7,10 +7,10 @@
import fs from 'fs';
import { createRequire } from 'module';
import { dirname } from 'path';
-import { loadSourceMaps, setupLink } from './link/server';
-import { createLogger } from './logging';
-import { reloadByondCache } from './reloader';
-import { resolveGlob } from './util';
+import { loadSourceMaps, setupLink } from './link/server.js';
+import { createLogger } from './logging.js';
+import { reloadByondCache } from './reloader.js';
+import { resolveGlob } from './util.js';
const logger = createLogger('webpack');
diff --git a/tgui/packages/tgui-dev-server/winreg.js b/tgui/packages/tgui-dev-server/winreg.js
index d7408b5c390..b61fddc1a25 100644
--- a/tgui/packages/tgui-dev-server/winreg.js
+++ b/tgui/packages/tgui-dev-server/winreg.js
@@ -8,7 +8,7 @@
import { exec } from 'child_process';
import { promisify } from 'util';
-import { createLogger } from './logging';
+import { createLogger } from './logging.js';
const logger = createLogger('winreg');
diff --git a/tgui/packages/tgui-panel/chat/renderer.js b/tgui/packages/tgui-panel/chat/renderer.jsx
similarity index 99%
rename from tgui/packages/tgui-panel/chat/renderer.js
rename to tgui/packages/tgui-panel/chat/renderer.jsx
index 7a528cd4fd7..5d6337148fb 100644
--- a/tgui/packages/tgui-panel/chat/renderer.js
+++ b/tgui/packages/tgui-panel/chat/renderer.jsx
@@ -11,7 +11,7 @@ import { COMBINE_MAX_MESSAGES, COMBINE_MAX_TIME_WINDOW, IMAGE_RETRY_DELAY, IMAGE
import { render } from 'inferno';
import { canPageAcceptType, createMessage, isSameMessage } from './model';
import { highlightNode, linkifyNode } from './replaceInTextNode';
-import { Tooltip } from '../../tgui/components';
+import { Tooltip } from 'tgui/components';
const logger = createLogger('chatRenderer');
diff --git a/tgui/packages/tgui-panel/index.js b/tgui/packages/tgui-panel/index.jsx
similarity index 100%
rename from tgui/packages/tgui-panel/index.js
rename to tgui/packages/tgui-panel/index.jsx
diff --git a/tgui/packages/tgui/interfaces/MafiaPanel.tsx b/tgui/packages/tgui/interfaces/MafiaPanel.tsx
index ee63d105dd1..23b4b45a27a 100644
--- a/tgui/packages/tgui/interfaces/MafiaPanel.tsx
+++ b/tgui/packages/tgui/interfaces/MafiaPanel.tsx
@@ -16,6 +16,7 @@ type RoleInfo = {
type PlayerInfo = {
name: string;
+ role_revealed: string;
is_you: BooleanLike;
ref: string;
alive: string;
@@ -49,11 +50,13 @@ type MafiaData = {
is_observer: boolean;
all_roles: string[];
admin_controls: boolean;
+ person_voted_up_ref: string;
+ player_voted_up: BooleanLike;
};
export const MafiaPanelData = (props, context) => {
const { act, data } = useBackend(context);
- const { phase, roleinfo, admin_controls, messages } = data;
+ const { phase, roleinfo, admin_controls, messages, player_voted_up } = data;
const [mafia_tab, setMafiaMode] = useLocalState(
context,
'mafia_tab',
@@ -90,7 +93,7 @@ export const MafiaPanelData = (props, context) => {
- {phase === 'Judgment' && (
+ {phase === 'Judgment' && !player_voted_up && (
@@ -401,17 +404,20 @@ const MafiaJudgement = (props, context) => {
const { act, data } = useBackend(context);
return (
-
+
act('vote_abstain')}>
@@ -424,16 +430,22 @@ const MafiaJudgement = (props, context) => {
const MafiaPlayers = (props, context) => {
const { act, data } = useBackend(context);
- const { players } = data;
+ const { players = [], person_voted_up_ref } = data;
return (
{players?.map((player) => (
-
+
{player.name}
- {player.is_you && ' (YOU)'} {!player.alive && '(DEAD)'}
+ {(!!player.is_you && ' (YOU)') ||
+ (!!player.role_revealed && ' - ' + player.role_revealed)}
{player.votes !== undefined &&
diff --git a/tgui/packages/tgui/stories/Blink.stories.js b/tgui/packages/tgui/stories/Blink.stories.jsx
similarity index 100%
rename from tgui/packages/tgui/stories/Blink.stories.js
rename to tgui/packages/tgui/stories/Blink.stories.jsx
diff --git a/tgui/packages/tgui/stories/BlockQuote.stories.js b/tgui/packages/tgui/stories/BlockQuote.stories.jsx
similarity index 100%
rename from tgui/packages/tgui/stories/BlockQuote.stories.js
rename to tgui/packages/tgui/stories/BlockQuote.stories.jsx
diff --git a/tgui/packages/tgui/stories/Box.stories.js b/tgui/packages/tgui/stories/Box.stories.jsx
similarity index 100%
rename from tgui/packages/tgui/stories/Box.stories.js
rename to tgui/packages/tgui/stories/Box.stories.jsx
diff --git a/tgui/packages/tgui/stories/Button.stories.js b/tgui/packages/tgui/stories/Button.stories.jsx
similarity index 100%
rename from tgui/packages/tgui/stories/Button.stories.js
rename to tgui/packages/tgui/stories/Button.stories.jsx
diff --git a/tgui/packages/tgui/stories/ByondUi.stories.js b/tgui/packages/tgui/stories/ByondUi.stories.jsx
similarity index 100%
rename from tgui/packages/tgui/stories/ByondUi.stories.js
rename to tgui/packages/tgui/stories/ByondUi.stories.jsx
diff --git a/tgui/packages/tgui/stories/Collapsible.stories.js b/tgui/packages/tgui/stories/Collapsible.stories.jsx
similarity index 100%
rename from tgui/packages/tgui/stories/Collapsible.stories.js
rename to tgui/packages/tgui/stories/Collapsible.stories.jsx
diff --git a/tgui/packages/tgui/stories/Flex.stories.js b/tgui/packages/tgui/stories/Flex.stories.jsx
similarity index 100%
rename from tgui/packages/tgui/stories/Flex.stories.js
rename to tgui/packages/tgui/stories/Flex.stories.jsx
diff --git a/tgui/packages/tgui/stories/Input.stories.js b/tgui/packages/tgui/stories/Input.stories.jsx
similarity index 100%
rename from tgui/packages/tgui/stories/Input.stories.js
rename to tgui/packages/tgui/stories/Input.stories.jsx
diff --git a/tgui/packages/tgui/stories/LabeledList.stories.js b/tgui/packages/tgui/stories/LabeledList.stories.jsx
similarity index 100%
rename from tgui/packages/tgui/stories/LabeledList.stories.js
rename to tgui/packages/tgui/stories/LabeledList.stories.jsx
diff --git a/tgui/packages/tgui/stories/Popper.stories.js b/tgui/packages/tgui/stories/Popper.stories.jsx
similarity index 100%
rename from tgui/packages/tgui/stories/Popper.stories.js
rename to tgui/packages/tgui/stories/Popper.stories.jsx
diff --git a/tgui/packages/tgui/stories/ProgressBar.stories.js b/tgui/packages/tgui/stories/ProgressBar.stories.jsx
similarity index 100%
rename from tgui/packages/tgui/stories/ProgressBar.stories.js
rename to tgui/packages/tgui/stories/ProgressBar.stories.jsx
diff --git a/tgui/packages/tgui/stories/Stack.stories.js b/tgui/packages/tgui/stories/Stack.stories.jsx
similarity index 100%
rename from tgui/packages/tgui/stories/Stack.stories.js
rename to tgui/packages/tgui/stories/Stack.stories.jsx
diff --git a/tgui/packages/tgui/stories/Storage.stories.js b/tgui/packages/tgui/stories/Storage.stories.jsx
similarity index 100%
rename from tgui/packages/tgui/stories/Storage.stories.js
rename to tgui/packages/tgui/stories/Storage.stories.jsx
diff --git a/tgui/packages/tgui/stories/Tabs.stories.js b/tgui/packages/tgui/stories/Tabs.stories.jsx
similarity index 100%
rename from tgui/packages/tgui/stories/Tabs.stories.js
rename to tgui/packages/tgui/stories/Tabs.stories.jsx
diff --git a/tgui/packages/tgui/stories/Themes.stories.js b/tgui/packages/tgui/stories/Themes.stories.jsx
similarity index 100%
rename from tgui/packages/tgui/stories/Themes.stories.js
rename to tgui/packages/tgui/stories/Themes.stories.jsx
diff --git a/tgui/packages/tgui/stories/Tooltip.stories.js b/tgui/packages/tgui/stories/Tooltip.stories.jsx
similarity index 100%
rename from tgui/packages/tgui/stories/Tooltip.stories.js
rename to tgui/packages/tgui/stories/Tooltip.stories.jsx
diff --git a/tgui/packages/tgui/stories/common.js b/tgui/packages/tgui/stories/common.jsx
similarity index 100%
rename from tgui/packages/tgui/stories/common.js
rename to tgui/packages/tgui/stories/common.jsx
diff --git a/tgui/webpack.config.js b/tgui/webpack.config.js
index 27a07fd0d09..1bc9f209cbd 100644
--- a/tgui/webpack.config.js
+++ b/tgui/webpack.config.js
@@ -44,6 +44,7 @@ module.exports = (env = {}, argv) => {
filename: '[name].bundle.js',
chunkFilename: '[name].bundle.js',
chunkLoadTimeout: 15000,
+ publicPath: '/',
},
resolve: {
extensions: ['.tsx', '.ts', '.js', '.jsx'],
diff --git a/tools/trait_validity/check.py b/tools/trait_validity/check.py
index 10da9f34a15..1f83559d4e9 100644
--- a/tools/trait_validity/check.py
+++ b/tools/trait_validity/check.py
@@ -14,6 +14,7 @@ def red(text):
on_github = os.getenv("GITHUB_ACTIONS") == "true"
defines_file = "code/__DEFINES/traits/declarations.dm"
+skyrat_defines_file = "code/__DEFINES/~skyrat_defines/traits/declarations.dm" # SKYRAT EDIT ADDITION
globalvars_file = "code/_globalvars/traits/_traits.dm"
how_to_fix_message = f"Please ensure that all traits in the {defines_file} file are added in the {globalvars_file} file."
@@ -30,6 +31,12 @@ def post_error(define_name):
print(red(f"Could not find the defines file '{defines_file}'!"))
sys.exit(1)
+# SKYRAT EDIT ADDITION START
+if not os.path.isfile(skyrat_defines_file):
+ print(red(f"Could not find the skyrat defines file '{skyrat_defines_file}'!"))
+ sys.exit(1)
+# SKYRAT EDIT ADDITION END
+
if not os.path.isfile(globalvars_file):
print(red(f"Could not find the globalvars file '{globalvars_file}'!"))
sys.exit(1)
@@ -62,6 +69,33 @@ def post_error(define_name):
number_of_defines += 1
defines_to_search_for.append(match.group(2))
+# SKYRAT EDIT ADDITION START
+scannable_lines = []
+with open(skyrat_defines_file, 'r') as file:
+ reading = False
+
+ for line in file:
+ line = line.strip()
+
+ if line == "// BEGIN TRAIT DEFINES":
+ reading = True
+ continue
+ elif line == "// END TRAIT DEFINES":
+ break
+ elif not reading:
+ continue
+
+ scannable_lines.append(line)
+
+for potential_define in scannable_lines:
+ match = define_regex.match(potential_define)
+ if not match:
+ continue
+
+ number_of_defines += 1
+ defines_to_search_for.append(match.group(2))
+# SKYRAT EDIT ADDITION END
+
if number_of_defines == 0:
print(red("No defines found! This is likely an error."))
sys.exit(1)