diff --git a/.github/workflows/autowiki.yml b/.github/workflows/autowiki.yml
new file mode 100644
index 000000000000..72c5b8816ce0
--- /dev/null
+++ b/.github/workflows/autowiki.yml
@@ -0,0 +1,57 @@
+name: Autowiki
+on:
+ schedule:
+ - cron: "5 4 * * *"
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+jobs:
+ autowiki:
+ runs-on: ubuntu-20.04
+ steps:
+ - name: "Check for AUTOWIKI_USERNAME"
+ id: secrets_set
+ env:
+ ENABLER_SECRET: ${{ secrets.AUTOWIKI_USERNAME }}
+ run: |
+ unset SECRET_EXISTS
+ if [ -n "$ENABLER_SECRET" ]; then SECRET_EXISTS=true ; fi
+ echo "SECRETS_ENABLED=$SECRET_EXISTS" >> $GITHUB_OUTPUT
+ - name: Checkout
+ if: steps.secrets_set.outputs.SECRETS_ENABLED
+ uses: actions/checkout@v3
+ - name: Restore BYOND cache
+ if: steps.secrets_set.outputs.SECRETS_ENABLED
+ uses: actions/cache@v3
+ with:
+ path: ~/BYOND
+ key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }}
+ - name: Install rust-g
+ if: steps.secrets_set.outputs.SECRETS_ENABLED
+ run: |
+ sudo dpkg --add-architecture i386
+ sudo apt update || true
+ sudo apt install -o APT::Immediate-Configure=false libssl1.1:i386
+ bash tools/ci/install_rust_g.sh
+ - name: Install auxmos
+ if: steps.secrets_set.outputs.SECRETS_ENABLED
+ run: |
+ bash tools/ci/install_auxmos.sh
+ - name: Compile and generate Autowiki files
+ if: steps.secrets_set.outputs.SECRETS_ENABLED
+ run: |
+ bash tools/ci/install_byond.sh
+ source $HOME/BYOND/byond/bin/byondsetup
+ tools/build/build --ci autowiki
+ - name: Run Autowiki
+ if: steps.secrets_set.outputs.SECRETS_ENABLED
+ env:
+ USERNAME: ${{ secrets.AUTOWIKI_USERNAME }}
+ PASSWORD: ${{ secrets.AUTOWIKI_PASSWORD }}
+ run: |
+ cd tools/autowiki
+ npm install
+ cd ../..
+ node tools/autowiki/autowiki.js data/autowiki_edits.txt data/autowiki_files/
diff --git a/.github/workflows/compile_changelogs.yml b/.github/workflows/compile_changelogs.yml
index 0c789db80adb..70b4ac9a9331 100644
--- a/.github/workflows/compile_changelogs.yml
+++ b/.github/workflows/compile_changelogs.yml
@@ -3,20 +3,21 @@ name: Compile changelogs
on:
schedule:
- cron: "0 0 * * *"
+ workflow_dispatch:
jobs:
compile:
name: "Compile changelogs"
runs-on: ubuntu-20.04
steps:
- - name: "Check for ACTION_ENABLER secret and pass true to output if it exists to be checked by later steps"
+ - name: "Check for ACTION_ENABLER secret and pass it to output if it exists to be checked by later steps"
id: value_holder
env:
ENABLER_SECRET: ${{ secrets.CHANGELOG_ENABLER }}
run: |
unset SECRET_EXISTS
if [ -n "$ENABLER_SECRET" ]; then SECRET_EXISTS=true ; fi
- echo "::set-output name=ACTIONS_ENABLED::$SECRET_EXISTS"
+ echo "ACTIONS_ENABLED=$SECRET_EXISTS" >> $GITHUB_OUTPUT
- name: "Setup python"
if: steps.value_holder.outputs.ACTIONS_ENABLED
uses: actions/setup-python@v4
@@ -33,6 +34,7 @@ jobs:
uses: actions/checkout@v3
with:
fetch-depth: 25
+ persist-credentials: false
- name: "Compile"
if: steps.value_holder.outputs.ACTIONS_ENABLED
run: |
@@ -49,4 +51,4 @@ jobs:
if: steps.value_holder.outputs.ACTIONS_ENABLED
uses: ad-m/github-push-action@master
with:
- github_token: ${{ secrets.CHANGELOG_TOKEN }}
+ github_token: ${{ secrets.CHANGELOG_TOKEN || secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/make_changelogs.yml b/.github/workflows/make_changelogs.yml
index 9eb0b97f326a..aceb4aee3130 100644
--- a/.github/workflows/make_changelogs.yml
+++ b/.github/workflows/make_changelogs.yml
@@ -24,8 +24,7 @@ jobs:
pip install ruamel.yaml PyGithub
- name: Make CL
env:
- #GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} Use this instead if you have unprotected branches
- GITHUB_TOKEN: ${{ secrets.CHANGELOG_TOKEN }}
+ GITHUB_TOKEN: ${{ secrets.CHANGELOG_TOKEN || secrets.GITHUB_TOKEN }}
GIT_EMAIL: "action@github.com"
GIT_NAME: "Changelogs"
run: python tools/changelog/generate_cl.py
diff --git a/.gitignore b/.gitignore
index 6a5d235a316b..35df6d730a28 100644
--- a/.gitignore
+++ b/.gitignore
@@ -200,9 +200,8 @@ Temporary Items
# JavaScript tools
**/node_modules
-# Screenshot tests
-/artifacts
-
# tool-generated files
check_regex_output.txt
+# Autowiki
+/tools/autowiki/node_modules
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index 3e21a9cf446c..1e74feb64306 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -5,6 +5,8 @@
"EditorConfig.EditorConfig",
"arcanis.vscode-zipfs",
"dbaeumer.vscode-eslint",
+ "stylemistake.auto-comment-blocks",
+ "Donkie.vscode-tgstation-test-adapter",
"anturk.dmi-editor",
"esbenp.prettier-vscode"
]
diff --git a/.vscode/launch.json b/.vscode/launch.json
index b74e0acda049..42a293a33380 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -15,6 +15,18 @@
"preLaunchTask": "Build All",
"dmb": "${workspaceFolder}/${command:CurrentDMB}",
"dreamDaemon": true
+ },
+ {
+ "name": "Debug External Libraries",
+ "type": "cppvsdbg",
+ "request": "launch",
+ "program": "${command:dreammaker.returnDreamDaemonPath}",
+ "cwd": "${workspaceRoot}",
+ "args": [
+ "${command:dreammaker.getFilenameDmb}",
+ "-trusted"
+ ],
+ "preLaunchTask": "Build All"
}
]
}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index e5f15008212b..84e86d496519 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -7,7 +7,16 @@
"windows": {
"command": ".\\tools\\build\\build.bat"
},
- "problemMatcher": ["$dreammaker", "$eslint-stylish"],
+ "options": {
+ "env": {
+ "DM_EXE": "${config:dreammaker.byondPath}"
+ }
+ },
+ "problemMatcher": [
+ "$dreammaker",
+ "$tsc",
+ "$eslint-stylish"
+ ],
"group": {
"kind": "build",
"isDefault": true
@@ -18,24 +27,81 @@
{
"type": "dreammaker",
"dme": "shiptest.dme",
- "problemMatcher": ["$dreammaker"],
+ "problemMatcher": [
+ "$dreammaker"
+ ],
+ "group": "build",
+ "label": "dm: build - tgstation.dme"
+ },
+ {
+ "command": "${command:dreammaker.reparse}",
"group": "build",
- "label": "dm: build - shiptest.dme"
+ "label": "dm: reparse"
},
{
"type": "shell",
- "command": "tgui/bin/tgui",
+ "command": "bin/tgui-build",
"windows": {
- "command": ".\\tgui\\bin\\tgui.bat"
+ "command": ".\\bin\\tgui-build.cmd"
},
- "problemMatcher": ["$eslint-stylish"],
+ "problemMatcher": [
+ "$tsc",
+ "$eslint-stylish"
+ ],
"group": "build",
"label": "tgui: build"
},
{
- "command": "${command:dreammaker.reparse}",
+ "type": "shell",
+ "command": "bin/tgui-dev",
+ "windows": {
+ "command": ".\\bin\\tgui-dev.cmd"
+ },
+ "problemMatcher": [
+ "$tsc",
+ "$eslint-stylish"
+ ],
"group": "build",
- "label": "dm: reparse"
+ "label": "tgui: dev server"
+ },
+ {
+ "type": "shell",
+ "command": "bin/tgui-bench",
+ "windows": {
+ "command": ".\\bin\\tgui-bench.cmd"
+ },
+ "problemMatcher": [
+ "$tsc",
+ "$eslint-stylish"
+ ],
+ "group": "build",
+ "label": "tgui: bench"
+ },
+ {
+ "type": "shell",
+ "command": "bin/tgui-sonar",
+ "windows": {
+ "command": ".\\bin\\tgui-sonar.cmd"
+ },
+ "problemMatcher": [
+ "$tsc",
+ "$eslint-stylish"
+ ],
+ "group": "build",
+ "label": "tgui: sonar"
+ },
+ {
+ "type": "shell",
+ "command": "bin/tgfont",
+ "windows": {
+ "command": ".\\bin\\tgfont.cmd"
+ },
+ "problemMatcher": [
+ "$tsc",
+ "$eslint-stylish"
+ ],
+ "group": "build",
+ "label": "tgui: rebuild tgfont"
}
]
}
diff --git a/README.md b/README.md
index 0c3f8281189c..7b45a824099d 100644
--- a/README.md
+++ b/README.md
@@ -57,5 +57,3 @@ The TGS DMAPI API is licensed as a subproject under the MIT license.
See the footer of [code/\_\_DEFINES/tgs.dm](./code/__DEFINES/tgs.dm) and [code/modules/tgs/LICENSE](./code/modules/tgs/LICENSE) for the MIT license.
All assets including icons and sound are under a [Creative Commons 3.0 BY-SA license](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated.
-
-All assets located in the `goon` and `whitesands/goon` directory are under a [Creative Commons 3.0 BY-NC-SA license](https://creativecommons.org/licenses/by-nc-sa/3.0/). Assets created by Goonstation.
diff --git a/_maps/RandomRuins/BeachRuins/beach_knights_rest.dmm b/_maps/RandomRuins/BeachRuins/beach_knights_rest.dmm
index f3e7acecbea7..53ffd17a3299 100644
--- a/_maps/RandomRuins/BeachRuins/beach_knights_rest.dmm
+++ b/_maps/RandomRuins/BeachRuins/beach_knights_rest.dmm
@@ -509,7 +509,7 @@
/turf/open/floor/plating/dirt,
/area/ruin/beachplanet/knight)
"Bk" = (
-/obj/structure/closet/crate/grave{
+/obj/structure/closet/crate/grave/loot{
icon_state = "grave_lead";
desc = "An marked patch of soil, showing signs of a burial. The headstone cannot be read, its' message torn away by age."
},
diff --git a/_maps/RandomRuins/BeachRuins/beach_ocean_town.dmm b/_maps/RandomRuins/BeachRuins/beach_ocean_town.dmm
index 27ed10f7b271..151248e75019 100644
--- a/_maps/RandomRuins/BeachRuins/beach_ocean_town.dmm
+++ b/_maps/RandomRuins/BeachRuins/beach_ocean_town.dmm
@@ -51,6 +51,11 @@
},
/turf/open/water/beach,
/area/ruin/beach/oceantown)
+"aK" = (
+/obj/structure/table/wood,
+/obj/item/flashlight/lamp/bananalamp,
+/turf/open/floor/carpet,
+/area/ruin/beach/oceantown)
"aM" = (
/obj/machinery/door/airlock{
name = "Employees Only"
@@ -527,6 +532,11 @@
/obj/structure/flora/ausbushes/leafybush,
/turf/open/floor/plating/grass/beach/lit,
/area/ruin/beach/oceantown)
+"gp" = (
+/obj/structure/table/wood,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/carpet/green,
+/area/ruin/beach/oceantown)
"gu" = (
/obj/effect/turf_decal/sand/plating{
light_range = 2
@@ -1264,10 +1274,6 @@
},
/turf/open/floor/plating/asteroid/sand/lit,
/area/ruin/beach/oceantown)
-"qJ" = (
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/plating/grass/beach/lit,
-/area/ruin/beach/oceantown)
"qW" = (
/obj/structure/chair/wood{
dir = 4
@@ -1775,6 +1781,12 @@
},
/turf/open/floor/plating/grass/beach/lit,
/area/ruin/beach/oceantown)
+"xu" = (
+/obj/structure/table/wood,
+/obj/item/book/manual/ripley_build_and_repair,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/wood,
+/area/ruin/beach/oceantown)
"xx" = (
/obj/structure/flora/tree/palm{
icon_state = "palm2"
@@ -1886,11 +1898,6 @@
light_range = 2
},
/area/ruin/beach/oceantown)
-"yC" = (
-/obj/structure/table/wood,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/carpet/green,
-/area/ruin/beach/oceantown)
"yD" = (
/obj/effect/turf_decal/corner/opaque/white/diagonal{
dir = 8
@@ -2148,11 +2155,6 @@
/obj/structure/flora/ausbushes/ywflowers,
/turf/open/floor/plating/grass/beach/lit,
/area/ruin/beach/oceantown)
-"BQ" = (
-/obj/structure/flora/ausbushes/fullgrass,
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/plating/grass/beach/lit,
-/area/ruin/beach/oceantown)
"BV" = (
/obj/structure/filingcabinet,
/turf/open/floor/plasteel/grimy,
@@ -2498,12 +2500,6 @@
light_range = 2
},
/area/ruin/beach/oceantown)
-"EX" = (
-/obj/structure/table/wood,
-/obj/item/book/manual/ripley_build_and_repair,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/wood,
-/area/ruin/beach/oceantown)
"FA" = (
/obj/effect/turf_decal/siding/wood{
dir = 8
@@ -2641,12 +2637,6 @@
light_range = 2
},
/area/ruin/beach/oceantown)
-"Gz" = (
-/obj/structure/table/wood,
-/obj/item/book/manual/wiki/medical_cloning,
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/wood,
-/area/ruin/beach/oceantown)
"GA" = (
/obj/effect/turf_decal/siding/wood{
dir = 8
@@ -2731,6 +2721,11 @@
light_range = 2
},
/area/ruin/beach/oceantown)
+"Hk" = (
+/obj/effect/turf_decal/weather/sand,
+/obj/effect/turf_decal/weather/sand,
+/turf/open/water/beach,
+/area/ruin/beach/oceantown)
"Hp" = (
/obj/structure/table/wood,
/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{
@@ -3035,11 +3030,6 @@
light_range = 2
},
/area/ruin/beach/oceantown)
-"Kr" = (
-/obj/structure/table/wood,
-/obj/item/flashlight/lamp/bananalamp,
-/turf/open/floor/carpet,
-/area/ruin/beach/oceantown)
"Kx" = (
/obj/effect/turf_decal/road/stripes,
/obj/effect/turf_decal/road/stripes{
@@ -3313,6 +3303,12 @@
light_range = 2
},
/area/ruin/beach/oceantown)
+"Ni" = (
+/obj/structure/table/wood,
+/obj/item/book/manual/wiki/medical_cloning,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/wood,
+/area/ruin/beach/oceantown)
"Np" = (
/turf/open/floor/plasteel,
/area/ruin/beach/oceantown)
@@ -3756,11 +3752,6 @@
/obj/effect/spawner/lootdrop/donut/jelly,
/turf/open/floor/plasteel/patterned/grid,
/area/ruin/beach/oceantown/shop)
-"SV" = (
-/obj/structure/table/wood,
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/carpet/green,
-/area/ruin/beach/oceantown)
"SY" = (
/obj/structure/chair/comfy/brown{
dir = 1
@@ -3918,26 +3909,11 @@
"UX" = (
/turf/closed/wall/mineral/wood/nonmetal,
/area/ruin/beach/oceantown/shop)
-"Vb" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 8
- },
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/wood{
- light_range = 2
- },
-/area/ruin/beach/oceantown)
"Vf" = (
/obj/structure/closet/secure_closet/freezer/fridge,
/obj/effect/turf_decal/box,
/turf/open/floor/plasteel/white,
/area/ruin/beach/oceantown/bar)
-"Vn" = (
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/concrete/pavement{
- light_range = 2
- },
-/area/ruin/beach/oceantown)
"Vr" = (
/obj/structure/bed,
/obj/item/bedsheet/dorms,
@@ -4249,6 +4225,11 @@
/obj/structure/closet/crate/bin,
/turf/open/floor/plating/asteroid/sand/lit,
/area/ruin/beach/oceantown)
+"Zc" = (
+/obj/structure/table/wood,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/carpet/green,
+/area/ruin/beach/oceantown)
"Zf" = (
/obj/machinery/door/airlock{
name = "Bathroom"
@@ -6048,7 +6029,7 @@ Ru
Ru
Ru
Ru
-Vn
+Ru
Ru
Ru
Ru
@@ -6117,11 +6098,11 @@ xo
xo
xo
xo
-Vb
-Vb
-Vb
xo
-Vb
+xo
+xo
+xo
+xo
xo
xo
xo
@@ -6190,10 +6171,10 @@ uC
FF
Wl
Wl
-qJ
-qJ
-qJ
-qJ
+Wl
+Wl
+Wl
+Wl
Wl
Wl
Wl
@@ -6266,8 +6247,8 @@ pB
Wl
Wl
FF
-BQ
-BQ
+FF
+FF
Wl
rl
qw
@@ -6510,14 +6491,14 @@ rl
FF
FF
xh
-SV
+gp
xF
im
dT
IU
VZ
sj
-Gz
+Ni
lc
Al
sp
@@ -6896,7 +6877,7 @@ PC
qw
xh
KO
-Kr
+aK
sy
xh
ao
@@ -8471,7 +8452,7 @@ YU
YU
"}
(55,1,1) = {"
-qp
+Hk
sa
sa
sa
@@ -8548,7 +8529,7 @@ YU
YU
"}
(56,1,1) = {"
-ev
+qp
sa
sa
sa
@@ -8625,7 +8606,7 @@ YU
YU
"}
(57,1,1) = {"
-ev
+qp
sa
sa
sa
@@ -8702,7 +8683,7 @@ YU
YU
"}
(58,1,1) = {"
-ev
+qp
sa
sa
sa
@@ -9228,7 +9209,7 @@ Ru
fG
Wl
xh
-EX
+xu
dT
zl
bu
@@ -9767,7 +9748,7 @@ Ru
fG
gn
xh
-yC
+Zc
im
Pm
dT
diff --git a/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm b/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm
index 757931fd667f..7e941ad57cba 100644
--- a/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm
+++ b/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm
@@ -212,7 +212,7 @@
},
/area/ruin/unpowered)
"ie" = (
-/obj/structure/closet/crate/grave{
+/obj/structure/closet/crate/grave/loot{
desc = "Here lies our great brother and infamous pirate"
},
/obj/effect/decal/cleanable/dirt/dust,
diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_icecropolis.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_icecropolis.dmm
index d2d296cc1d8c..529c6f52abcf 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_underground_icecropolis.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_underground_icecropolis.dmm
@@ -2062,7 +2062,7 @@
/area/ruin/unpowered/icecropolis/gold)
"LQ" = (
/obj/structure/stone_tile/slab,
-/obj/structure/chair/bronze{
+/obj/structure/chair/comfy/shuttle/bronze{
dir = 8
},
/turf/open/indestructible/boss/air,
@@ -2178,7 +2178,7 @@
/turf/open/indestructible/boss/air,
/area/ruin/unpowered/icecropolis/gold)
"Os" = (
-/obj/structure/chair/bronze{
+/obj/structure/chair/comfy/shuttle/bronze{
dir = 8
},
/turf/open/floor/wood/icecropolis,
diff --git a/_maps/RandomRuins/JungleRuins/jungle_demon.dmm b/_maps/RandomRuins/JungleRuins/jungle_demon.dmm
index 5c518ed7dd51..e375a1a0d12c 100644
--- a/_maps/RandomRuins/JungleRuins/jungle_demon.dmm
+++ b/_maps/RandomRuins/JungleRuins/jungle_demon.dmm
@@ -175,7 +175,7 @@
/turf/open/floor/plasteel/dark,
/area/ruin/powered)
"rc" = (
-/obj/structure/closet/crate/grave,
+/obj/structure/closet/crate/grave/loot,
/turf/open/floor/plating/dirt/jungle/lit,
/area/ruin/unpowered)
"rx" = (
diff --git a/_maps/RandomRuins/JungleRuins/jungle_medtech_outbreak.dmm b/_maps/RandomRuins/JungleRuins/jungle_medtech_outbreak.dmm
index 65068fa3fe27..022e5a8b1d7b 100644
--- a/_maps/RandomRuins/JungleRuins/jungle_medtech_outbreak.dmm
+++ b/_maps/RandomRuins/JungleRuins/jungle_medtech_outbreak.dmm
@@ -1534,7 +1534,7 @@
/turf/open/floor/plating/dirt/jungle/wasteland/lit,
/area/ruin/jungle)
"yW" = (
-/obj/structure/closet/crate/grave,
+/obj/structure/closet/crate/grave/loot,
/turf/open/floor/plating/dirt/jungle/wasteland/lit,
/area/ruin/jungle)
"yZ" = (
diff --git a/_maps/RandomRuins/JungleRuins/jungle_seedling.dmm b/_maps/RandomRuins/JungleRuins/jungle_seedling.dmm
index f4bd9c4fe94a..4a4dc539f877 100644
--- a/_maps/RandomRuins/JungleRuins/jungle_seedling.dmm
+++ b/_maps/RandomRuins/JungleRuins/jungle_seedling.dmm
@@ -57,7 +57,6 @@
/obj/item/organ/cyberimp/arm/surgery,
/obj/item/organ/eyes/night_vision/mushroom,
/obj/item/organ/heart/cybernetic/tier3,
-/obj/item/organ/liver/dwarf,
/obj/item/organ/liver/plasmaman,
/obj/item/organ/tongue/robot,
/obj/item/organ/moth_wings,
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_comm_outpost.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_comm_outpost.dmm
index fd8b2f0dd6b9..8bd664c74a07 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_comm_outpost.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_comm_outpost.dmm
@@ -158,7 +158,7 @@
},
/area/ruin/unpowered/syndicate_outpost)
"MK" = (
-/obj/structure/closet/crate/grave,
+/obj/structure/closet/crate/grave/loot,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/syndicate_outpost)
"NT" = (
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm
index 59daf228c50c..4e45afdabceb 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm
@@ -10,7 +10,7 @@
/area/ruin/unpowered/elephant_graveyard)
"ad" = (
/obj/effect/decal/cleanable/cobweb,
-/obj/structure/closet/crate/grave/lead_researcher,
+/obj/structure/closet/crate/grave/loot/lead_researcher,
/obj/effect/decal/cleanable/blood/gibs/old,
/obj/effect/mob_spawn/human/skeleton,
/turf/open/floor/plating/asteroid/basalt/wasteland,
@@ -383,7 +383,7 @@
/area/ruin/unpowered/elephant_graveyard)
"bM" = (
/obj/item/storage/fancy/cigarettes/cigpack_mindbreaker,
-/obj/structure/closet/crate/grave,
+/obj/structure/closet/crate/grave/loot,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
"bN" = (
@@ -505,7 +505,7 @@
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
"cl" = (
-/obj/structure/closet/crate/grave,
+/obj/structure/closet/crate/grave/loot,
/obj/effect/mob_spawn/human/skeleton,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
@@ -558,7 +558,7 @@
/turf/open/floor/mineral/titanium/white,
/area/ruin/powered/graveyard_shuttle)
"cw" = (
-/obj/structure/closet/crate/grave,
+/obj/structure/closet/crate/grave/loot,
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/mob_spawn/human/skeleton,
/turf/open/floor/plating/asteroid/basalt/wasteland,
diff --git a/_maps/RandomRuins/ReebeRuins/reebe_arena.dmm b/_maps/RandomRuins/ReebeRuins/reebe_arena.dmm
index 54d5adb49d9f..448690c0e77a 100644
--- a/_maps/RandomRuins/ReebeRuins/reebe_arena.dmm
+++ b/_maps/RandomRuins/ReebeRuins/reebe_arena.dmm
@@ -27,7 +27,7 @@
/turf/open/floor/bronze,
/area/ruin/reebe)
"hO" = (
-/obj/structure/chair/bronze{
+/obj/structure/chair/comfy/shuttle/bronze{
dir = 4
},
/turf/open/floor/bronze,
@@ -55,7 +55,7 @@
/turf/open/floor/bronze,
/area/ruin/reebe)
"qC" = (
-/obj/structure/chair/bronze,
+/obj/structure/chair/comfy/shuttle/bronze,
/obj/item/nullrod/spear,
/turf/open/floor/bronze,
/area/ruin/reebe)
@@ -84,7 +84,7 @@
/turf/open/chasm/reebe_void,
/area/ruin/reebe)
"zu" = (
-/obj/structure/chair/bronze{
+/obj/structure/chair/comfy/shuttle/bronze{
dir = 8
},
/turf/open/floor/bronze,
@@ -170,7 +170,7 @@
/turf/open/floor/bronze,
/area/ruin/reebe)
"JC" = (
-/obj/structure/chair/bronze{
+/obj/structure/chair/comfy/shuttle/bronze{
dir = 1
},
/turf/open/floor/bronze,
diff --git a/_maps/RandomRuins/RockRuins/rockplanet_clock.dmm b/_maps/RandomRuins/RockRuins/rockplanet_clock.dmm
index 754fd1664c38..3a8da9995006 100644
--- a/_maps/RandomRuins/RockRuins/rockplanet_clock.dmm
+++ b/_maps/RandomRuins/RockRuins/rockplanet_clock.dmm
@@ -75,7 +75,7 @@
/area/ruin/powered)
"kd" = (
/obj/structure/fluff/clockwork/alloy_shards/medium_gearbit,
-/obj/structure/chair/bronze{
+/obj/structure/chair/comfy/shuttle/bronze{
dir = 4
},
/turf/open/floor/bronze,
@@ -90,7 +90,7 @@
/turf/open/floor/bronze,
/area/ruin/powered)
"mG" = (
-/obj/structure/chair/bronze,
+/obj/structure/chair/comfy/shuttle/bronze,
/turf/open/floor/bronze,
/area/ruin/powered)
"nM" = (
@@ -173,11 +173,11 @@
/area/ruin/powered)
"xt" = (
/obj/structure/fluff/clockwork/alloy_shards/medium_gearbit,
-/obj/structure/closet/crate/grave,
+/obj/structure/closet/crate/grave/loot,
/turf/open/floor/plating/asteroid/rockplanet/lit,
/area/overmap_encounter/planetoid/rockplanet/explored)
"xV" = (
-/obj/structure/chair/bronze{
+/obj/structure/chair/comfy/shuttle/bronze{
dir = 4
},
/obj/effect/decal/cleanable/blood/old,
@@ -188,7 +188,7 @@
/turf/open/floor/bronze,
/area/ruin/powered)
"zz" = (
-/obj/structure/chair/bronze,
+/obj/structure/chair/comfy/shuttle/bronze,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/bronze,
/area/ruin/powered)
@@ -212,7 +212,7 @@
/turf/open/floor/bronze,
/area/ruin/powered)
"EB" = (
-/obj/structure/closet/crate/grave,
+/obj/structure/closet/crate/grave/loot,
/turf/open/floor/plating/asteroid/rockplanet/lit,
/area/overmap_encounter/planetoid/rockplanet/explored)
"FE" = (
@@ -297,7 +297,7 @@
/turf/closed/wall/mineral/bronze,
/area/ruin/powered)
"Rt" = (
-/obj/structure/chair/bronze{
+/obj/structure/chair/comfy/shuttle/bronze{
dir = 4
},
/turf/open/floor/bronze,
@@ -365,7 +365,7 @@
/turf/open/floor/plating/asteroid/rockplanet/lit,
/area/overmap_encounter/planetoid/rockplanet/explored)
"ZY" = (
-/obj/structure/chair/bronze{
+/obj/structure/chair/comfy/shuttle/bronze{
dir = 8
},
/turf/open/floor/bronze,
diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm
index df1ba2082d3e..3a1b95cb19ca 100644
--- a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm
+++ b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm
@@ -42,7 +42,7 @@
},
/area/whitesands/surface/outdoors)
"bO" = (
-/obj/structure/closet/crate/grave,
+/obj/structure/closet/crate/grave/loot,
/obj/item/ammo_casing/shotgun/meteorslug,
/turf/open/floor/plating/asteroid/whitesands{
light_range = 2
@@ -211,7 +211,7 @@
},
/area/whitesands/surface/outdoors)
"ig" = (
-/obj/structure/closet/crate/grave,
+/obj/structure/closet/crate/grave/loot,
/turf/open/floor/plating/asteroid/whitesands{
light_range = 2
},
diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_saloon.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_saloon.dmm
index 6c16dc5b7c7b..c9c0252fd786 100644
--- a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_saloon.dmm
+++ b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_saloon.dmm
@@ -544,7 +544,7 @@
/turf/open/floor/wood,
/area/ruin/whitesands/saloon)
"ph" = (
-/obj/structure/closet/crate/grave,
+/obj/structure/closet/crate/grave/loot,
/obj/item/gun/ballistic/derringer/traitor,
/turf/open/floor/plating/asteroid/whitesands/grass/lit,
/area/ruin/whitesands/saloon)
@@ -1515,7 +1515,7 @@
},
/area/ruin/whitesands/saloon)
"Ux" = (
-/obj/structure/closet/crate/grave,
+/obj/structure/closet/crate/grave/loot,
/obj/item/gun/ballistic/derringer,
/turf/open/floor/plating/asteroid/whitesands/grass/lit,
/area/ruin/whitesands/saloon)
diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_pod.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_pod.dmm
index f369cee46c4d..e62116ca468c 100644
--- a/_maps/RandomRuins/WasteRuins/wasteplanet_pod.dmm
+++ b/_maps/RandomRuins/WasteRuins/wasteplanet_pod.dmm
@@ -3,7 +3,7 @@
/turf/template_noop,
/area/template_noop)
"f" = (
-/obj/structure/closet/crate/grave,
+/obj/structure/closet/crate/grave/loot,
/turf/open/floor/plating/asteroid/wasteplanet,
/area/overmap_encounter/planetoid/rockplanet/explored)
"g" = (
diff --git a/_maps/configs/independent_beluga.json b/_maps/configs/independent_beluga.json
index 8894d6bd1c9a..dcbcba91b54d 100644
--- a/_maps/configs/independent_beluga.json
+++ b/_maps/configs/independent_beluga.json
@@ -5,6 +5,13 @@
"namelists": ["CRUISE", "NATURAL"],
"map_short_name": "Beluga-class",
"map_path": "_maps/shuttles/shiptest/independent_beluga.dmm",
+ "description": "The Beluga-Class is a transport vessel for those with especially rich blood. Featuring a modest kitchen, hired Inteq security, and luxurious decoration, the Beluga is a first choice pick for many wealthy spacers trying to get from point A to B. The independent ship features several rooms for its guests and a well furnished meeting room for any corporate occassion.",
+ "tags": [
+ "RP Focus",
+ "Riot",
+ "Service"
+ ],
+ "starting_funds": 4000,
"limit": 2,
"roundstart": true,
"job_slots": {
@@ -28,11 +35,20 @@
},
"High-Class Passenger": {
"outfit": "/datum/outfit/job/lawyer/passenger",
- "slots" : 4
+ "slots": 4
},
- "Bartender": 1,
- "Janitor": 1,
- "Assistant": 2
+ "Bartender": {
+ "outfit": "/datum/outfit/job/bartender",
+ "slots": 1
+ },
+ "Janitor": {
+ "outfit": "/datum/outfit/job/janitor",
+ "slots": 1
+ },
+ "Assistant": {
+ "outfit": "/datum/outfit/job/assistant",
+ "slots": 2
+ }
},
"enabled": true
}
diff --git a/_maps/configs/independent_box.json b/_maps/configs/independent_box.json
index 351180269be7..f4a836900702 100644
--- a/_maps/configs/independent_box.json
+++ b/_maps/configs/independent_box.json
@@ -2,6 +2,10 @@
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"map_name": "Box-class Hospital Ship",
"map_short_name": "Box-class",
+ "description": "An early exemplar of several modern shipbuilding techniques that have since become standard, the Box is effectively a tiny spaceborne hospital, loaded with medical equipment that can often be difficult to source in Frontier space. Unusually, Boxes come equipped with medical cryo tubes, which have become a particular rarity on the Frontier due to their delicate nature and steep upkeep costs. Boxes are often found in surprisingly good repair for their age, and they have received several upgrades over the decades that have kept them well abreast of advances in medical science.",
+ "tags": [
+ "Medical"
+ ],
"map_path": "_maps/shuttles/shiptest/independent_box.dmm",
"namelists": [
"GENERAL",
@@ -10,13 +14,22 @@
],
"prefix": "ISV",
"job_slots": {
- "Chief Medical Officer": 1,
+ "Chief Medical Officer": {
+ "outfit": "/datum/outfit/job/cmo",
+ "slots": 1
+ },
"Medical Doctor": {
"outfit": "/datum/outfit/job/doctor",
"slots": 3
},
- "Paramedic": 2,
- "Assistant": 3
+ "Paramedic": {
+ "outfit": "/datum/outfit/job/paramedic",
+ "slots": 2
+ },
+ "Assistant": {
+ "outfit": "/datum/outfit/job/assistant",
+ "slots": 3
+ }
},
"enabled": true
}
diff --git a/_maps/configs/independent_boyardee.json b/_maps/configs/independent_boyardee.json
index cb830aea99cc..f5f14556d842 100644
--- a/_maps/configs/independent_boyardee.json
+++ b/_maps/configs/independent_boyardee.json
@@ -2,11 +2,18 @@
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"map_name": "Boyardee-class Entertainment Vessel",
"prefix": "ISV",
+ "description": "Named for an ancient Solarian folk hero known for providing food to the masses shortly after the Night of Fire, the Boyardee-class is a remarkably popular civilian vessel, and a welcome sight to any weary travelers tired of synthesized tap water and stale rations for breakfast, lunch and dinner every day. The Boyardee-class features a full bar, an advanced hydroponics setup, a large kitchen and an expansive seating area, perfect for serving hungry customers and thirsty colonists. During the early days of the Syndicate, associated organizations would often create their own retrofits of the Boyardee to serve as recruiting centers or “shore-leave” posts, though these variants have mostly ceased to exist in the Frontier.",
+ "tags": [
+ "Service",
+ "Botany",
+ "RP Focus"
+ ],
"namelists": [
"GENERAL",
"SPACE",
"MERCANTILE"
],
+ "starting_funds": 5000,
"map_short_name": "Boyardee-class",
"map_path": "_maps/shuttles/shiptest/independent_boyardee.dmm",
"job_slots": {
@@ -14,9 +21,18 @@
"outfit": "/datum/outfit/job/bartender",
"slots": 1
},
- "Cook": 3,
- "Botanist": 2,
- "Janitor": 1,
+ "Cook": {
+ "outfit": "/datum/outfit/job/cook",
+ "slots": 3
+ },
+ "Botanist": {
+ "outfit": "/datum/outfit/job/botanist",
+ "slots": 2
+ },
+ "Janitor": {
+ "outfit": "/datum/outfit/job/janitor",
+ "slots": 1
+ },
"Waiter": {
"outfit": "/datum/outfit/job/assistant/waiter",
"slots": 2
diff --git a/_maps/configs/independent_bubble.json b/_maps/configs/independent_bubble.json
index f1f385274bf3..6c94b80564ee 100644
--- a/_maps/configs/independent_bubble.json
+++ b/_maps/configs/independent_bubble.json
@@ -3,6 +3,11 @@
"map_name": "Bubble-class Colonial Ship",
"map_short_name": "Bubble-class",
"map_path": "_maps/shuttles/shiptest/independent_bubble.dmm",
+ "description": "While the most famous colony ships were hulking, highly-advanced affairs designed to ferry hundreds-if-not-thousands of settlers to far-off worlds and create cities in a matter of months – the Kalixcian Moonlight, the Candor, the First Train to Fort Sol – the Bubble-class is designed to cater to homesteaders aiming to establish a small ranch or village out in the great vastness of space. The Bubble-class is highly compact but complete with all the necessities for colony creation – extensive R&D equipment, robust mining gear, and a small selection of personal arms for fending off hostile fauna. While the Bubble-class has been historically utilized by the Solarian Federation for colony efforts, their proprietary version has recently been phased out of operation.",
+ "tags": [
+ "Generalist",
+ "Construction"
+ ],
"namelists": [
"GENERAL",
"SPACE"
@@ -10,11 +15,26 @@
"prefix": "ISV",
"limit": 1,
"job_slots": {
- "Captain": 1,
- "Scientist": 1,
- "Station Engineer": 1,
- "Shaft Miner": 1,
- "Assistant": 3
+ "Captain": {
+ "outfit": "/datum/outfit/job/captain",
+ "slots": 1
+ },
+ "Scientist": {
+ "outfit": "/datum/outfit/job/scientist",
+ "slots": 1
+ },
+ "Station Engineer": {
+ "outfit": "/datum/outfit/job/engineer",
+ "slots": 1
+ },
+ "Shaft Miner": {
+ "outfit": "/datum/outfit/job/miner",
+ "slots": 1
+ },
+ "Assistant": {
+ "outfit": "/datum/outfit/job/assistant",
+ "slots": 3
+ }
},
"enabled": false
}
diff --git a/_maps/configs/independent_byo.json b/_maps/configs/independent_byo.json
index 50f78396cf0d..36fc8718678a 100644
--- a/_maps/configs/independent_byo.json
+++ b/_maps/configs/independent_byo.json
@@ -3,6 +3,11 @@
"map_name": "BYO-class Do-It-Yourself Enthusiast Special",
"map_short_name": "BYO-class",
"map_path": "_maps/shuttles/shiptest/independent_byo.dmm",
+ "description": "The BYO can barely be considered a “ship” when initially deployed; more of a construction platform launched hazardously into space. The only thing that separates crews on a BYO from breathable safety and the cold vacuum of space are typically little airtight flaps of plastic. Equipped with a plethora of building material and tools fit for construction, BYO vessels are seen in a variety of shapes and sizes, and almost never with any consistency of form.",
+ "tags": [
+ "Engineering",
+ "Construction"
+ ],
"namelists": [
"ENGINEERING",
"GENERAL"
diff --git a/_maps/configs/independent_caravan.json b/_maps/configs/independent_caravan.json
index d4e64be8ac6b..3e244cbf49b5 100644
--- a/_maps/configs/independent_caravan.json
+++ b/_maps/configs/independent_caravan.json
@@ -4,6 +4,11 @@
"map_short_name": "Caravan-class",
"map_path": "_maps/shuttles/shiptest/independent_caravan.dmm",
"prefix": "ISV",
+ "description": "The Caravan is a relatively new freighter pattern, designed around a modular pod system that enables the ship to serve in a variety of roles beyond simple transportation. These pods are designed around a quick-release mechanism that allows the main hull to bluespace jump in, detach the pods, and load a new set of empty Caravan-type pods in a matter of minutes. While impressive in theory, the lack of empty compatible cargo pods in Frontier space renders the quick-detach system useless. Additionally, the modular attachment system is prone to wear and tear, necessitating more frequent and costly maintenance than other freighters. Despite these shortcomings, the Caravan has still earned a reputation as a versatile platform for a variety of missions. The main hull features a robust power pack and respectable crew accommodations, and most examples on the Frontier carry pods loaded for mining and survey duties.",
+ "tags": [
+ "Generalist",
+ "Engineering"
+ ],
"namelists": [
"GENERAL",
"SPACE",
@@ -33,7 +38,10 @@
"outfit": "/datum/outfit/job/scientist",
"slots": 1
},
- "Assistant": 1
+ "Assistant": {
+ "outfit": "/datum/outfit/job/assistant",
+ "slots": 1
+ }
},
"enabled": true
}
diff --git a/_maps/configs/independent_dwayne.json b/_maps/configs/independent_dwayne.json
index 128c73aaad41..2d312fabc045 100644
--- a/_maps/configs/independent_dwayne.json
+++ b/_maps/configs/independent_dwayne.json
@@ -10,6 +10,11 @@
],
"map_short_name": "Mk.II Dwayne-class ",
"map_path": "_maps/shuttles/shiptest/independent_dwayne.dmm",
+ "description": "The Dwayne is one of the older classes of ships commonly seen on the Frontier, and one of the few such classes that doesn’t also carry a reputation for nightmarish conditions or high accident rates. Originally conceived of as a “mothership” for Nanotrasen mining shuttles that could enable long-duration mining missions at minimal cost, severe budget overruns and issues with the mining shuttle docking system left Nanotrasen with a massive number of mostly-completed hulls upon the project’s cancellation. These hulls were then quickly refurbished and sold on the civilian market, where they proved an immediate success on the Frontier. Contemporary Dwaynes can typically be found carrying a variety of mining equipment and extensive modifications unique to their captains. Recently-available aftermarket modifications have solved the Dwayne’s longstanding shuttle dock issues, allowing modern Dwaynes to finally serve their original design purpose, provided the captain is able to source a shuttle.",
+ "tags": [
+ "Mining",
+ "Generalist"
+ ],
"roundstart": true,
"limit": 1,
"job_slots": {
diff --git a/_maps/configs/independent_halftrack.json b/_maps/configs/independent_halftrack.json
index 69c63948ffa0..65d63f6df6cc 100644
--- a/_maps/configs/independent_halftrack.json
+++ b/_maps/configs/independent_halftrack.json
@@ -7,9 +7,17 @@
"WEAPONS"
],
"map_short_name": "Halftrack-Class",
+ "description": "A rare sight in the Frontier (but a welcome one), the Halftrack-class is a heavily retrofitted variant of the Li Tieguai-class Rescue Ship, used as a mobile firearms shop by enterprising arms dealers everywhere. While initial variants of the vessel were more obviously just the Li Tieguai with the medical fixtures stripped out and replaced with gun racks and ammunition lockers, the modern iteration of the Halftrack comes complete with a firing range, an Inteq-certified security compliment and a centralized sales floor perfect for showing off the wares while keeping them safe at the same time.",
+ "tags": [
+ "Combat",
+ "Cargo"
+ ],
"map_path": "_maps/shuttles/shiptest/independent_halftrack.dmm",
"job_slots": {
- "Captain": 1,
+ "Captain": {
+ "outfit": "/datum/outfit/job/captain",
+ "slots": 1
+ },
"IRMG Vanguard": {
"outfit": "/datum/outfit/job/captain/inteq",
"officer": true,
diff --git a/_maps/configs/independent_junker.json b/_maps/configs/independent_junker.json
new file mode 100644
index 000000000000..26d3ab445766
--- /dev/null
+++ b/_maps/configs/independent_junker.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
+ "map_name": "Junker-class Salvaged Ship",
+ "prefix": "ISV",
+ "namelists": [
+ "GENERAL",
+ "SPACE"
+ ],
+ "map_short_name": "Junker-class",
+ "description": "The Junker-class is not an official class, but rather the name for a general group of designs crafted from the ruins of old ships or stations. These ships became a common sight during the ICW, as deserters fled areas of conflict on these 'junkers', unprepared for the challenges of spacer life. They have since become a rare sight, and the few surviving crews of these ships typically bear a sense of disdain to ordinary power structures, and usually have no defined captain, or even owner, of the vessel.",
+ "tags": [
+ "Survival Challenge"
+ ],
+ "starting_funds": 0,
+ "map_path": "_maps/shuttles/shiptest/independent_junker.dmm",
+ "limit": 1,
+ "job_slots": {
+ "Assistant": {
+ "outfit": "/datum/outfit/job/assistant",
+ "slots": 4
+ }
+ },
+ "enabled": true
+}
diff --git a/_maps/configs/independent_kilo.json b/_maps/configs/independent_kilo.json
index b840570c84ba..7877bbfcd08e 100644
--- a/_maps/configs/independent_kilo.json
+++ b/_maps/configs/independent_kilo.json
@@ -1,6 +1,10 @@
{
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"map_name": "Kilo-class Mining Ship",
+ "description": "The Kilo-class is a miniscule mining ship that stretches the definition of an independently-capable spacecraft. Beginning life long ago as a series of purpose-built mining shuttles intended for use on Frontier outposts, progressive cycles of over-engineering for a longer mission duration eventually produced the lumpen, claustrophobic Kilo seen today. Once quite numerous, Kilos are still a common “barn find” on abandoned stations and forgotten storage bays, and their extreme age and poor storage conditions typically leaves them in especially poor condition. Kilo crews are often considered to be quite eccentric even by Frontier standards, and some spacers insist even a well-balanced spacer will quickly come unglued in the Kilo’s “unique” environment.",
+ "tags": [
+ "Generalist"
+ ],
"prefix": "ISV",
"namelists": [
"GENERAL",
@@ -8,6 +12,7 @@
"NATURAL"
],
"map_short_name": "Kilo-class",
+ "starting_funds": 1500,
"map_path": "_maps/shuttles/shiptest/independent_kilo.dmm",
"job_slots": {
"Captain": {
diff --git a/_maps/configs/independent_lagoon.json b/_maps/configs/independent_lagoon.json
index 725f16a6c32f..3be6a5d95b74 100644
--- a/_maps/configs/independent_lagoon.json
+++ b/_maps/configs/independent_lagoon.json
@@ -2,29 +2,63 @@
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"map_name": "Lagoon-class Cruise Ship",
"prefix": "ISV",
+ "description": "An unusual sight in the relatively impoverished Frontier, the Lagoon-class is a large pleasure vessel dedicated to transporting its passengers to any number of exotic locales. Lagoons found on the Frontier tend to contain crews and passengers of a particularly daring – or foolhardy – character, willing to pay out the nose for a tour of some of the most dangerous regions in known space. Accordingly, Lagoons in these regions typically include a small but respectably equipped security contingent to protect (and, when necessary, rein in) the passengers, and come with a surprisingly powerful thermo-electric generator to move the ship’s prodigious bulk across vast expanses of space.",
+ "tags": [
+ "RP Focus",
+ "Service",
+ "Engineering"
+ ],
"namelists": [
"CRUISE"
],
"map_short_name": "Lagoon-class",
"map_path": "_maps/shuttles/shiptest/independent_lagoon.dmm",
+ "starting_funds": 3000,
"job_slots": {
- "Captain": 1,
+ "Captain": {
+ "outfit": "/datum/outfit/job/captain",
+ "slots": 1
+ },
"Cruise Director": {
"outfit": "/datum/outfit/job/head_of_personnel",
"slots": 1
},
- "Security Officer": 2,
- "Medical Doctor": 1,
+ "Security Officer": {
+ "outfit": "/datum/outfit/job/security",
+ "slots": 2
+ },
+ "Medical Doctor": {
+ "outfit": "/datum/outfit/job/doctor",
+ "slots": 1
+ },
"Ship Engineer": {
"outfit": "/datum/outfit/job/atmos",
"slots": 1
},
- "Bartender": 1,
- "Cook": 1,
- "Botanist": 1,
- "Curator": 1,
- "Chaplain": 1,
- "Janitor": 1,
+ "Bartender": {
+ "outfit": "/datum/outfit/job/bartender",
+ "slots": 1
+ },
+ "Cook": {
+ "outfit": "/datum/outfit/job/cook",
+ "slots": 1
+ },
+ "Botanist": {
+ "outfit": "/datum/outfit/job/botanist",
+ "slots": 1
+ },
+ "Curator": {
+ "outfit": "/datum/outfit/job/curator",
+ "slots": 1
+ },
+ "Chaplain": {
+ "outfit": "/datum/outfit/job/chaplain",
+ "slots": 1
+ },
+ "Janitor": {
+ "outfit": "/datum/outfit/job/janitor",
+ "slots": 1
+ },
"Passenger": {
"outfit": "/datum/outfit/job/assistant/corporate",
"slots": 10
diff --git a/_maps/configs/independent_litieguai.json b/_maps/configs/independent_litieguai.json
index aadf6e7a460c..8128d3f6c980 100644
--- a/_maps/configs/independent_litieguai.json
+++ b/_maps/configs/independent_litieguai.json
@@ -2,6 +2,10 @@
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"map_name": "Li Tieguai-class Rescue Ship",
"map_short_name": "Li Tieguai-class",
+ "description": "A small, nimble, and exceptionally well-built medical response vessel, the Li Tieguai is a recent addition to Cybersun’s fleet, forming a critical component of their Frontier stabilization program. Li Tieguais come equipped with high-end medical equipment, including a selection of Cybersun augments and prosthetics, as well as weaponry and armor sufficient to protect its personnel in the often-dangerous Frontier sectors, so that they can offer premium healthcare (at premium prices) in even the most dangerous of scenarios.",
+ "tags": [
+ "Medical"
+ ],
"map_path": "_maps/shuttles/shiptest/independent_litieguai.dmm",
"namelists": [
"SPACE",
@@ -9,7 +13,10 @@
"NATURAL_AGGRESSIVE"
],
"job_slots": {
- "Captain": 1,
+ "Captain": {
+ "outfit": "/datum/outfit/job/captain",
+ "slots": 1
+ },
"Chief Medical Officer": {
"outfit": "/datum/outfit/job/cmo/medicaldirector",
"officer": true,
diff --git a/_maps/configs/independent_masinyane.json b/_maps/configs/independent_masinyane.json
index fb5d2c35f907..4c4cdd330ecb 100644
--- a/_maps/configs/independent_masinyane.json
+++ b/_maps/configs/independent_masinyane.json
@@ -2,6 +2,10 @@
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"map_name": "Masinyane-Class Personal Shuttle",
"map_short_name": "Masinyane-Class",
+ "description": "The Masinyane is the sports car of space, with the price tag to match. Staggeringly fast and equipped with top of the line gear, Masinyanes are generally found in the hands of lone pilots with far more money than sense. The Masinyane was only ever produced in very limited numbers, and a series of fraud investigations involving a complex web of production contractors and shell companies have effectively put a halt to any further production. As such, they are exceedingly rare even in the core worlds – on the Frontier, they are practically non-existent.",
+ "tags": [
+ "Generalist"
+ ],
"prefix": "ISV",
"namelists": [
"MYTHOLOGICAL",
diff --git a/_maps/configs/independent_meta.json b/_maps/configs/independent_meta.json
index 8b9b7c990467..26bd1504b3a9 100644
--- a/_maps/configs/independent_meta.json
+++ b/_maps/configs/independent_meta.json
@@ -3,6 +3,11 @@
"map_name": "Meta-class Freighter",
"prefix": "ISV",
"map_short_name": "Meta-class",
+ "description": "The Meta-class is a small freight vessel, and even before the ICW was a common sight on the Frontier as a tramp freighter, running independent contracts between the myriad outposts of the area (with, occasionally, some smuggling or mining on the side). Since the collapse of Nanotrasen’s logistics network in the Frontier region, Meta-classes operating in this capacity have exploded in popularity, and are likely to remain a very common sight wherever larger corporations such as Donk! Co. have yet to establish market dominance.",
+ "tags": [
+ "Generalist",
+ "Cargo"
+ ],
"namelists": [
"GENERAL",
"SPACE",
@@ -10,15 +15,30 @@
],
"map_path": "_maps/shuttles/shiptest/independent_meta.dmm",
"job_slots": {
- "Captain": 1,
- "Quartermaster": 1,
+ "Captain": {
+ "outfit": "/datum/outfit/job/captain",
+ "slots": 1
+ },
+ "Quartermaster": {
+ "outfit": "/datum/outfit/job/quartermaster",
+ "slots": 1
+ },
"Medical Doctor": {
"outfit": "/datum/outfit/job/doctor",
"slots": 1
},
- "Station Engineer": 1,
- "Shaft Miner": 1,
- "Assistant": 3
+ "Station Engineer": {
+ "outfit": "/datum/outfit/job/engineer",
+ "slots": 1
+ },
+ "Shaft Miner": {
+ "outfit": "/datum/outfit/job/miner",
+ "slots": 1
+ },
+ "Assistant": {
+ "outfit": "/datum/outfit/job/assistant",
+ "slots": 3
+ }
},
"enabled": true
}
diff --git a/_maps/configs/independent_metis.json b/_maps/configs/independent_metis.json
index 516cc255280a..ce0cb6fa7151 100644
--- a/_maps/configs/independent_metis.json
+++ b/_maps/configs/independent_metis.json
@@ -2,12 +2,19 @@
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"map_name": "Metis-class Experimental Extrasolar Pathfinder",
"map_short_name": "Metis-class",
+ "description": "The elderly Metis-class is effectively a mobile research barge, a large and ungainly hunk of titanium outfitted with a wide variety of scientific facilities and equipment. While the specifics of any given Metis are subject to extreme variance, common features include AI facilities, xenobiological research chambers, and robotics equipment. Due to the dangerous and often tenuously-legal research typically pursued on the Frontier as well as tight budgets and low safety investment common to independent research teams, the Metis-class has earned a reputation for disaster, and abandoned Metises overrun with xenofauna or rogue machines are a disturbingly common sight in some parts of the Frontier.",
+ "tags": [
+ "Science",
+ "Robotics",
+ "Survival Challenge"
+ ],
"map_path": "_maps/shuttles/shiptest/independent_metis.dmm",
"prefix": "ISV",
"namelists": [
"SPACE"
],
- "limit": 2,
+ "limit": 1,
+ "starting_funds": 500,
"job_slots": {
"Extraterrestrial Exploratory Project Supervisor": {
"outfit": "/datum/outfit/job/rd",
diff --git a/_maps/configs/independent_nemo.json b/_maps/configs/independent_nemo.json
index 200450ae7f23..38a86fbcb523 100644
--- a/_maps/configs/independent_nemo.json
+++ b/_maps/configs/independent_nemo.json
@@ -8,9 +8,19 @@
"SPACE"
],
"map_short_name": "Nemo-class",
+ "description": "The Nemo-Class is an eccentric collector’s dream vessel, perfectly suited to all the journalists, antiquarians and kooks of the Frontier. Featuring a comfortable study, a full robotics workshop (perfectly suited to building yourself some assistants!) and a host of esoteric weapons suitable for hunting creatures to mount above your fireplace. Other highlights include a compact-yet-functional medical bay, a reasonably well-designed engineering bay and a large array of mining equipment.",
+ "tags": [
+ "Engineering",
+ "Mining",
+ "Robotics"
+ ],
+ "starting_funds": 500,
"map_path": "_maps/shuttles/shiptest/independent_nemo.dmm",
"job_slots": {
- "Research Director": 1,
+ "Research Director": {
+ "outfit": "/datum/outfit/job/rd",
+ "slots": 1
+ },
"Fauna Researcher": {
"outfit": "/datum/outfit/job/scientist",
"slots": 1
@@ -31,9 +41,18 @@
"outfit": "/datum/outfit/job/engineer/maintenancetechnician",
"slots": 1
},
- "Atmospheric Technician": 1,
- "Curator": 1,
- "Assistant": 1
+ "Atmospheric Technician": {
+ "outfit": "/datum/outfit/job/atmos",
+ "slots": 1
+ },
+ "Curator": {
+ "outfit": "/datum/outfit/job/curator",
+ "slots": 1
+ },
+ "Assistant": {
+ "outfit": "/datum/outfit/job/assistant",
+ "slots": 1
+ }
},
"enabled": true
}
diff --git a/_maps/configs/independent_pill.json b/_maps/configs/independent_pill.json
index 07e72b82bb9b..18b1a3968033 100644
--- a/_maps/configs/independent_pill.json
+++ b/_maps/configs/independent_pill.json
@@ -7,10 +7,18 @@
"PIRATES"
],
"map_short_name": "Pillbottle-class",
+ "description": "The “Pillbottle,” as a class, should not rightfully exist. Tell-tale signs indicate that these ships originated as bulk carriers and tugs, but they have since been haphazardly converted into a carrier of sorts for a wing of Pill-class escape pods. As with the Pills, Pillbottles are crewed entirely by escaped prisoners, and as a rule, they operate in a state of complete anarchy. The only consistent aspect of Pillbottle crews is their inconsistency, but the realities of prison life tend to make the worst out of anyone.",
+ "tags": [
+ "Specialist"
+ ],
"map_path": "_maps/shuttles/shiptest/independent_pillbottle.dmm",
"limit":1,
+ "starting_funds": 0,
"job_slots": {
- "Prisoner": 10
+ "Prisoner": {
+ "outfit": "/datum/outfit/job/prisoner",
+ "slots": 10
+ }
},
"enabled": false
}
diff --git a/_maps/configs/independent_rigger.json b/_maps/configs/independent_rigger.json
index c43efcdc7f0e..ed778696bd74 100644
--- a/_maps/configs/independent_rigger.json
+++ b/_maps/configs/independent_rigger.json
@@ -9,6 +9,13 @@
"NATURAL_AGGRESSIVE"
],
"map_short_name": "Riggs-class",
+ "description": "The Rigger-class is Kasagi-Fischer Partnership’s mainstay in the independent ship market. Spacious, affordable, and versatile, Riggers offer basic capabilities for everything a Frontier spacer might need in a convenient, easy-to-modify platform, and by default come equipped with a basic medbay, a small security office, atmospherics recycling and equipment to support an APLU utility mech. Thanks to this versatility, Riggers have become extremely popular among moderately-wealthy independent captains, and can be found doing everything from mining to shipping to surveying Frontier planets.",
+ "tags": [
+ "Mining",
+ "Medical",
+ "Robotics",
+ "Generalist"
+ ],
"map_path": "_maps/shuttles/shiptest/independent_rigger.dmm",
"roundstart": true,
"limit": 2,
diff --git a/_maps/configs/independent_rube_goldberg.json b/_maps/configs/independent_rube_goldberg.json
index 82a3fdaebfed..8f538bed67a5 100644
--- a/_maps/configs/independent_rube_goldberg.json
+++ b/_maps/configs/independent_rube_goldberg.json
@@ -7,6 +7,8 @@
],
"map_name": "Rube Goldberg-class Engineering Project",
"map_short_name": "Rube Goldberg-class",
+ "description": "The Rube Goldberg-class Engineering Project is an experience, and a monument to insanity. Featuring a powerful supermatter engine in combination with an Escher-esque structural layout, complicated pipe and wire network, and utter disregard for basic safety procedures and common sense, this ship is a disaster waiting to happen.",
+ "tags": ["Engineering", "Construction"],
"map_path": "_maps/shuttles/shiptest/independent_rube_goldberg.dmm",
"limit": 1,
"job_slots": {
diff --git a/_maps/configs/independent_scav.json b/_maps/configs/independent_scav.json
index 75601ca7d448..0564e6182766 100644
--- a/_maps/configs/independent_scav.json
+++ b/_maps/configs/independent_scav.json
@@ -3,6 +3,10 @@
"map_name": "Scav-class Drifter",
"map_short_name": "Scav-class",
"prefix": "ISV",
+ "description": "One of the cheapest (and yet, inexplicably popular) offerings from Miskilamo Spacefaring, the Scav-class is a compact, speedy vessel purpose-built for enterprising scrappers and looters looking to salvage bombed-out ruins and harvest boatloads of ore. Featuring an ‘innovative’ open-floor plan, a charitable supply of EVA/ruin raiding equipment, and some exotic implements of healing or death-dealing, the Scav-class just keeps on chuggin’!",
+ "tags": [
+ "Generalist"
+ ],
"namelists": [
"NATURAL",
"SPACE"
diff --git a/_maps/configs/independent_schmiedeberg.json b/_maps/configs/independent_schmiedeberg.json
index cb12580f483c..457b8d602f4f 100644
--- a/_maps/configs/independent_schmiedeberg.json
+++ b/_maps/configs/independent_schmiedeberg.json
@@ -3,6 +3,12 @@
"map_name": "Schmiedeberg-class Pharmacology Ship",
"prefix": "IMV",
"map_short_name": "Schmiedeberg-class",
+ "description": "Interested in pharmacological science, but tired of sitting in front of a chemistry dispenser and pushing buttons all day? Eager to combine the culinary arts with the narcotic ones? Hoping to combine all of these qualities with the most important activity of all: making fat stacks of dosh? Then the Schmiedeberg-class is for you! Host to a robust ghetto chemistry lab, a high-efficiency botanical set-up and a complete kitchen-and-storefront, the Schmiedeberg is perfect for back-alley chemists and botanists everywhere.",
+ "tags": [
+ "Botany",
+ "Medical",
+ "Chemistry"
+ ],
"map_path": "_maps/shuttles/shiptest/independent_schmiedeberg.dmm",
"namelists": [
"SUNS",
diff --git a/_maps/configs/independent_shepherd.json b/_maps/configs/independent_shepherd.json
index 652209151a7d..69c44f33341b 100644
--- a/_maps/configs/independent_shepherd.json
+++ b/_maps/configs/independent_shepherd.json
@@ -2,15 +2,30 @@
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"map_name": "Shepherd-Class Space Monastery",
"map_short_name": "Shepherd-class",
+ "description": "Best suited to the vast array of the galaxy’s pilgrims, proselytizers and prophets, the Shephard-class is, in essence, a massive mobile monastery. With a great grassy grove dominating the center of the ship, a torturously tempered temple and a brutalist, yet bountiful botany set-up, the Shepherd is well suited to a large crew eager to preach, purify and pull in new followers.",
+ "tags": [
+ "RP Focus",
+ "Botany",
+ "Service"
+ ],
"map_path": "_maps/shuttles/shiptest/independent_shepherd.dmm",
"prefix": "ISV",
"namelists": [
"MYTHOLOGICAL"
],
"job_slots": {
- "Chaplain": 1,
- "Curator": 1,
- "Station Engineer": 1,
+ "Chaplain": {
+ "outfit": "/datum/outfit/job/chaplain",
+ "slots": 1
+ },
+ "Curator": {
+ "outfit": "/datum/outfit/job/curator",
+ "slots": 1
+ },
+ "Station Engineer": {
+ "outfit": "/datum/outfit/job/engineer",
+ "slots": 1
+ },
"Acolyte": {
"outfit": "/datum/outfit/job/assistant/intern",
"slots": 6
diff --git a/_maps/configs/independent_shetland.json b/_maps/configs/independent_shetland.json
index 0267ca69494c..fc2741514879 100644
--- a/_maps/configs/independent_shetland.json
+++ b/_maps/configs/independent_shetland.json
@@ -7,11 +7,21 @@
"NATURAL"
],
"map_short_name": "Shetland-class",
+ "description": "The Shetland is Miskilamo Spacefaring’s flagship offer and one of their only truly original designs: A huge frigate offering a diverse array of facilities with ample room for expansion at a fraction of the price of the competition. Optimistic customers soon discover the haphazard workmanship and extreme cost-cutting measures common to Miskilamo ships. While Shetlands have plenty of room and a theoretically diverse array of facilities, they come with the minimal amount of equipment needed for those facilities, and a wide array of design deficiencies have given them a grim reputation for driving their crews to paranoid extremes. The waste disposal catapult is a frequent feature of such tales, and supposedly a great many Shetland crewmates have met their end by ejection.",
+ "tags": [
+ "Generalist",
+ "Service",
+ "Medical"
+ ],
"map_path": "_maps/shuttles/shiptest/independent_shetland.dmm",
"map_id": "independent_shetland",
"roundstart": true,
"job_slots": {
- "Captain": 1,
+ "Captain": {
+ "outfit": "/datum/outfit/job/captain",
+ "officer": true,
+ "slots": 1
+ },
"Lieutenant": {
"outfit": "/datum/outfit/job/lieutenant",
"officer": true,
@@ -22,13 +32,22 @@
"officer": true,
"slots": 1
},
- "Medical Doctor": 1,
- "Paramedic": 1,
+ "Medical Doctor": {
+ "outfit": "/datum/outfit/job/doctor",
+ "slots": 1
+ },
+ "Paramedic": {
+ "outfit": "/datum/outfit/job/paramedic",
+ "slots": 1
+ },
"Ship's Engineer": {
"outfit": "/datum/outfit/job/engineer",
"slots": 1
},
- "Atmospheric Technician": 1,
+ "Atmospheric Technician": {
+ "outfit": "/datum/outfit/job/atmos",
+ "slots": 1
+ },
"Asteroid Miner": {
"outfit": "/datum/outfit/job/miner/hazard",
"slots": 2
@@ -37,8 +56,14 @@
"outfit": "/datum/outfit/job/security",
"slots": 1
},
- "Detective": 1,
- "Janitor": 1,
+ "Detective": {
+ "outfit": "/datum/outfit/job/detective",
+ "slots": 1
+ },
+ "Janitor": {
+ "outfit": "/datum/outfit/job/janitor",
+ "slots": 1
+ },
"Deckhand": {
"outfit": "/datum/outfit/job/assistant",
"slots": 5
diff --git a/_maps/configs/independent_tranquility.json b/_maps/configs/independent_tranquility.json
index 2b81ce8e08bc..0d86be477344 100644
--- a/_maps/configs/independent_tranquility.json
+++ b/_maps/configs/independent_tranquility.json
@@ -8,6 +8,12 @@
"NATURAL"
],
"map_short_name": "Tranquility-class",
+ "description": "While most vessels have some form of clear utility in mind – research, mining, cargo hauling, and so on – the Tranquility-class is a notable exception to this rule. The Tranquility is, fittingly, a fairly calm and level-headed affair, modeled around traditional apartment complexes. Fitted with several independent quarters, a large communal canteen and very little in the way of industrial equipment or self-defense tools, Tranquility-classes are often found cruising lazily around the Frontier, getting up to sitcom-esque antics and eschewing the more focused approach of many of their contemporaries.",
+ "tags": [
+ "RP Focus",
+ "Service",
+ "Generalist"
+ ],
"map_path": "_maps/shuttles/shiptest/independent_tranquility.dmm",
"job_slots": {
"Captain": {
diff --git a/_maps/configs/inteq_colossus.json b/_maps/configs/inteq_colossus.json
index a5a6602a5cb0..3447d5c54034 100644
--- a/_maps/configs/inteq_colossus.json
+++ b/_maps/configs/inteq_colossus.json
@@ -2,6 +2,11 @@
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"map_name": "Colossus-Class Armored Frigate",
"prefix": "IRMV",
+ "description": "The mainstay of Inteq’s mercenary fleet, the Colossus is a professionally-militarized freighter like most of Inteq’s ships, and is designed to operate independently for some time, serving IRMG’s interests and providing vital mercenary services wherever they are needed. Key features include a secure and well-stocked armory and ample crew space, as well as a spacious cargo bay, which crews often refurbish into additional recreational or training space.",
+ "tags": [
+ "Combat",
+ "Riot"
+ ],
"namelists": [
"MYTHOLOGICAL",
"BEASTS",
diff --git a/_maps/configs/inteq_hound.json b/_maps/configs/inteq_hound.json
index e201f74e3dd4..9e41959ae6b9 100644
--- a/_maps/configs/inteq_hound.json
+++ b/_maps/configs/inteq_hound.json
@@ -8,6 +8,10 @@
"INTEQ"
],
"map_short_name": "Hound-class",
+ "description": "A light, fast picket and interceptor ship operated by Inteq Risk Management, the Hound offers modest crew space sufficient for a 3-man fireteam of Inteq enforcers, a small cargo bay, powerful engines, a well-stocked armory for its size, and little else. Hounds can typically be found on picket and patrol duty, escorting larger and more vulnerable IRMG ships, or performing any duty that calls for a lightning-fast ship and a handful of very well-armed individuals.",
+ "tags": [
+ "Combat"
+ ],
"map_path": "_maps/shuttles/shiptest/inteq_hound.dmm",
"map_id": "inteq_hound",
"limit": 2,
diff --git a/_maps/configs/inteq_talos.json b/_maps/configs/inteq_talos.json
index a05aada7748f..4ec40fe76812 100644
--- a/_maps/configs/inteq_talos.json
+++ b/_maps/configs/inteq_talos.json
@@ -2,6 +2,11 @@
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"map_name": "Talos-Class Command Clipper",
"prefix": "IRMV",
+ "description": "The Talos is a command and support ship, and a rare example of a purpose-built Inteq ship. Outfitted with an abundance of construction and engineering equipment and a private bluespace communications suite capable of networking IRMG ships across any given system, Taloses are often the lynchpin of coordinated IRMG operations in a system, and offer construction and repair services as part of IRMG’s mercenary offerings. As Talos crews place a larger emphasis on support personnel, they tend to be less well-armed than other Inteq crews. One unusual feature of the Talos is its depressurized “wings” filled with redundant baffles, intended to provide extra durability in the case of impacts or weapons fire. They also double as auxiliary storage space and potential room for modification by their enterprising Artificer crews.",
+ "tags": [
+ "Engineer",
+ "Telecomms"
+ ],
"namelists": [
"MYTHOLOGICAL",
"BEASTS",
diff --git a/_maps/configs/minutemen_asclepius.json b/_maps/configs/minutemen_asclepius.json
index f6c61c9a4f44..26a145841792 100644
--- a/_maps/configs/minutemen_asclepius.json
+++ b/_maps/configs/minutemen_asclepius.json
@@ -2,6 +2,11 @@
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"map_name": "Asclepius-Class Hospital Ship",
"prefix": "CMSV",
+ "description": "The Asclepius is a medical vessel employed by the CMM. Much in CMM fashion it features tight hallways and moderately sized personal quarters. Well stocked in medical supplies, this vessel is known for its capability of fulfilling extensive treatment for patients in sectors where such treatment is otherwise scarce. Stocked with a cryo lab, a morgue, a chemlab, and surgery room, the Asclepius rarely finds difficulty when provided all measures both preventative and restorative.",
+ "tags": [
+ "Medical",
+ "Chemistry"
+ ],
"namelists": [
"COLONIAL MINUTEMEN",
"CMM-BARD",
diff --git a/_maps/configs/minutemen_cepheus.json b/_maps/configs/minutemen_cepheus.json
index 16fd03ba6afe..8712a34b127a 100644
--- a/_maps/configs/minutemen_cepheus.json
+++ b/_maps/configs/minutemen_cepheus.json
@@ -2,6 +2,10 @@
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"map_name": "Cepheus-Class Mech Carrier",
"prefix": "CMSV",
+ "description": "The Cepheus is the go-to for the CMM whenever it wishes to deploy vessels capable of creating anything in the realm robotica. These vessels are deployed to sectors full of scrap and salvageable material, stocked with armament for their salvagers and a mechanical laboratory for their mechanical engineers. Crews on Cepheus ships are typically treated to somewhat crammed together quarters and tight schedules of collection and production.",
+ "tags": [
+ "Robotics"
+ ],
"namelists": [
"COLONIAL MINUTEMEN",
"MYTHOLOGICAL"
diff --git a/_maps/configs/minutemen_corvus.json b/_maps/configs/minutemen_corvus.json
index 914a6d53bf91..355669e158fd 100644
--- a/_maps/configs/minutemen_corvus.json
+++ b/_maps/configs/minutemen_corvus.json
@@ -1,7 +1,12 @@
{
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
- "map_name": "Corvus-Class Response Vessel",
+ "map_name": "Corvus-class Response Vessel",
"prefix": "CMSV",
+ "description": "A lightly equipped patrol vessel used by the Minutemen for extended operations in the Frontier. In many systems, a lone Corvus is the only sign of Minutemen presence, an image that is not helped by their widespread usage. The Corvus was originally a light personal vessel retrofitted for combat usage by the Colonial Militia, which was later adopted as their official remote infantry patrol ship as a symbol of colonial ingenuity and grit. First designated the Wallaby-class, until the crew of a now-legendary Wallaby-class known as the CMSV Corvus single handedly destroyed a Frontiersmen capital ship in 392.",
+ "tags": [
+ "Combot",
+ "Riot"
+ ],
"namelists": [
"COLONIAL MINUTEMEN",
"MYTHOLOGICAL"
diff --git a/_maps/configs/minutemen_vela.json b/_maps/configs/minutemen_vela.json
new file mode 100644
index 000000000000..4829166a56d6
--- /dev/null
+++ b/_maps/configs/minutemen_vela.json
@@ -0,0 +1,57 @@
+ {
+ "$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
+ "map_name": "Vela-Class Industrial Cruiser",
+ "prefix": "CMGSV",
+ "namelists": ["GENERAL", "MYTHOLOGICAL", "BEASTS"],
+ "description": "The Vela-Class is the designation for a series of semi-modular industrial cruisers created by the Colonial Minutemen in the early 440s. While the original design was created almost exclusively for extracting minerals from asteroid belts, modern examples tend to take on a multi-mission role, with the most common configuration being a mech hanger, and research pod. The ship itself often sees long deployments that encourage modification, leading to Velas taking on a personality as their crews leave their mark.",
+ "tags": [
+ "Robotics",
+ "Construction",
+ "Science"
+ ],
+ "map_short_name": "Vela-Class",
+ "starting_funds": 1000,
+ "map_path": "_maps/shuttles/shiptest/minutemen_vela.dmm",
+ "limit": 1,
+ "job_slots": {
+ "Captain": {
+ "outfit": "/datum/outfit/job/captain/minutemen",
+ "officer": true,
+ "slots": 1
+ },
+ "Foreman": {
+ "outfit": "/datum/outfit/job/ce/minutemen",
+ "officer": true,
+ "slots": 1
+ },
+ "Bridge Officer": {
+ "outfit": "/datum/outfit/job/head_of_personnel/minutemen",
+ "slots": 1
+ },
+ "Mech Pilot": {
+ "outfit": "/datum/outfit/job/miner/hazard/minutemen",
+ "slots": 4
+ },
+ "Mech Technician": {
+ "outfit": "/datum/outfit/job/roboticist/technician/minutemen",
+ "slots": 2
+ },
+ "Engineer": {
+ "outfit": "/datum/outfit/job/engineer/minutemen",
+ "slots": 2
+ },
+ "Minuteman": {
+ "outfit": "/datum/outfit/job/security/minutemen",
+ "slots": 2
+ },
+ "Scientist": {
+ "outfit": "/datum/outfit/job/scientist/minutemen",
+ "slots": 2
+ },
+ "Cadet": {
+ "outfit": "/datum/outfit/job/assistant/minutemen",
+ "slots": 1
+ }
+ },
+ "enabled": true
+}
diff --git a/_maps/configs/nanotrasen_delta.json b/_maps/configs/nanotrasen_delta.json
index 58028acf586d..6f81f5972a22 100644
--- a/_maps/configs/nanotrasen_delta.json
+++ b/_maps/configs/nanotrasen_delta.json
@@ -10,19 +10,31 @@
"NANOTRASEN"
],
"map_short_name": "Delta-class",
+ "description": "The Delta is a compact and advanced mining ship that supplements its comparatively small organic crew with a full suite of robotics facilities, including an AI and a host of mining and logistics drones and cyborgs. While much-loved by Nanotrasen logisticians for their minimal upkeep and high cost efficiency, Deltas are far less popular among the crews chosen to operate them, as they are severely lacking in crew accommodations and defensive armament.",
+ "tags": [
+ "Science",
+ "Robotics"
+ ],
"map_path": "_maps/shuttles/shiptest/nanotrasen_delta.dmm",
+ "starting_funds": 4000,
"job_slots": {
"Captain": {
"outfit": "/datum/outfit/job/captain/nt",
"officer": true,
"slots": 1
},
- "Roboticist": 2,
+ "Roboticist": {
+ "outfit": "/datum/outfit/job/roboticist",
+ "slots": 2
+ },
"Engineer": {
"outfit": "/datum/outfit/job/engineer/nt",
"slots": 1
},
- "Assistant": 3
+ "Assistant": {
+ "outfit": "/datum/outfit/job/assistant",
+ "slots": 3
+ }
},
"enabled": true
}
diff --git a/_maps/configs/nanotrasen_gecko.json b/_maps/configs/nanotrasen_gecko.json
index b2726550a759..f7f0791f7cb1 100644
--- a/_maps/configs/nanotrasen_gecko.json
+++ b/_maps/configs/nanotrasen_gecko.json
@@ -9,7 +9,13 @@
],
"map_short_name": "Gecko-class",
"map_path": "_maps/shuttles/shiptest/nanotrasen_gecko.dmm",
+ "description": "A bulky, robust, and exceedingly ugly salvage ship. The Gecko is nothing less than a flying brick full of redundant maintenance spaces and open-to-space salvage bays, powered by a temperamental TEG system, with a cramped crew space sandwiched in between. Due to its deeply obsolete design and the dangerous nature of salvage work, Geckos are often the final resting point for the careers of officers that have stepped on too many toes in the corporate world without doing anything outright criminal. Despite these shortcomings, Geckos offer a large amount of open space and a good supply of engineering equipment, which is all an enterprising engineer truly needs.",
+ "tags": [
+ "Mining",
+ "Engineering"
+ ],
"limit": 2,
+ "starting_funds": 5000,
"job_slots": {
"Captain": {
"outfit": "/datum/outfit/job/captain/nt",
diff --git a/_maps/configs/nanotrasen_mimir.json b/_maps/configs/nanotrasen_mimir.json
index 863e2b8ac09b..310b9962b63d 100644
--- a/_maps/configs/nanotrasen_mimir.json
+++ b/_maps/configs/nanotrasen_mimir.json
@@ -7,7 +7,14 @@
"BEASTS"
],
"map_name": "Mimir-Class Rehabillitation Vessel",
- "map_short_name": "Mimir-Class",
+ "map_short_name": "Mimir-class",
+ "description": "The Mimir-class are Nanotrasen “patient” transfer and holding ships. Nanotrasen deploys Mimirs to hold those they’ve interned, often in ruined or otherwise out-of-the-way sectors. This both minimizes the chances of the “patients” escaping and drastically lowers the incentive to do so in the first place, as it keeps them stuck in the middle of nowhere until Central Command is ready to pick them up and process them. While “patients” are largely kept in cryogenic storage, regulations and medical necessity both require occasional thawing. As such, the Mimir comes with a host of “rehabilitative” activities for the “patients” as well as a light security detail to manage them.",
+ "tags": [
+ "Riot",
+ "Service",
+ "Generalist",
+ "Specialist"
+ ],
"map_path": "_maps/shuttles/shiptest/nanotrasen_mimir.dmm",
"limit": 1,
"job_slots": {
diff --git a/_maps/configs/nanotrasen_osprey.json b/_maps/configs/nanotrasen_osprey.json
index 8a0c9f510a7c..feea5e777c69 100644
--- a/_maps/configs/nanotrasen_osprey.json
+++ b/_maps/configs/nanotrasen_osprey.json
@@ -10,7 +10,10 @@
],
"map_short_name": "Osprey-class",
"map_path": "_maps/shuttles/shiptest/nanotrasen_osprey.dmm",
+ "description": "Some of the most modern ships in Nanotrasen’s fleet and a prestigious assignment for their captains, the famed Osprey of the ICW’s most dramatic astronautical engagements lives on as a very well-appointed exploration ship. Extensively refurbished from their origins as Bluespace Artillery platforms, the contemporary Osprey repurposes military-grade sensor equipment and AI systems for exploration and scientific work. Features include respectably-equipped medical, culinary, and scientific facilities and an AI core, as well as a ship-wide disposals and delivery system and a very spacious cargo bay. However, the powerful (if temperamental) supermatter engines that powered the initial batch of Ospreys were stripped out during their rebuilds, and the replacement generator banks have left contemporary Ospreys somewhat power-starved.",
+ "tags": ["Cargo", "Robotics", "Generalist"],
"limit": 1,
+ "starting_funds": 4000,
"job_slots": {
"Captain": {
"outfit": "/datum/outfit/job/captain/nt",
@@ -22,23 +25,50 @@
"officer": true,
"slots": 1
},
- "Scientist": 2,
- "Medical Doctor": 1,
- "Paramedic": 1,
+ "Scientist": {
+ "outfit": "/datum/outfit/job/scientist",
+ "slots": 2
+ },
+ "Medical Doctor": {
+ "outfit": "/datum/outfit/job/doctor",
+ "slots": 1
+ },
+ "Paramedic": {
+ "outfit": "/datum/outfit/job/paramedic",
+ "slots": 1
+ },
"Engineer": {
"outfit": "/datum/outfit/job/engineer/nt",
"slots": 1
},
- "Atmospheric Technician": 1,
- "Quartermaster": 1,
- "Cargo Technician": 1,
+ "Atmospheric Technician": {
+ "outfit": "/datum/outfit/job/atmos",
+ "slots": 1
+ },
+ "Quartermaster": {
+ "outfit": "/datum/outfit/job/quartermaster",
+ "slots": 1
+ },
+ "Cargo Technician": {
+ "outfit": "/datum/outfit/job/cargo_tech",
+ "slots": 1
+ },
"Shaft Miner": {
"outfit": "/datum/outfit/job/miner/classic",
"slots": 1
},
- "Cook": 1,
- "Janitor": 1,
- "Assistant": 3
+ "Cook": {
+ "outfit": "/datum/outfit/job/cook",
+ "slots": 1
+ },
+ "Janitor": {
+ "outfit": "/datum/outfit/job/janitor",
+ "slots": 1
+ },
+ "Assistant": {
+ "outfit": "/datum/outfit/job/assistant",
+ "slots": 3
+ }
},
"enabled": true
}
diff --git a/_maps/configs/nanotrasen_powerrangers.json b/_maps/configs/nanotrasen_powerrangers.json
index a80db9f68c12..4549e153a81b 100644
--- a/_maps/configs/nanotrasen_powerrangers.json
+++ b/_maps/configs/nanotrasen_powerrangers.json
@@ -1,13 +1,23 @@
{
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"prefix": "NTSV",
+ "map_name": "Nanotrasen Ranger-class Aid Vessel",
"namelists": [
"NANOTRASEN",
"NATURAL_AGGRESSIVE",
"WEAPONS"
],
- "map_name": "Nanotrasen Ranger-Class Aid Vessel",
"map_short_name": "Ranger-class",
+ "description": "A Nanotrasen rescue and aid vessel. Equipped with an AI core, moderate combat gear, and equipment fit for rescue and general aid operations. Nanotrasen often deploys these ships in lieu of a proper ERT to aid their allies in the Frontier without committing their full might. The shipowner is the Lieutenant of a Loss Prevention squad, with a Commissioner to aid with operations on the ship proper.",
+ "tags": [
+ "Combat",
+ "Riot",
+ "Robotics",
+ "Medical",
+ "Telecomms",
+ "Generalist"
+ ],
+ "starting_funds": 4000,
"map_path": "_maps/shuttles/shiptest/nanotrasen_powerrangers.dmm",
"limit": 1,
"job_slots": {
diff --git a/_maps/configs/nanotrasen_skipper.json b/_maps/configs/nanotrasen_skipper.json
index 29e7b42dfeef..501ddf7b1afa 100644
--- a/_maps/configs/nanotrasen_skipper.json
+++ b/_maps/configs/nanotrasen_skipper.json
@@ -11,6 +11,12 @@
"MERCANTILE"
],
"map_path": "_maps/shuttles/shiptest/nanotrasen_skipper.dmm",
+ "description": "An example of one of Nanotrasen’s “standard-pattern” cruisers. The Skipper-class is well-equipped by Frontier standards, with ample room for engineering equipment, well-appointed crew accommodations, and a decent supply of defensive weaponry. Notably, the Skipper comes with a larger command section than average, and the officers on Skippers tend to be better-equipped than their peers. Though not as prestigious as a position aboard an Osprey, few Nanotrasen captains would turn down a position commanding a Skipper.",
+ "tags": [
+ "Engineering",
+ "Mining"
+ ],
+ "starting_funds": 4000,
"roundstart": true,
"job_slots": {
"Captain": {
@@ -37,7 +43,10 @@
"outfit": "/datum/outfit/job/security/nanotrasen",
"slots": 1
},
- "Assistant": 3
+ "Assistant": {
+ "outfit": "/datum/outfit/job/assistant",
+ "slots": 3
+ }
},
"enabled": true
}
diff --git a/_maps/configs/pirate_ember.json b/_maps/configs/pirate_ember.json
index 061ef8ecd83a..ef23ccd8ef3b 100644
--- a/_maps/configs/pirate_ember.json
+++ b/_maps/configs/pirate_ember.json
@@ -8,6 +8,13 @@
],
"map_short_name": "Ember-class",
"map_path": "_maps/shuttles/shiptest/pirate_ember.dmm",
+ "description": "The Ember class is a red flag in any sector. A giant, slow moving, safety hazard of a ship, makeshift in almost every regard, finds itself favored amongst the most ruthless and cutthroat of pirates and scoundrels galaxy-wide. Simply to be willing to exist on one of these ships shows a hardiness not typically found in most spacers. The best way to deal with Ember vessels is to simply give them a wide berth.",
+ "tags": [
+ "Combat",
+ "Riot",
+ "Combat",
+ "Engineering"
+ ],
"limit": 1,
"job_slots": {
"Captain": {
diff --git a/_maps/configs/pirate_libertatia.json b/_maps/configs/pirate_libertatia.json
index 05036b38235d..196f8652753f 100644
--- a/_maps/configs/pirate_libertatia.json
+++ b/_maps/configs/pirate_libertatia.json
@@ -3,8 +3,15 @@
"map_name": "Libertatia-class Hauler",
"map_short_name": "Libertatia-class",
"map_path": "_maps/shuttles/shiptest/pirate_libertatia.dmm",
+ "description": "A widely-available and dirt-cheap courier ship by Miskilamo Spacefaring, Libertatias are shoddy overhauls of old civilian atmospheric ships or the burned-out wrecks of other Libertatias, made nominally space worthy and capable of carrying a modest cargo at blistering speeds. While marketed as courier ships and short-range cargo shuttles, the Libertatia found its true target market in the hands of smugglers, blockade runners, and pirates, who find its speed, low sensor signature, and rock-bottom price point extremely attractive. In recent years, it’s become far more common to see Libertatias captained by pirates than anyone else, especially in the loosely-patrolled Frontier sectors. Surprisingly enough, the more organized Frontiersmen pirate group shows little love for the humble Libertatia, instead preferring larger and more threatening ships.",
+ "tags": [
+ "Combat"
+ ],
"prefix": "ISV",
- "namelists": ["PIRATES", "NATURAL_AGGRESSIVE"],
+ "namelists": [
+ "PIRATES",
+ "NATURAL_AGGRESSIVE"
+ ],
"job_slots": {
"Captain": {
"outfit": "/datum/outfit/job/captain/pirate",
diff --git a/_maps/configs/pirate_noderider.json b/_maps/configs/pirate_noderider.json
index 62134af5306f..4a004bdee87e 100644
--- a/_maps/configs/pirate_noderider.json
+++ b/_maps/configs/pirate_noderider.json
@@ -3,8 +3,18 @@
"map_name": "Jupiter-Class Stormrider",
"map_short_name": "Jupiter-Class",
"prefix": "ISV",
- "namelists": ["INSTALLATION", "PIRATES"],
+ "namelists": [
+ "INSTALLATION",
+ "PIRATES"
+ ],
"map_path": "_maps/shuttles/shiptest/pirate_noderider.dmm",
+ "description": "The Jupiter-class Stormrider is a specialist design originating from the Silicon Elevation Council, typically used for sustained missions in the Frontier. While habitable to organic life (typically as a matter of convenience), the ship is designed with silicons in mind, and features an AI core built into its hull. Many captains have been quoted as being “frightened” (although “piss-pants scared” was the exact statement) by one suddenly appearing out of a storm, IFF loudly declaring who they were, or in worse conditions, not functioning at all. Some examples have been known to find their way into pirate hands, who leverage the ship to spring ambushes on unsuspecting traders.",
+ "tags": [
+ "Robotics",
+ "Specialist",
+ "Riot",
+ "Combat"
+ ],
"job_slots": {
"Command Node": {
"outfit": "/datum/outfit/job/captain/aipirate",
diff --git a/_maps/configs/radio.json b/_maps/configs/radio.json
index 074ce6e0a17a..e1ae13e64abf 100644
--- a/_maps/configs/radio.json
+++ b/_maps/configs/radio.json
@@ -3,7 +3,12 @@
"map_name": "Radio Broadcasting Ship",
"map_short_name": "Radio-class",
"map_path": "_maps/shuttles/shiptest/radio_funny.dmm",
+ "description": "Whether through divine intervention or hellish creation by the hands of sapient-kind, reports of this “ship” plague some sectors more than others. The Radio Broadcasting Ship is an anomalous thing in its own right. It is a “ship” equipped with nothing but radios and reality warping engines. There exist many reports of this vessel being totally destroyed and showing back up in a sector just hours later. The only thing you can do about these vessels is pray the pilot doesn’t have bad taste.",
+ "tags": ["Specialist"],
"job_slots": {
- "Assistant": 6
+ "Assistant": {
+ "outfit": "/datum/outfit/job/assistant",
+ "slots": 6
+ }
}
}
diff --git a/_maps/configs/solgov_chronicle.json b/_maps/configs/solgov_chronicle.json
new file mode 100644
index 000000000000..aed35c98daa0
--- /dev/null
+++ b/_maps/configs/solgov_chronicle.json
@@ -0,0 +1,47 @@
+{
+ "$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
+ "map_name": "Chronicle-class Sensor Frigate",
+ "prefix": "SGSV",
+ "namelists": [
+ "SOLGOV",
+ "SPACE",
+ "BRITISH_NAVY",
+ "NATURAL"
+ ],
+ "map_short_name": "Chronicle-class",
+ "map_path": "_maps/shuttles/shiptest/solgov_chronicle.dmm",
+ "description": "Equipped with a sophisticated sensors suite and powerful data utilities, the Chronicle is a clerical workhorse, able to collect and process vast amounts of information. Often employed for census duties and interstellar exploration, the Chronicle is also a favorite of Evidenzkompanien, employed often for intelligence operations. With this fact in mind, Chronicle-class vessels are often placed under increased scrutiny by patrols, somewhat mitigating their effectiveness as a spymaster's tool.",
+ "tags": [
+ "Specialist"
+ ],
+ "limit": 1,
+ "job_slots": {
+ "Captain": {
+ "outfit": "/datum/outfit/job/solgov/captain",
+ "officer": true,
+ "slots": 1
+ },
+ "Overseer": {
+ "outfit": "/datum/outfit/job/solgov/overseer",
+ "officer": true,
+ "slots": 1
+ },
+ "Sonnensöldner": {
+ "outfit": "/datum/outfit/job/solgov/sonnensoldner",
+ "slots": 1
+ },
+ "Ship Engineer": {
+ "outfit": "/datum/outfit/job/solgov/engineer",
+ "slots": 2
+ },
+ "Field Engineer": {
+ "outfit": "/datum/outfit/job/solgov/miner",
+ "slots": 2
+ },
+ "Scribe": {
+ "outfit": "/datum/outfit/job/solgov/assistant",
+ "slots" : 1
+ }
+ },
+ "enabled": false
+}
diff --git a/_maps/configs/srm_glaive.json b/_maps/configs/srm_glaive.json
index 6748037dcdaa..093e28107e2c 100644
--- a/_maps/configs/srm_glaive.json
+++ b/_maps/configs/srm_glaive.json
@@ -2,14 +2,23 @@
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"map_name": "SRM Glaive-class Hunter Vessel",
"prefix": "SRSV",
- "namelists": ["SAINT-ROUMAIN", "BEASTS"],
+ "namelists": [
+ "SAINT-ROUMAIN",
+ "BEASTS"
+ ],
"map_short_name": "Glaive-class",
"map_path": "_maps/shuttles/shiptest/srm_glaive.dmm",
+ "description": "A standard issue vessel to the highest ranks of the Saint-Roumain Militia. While “standard”, this class of vessel is unique to the Montagne that owns it. Each ship is designed around a central garden consisting of plants, soil, and a tree from the owning Montagnes’ home planet. As a highly religious ascetic order, the SRM supplies each Glaive with supplies to farm, raise animals, and perform medicine in more “natural” ways, using herbs and plants grown in house. Alongside this, the ship has a decent amount of mining equipment, and supplies required to begin the manufacturing of SRM-pattern firearms as is standard for Hunter’s Pride. The ship is captained by a Montagne, who oversees a team of Hunters, and Shadows apprenticing them.",
+ "tags": [
+ "Mining",
+ "Combat",
+ "Specialist"
+ ],
"map_id": "srm_glaive",
"limit": 1,
"job_slots": {
"Hunter Montagne": {
- "outfit": "/datum/outfit/job/chaplain/roumain",
+ "outfit": "/datum/outfit/job/hos/roumain",
"officer": true,
"slots": 1
},
diff --git a/_maps/configs/syndicate_aegis.json b/_maps/configs/syndicate_aegis.json
index 1ccdb7f2b176..1a7804bee932 100644
--- a/_maps/configs/syndicate_aegis.json
+++ b/_maps/configs/syndicate_aegis.json
@@ -3,6 +3,12 @@
"map_name": "Aegis-class Long Term Care Ship",
"map_short_name": "Aegis-class",
"map_path": "_maps/shuttles/shiptest/syndicate_aegis.dmm",
+ "description": "Approximately a third of the way through the ICW, it became apparent that the Syndicate could not muster the sheer throwaway manpower that Nanotrasen could with its swaths of mercenaries and disposable personnel. Instead, the Syndicate began to adopt a much more conservative approach to maintaining personnel, by establishing an initiative to create a host of medical vessels designed to rescue and rehabilitate the fallen. While the Li Tieguai filled the rescue role, the Aegis-Class was to fill the rehabilitation role. Featuring a host of ‘quality of life’ features for long-term patients (a full bar, a hydroponics setup, and so on), an expansive medical bay and an array of comfort fixtures like couches and gardens, the Aegis is perfect for aspiring doctors or wounded patients.",
+ "tags": [
+ "Botany",
+ "Medical",
+ "RP Focus"
+ ],
"map_id": "syndicate_aegis",
"namelists": [
"SUNS",
diff --git a/_maps/configs/syndicate_cybersun_kansatsu.json b/_maps/configs/syndicate_cybersun_kansatsu.json
index f6ffd153a0d8..784dab0483cb 100644
--- a/_maps/configs/syndicate_cybersun_kansatsu.json
+++ b/_maps/configs/syndicate_cybersun_kansatsu.json
@@ -7,6 +7,10 @@
"NATURAL_AGGRESSIVE"
],
"map_name": "Kansatsu-Class Scout Courier",
+ "description": "The Kansatsu-class is a Cybersun remodel of the old Type-S SolGov Courier, rebuilt for rapid package ferrying and light surveillance operations in the Frontier. While fairly cramped, it excels at its design goals, with rapid surveys, scouting, and espionage flowing from its presence. Syndicate deployments typically include a deployment of 5, with a recommended max of 7. This is broken down into 1 captain, an intelligence officer for coordinating the field agents, an engineer, and 2 field agents. The simplicity of the hull has led to the ship becoming a widespread indicator of Syndicate interest in locations, and some models have found their way into private purchasers' hands.",
+ "tags": [
+ "Specialist"
+ ],
"map_short_name": "Kansatsu-Class",
"map_path": "_maps/shuttles/shiptest/syndicate_cybersun_kansatsu.dmm",
"map_id": "cybersun_kansatsu",
diff --git a/_maps/configs/syndicate_gorlex_hyena.json b/_maps/configs/syndicate_gorlex_hyena.json
index afc26246e022..2c0d12a29a45 100644
--- a/_maps/configs/syndicate_gorlex_hyena.json
+++ b/_maps/configs/syndicate_gorlex_hyena.json
@@ -9,6 +9,11 @@
"ACLF"
],
"map_name": "Hyena-class Wrecking Tug",
+ "description": "The Hyena is a common salvage tug, frequently operated by the Gorlex Marauders for “salvage” missions on ICW-era Nanotrasen derelicts (and occasionally occupied outposts and ships). The Hyena features a fairly compact floor plan with a dedicated secure armory space and a fairly large cargo bay for its size, as well as a complement of high-grade hardsuits and mining equipment. The Hyena’s low cost and high demand in its niche has made it a very common sight on the Frontier in the years following the ICW, and despite their tight finances nearly all Gorlex Marauder splinter factions continue to acquire more.",
+ "tags": [
+ "Mining",
+ "Combat"
+ ],
"map_short_name": "Hyena-class",
"map_path": "_maps/shuttles/shiptest/syndicate_gorlex_hyena.dmm",
"job_slots": {
@@ -27,7 +32,7 @@
"slots": 1
},
"Wrecker": {
- "outfit": "/datum/outfit/job/miner/syndicate",
+ "outfit": "/datum/outfit/job/miner/syndicate/gorlex",
"slots": 2
},
"Junior Agent": {
diff --git a/_maps/configs/syndicate_gorlex_komodo.json b/_maps/configs/syndicate_gorlex_komodo.json
index 414ba6eea211..f65d05a44e60 100644
--- a/_maps/configs/syndicate_gorlex_komodo.json
+++ b/_maps/configs/syndicate_gorlex_komodo.json
@@ -8,6 +8,12 @@
],
"map_name": "Komodo-class Warship",
"map_short_name": "Komodo-class",
+ "description": "An ICW-era design, the Komodo is a dedicated warship operated by the Gorlex Marauders. Contemporaries of the legendary Starfury-class, Komodos were the backbone of Gorlex and ACLF fleets during the ICW, and saw significant combat service – not always to a tragic end like their Cybersun companions. Contemporary examples often still bear the scars of ICW-period combat, and the dire financial straits of most Gorlex splinter factions means many of those survivors are in a state of poor repair. Despite the stresses of age, they remain capable ships, and often still have the heavier armament associated with their ICW deployments in storage.",
+ "tags": [
+ "RP Focus",
+ "Combat",
+ "Engineering"
+ ],
"map_path": "_maps/shuttles/shiptest/syndicate_gorlex_komodo.dmm",
"map_id": "syndicate_gorlex_komodo",
"limit": 1,
diff --git a/_maps/configs/syndicate_lugol.json b/_maps/configs/syndicate_lugol.json
index 37e54aaea03c..891a19641252 100644
--- a/_maps/configs/syndicate_lugol.json
+++ b/_maps/configs/syndicate_lugol.json
@@ -2,7 +2,16 @@
"map_name": "Lugol-class GEC Engineering Project",
"prefix": "SEV",
"map_short_name": "Lugol-class",
- "namelists": ["ENGINEERING", "GEC", "SPACE"],
+ "description": "The Lugol is effectively an enormous Galactic Engineers Concordat research barge, used as a test bed for refinements to power systems, new technologies, and so on. As it offers freedom from the usual constraints of working aboard vessels belonging to other Syndicate factions, Lugols are especially popular among the GEC’s more radical members. Accordingly, they have a reputation for either accomplishing the impossible or generating the equivalent of a new star when they inevitably melt down. Lugols are generally only found on the Frontier, where the collateral damage from potential accidents can be kept to a minimum and secrecy, when needed, can be better maintained.",
+ "tags": [
+ "Engineering",
+ "Construction"
+ ],
+ "namelists": [
+ "ENGINEERING",
+ "GEC",
+ "SPACE"
+ ],
"map_path": "_maps/shuttles/shiptest/syndicate_gec_lugol.dmm",
"map_id": "gec_lugol",
"limit": 2,
diff --git a/_maps/configs/syndicate_luxembourg.json b/_maps/configs/syndicate_luxembourg.json
index 4ec565bceb17..40fe900ae3d6 100644
--- a/_maps/configs/syndicate_luxembourg.json
+++ b/_maps/configs/syndicate_luxembourg.json
@@ -1,11 +1,21 @@
{
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"prefix": "SSV",
- "namelists": ["DONK", "MERCANTILE", "SPACE"],
+ "namelists": [
+ "DONK",
+ "MERCANTILE",
+ "SPACE"
+ ],
"map_name": "Luxembourg-class Delivery Vessel",
+ "description": "A dual-purpose delivery vessel and mobile storefront, Luxembourgs make up a substantial portion of Donk! Co.’s fleet on the Frontier, where the ever-opportunistic corporation has begun to fill the gaps left behind by the collapse of Nanotrasen’s logistics network. Donk! Co. managers have a great degree of autonomy, and so any given Luxembourg will often bear substantial modifications to the sales floor and on-board cafe, the better to entice new customers in an unstable yet lucrative region of space.",
+ "tags": [
+ "Robotics",
+ "Cargo"
+ ],
"map_short_name": "Luxembourg-class",
"map_path": "_maps/shuttles/shiptest/syndicate_luxembourg.dmm",
"limit": 1,
+ "starting_funds": 6000,
"job_slots": {
"Manager": {
"outfit": "/datum/outfit/job/quartermaster/donk",
diff --git a/_maps/configs/syndicate_twinkleshine.json b/_maps/configs/syndicate_twinkleshine.json
index ef8b076cc4ea..24b55c7bd35c 100644
--- a/_maps/configs/syndicate_twinkleshine.json
+++ b/_maps/configs/syndicate_twinkleshine.json
@@ -1,8 +1,19 @@
{
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"prefix": "SSV",
- "namelists": ["GORLEX", "SPACE", "ACLF"],
+ "namelists": [
+ "GORLEX",
+ "SPACE",
+ "ACLF"
+ ],
"map_name": "Twinkleshine-class Battle Cruiser",
+ "description": "After the destruction of the larger Starfury-class Battle Cruisers during the Inter-Corporate War, Cybersun engineered the Twinkleshine as a replacement to fill the now-vacant flagship role. However, the war came to a close before any examples of this class could see combat. Now, they are kept as a valuable symbol of the Syndicate’s might and unity – in theory. As with the Starfury-class, Twinkleshine crews contain a mix of all Syndicate member factions as a matter of political necessity – none would consent to Cybersun operating such powerful ships alone. While Twinkleshine crews are supposedly selected for more diplomatic tendencies than one might expect, the political situation aboard a Twinkleshine is often delicate, particularly as tensions between the Syndicate’s corporate and anti-corporate elements continue to build. Nevertheless, they remain the most potent singular assets in the Syndicate’s combined arsenal, and frequently serve the role of power projection in Frontier space.",
+ "tags": [
+ "Engineering",
+ "Combat",
+ "Service",
+ "Medical"
+ ],
"map_short_name": "Twinkleshine-class",
"map_path": "_maps/shuttles/shiptest/syndicate_twinkleshine.dmm",
"job_slots": {
diff --git a/_maps/deprecated/Ships/Syndicate_Cascade.dmm b/_maps/deprecated/Ships/Syndicate_Cascade.dmm
index 06dea507ef25..1b12f271ef22 100644
--- a/_maps/deprecated/Ships/Syndicate_Cascade.dmm
+++ b/_maps/deprecated/Ships/Syndicate_Cascade.dmm
@@ -3016,7 +3016,6 @@
pixel_x = -3
},
/obj/item/clothing/under/rank/medical/doctor/red,
-/obj/item/clothing/under/rank/medical/chief_medical_officer/surgeon_general,
/obj/item/clothing/under/syndicate/sniper,
/obj/item/clothing/under/utility/skirt,
/obj/item/clothing/under/utility,
diff --git a/_maps/example_ship_config.json b/_maps/example_ship_config.json
index 4b8b820fd92d..4dabf60293d2 100644
--- a/_maps/example_ship_config.json
+++ b/_maps/example_ship_config.json
@@ -6,6 +6,8 @@
"namelists": ["GENERAL", "SPACE", "MYTHOLOGICAL", "WEAPONS"],
"map_path": "_maps/shuttles/shiptest/null.dmm",
"limit": 2,
+ "spawn_time_coeff": 1.5,
+ "officer_time_coeff": 0.5,
"job_slots": {
"The First Slot will always be the 'captain' that the purchaser becomes.": {
"outfit": "/datum/outfit/job/captain",
diff --git a/_maps/ship_config_schema.json b/_maps/ship_config_schema.json
index df80b6c2818c..e0e1b4eb8ce0 100644
--- a/_maps/ship_config_schema.json
+++ b/_maps/ship_config_schema.json
@@ -2,6 +2,7 @@
"$schema": "https://json-schema.org/draft-04/schema",
"title": "Ship Configuration Schema",
"description": "A ship configuration, used for defining new ship classes.",
+ "tags": "A list of tags, used for searching ships by quality.",
"type": "object",
"properties": {
@@ -21,6 +22,11 @@
"type": "string",
"description": "A description of the ship class, currently only shown to admins on the shuttle manipulator, but will likely be shown to players before ship purchase in the future."
},
+ "tags": {
+ "title": "Ship Tags",
+ "type": "array",
+ "description": "A list of tags describing the ship's niche, converted into searchable strings."
+ },
"prefix": {
"title": "Ship Default Prefix",
"type": [ "null", "string" ],
@@ -123,6 +129,28 @@
"maximum": 100,
"default": 2
},
+ "starting_funds":{
+ "title": "Ship Starting Funds",
+ "Type": "integer",
+ "description": "The amount of money a ship's bank account starts with",
+ "minimum": 0,
+ "maximum": 20000,
+ "default": 2000
+ },
+ "spawn_time_coeff": {
+ "title": "Required Spawn Playtime Coefficient",
+ "type": "number",
+ "description": "A multiplier used, along with the config value SHIP_SPAWN_BASE_EXP_MIN, to determine the amount of time a player must have spent as Living to spawn this ship from the join menu.",
+ "minimum": 0,
+ "default": 1
+ },
+ "officer_time_coeff": {
+ "title": "Required Officer Playtime Coefficient",
+ "type": "number",
+ "description": "A multiplier used, along with the config value OFFICER_JOIN_BASE_EXP_MIN, to determine the amount of time a player must have spent as Living to spawn as an officer job on this ship AFTER it has been spawned.",
+ "minimum": 0,
+ "default": 1
+ },
"enabled": {
"title": "Selectable",
"type": "boolean",
diff --git a/_maps/ship_tags_descriptions_guide.txt b/_maps/ship_tags_descriptions_guide.txt
new file mode 100644
index 000000000000..6bd86164ba41
--- /dev/null
+++ b/_maps/ship_tags_descriptions_guide.txt
@@ -0,0 +1,27 @@
+When adding a ship to the game you need to add a description and a set of tags based on what the ship is equipped with.
+The description should describe what the ship is used for, what it's conditions are typically like, and possibly some lore tidbits for it.
+When creating a description you'll need to run it by the lore team to make sure it is compliant and meets up to our standards.
+
+For tags you will add them in the following format:
+"tags": ["Tag One", "Tag Two", "Tag Three"],
+
+All individual words in tags must be capitalized.
+Here is the list of tags:
+
+"Combat" - A ship containing significant lethal weaponry, is generally lethally armed, or has a ruin or pvp focus.
+"Generalist" - A ship containing 4 or more focus tags or very little in a lot of categories without enough to constitute tagging it as such.
+"Construction" - A ship built for building or construction projects.
+"Robotics" - A ship with AI's, Borgs, or a robotics setup in general.
+"Science" - A ship containing a research focus, this includes RnD and XenoBio.
+"Service" - A ship with a bar or kitchen setup, a ship focused around the service department.
+"Chemistry" - A ship containing a chemistry and/or plumbing setup.
+"Medical" - A ship with more than just a few medkits an a surgery kit, a ship based around medical gameplay.
+"RP Focus" - A ship that's meant to facilitate a lot of RP. IE cruise ships, apartment ships, bar-rp ships, etc.
+"Mining" - A ship with more than a modest amount of mining equipment. Having an ORM, multiple harsuits, protos, etc.
+"Cargo" - A ship that is meant to either act as a merchant or a cargo vessel. This is judged on a ship to ship basis.
+"Engineering" - A ship with a lot of engineering gear.
+"Subshuttle" - A ship that contains a subshuttle.
+"Survival Challenge" - A ship that is actively hostile to start on.
+"Telecomms" - A ship with a telecomms setup comprising of 3 or more machines.
+"Botany" - A ship that has more than a couple trays and a mild selection of seeds. Has a considerable amount of botany equipment.
+"Specialist" - A ship that is special, doesn't fit any other tag, or has a special niche. Judged on a ship to ship basis.
\ No newline at end of file
diff --git a/_maps/shuttles/shiptest/independent_beluga.dmm b/_maps/shuttles/shiptest/independent_beluga.dmm
index 4d1e348e4bb4..6431371844ce 100644
--- a/_maps/shuttles/shiptest/independent_beluga.dmm
+++ b/_maps/shuttles/shiptest/independent_beluga.dmm
@@ -956,7 +956,9 @@
dir = 4
},
/obj/effect/turf_decal/steeldecal/steel_decals10,
-/obj/machinery/door/airlock/engineering/glass,
+/obj/machinery/door/airlock/engineering/glass{
+ dir = 4
+ },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 8
},
diff --git a/_maps/shuttles/shiptest/independent_box.dmm b/_maps/shuttles/shiptest/independent_box.dmm
index 2f826995a898..22f7bcbc1360 100644
--- a/_maps/shuttles/shiptest/independent_box.dmm
+++ b/_maps/shuttles/shiptest/independent_box.dmm
@@ -687,6 +687,7 @@
name = "Egnine shutter";
pixel_y = 28
},
+/obj/machinery/light/small/broken/directional/south,
/turf/open/floor/plating,
/area/ship/engineering)
"cJ" = (
@@ -1647,15 +1648,15 @@
dir = 1;
id = "whiteship_windows";
name = "Windows Blast Door Control";
- pixel_x = -5;
- pixel_y = -27
+ pixel_x = -7;
+ pixel_y = -22
},
/obj/machinery/button/door{
dir = 1;
id = "whiteship_bridge";
name = "Bridge Blast Door Control";
pixel_x = 5;
- pixel_y = -27
+ pixel_y = -22
},
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 1
@@ -1665,13 +1666,13 @@
id = "emergencybay_blastdoors";
name = "Emergency Bay Blastdoors";
pixel_x = 5;
- pixel_y = -40
+ pixel_y = -33
},
/obj/machinery/button/shieldwallgen{
dir = 1;
id = "box_cargo";
pixel_x = -5;
- pixel_y = -38
+ pixel_y = -31
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/carpet/nanoweave/blue,
@@ -1775,13 +1776,10 @@
/obj/effect/turf_decal/corner/opaque/blue{
dir = 4
},
-/obj/structure/sign/poster/official/mini_energy_gun{
- pixel_y = -32
- },
/obj/machinery/computer/cargo/express{
dir = 1
},
-/obj/machinery/firealarm/directional/west,
+/obj/machinery/firealarm/directional/south,
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
"vE" = (
@@ -1960,7 +1958,6 @@
/turf/open/floor/plasteel/white,
/area/ship/medical)
"yA" = (
-/obj/machinery/light/small/directional/south,
/obj/machinery/atmospherics/pipe/simple/orange/hidden{
dir = 4
},
@@ -1972,7 +1969,7 @@
dir = 8
},
/obj/machinery/advanced_airlock_controller{
- pixel_y = -28
+ pixel_y = -20
},
/obj/effect/turf_decal/arrows,
/turf/open/floor/plating,
@@ -1994,6 +1991,7 @@
name = "Egnine shutter";
pixel_y = -28
},
+/obj/machinery/light/small/directional/north,
/turf/open/floor/plating,
/area/ship/engineering)
"yN" = (
@@ -2057,9 +2055,8 @@
layer = 2.35
},
/obj/machinery/advanced_airlock_controller{
- pixel_y = 28
+ pixel_y = 24
},
-/obj/machinery/light/small/broken/directional/north,
/turf/open/floor/plating,
/area/ship/engineering)
"AL" = (
@@ -2166,7 +2163,6 @@
/obj/item/clothing/accessory/armband/medblue,
/obj/item/clothing/accessory/armband/med,
/obj/item/clothing/accessory/armband/med,
-/obj/item/clothing/under/rank/medical/psychiatrist/blue,
/obj/item/clothing/accessory/pocketprotector,
/obj/item/clothing/accessory/pocketprotector,
/obj/item/clothing/accessory/pocketprotector,
@@ -2504,7 +2500,7 @@
pixel_x = -32
},
/obj/item/storage/box/pillbottles,
-/obj/item/clothing/under/rank/medical/chemist/pharmacist,
+/obj/item/clothing/under/rank/medical/chemist/,
/obj/item/clothing/suit/longcoat/chemist,
/obj/item/reagent_containers/dropper,
/obj/item/clothing/head/beret/chem,
diff --git a/_maps/shuttles/shiptest/independent_boyardee.dmm b/_maps/shuttles/shiptest/independent_boyardee.dmm
index b2978137f068..ede51c9a219c 100644
--- a/_maps/shuttles/shiptest/independent_boyardee.dmm
+++ b/_maps/shuttles/shiptest/independent_boyardee.dmm
@@ -1,16 +1,4 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"ai" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/vending/clothing,
-/obj/machinery/light/directional/east,
-/obj/effect/turf_decal/siding/wood{
- dir = 8;
- color = "#543C30"
- },
-/turf/open/floor/wood/walnut,
-/area/ship/crew)
"ao" = (
/obj/machinery/power/smes/engineering,
/obj/machinery/atmospherics/pipe/simple/orange/hidden{
@@ -112,6 +100,26 @@
/obj/machinery/newscaster/directional/west,
/turf/open/floor/plasteel/patterned/brushed,
/area/ship/crew/canteen)
+"cZ" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 9
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/light_switch{
+ pixel_x = -25;
+ pixel_y = 25
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 2;
+ color = "#543C30"
+ },
+/turf/open/floor/wood/walnut,
+/area/ship/crew)
"dh" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
dir = 1
@@ -123,6 +131,17 @@
/obj/item/toy/cards/deck/kotahi,
/turf/open/floor/carpet/red_gold,
/area/ship/crew/canteen)
+"dr" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/airalarm/directional/east,
+/obj/effect/turf_decal/siding/wood{
+ dir = 8;
+ color = "#543C30"
+ },
+/turf/open/floor/wood/walnut,
+/area/ship/crew)
"dt" = (
/obj/structure/urinal{
pixel_y = 32
@@ -156,6 +175,22 @@
/obj/machinery/suit_storage_unit/standard_unit,
/turf/open/floor/plasteel/dark,
/area/ship/crew/canteen)
+"dP" = (
+/obj/machinery/vending/cigarette,
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
+"dU" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/chair/wood{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
"dV" = (
/turf/closed/wall,
/area/ship/maintenance)
@@ -186,26 +221,6 @@
},
/turf/open/floor/plasteel/dark,
/area/ship/storage)
-"ef" = (
-/obj/structure/table/wood,
-/obj/item/paper_bin,
-/obj/item/pen/fountain,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 6
- },
-/obj/item/megaphone{
- pixel_x = 3;
- pixel_y = 1
- },
-/obj/effect/turf_decal/siding/wood{
- dir = 2;
- color = "#543C30"
- },
-/turf/open/floor/wood/walnut,
-/area/ship/crew)
"ej" = (
/obj/structure/table/reinforced,
/obj/item/storage/box/donkpockets,
@@ -231,6 +246,18 @@
},
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
+"ev" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
"ex" = (
/obj/machinery/airalarm/directional/south,
/turf/open/floor/plasteel,
@@ -298,15 +325,19 @@
/obj/structure/catwalk/over/plated_catwalk,
/turf/open/floor/plating,
/area/ship/crew/hydroponics)
-"fl" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 9
- },
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
"fs" = (
/turf/open/floor/plasteel,
/area/ship/crew/hydroponics)
+"fz" = (
+/obj/machinery/cryopod{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood/corner{
+ color = "#543C30";
+ dir = 4
+ },
+/turf/open/floor/wood/walnut,
+/area/ship/crew)
"fG" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 8
@@ -326,6 +357,12 @@
},
/turf/open/floor/plasteel/mono/white,
/area/ship/bridge)
+"gq" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
"gL" = (
/obj/effect/turf_decal/number/two,
/turf/open/floor/plating/airless,
@@ -363,6 +400,14 @@
},
/turf/open/floor/plating/airless,
/area/ship/external)
+"hJ" = (
+/obj/machinery/firealarm/directional/south,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1;
+ color = "#543C30"
+ },
+/turf/open/floor/wood/walnut,
+/area/ship/crew)
"hL" = (
/obj/structure/bed,
/obj/item/bedsheet/random,
@@ -390,25 +435,10 @@
/obj/item/radio/intercom/directional/east,
/turf/open/floor/plating,
/area/ship/maintenance)
-"iA" = (
-/obj/structure/bed,
-/obj/item/bedsheet/random,
-/obj/structure/curtain/bounty,
-/obj/effect/turf_decal/siding/wood{
- dir = 1;
- color = "#543C30"
- },
-/turf/open/floor/wood/walnut,
-/area/ship/crew)
"iB" = (
/obj/machinery/status_display/shuttle,
/turf/closed/wall,
/area/ship/storage)
-"iR" = (
-/obj/machinery/light/directional/south,
-/obj/effect/turf_decal/siding/wood,
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
"ja" = (
/obj/machinery/door/poddoor{
id = "windowlockdown";
@@ -442,49 +472,24 @@
/obj/structure/catwalk/over/plated_catwalk,
/turf/open/floor/plating,
/area/ship/cargo)
-"jL" = (
-/obj/structure/chair/office{
- dir = 1
+"jA" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
},
-/obj/effect/turf_decal/siding/wood{
- dir = 4;
- color = "#543C30"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
},
-/turf/open/floor/wood/walnut,
-/area/ship/crew)
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
"jN" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 8
},
/turf/open/floor/plasteel,
/area/ship/cargo)
-"kf" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/airalarm/directional/east,
-/obj/effect/turf_decal/siding/wood{
- dir = 8;
- color = "#543C30"
- },
-/turf/open/floor/wood/walnut,
-/area/ship/crew)
-"kh" = (
-/obj/structure/table/wood,
-/obj/item/flashlight/lamp/green{
- pixel_x = -6;
- pixel_y = 10
- },
-/obj/item/folder,
-/obj/machinery/computer/cryopod/directional/north{
- pixel_y = 17
- },
-/obj/item/radio/intercom/directional/west,
-/obj/effect/turf_decal/siding/wood/corner{
- color = "#543C30"
- },
-/turf/open/floor/wood/walnut,
-/area/ship/crew)
"kr" = (
/obj/structure/sign/warning/chemdiamond,
/turf/closed/wall,
@@ -596,16 +601,6 @@
/obj/item/spacecash/bundle/c1000,
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
-"lY" = (
-/obj/machinery/cryopod{
- dir = 1
- },
-/obj/effect/turf_decal/siding/wood/corner{
- color = "#543C30";
- dir = 4
- },
-/turf/open/floor/wood/walnut,
-/area/ship/crew)
"me" = (
/obj/structure/window/reinforced/spawner/west,
/obj/machinery/power/smes/shuttle/precharged{
@@ -661,13 +656,6 @@
/obj/item/stack/sheet/mineral/plasma/five,
/turf/open/floor/plating,
/area/ship/maintenance)
-"mX" = (
-/obj/machinery/vending/cigarette,
-/obj/effect/turf_decal/siding/wood{
- dir = 6
- },
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
"nc" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/effect/turf_decal/industrial/warning{
@@ -694,6 +682,18 @@
/obj/effect/turf_decal/corner/opaque/white/half,
/turf/open/floor/plasteel/mono/dark,
/area/ship/bridge)
+"ny" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
"nA" = (
/obj/effect/turf_decal/industrial/warning/corner{
dir = 1
@@ -726,20 +726,37 @@
/obj/machinery/light/small/directional/north,
/turf/open/floor/plasteel/freezer,
/area/ship/storage)
-"op" = (
-/obj/structure/table/reinforced,
+"oX" = (
+/obj/machinery/light/directional/west,
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
+"pb" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/table/wood/fancy/black,
+/obj/item/reagent_containers/food/condiment/saltshaker{
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/item/reagent_containers/food/condiment/peppermill,
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
+"pg" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 8
},
-/obj/item/areaeditor/shuttle{
- pixel_x = -11
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
},
-/obj/item/radio/intercom/wideband/table{
- dir = 8;
- canhear_range = 5
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
},
-/turf/open/floor/plasteel/mono/white,
-/area/ship/bridge)
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
"ph" = (
/obj/structure/chair/comfy/shuttle{
dir = 4
@@ -767,16 +784,6 @@
/obj/machinery/status_display/shuttle,
/turf/closed/wall/r_wall,
/area/ship/bridge)
-"pH" = (
-/obj/structure/bed,
-/obj/item/bedsheet/random,
-/obj/structure/curtain/bounty,
-/obj/effect/turf_decal/siding/wood/corner{
- color = "#543C30";
- dir = 1
- },
-/turf/open/floor/wood/walnut,
-/area/ship/crew)
"pN" = (
/obj/machinery/atmospherics/components/binary/valve/digital,
/obj/structure/cable{
@@ -826,6 +833,24 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/ship/crew/hydroponics)
+"qB" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/structure/chair/sofa/right{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
+"qE" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/structure/chair/stool/bar{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
"qO" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 6
@@ -841,10 +866,30 @@
},
/turf/open/floor/plating,
/area/ship/maintenance)
+"qZ" = (
+/obj/structure/bed,
+/obj/item/bedsheet/random,
+/obj/structure/curtain/bounty,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1;
+ color = "#543C30"
+ },
+/turf/open/floor/wood/walnut,
+/area/ship/crew)
"rj" = (
/obj/structure/ore_box,
/turf/open/floor/plasteel/dark,
/area/ship/cargo)
+"rk" = (
+/obj/machinery/computer/helm/viewscreen/directional/west,
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/structure/chair/sofa/left{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
"rm" = (
/obj/structure/urinal{
pixel_y = 32
@@ -885,6 +930,16 @@
/obj/machinery/firealarm/directional/south,
/turf/open/floor/plasteel/dark,
/area/ship/crew/canteen)
+"rz" = (
+/obj/structure/chair/office{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 4;
+ color = "#543C30"
+ },
+/turf/open/floor/wood/walnut,
+/area/ship/crew)
"rA" = (
/obj/structure/sink/kitchen{
dir = 4;
@@ -898,52 +953,27 @@
},
/turf/open/floor/plasteel/mono/dark,
/area/ship/bridge)
-"rH" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/ship/maintenance)
-"rM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
-"rR" = (
+"rC" = (
+/obj/structure/table/reinforced,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 8
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
-"rY" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
+/obj/item/areaeditor/shuttle{
+ pixel_x = -11
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+/obj/item/radio/intercom/wideband/table{
+ dir = 8;
+ canhear_range = 5
},
+/turf/open/floor/plasteel/mono/white,
+/area/ship/bridge)
+"rH" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/turf_decal/siding/wood{
- dir = 8
- },
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
+/turf/open/floor/plating,
+/area/ship/maintenance)
"sg" = (
/turf/closed/wall,
/area/ship/storage)
@@ -979,8 +1009,13 @@
/obj/machinery/status_display/shuttle,
/turf/closed/wall,
/area/ship/cargo)
-"sT" = (
-/obj/effect/turf_decal/siding/wood,
+"sR" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/chair/wood{
+ dir = 8
+ },
/turf/open/floor/wood,
/area/ship/crew/canteen)
"sU" = (
@@ -1008,25 +1043,14 @@
/obj/machinery/light/small/directional/east,
/turf/open/floor/plasteel/patterned,
/area/ship/crew/canteen)
-"tz" = (
-/obj/item/radio,
-/obj/item/radio,
-/obj/item/radio,
-/obj/item/radio,
-/obj/item/radio,
-/obj/item/radio,
-/obj/structure/closet/crate,
-/obj/machinery/power/apc/auto_name/directional/north,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/item/radio/intercom/directional/east,
-/obj/effect/turf_decal/siding/wood/corner{
- color = "#543C30";
+"tC" = (
+/obj/docking_port/stationary{
+ width = 15;
+ height = 15;
dir = 8
},
-/turf/open/floor/wood/walnut,
-/area/ship/crew)
+/turf/closed/wall,
+/area/ship/crew/canteen)
"tP" = (
/obj/effect/turf_decal/corner/transparent/neutral{
dir = 1
@@ -1053,19 +1077,6 @@
},
/turf/open/floor/carpet/red_gold,
/area/ship/crew/canteen)
-"tW" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 10
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/siding/wood,
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
"ua" = (
/obj/effect/turf_decal/industrial/warning/corner{
dir = 4
@@ -1073,13 +1084,6 @@
/obj/machinery/airalarm/directional/north,
/turf/open/floor/plasteel,
/area/ship/cargo)
-"uC" = (
-/obj/machinery/airalarm/directional/south,
-/obj/effect/turf_decal/siding/wood{
- dir = 6
- },
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
"uI" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 1
@@ -1091,7 +1095,7 @@
/obj/structure/catwalk/over/plated_catwalk,
/turf/open/floor/plating,
/area/ship/crew/hydroponics)
-"uN" = (
+"uP" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 8
},
@@ -1099,17 +1103,13 @@
dir = 8
},
/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
+ icon_state = "4-8"
},
/obj/effect/turf_decal/siding/wood{
- dir = 8;
- color = "#543C30"
+ dir = 8
},
-/turf/open/floor/wood/walnut,
-/area/ship/crew)
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
"uR" = (
/turf/closed/wall,
/area/ship/crew)
@@ -1125,6 +1125,21 @@
/obj/item/radio/intercom/directional/west,
/turf/open/floor/plasteel/mono/dark,
/area/ship/bridge)
+"vi" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
"vw" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 8
@@ -1156,13 +1171,26 @@
/obj/machinery/holopad/emergency/kitchen,
/turf/open/floor/plasteel/mono/white,
/area/ship/bridge)
-"wG" = (
-/obj/machinery/light/directional/north,
+"wF" = (
+/obj/structure/table/wood,
+/obj/item/paper_bin,
+/obj/item/pen/fountain,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 6
+ },
+/obj/item/megaphone{
+ pixel_x = 3;
+ pixel_y = 1
+ },
/obj/effect/turf_decal/siding/wood{
- dir = 5
+ dir = 2;
+ color = "#543C30"
},
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
+/turf/open/floor/wood/walnut,
+/area/ship/crew)
"wO" = (
/obj/machinery/seed_extractor,
/obj/effect/turf_decal/box,
@@ -1232,9 +1260,15 @@
/obj/item/storage/pill_bottle/dice,
/turf/open/floor/carpet/red_gold,
/area/ship/crew/canteen)
-"xC" = (
+"xH" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 10
+ },
+/turf/open/floor/plasteel/mono,
+/area/ship/bridge)
+"xO" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 8
@@ -1243,16 +1277,11 @@
icon_state = "4-8"
},
/obj/effect/turf_decal/siding/wood{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
-"xH" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 10
+ dir = 4;
+ color = "#543C30"
},
-/turf/open/floor/plasteel/mono,
-/area/ship/bridge)
+/turf/open/floor/wood/walnut,
+/area/ship/crew)
"xX" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 8
@@ -1262,16 +1291,6 @@
},
/turf/open/floor/plasteel,
/area/ship/crew/canteen)
-"yg" = (
-/obj/machinery/light/directional/west,
-/obj/effect/turf_decal/siding/wood{
- dir = 8
- },
-/obj/structure/chair/stool/bar{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
"yi" = (
/turf/open/floor/plating/airless,
/area/ship/external)
@@ -1342,17 +1361,6 @@
},
/turf/open/floor/plasteel/mono/white,
/area/ship/bridge)
-"zs" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 5
- },
-/obj/effect/turf_decal/siding/wood,
-/obj/machinery/newscaster/directional/south,
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
"zu" = (
/obj/machinery/gibber,
/obj/machinery/power/apc/auto_name/directional/west,
@@ -1455,19 +1463,15 @@
/obj/item/toy/cards/deck/syndicate,
/turf/open/floor/carpet/red_gold,
/area/ship/crew/canteen)
-"Bp" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
-"Bq" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 10
+"Bk" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 5
},
-/obj/structure/chair/sofa/right{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 5
},
+/obj/effect/turf_decal/siding/wood,
+/obj/machinery/newscaster/directional/south,
/turf/open/floor/wood,
/area/ship/crew/canteen)
"BC" = (
@@ -1524,22 +1528,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/ship/bridge)
-"CF" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/siding/wood{
- dir = 4;
- color = "#543C30"
- },
-/turf/open/floor/wood/walnut,
-/area/ship/crew)
"CP" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 8
@@ -1613,20 +1601,8 @@
/obj/item/toy/cards/deck/cas{
pixel_y = 8
},
-/obj/item/toy/cards/deck/cas/black,
-/turf/open/floor/carpet/red_gold,
-/area/ship/crew/canteen)
-"Dk" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
- },
-/obj/effect/turf_decal/siding/wood{
- dir = 4
- },
-/turf/open/floor/wood,
+/obj/item/toy/cards/deck/cas/black,
+/turf/open/floor/carpet/red_gold,
/area/ship/crew/canteen)
"Ds" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
@@ -1660,6 +1636,15 @@
/obj/effect/turf_decal/box,
/turf/open/floor/plasteel/mono/dark,
/area/ship/bridge)
+"DC" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/structure/chair/stool/bar{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
"DD" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
dir = 4
@@ -1694,15 +1679,6 @@
/obj/machinery/firealarm/directional/north,
/turf/open/floor/plasteel,
/area/ship/cargo)
-"DM" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 8
- },
-/obj/structure/chair/sofa{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
"DV" = (
/obj/machinery/atmospherics/components/binary/pump{
dir = 8;
@@ -1734,13 +1710,9 @@
/obj/structure/catwalk/over/plated_catwalk,
/turf/open/floor/plating,
/area/ship/cargo)
-"Eb" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 1
- },
-/obj/structure/chair/wood{
- dir = 8
- },
+"Ed" = (
+/obj/machinery/light/directional/south,
+/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood,
/area/ship/crew/canteen)
"Ei" = (
@@ -1778,13 +1750,6 @@
},
/turf/open/floor/plating,
/area/ship/crew/canteen)
-"Ey" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
- dir = 1
- },
-/obj/effect/turf_decal/siding/wood/corner,
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
"EF" = (
/obj/effect/turf_decal/corner/transparent/neutral{
dir = 1
@@ -1862,6 +1827,16 @@
/obj/machinery/door/firedoor/border_only,
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
+"FD" = (
+/obj/machinery/cryopod{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 4;
+ color = "#543C30"
+ },
+/turf/open/floor/wood/walnut,
+/area/ship/crew)
"FE" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 8
@@ -1981,13 +1956,11 @@
},
/turf/open/floor/plating,
/area/ship/maintenance)
-"HT" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 4
- },
-/obj/structure/chair/stool/bar{
- dir = 8
+"HG" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 1
},
+/obj/effect/turf_decal/siding/wood/corner,
/turf/open/floor/wood,
/area/ship/crew/canteen)
"HY" = (
@@ -2016,6 +1989,18 @@
/obj/structure/table/reinforced,
/turf/open/floor/plasteel/dark,
/area/ship/crew/canteen)
+"Ix" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/vending/clothing,
+/obj/machinery/light/directional/east,
+/obj/effect/turf_decal/siding/wood{
+ dir = 8;
+ color = "#543C30"
+ },
+/turf/open/floor/wood/walnut,
+/area/ship/crew)
"IC" = (
/obj/effect/turf_decal/ihejirika_small{
dir = 8
@@ -2050,6 +2035,22 @@
/obj/machinery/status_display/shuttle,
/turf/closed/wall,
/area/ship/crew/canteen)
+"JE" = (
+/obj/structure/table/wood,
+/obj/item/flashlight/lamp/green{
+ pixel_x = -6;
+ pixel_y = 10
+ },
+/obj/item/folder,
+/obj/machinery/computer/cryopod/directional/north{
+ pixel_y = 17
+ },
+/obj/item/radio/intercom/directional/west,
+/obj/effect/turf_decal/siding/wood/corner{
+ color = "#543C30"
+ },
+/turf/open/floor/wood/walnut,
+/area/ship/crew)
"JR" = (
/turf/closed/wall/r_wall,
/area/ship/crew)
@@ -2256,23 +2257,6 @@
},
/turf/open/floor/plasteel/dark,
/area/ship/crew)
-"Pi" = (
-/obj/machinery/firealarm/directional/south,
-/obj/effect/turf_decal/siding/wood{
- dir = 1;
- color = "#543C30"
- },
-/turf/open/floor/wood/walnut,
-/area/ship/crew)
-"PY" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 1
- },
-/obj/structure/chair/wood{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
"Qc" = (
/obj/structure/table/reinforced,
/obj/effect/spawner/lootdrop/donkpockets,
@@ -2312,16 +2296,6 @@
},
/turf/open/floor/plating,
/area/ship/maintenance)
-"QQ" = (
-/obj/machinery/computer/helm/viewscreen/directional/west,
-/obj/effect/turf_decal/siding/wood{
- dir = 8
- },
-/obj/structure/chair/sofa/left{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
"QR" = (
/obj/item/storage/toolbox/electrical,
/obj/item/storage/toolbox/electrical,
@@ -2346,18 +2320,6 @@
/obj/structure/catwalk/over/plated_catwalk,
/turf/open/floor/plating,
/area/ship/cargo)
-"Rk" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
- },
-/obj/effect/turf_decal/siding/wood{
- dir = 8
- },
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
"Ro" = (
/obj/machinery/smartfridge/food,
/turf/closed/wall/mineral/titanium/nodiagonal,
@@ -2375,6 +2337,16 @@
},
/turf/open/floor/plasteel/mono/white,
/area/ship/bridge)
+"RU" = (
+/obj/structure/bed,
+/obj/item/bedsheet/random,
+/obj/structure/curtain/bounty,
+/obj/effect/turf_decal/siding/wood/corner{
+ color = "#543C30";
+ dir = 1
+ },
+/turf/open/floor/wood/walnut,
+/area/ship/crew)
"Sa" = (
/turf/open/floor/plasteel,
/area/ship/crew/canteen)
@@ -2426,6 +2398,13 @@
},
/turf/open/floor/plasteel,
/area/ship/crew/canteen)
+"SM" = (
+/obj/machinery/light/directional/north,
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
"SO" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
/obj/structure/closet/secure_closet/freezer/meat/open,
@@ -2464,11 +2443,27 @@
},
/turf/open/floor/plating/airless,
/area/ship/external)
-"TB" = (
-/obj/machinery/light/directional/west,
-/obj/effect/turf_decal/siding/wood{
+"To" = (
+/obj/item/radio,
+/obj/item/radio,
+/obj/item/radio,
+/obj/item/radio,
+/obj/item/radio,
+/obj/item/radio,
+/obj/structure/closet/crate,
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/item/radio/intercom/directional/east,
+/obj/effect/turf_decal/siding/wood/corner{
+ color = "#543C30";
dir = 8
},
+/turf/open/floor/wood/walnut,
+/area/ship/crew)
+"Tp" = (
+/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood,
/area/ship/crew/canteen)
"TD" = (
@@ -2501,15 +2496,6 @@
/obj/structure/catwalk/over/plated_catwalk,
/turf/open/floor/plating,
/area/ship/cargo)
-"Uk" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 8
- },
-/obj/structure/chair/stool/bar{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
"Um" = (
/obj/machinery/chem_master/condimaster,
/obj/item/storage/box/beakers,
@@ -2538,6 +2524,22 @@
},
/turf/open/floor/plasteel,
/area/ship/cargo)
+"Uy" = (
+/obj/machinery/light/directional/west,
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/structure/chair/stool/bar{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
+"UC" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
"UI" = (
/obj/effect/turf_decal/corner/transparent/neutral{
dir = 1
@@ -2635,6 +2637,15 @@
/obj/effect/turf_decal/box,
/turf/open/floor/plasteel/dark,
/area/ship/crew/hydroponics)
+"WA" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/structure/chair/sofa{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
"WH" = (
/obj/effect/turf_decal/corner/transparent/neutral{
dir = 1
@@ -2647,26 +2658,6 @@
},
/turf/open/floor/plasteel/dark,
/area/ship/crew/canteen)
-"WJ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/light_switch{
- pixel_x = -25;
- pixel_y = 25
- },
-/obj/effect/turf_decal/siding/wood{
- dir = 2;
- color = "#543C30"
- },
-/turf/open/floor/wood/walnut,
-/area/ship/crew)
"WP" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
/turf/open/floor/plasteel,
@@ -2733,6 +2724,15 @@
/obj/machinery/door/firedoor/border_only,
/turf/open/floor/plasteel/dark,
/area/ship/crew)
+"Yr" = (
+/obj/docking_port/stationary{
+ width = 30;
+ height = 15;
+ dir = 8;
+ dwidth = 15
+ },
+/turf/template_noop,
+/area/template_noop)
"YC" = (
/obj/machinery/door/airlock/external{
dir = 8
@@ -2743,10 +2743,23 @@
/obj/machinery/light_switch{
dir = 1;
pixel_x = 25;
- pixel_y = -25
+ pixel_y = -20
},
/turf/open/floor/plasteel,
/area/ship/cargo)
+"YT" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 10
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/siding/wood,
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
"YZ" = (
/obj/machinery/door/poddoor{
id = "bridgelockdown";
@@ -2755,18 +2768,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/ship/bridge)
-"Zd" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 1
- },
-/obj/structure/table/wood/fancy/black,
-/obj/item/reagent_containers/food/condiment/saltshaker{
- pixel_x = 5;
- pixel_y = 5
- },
-/obj/item/reagent_containers/food/condiment/peppermill,
-/turf/open/floor/wood,
-/area/ship/crew/canteen)
"Zm" = (
/obj/machinery/door/airlock{
dir = 4
@@ -2796,16 +2797,13 @@
/obj/machinery/light/directional/south,
/turf/open/floor/plasteel/dark,
/area/ship/crew/hydroponics)
-"ZB" = (
-/obj/machinery/cryopod{
- dir = 1
- },
+"ZG" = (
+/obj/machinery/airalarm/directional/south,
/obj/effect/turf_decal/siding/wood{
- dir = 4;
- color = "#543C30"
+ dir = 6
},
-/turf/open/floor/wood/walnut,
-/area/ship/crew)
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
"ZQ" = (
/obj/machinery/light_switch{
dir = 1;
@@ -2814,14 +2812,25 @@
},
/turf/open/floor/plasteel/mono,
/area/ship/bridge)
-"ZW" = (
-/obj/docking_port/stationary{
- width = 15;
- height = 15;
+"ZY" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 8
},
-/turf/template_noop,
-/area/template_noop)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 8;
+ color = "#543C30"
+ },
+/turf/open/floor/wood/walnut,
+/area/ship/crew)
(1,1,1) = {"
vZ
@@ -2829,7 +2838,7 @@ vZ
vZ
vZ
vZ
-ZW
+Yr
vZ
vZ
vZ
@@ -3019,7 +3028,7 @@ Qm
sU
CP
rt
-sU
+tC
XQ
sU
sU
@@ -3036,28 +3045,28 @@ vZ
(11,1,1) = {"
vZ
cC
-fl
-TB
-rY
-Uk
-yg
-Rk
-QQ
-DM
-Bq
+UC
+oX
+uP
+DC
+Uy
+ny
+rk
+WA
+qB
uR
-kh
-jL
-CF
-ZB
-lY
+JE
+rz
+xO
+FD
+fz
JR
vZ
"}
(12,1,1) = {"
vZ
xr
-PY
+dU
qO
Se
Od
@@ -3065,20 +3074,20 @@ Dj
DD
Da
tT
-zs
+Bk
uR
-ef
+wF
XB
Ei
IV
-Pi
+hJ
JR
vZ
"}
(13,1,1) = {"
vZ
xr
-Zd
+pb
FE
Af
UO
@@ -3086,20 +3095,20 @@ xy
ro
hZ
XU
-tW
+YT
Yj
-WJ
+cZ
dy
AF
ct
-iA
+qZ
eS
vZ
"}
(14,1,1) = {"
vZ
xr
-Eb
+sR
my
jj
Bc
@@ -3107,28 +3116,28 @@ di
st
Wf
az
-iR
+Ed
uR
-tz
-ai
-kf
-uN
-pH
+To
+Ix
+dr
+ZY
+RU
eS
vZ
"}
(15,1,1) = {"
vZ
xr
-PY
-rR
-Ey
-HT
-HT
-Bp
-Bp
-Dk
-uC
+dU
+ev
+HG
+qE
+qE
+gq
+gq
+pg
+ZG
uR
uR
uR
@@ -3141,9 +3150,9 @@ vZ
(16,1,1) = {"
vZ
xr
-Zd
-rM
-sT
+pb
+jA
+Tp
WH
kS
kS
@@ -3162,9 +3171,9 @@ vZ
(17,1,1) = {"
vZ
xr
-Eb
-rM
-sT
+sR
+jA
+Tp
sp
cy
sn
@@ -3183,9 +3192,9 @@ vZ
(18,1,1) = {"
vZ
cC
-wG
-xC
-mX
+SM
+vi
+dP
sp
aV
NM
@@ -3337,7 +3346,7 @@ FA
Sf
Lj
Qc
-op
+rC
cA
Lj
ZQ
diff --git a/_maps/shuttles/shiptest/independent_dwayne.dmm b/_maps/shuttles/shiptest/independent_dwayne.dmm
index d532599831ec..99e8b9f1e0c5 100644
--- a/_maps/shuttles/shiptest/independent_dwayne.dmm
+++ b/_maps/shuttles/shiptest/independent_dwayne.dmm
@@ -425,6 +425,9 @@
/obj/effect/turf_decal/corner/opaque/blue{
dir = 4
},
+/obj/structure/closet/emcloset/wall{
+ pixel_y = 28
+ },
/turf/open/floor/plasteel/white{
dir = 1
},
@@ -886,49 +889,6 @@
"tq" = (
/turf/closed/wall/r_wall,
/area/ship/engineering)
-"tG" = (
-/obj/item/clothing/suit/hazardvest{
- desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
- name = "emergency lifejacket";
- pixel_x = -4;
- pixel_y = -4
- },
-/obj/item/clothing/suit/hazardvest{
- desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
- name = "emergency lifejacket"
- },
-/obj/item/clothing/suit/hazardvest{
- desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
- name = "emergency lifejacket";
- pixel_x = 4;
- pixel_y = 4
- },
-/obj/item/clothing/head/hardhat/mining{
- pixel_x = -4;
- pixel_y = -4
- },
-/obj/item/clothing/head/hardhat/mining,
-/obj/item/clothing/head/hardhat/mining{
- pixel_x = 4;
- pixel_y = 4
- },
-/obj/item/gps/mining,
-/obj/item/gps/mining,
-/obj/item/gps/mining,
-/obj/item/clothing/glasses/meson/prescription,
-/obj/item/clothing/glasses/meson,
-/obj/item/clothing/glasses/meson,
-/obj/item/t_scanner/adv_mining_scanner/lesser,
-/obj/item/gun/energy/kinetic_accelerator,
-/obj/item/pickaxe/silver,
-/obj/item/pickaxe/silver,
-/obj/item/storage/bag/ore,
-/obj/item/storage/bag/ore,
-/obj/structure/closet/wall{
- name = "equipment closet"
- },
-/turf/closed/wall/r_wall,
-/area/ship/cargo)
"tX" = (
/obj/structure/ore_box,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
@@ -1154,10 +1114,6 @@
},
/turf/open/floor/plasteel/mono/dark,
/area/ship/bridge)
-"zn" = (
-/obj/structure/closet/emcloset/wall,
-/turf/closed/wall,
-/area/ship/medical)
"zq" = (
/obj/structure/catwalk,
/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer4{
@@ -1509,6 +1465,47 @@
/turf/open/floor/plasteel/mono,
/area/ship/medical)
"IZ" = (
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket";
+ pixel_x = -4;
+ pixel_y = -4
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket";
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/obj/item/clothing/head/hardhat/mining{
+ pixel_x = -4;
+ pixel_y = -4
+ },
+/obj/item/clothing/head/hardhat/mining,
+/obj/item/clothing/head/hardhat/mining{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/obj/item/gps/mining,
+/obj/item/gps/mining,
+/obj/item/gps/mining,
+/obj/item/clothing/glasses/meson/prescription,
+/obj/item/clothing/glasses/meson,
+/obj/item/clothing/glasses/meson,
+/obj/item/t_scanner/adv_mining_scanner/lesser,
+/obj/item/gun/energy/kinetic_accelerator,
+/obj/item/pickaxe/silver,
+/obj/item/pickaxe/silver,
+/obj/item/storage/bag/ore,
+/obj/item/storage/bag/ore,
+/obj/structure/closet/wall{
+ name = "equipment closet";
+ pixel_y = 28
+ },
/obj/effect/turf_decal/industrial/warning/corner{
dir = 1
},
@@ -2594,7 +2591,7 @@ FP
nL
kM
YJ
-tG
+YJ
IZ
lv
dK
@@ -2654,7 +2651,7 @@ ei
ei
ei
ei
-zn
+oC
kb
lv
pt
diff --git a/_maps/shuttles/shiptest/independent_junker.dmm b/_maps/shuttles/shiptest/independent_junker.dmm
new file mode 100644
index 000000000000..41e443a3040e
--- /dev/null
+++ b/_maps/shuttles/shiptest/independent_junker.dmm
@@ -0,0 +1,3504 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ai" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light/small/directional/north,
+/obj/machinery/light_switch{
+ pixel_y = -20;
+ dir = 1;
+ pixel_x = -6
+ },
+/obj/structure/cable{
+ icon_state = "5-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/plating/rust,
+/area/ship/storage)
+"al" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/rack,
+/obj/item/crowbar,
+/obj/item/weldingtool/mini,
+/obj/item/stack/cable_coil/random,
+/obj/item/stack/packageWrap,
+/obj/item/analyzer,
+/obj/item/toner,
+/turf/open/floor/plating/rust,
+/area/ship/storage)
+"an" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "2-9"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/plating/rust,
+/area/ship/maintenance/port)
+"aq" = (
+/obj/item/trash/sosjerky,
+/obj/effect/spawner/lootdrop/maintenance,
+/obj/item/areaeditor/shuttle{
+ pixel_y = 7
+ },
+/obj/item/stack/tape/industrial{
+ pixel_x = -6;
+ pixel_y = 7
+ },
+/obj/item/spacecash/bundle/c50,
+/obj/item/radio/intercom/wideband/directional/east,
+/obj/structure/table/reinforced,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/turf/open/floor/plating,
+/area/ship/bridge)
+"ay" = (
+/obj/structure/rack,
+/obj/item/storage/backpack/explorer,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/spawner/lootdrop/maintenance/two,
+/obj/item/pickaxe/rusted,
+/turf/open/floor/plating,
+/area/ship/engineering/electrical)
+"aE" = (
+/obj/structure/rack,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light/small/broken/directional/north,
+/obj/effect/spawner/lootdrop/maintenance/three,
+/obj/item/flashlight/pen,
+/turf/open/floor/wood/walnut{
+ icon_state = "wood-broken"
+ },
+/area/ship/storage)
+"aN" = (
+/obj/structure/table/chem,
+/obj/item/reagent_containers/food/snacks/meat/slab{
+ pixel_y = 6;
+ pixel_x = -3
+ },
+/obj/item/reagent_containers/food/snacks/meat/slab{
+ pixel_x = 4;
+ pixel_y = 9
+ },
+/obj/item/kitchen/knife{
+ pixel_y = -3;
+ pixel_x = 10
+ },
+/obj/item/cutting_board,
+/turf/open/floor/plastic,
+/area/ship/crew/canteen/kitchen)
+"aX" = (
+/obj/structure/cable{
+ icon_state = "6-10"
+ },
+/obj/machinery/computer/helm/retro,
+/obj/item/paper/construction{
+ info = "Yeah, just so you know, I left the fuel and air pumps OFF when I dropped this thing of for you, you're gonna have to go outside and turn em on to start up the engines
1: Bolt the door behind you so you dont bump into it and lose all our air. Bolt is the LEFT BUTTON 2: Go to the air alarm, set it to siphon 3: When at least most of the gas is out, turn OFF siphon 4: You can now open the shutters I shouldnt have to tell you this, but theyre the RIGHT button
To go back IN
1: Close the shutters behind you 2: Set the air alarm to SIPHON again 3: When all of the dangerous gas is out, set the air alarm to FILL 3: Once the pressure is at least 50 kpa, you can set the air alarm back to normal, and unbolt the door
Results: Reployer remains unfunctioning."
+ },
+/obj/item/paper/crumpled{
+ pixel_y = -12;
+ pixel_x = -3;
+ info = "Attempt 1180. Salt circle was established with regular rituals. 30mL of blood was dripped directly onto the reployer, and chanting begun 1 minute after the beginning of the attempt. Despite using only lighting from tallow candles, soapbucket scrying was ineffective in troubleshooting the problem.
Admin Help Ticket #[id]: [LinkedReplyName(ref_src)]
"
+ dat += "
Admin Help Ticket #[id]: [linked_reply_name(ref_src)] (Claimed by [claimed_by || "nobody"])
"
dat += "State: "
switch(state)
if(AHELP_ACTIVE)
@@ -453,55 +491,64 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
dat += "CLOSED"
else
dat += "UNKNOWN"
- dat += "[FOURSPACES][TicketHref("Refresh", ref_src)][FOURSPACES][TicketHref("Re-Title", ref_src, "retitle")]"
+ dat += "[FOURSPACES][ticket_href("Refresh", ref_src)][FOURSPACES][ticket_href("Re-Title", ref_src, "retitle")]"
if(state != AHELP_ACTIVE)
- dat += "[FOURSPACES][TicketHref("Reopen", ref_src, "reopen")]"
+ dat += "[FOURSPACES][ticket_href("Reopen", ref_src, "reopen")]"
dat += "
Opened at: [gameTimestamp(wtime = opened_at)] (Approx [DisplayTimeText(world.time - opened_at)] ago)"
if(closed_at)
dat += " Closed at: [gameTimestamp(wtime = closed_at)] (Approx [DisplayTimeText(world.time - closed_at)] ago)"
dat += "
"
if(initiator)
- dat += "Actions: [FullMonty(ref_src)] "
+ dat += "Actions: [full_monty(ref_src)] "
else
- dat += "DISCONNECTED[FOURSPACES][ClosureLinks(ref_src)] "
+ dat += "DISCONNECTED[ticket_actions(ref_src)] "
dat += " Log:
"
for(var/I in _interactions)
dat += "[I] "
- usr << browse(dat.Join(), "window=ahelp[id];size=620x480")
+ var/datum/browser/popup = new(usr, "ahelp[id]", "Ticket #[id]", 620, 480)
+ popup.set_content(dat.Join())
+ popup.open()
-/datum/admin_help/proc/Retitle()
+/datum/admin_help/proc/retitle()
var/new_title = input(usr, "Enter a title for the ticket", "Rename Ticket", name) as text|null
if(new_title)
name = new_title
//not saying the original name cause it could be a long ass message
- var/msg = "Ticket [TicketHref("#[id]")] titled [name] by [key_name_admin(usr)]"
+ var/msg = "Ticket [ticket_href("#[id]")] titled [name] by [key_name_admin(usr)]"
message_admins(msg)
log_admin_private(msg)
- TicketPanel() //we have to be here to do this
+ ticket_panel() //we have to be here to do this
//Forwarded action from admin/Topic
-/datum/admin_help/proc/Action(action)
+/datum/admin_help/proc/action(mob/user, action)
testing("Ahelp action: [action]")
switch(action)
+ if("claim")
+ if(user.key == claimed_by)
+ unclaim()
+ return
+ claim()
if("ticket")
- TicketPanel()
+ ticket_panel()
if("retitle")
- Retitle()
+ retitle()
if("reject")
- Reject()
+ reject()
if("reply")
- usr.client.cmd_ahelp_reply(initiator)
+ if(!claim())
+ return
+ user.client.cmd_ahelp_reply(initiator)
if("icissue")
- ICIssue()
+ ic_issue()
if("skillissue")
- SkillIssue()
+ skill_issue()
if("close")
- Close()
+ close()
if("resolve")
- Resolve()
+ resolve()
if("reopen")
- Reopen()
+ reopen()
//
// TICKET STATCLICK
@@ -518,7 +565,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
return ..(ahelp_datum.name)
/obj/effect/statclick/ahelp/Click()
- ahelp_datum.TicketPanel()
+ ahelp_datum.ticket_panel()
/obj/effect/statclick/ahelp/Destroy()
ahelp_datum = null
@@ -562,14 +609,14 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
if(current_ticket)
if(alert(usr, "You already have a ticket open. Is this for the same issue?",,"Yes","No") != "No")
if(current_ticket)
- current_ticket.MessageNoRecipient(msg)
- current_ticket.TimeoutVerb()
+ current_ticket.message_no_recipient(msg)
+ current_ticket.timeout_verb()
return
else
to_chat(usr, "Ticket not found, creating new one...", confidential = TRUE)
else
- current_ticket.AddInteraction("[key_name_admin(usr)] opened a new ticket.")
- current_ticket.Close()
+ current_ticket.add_interaction("[key_name_admin(usr)] opened a new ticket.")
+ current_ticket.close()
//Extremely simple system of suggesting mentorhelp instead of adminhelp
var/msg_lower = lowertext(msg)
@@ -594,12 +641,12 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
else
C = what
if(istype(C) && C.current_ticket)
- C.current_ticket.AddInteraction(message)
+ C.current_ticket.add_interaction(message)
return C.current_ticket
if(istext(what)) //ckey
- var/datum/admin_help/AH = GLOB.ahelp_tickets.CKey2ActiveTicket(what)
+ var/datum/admin_help/AH = GLOB.ahelp_tickets.ckey2active_ticket(what)
if(AH)
- AH.AddInteraction(message)
+ AH.add_interaction(message)
return AH
//
@@ -638,8 +685,8 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
/proc/send2tgs(msg,msg2)
- msg = replacetext(replacetext(msg, "\proper", ""), "\improper", "")
- msg2 = replacetext(replacetext(msg2, "\proper", ""), "\improper", "")
+ msg = format_text(msg)
+ msg2 = format_text(msg2)
world.TgsTargetedChatBroadcast("[msg] | [msg2]", TRUE)
/**
@@ -772,3 +819,75 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
return founds
return msg
+
+/**
+ * Checks a given message to see if any of the words are something we want to treat specially, as detailed below.
+ *
+ * There are 3 cases where a word is something we want to act on
+ * 1. Admin pings, like @adminckey. Pings the admin in question, text is not clickable
+ * 2. Datum refs, like @0x2001169 or @mob_23. Clicking on the link opens up the VV for that datum
+ * 3. Ticket refs, like #3. Displays the status and ahelper in the link, clicking on it brings up the ticket panel for it.
+ * Returns a list being used as a tuple. Index ASAY_LINK_NEW_MESSAGE_INDEX contains the new message text (with clickable links and such)
+ * while index ASAY_LINK_PINGED_ADMINS_INDEX contains a list of pinged admin clients, if there are any.
+ *
+ * Arguments:
+ * * msg - the message being scanned
+ */
+/proc/check_asay_links(msg)
+ var/list/msglist = splittext(msg, " ") //explode the input msg into a list
+ var/list/pinged_admins = list() // if we ping any admins, store them here so we can ping them after
+ var/modified = FALSE // did we find anything?
+
+ var/i = 0
+ for(var/word in msglist)
+ i++
+ if(!length(word))
+ continue
+
+ switch(word[1])
+ if("@")
+ var/stripped_word = ckey(copytext(word, 2))
+
+ // first we check if it's a ckey of an admin
+ var/client/client_check = GLOB.directory[stripped_word]
+ if(client_check?.holder)
+ msglist[i] = "[word]"
+ pinged_admins[stripped_word] = client_check
+ modified = TRUE
+ continue
+
+ // then if not, we check if it's a datum ref
+
+ var/word_with_brackets = "\[[stripped_word]\]" // the actual memory address lookups need the bracket wraps
+ var/datum/datum_check = locate(word_with_brackets)
+ if(!istype(datum_check))
+ continue
+ msglist[i] = "[word]"
+ modified = TRUE
+
+ if("#") // check if we're linking a ticket
+ var/possible_ticket_id = text2num(copytext(word, 2))
+ if(!possible_ticket_id)
+ continue
+
+ var/datum/admin_help/ahelp_check = GLOB.ahelp_tickets?.ticket_by_id(possible_ticket_id)
+ if(!ahelp_check)
+ continue
+
+ var/state_word
+ switch(ahelp_check.state)
+ if(AHELP_ACTIVE)
+ state_word = "Active"
+ if(AHELP_CLOSED)
+ state_word = "Closed"
+ if(AHELP_RESOLVED)
+ state_word = "Resolved"
+
+ msglist[i]= "[word] ([state_word] | [ahelp_check.initiator_key_name])"
+ modified = TRUE
+
+ if(modified)
+ var/list/return_list = list()
+ return_list[ASAY_LINK_NEW_MESSAGE_INDEX] = jointext(msglist, " ") // without tuples, we must make do!
+ return_list[ASAY_LINK_PINGED_ADMINS_INDEX] = pinged_admins
+ return return_list
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index b4e5653b0076..d227d44e18b0 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -82,7 +82,7 @@
type = MESSAGE_TYPE_ADMINPM,
html = "Message not sent: [msg]",
confidential = TRUE)
- AH.AddInteraction("No client found, message not sent: [msg]")
+ AH.add_interaction("No client found, message not sent: [msg]")
return
cmd_admin_pm(whom, msg)
@@ -169,10 +169,10 @@
html = "Message not sent: [msg]",
confidential = TRUE)
if(recipient_ticket)
- recipient_ticket.AddInteraction("No client found, message not sent: [msg]")
+ recipient_ticket.add_interaction("No client found, message not sent: [msg]")
return
else
- current_ticket.MessageNoRecipient(msg)
+ current_ticket.message_no_recipient(msg)
return
@@ -212,6 +212,8 @@
if(holder && recipient.holder && !current_ticket) //Both are admins, and this is not a reply to our own ticket.
badmin = TRUE
if(recipient.holder && !badmin)
+ SEND_SIGNAL(current_ticket, COMSIG_ADMIN_HELP_REPLIED)
+
if(holder)
to_chat(recipient,
type = MESSAGE_TYPE_ADMINPM,
@@ -226,7 +228,7 @@
admin_ticket_log(src, interaction_message)
if(recipient != src) //reeee
admin_ticket_log(recipient, interaction_message)
- SSblackbox.LogAhelp(current_ticket.id, "Reply", msg, recipient.ckey, src.ckey)
+ SSblackbox.log_ahelp(current_ticket.id, "Reply", msg, recipient.ckey, src.ckey)
else //recipient is an admin but sender is not
var/replymsg = "Reply PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]"
admin_ticket_log(src, "[replymsg]")
@@ -238,19 +240,18 @@
type = MESSAGE_TYPE_ADMINPM,
html = "PM to-Admins: [msg]",
confidential = TRUE)
- SSblackbox.LogAhelp(current_ticket.id, "Reply", msg, recipient.ckey, src.ckey)
+ SSblackbox.log_ahelp(current_ticket.id, "Reply", msg, recipient.ckey, src.ckey)
//play the receiving admin the adminhelp sound (if they have them enabled)
if(recipient.prefs.toggles & SOUND_ADMINHELP)
SEND_SOUND(recipient, sound('sound/effects/adminhelp.ogg'))
-
else
if(holder) //sender is an admin but recipient is not. Do BIG RED TEXT
var/already_logged = FALSE
if(!recipient.current_ticket)
new /datum/admin_help(msg, recipient, TRUE)
already_logged = TRUE
- SSblackbox.LogAhelp(recipient.current_ticket.id, "Ticket Opened", msg, recipient.ckey, src.ckey)
+ SSblackbox.log_ahelp(recipient.current_ticket.id, "Ticket Opened", msg, recipient.ckey, src.ckey)
to_chat(recipient,
type = MESSAGE_TYPE_ADMINPM,
@@ -272,21 +273,23 @@
admin_ticket_log(recipient, "PM From [key_name_admin(src)]: [keywordparsedmsg]")
if(!already_logged) //Reply to an existing ticket
- SSblackbox.LogAhelp(recipient.current_ticket.id, "Reply", msg, recipient.ckey, src.ckey)
+ SSblackbox.log_ahelp(recipient.current_ticket.id, "Reply", msg, recipient.ckey, src.ckey)
//always play non-admin recipients the adminhelp sound
SEND_SOUND(recipient, sound('sound/effects/adminhelp.ogg'))
- //AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn
- if(CONFIG_GET(flag/popup_admin_pm))
- INVOKE_ASYNC(src, .proc/popup_admin_pm, recipient, msg)
-
- else //neither are admins
- to_chat(src,
- type = MESSAGE_TYPE_ADMINPM,
- html = "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.",
- confidential = TRUE)
- return
+ else //neither are admins
+ if(!current_ticket)
+ to_chat(src,
+ type = MESSAGE_TYPE_ADMINPM,
+ html = span_danger("Error: Admin-PM: Non-admin to non-admin PM communication is forbidden."),
+ confidential = TRUE)
+ to_chat(src,
+ type = MESSAGE_TYPE_ADMINPM,
+ html = "[span_danger("Message not sent:")] [msg]",
+ confidential = TRUE)
+ return
+ current_ticket.message_no_recipient(msg)
if(external)
log_admin_private("PM: [key_name(src)]->External: [rawmsg]")
@@ -306,22 +309,12 @@
html = "PM: [key_name(src, X, 0)]->[key_name(recipient, X, 0)]: [keywordparsedmsg]" ,
confidential = TRUE)
-/client/proc/popup_admin_pm(client/recipient, msg)
- var/sender = src
- var/sendername = key
- var/reply = input(recipient, msg,"Admin PM from-[sendername]", "") as message|null //show message and await a reply
- if(recipient && reply)
- if(sender)
- recipient.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them
- else
- adminhelp(reply) //sender has left, adminhelp instead
-
#define TGS_AHELP_USAGE "Usage: ticket "
/proc/TgsPm(target,msg,sender)
target = ckey(target)
var/client/C = GLOB.directory[target]
- var/datum/admin_help/ticket = C ? C.current_ticket : GLOB.ahelp_tickets.CKey2ActiveTicket(target)
+ var/datum/admin_help/ticket = C ? C.current_ticket : GLOB.ahelp_tickets.ckey2active_ticket(target)
var/compliant_msg = trim(lowertext(msg))
var/tgs_tagged = "[sender](TGS/External)"
var/list/splits = splittext(compliant_msg, " ")
@@ -331,23 +324,23 @@
switch(splits[2])
if("close")
if(ticket)
- ticket.Close(tgs_tagged)
+ ticket.close(tgs_tagged)
return "Ticket #[ticket.id] successfully closed"
if("resolve")
if(ticket)
- ticket.Resolve(tgs_tagged)
+ ticket.resolve(tgs_tagged)
return "Ticket #[ticket.id] successfully resolved"
if("icissue")
if(ticket)
- ticket.ICIssue(tgs_tagged)
+ ticket.ic_issue(tgs_tagged)
return "Ticket #[ticket.id] successfully marked as IC issue"
if("skill")
if(ticket)
- ticket.SkillIssue(tgs_tagged)
+ ticket.skill_issue(tgs_tagged)
return "Ticket #[ticket.id] successfully marked as skill issue"
if("reject")
if(ticket)
- ticket.Reject(tgs_tagged)
+ ticket.reject(tgs_tagged)
return "Ticket #[ticket.id] successfully rejected"
if("reopen")
if(ticket)
@@ -357,15 +350,15 @@
fail = text2num(splits[3])
if(isnull(fail))
return "Error: No/Invalid ticket id specified. [TGS_AHELP_USAGE]"
- var/datum/admin_help/AH = GLOB.ahelp_tickets.TicketByID(fail)
+ var/datum/admin_help/AH = GLOB.ahelp_tickets.ticket_by_id(fail)
if(!AH)
return "Error: Ticket #[fail] not found"
if(AH.initiator_ckey != target)
return "Error: Ticket #[fail] belongs to [AH.initiator_ckey]"
- AH.Reopen()
+ AH.reopen()
return "Ticket #[ticket.id] successfully reopened"
if("list")
- var/list/tickets = GLOB.ahelp_tickets.TicketsByCKey(target)
+ var/list/tickets = GLOB.ahelp_tickets.tickets_by_ckey(target)
if(!tickets.len)
return "None"
. = ""
diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm
index 7fa7d1486aad..fa2c1c6c823c 100644
--- a/code/modules/admin/verbs/adminsay.dm
+++ b/code/modules/admin/verbs/adminsay.dm
@@ -9,6 +9,19 @@
if(!msg)
return
+ if(findtext(msg, "@") || findtext(msg, "#"))
+ var/list/link_results = check_asay_links(msg)
+ if(length(link_results))
+ msg = link_results[ASAY_LINK_NEW_MESSAGE_INDEX]
+ link_results[ASAY_LINK_NEW_MESSAGE_INDEX] = null
+ var/list/pinged_admin_clients = link_results[ASAY_LINK_PINGED_ADMINS_INDEX]
+ for(var/iter_ckey in pinged_admin_clients)
+ var/client/iter_admin_client = pinged_admin_clients[iter_ckey]
+ if(!iter_admin_client?.holder)
+ continue
+ window_flash(iter_admin_client)
+ SEND_SOUND(iter_admin_client.mob, sound('sound/misc/asay_ping.ogg'))
+
mob.log_talk(msg, LOG_ASAY)
msg = keywords_lookup(msg)
var/custom_asay_color = (CONFIG_GET(flag/allow_admin_asaycolor) && prefs.asaycolor) ? "" : ""
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index b827639b9f0c..524cd800f698 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -690,6 +690,27 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
to_chat(usr, "[template.name]", confidential = TRUE)
to_chat(usr, "[template.description]", confidential = TRUE)
+/client/proc/fucky_wucky()
+ set category = "Debug"
+ set name = "Fucky Wucky"
+ set desc = "Inform the players that the code monkeys at our headquarters are working very hard to fix this."
+
+ if(!check_rights(R_DEBUG))
+ return
+ remove_verb(/client/proc/fucky_wucky)
+ message_admins("[key_name_admin(src)] did a fucky wucky.")
+ log_admin("[key_name(src)] did a fucky wucky.")
+ for(var/m in GLOB.player_list)
+ var/datum/asset/fuckywucky = get_asset_datum(/datum/asset/simple/fuckywucky)
+ fuckywucky.send(m)
+ SEND_SOUND(m, 'sound/misc/fuckywucky.ogg')
+ to_chat(m, span_purple(examine_block("")))
+
+ addtimer(CALLBACK(src, PROC_REF(restore_fucky_wucky)), 600)
+
+/client/proc/restore_fucky_wucky()
+ add_verb(/client/proc/fucky_wucky)
+
/client/proc/toggle_medal_disable()
set category = "Debug"
set name = "Toggle Medal Disable"
diff --git a/code/modules/admin/verbs/overmap_token_manager.dm b/code/modules/admin/verbs/overmap_token_manager.dm
new file mode 100644
index 000000000000..1dc57b17b05e
--- /dev/null
+++ b/code/modules/admin/verbs/overmap_token_manager.dm
@@ -0,0 +1,93 @@
+/client/proc/overmap_datum_token_manager()
+ set name = "Overmap Datum Token Manager"
+ set category = "Admin.Game"
+ set desc = "Manage the tokens of the overmap datum."
+
+ var/static/datum/overmap_datum_token_manager/manager
+ if(isnull(manager))
+ manager = new
+ manager.ui_interact(mob)
+
+/// Datum for the overmap datum token manager.
+/datum/overmap_datum_token_manager
+
+/datum/overmap_datum_token_manager/ui_state(mob/user)
+ return GLOB.admin_state
+
+/datum/overmap_datum_token_manager/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(isnull(ui))
+ ui = new(user, src, "OvermapTokenManager")
+ ui.open()
+
+/datum/overmap_datum_token_manager/proc/get_name_and_ref(datum/overmap/from)
+ if(isnull(from))
+ return null
+ return list(
+ "name" = from.name,
+ "ref" = REF(from),
+ )
+
+/datum/overmap_datum_token_manager/ui_data(mob/user)
+ . = list()
+ for(var/datum/overmap/overmap_datum as anything in SSovermap.overmap_objects)
+ var/datum_type = "[overmap_datum.type]"
+ if(!(datum_type in .))
+ .[datum_type] = list()
+
+ var/list/datum_info = list()
+ .[datum_type] += list(datum_info)
+
+ datum_info["name"] = overmap_datum.name
+ datum_info["ref"] = REF(overmap_datum)
+ datum_info["token"] = get_name_and_ref(overmap_datum.token)
+ datum_info["position"] = list(overmap_datum.x, overmap_datum.y)
+ datum_info["docked_to"] = get_name_and_ref(overmap_datum.docked_to)
+
+ var/list/docked_info = list()
+ datum_info["docked"] = docked_info
+ for(var/datum/overmap/docked as anything in overmap_datum.contents)
+ docked_info += list(get_name_and_ref(docked))
+
+ if(istype(overmap_datum, /datum/overmap/ship/controlled))
+ var/datum/overmap/ship/controlled/ship = overmap_datum
+ datum_info["ship_port_ref"] = REF(ship.shuttle_port)
+
+/datum/overmap_datum_token_manager/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ . = ..()
+ if(.)
+ return
+
+ switch(action)
+ if("vv")
+ var/datum/target = locate(params["ref"])
+ if(isnull(target))
+ return
+ ui.user.client.debug_variables(target)
+ return TRUE
+
+ if("jump")
+ var/target = locate(params["ref"])
+ if(isnull(target))
+ return
+
+ if(!isobserver(ui.user) && !ui.user.client.admin_ghost())
+ return
+ ui.user.forceMove(get_turf(target))
+ return TRUE
+
+ if("token-new")
+ var/datum/overmap/target = locate(params["ref"]) in SSovermap.overmap_objects
+ if(isnull(target))
+ return
+ target.set_or_create_token()
+ message_admins("[key_name_admin(ui.user)] regenerated the token for [target.name] ([target.type])")
+ return TRUE
+
+ if("token-force-update")
+ var/datum/overmap/target = locate(params["ref"]) in SSovermap.overmap_objects
+ if(isnull(target))
+ return
+ target.set_or_create_token(target.token)
+ message_admins("[key_name_admin(ui.user)] forced an update of the token for [target.name] ([target.type])")
+ return TRUE
diff --git a/code/modules/admin/verbs/selectequipment.dm b/code/modules/admin/verbs/selectequipment.dm
index 68eb9bab1216..9bc6ab3dcea9 100644
--- a/code/modules/admin/verbs/selectequipment.dm
+++ b/code/modules/admin/verbs/selectequipment.dm
@@ -106,13 +106,7 @@
/datum/select_equipment/ui_data(mob/user)
var/list/data = list()
- if(!dummy_key)
- init_dummy()
- var/icon/dummysprite = get_flat_human_icon(null,
- dummy_key = dummy_key,
- outfit_override = selected_outfit)
- data["icon64"] = icon2base64(dummysprite)
data["name"] = target_mob
var/datum/preferences/prefs = user?.client?.prefs
@@ -129,6 +123,15 @@
/datum/select_equipment/ui_static_data(mob/user)
var/list/data = list()
+ if(!dummy_key)
+ init_dummy()
+ var/icon/dummysprite = get_flat_human_icon(
+ null,
+ dummy_key = dummy_key,
+ outfit_override = selected_outfit
+ )
+ data["icon64"] = icon2base64(dummysprite)
+
if(!cached_outfits)
cached_outfits = list()
cached_outfits += list(outfit_entry("General", /datum/outfit, "Naked", priority=TRUE))
@@ -152,7 +155,7 @@
return custom_outfit
-/datum/select_equipment/ui_act(action, params)
+/datum/select_equipment/ui_act(action, params, ui)
if(..())
return
. = TRUE
@@ -171,6 +174,7 @@
return
selected_outfit = new_outfit
+ update_static_data(user, ui)
if("applyoutfit")
var/datum/outfit/new_outfit = resolve_outfit(params["path"])
diff --git a/code/modules/admin/verbs/toggle_ship_spawn.dm b/code/modules/admin/verbs/toggle_ship_spawn.dm
new file mode 100644
index 000000000000..ffaed8c6c442
--- /dev/null
+++ b/code/modules/admin/verbs/toggle_ship_spawn.dm
@@ -0,0 +1,19 @@
+GLOBAL_VAR_INIT(ship_spawn_enabled, TRUE)
+
+/client/proc/toggle_ship_spawn()
+ set name = "Toggle Ship Spawn"
+ set category = "Server"
+ set desc = "Toggles the ability of players to create ships via the roundstart screen or shuttle creator."
+
+ if(!holder)
+ to_chat(src, "Only administrators may use this command.", confidential = TRUE)
+ return
+ if(check_rights(R_ADMIN, 1))
+ GLOB.ship_spawn_enabled ^= TRUE
+ var/message
+ if(GLOB.ship_spawn_enabled)
+ message = "[key_name_admin(usr)] enabled player ship spawning."
+ else
+ message = "[key_name_admin(usr)] disabled player ship spawning."
+ message_admins(message)
+ log_game(message)
diff --git a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm
index 641c21bd5b24..fcfbfc7f8646 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm
@@ -41,7 +41,8 @@
/datum/surgery_step/gland_insert
name = "insert gland"
- implements = list(/obj/item/organ/heart/gland = 100)
+ implements = list(
+ /obj/item/organ/heart/gland = 100)
time = 32
/datum/surgery_step/gland_insert/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
diff --git a/code/modules/antagonists/abductor/equipment/glands/transform.dm b/code/modules/antagonists/abductor/equipment/glands/transform.dm
index de718235d79b..1b2c55a6e696 100644
--- a/code/modules/antagonists/abductor/equipment/glands/transform.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/transform.dm
@@ -11,5 +11,5 @@
/obj/item/organ/heart/gland/transform/activate()
to_chat(owner, "You feel unlike yourself.")
randomize_human(owner)
- var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/moth, /datum/species/fly, /datum/species/squid))
+ var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/moth, /datum/species/fly,))
owner.set_species(species)
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index 4e68c4bf7fd8..acce4799bf77 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -1019,16 +1019,7 @@ structure_check() searches for nearby cultist structures required for the invoca
if(51 to 60)
var/datum/round_event_control/spider_infestation/SI = new()
SI.runEvent()
- if(61 to 70)
- var/datum/round_event_control/anomaly/anomaly_flux/AF
- var/datum/round_event_control/anomaly/anomaly_grav/AG
- var/datum/round_event_control/anomaly/anomaly_pyro/AP
- var/datum/round_event_control/anomaly/anomaly_vortex/AV
- AF.runEvent()
- AG.runEvent()
- AP.runEvent()
- AV.runEvent()
- if(71 to 80)
+ if(61 to 80)
var/datum/round_event_control/spacevine/SV = new()
var/datum/round_event_control/grey_tide/GT = new()
SV.runEvent()
diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm
index b9f2ee96ffda..db65e0cbd688 100644
--- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm
+++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm
@@ -615,7 +615,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/AI_Module))
cost = 25
power_type = /datum/action/innate/ai/break_fire_alarms
unlock_text = "You replace the thermal sensing capabilities of all fire alarms with a manual override, allowing you to turn them off at will."
- unlock_sound = 'goon/sound/machinery/firealarm.ogg'
+ unlock_sound = 'sound/machines/firealarm.ogg'
/datum/action/innate/ai/break_fire_alarms
name = "Override Thermal Sensors"
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index e745323efc0a..a5be27f88526 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -185,6 +185,7 @@
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
resistance_flags = FIRE_PROOF
var/anomaly_type = /obj/effect/anomaly
+ var/research
/obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal)
if(!signal)
@@ -193,10 +194,12 @@
return FALSE
if(suicider)
manual_suicide(suicider)
- for(var/obj/effect/anomaly/A in get_turf(src))
- A.anomalyNeutralize()
+ for(var/obj/effect/anomaly/Anomaly in get_turf(src))
+ Anomaly.anomalyNeutralize()
return TRUE
+
+
/obj/item/assembly/signaler/anomaly/manual_suicide(mob/living/carbon/user)
user.visible_message("[user]'s [src] is reacting to the radio signal, warping [user.p_their()] body!")
user.set_suicide(TRUE)
@@ -208,7 +211,25 @@
to_chat(user, "Analyzing... [src]'s stabilized field is fluctuating along frequency [format_frequency(frequency)], code [code].")
..()
+/obj/item/assembly/signaler/anomaly/det_signal
+ name = "anomaly field"
+ research = null
+ anomaly_type = null
+
+/obj/item/assembly/signaler/anomaly/det_signal/receive_signal(datum/signal/signal)
+ if(!signal)
+ return FALSE
+ if(signal.data["code"] != code)
+ return FALSE
+ if(suicider)
+ manual_suicide(suicider)
+ for(var/obj/effect/anomaly/Anomaly in get_turf(src))
+ Anomaly.detonate()
+ return TRUE
+
+
//Anomaly cores
+
/obj/item/assembly/signaler/anomaly/pyro
name = "\improper pyroclastic anomaly core"
desc = "The neutralized core of a pyroclastic anomaly. It feels warm to the touch. It'd probably be valuable for research."
@@ -237,7 +258,44 @@
name = "\improper vortex anomaly core"
desc = "The neutralized core of a vortex anomaly. It won't sit still, as if some invisible force is acting on it. It'd probably be valuable for research."
icon_state = "vortex core"
- anomaly_type = /obj/effect/anomaly/bhole
+ anomaly_type = /obj/effect/anomaly/vortex
+
+/obj/item/assembly/signaler/anomaly/hallucination
+ name = "\improper hallucination anomaly core"
+ desc = "The neutralized core of a hallucination anomaly. It seems to be moving, but it's probably your imagination. It'd probably be valuable for research."
+ icon_state = "hallucination_core"
+ anomaly_type = /obj/effect/anomaly/hallucination
+
+/obj/item/assembly/signaler/anomaly/sparkler
+ name = "\improper sparkler anomaly core"
+ desc = "The neutralized core of a sparkler anomaly. Tiny electrical sparks arc off it."
+ anomaly_type = /obj/effect/anomaly/sparkler
+
+/obj/item/assembly/signaler/anomaly/veins
+ name = "\improper fountain anomaly core"
+ desc = "The neutralized core of a fountain anomaly. Blood drips off of it."
+ anomaly_type = /obj/effect/anomaly/sparkler
+
+/obj/item/assembly/signaler/anomaly/phantom
+ name = "\improper phantom anomaly core"
+ desc = "The neutralized core of a phantom anomaly. It quietly screams."
+ anomaly_type = /obj/effect/anomaly/phantom
+
+/obj/item/assembly/signaler/anomaly/pulsar
+ name = "\improper pulsar anomaly core"
+ desc = "The neutralized core of a pulsar anomaly. Electromagnetic crackles come off it."
+
+/obj/item/assembly/signaler/anomaly/plasmasoul
+ name = "\improper plasmasoul anomaly core"
+ desc = "The neutralized core of a plasmasoul anomaly. The air around it hisses."
+
+/obj/item/assembly/signaler/anomaly/heartbeat
+ name = "\improper heartbeat anomaly core"
+ desc = "The neutralized core of a heartbeat anomaly. It's concerningly warm to the touch."
+
+/obj/item/assembly/signaler/anomaly/tvstatic
+ name = "\improper static anomaly core"
+ desc = "The neutralized core of a static anomaly. Your head hurts just staring at it"
/obj/item/assembly/signaler/anomaly/attack_self()
return
diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm
index 77b22505188c..8b76ab432cdf 100644
--- a/code/modules/asset_cache/asset_list_items.dm
+++ b/code/modules/asset_cache/asset_list_items.dm
@@ -110,6 +110,10 @@
"stamp-solgov" = 'icons/stamp_icons/large_stamp-solgov.png'
)
+/datum/asset/simple/fuckywucky
+ assets = list(
+ "fuckywucky.png" = 'html/fuckywucky.png'
+ )
/datum/asset/simple/IRV
assets = list(
diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm
index 6ec5bc73414a..428e8b5a6d18 100644
--- a/code/modules/atmospherics/environmental/LINDA_fire.dm
+++ b/code/modules/atmospherics/environmental/LINDA_fire.dm
@@ -48,10 +48,6 @@
var/bypassing = FALSE
var/visual_update_tick = 0
-#define IGNITE_TURF_CHANCE 30
-#define IGNITE_TURF_LOW_POWER 8
-#define IGNITE_TURF_HIGH_POWER 22
-
/obj/effect/hotspot/Initialize(mapload, starting_volume, starting_temperature)
. = ..()
SSair.hotspots += src
@@ -68,14 +64,6 @@
)
AddElement(/datum/element/connect_loc, loc_connections)
- if(prob(IGNITE_TURF_CHANCE))
- var/turf/my_turf = loc
- my_turf.IgniteTurf(rand(IGNITE_TURF_LOW_POWER,IGNITE_TURF_HIGH_POWER))
-
-#undef IGNITE_TURF_CHANCE
-#undef IGNITE_TURF_LOW_POWER
-#undef IGNITE_TURF_HIGH_POWER
-
/obj/effect/hotspot/proc/perform_exposure()
var/turf/open/location = loc
if(!istype(location) || !(location.air))
diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm
index 9ad5077ba447..383a362a0228 100644
--- a/code/modules/atmospherics/gasmixtures/reactions.dm
+++ b/code/modules/atmospherics/gasmixtures/reactions.dm
@@ -149,24 +149,16 @@
cached_results["fire"] = 0
var/turf/open/location = isturf(holder) ? holder : null
- var/burned_fuel = 0
- if(air.get_moles(GAS_O2) < air.get_moles(GAS_TRITIUM))
- burned_fuel = air.get_moles(GAS_O2)/TRITIUM_BURN_OXY_FACTOR
+ var/burned_fuel = max(min(air.get_moles(GAS_TRITIUM), air.get_moles(GAS_O2) / TRITIUM_BURN_OXY_FACTOR), 0) / TRITIUM_BURN_TRIT_FACTOR
+ if(burned_fuel > 0)
air.adjust_moles(GAS_TRITIUM, -burned_fuel)
- else
- burned_fuel = air.get_moles(GAS_TRITIUM)*TRITIUM_BURN_TRIT_FACTOR
- air.adjust_moles(GAS_TRITIUM, -air.get_moles(GAS_TRITIUM)/TRITIUM_BURN_TRIT_FACTOR)
- air.adjust_moles(GAS_O2,-air.get_moles(GAS_TRITIUM))
-
- if(burned_fuel)
+ air.adjust_moles(GAS_O2, -burned_fuel / 2)
+ air.adjust_moles(GAS_H2O, burned_fuel)
energy_released += (FIRE_HYDROGEN_ENERGY_RELEASED * burned_fuel)
+ cached_results["fire"] += burned_fuel
if(location && prob(10) && burned_fuel > TRITIUM_MINIMUM_RADIATION_ENERGY) //woah there let's not crash the server
radiation_pulse(location, energy_released/TRITIUM_BURN_RADIOACTIVITY_FACTOR)
- air.adjust_moles(GAS_H2O, burned_fuel/TRITIUM_BURN_OXY_FACTOR)
-
- cached_results["fire"] += burned_fuel
-
if(energy_released > 0)
var/new_heat_capacity = air.heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 3a2030c9dd50..cc9e94b91567 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -940,7 +940,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 27)
/obj/machinery/airalarm/proc/handle_decomp_alarm()
if(!COOLDOWN_FINISHED(src, decomp_alarm))
return
- playsound(loc, 'goon/sound/machinery/FireAlarm.ogg', 75)
+ playsound(loc, 'sound/machines/FireAlarm.ogg', 75)
COOLDOWN_START(src, decomp_alarm, 1 SECONDS)
#undef AALARM_MODE_SCRUBBING
diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm
index 6797f16012b7..46ecc06af84b 100644
--- a/code/modules/atmospherics/machinery/components/components_base.dm
+++ b/code/modules/atmospherics/machinery/components/components_base.dm
@@ -75,9 +75,8 @@
// Every node has a parent pipeline and an air associated with it, but we need to accomdate for edge cases like init dir cache building...
if(parents[i])
nullifyPipenet(parents[i])
- if(airs[i])
- QDEL_NULL(airs[i])
- ..()
+ airs[i] = null
+ return ..()
/obj/machinery/atmospherics/components/on_construction()
..()
@@ -100,25 +99,22 @@
/obj/machinery/atmospherics/components/proc/nullifyPipenet(datum/pipeline/reference)
if(!reference)
CRASH("nullifyPipenet(null) called by [type] on [COORD(src)]")
- for (var/i in 1 to parents.len)
- if (parents[i] == reference)
- reference.other_airs -= airs[i] // Disconnects from the pipeline side
- parents[i] = null // Disconnects from the machinery side.
-
+ var/i = parents.Find(reference)
+ reference.other_airs -= airs[i]
reference.other_atmosmch -= src
-
- /**
- * We explicitly qdel pipeline when this particular pipeline
- * is projected to have no member and cause GC problems.
- * We have to do this because components don't qdel pipelines
- * while pipes must and will happily wreck and rebuild everything
- * again every time they are qdeleted.
+ /*
+ We explicitly qdel pipeline when this particular pipeline
+ is projected to have no member and cause GC problems.
+ We have to do this because components don't qdel pipelines
+ while pipes must and will happily wreck and rebuild
+ everything again every time they are qdeleted.
*/
-
if(!length(reference.other_atmosmch) && !length(reference.members))
if(QDESTROYING(reference))
- CRASH("nullifyPipenet() called on qdeleting [reference]")
+ parents[i] = null
+ CRASH("nullifyPipenet() called on qdeleting [reference] indexed on parents\[[i]\]")
qdel(reference)
+ parents[i] = null
/obj/machinery/atmospherics/components/returnPipenetAirs(datum/pipeline/reference)
var/list/returned_air = list()
diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm
index e1d9d2412101..29c0ff985c9c 100644
--- a/code/modules/atmospherics/machinery/datum_pipeline.dm
+++ b/code/modules/atmospherics/machinery/datum_pipeline.dm
@@ -38,23 +38,22 @@
update = air.react(src)
/datum/pipeline/proc/build_pipeline(obj/machinery/atmospherics/base)
- building = TRUE
- var/volume = 0
- if(istype(base, /obj/machinery/atmospherics/pipe))
- var/obj/machinery/atmospherics/pipe/considered_pipe = base
- volume = considered_pipe.volume
- members += considered_pipe
- if(considered_pipe.air_temporary)
- air = considered_pipe.air_temporary
- considered_pipe.air_temporary = null
- else
- addMachineryMember(base)
-
- if(!air)
- air = new
-
- air.set_volume(volume)
- SSair.add_to_expansion(src, base)
+ if(!QDELETED(base))
+ building = TRUE
+ var/volume = 0
+ if(istype(base, /obj/machinery/atmospherics/pipe))
+ var/obj/machinery/atmospherics/pipe/considered_pipe = base
+ volume = considered_pipe.volume
+ members += considered_pipe
+ if(considered_pipe.air_temporary)
+ air = considered_pipe.air_temporary
+ considered_pipe.air_temporary = null
+ else
+ addMachineryMember(base)
+ if(!air)
+ air = new
+ air.set_volume(volume)
+ SSair.add_to_expansion(src, base)
///Has the same effect as build_pipeline(), but this doesn't queue its work, so overrun abounds. It's useful for the pregame
/datum/pipeline/proc/build_pipeline_blocking(obj/machinery/atmospherics/base)
diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm
index 0064fbe8f403..720d22f6bff2 100644
--- a/code/modules/atmospherics/machinery/pipes/pipes.dm
+++ b/code/modules/atmospherics/machinery/pipes/pipes.dm
@@ -86,7 +86,6 @@
QDEL_NULL(parent)
releaseAirToTurf()
- QDEL_NULL(air_temporary)
var/turf/T = loc
for(var/obj/machinery/meter/meter in T)
diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
index 0b238294f749..4c6d0ecf498f 100644
--- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
+++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
@@ -24,7 +24,6 @@
/obj/machinery/portable_atmospherics/Destroy()
SSair.stop_processing_machine(src)
disconnect()
- qdel(air_contents)
air_contents = null
return ..()
diff --git a/code/modules/autowiki/autowiki.dm b/code/modules/autowiki/autowiki.dm
new file mode 100644
index 000000000000..815ac0192f19
--- /dev/null
+++ b/code/modules/autowiki/autowiki.dm
@@ -0,0 +1,49 @@
+/// When the `AUTOWIKI` define is enabled, will generate an output file for tools/autowiki/autowiki.js to consume.
+/// Autowiki code intentionally still *exists* even without the define, to ensure developers notice
+/// when they break it immediately, rather than until CI or worse, call time.
+#if defined(AUTOWIKI) || defined(UNIT_TESTS)
+/proc/setup_autowiki()
+ Master.sleep_offline_after_initializations = FALSE
+ SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/generate_autowiki))
+ SSticker.start_immediately = TRUE
+ CONFIG_SET(number/round_end_countdown, 0)
+
+/proc/generate_autowiki()
+ var/output = generate_autowiki_output()
+ rustg_file_write(output, "data/autowiki_edits.txt")
+ qdel(world)
+#endif
+
+/// Returns a string of the autowiki output file
+/proc/generate_autowiki_output()
+ var/total_output = ""
+
+ for (var/datum/autowiki/autowiki_type as anything in subtypesof(/datum/autowiki))
+ var/datum/autowiki/autowiki = new autowiki_type
+ var/output = autowiki.generate()
+
+ //Generates a page for each key:value pair with the key as the title and the value as the content, and generates an index at the root page
+ if(islist(output))
+ var/root = ""
+ for(var/title in output)
+ total_output += json_encode(list(
+ "title" = "[autowiki.page]/[title]",
+ "text" = output[title],
+ )) + "\n"
+ root += "\n\n" + autowiki.include_template("[autowiki.page]/[title]")
+
+ //Run the next conditional
+ output = root
+
+ //Generates a single page with the output.
+ if (istext(output))
+ total_output += json_encode(list(
+ "title" = autowiki.page,
+ "text" = output,
+ )) + "\n"
+
+ continue
+
+ CRASH("[autowiki_type] does not generate a proper output!")
+
+ return total_output
diff --git a/code/modules/autowiki/pages/base.dm b/code/modules/autowiki/pages/base.dm
new file mode 100644
index 000000000000..8e745ace61c2
--- /dev/null
+++ b/code/modules/autowiki/pages/base.dm
@@ -0,0 +1,54 @@
+/// A representation of an automated wiki page.
+/datum/autowiki
+ /// The page on the wiki to be replaced.
+ /// This should never be a user-facing page, like "Guide to circuits".
+ /// It should always be a template that only Autowiki should touch.
+ /// For example: "Template:Autowiki/CircuitInfo".
+ var/page
+
+/// Override and return the new text of the page.
+/// This proc can be impure, usually to call `upload_file`.
+/datum/autowiki/proc/generate()
+ SHOULD_CALL_PARENT(FALSE)
+ CRASH("[type] does not implement generate()!")
+
+/// Generates an auto formatted template user.
+/// Your autowiki should ideally be a *lot* of these.
+/// It lets wiki editors edit it much easier later, without having to enter repo.
+/// Parameters will be passed in by name. That means your template should expect
+/// something that looks like `{{ Autowiki_Circuit|name=Combiner|description=This combines }}`
+/// Lists, which must be array-like (no keys), will be turned into a flat list with their key and a number,
+/// such that list("food" = list("fruit", "candy")) -> food1=fruit|food2=candy
+/datum/autowiki/proc/include_template(name, parameters)
+ var/template_text = "{{[name]"
+
+ var/list/prepared_parameters = list()
+ for (var/key in parameters)
+ var/value = parameters[key]
+ if (islist(value))
+ for (var/index in 1 to length(value))
+ prepared_parameters["[key][index]"] = "[value[index]]"
+ else
+ prepared_parameters[key] = value
+
+ for (var/parameter_name in prepared_parameters)
+ template_text += "|[parameter_name]="
+ template_text += "[prepared_parameters[parameter_name]]"
+
+ template_text += "}}"
+
+ return template_text
+
+/// Takes an icon and uploads it to Autowiki-name.png.
+/// Do your best to make sure this is unique, so it doesn't clash with other autowiki icons.
+/datum/autowiki/proc/upload_icon(icon/icon, name)
+ // Fuck you
+ if (IsAdminAdvancedProcCall())
+ return
+
+ fcopy(icon, "data/autowiki_files/[name].png")
+
+/// Escape a parameter such that it can be correctly put inside a wiki output
+/datum/autowiki/proc/escape_value(parameter)
+ // | is a special character in MediaWiki, and must be escaped by...using another template.
+ return replacetextEx(parameter, "|", "{{!}}")
diff --git a/code/modules/autowiki/pages/reagents.dm b/code/modules/autowiki/pages/reagents.dm
new file mode 100644
index 000000000000..d10137d07f53
--- /dev/null
+++ b/code/modules/autowiki/pages/reagents.dm
@@ -0,0 +1,65 @@
+/*
+Templates:
+
+Autowiki/Reaction
+{{{chems|ERROR}}} {{#if: {{{temperature|}}} | Temperature {{{temperature}}} | }} {{#if: {{{container|}}} | Needs container "{{{container}}}" | }} Makes {{{volume|1}}}u
+
+Autowiki/Reagent
+{{#if: {{{tooltip|}}} | {{Tooltip|{{{volume}}} part [[#{{{name}}}|{{{name}}}]]|{{{tooltip}}}|FEF6E7}} | {{{volume}}} part {{{name}}} }}
+
+*/
+
+/datum/autowiki/reagents
+ page = "Template:Autowiki/Content/Reactions"
+
+/datum/autowiki/reagents/generate()
+ var/list/output = list()
+
+ var/list/mixable_reagents = list()
+ var/list/all_reactions = list()
+ for(var/type in subtypesof(/datum/chemical_reaction))
+ var/datum/chemical_reaction/reaction = new type
+ all_reactions += reaction
+ mixable_reagents |= reaction.results
+
+ for(var/datum/chemical_reaction/reaction as anything in all_reactions)
+ var/required_chems = ""
+ for(var/datum/reagent/required_chem_type as anything in reaction.required_reagents)
+ var/has_tooltip = (required_chem_type in mixable_reagents) && !(required_chem_type in reaction.results) && !(required_chem_type in GLOB.base_reagents)
+ required_chems += format_required_reagent(required_chem_type, reaction.required_reagents[required_chem_type], has_tooltip)
+
+ for(var/datum/reagent/required_catalyst_type as anything in reaction.required_catalysts)
+ var/has_tooltip = (required_catalyst_type in mixable_reagents) && !(required_catalyst_type in reaction.results) && !(required_catalyst_type in GLOB.base_reagents)
+ required_chems += format_required_reagent(required_catalyst_type, reaction.required_catalysts[required_catalyst_type], has_tooltip, "Catalyst")
+
+ for(var/datum/reagent/result_chem_type as anything in reaction.results)
+ var/result_name = escape_value(initial(result_chem_type.name))
+ var/list/details = list("volume" = reaction.results[result_chem_type], "chems" = required_chems, "name" = result_name)
+
+ if(reaction.required_temp > 0)
+ details["temperature"] = "[reaction.is_cold_recipe ? "below" : "above"] [reaction.required_temp]K"
+
+ if(reaction.required_container)
+ details["container"] = "[escape_value(initial(reaction.required_container.name))]"
+
+ var/description = include_template("Autowiki/Reaction", details)
+ if(result_name in output)
+ output[result_name] += " OR [description]"
+ else
+ output[result_name] = description
+
+ return output
+
+/datum/autowiki/reagents/proc/format_required_reagent(datum/reagent/required_reagent_type, volume, has_tooltip = FALSE, type)
+ var/list/details = list(
+ "volume" = volume,
+ "name" = escape_value(initial(required_reagent_type.name))
+ )
+
+ if(has_tooltip)
+ details["tooltip"] = include_template("Autowiki/Content/Reactions/[initial(required_reagent_type.name)]")
+
+ if(type)
+ details["type"] = type
+
+ return include_template("Autowiki/Reagent", details)
diff --git a/code/modules/autowiki/pages/ships.dm b/code/modules/autowiki/pages/ships.dm
new file mode 100644
index 000000000000..372e9d14a9cb
--- /dev/null
+++ b/code/modules/autowiki/pages/ships.dm
@@ -0,0 +1,96 @@
+/datum/autowiki/ship
+ page = "Template:Autowiki/Content/Ships"
+ var/mob/living/carbon/human/dummy/consistent/wiki_dummy = new()
+
+/datum/autowiki/ship/generate()
+ var/list/output = list()
+
+ for(var/shipname in SSmapping.shuttle_templates)
+ var/datum/map_template/shuttle/ship = SSmapping.shuttle_templates[shipname]
+
+ if(!length(ship.job_slots))
+ continue
+
+ var/size = "Unknown"
+ var/longest_dimension = max(ship.width, ship.height)
+ switch(longest_dimension)
+ if(0 to 19)
+ size = "Small"
+ if(20 to 39)
+ size = "Medium"
+ if(40 to 56)
+ size = "Large"
+ if(57 to INFINITY)
+ size = "Undockable" //let's hope this is never the case
+
+ var/ship_name = escape_value(ship.name)
+ output[ship_name] = include_template("Autowiki/Ship", list(
+ "name" = ship_name,
+ "shortname" = escape_value(ship.short_name) || ship_name,
+ "description" = escape_value(ship.description),
+ "prefix" = escape_value(ship.prefix),
+ "tags" = escape_value(ship.tags?.Join(", ")),
+ "limit" = ship.limit,
+ "crewCount" = count_crew(ship.job_slots),
+ "crew" = format_crew_list(ship.job_slots),
+ "enabled" = ship.enabled ? "Yes" : "No",
+ "size" = size
+ ))
+
+ //Other fields: manufacturer, faction, color
+
+ return output
+
+/datum/autowiki/ship/proc/count_crew(list/crew)
+ var/output = 0
+
+ for(var/job in crew)
+ output += crew[job]
+
+ return output
+
+/datum/autowiki/ship/proc/format_crew_list(list/crew)
+ var/output = ""
+
+ var/static/list/job_icon_list = list()
+ var/mob/living/carbon/human/dummy/wiki_dummy = new(locate(1,1,1))
+ wiki_dummy.setDir(SOUTH)
+ for(var/datum/job/job as anything in crew)
+ var/filename = SANITIZE_FILENAME(escape_value(format_text(initial(job.outfit.name))))
+
+ output += include_template("Autowiki/ShipCrewMember", list(
+ "name" = escape_value(job.name),
+ "officer" = job.officer ? "Yes" : "No",
+ "slots" = crew[job],
+ "icon" = filename
+ ))
+
+ //Only generate each unique outfit once
+ if(filename in job_icon_list)
+ continue
+
+ upload_icon(get_dummy_image(job, filename), filename)
+
+ return output
+
+/datum/autowiki/ship/proc/get_dummy_image(datum/job/to_equip, filename)
+ //Limited to just the humanoid-compliant roundstart species, but at least it's not just human.
+ var/static/list/species = list(/datum/species/ethereal, /datum/species/human, /datum/species/ipc, /datum/species/lizard, /datum/species/moth, /datum/species/spider)
+ //Length times ascii char of the last letter, good enough(?) #entropy
+ var/seed = length(filename) * text2ascii(filename, length(filename))
+ //Controlled randomisation
+ wiki_dummy.seeded_randomization(seed)
+ //Each outfit will always have the same species
+ wiki_dummy.set_species(species[seed % length(species) + 1])
+ //Delete all the old stuff they had
+ wiki_dummy.wipe_state()
+
+ to_equip.equip(wiki_dummy, TRUE, FALSE)
+ COMPILE_OVERLAYS(wiki_dummy)
+ var/icon/wiki_icon = icon(getFlatIcon(wiki_dummy), frame = 1)
+
+ //Make all icons 32x32 for wiki sizing consistency
+ if(wiki_icon.Height() != 32 || wiki_icon.Width() != 32)
+ wiki_icon.Crop(1, 1, 32, 32)
+
+ return wiki_icon
diff --git a/code/modules/autowiki/pages/techweb.dm b/code/modules/autowiki/pages/techweb.dm
new file mode 100644
index 000000000000..0f4b87f9e2a2
--- /dev/null
+++ b/code/modules/autowiki/pages/techweb.dm
@@ -0,0 +1,64 @@
+/datum/autowiki/techweb
+ page = "Template:Autowiki/Content/Techweb"
+
+/datum/autowiki/techweb/generate()
+ var/output = ""
+
+ for (var/node_id in sortList(SSresearch.techweb_nodes, /proc/sort_research_nodes))
+ var/datum/techweb_node/node = SSresearch.techweb_nodes[node_id]
+ if (!node.show_on_wiki)
+ continue
+
+ if (!valid_node(node))
+ continue
+
+ output += "\n\n" + include_template("Autowiki/TechwebEntry", list(
+ "name" = escape_value(node.display_name),
+ "description" = escape_value(node.description),
+ "prerequisites" = generate_prerequisites(node.prereq_ids),
+ "designs" = generate_designs(node.design_ids),
+ ))
+
+ return output
+
+/datum/autowiki/techweb/proc/valid_node(datum/techweb_node/node)
+ return !node.experimental
+
+/datum/autowiki/techweb/proc/generate_designs(list/design_ids)
+ var/output = ""
+
+ for (var/design_id in design_ids)
+ var/datum/design/design = SSresearch.techweb_designs[design_id]
+ output += include_template("Autowiki/TechwebEntryDesign", list(
+ "name" = escape_value(design.name),
+ "description" = escape_value(design.get_description()),
+ ))
+
+ return output
+
+/datum/autowiki/techweb/proc/generate_prerequisites(list/prereq_ids)
+ var/output = ""
+
+ for (var/prereq_id in prereq_ids)
+ var/datum/techweb_node/node = SSresearch.techweb_nodes[prereq_id]
+ output += include_template("Autowiki/TechwebEntryPrerequisite", list(
+ "name" = escape_value(node.display_name),
+ ))
+
+ return output
+
+/datum/autowiki/techweb/experimental
+ page = "Template:Autowiki/Content/Techweb/Experimental"
+
+/datum/autowiki/techweb/experimental/valid_node(datum/techweb_node/node)
+ return node.experimental
+
+/proc/sort_research_nodes(node_id_a, node_id_b)
+ var/datum/techweb_node/node_a = SSresearch.techweb_nodes[node_id_a]
+ var/datum/techweb_node/node_b = SSresearch.techweb_nodes[node_id_b]
+
+ var/prereq_difference = node_a.prereq_ids.len - node_b.prereq_ids.len
+ if (prereq_difference != 0)
+ return prereq_difference
+
+ return sorttext(node_b.display_name, node_a.display_name)
diff --git a/code/modules/autowiki/pages/vending.dm b/code/modules/autowiki/pages/vending.dm
new file mode 100644
index 000000000000..aeb8fb42bb2c
--- /dev/null
+++ b/code/modules/autowiki/pages/vending.dm
@@ -0,0 +1,56 @@
+/datum/autowiki/vending
+ page = "Template:Autowiki/Content/VendingMachines"
+
+/datum/autowiki/vending/generate()
+ var/output = ""
+
+ var/list/cached_products = list()
+
+ // `powered()` checks if its in a null loc to say it's not powered.
+ // So we put it inside, something
+ var/obj/parent = new
+
+ for (var/vending_type in sortList(subtypesof(/obj/machinery/vending), /proc/cmp_typepaths_asc))
+ var/obj/machinery/vending/vending_machine = new vending_type(parent)
+ vending_machine.use_power = FALSE
+ vending_machine.update_icon(UPDATE_ICON_STATE)
+
+ // Technically won't match if product amounts change, but this isn't likely
+ var/products_cache_key = vending_machine.products.Join("-") + "&" + vending_machine.contraband.Join("-") + "&" + vending_machine.premium.Join("-")
+
+ // In the future, this should show all vending machines that have the same products
+ if (products_cache_key in cached_products)
+ qdel(vending_machine)
+ continue
+
+ cached_products += products_cache_key
+
+ var/filename = SANITIZE_FILENAME(escape_value(format_text(vending_machine.name)))
+
+ output += include_template("Autowiki/VendingMachine", list(
+ "icon" = escape_value(filename),
+ "name" = escape_value(format_text(vending_machine.name)),
+ "products" = format_product_list(vending_machine.products),
+ "contraband" = format_product_list(vending_machine.contraband),
+ "premium" = format_product_list(vending_machine.premium),
+ ))
+
+ // It would be cool to make this support gifs someday, but not now
+ upload_icon(getFlatIcon(vending_machine, no_anim = TRUE), filename)
+
+ qdel(vending_machine)
+
+ qdel(parent)
+
+ return output
+
+/datum/autowiki/vending/proc/format_product_list(list/product_list)
+ var/output = ""
+
+ for (var/obj/product_path as anything in product_list)
+ output += include_template("Autowiki/VendingMachineProduct", list(
+ "name" = escape_value(capitalize(format_text(initial(product_path.name)))),
+ "amount" = product_list[product_path],
+ ))
+
+ return output
diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm
index 891065f4264a..ac1c4b8bbfdf 100644
--- a/code/modules/cargo/expressconsole.dm
+++ b/code/modules/cargo/expressconsole.dm
@@ -107,7 +107,7 @@
/obj/machinery/computer/cargo/express/ui_interact(mob/living/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
- ui = new(user, src, "OutpostComms", name)
+ ui = new(user, src, "OutpostCommunications", name)
ui.open()
if(!charge_account)
reconnect()
@@ -127,7 +127,7 @@
data["outpostDocked"] = outpost_docked
data["points"] = charge_account ? charge_account.account_balance : 0
data["siliconUser"] = user.has_unlimited_silicon_privilege && check_ship_ai_access(user)
- data["beaconzone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui
+ data["beaconZone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui
data["usingBeacon"] = use_beacon //is the mode set to deliver to the beacon or the cargobay?
data["canBeacon"] = !use_beacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location?
data["canBuyBeacon"] = charge_account ? (cooldown <= 0 && charge_account.account_balance >= BEACON_COST) : FALSE
diff --git a/code/modules/cargo/packs/chemistry.dm b/code/modules/cargo/packs/chemistry.dm
new file mode 100644
index 000000000000..2375328b2bc1
--- /dev/null
+++ b/code/modules/cargo/packs/chemistry.dm
@@ -0,0 +1,131 @@
+/datum/supply_pack/chemistry
+ group = "Chemistry"
+ crate_type = /obj/structure/closet/crate/chem
+
+/*
+ Tools
+*/
+
+/datum/supply_pack/chemistry/starter
+ name = "Chemical Starter Kit Crate"
+ desc = "Contains thirteen different chemicals, for all the fun experiments you can make."
+ cost = 1250 // This is intentionally underpriced; the hope is that people will start using ghettochem, upon which time the price can be raised.
+ contains = list(/obj/item/reagent_containers/glass/bottle/hydrogen,
+ /obj/item/reagent_containers/glass/bottle/carbon,
+ /obj/item/reagent_containers/glass/bottle/nitrogen,
+ /obj/item/reagent_containers/glass/bottle/oxygen,
+ /obj/item/reagent_containers/glass/bottle/fluorine,
+ /obj/item/reagent_containers/glass/bottle/phosphorus,
+ /obj/item/reagent_containers/glass/bottle/silicon,
+ /obj/item/reagent_containers/glass/bottle/chlorine,
+ /obj/item/reagent_containers/glass/bottle/radium,
+ /obj/item/reagent_containers/glass/bottle/sacid,
+ /obj/item/reagent_containers/glass/bottle/ethanol,
+ /obj/item/reagent_containers/glass/bottle/potassium,
+ /obj/item/reagent_containers/glass/bottle/sugar,
+ /obj/item/reagent_scanner,
+ /obj/item/reagent_containers/dropper,
+ /obj/item/storage/box/beakers)
+ crate_name = "chemical starter crate"
+
+/datum/supply_pack/chemistry/tools
+ name = "Chemical Synthesis Crate"
+ desc = "Contains all the tools you will need for drug making."
+ cost = 750
+ contains = list(/obj/item/reagent_containers/glass/filter,
+ /obj/item/book/manual/wiki/chemistry,
+ /obj/item/clothing/glasses/science,
+ /obj/item/hand_labeler,
+ /obj/item/stock_parts/capacitor,
+ /obj/item/stock_parts/scanning_module,
+ /obj/item/stock_parts/manipulator,
+ /obj/item/stock_parts/micro_laser)
+ crate_name = "chemistry tools crate"
+
+/*
+ Bulk materials
+*/
+
+/datum/supply_pack/chemistry/carbon
+ name = "Bulk Carbon Crate"
+ desc = "Contains a jug filled with 150u of carbon."
+ cost = 500
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/carbon)
+ crate_name = "bulk carbon crate"
+
+/datum/supply_pack/chemistry/oxygen
+ name = "Bulk Oxygen Crate"
+ desc = "Contains a jug filled with 150u of oxygen."
+ cost = 500
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/oxygen)
+ crate_name = "bulk oxygen crate"
+
+/datum/supply_pack/chemistry/hydrogen
+ name = "Bulk Hydrogen Crate"
+ desc = "Contains a jug filled with 150u of Hydrogen."
+ cost = 500
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/hydrogen)
+ crate_name = "bulk hydrogen crate"
+
+/datum/supply_pack/chemistry/nitrogen
+ name = "Bulk Nitrogen Crate"
+ desc = "Contains a jug filled with 150u of nitrogen."
+ cost = 625
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/nitrogen)
+ crate_name = "bulk nitrogen crate"
+
+/datum/supply_pack/chemistry/aluminium
+ name = "Bulk Aluminium Crate"
+ desc = "Contains a jug filled with 150u of aluminium."
+ cost = 625
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/aluminium)
+ crate_name = "bulk aluminium crate"
+
+/datum/supply_pack/chemistry/copper
+ name = "Bulk Copper Crate"
+ desc = "Contains a jug filled with 150u of copper."
+ cost = 625
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/copper)
+ crate_name = "bulk copper crate"
+
+/datum/supply_pack/chemistry/bromine
+ name = "Bulk Bromine Crate"
+ desc = "Contains a jug filled with 150u of bromine."
+ cost = 625
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/bromine)
+ crate_name = "bulk bromine crate"
+
+/datum/supply_pack/chemistry/iodine
+ name = "Bulk Iodine Crate"
+ desc = "Contains a jug filled with 150u of iodine."
+ cost = 750
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/iodine)
+ crate_name = "bulk iodine crate"
+
+/datum/supply_pack/chemistry/potassium
+ name = "Bulk Potassium Crate"
+ desc = "Contains a jug filled with 150u of potassium."
+ cost = 750
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/potassium)
+ crate_name = "bulk potassium crate"
+
+/datum/supply_pack/chemistry/sulfur
+ name = "Bulk Sulfur Crate"
+ desc = "Contains a jug filled with 150u of sulfur."
+ cost = 750
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/sulfur)
+ crate_name = "bulk sulfur crate"
+
+/datum/supply_pack/chemistry/chlorine
+ name = "Bulk Chlorine Crate"
+ desc = "Contains a jug filled with 150u of chlorine."
+ cost = 750
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/chlorine)
+ crate_name = "bulk chlorine crate"
+
+/datum/supply_pack/chemistry/radium
+ name = "Bulk Radium Crate"
+ desc = "Contains a jug filled with 150u of radium."
+ cost = 1000
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/radium)
+ crate_name = "bulk radium crate"
diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm
index 3273b28e153b..e5b72b4b5c4f 100644
--- a/code/modules/cargo/packs/medical.dm
+++ b/code/modules/cargo/packs/medical.dm
@@ -89,28 +89,6 @@
crate_name = "blood freezer"
crate_type = /obj/structure/closet/crate/freezer
-/datum/supply_pack/medical/chemical
- name = "Chemical Starter Kit Crate"
- desc = "Contains thirteen different chemicals, for all the fun experiments you can make."
- cost = 1000 // This is intentionally underpriced; the hope is that people will start using ghettochem, upon which time the price can be raised.
- contains = list(/obj/item/reagent_containers/glass/bottle/hydrogen,
- /obj/item/reagent_containers/glass/bottle/carbon,
- /obj/item/reagent_containers/glass/bottle/nitrogen,
- /obj/item/reagent_containers/glass/bottle/oxygen,
- /obj/item/reagent_containers/glass/bottle/fluorine,
- /obj/item/reagent_containers/glass/bottle/phosphorus,
- /obj/item/reagent_containers/glass/bottle/silicon,
- /obj/item/reagent_containers/glass/bottle/chlorine,
- /obj/item/reagent_containers/glass/bottle/radium,
- /obj/item/reagent_containers/glass/bottle/sacid,
- /obj/item/reagent_containers/glass/bottle/ethanol,
- /obj/item/reagent_containers/glass/bottle/potassium,
- /obj/item/reagent_containers/glass/bottle/sugar,
- /obj/item/clothing/glasses/science,
- /obj/item/reagent_containers/dropper,
- /obj/item/storage/box/beakers)
- crate_name = "chemical crate"
-
/datum/supply_pack/medical/surplus
name = "Medical Surplus Crate"
desc = "Contains an assortment of medical supplies haphazardly pulled from storage. German doctor not included."
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 90fb4fa0972c..5c5553df2755 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -220,7 +220,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
// Instantiate tgui panel
tgui_panel = new(src)
- GLOB.ahelp_tickets.ClientLogin(src)
+ GLOB.ahelp_tickets.client_login(src)
GLOB.interviews.client_login(src)
var/connecting_admin = FALSE //because de-admined admins connecting should be treated like admins.
//Admin Authorisation
@@ -489,7 +489,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
GLOB.clients -= src
GLOB.directory -= ckey
log_access("Logout: [key_name(src)]")
- GLOB.ahelp_tickets.ClientLogout(src)
+ GLOB.ahelp_tickets.client_logout(src)
GLOB.interviews.client_logout(src)
SSserver_maint.UpdateHubStatus()
if(credits)
@@ -890,11 +890,9 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
return
if (prefs.hotkeys)
- // If hotkey mode is enabled, then clicking the map will automatically
- // unfocus the text bar. This removes the red color from the text bar
- // so that the visual focus indicator matches reality.
- winset(src, null, "input.background-color=[COLOR_INPUT_DISABLED]")
-
+ winset(src, null, "input.focus=false")
+ else
+ winset(src, null, "input.focus=true")
..()
/client/proc/add_verbs_from_config()
diff --git a/code/modules/client/loadout/loadout_general.dm b/code/modules/client/loadout/loadout_general.dm
index 1e6aae68fb72..671c0efe9602 100644
--- a/code/modules/client/loadout/loadout_general.dm
+++ b/code/modules/client/loadout/loadout_general.dm
@@ -163,8 +163,3 @@
/datum/gear/surgical_mask
display_name = "surgical mask"
path = /obj/item/clothing/mask/surgical
-
-/datum/gear/maidbox
- display_name = "maid outfit bundle"
- path = /obj/item/storage/box/maid
- description = "Contains a four-piece maid outfit inside a single box."
diff --git a/code/modules/client/loadout/loadout_suit.dm b/code/modules/client/loadout/loadout_suit.dm
index 2daf575a12ec..e2800a87e9e1 100644
--- a/code/modules/client/loadout/loadout_suit.dm
+++ b/code/modules/client/loadout/loadout_suit.dm
@@ -43,14 +43,6 @@
display_name = "goth jacket"
path = /obj/item/clothing/suit/gothcoat
-/datum/gear/suit/jacket/bronze
- display_name = "bronze suit"
- path = /obj/item/clothing/suit/bronze
-
-/datum/gear/suit/jacket/yakuza
- display_name = "yakuza suit"
- path = /obj/item/clothing/suit/yakuza
-
/datum/gear/suit/jacket/burgundy
display_name = "suit jacket, burgundy"
path = /obj/item/clothing/suit/toggle/lawyer/burgundy
@@ -63,7 +55,23 @@
display_name = "suit jacket, charcoal"
path = /obj/item/clothing/suit/toggle/lawyer/charcoal
-/datum/gear/suit/jacket/navy
+/datum/gear/suit/jacket/navy //why is this blank? i dont know
+
+/datum/gear/suit/jacket/hoodie_black
+ display_name = "hoodie, black"
+ path = /obj/item/clothing/suit/hooded/hoodie/black
+
+/datum/gear/suit/jacket/hoodie_red
+ display_name = "hoodie, red"
+ path = /obj/item/clothing/suit/hooded/hoodie/red
+
+/datum/gear/suit/jacket/hoodie_blue
+ display_name = "hoodie, blue"
+ path = /obj/item/clothing/suit/hooded/hoodie/blue
+
+/datum/gear/suit/jacket/hoodie_gray
+ display_name = "hoodie, gray"
+ path = /obj/item/clothing/suit/hooded/hoodie/gray
/datum/gear/suit/jacket/highvis
display_name = "industrial jacket"
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index e209e180d518..82cf7eb653de 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -5,7 +5,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
//doohickeys for savefiles
var/path
var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used
- var/max_save_slots = 10
+ var/max_save_slots = 20
//non-preference stuff
var/muted = 0
@@ -68,23 +68,26 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/real_name //our character's name
var/gender = MALE //gender of character (well duh)
var/age = 30 //age of character
- var/underwear = "Nude" //underwear type
- var/underwear_color = "000" //underwear color
- var/undershirt = "Nude" //undershirt type
- var/socks = "Nude" //socks type
- var/backpack = DBACKPACK //backpack type
+ var/underwear = "Nude" //Type of underwear
+ var/underwear_color = "000" //Greyscale color of underwear
+ var/undershirt = "Nude" //Type of undershirt
+ var/undershirt_color = "000" //Greyscale color of undershirt
+ var/socks = "Nude" //Type of socks
+ var/socks_color = "000" //Greyscale color of socks
+ var/backpack = DBACKPACK //Type of backpack
var/jumpsuit_style = PREF_SUIT //suit/skirt
var/exowear = PREF_EXOWEAR //exowear
var/hairstyle = "Bald" //Hair type
var/hair_color = "000" //Hair color
- var/facial_hairstyle = "Shaved" //Face hair type
+ var/facial_hairstyle = "Shaved" //Face hair type
var/facial_hair_color = "000" //Facial hair color
var/skin_tone = "caucasian1" //Skin color
var/eye_color = "000" //Eye color
var/datum/species/pref_species = new /datum/species/human() //Mutant race
- var/species_looking_at = "human" //used as a helper to keep track of in the species select thingy
+ var/species_looking_at = "human" //used as a helper to keep track of in the species select thingy
var/list/features = list(
"mcolor" = "FFF",
+ "mcolor2" = "FFF",
"grad_style" = "None",
"grad_color" = "FFF",
"ethcolor" = "9c3030",
@@ -119,12 +122,37 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"flavor_text" = "",
"body_size" = "Normal"
)
- var/list/randomise = list(RANDOM_UNDERWEAR = TRUE, RANDOM_UNDERWEAR_COLOR = TRUE, RANDOM_UNDERSHIRT = TRUE, RANDOM_SOCKS = TRUE, RANDOM_BACKPACK = TRUE, RANDOM_JUMPSUIT_STYLE = TRUE, RANDOM_EXOWEAR_STYLE = TRUE, RANDOM_HAIRSTYLE = TRUE, RANDOM_HAIR_COLOR = TRUE, RANDOM_FACIAL_HAIRSTYLE = TRUE, RANDOM_FACIAL_HAIR_COLOR = TRUE, RANDOM_SKIN_TONE = TRUE, RANDOM_EYE_COLOR = TRUE)
- var/list/friendlyGenders = list("Male" = "male", "Female" = "female", "Other" = "plural")
- var/list/prosthetic_limbs = list(BODY_ZONE_L_ARM = PROSTHETIC_NORMAL, BODY_ZONE_R_ARM = PROSTHETIC_NORMAL, BODY_ZONE_L_LEG = PROSTHETIC_NORMAL, BODY_ZONE_R_LEG = PROSTHETIC_NORMAL)
+ var/list/randomise = list(
+ RANDOM_UNDERWEAR = TRUE,
+ RANDOM_UNDERWEAR_COLOR = TRUE,
+ RANDOM_UNDERSHIRT = TRUE,
+ RANDOM_UNDERSHIRT_COLOR = TRUE,
+ RANDOM_SOCKS = TRUE,
+ RANDOM_SOCKS_COLOR = TRUE,
+ RANDOM_BACKPACK = TRUE,
+ RANDOM_JUMPSUIT_STYLE = TRUE,
+ RANDOM_EXOWEAR_STYLE = TRUE,
+ RANDOM_HAIRSTYLE = TRUE,
+ RANDOM_HAIR_COLOR = TRUE,
+ RANDOM_FACIAL_HAIRSTYLE = TRUE,
+ RANDOM_FACIAL_HAIR_COLOR = TRUE,
+ RANDOM_SKIN_TONE = TRUE,
+ RANDOM_EYE_COLOR = TRUE,
+ )
+ var/list/friendlyGenders = list(
+ "Male" = "male",
+ "Female" = "female",
+ "Other" = "plural"
+ )
+ var/list/prosthetic_limbs = list(
+ BODY_ZONE_L_ARM = PROSTHETIC_NORMAL,
+ BODY_ZONE_R_ARM = PROSTHETIC_NORMAL,
+ BODY_ZONE_L_LEG = PROSTHETIC_NORMAL,
+ BODY_ZONE_R_LEG = PROSTHETIC_NORMAL
+ )
+ var/fbp = FALSE
var/phobia = "spiders"
var/list/alt_titles_preferences = list()
-
var/list/custom_names = list()
var/preferred_ai_core_display = "Blue"
var/prefered_security_department = SEC_DEPT_RANDOM
@@ -195,7 +223,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
load_path(C.ckey)
unlock_content = C.IsByondMember()
if(unlock_content)
- max_save_slots = 15
+ max_save_slots = 30
var/loaded_preferences_successfully = load_preferences()
if(loaded_preferences_successfully)
if(load_character())
@@ -361,24 +389,27 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Always Random Species: [(randomise[RANDOM_SPECIES]) ? "Yes" : "No"] "
if(!(NO_UNDERWEAR in pref_species.species_traits))
- dat += "Underwear: [underwear]"
- dat += "[(randomise[RANDOM_UNDERWEAR]) ? "Lock" : "Unlock"]"
+ dat += "Underwear: [underwear]"
+ dat += "[(randomise[RANDOM_UNDERWEAR]) ? "Lock" : "Unlock"] "
- dat += " Underwear Color: Change"
- dat += "[(randomise[RANDOM_UNDERWEAR_COLOR]) ? "Lock" : "Unlock"]"
+ dat += "Underwear Color: Change"
+ dat += "[(randomise[RANDOM_UNDERWEAR_COLOR]) ? "Lock" : "Unlock"] "
- dat += " Undershirt: [undershirt]"
- dat += "[(randomise[RANDOM_UNDERSHIRT]) ? "Lock" : "Unlock"]"
+ dat += "Undershirt: [undershirt]"
+ dat += "[(randomise[RANDOM_UNDERSHIRT]) ? "Lock" : "Unlock"] "
+ dat += "Undershirt Color: Change"
+ dat += "[(randomise[RANDOM_UNDERSHIRT_COLOR]) ? "Lock" : "Unlock"] "
- dat += " Socks: [socks]"
- dat += "[(randomise[RANDOM_SOCKS]) ? "Lock" : "Unlock"] "
+ dat += "Socks: [socks]"
+ dat += "[(randomise[RANDOM_SOCKS]) ? "Lock" : "Unlock"] "
+ dat += "Socks Color: Change"
+ dat += "[(randomise[RANDOM_SOCKS_COLOR]) ? "Lock" : "Unlock"]"
- var/use_skintones = pref_species.use_skintones
- if(use_skintones)
+ dat += APPEARANCE_CATEGORY_COLUMN
- dat += APPEARANCE_CATEGORY_COLUMN
+ if(pref_species.use_skintones)
dat += "
Skin Tone
"
@@ -386,23 +417,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "[(randomise[RANDOM_SKIN_TONE]) ? "Lock" : "Unlock"]"
dat += " "
- var/mutant_colors
- if((MUTCOLORS in pref_species.species_traits) || (MUTCOLORS_PARTSONLY in pref_species.species_traits))
+ // Everyone gets mutant colors now.
+ dat += "
Mutant Colors
"
- if(!use_skintones)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "
Mutant Color
"
-
- dat += "Change "
-
- mutant_colors = TRUE
+ dat += "Change "
+ dat += "Change "
if(istype(pref_species, /datum/species/ethereal)) //not the best thing to do tbf but I dont know whats better.
- if(!use_skintones)
- dat += APPEARANCE_CATEGORY_COLUMN
-
dat += "
Ethereal Color
"
dat += "Change "
@@ -410,16 +432,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if((EYECOLOR in pref_species.species_traits) && !(NOEYESPRITES in pref_species.species_traits))
- if(!use_skintones && !mutant_colors)
- dat += APPEARANCE_CATEGORY_COLUMN
-
dat += "
Eye Color
"
dat += "Change"
dat += "[(randomise[RANDOM_EYE_COLOR]) ? "Lock" : "Unlock"]"
dat += " "
- else if(use_skintones || mutant_colors)
- dat += ""
+
+ dat += ""
if(HAIR in pref_species.species_traits)
@@ -488,6 +507,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "