diff --git a/.gitignore b/.gitignore index 3e8f7d97269b..e020ce07f19f 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ stddef.dm *.vscode/* !/.vscode/extensions.json !/.vscode/tasks.json +!/.vscode/launch.json # ignore DMI tool build cache /tools/dmitool/bin/ diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000000..dc67e472b5de --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,18 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "byond", + "request": "launch", + "name": "Build & DS Debug", + "preLaunchTask": "dm: build - ${command:CurrentDME}", + "dmb": "${workspaceFolder}/${command:CurrentDMB}" + }, + { + "type": "byond", + "request": "launch", + "name": "DS Debug", + "dmb": "${workspaceFolder}/${command:CurrentDMB}" + } + ] + } diff --git a/.vscode/settings.json b/.vscode/settings.json index 9e22d1d35080..40b0f323415e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,19 +1,16 @@ { - "gitlens.advanced.blame.customArguments": [ - "--ignore-revs-file", - "${workspaceRoot}/.git-blame-ignore-revs" - ], // ESLint settings: "eslint.workingDirectories": ["tgui/"], - "search.exclude": { - "**/.yarn": true, - "**/.pnp.*": true - }, "eslint.nodePath": "tgui/.yarn/sdks", "prettier.configPath": "tgui/.prettierrc.yml", "prettier.prettierPath": "tgui/.yarn/sdks/prettier/index.cjs", "typescript.tsdk": "tgui/.yarn/sdks/typescript/lib", "typescript.enablePromptUseWorkspaceTsdk": true, + "search.exclude": { + "**/.yarn": true, + "**/.pnp.*": true + }, + "eslint.format.enable": true, "eslint.rules.customizations": [ // We really want to fail the CI builds on styling errors, // but it's better to show them as yellow squigglies in IDE @@ -21,15 +18,36 @@ // are actually hard errors. { "rule": "*", "severity": "warn" } ], - "eslint.format.enable": true, + "[javascript]": { - "editor.rulers": [80] + "editor.rulers": [80], + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, + "[javascriptreact]": { + "editor.rulers": [80], + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true }, "[typescript]": { - "editor.rulers": [80] + "editor.rulers": [80], + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, + "[typescriptreact]": { + "editor.rulers": [80], + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true }, "[scss]": { - "editor.rulers": [80] + "editor.rulers": [80], + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true }, - "editor.formatOnSave": true + + "editor.formatOnSave": true, + "gitlens.advanced.blame.customArguments": [ + "--ignore-revs-file", + "${workspaceRoot}/.git-blame-ignore-revs" + ], } diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm index 1c5caf4700be..1748cdfd3414 100644 --- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm @@ -175,6 +175,10 @@ /obj/effect/baseturf_helper, /turf/simulated/floor/plating, /area/ruin/powered) +"P" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "X" = ( /obj/item/flashlight/lantern, /turf/simulated/floor/plating, @@ -189,14 +193,14 @@ a a a a -s -s -s -s -s -s -s -s +P +P +P +a +a +a +a +a "} (2,1,1) = {" a @@ -209,12 +213,12 @@ a a a a +P +P s -s -s -s -s -s +a +a +a "} (3,1,1) = {" a @@ -227,12 +231,12 @@ a a a a +P +P +P s -s -s -s -s -s +a +a "} (4,1,1) = {" a @@ -246,11 +250,11 @@ a a a a +P +P +P s -s -s -s -s +a "} (5,1,1) = {" a @@ -266,9 +270,9 @@ t t t t -s -s -s +P +P +a "} (6,1,1) = {" a @@ -284,8 +288,8 @@ v x B t -s -s +P +P s "} (7,1,1) = {" @@ -302,9 +306,9 @@ w y y D -s -s -s +P +P +a "} (8,1,1) = {" a @@ -320,9 +324,9 @@ o z C t -s -s -s +P +P +a "} (9,1,1) = {" b @@ -338,9 +342,9 @@ o t t t +P s -s -s +a "} (10,1,1) = {" b @@ -356,8 +360,8 @@ o A b a -s -s +P +P s "} (11,1,1) = {" @@ -375,7 +379,7 @@ c b a a -s +P s "} (12,1,1) = {" @@ -446,7 +450,7 @@ a a a a -G +F J G "} diff --git a/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm index eb49ebcb8e13..beca406c5a3e 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm @@ -1054,10 +1054,6 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, /area/ruin/ancientstation) -"de" = ( -/obj/structure/transit_tube/crossing/horizontal, -/turf/template_noop, -/area/space/nearstation) "df" = ( /obj/structure/cable/yellow, /turf/simulated/floor/plating/airless, @@ -4992,10 +4988,6 @@ /obj/machinery/power/tesla_coil, /turf/simulated/floor/plating, /area/ruin/ancientstation/thetacorridor) -"Db" = ( -/obj/structure/transit_tube/crossing, -/turf/template_noop, -/area/space/nearstation) "Lu" = ( /obj/structure/transit_tube/horizontal{ dir = 4 @@ -5810,7 +5802,7 @@ aa aa aa aa -de +VT aa uQ ck @@ -7443,7 +7435,7 @@ aa aa aa dk -Db +cX aa dg dg @@ -7506,7 +7498,7 @@ aa aa aa aa -de +VT aa aa aa diff --git a/_maps/map_files/generic/centcomm.dmm b/_maps/map_files/generic/centcomm.dmm index ce337783d306..e446946827e8 100644 --- a/_maps/map_files/generic/centcomm.dmm +++ b/_maps/map_files/generic/centcomm.dmm @@ -3631,10 +3631,6 @@ /turf/simulated/floor/plasteel, /area/admin) "mt" = ( -/obj/structure/cable{ - d2 = 2; - icon_state = "0-2" - }, /obj/machinery/mech_bay_recharge_port/upgraded, /turf/simulated/floor/plasteel, /area/admin) @@ -3646,10 +3642,6 @@ /turf/simulated/floor/mineral/titanium, /area/shuttle/administration) "mw" = ( -/obj/structure/cable{ - d2 = 2; - icon_state = "0-2" - }, /obj/machinery/computer/mech_bay_power_console, /turf/simulated/floor/plasteel, /area/admin) @@ -8297,10 +8289,6 @@ /area/centcom/suppy) "DD" = ( /obj/machinery/power/apc/directional/south, -/obj/structure/cable{ - d2 = 4; - icon_state = "0-4" - }, /obj/structure/sign/securearea{ pixel_x = -32 }, @@ -8344,15 +8332,6 @@ /turf/simulated/floor/plasteel/dark, /area/admin) "DL" = ( -/obj/structure/cable{ - d2 = 8; - icon_state = "0-8" - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, /obj/machinery/mech_bay_recharge_port/upgraded, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/gamma/space) @@ -8363,11 +8342,6 @@ /area/centcom/specops) "DN" = ( /obj/mecha/combat/marauder/ares/loaded, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/gamma/space) "DO" = ( @@ -8440,10 +8414,6 @@ /turf/simulated/floor/engine, /area/admin) "DY" = ( -/obj/structure/cable{ - d2 = 8; - icon_state = "0-8" - }, /obj/machinery/computer/mech_bay_power_console{ dir = 1 }, diff --git a/_maps/map_files/stations/boxstation.dmm b/_maps/map_files/stations/boxstation.dmm index f611c8ee6d3e..9939e6204ce4 100644 --- a/_maps/map_files/stations/boxstation.dmm +++ b/_maps/map_files/stations/boxstation.dmm @@ -5521,13 +5521,10 @@ /turf/simulated/floor/carpet/cyan, /area/station/security/prison/cell_block/A) "atb" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 1"; - name = "Cell 1 Locker" - }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, +/obj/structure/closet/secure_closet/brig/temp/cell_1, /turf/simulated/floor/carpet/cyan, /area/station/security/prison/cell_block/A) "atc" = ( @@ -5557,13 +5554,10 @@ }, /area/station/security/prison/cell_block/A) "ate" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 3"; - name = "Cell 3 Locker" - }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, +/obj/structure/closet/secure_closet/brig/temp/cell_3, /turf/simulated/floor/plasteel{ icon_state = "redcorner" }, @@ -7807,26 +7801,20 @@ /turf/simulated/floor/plating, /area/station/maintenance/fore) "azN" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 2"; - name = "Cell 2 Locker" - }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, +/obj/structure/closet/secure_closet/brig/temp/cell_2, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "redcorner" }, /area/station/security/prison/cell_block/A) "azO" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 4"; - name = "Cell 4 Locker" - }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, +/obj/structure/closet/secure_closet/brig/temp/cell_4, /turf/simulated/floor/plasteel{ icon_state = "redcorner" }, @@ -7890,15 +7878,12 @@ }, /area/station/security/prisonershuttle) "azW" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 5"; - name = "Cell 5 Locker" - }, /obj/machinery/camera{ c_tag = "Brig Cell 5"; dir = 9 }, /obj/effect/decal/cleanable/cobweb2, +/obj/structure/closet/secure_closet/brig/temp/cell_5, /turf/simulated/floor/plasteel, /area/station/security/prison/cell_block/A) "azX" = ( @@ -59201,7 +59186,7 @@ /area/station/hallway/primary/central/south) "gCu" = ( /obj/structure/lattice, -/obj/structure/transit_tube/crossing/horizontal, +/obj/structure/transit_tube/horizontal, /turf/space, /area/space/nearstation) "gCE" = ( diff --git a/_maps/map_files/stations/cerestation.dmm b/_maps/map_files/stations/cerestation.dmm index 667b8b21519f..22f6bcc00b23 100644 --- a/_maps/map_files/stations/cerestation.dmm +++ b/_maps/map_files/stations/cerestation.dmm @@ -7543,7 +7543,7 @@ /turf/simulated/floor/plasteel, /area/station/security/prisonershuttle) "aWo" = ( -/obj/structure/transit_tube/crossing/horizontal, +/obj/structure/transit_tube/horizontal, /obj/structure/lattice, /turf/space, /area/space/nearstation) @@ -13676,7 +13676,7 @@ }, /area/station/engineering/control) "bzJ" = ( -/obj/structure/transit_tube/crossing, +/obj/structure/transit_tube, /obj/structure/lattice, /turf/space, /area/space/nearstation) @@ -20227,33 +20227,6 @@ icon_state = "asteroidplating" }, /area/station/maintenance/asmaint) -"cdv" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 6"; - name = "Cell 6 Locker" - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Brig Cell 6"; - dir = 4 - }, -/obj/structure/cable/orange{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, -/obj/structure/cable/orange{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "redcorner" - }, -/area/station/security/prison/cell_block/A) "cdx" = ( /obj/machinery/light/small{ dir = 1 @@ -20430,6 +20403,30 @@ }, /turf/simulated/floor/plating, /area/station/maintenance/fsmaint2) +"cew" = ( +/obj/structure/cable/orange{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/cable/orange{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Brig Cell 6"; + dir = 4 + }, +/obj/structure/closet/secure_closet/brig/temp/cell_6, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "redcorner" + }, +/area/station/security/prison/cell_block/A) "cex" = ( /obj/machinery/firealarm{ dir = 4; @@ -29015,33 +29012,6 @@ icon_state = "darkyellow" }, /area/station/engineering/atmos) -"cZn" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 7"; - name = "Cell 7 Locker" - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Brig Cell 7"; - dir = 4 - }, -/obj/structure/cable/orange{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, -/obj/structure/cable/orange{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "redcorner" - }, -/area/station/security/prison/cell_block/A) "cZr" = ( /obj/structure/chair{ dir = 8 @@ -29445,33 +29415,6 @@ icon_state = "cafeteria" }, /area/station/medical/break_room) -"ddq" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 8"; - name = "Cell 8 Locker" - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Brig Cell 8"; - dir = 4 - }, -/obj/structure/cable/orange{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, -/obj/structure/cable/orange{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "redcorner" - }, -/area/station/security/prison/cell_block/A) "ddr" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -42229,10 +42172,7 @@ /turf/simulated/floor/plating, /area/station/security/permabrig) "gAQ" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 4"; - name = "Cell 4 Locker" - }, +/obj/structure/closet/secure_closet/brig/temp/cell_4, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "redcorner" @@ -42964,10 +42904,7 @@ }, /area/station/maintenance/asmaint) "gME" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 1"; - name = "Cell 1 Locker" - }, +/obj/structure/closet/secure_closet/brig/temp/cell_1, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "redcorner" @@ -43495,7 +43432,7 @@ /area/station/hallway/primary/fore/north) "gXd" = ( /obj/structure/lattice, -/obj/structure/transit_tube/crossing, +/obj/structure/transit_tube, /turf/space, /area/space/nearstation) "gXl" = ( @@ -45039,6 +44976,30 @@ icon_state = "bcircuit" }, /area/station/turret_protected/aisat/interior/secondary) +"hyJ" = ( +/obj/structure/cable/orange{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/cable/orange{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Brig Cell 7"; + dir = 4 + }, +/obj/structure/closet/secure_closet/brig/temp/cell_7, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "redcorner" + }, +/area/station/security/prison/cell_block/A) "hyR" = ( /obj/structure/cable/orange{ d1 = 4; @@ -54277,7 +54238,9 @@ /turf/simulated/floor/plating, /area/station/maintenance/disposal/southwest) "ksD" = ( -/obj/structure/safe, +/obj/structure/safe{ + known_by = list("captain") + }, /obj/item/clothing/head/bearpelt, /obj/item/reagent_containers/drinks/bottle/vodka/badminka, /obj/item/dice/d20{ @@ -73230,10 +73193,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/disposal/north) "qrV" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 2"; - name = "Cell 2 Locker" - }, +/obj/structure/closet/secure_closet/brig/temp/cell_2, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "redcorner" @@ -83159,6 +83119,30 @@ }, /turf/simulated/floor/plating/asteroid/ancient, /area/station/maintenance/maintcentral) +"tJy" = ( +/obj/structure/cable/orange{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/cable/orange{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Brig Cell 8"; + dir = 4 + }, +/obj/structure/closet/secure_closet/brig/temp/cell_8, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "redcorner" + }, +/area/station/security/prison/cell_block/A) "tJP" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 @@ -94068,10 +94052,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/disposal/external/southeast) "wYj" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 3"; - name = "Cell 3 Locker" - }, +/obj/structure/closet/secure_closet/brig/temp/cell_3, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "redcorner" @@ -115861,7 +115842,7 @@ cFf qNG ejj cTe -cdv +cew aEn aWl bWx @@ -116632,7 +116613,7 @@ cFm qNG ejj cTn -cZn +hyJ aEn drB bWx @@ -117403,7 +117384,7 @@ cFT qNG ejj bxL -ddq +tJy aEn drB bWx diff --git a/_maps/map_files/stations/deltastation.dmm b/_maps/map_files/stations/deltastation.dmm index e349499d4aee..293adf514118 100644 --- a/_maps/map_files/stations/deltastation.dmm +++ b/_maps/map_files/stations/deltastation.dmm @@ -29118,15 +29118,12 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/structure/closet/secure_closet/brig{ - id = "Cell 1"; - name = "Cell 1 Locker" - }, /obj/item/radio/intercom{ name = "north bump"; pixel_y = 28 }, /obj/machinery/atmospherics/unary/vent_pump/on, +/obj/structure/closet/secure_closet/brig/temp/cell_1, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "darkredcorners" @@ -29227,10 +29224,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, -/obj/structure/closet/secure_closet/brig{ - id = "Cell 6"; - name = "Cell 6 Locker" - }, +/obj/structure/closet/secure_closet/brig/temp/cell_6, /turf/simulated/floor/plasteel{ icon_state = "darkredcorners" }, @@ -29839,14 +29833,6 @@ pixel_y = -24; req_one_access_txt = "75" }, -/obj/machinery/requests_console{ - announcementConsole = 1; - department = "Bridge"; - departmentType = 5; - name = "Bridge Requests Console"; - pixel_x = -30; - pixel_y = -30 - }, /turf/simulated/floor/carpet, /area/station/command/bridge) "bHt" = ( @@ -70072,13 +70058,10 @@ }, /area/station/maintenance/theatre) "glX" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 3"; - name = "Cell 3 Locker" - }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, +/obj/structure/closet/secure_closet/brig/temp/cell_3, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "darkredcorners" @@ -72173,7 +72156,7 @@ /area/station/security/evidence) "hFE" = ( /obj/structure/lattice/catwalk, -/obj/structure/transit_tube/crossing{ +/obj/structure/transit_tube{ dir = 8 }, /turf/space, @@ -74418,13 +74401,10 @@ c_tag = "Brig - Cell 2"; dir = 8 }, -/obj/structure/closet/secure_closet/brig{ - id = "Cell 2"; - name = "Cell 2 Locker" - }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, +/obj/structure/closet/secure_closet/brig/temp/cell_2, /turf/simulated/floor/plating, /area/station/security/prison/cell_block) "iYj" = ( @@ -82503,6 +82483,19 @@ /obj/structure/cable, /turf/simulated/floor/plating, /area/station/command/office/cmo) +"nRs" = ( +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Bridge"; + departmentType = 5; + name = "Bridge Requests Console"; + pixel_y = -30; + dir = 1 + }, +/turf/simulated/floor/plasteel{ + icon_state = "darkblue" + }, +/area/station/command/bridge) "nRv" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -90799,13 +90792,10 @@ /turf/simulated/floor/plating, /area/station/security/execution) "sCu" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 4"; - name = "Cell 4 Locker" - }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, +/obj/structure/closet/secure_closet/brig/temp/cell_4, /turf/simulated/floor/plasteel{ icon_state = "darkredcorners" }, @@ -95037,10 +95027,6 @@ /turf/simulated/floor/carpet/purple, /area/station/medical/psych) "uYc" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 5"; - name = "Cell 5 Locker" - }, /obj/machinery/camera{ c_tag = "Brig - Cell 5" }, @@ -95053,6 +95039,7 @@ name = "north bump"; pixel_y = 28 }, +/obj/structure/closet/secure_closet/brig/temp/cell_5, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "darkredcorners" @@ -141696,7 +141683,7 @@ bwf bAC bCl byU -bFy +nRs bWX bWX iDU diff --git a/_maps/map_files/stations/metastation.dmm b/_maps/map_files/stations/metastation.dmm index a4fa93f3c00d..93799a729a5e 100644 --- a/_maps/map_files/stations/metastation.dmm +++ b/_maps/map_files/stations/metastation.dmm @@ -7211,7 +7211,6 @@ /obj/machinery/door/airlock/mining, /obj/effect/mapping_helpers/airlock/autoname, /obj/effect/mapping_helpers/airlock/access/any/supply/mining, -/obj/effect/mapping_helpers/airlock/access/any/supply/cargo_bay, /turf/simulated/floor/plasteel, /area/station/supply/miningdock) "aKf" = ( @@ -7227,7 +7226,6 @@ /obj/machinery/door/airlock/mining, /obj/effect/mapping_helpers/airlock/autoname, /obj/effect/mapping_helpers/airlock/access/any/supply/mining, -/obj/effect/mapping_helpers/airlock/access/any/supply/cargo_bay, /turf/simulated/floor/plasteel, /area/station/supply/miningdock) "aKg" = ( @@ -47802,22 +47800,6 @@ }, /turf/simulated/floor/plasteel, /area/station/security/permabrig) -"eCO" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 1"; - name = "Cell 1 Locker" - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/station/security/prison/cell_block/A) "eDj" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ @@ -52939,22 +52921,6 @@ /obj/item/stack/cable_coil/five, /turf/simulated/floor/bluegrid, /area/station/maintenance/starboard) -"gHX" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 3"; - name = "Cell 3 Locker" - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/station/security/prison/cell_block/A) "gIb" = ( /obj/machinery/atmospherics/binary/pump{ dir = 8; @@ -57366,7 +57332,7 @@ /area/station/service/hydroponics) "iuj" = ( /obj/structure/lattice/catwalk, -/obj/structure/transit_tube/crossing{ +/obj/structure/transit_tube{ dir = 8 }, /turf/space, @@ -58889,7 +58855,7 @@ /turf/simulated/floor/plasteel, /area/station/engineering/break_room) "jbB" = ( -/obj/structure/transit_tube/crossing{ +/obj/structure/transit_tube{ dir = 8 }, /obj/structure/lattice, @@ -65534,14 +65500,11 @@ /turf/simulated/floor/plasteel, /area/station/security/permabrig) "lNw" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 2"; - name = "Cell 2 Locker" - }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, /obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/brig/temp/cell_2, /turf/simulated/floor/plasteel, /area/station/security/prison/cell_block/A) "lNT" = ( @@ -70660,6 +70623,19 @@ /obj/effect/spawner/random_spawners/oil_maybe, /turf/simulated/floor/plasteel, /area/station/maintenance/fore) +"nSC" = ( +/obj/structure/closet/secure_closet/brig/temp/cell_1, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/station/security/prison/cell_block/A) "nSH" = ( /obj/machinery/disposal, /obj/structure/disposalpipe/trunk{ @@ -73864,11 +73840,8 @@ }, /area/station/science/research) "pnB" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 5"; - name = "Cell 5 Locker" - }, /obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/brig/temp/cell_5, /turf/simulated/floor/plasteel, /area/station/security/brig) "pos" = ( @@ -78085,6 +78058,19 @@ icon_state = "darkgreycheck" }, /area/station/medical/break_room) +"rbk" = ( +/obj/structure/closet/secure_closet/brig/temp/cell_3, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/station/security/prison/cell_block/A) "rbo" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/reinforced, @@ -87558,14 +87544,11 @@ }, /area/station/hallway/primary/starboard/east) "vbF" = ( -/obj/structure/closet/secure_closet/brig{ - id = "Cell 4"; - name = "Cell 4 Locker" - }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, /obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/brig/temp/cell_4, /turf/simulated/floor/plasteel, /area/station/security/prison/cell_block/A) "vbV" = ( @@ -119511,9 +119494,9 @@ oNr apP dig uJs -gHX +rbk dig -eCO +nSC mOs eiE aiF diff --git a/_maps/map_files220/stations/boxstation.dmm b/_maps/map_files220/stations/boxstation.dmm index d27b7e6a341b..444f46e5d377 100644 --- a/_maps/map_files220/stations/boxstation.dmm +++ b/_maps/map_files220/stations/boxstation.dmm @@ -41688,7 +41688,7 @@ /area/space/nearstation) "dhk" = ( /obj/effect/spawner/window/reinforced/grilled, -/obj/structure/transit_tube/crossing/horizontal, +/obj/structure/transit_tube/horizontal, /turf/simulated/floor/plating, /area/station/engineering/ai_transit_tube) "dhp" = ( @@ -42348,11 +42348,6 @@ /obj/machinery/hologram/holopad, /turf/simulated/floor/plasteel, /area/station/supply/storage) -"djM" = ( -/obj/structure/lattice, -/obj/structure/transit_tube/crossing, -/turf/space, -/area/space/nearstation) "djO" = ( /obj/machinery/door/airlock/public/glass, /obj/effect/mapping_helpers/airlock/autoname, @@ -101273,7 +101268,7 @@ /area/station/maintenance/apmaint) "xXe" = ( /obj/effect/spawner/window/reinforced/grilled, -/obj/structure/transit_tube/crossing, +/obj/structure/transit_tube, /turf/simulated/floor/plating, /area/station/turret_protected/aisat/interior) "xXt" = ( @@ -142384,11 +142379,11 @@ aab aab seH dkZ -djM dkZ -djM dkZ -djM +dkZ +dkZ +dkZ dkZ cCh aab diff --git a/_maps/map_files220/stations/deltastation.dmm b/_maps/map_files220/stations/deltastation.dmm index 97bc1097980b..4ccefc07f2ab 100644 --- a/_maps/map_files220/stations/deltastation.dmm +++ b/_maps/map_files220/stations/deltastation.dmm @@ -29591,7 +29591,7 @@ /area/station/engineering/control) "coi" = ( /obj/structure/lattice/catwalk, -/obj/structure/transit_tube/crossing{ +/obj/structure/transit_tube{ dir = 8 }, /turf/space, diff --git a/_maps/map_files220/stations/metastation.dmm b/_maps/map_files220/stations/metastation.dmm index a2441c98f3b4..e50118dc36a9 100644 --- a/_maps/map_files220/stations/metastation.dmm +++ b/_maps/map_files220/stations/metastation.dmm @@ -55736,7 +55736,7 @@ /area/station/service/hydroponics) "iuj" = ( /obj/structure/lattice/catwalk, -/obj/structure/transit_tube/crossing{ +/obj/structure/transit_tube{ dir = 8 }, /turf/space, @@ -57134,7 +57134,7 @@ /turf/simulated/floor/plating, /area/station/command/bridge) "jbB" = ( -/obj/structure/transit_tube/crossing{ +/obj/structure/transit_tube{ dir = 8 }, /obj/structure/lattice, diff --git a/code/__DEFINES/icon_smoothing_defines.dm b/code/__DEFINES/icon_smoothing_defines.dm index 0d2fdaf958a5..882a2c4b2cc6 100644 --- a/code/__DEFINES/icon_smoothing_defines.dm +++ b/code/__DEFINES/icon_smoothing_defines.dm @@ -57,11 +57,13 @@ DEFINE_BITFIELD(smoothing_flags, list( #define SMOOTH_GROUP_CARPET_CYAN S_TURF(13) #define SMOOTH_GROUP_CARPET_GREEN S_TURF(14) #define SMOOTH_GROUP_CARPET_ROYALBLACK S_TURF(15) -#define SMOOTH_GROUP_CARPET_ROYALBLUE S_TURF(17) +#define SMOOTH_GROUP_CARPET_ROYALBLUE S_TURF(16) #define SMOOTH_GROUP_CARPET_RED S_TURF(17) #define SMOOTH_GROUP_CARPET_ORANGE S_TURF(18) #define SMOOTH_GROUP_CARPET_PURPLE S_TURF(19) +#define SMOOTH_GROUP_BAMBOO S_TURF(20) ///turf/simulated/floor/bamboo + #define SMOOTH_GROUP_SIMULATED_TURFS S_TURF(24) ///turf/simulated #define SMOOTH_GROUP_MATERIAL_WALLS S_TURF(25) ///turf/simulated/wall/material #define SMOOTH_GROUP_SYNDICATE_WALLS S_TURF(26) ///turf/simulated/wall/r_wall/syndicate, /turf/simulated/indestructible/syndicate @@ -91,6 +93,7 @@ DEFINE_BITFIELD(smoothing_flags, list( #define SMOOTH_GROUP_IRON_WALLS S_OBJ(9) ///turf/simulated/wall/mineral/iron, /obj/structure/falsewall/iron #define SMOOTH_GROUP_ABDUCTOR_WALLS S_OBJ(10) ///turf/simulated/wall/mineral/abductor, /obj/structure/falsewall/abductor #define SMOOTH_GROUP_TITANIUM_WALLS S_OBJ(11) ///turf/simulated/wall/mineral/titanium, /obj/structure/falsewall/titanium +#define SMOOTH_GROUP_ASTEROID_WALLS S_OBJ(12) ///turf/simulated/mineral, /obj/structure/falsewall/rock_ancient #define SMOOTH_GROUP_PLASTITANIUM_WALLS S_OBJ(13) ///turf/simulated/wall/mineral/plastitanium, /obj/structure/falsewall/plastitanium #define SMOOTH_GROUP_SURVIVAL_TIANIUM_POD S_OBJ(14) ///turf/simulated/wall/mineral/titanium/survival/pod, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod #define SMOOTH_GROUP_HIERO_WALL S_OBJ(15) ///obj/effect/temp_visual/elite_tumor_wall, /obj/effect/temp_visual/hierophant/wall @@ -98,7 +101,6 @@ DEFINE_BITFIELD(smoothing_flags, list( #define SMOOTH_GROUP_REGULAR_WALLS S_OBJ(17) ///turf/simulated/wall, /obj/structure/falsewall #define SMOOTH_GROUP_REINFORCED_WALLS S_OBJ(18) ///turf/simulated/wall/r_wall, /obj/structure/falsewall/reinforced #define SMOOTH_GROUP_CULT_WALLS S_OBJ(19) ///turf/simulated/wall/cult -#define SMOOTH_GROUP_ASTEROID_WALLS S_OBJ(12) ///turf/simulated/mineral, /obj/structure/falsewall/rock_ancient #define SMOOTH_GROUP_WINDOW_FULLTILE S_OBJ(21) ///turf/simulated/indestructible/fakeglass, /obj/structure/window/full/basic, /obj/structure/window/full/plasmabasic, /obj/structure/window/full/plasmareinforced, /obj/structure/window/full/reinforced #define SMOOTH_GROUP_WINDOW_FULLTILE_BRASS S_OBJ(22) ///obj/structure/window/brass/fulltile diff --git a/code/__DEFINES/pipes.dm b/code/__DEFINES/pipes.dm index a7baf86cadf7..8eadcae54e6f 100644 --- a/code/__DEFINES/pipes.dm +++ b/code/__DEFINES/pipes.dm @@ -58,15 +58,12 @@ // Transit tubes #define PIPE_TRANSIT_POD 200 #define PIPE_TRANSIT_TUBE 201 -#define PIPE_TRANSIT_TUBE_CROSSING 202 -#define PIPE_TRANSIT_TUBE_DIAGONAL 203 -#define PIPE_TRANSIT_TUBE_DIAGONAL_CROSSING 204 -#define PIPE_TRANSIT_TUBE_CURVED 205 -#define PIPE_TRANSIT_TUBE_JUNCTION 206 -#define PIPE_TRANSIT_TUBE_TERMINUS 207 -#define PIPE_TRANSIT_TUBE_STATION 208 -#define PIPE_TRANSIT_TUBE_TERMINUS_DISPENSER 209 -#define PIPE_TRANSIT_TUBE_DISPENSER_STATION 210 +#define PIPE_TRANSIT_TUBE_DIAGONAL 202 +#define PIPE_TRANSIT_TUBE_CURVED 203 +#define PIPE_TRANSIT_TUBE_JUNCTION 204 +#define PIPE_TRANSIT_TUBE_STATION 205 +#define PIPE_TRANSIT_TUBE_TERMINUS_DISPENSER 206 +#define PIPE_TRANSIT_TUBE_DISPENSER_STATION 207 //RPD stuff diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index d76a631cc0b3..54137f7d081c 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -159,30 +159,22 @@ // It will keep doing this until it checks every content possible. This will fix any problems with mobs, that are inside objects, // being unable to hear people due to being in a box within a bag. -/proc/recursive_mob_check(atom/O, list/L = list(), recursion_limit = 3, client_check = 1, sight_check = 1, include_radio = 1) - - //GLOB.debug_mob += O.contents.len +/proc/recursive_mob_check(atom/O, list/L = list(), recursion_limit = 3, client_check = TRUE, sight_check = TRUE) if(!recursion_limit) return L for(var/atom/A in O.contents) - if(ismob(A)) var/mob/M = A if(client_check && !M.client) - L |= recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check, include_radio) + L |= recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check) continue if(sight_check && !isInSight(A, O)) continue L |= M //log_world("[recursion_limit] = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])") - else if(include_radio && isradio(A)) - if(sight_check && !isInSight(A, O)) - continue - L |= A - if(isobj(A) || ismob(A)) - L |= recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check, include_radio) + L |= recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check) return L // The old system would loop through lists for a total of 5000 per function call, in an empty server. @@ -197,23 +189,17 @@ if(!T) return hear - var/list/range = hear(R, T) - - for(var/atom/A in range) + for(var/atom/A in hear(R, T)) if(ismob(A)) var/mob/M = A if(M.client || include_clientless) hear += M - //log_world("Start = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])") - else if(isradio(A)) - hear += A if(isobj(A) || ismob(A)) - hear |= recursive_mob_check(A, hear, 3, 1, 0, 1) + hear |= recursive_mob_check(A, hear, 3, TRUE, FALSE) return hear - /proc/get_mobs_in_radio_ranges(list/obj/item/radio/radios) . = list() // Returns a list of mobs who can hear any of the radios given in @radios @@ -235,7 +221,6 @@ for(var/turf/T in hear(R.canhear_range,speaker)) speaker_coverage[T] = T - // Try to find all the players who can hear the message for(var/A in GLOB.player_list + GLOB.hear_radio_list) var/mob/M = A diff --git a/code/__HELPERS/pronouns.dm b/code/__HELPERS/pronouns.dm index 12095e171e70..55a26a9e1b98 100644 --- a/code/__HELPERS/pronouns.dm +++ b/code/__HELPERS/pronouns.dm @@ -45,6 +45,13 @@ if(.) . = "e[.]" +// Functionally the \a macro, for the cases where you put a bicon between "some [bicon] pop corn" +/datum/proc/p_a(temp_gender) + var/backslash_a = "\a [src]" + backslash_a = splittext_char(backslash_a, " ") + if(length(backslash_a) >= 2) // ["some", "pop", "corn"], but we dont want "\a ["Thing"]" which is just ["Thing"] + . = backslash_a[1] + //like clients, which do have gender. /client/p_they(capitalized, temp_gender) if(!temp_gender) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index b665c964cf8f..f2d4cc4a0aa0 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -38,6 +38,10 @@ /proc/sanitize(t, list/repl_chars = null) return html_encode(sanitize_simple(t,repl_chars)) +/// sanitize() with a pre-set list of characters to remove from IC speech. +/proc/sanitize_for_ic(t) + return sanitize(t, list("<" = "", ">" = "", "\[" = "", "]" = "", "{" = "", "}" = "")) + // Gut ANYTHING that isnt alphanumeric, or brackets /proc/paranoid_sanitize(t) var/regex/alphanum_only = regex("\[^a-zA-Z0-9# ,.?!:;()]", "g") diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index f880dcc25dc1..4e347f8676d9 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -579,6 +579,42 @@ Returns 1 if the chain up to the area contains the given typepath return starting_turf +// returns turf relative to A for a given clockwise angle at set range +// result is bounded to map size +/proc/get_angle_target_turf(atom/A, angle, range) + if(!istype(A)) + return null + var/x = A.x + var/y = A.y + + x += range * sin(angle) + y += range * cos(angle) + + //Restricts to map boundaries while keeping the final angle the same + var/dx = A.x - x + var/dy = A.y - y + var/ratio + if(dy == 0) //prevents divide-by-zero errors + ratio = INFINITY + else + ratio = dx / dy + + if(x < 1) + y += (1 - x) / ratio + x = 1 + else if(x > world.maxx) + y += (world.maxx - x) / ratio + x = world.maxx + + if(y < 1) + x += (1 - y) * ratio + y = 1 + else if(y > world.maxy) + x += (world.maxy - y) * ratio + y = world.maxy + + return locate(round(x, 1), round(y, 1), A.z) + // returns turf relative to A offset in dx and dy tiles // bound to map limits /proc/get_offset_target_turf(atom/A, dx, dy) @@ -720,16 +756,19 @@ Returns 1 if the chain up to the area contains the given typepath //Takes: Area type as text string or as typepath OR an instance of the area. //Returns: A list of all turfs in areas of that type of that type in the world. /proc/get_area_turfs(areatype) - if(!areatype) return null - if(istext(areatype)) areatype = text2path(areatype) + if(!areatype) + return + if(istext(areatype)) + areatype = text2path(areatype) if(isarea(areatype)) var/area/areatemp = areatype areatype = areatemp.type var/list/turfs = list() - for(var/area/N in world) + for(var/area/N as anything in GLOB.all_areas) if(istype(N, areatype)) - for(var/turf/T in N) turfs += T + for(var/turf/T in N) + turfs += T return turfs //Takes: Area type as text string or as typepath OR an instance of the area. @@ -754,7 +793,7 @@ Returns 1 if the chain up to the area contains the given typepath var/y_pos var/z_pos -/area/proc/move_contents_to(area/A, turf_to_leave, direction) +/area/proc/move_contents_to(area/A, turf_to_leave, direction) // someone rewrite this function i beg of you //Takes: Area. Optional: turf type to leave behind. //Returns: Nothing. //Notes: Attempts to move the contents of one area to another area. @@ -763,7 +802,7 @@ Returns 1 if the chain up to the area contains the given typepath if(!A || !src) return 0 - var/list/turfs_src = get_area_turfs(src.type) + var/list/turfs_src = get_area_turfs(type) var/list/turfs_trg = get_area_turfs(A.type) var/src_min_x = 0 diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 1eacfda42293..205d4fe1ddeb 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -107,7 +107,7 @@ user.hud_used.position_action(src, position_info) /atom/movable/screen/movable/action_button/proc/fire_action(left_click = TRUE) - linked_action.Trigger(TRUE) + linked_action.Trigger(left_click) transform = transform.Scale(0.8, 0.8) alpha = 200 animate(src, transform = matrix(), time = 0.4 SECONDS, alpha = 255) @@ -128,7 +128,7 @@ AltClick(usr) return TRUE if(modifiers["middle"]) - fire_action(TRUE) + fire_action(FALSE) return TRUE if(modifiers["ctrl"]) CtrlClick(usr) diff --git a/code/_onclick/hud/action_group.dm b/code/_onclick/hud/action_group.dm index 480e4ba02ca8..f4bdc06c8cbe 100644 --- a/code/_onclick/hud/action_group.dm +++ b/code/_onclick/hud/action_group.dm @@ -57,7 +57,7 @@ row_offset = clamp(row_offset, 0, total_rows) // You're not allowed to offset so far that we have a row of blank space var/button_number = 0 - for(var/atom/movable/screen/button as anything in actions) + for(var/atom/movable/screen/button in actions) var/postion = ButtonNumberToScreenCoords(button_number) button.screen_loc = postion button_number++ diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 85edb417fbad..0e789eacb89c 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -81,7 +81,6 @@ add_fingerprint(user) - //the equivalent of the standard version of attack() but for object targets. /obj/item/proc/attack_obj(obj/O, mob/living/user, params) if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_OBJ, O, user) & COMPONENT_NO_ATTACK_OBJ) diff --git a/code/controllers/configuration/sections/general_configuration.dm b/code/controllers/configuration/sections/general_configuration.dm index 8a705d8c61d7..35477712f338 100644 --- a/code/controllers/configuration/sections/general_configuration.dm +++ b/code/controllers/configuration/sections/general_configuration.dm @@ -8,8 +8,10 @@ var/server_features = "Medium RP, varied species/jobs" /// Allow character OOC notes var/allow_character_metadata = TRUE - /// Time in seconds for the pregame lobby + /// Time in seconds for the pregame lobby. Measured in seconds var/lobby_time = 240 + /// Default timeout for world reboot. Measured in seconds + var/restart_timeout = 75 /// Ban all Guest BYOND accounts var/guest_ban = TRUE /// Allow players to use AntagHUD? @@ -118,6 +120,7 @@ // Numbers CONFIG_LOAD_NUM(lobby_time, data["lobby_time"]) + CONFIG_LOAD_NUM(restart_timeout, data["restart_timeout"]) CONFIG_LOAD_NUM(base_loadout_points, data["base_loadout_points"]) CONFIG_LOAD_NUM(cryo_penalty_period, data["cryo_penalty_period"]) CONFIG_LOAD_NUM(roundstart_observer_period, data["roundstart_observer_period"]) diff --git a/code/controllers/subsystem/SSticker.dm b/code/controllers/subsystem/SSticker.dm index 380109eef137..2c86a5833e26 100644 --- a/code/controllers/subsystem/SSticker.dm +++ b/code/controllers/subsystem/SSticker.dm @@ -13,8 +13,6 @@ SUBSYSTEM_DEF(ticker) var/round_start_time = 0 /// Time that the round started var/time_game_started = 0 - /// Default timeout for if world.Reboot() doesnt have a time specified - var/const/restart_timeout = 75 SECONDS /// Current status of the game. See code\__DEFINES\game.dm var/current_state = GAME_STATE_STARTUP /// Do we want to force-start as soon as we can @@ -84,7 +82,8 @@ SUBSYSTEM_DEF(ticker) if(GAME_STATE_STARTUP) // This is ran as soon as the MC starts firing, and should only run ONCE, unless startup fails round_start_time = world.time + (GLOB.configuration.general.lobby_time SECONDS) - to_chat(world, "Welcome to the pre-game lobby!") + pregame_timeleft = GLOB.configuration.general.lobby_time SECONDS + to_chat(world, "Welcome to the pre-game lobby!") to_chat(world, "Please, setup your character and select ready. Game will start in [GLOB.configuration.general.lobby_time] seconds") current_state = GAME_STATE_PREGAME fire() // TG says this is a good idea @@ -726,7 +725,7 @@ SUBSYSTEM_DEF(ticker) delay = max(0, delay) else // Use default restart timeout - delay = restart_timeout + delay = max(0, GLOB.configuration.general.restart_timeout SECONDS) to_chat(world, "Rebooting world in [delay/10] [delay > 10 ? "seconds" : "second"]. [reason]") diff --git a/code/controllers/subsystem/non_firing/SSmapping.dm b/code/controllers/subsystem/non_firing/SSmapping.dm index 4d51fd17c655..7d44bdbfd51f 100644 --- a/code/controllers/subsystem/non_firing/SSmapping.dm +++ b/code/controllers/subsystem/non_firing/SSmapping.dm @@ -83,33 +83,47 @@ SUBSYSTEM_DEF(mapping) log_startup_progress("Skipping lavaland ruins...") // Now we make a list of areas for teleport locs + // Located below is some of the worst code I've ever seen + // Checking all areas to see if they have a turf in them? Nice one ssmapping! + + var/list/all_areas = list() + for(var/area/areas in world) + all_areas += areas + teleportlocs = list() - for(var/area/AR in world) + for(var/area/AR as anything in all_areas) if(AR.no_teleportlocs) continue if(teleportlocs[AR.name]) continue - var/turf/picked = safepick(get_area_turfs(AR.type)) + var/list/pickable_turfs = list() + for(var/turf/turfs in AR) + pickable_turfs += turfs + var/turf/picked = safepick(pickable_turfs) if(picked && is_station_level(picked.z)) teleportlocs[AR.name] = AR teleportlocs = sortAssoc(teleportlocs) - ghostteleportlocs = list() - for(var/area/AR in world) + for(var/area/AR as anything in all_areas) if(ghostteleportlocs[AR.name]) continue - var/list/turfs = get_area_turfs(AR.type) - if(turfs.len) + var/list/pickable_turfs = list() + for(var/turf/turfs in AR) + pickable_turfs += turfs + if(length(pickable_turfs)) ghostteleportlocs[AR.name] = AR ghostteleportlocs = sortAssoc(ghostteleportlocs) // Now we make a list of areas that exist on the station. Good for if you don't want to select areas that exist for one station but not others. Directly references existing_station_areas = list() - for(var/area/AR in world) - var/turf/picked = safepick(get_area_turfs(AR.type)) + for(var/area/AR as anything in all_areas) + var/list/pickable_turfs = list() + for(var/turf/turfs in AR) + pickable_turfs += turfs + var/turf/picked = safepick(pickable_turfs) if(picked && is_station_level(picked.z)) existing_station_areas += AR diff --git a/code/datums/action.dm b/code/datums/action.dm index cace288d1b8b..d85eaa080a3c 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -21,6 +21,9 @@ /datum/action/New(Target) target = Target +/datum/action/proc/should_draw_cooldown() + return !IsAvailable() + /datum/action/proc/clear_ref(datum/ref) SIGNAL_HANDLER if(ref == owner) @@ -54,7 +57,7 @@ continue HideFrom(hud.mymob) - LAZYREMOVE(remove_from?.actions, src) // We aren't always properly inserted into the viewers list, gotta make sure that action's cleared + remove_from?.actions -= src // We aren't always properly inserted into the viewers list, gotta make sure that action's cleared viewers = list() // owner = null @@ -132,7 +135,7 @@ ApplyIcon(button, force) - if(!IsAvailable()) + if(should_draw_cooldown()) apply_unavailable_effect(button) else return TRUE @@ -142,7 +145,7 @@ var/datum/hud/our_hud = viewer.hud_used if(viewers[our_hud]) // Already have a copy of us? go away return - LAZYOR(viewer.actions, src) // Move this in + viewer.actions |= src // Move this in ShowTo(viewer) //Adds our action button to the screen of a player @@ -168,7 +171,7 @@ /datum/action/proc/HideFrom(mob/viewer) var/datum/hud/our_hud = viewer.hud_used var/atom/movable/screen/movable/action_button/button = viewers[our_hud] - LAZYREMOVE(viewer.actions, src) + viewer.actions -= src if(button) button.clean_up_keybinds(viewer) qdel(button) @@ -193,7 +196,7 @@ if(action == src) // This could be us, which is dumb continue var/atom/movable/screen/movable/action_button/button = action.viewers[owner.hud_used] - if(action.name == name && button.id) + if(action.name == name && button?.id) bitfield |= button.id bitfield = ~bitfield // Flip our possible ids, so we can check if we've found a unique one @@ -652,6 +655,10 @@ S.action = null return ..() +/datum/action/spell_action/should_draw_cooldown() + var/datum/spell/S = target + return S.cooldown_handler.should_draw_cooldown() + /datum/action/spell_action/Trigger(left_click) if(!..()) return FALSE diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index 4446dde3a26e..f9bd2931c641 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -1,18 +1,30 @@ /datum/component/caltrop + ///Minimum damage when crossed var/min_damage + + ///Maximum damage when crossed var/max_damage + + ///Probability of stunning and doing daamge var/probability + + ///Duration of weaken when crossed + var/weaken_duration + + ///Shoebypassing, walking interaction, silence var/flags var/cooldown = 0 -/datum/component/caltrop/Initialize(_min_damage = 0, _max_damage = 0, _probability = 100, _flags = NONE) - min_damage = _min_damage - max_damage = max(_min_damage, _max_damage) - probability = _probability - flags = _flags +/datum/component/caltrop/Initialize(_min_damage = 0, _max_damage = 0, _probability = 100, _weaken_duration = 6 SECONDS, _flags = NONE) + src.min_damage = _min_damage + src.max_damage = max(_min_damage, _max_damage) + src.probability = _probability + src.weaken_duration = _weaken_duration + src.flags = _flags - RegisterSignal(parent, list(COMSIG_MOVABLE_CROSSED), PROC_REF(Crossed)) +/datum/component/caltrop/RegisterWithParent() + RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, PROC_REF(Crossed)) /datum/component/caltrop/proc/Crossed(datum/source, atom/movable/AM) var/atom/A = parent @@ -22,41 +34,51 @@ if(!prob(probability)) return - if(ishuman(AM)) - var/mob/living/carbon/human/H = AM - if(HAS_TRAIT(H, TRAIT_PIERCEIMMUNE)) - return + if(!ishuman(AM)) + return + + var/mob/living/carbon/human/H = AM + + if(HAS_TRAIT(H, TRAIT_PIERCEIMMUNE)) + return + + if((flags & CALTROP_IGNORE_WALKERS) && H.m_intent == MOVE_INTENT_WALK) + return + + var/picked_def_zone = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + var/obj/item/organ/external/O = H.get_organ(picked_def_zone) - if((flags & CALTROP_IGNORE_WALKERS) && H.m_intent == MOVE_INTENT_WALK) - return + if(!istype(O)) + return - var/picked_def_zone = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) - var/obj/item/organ/external/O = H.get_organ(picked_def_zone) - if(!istype(O)) - return - if(O.is_robotic()) - return + if(O.is_robotic()) + return - var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET)) + var/feet_cover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET)) + var/bypass_shoes = flags & CALTROP_BYPASS_SHOES - if(!(flags & CALTROP_BYPASS_SHOES) && (H.shoes || feetCover)) - return + // doesn't penetrate if feet are covered + if(!bypass_shoes && (H.shoes || feet_cover)) + return - if(H.flying || H.floating || H.buckled) - return + // doesn't penetrate shoes if feet are extra covered + if(bypass_shoes && (H.shoes && (H.shoes.flags & THICKMATERIAL))) + return - if(IS_HORIZONTAL(H) && HAS_TRAIT(H, TRAIT_CONTORTED_BODY)) - return TRUE + if(H.flying || H.floating || H.buckled) + return - var/damage = rand(min_damage, max_damage) + if(IS_HORIZONTAL(H) && HAS_TRAIT(H, TRAIT_CONTORTED_BODY)) + return TRUE - H.apply_damage(damage, BRUTE, picked_def_zone) + var/damage = rand(min_damage, max_damage) + H.apply_damage(damage, BRUTE, picked_def_zone) - if(cooldown < world.time - 10) //cooldown to avoid message spam. - if(!H.incapacitated(ignore_restraints = TRUE)) - H.visible_message("[H] steps on [A].", "You step on [A]!") - else - H.visible_message("[H] slides on [A]!", "You slide on [A]!") + if(cooldown < world.time - 10) //cooldown to avoid message spam. + if(!H.incapacitated(ignore_restraints = TRUE)) + H.visible_message("[H] steps on [A].", "You step on [A]!") + else + H.visible_message("[H] slides on [A]!", "You slide on [A]!") - cooldown = world.time - H.Weaken(6 SECONDS) + cooldown = world.time + H.Weaken(weaken_duration) diff --git a/code/datums/emote.dm b/code/datums/emote.dm index 42304b2f8795..23e3ca9850a3 100644 --- a/code/datums/emote.dm +++ b/code/datums/emote.dm @@ -280,7 +280,7 @@ runechat_text = "[copytext(text, 1, 101)]..." var/list/can_see = get_mobs_in_view(1, user) //Allows silicon & mmi mobs carried around to see the emotes of the person carrying them around. can_see |= viewers(user, null) - for(var/mob/O in can_see) + for(var/mob/O as anything in can_see) if(O.status_flags & PASSEMOTES) for(var/obj/item/holder/H in O.contents) H.show_message(text, EMOTE_VISIBLE) diff --git a/code/datums/keybindings/movement_keybinds.dm b/code/datums/keybindings/movement_keybinds.dm index 1f1454f8fe53..21d49caa5b9d 100644 --- a/code/datums/keybindings/movement_keybinds.dm +++ b/code/datums/keybindings/movement_keybinds.dm @@ -26,7 +26,6 @@ /datum/keybinding/lock name = "Movement Lock (Prevents Moving When Held)" category = KB_CATEGORY_MOVEMENT - keys = list("Ctrl") /datum/keybinding/lock/down(client/C) . = ..() diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 6e721a5cf81f..f99a50cef926 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1758,6 +1758,39 @@ to_chat(current, "You seem to have forgotten the events of the past 10 minutes or so, and your head aches a bit as if someone beat it savagely with a stick.") to_chat(current, "This means you don't remember who you were working for or what you were doing.") +/datum/mind/proc/has_normal_assigned_role() + if(!assigned_role) + return FALSE + if(assigned_role == special_role) // nukie, ninjas, wizards, whatever + return FALSE + if(assigned_role == "Assistant") // because the default assigned role is assistant :P + for(var/list/L in list(GLOB.data_core.general)) + for(var/datum/data/record/R in L) + if(R.fields["name"] == name) + return TRUE + return FALSE + return TRUE + + +/datum/mind/proc/get_assigned_role_asset() //Used in asset generation for Orbiting + var/job_icons = GLOB.joblist + var/centcom = get_all_centcom_jobs() + SPECIAL_ROLE_ERT + SPECIAL_ROLE_DEATHSQUAD + var/solgov = get_all_solgov_jobs() + var/soviet = get_all_soviet_jobs() + + if(assigned_role in centcom) //Return with the NT logo if it is a Centcom job + return "centcom" + + if(assigned_role in solgov) //Return with the SolGov logo if it is a SolGov job + return "solgov" + + if(assigned_role in soviet) //Return with the U.S.S.P logo if it is a Soviet job + return "soviet" + + if(assigned_role in job_icons) //Check if the job has a hud icon + return assigned_role + return "unknown" + //Initialisation procs /mob/proc/mind_initialize() if(mind) diff --git a/code/datums/pipe_datums.dm b/code/datums/pipe_datums.dm index 8f9da40124c5..23c42723ae4c 100644 --- a/code/datums/pipe_datums.dm +++ b/code/datums/pipe_datums.dm @@ -344,14 +344,6 @@ GLOBAL_LIST_EMPTY(rpd_pipe_list) //Some pipes we don't want to be dispensable /// The type of the object that results from dispensing this datum from the RPD. var/construction_type = null -/datum/pipes/transit/pod - pipe_name = "transit pod" - construction_type = /obj/structure/transit_tube_construction/pod - pipe_id = PIPE_TRANSIT_POD - orientations = 2 - pipe_icon = "transit_pod" - rpd_dispensable = TRUE - /datum/pipes/transit/tube pipe_name = "transit tube" construction_type = /obj/structure/transit_tube_construction/straight @@ -360,14 +352,6 @@ GLOBAL_LIST_EMPTY(rpd_pipe_list) //Some pipes we don't want to be dispensable pipe_icon = "transit_straight" rpd_dispensable = TRUE -/datum/pipes/transit/tube/crossing - pipe_name = "transit tube crossing" - construction_type = /obj/structure/transit_tube_construction/straight/crossing - pipe_id = PIPE_TRANSIT_TUBE_CROSSING - orientations = 2 - pipe_icon = "transit_straight_crossing" - rpd_dispensable = TRUE - /datum/pipes/transit/tube/diagonal pipe_name = "diagonal transit tube" construction_type = /obj/structure/transit_tube_construction/diagonal @@ -376,14 +360,6 @@ GLOBAL_LIST_EMPTY(rpd_pipe_list) //Some pipes we don't want to be dispensable pipe_icon = "transit_diagonal" rpd_dispensable = TRUE -/datum/pipes/transit/tube/diagonal/crossing - pipe_name = "diagonal transit tube crossing" - construction_type = /obj/structure/transit_tube_construction/diagonal/crossing - pipe_id = PIPE_TRANSIT_TUBE_DIAGONAL_CROSSING - orientations = 2 - pipe_icon = "transit_diagonal_crossing" - rpd_dispensable = TRUE - /datum/pipes/transit/tube/curved pipe_name = "curved transit tube" construction_type = /obj/structure/transit_tube_construction/curved @@ -400,22 +376,6 @@ GLOBAL_LIST_EMPTY(rpd_pipe_list) //Some pipes we don't want to be dispensable pipe_icon = "transit_junction" rpd_dispensable = TRUE -/datum/pipes/transit/tube/terminus - pipe_name = "transit tube terminus" - construction_type = /obj/structure/transit_tube_construction/terminus - pipe_id = PIPE_TRANSIT_TUBE_TERMINUS - orientations = 4 - pipe_icon = "transit_terminus" - rpd_dispensable = TRUE - -/datum/pipes/transit/tube/station - pipe_name = "transit tube station" - construction_type = /obj/structure/transit_tube_construction/station - pipe_id = PIPE_TRANSIT_TUBE_STATION - orientations = 4 - pipe_icon = "transit_station" - rpd_dispensable = TRUE - /datum/pipes/transit/tube/terminus_dispenser_station pipe_name = "terminus dispenser tube station" construction_type = /obj/structure/transit_tube_construction/terminus/dispenser @@ -427,10 +387,19 @@ GLOBAL_LIST_EMPTY(rpd_pipe_list) //Some pipes we don't want to be dispensable /datum/pipes/transit/tube/dispenser_station pipe_name = "dispenser tube station" pipe_id = PIPE_TRANSIT_TUBE_DISPENSER_STATION + construction_type = /obj/structure/transit_tube_construction/station/dispenser orientations = 4 pipe_icon = "transit_dispenser_station" rpd_dispensable = TRUE +/datum/pipes/transit/tube/station + pipe_name = "transit tube station" + construction_type = /obj/structure/transit_tube_construction/station + pipe_id = PIPE_TRANSIT_TUBE_STATION + orientations = 4 + pipe_icon = "transit_station" + rpd_dispensable = TRUE + //Pipes the RPD can't dispense. Since these don't use an interface, we don't need to bother with setting an icon. We do, however, want to name these for other purposes /datum/pipes/atmospheric/circulator diff --git a/code/datums/spells/wizard_spells.dm b/code/datums/spells/wizard_spells.dm index 5317e92dff56..61d6c95fdd12 100644 --- a/code/datums/spells/wizard_spells.dm +++ b/code/datums/spells/wizard_spells.dm @@ -305,7 +305,7 @@ name = "Blind" desc = "This spell temporarily blinds a single person and does not require wizard garb." school = "transmutation" - base_cooldown = 10 SECONDS + base_cooldown = 15 SECONDS clothes_req = FALSE invocation = "STI KALY" invocation_type = "whisper" diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index efcc3c3ab286..9edf7eb42ad7 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -394,13 +394,13 @@ /datum/status_effect/pepper_spray/on_apply() . = ..() to_chat(owner, "Your throat burns!") - owner.AdjustConfused(12 SECONDS) + owner.AdjustConfused(12 SECONDS, bound_upper = 20 SECONDS) owner.Slowed(4 SECONDS) owner.apply_damage(40, STAMINA) /datum/status_effect/pepper_spray/refresh() . = ..() - owner.AdjustConfused(12 SECONDS) + owner.AdjustConfused(12 SECONDS, bound_upper = 20 SECONDS) owner.Slowed(4 SECONDS) owner.apply_damage(20, STAMINA) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index cf70c3d27bb4..c76d3d6d7f87 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1096,7 +1096,7 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons) if(!message) return var/list/speech_bubble_hearers = list() - for(var/mob/M in get_mobs_in_view(7, src)) + for(var/mob/M as anything in get_mobs_in_view(7, src)) M.show_message("[src] [atom_say_verb], \"[message]\"", 2, null, 1) if(M.client) speech_bubble_hearers += M.client diff --git a/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm b/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm index 993273c39b75..fd11e7048cf8 100644 --- a/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm +++ b/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm @@ -517,7 +517,7 @@ return FALSE if(sanitize) - message = trim_strip_html_properly(message) + message = sanitize_for_ic(trim(message)) if(stat) if(stat == DEAD) @@ -571,7 +571,7 @@ else if(istype(loc, /obj/machinery/hologram/holopad)) var/obj/machinery/hologram/holopad/H = loc name = "[H]" - for(var/mob/M in get_mobs_in_view(7, H)) + for(var/mob/M as anything in get_mobs_in_view(7, H)) M.hear_say(message_pieces, verb, FALSE, src) name = real_name return TRUE @@ -587,7 +587,7 @@ /mob/living/simple_animal/demon/pulse_demon/visible_message(message, self_message, blind_message) // overriden because pulse demon is quite often in non-turf locs, and /mob/visible_message acts differently there - for(var/mob/M in get_mobs_in_view(7, src)) + for(var/mob/M as anything in get_mobs_in_view(7, src)) if(M.see_invisible < invisibility) continue //can't view the invisible var/msg = message diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index ded8358aecd5..1cded54f77f4 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -1,6 +1,6 @@ /obj/machinery/camera name = "security camera" - desc = "It's used to monitor rooms." + desc = "Used by security teams and annoying AIs to watch over you." icon = 'icons/obj/monitors.dmi' icon_state = "camera" power_state = ACTIVE_POWER_USE diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 942ff0d194ba..d8666b35d087 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -234,11 +234,11 @@ setMenuState(ui.user, COMM_SCREEN_STAT) if("setmsg1") - stat_msg1 = clean_input("Line 1", "Enter Message Text", stat_msg1) + stat_msg1 = tgui_input_text(ui.user, "Line 1", stat_msg1, "Enter Message Text", encode = FALSE) setMenuState(ui.user, COMM_SCREEN_STAT) if("setmsg2") - stat_msg2 = clean_input("Line 2", "Enter Message Text", stat_msg2) + stat_msg2 = tgui_input_text(ui.user, "Line 2", stat_msg2, "Enter Message Text", encode = FALSE) setMenuState(ui.user, COMM_SCREEN_STAT) if("nukerequest") @@ -246,7 +246,7 @@ if(centcomm_message_cooldown > world.time) to_chat(ui.user, "Arrays recycling. Please stand by.") return - var/input = tgui_input_text(ui.user, "Please enter the reason for requesting the nuclear self-destruct codes. Misuse of the nuclear request system will not be tolerated under any circumstances. Transmission does not guarantee a response.", "Self Destruct Code Request.") + var/input = tgui_input_text(ui.user, "Please enter the reason for requesting the nuclear self-destruct codes. Misuse of the nuclear request system will not be tolerated under any circumstances. Transmission does not guarantee a response.", "Self Destruct Code Request.", encode = FALSE) if(!input || ..() || !(is_authenticated(ui.user) >= COMM_AUTHENTICATION_CAPT)) return if(length(input) < COMM_CCMSGLEN_MINIMUM) @@ -264,7 +264,7 @@ if(centcomm_message_cooldown > world.time) to_chat(ui.user, "Arrays recycling. Please stand by.") return - var/input = tgui_input_text(ui.user, "Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "CentComm Message") + var/input = tgui_input_text(ui.user, "Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "CentComm Message", encode = FALSE) if(!input || ..() || !(is_authenticated(ui.user) >= COMM_AUTHENTICATION_CAPT)) return if(length(input) < COMM_CCMSGLEN_MINIMUM) @@ -283,7 +283,7 @@ if(centcomm_message_cooldown > world.time) to_chat(ui.user, "Arrays recycling. Please stand by.") return - var/input = tgui_input_text(ui.user, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send Message") + var/input = tgui_input_text(ui.user, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send Message", encode = FALSE) if(!input || ..() || !(is_authenticated(ui.user) >= COMM_AUTHENTICATION_CAPT)) return if(length(input) < COMM_CCMSGLEN_MINIMUM) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 1e0b4b305178..298a072601f7 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -48,6 +48,7 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) /obj/machinery/door/airlock name = "airlock" + desc = "An airlock door keeping you safe from the vacuum of space. Only works if closed." icon = 'icons/obj/doors/airlocks/station/public.dmi' icon_state = "closed" anchored = TRUE @@ -1277,7 +1278,7 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) return 0 use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people if(forced) - playsound(loc, 'modular_ss220/aesthetics/airlocks/sound/open_force.ogg', 30, 1) // SS220 EDIT: ORIGINAL - 'sound/machines/airlockforced.ogg' + playsound(loc, 'sound/machines/airlockforcedopen.ogg', 30, TRUE) else playsound(loc, doorOpen, 30, 1) if(closeOther != null && istype(closeOther, /obj/machinery/door/airlock/) && !closeOther.density) @@ -1326,7 +1327,7 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people if(forced) - playsound(loc, 'modular_ss220/aesthetics/airlocks/sound/close_force.ogg', 30, 1) // SS220 EDIT: ORIGINAL - 'sound/machines/airlockforced.ogg' + playsound(loc, 'sound/machines/airlockforcedclose.ogg', 30, TRUE) else playsound(loc, doorClose, 30, 1) var/obj/structure/window/killthis = (locate(/obj/structure/window) in get_turf(src)) diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 6edf5605baa8..c4d7cb0c9cbe 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -540,7 +540,7 @@ glass = stealth_glass airlock_material = stealth_airlock_material name = "airlock" - desc = "It opens and closes." + desc = "An airlock door keeping you safe from the vacuum of space. Only works if closed." stealthy = TRUE update_icon() diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 23251c09a4c7..30f9691d98db 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -1,6 +1,6 @@ /obj/machinery/door/window name = "interior door" - desc = "A strong door." + desc = "A door that's also a window, isn't that amazing?" icon = 'icons/obj/doors/windoor.dmi' icon_state = "left" layer = ABOVE_WINDOW_LAYER @@ -401,6 +401,7 @@ /obj/machinery/door/window/reinforced name = "Branch, do not add stuff here" + desc = "A stronger version of the common windoor, often used by authority figures denying assistants their rightful access." icon_state = "leftsecure" base_state = "leftsecure" max_integrity = 300 //Stronger doors for prison (regular window door health is 200) @@ -435,8 +436,8 @@ base_state = "right" /obj/machinery/door/window/antitheft - desc = "Better do not try to steal, pal, lube off." name = "Branch, do not add stuff here" + desc = "Better do not try to steal, pal, lube off." /obj/machinery/door/window/antitheft/normal name = ".custom placement" @@ -448,6 +449,7 @@ /obj/machinery/door/window/brigdoor name = "Do not make stuff here, its needed for code to not collapse" + desc = "A stronger version of the common windoor, often used by authority figures denying assistants their rightful access." icon_state = "leftsecure" base_state = "leftsecure" max_integrity = 300 //Stronger doors for prison (regular window door health is 200) diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index 87442a6672d7..ac9571a6dd0d 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -1,5 +1,6 @@ /obj/machinery/floodlight name = "emergency floodlight" + desc = "An artificial sun, except a lot smaller and a lot less powerful." icon = 'icons/obj/machines/floodlight.dmi' icon_state = "flood00" anchored = FALSE diff --git a/code/game/machinery/guestpass.dm b/code/game/machinery/guestpass.dm index 278e53b80994..e289a5212b25 100644 --- a/code/game/machinery/guestpass.dm +++ b/code/game/machinery/guestpass.dm @@ -33,6 +33,7 @@ /obj/machinery/computer/guestpass name = "guest pass terminal" + desc = "This console allows staff to give out temporary access to their coworkers." icon_state = "guest" icon_screen = "pass" icon_keyboard = null @@ -231,6 +232,7 @@ /obj/machinery/computer/guestpass/hop name = "\improper HoP guest pass terminal" + desc = "The Head of Personnel's guest pass terminal allows the HoP to temporarily allow anyone into places they probably shouldn't be." /obj/machinery/computer/guestpass/hop/get_changeable_accesses() . = ..() diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index a2fb89910f8f..e4a3ce3450df 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -3,6 +3,7 @@ /obj/machinery/iv_drip name = "\improper IV drip" + desc = "Simply attach a bloodbag and puncture the patient with a needle, they'll have more blood in no time." icon = 'icons/goonstation/objects/iv.dmi' icon_state = "stand" anchored = FALSE diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 4b485350dcb0..734f85d0f5fd 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -2,7 +2,7 @@ // can have multiple per area /obj/machinery/light_switch name = "light switch" - desc = "It turns lights on and off. What are you, simple?" + desc = "A switch for turning the lights on and off for an entire room." icon = 'icons/obj/power.dmi' icon_state = "light1" anchored = TRUE @@ -45,7 +45,7 @@ /obj/machinery/light_switch/examine(mob/user) . = ..() - . += "A light switch. It is [get_area(src).lightswitch ? "on" : "off"]." + . += "It is [get_area(src).lightswitch ? "on" : "off"]." /obj/machinery/light_switch/attack_ghost(mob/user) if(user.can_advanced_admin_interact()) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 96e88bdc4454..0900e6e1e738 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -110,7 +110,7 @@ dat += "+
" user.set_machine(src) - user << browse("Space Heater Control Panel Панель[dat]", "window=spaceheater") + user << browse("Space Heater Control Panel[dat]", "window=spaceheater") onclose(user, "spaceheater") else diff --git a/code/game/machinery/vendors/departmental_vendors.dm b/code/game/machinery/vendors/departmental_vendors.dm index 9da207c6d01f..815fcce26c9f 100644 --- a/code/game/machinery/vendors/departmental_vendors.dm +++ b/code/game/machinery/vendors/departmental_vendors.dm @@ -208,6 +208,7 @@ /obj/item/seeds/wheat/rice = 3, /obj/item/seeds/soya = 3, /obj/item/seeds/sugarcane = 3, + /obj/item/seeds/bamboo = 3, /obj/item/seeds/sunflower = 3, /obj/item/seeds/tea = 3, /obj/item/seeds/tobacco = 3, diff --git a/code/game/machinery/vendors/generic_vendors.dm b/code/game/machinery/vendors/generic_vendors.dm index ccb259415121..bc190a29a43b 100644 --- a/code/game/machinery/vendors/generic_vendors.dm +++ b/code/game/machinery/vendors/generic_vendors.dm @@ -97,7 +97,7 @@ /obj/machinery/economy/vending/coffee name = "\improper Solar's Best Hot Drinks" - desc = "A vending machine which dispenses hot drinks." + desc = "A vending machine which dispenses coffee, coffee, hot chocolate, and more coffee!" ads_list = list("Have a drink!", "Drink up!", "It's good for you!", diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 8fc027675913..f549f5f8cd3b 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -276,6 +276,44 @@ T.color = null T.maptext = "" +/** + * Creates an explosion of shrapnel at a turf. + * - /turf/epicenter - where the explosion occurs + * - shrapnel_number - the amount of shrapnel to create + * - /obj/item/projectile/shrapnel_type - the type of shrapnel bullets to shoot + * - chance_to_hit_same_turf - the probability to hit someone on the same turf, doubled for someone lying down + */ +/proc/create_shrapnel(turf/epicenter, shrapnel_number = 10, obj/item/projectile/shrapnel_type = /obj/item/projectile/bullet/shrapnel, chance_to_hit_same_turf = 50) + epicenter = get_turf(epicenter) + if(!epicenter || !shrapnel_number || !shrapnel_type) + return + shrapnel_number = min(shrapnel_number, 200) // calm down badmins, no crashing the server + + var/angle_increment = 360 / shrapnel_number + var/mob/living/mob_standing_on_turf + var/mob/living/mob_lying_on_turf + + for(var/mob/living/M in epicenter) //find a mob at the epicenter. Non-prone mobs take priority + if(!IS_HORIZONTAL(M) && !mob_standing_on_turf) + mob_standing_on_turf = M + else if(!mob_lying_on_turf) + mob_lying_on_turf = M + + for(var/i in 1 to shrapnel_number) + var/obj/item/projectile/Shrapnel = new shrapnel_type(epicenter) + + // You can't just stand over a shrapnel explosion to avoid it + if(mob_standing_on_turf && prob(chance_to_hit_same_turf)) + Shrapnel.Bump(mob_standing_on_turf, TRUE) + continue + // If you dive on it, you're even more likely to get hit + if(mob_lying_on_turf && prob(2 * chance_to_hit_same_turf)) + Shrapnel.Bump(mob_lying_on_turf, TRUE) + continue + + var/angle = i * angle_increment + rand(-angle_increment / 2, angle_increment / 2) + Shrapnel.fire(angle) + #undef CREAK_DELAY #undef DEVASTATION_PROB #undef HEAVY_IMPACT_PROB diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index ce6ac1f0cf7a..a33c85c0c586 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -179,12 +179,7 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons if(ismob(loc)) var/mob/m = loc m.unEquip(src, 1) - // actions clear themselves from the list on cut - if(islist(actions)) - for(var/datum/action/A as anything in actions) - qdel(A) - if(!isnull(actions)) - actions.Cut() + QDEL_LIST_CONTENTS(actions) master = null return ..() diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 72e5e67d539d..3aa54e27af63 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -83,7 +83,7 @@ for(var/obj/O in view(14, get_turf(src))) O.hear_talk(user, message_to_multilingual("[message]")) - for(var/mob/M in get_mobs_in_view(7, src)) + for(var/mob/M as anything in get_mobs_in_view(7, src)) if((M.client?.prefs.toggles2 & PREFTOGGLE_2_RUNECHAT) && M.can_hear()) M.create_chat_message(user, message, FALSE, "big") diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 6e66f17366b5..17fa2b57e643 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -26,10 +26,6 @@ /obj/item/radio/beacon/hear_talk() return - -/obj/item/radio/beacon/send_hear() - return null - /// Probably a better way of doing this, I'm lazy. /obj/item/radio/beacon/bacon @@ -76,7 +72,8 @@ "Dark Lord" = /obj/item/storage/box/syndie_kit/bundle/darklord, "Sniper" = /obj/item/storage/box/syndie_kit/bundle/professional, "Grenadier" = /obj/item/storage/box/syndie_kit/bundle/grenadier, - "Augmented" = /obj/item/storage/box/syndie_kit/bundle/metroid) + "Augmented" = /obj/item/storage/box/syndie_kit/bundle/metroid, + "Ocelot" = /obj/item/storage/box/syndie_kit/bundle/ocelot) var/list/selected = list() var/list/unselected = list() diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 42f987fdb8bd..1370f1f2b42b 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -1,6 +1,6 @@ /obj/item/radio/intercom name = "station intercom (General)" - desc = "Talk through this." + desc = "A reliable form of communication even during local communication blackouts." icon_state = "intercom" layer = ABOVE_WINDOW_LAYER anchored = TRUE @@ -85,7 +85,7 @@ /obj/item/radio/intercom/syndicate name = "illicit intercom" - desc = "Talk through this. Evilly" + desc = "Communicate with your minions. Evilly" frequency = SYND_FREQ syndiekey = new /obj/item/encryptionkey/syndicate/nukeops @@ -296,7 +296,7 @@ /obj/item/radio/intercom/locked/prison name = "prison intercom" - desc = "Talk through this. It looks like it has been modified to not broadcast." + desc = "A reliable form of communication even during local communication blackouts. It looks like it has been modified to not broadcast. Not so reliable, I guess..." /obj/item/radio/intercom/locked/prison/New() ..() diff --git a/code/game/objects/items/devices/radio/radio_objects.dm b/code/game/objects/items/devices/radio/radio_objects.dm index 64a5c5c3bfa9..6757df97d497 100644 --- a/code/game/objects/items/devices/radio/radio_objects.dm +++ b/code/game/objects/items/devices/radio/radio_objects.dm @@ -542,11 +542,6 @@ GLOBAL_LIST_EMPTY(deadsay_radio_systems) return -1 return canhear_range -/obj/item/radio/proc/send_hear(freq, level) - var/range = receive_range(freq, level) - if(range > -1) - return get_mobs_in_view(canhear_range, src) - /obj/item/radio/proc/is_listening() var/is_listening = TRUE if(!on) @@ -823,7 +818,7 @@ GLOBAL_LIST_EMPTY(deadsay_radio_systems) to_chat(hearer, "[speaker_name] ([ghost_follow_link(subject, hearer)]) [message]") /obj/item/radio/headset/deadsay/talk_into(mob/living/M, list/message_pieces, channel, verbage) - var/message = sanitize(copytext(multilingual_to_message(message_pieces), 1, MAX_MESSAGE_LEN)) + var/message = copytext(multilingual_to_message(message_pieces), 1, MAX_MESSAGE_LEN) if(!message) return diff --git a/code/game/objects/items/devices/voice_changer.dm b/code/game/objects/items/devices/voice_changer.dm index 1fd3e0bdeb01..e7f34daa9612 100644 --- a/code/game/objects/items/devices/voice_changer.dm +++ b/code/game/objects/items/devices/voice_changer.dm @@ -34,13 +34,13 @@ A.UpdateButtons() /obj/item/voice_changer/proc/set_voice(mob/user) - var/chosen_voice = clean_input("What voice would you like to mimic? Leave this empty to use the voice on your ID card.", "Set Voice Changer", voice, user) + var/chosen_voice = input("What voice would you like to mimic? Leave this empty to use the voice on your ID card.", "Set Voice Changer", voice, user) if(!chosen_voice) voice = null to_chat(user, "You are now mimicking the voice on your ID card.") return - voice = sanitize(copytext_char(chosen_voice, 1, MAX_MESSAGE_LEN)) + voice = sanitize_for_ic(copytext_char(chosen_voice, 1, MAX_MESSAGE_LEN)) to_chat(user, "You are now mimicking [voice].") /obj/item/voice_changer/voice_modulator diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index ba66cfd4ce47..8f15849d83f0 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -233,11 +233,6 @@ GLOBAL_LIST_INIT(wood_recipes, list( new /datum/stack_recipe("pew (left)", /obj/structure/chair/sofa/pew/left, 5, one_per_turf = TRUE, on_floor = TRUE), new /datum/stack_recipe("pew (right)", /obj/structure/chair/sofa/pew/right, 5, one_per_turf = TRUE, on_floor = TRUE), )), - new /datum/stack_recipe_list("bamboo benches", list( - new /datum/stack_recipe("bamboo bench (middle)", /obj/structure/chair/sofa/bamboo, 2, one_per_turf = TRUE, on_floor = TRUE), - new /datum/stack_recipe("bamboo bench (left)", /obj/structure/chair/sofa/bamboo/left, 2, one_per_turf = TRUE, on_floor = TRUE), - new /datum/stack_recipe("bamboo bench (right)", /obj/structure/chair/sofa/bamboo/right, 2, one_per_turf = TRUE, on_floor = TRUE), - )), null, new /datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 1.5 SECONDS, one_per_turf = TRUE, on_floor = TRUE), new /datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 4 SECONDS), @@ -270,6 +265,47 @@ GLOBAL_LIST_INIT(wood_recipes, list( recipes = GLOB.wood_recipes return ..() +/* + * Bamboo + */ +GLOBAL_LIST_INIT(bamboo_recipes, list( + new /datum/stack_recipe("punji sticks trap", /obj/structure/punji_sticks, req_amount = 5, time = 3 SECONDS, one_per_turf = TRUE, on_floor = TRUE), + new /datum/stack_recipe("bamboo spear", /obj/item/spear/bamboo, req_amount = 25, time = 9 SECONDS), + new /datum/stack_recipe("blow gun", /obj/item/gun/syringe/blowgun, req_amount = 10, time = 7 SECONDS), + new /datum/stack_recipe("rice hat", /obj/item/clothing/head/rice_hat, req_amount = 10, time = 7 SECONDS), + null, + new /datum/stack_recipe("bamboo mat piece", /obj/item/stack/tile/bamboo, req_amount = 1, res_amount = 4, max_res_amount = 20), + new /datum/stack_recipe_list("tatami mats", list( + new /datum/stack_recipe("green tatami", /obj/item/stack/tile/bamboo/tatami, req_amount = 1, res_amount = 4, max_res_amount = 20), + new /datum/stack_recipe("purple tatami", /obj/item/stack/tile/bamboo/tatami/purple, req_amount = 1, res_amount = 4, max_res_amount = 20), + new /datum/stack_recipe("black tatami", /obj/item/stack/tile/bamboo/tatami/black, req_amount = 1, res_amount = 4, max_res_amount = 20), + )), + null, + new /datum/stack_recipe_list("bamboo benches", list( + new /datum/stack_recipe("bamboo bench (middle)", /obj/structure/chair/sofa/bamboo, req_amount = 3, time = 1 SECONDS, one_per_turf = TRUE, on_floor = TRUE), + new /datum/stack_recipe("bamboo bench (left)", /obj/structure/chair/sofa/bamboo/left, req_amount = 3, time = 1 SECONDS, one_per_turf = TRUE, on_floor = TRUE), + new /datum/stack_recipe("bamboo bench (right)", /obj/structure/chair/sofa/bamboo/right, req_amount = 3, time = 1 SECONDS, one_per_turf = TRUE, on_floor = TRUE) + )), + )) + +/obj/item/stack/sheet/bamboo + name = "bamboo cuttings" + desc = "Finely cut bamboo sticks." + singular_name = "cut bamboo stick" + icon = 'icons/obj/stacks/organic.dmi' + icon_state = "sheet-bamboo" + item_state = "sheet-bamboo" + resistance_flags = FLAMMABLE + sheettype = "bamboo" + merge_type = /obj/item/stack/sheet/bamboo + +/obj/item/stack/sheet/bamboo/New(loc, amount=null) + recipes = GLOB.bamboo_recipes + return ..() + +/obj/item/stack/sheet/bamboo/fifty + amount = 50 + /* * Cloth */ diff --git a/code/game/objects/items/stacks/stack_recipe.dm b/code/game/objects/items/stacks/stack_recipe.dm index 13acf7b06e43..2558b2dc017a 100644 --- a/code/game/objects/items/stacks/stack_recipe.dm +++ b/code/game/objects/items/stacks/stack_recipe.dm @@ -3,19 +3,40 @@ * Recipe datum */ /datum/stack_recipe + /// Visible title of recipe var/title = "ERROR" + + /// Resulting typepath of crafted atom var/result_type + + /// Required stack amount to make var/req_amount = 1 + + /// Amount of atoms made var/res_amount = 1 + + /// Maximum amount of atoms made var/max_res_amount = 1 + + /// Time to make var/time = 0 - var/one_per_turf = 0 - var/on_floor = 0 - var/on_floor_or_lattice = 0 + + /// Only one resulting atom is allowed per turf + var/one_per_turf = FALSE + + /// Requires a floor underneath to make + var/on_floor = FALSE + + /// Requires a floor OR lattice underneath to make + var/on_floor_or_lattice = FALSE + + /// Requires a valid window location to make var/window_checks = FALSE + + /// Resulting atom is a cult structure var/cult_structure = FALSE -/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, on_floor_or_lattice = 0, window_checks = FALSE, cult_structure = FALSE) +/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = FALSE, on_floor = FALSE, on_floor_or_lattice = FALSE, window_checks = FALSE, cult_structure = FALSE) src.title = title src.result_type = result_type src.req_amount = req_amount diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index d299e7a0eb94..47adcccace03 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -68,6 +68,52 @@ energy_type = /datum/robot_storage/energy/wood_tile is_cyborg = TRUE + +//Bamboo +/obj/item/stack/tile/bamboo + name = "bamboo mat pieces" + singular_name = "bamboo mat piece" + gender = PLURAL + desc = "A piece of a bamboo mat with a decorative trim." + icon_state = "tile_bamboo" + turf_type = /turf/simulated/floor/bamboo + merge_type = /obj/item/stack/tile/bamboo + parent_stack = TRUE + resistance_flags = FLAMMABLE + +/obj/item/stack/tile/bamboo/twenty + amount = 20 + +/obj/item/stack/tile/bamboo/tatami + name = "tatami with green rim" + singular_name = "green tatami floor tile" + icon_state = "tile_tatami_green" + turf_type = /turf/simulated/floor/bamboo/tatami + merge_type = /obj/item/stack/tile/bamboo/tatami + +/obj/item/stack/tile/bamboo/tatami/twenty + amount = 20 + +/obj/item/stack/tile/bamboo/tatami/purple + name = "tatami with purple rim" + singular_name = "purple tatami floor tile" + icon_state = "tile_tatami_purple" + turf_type = /turf/simulated/floor/bamboo/tatami/purple + merge_type = /obj/item/stack/tile/bamboo/tatami/purple + +/obj/item/stack/tile/bamboo/tatami/purple/twenty + amount = 20 + +/obj/item/stack/tile/bamboo/tatami/black + name = "tatami with black rim" + singular_name = "black tatami floor tile" + icon_state = "tile_tatami_black" + turf_type = /turf/simulated/floor/bamboo/tatami/black + merge_type = /obj/item/stack/tile/bamboo/tatami/black + +/obj/item/stack/tile/bamboo/tatami/black/twenty + amount = 20 + //Carpets /obj/item/stack/tile/carpet name = "carpet" diff --git a/code/game/objects/items/weapons/grenades/frag.dm b/code/game/objects/items/weapons/grenades/frag.dm index f264619c3352..e93c923df9c7 100644 --- a/code/game/objects/items/weapons/grenades/frag.dm +++ b/code/game/objects/items/weapons/grenades/frag.dm @@ -1,51 +1,74 @@ +#define DEFAULT_SHRAPNEL_RANGE 5 + /obj/item/grenade/frag name = "frag grenade" desc = "Fire in the hole." icon_state = "frag" item_state = "grenade" origin_tech = "materials=3;magnets=4" - var/range = 5 - var/max_shrapnel = 4 - var/embed_prob = 100 //reduced by armor - var/embedded_type = /obj/item/embedded/shrapnel + var/shrapnel_contained = 20 + var/embedded_type = /obj/item/projectile/bullet/shrapnel /obj/item/grenade/frag/prime() update_mob() - var/turf/epicenter = get_turf(src) - for(var/mob/living/carbon/human/H in epicenter) - if(IS_HORIZONTAL(H)) //grenade is jumped on but get real fucked up - embed_shrapnel(H, max_shrapnel) - range = 1 - explosion(loc, 0, 1, range, breach = FALSE) - for(var/turf/T in view(range, loc)) - for(var/mob/living/carbon/human/H in T) - var/shrapnel_amount = max_shrapnel - T.Distance(epicenter) - if(shrapnel_amount > 0) - embed_shrapnel(H, shrapnel_amount) + explosion(loc, 0, 1, DEFAULT_SHRAPNEL_RANGE, breach = FALSE) + create_shrapnel(loc, shrapnel_contained, shrapnel_type = embedded_type) qdel(src) -/obj/item/grenade/frag/proc/embed_shrapnel(mob/living/carbon/human/H, amount) - for(var/i = 0, i < amount, i++) - if(prob(embed_prob - ARMOUR_VALUE_TO_PERCENTAGE(H.getarmor(null, BOMB)))) - var/obj/item/embedded/S = new embedded_type(src) - H.hitby(S, skipcatch = 1) - S.throwforce = 1 - S.throw_speed = 1 - S.sharp = FALSE - else - to_chat(H, "Shrapnel bounces off your armor!") - -/obj/item/embedded/shrapnel +/** + * Shrapnel that flies through the air and hits you + */ +/obj/item/projectile/bullet/shrapnel name = "shrapnel" + icon_state = "magspear" + gender = PLURAL + range = DEFAULT_SHRAPNEL_RANGE + damage = 1 // 1 damage, to trigger stuff that reacts to damage. Rest of the damage is done through the physical shrapnel + var/embed_prob = 100 //reduced by armor + var/embedded_type = /obj/item/shrapnel + +/obj/item/projectile/bullet/shrapnel/on_hit(atom/target, blocked) + . = ..() + var/obj/item/new_possible_embed = new embedded_type(get_turf(src)) // drop it on the floor if we hit somethig non-living + if(!.) + return + if(!ishuman(target)) + return + + var/mob/living/carbon/human/H = target + if(!prob(embed_prob - ARMOUR_VALUE_TO_PERCENTAGE(H.getarmor(null, BOMB)))) + to_chat(H, "Shrapnel bounces off your armor!") + return + H.try_embed_object(new_possible_embed) + +/obj/item/projectile/bullet/shrapnel/on_range() + var/obj/item/we_missed = new embedded_type(get_turf(src)) // we missed, lets toss the shrapnel + var/range = gaussian(4, 2) + if(range > 0) + var/atom/i_wasnt_aiming_for_the_truck = get_angle_target_turf(get_turf(src), Angle, range) + we_missed.throw_at(i_wasnt_aiming_for_the_truck, 16, 3) + return ..() + +/** + * Shrapnel projectiles turn into this after trying to embed + */ +/obj/item/shrapnel + name = "shrapnel" + desc = "Metal shards at high velocity, a classic method of blowing your enemies up." icon = 'icons/obj/shards.dmi' - throwforce = 10 - throw_speed = EMBED_THROWSPEED_THRESHOLD + icon_state = "shrapnel1" + force = 8 // its a sharp piece of metal, but still not very effective + gender = PLURAL embed_chance = 100 embedded_fall_chance = 0 w_class = WEIGHT_CLASS_SMALL sharp = TRUE hitsound = 'sound/weapons/pierce.ogg' -/obj/item/embedded/shrapnel/New() - ..() +/obj/item/shrapnel/Initialize(mapload) + . = ..() icon_state = pick("shrapnel1", "shrapnel2", "shrapnel3") + pixel_x = rand(-8, 8) + pixel_y = rand(-8, 8) + +#undef DEFAULT_SHRAPNEL_RANGE diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm index 2bfd6c08747e..a9f15097ab8a 100644 --- a/code/game/objects/items/weapons/rpd.dm +++ b/code/game/objects/items/weapons/rpd.dm @@ -330,8 +330,14 @@ T.rpd_act(user, src) /obj/item/rpd/attack_obj(obj/O, mob/living/user) - if(istype(O, /obj/machinery/atmospherics/pipe) && user.a_intent != INTENT_HARM) - return + if(user.a_intent != INTENT_HARM) + if(istype(O, /obj/machinery/atmospherics/pipe)) + return + else if(istype(O, /obj/structure/disposalconstruct)) + return + else if(istype(O, /obj/structure/transit_tube_construction)) + return + return ..() #undef RPD_COOLDOWN_TIME diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 75d04fa1805f..96a360c191f2 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -479,8 +479,9 @@ var/dropped_something = FALSE for(var/obj/item/I in contents) - I.loc = dropspot - contents.Remove(I) + remove_from_storage(I) + // Set the properties of the new item here, e.g., stack count, hover highlight, tooltip + I.forceMove(target.loc) dropped_something = TRUE if(!found_table && isturf(dropspot)) // if no table, presume that the person just shittily dropped the tray on the ground and made a mess everywhere! diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index cd83d8b79b5c..24fcd542715e 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -38,6 +38,7 @@ /obj/item/storage/fancy/donut_box name = "donut box" + desc = "\"To do, or do nut, the choice is obvious.\"" icon_type = "donut" icon_state = "donutbox" storage_slots = 6 diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 85161bfe7b80..7788121da5db 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -91,23 +91,23 @@ /obj/item/autosurgeon/organ/syndicate/meson_eyes, // 0TC /obj/item/encryptionkey/syndicate) // 2TC -/// 175TC +/// 185TC /obj/item/storage/box/syndie_kit/bundle/payday name = "Heist Bundle" desc = "Alright guys, today we're performing a heist on a space station owned by a greedy corporation. Drain the vault of all its worth so we can get that pay dirt!11" items = list( - /obj/item/gun/projectile/revolver, // 13TC - /obj/item/ammo_box/a357, // 3TC - /obj/item/ammo_box/a357, // 3TC - /obj/item/card/emag, // 6TC - /obj/item/jammer, // 4TC - /obj/item/card/id/syndicate, // 2TC + /obj/item/gun/projectile/revolver, // 65 TC + /obj/item/ammo_box/a357, // 15 TC + /obj/item/ammo_box/a357, // 15 TC + /obj/item/card/emag, // 30 TC + /obj/item/jammer, // 20 TC + /obj/item/card/id/syndicate, // 10 TC /obj/item/clothing/under/suit/really_black, // 0TC /obj/item/clothing/suit/storage/iaa/blackjacket/armored, // 0TC /obj/item/clothing/gloves/color/latex/nitrile, // 0 TC /obj/item/clothing/mask/gas/clown_hat, // 0TC - /obj/item/grenade/plastic/c4, // 1TC - /obj/item/thermal_drill/diamond_drill/syndicate, // 1TC + /obj/item/grenade/plastic/c4, // 5 TC + /obj/item/thermal_drill/diamond_drill/syndicate, // 5 TC /obj/item/bio_chip_implanter/freedom/prototype, // 10 TC /obj/item/encryptionkey/syndicate) // 10TC @@ -209,6 +209,24 @@ /obj/item/clothing/head/collectable/slime, // 0TC priceless /obj/item/encryptionkey/syndicate) // 10TC +// 170 TC + combat knife + outfit +/obj/item/storage/box/syndie_kit/bundle/ocelot + name = "Ocelot Bundle" + desc = "Get pretty good with two revolvers, two speedloaders, and a backup combat knife." + items = list( + /obj/item/kitchen/knife/combat, // 0 TC but very robust + /obj/item/gun/projectile/revolver, // 65 TC + /obj/item/gun/projectile/revolver, // 65 TC + /obj/item/ammo_box/a357, // 15 TC + /obj/item/ammo_box/a357, // 15 TC + /obj/item/encryptionkey/syndicate, // 10 TC + /obj/item/clothing/under/syndicate/combat, // 0 TC + /obj/item/clothing/accessory/holster, // 0 TC + /obj/item/clothing/accessory/scarf/red, // 0 TC + /obj/item/clothing/head/beret, // 0 TC + /obj/item/clothing/gloves/combat, // 0 TC + /obj/item/clothing/shoes/combat) // 0 TC + /obj/item/storage/box/syndie_kit/bundle/populate_contents() for(var/obj/item/item as anything in items) new item(src) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 6e11a28b0a61..1e5cdf84f3a5 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -82,7 +82,7 @@ if(!in_range(src, user)) if(icon == src) - . += "It's \a [bicon(icon)][src]! If you want any more information you'll need to get closer." + . += "It's [p_a()] [bicon(icon)] [name]! If you want any more information you'll need to get closer." return var/celsius_temperature = air_contents.temperature - T0C diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index d2f28de7e2ae..fe099a838230 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -321,6 +321,13 @@ throwforce = 22 armour_penetration_percentage = 15 //Enhanced armor piercing +//Blatant imitation of spear, but all natural. Also not valid for explosive modification. +/obj/item/spear/bamboo + name = "bamboo spear" + desc = "A haphazardly-constructed bamboo stick with a sharpened tip, ready to poke holes into unsuspecting people." + base_icon_state = "bamboo_spear" + icon_state = "bamboo_spear0" + throwforce = 22 //GREY TIDE /obj/item/spear/grey_tide diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index afef1b023e01..2153082219c0 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -257,7 +257,7 @@ LINEN BINS /obj/structure/bedsheetbin name = "linen bin" - desc = "A linen bin. It looks rather cosy." + desc = "A linen bin. It looks rather cozy." icon = 'icons/obj/structures.dmi' icon_state = "linenbin-full" anchored = TRUE diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index e678e4952108..0374a5526875 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -11,6 +11,7 @@ /obj/structure/closet/secure_closet/freezer/kitchen name = "kitchen cabinet" + desc = "It's a card-locked cabinet for storing dry ingredients. It looks robust enough to withstand most explosions." req_access = list(ACCESS_KITCHEN) /obj/structure/closet/secure_closet/freezer/kitchen/populate_contents() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security_lockers.dm b/code/game/objects/structures/crates_lockers/closets/secure/security_lockers.dm index 8d1152880afc..9c5d4817a464 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security_lockers.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security_lockers.dm @@ -228,6 +228,44 @@ new /obj/item/card/id/prisoner/random(src) new /obj/item/radio/headset(src) +/obj/structure/closet/secure_closet/brig/temp + desc = "A locker connected to the cell's timer system, used to store prisoner belongings. It unlocks automatically once the sentence has been served." + +/obj/structure/closet/secure_closet/brig/temp/populate_contents() + return + +/obj/structure/closet/secure_closet/brig/temp/cell_1 + name = "Cell 1 Locker" + id = "Cell 1" + +/obj/structure/closet/secure_closet/brig/temp/cell_2 + name = "Cell 2 Locker" + id = "Cell 2" + +/obj/structure/closet/secure_closet/brig/temp/cell_3 + name = "Cell 3 Locker" + id = "Cell 3" + +/obj/structure/closet/secure_closet/brig/temp/cell_4 + name = "Cell 4 Locker" + id = "Cell 4" + +/obj/structure/closet/secure_closet/brig/temp/cell_5 + name = "Cell 5 Locker" + id = "Cell 5" + +/obj/structure/closet/secure_closet/brig/temp/cell_6 + name = "Cell 6 Locker" + id = "Cell 6" + +/obj/structure/closet/secure_closet/brig/temp/cell_7 + name = "Cell 7 Locker" + id = "Cell 7" + +/obj/structure/closet/secure_closet/brig/temp/cell_8 + name = "Cell 8 Locker" + id = "Cell 8" + /obj/structure/closet/secure_closet/brig/gulag name = "labor camp locker" desc = "A special locker designed to store prisoner belongings, allows access when prisoners meet their point quota." diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 361d4d9fbd66..9ed65153be98 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -375,8 +375,8 @@ new /obj/item/rcd(src) /obj/structure/closet/crate/freezer - desc = "A freezer." name = "Freezer" + desc = "A freezer for keeping food and organs fresh." icon_state = "freezer" icon_opened = "freezer_open" icon_closed = "freezer" diff --git a/code/game/objects/structures/extinguisher_cabinet.dm b/code/game/objects/structures/extinguisher_cabinet.dm index 0b69123d8802..77b53eb0e21b 100644 --- a/code/game/objects/structures/extinguisher_cabinet.dm +++ b/code/game/objects/structures/extinguisher_cabinet.dm @@ -5,7 +5,7 @@ /obj/structure/extinguisher_cabinet name = "extinguisher cabinet" - desc = "A small wall mounted cabinet designed to hold a fire extinguisher." + desc = "A small wall mounted cabinet designed to hold a fire extinguisher. \"Don't break the glass\" is written next to the handle." icon = 'icons/obj/closet.dmi' icon_state = "extinguisher" anchored = TRUE diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 7109ea8444b1..fd6d679e4e21 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -256,6 +256,7 @@ // Kirby plants /obj/item/kirbyplants name = "potted plant" + desc = "Some greenery, how nice." icon = 'icons/obj/flora/plants.dmi' icon_state = "random_plant" anchored = FALSE diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index d38b69822c90..6585976999ef 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -1,5 +1,6 @@ /obj/structure/girder name = "girder" + desc = "The basis of any wall, and therefore any space station or ship." icon_state = "girder" anchored = TRUE density = TRUE @@ -86,6 +87,9 @@ if(istype(W, /obj/item/stack/sheet/runed_metal)) to_chat(user, "You can't seem to make the metal bend.") return + if(istype(W, /obj/item/stack/sheet/bamboo)) // pending wall resprite(tm) + to_chat(user, "The bamboo doesn't seem to fit around the girder.") + return if(istype(W,/obj/item/stack/rods)) var/obj/item/stack/rods/S = W diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index a328b93a70d9..03e43867a88f 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -37,7 +37,7 @@ var/dat = "Noticeboard
" for(var/obj/item/paper/P in src) dat += "[P.name] Write Remove
" - user << browse("Notices Записки[dat]","window=noticeboard") + user << browse("Notices[dat]","window=noticeboard") onclose(user, "noticeboard") /obj/structure/noticeboard/deconstruct(disassembled = TRUE) diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 6f01518ae994..e472f9b19e78 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -424,7 +424,7 @@ resistance_flags = FLAMMABLE max_integrity = 70 buildstackamount = 2 - buildstacktype = /obj/item/stack/sheet/wood + buildstacktype = /obj/item/stack/sheet/bamboo /obj/structure/chair/sofa/bamboo/left icon_state = "bamboo_sofaend_left" @@ -453,7 +453,7 @@ resistance_flags = FLAMMABLE max_integrity = 70 buildstackamount = 2 - buildstacktype = /obj/item/stack/sheet/wood + buildstacktype = /obj/item/stack/sheet/bamboo /obj/item/chair name = "chair" @@ -497,8 +497,8 @@ /obj/item/chair/stool/bamboo name = "bamboo stool" desc = "Not the most comfortable, but vegan!" - item_state = "bamboo_stool" icon_state = "bamboo_stool_toppled" + item_state = "stool_bamboo" origin_type = /obj/structure/chair/stool/bamboo /obj/item/chair/attack_self(mob/user) diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 1443a69219b4..5cff309495b8 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -14,6 +14,7 @@ base_icon_state = "station0" exit_delay = 1 enter_delay = 2 + density = TRUE uninstalled_type = /obj/structure/transit_tube_construction/station var/pod_moving = FALSE var/launch_cooldown = 0 diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index df2036393952..aad4e1038186 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -8,7 +8,7 @@ desc = "A pneumatic tube that brings you from here to there." icon = 'icons/obj/pipes/transit_tube.dmi' icon_state = "straight" - density = TRUE + density = FALSE layer = 3.1 anchored = TRUE var/list/tube_dirs = null @@ -216,16 +216,6 @@ /obj/structure/transit_tube/diagonal/topleft dir = WEST -/obj/structure/transit_tube/diagonal/crossing - density = FALSE - icon_state = "diagonal_crossing" - uninstalled_type = /obj/structure/transit_tube_construction/diagonal/crossing - -//mostly for mapping use -/obj/structure/transit_tube/diagonal/crossing/topleft - dir = WEST - - /obj/structure/transit_tube/curved icon_state = "curved0" uninstalled_type = /obj/structure/transit_tube_construction/curved @@ -286,15 +276,6 @@ tube_dirs = list(WEST, SOUTHEAST, NORTHEAST) -/obj/structure/transit_tube/crossing - icon_state = "crossing" - uninstalled_type = /obj/structure/transit_tube_construction/straight/crossing - density = FALSE - -//mostly for mapping use -/obj/structure/transit_tube/crossing/horizontal - dir = WEST - // cosmetic "cap" for tubes. Note that tubes can't enter this. /obj/structure/transit_tube/cap icon_state = "cap" diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index bf891303496e..9dfbdf7819b0 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -64,6 +64,17 @@ user.visible_message("[user] disassembles [src].") qdel(src) +/obj/structure/transit_tube_construction/rpd_act(mob/user, obj/item/rpd/our_rpd) + . = TRUE + if(our_rpd.mode == RPD_ROTATE_MODE) + rotate() + else if(our_rpd.mode == RPD_FLIP_MODE) + flip() + else if(our_rpd.mode == RPD_DELETE_MODE) + our_rpd.delete_single_pipe(user, src) + else + return ..() + /obj/structure/transit_tube_construction/pod name = "uninstalled transit pod" layer = 3.2 // Necessary to be able to install them if on the same tile as tube/construction @@ -89,21 +100,11 @@ base_icon_state = "transit_straight" icon_state = "transit_straight" -/obj/structure/transit_tube_construction/straight/crossing - installed_type = /obj/structure/transit_tube/crossing - base_icon_state = "transit_straight_crossing" - icon_state = "transit_straight_crossing" - /obj/structure/transit_tube_construction/diagonal installed_type = /obj/structure/transit_tube/diagonal base_icon_state = "transit_diagonal" icon_state = "transit_diagonal" -/obj/structure/transit_tube_construction/diagonal/crossing - installed_type = /obj/structure/transit_tube/diagonal/crossing - base_icon_state = "transit_diagonal_crossing" - icon_state = "transit_diagonal_crossing" - /obj/structure/transit_tube_construction/curved installed_type = /obj/structure/transit_tube/curved installed_type_flipped = /obj/structure/transit_tube/curved/flipped @@ -116,12 +117,6 @@ base_icon_state = "transit_junction" icon_state = "transit_junction" -/obj/structure/transit_tube_construction/terminus - installed_type = /obj/structure/transit_tube/station/reverse - installed_type_flipped = /obj/structure/transit_tube/station/reverse/flipped - base_icon_state = "transit_terminus" - icon_state = "transit_terminus" - /obj/structure/transit_tube_construction/station installed_type = /obj/structure/transit_tube/station base_icon_state = "transit_station" diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 93c0197b2cbb..63715e60fdc0 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -680,6 +680,9 @@ edge_overlay_file = 'icons/obj/smooth_structures/windows/window_edges.dmi' env_smash_level = ENVIRONMENT_SMASH_WALLS // these windows are a fair bit tougher +/obj/structure/window/full/plasmabasic/BlockSuperconductivity() + return TRUE + /obj/structure/window/full/plasmareinforced name = "reinforced plasma window" desc = "A plasma-glass alloy window, with rods supporting it. It looks hopelessly tough to break. It also looks completely fireproof, considering how basic plasma windows are insanely fireproof." @@ -701,6 +704,9 @@ /obj/structure/window/full/plasmareinforced/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) return +/obj/structure/window/full/plasmareinforced/BlockSuperconductivity() + return TRUE + /obj/structure/window/full/reinforced name = "reinforced window" desc = "It looks rather strong. Might take a few good hits to shatter it." diff --git a/code/game/turfs/simulated/floor/asteroid_floors.dm b/code/game/turfs/simulated/floor/asteroid_floors.dm index daa1ec59b876..2294fd1f82c8 100644 --- a/code/game/turfs/simulated/floor/asteroid_floors.dm +++ b/code/game/turfs/simulated/floor/asteroid_floors.dm @@ -279,7 +279,9 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me // Move our tunnel forward tunnel = get_step(tunnel, dir) - if(istype(tunnel)) + // Separate ruin area check here because of the raw ChangeTurf call that + // doesn't go through SpawnFloor/Flora/Monster. + if(istype(tunnel) && !istype(tunnel.loc, /area/ruin)) // Small chance to have forks in our tunnel; otherwise dig our tunnel. var/caveprob = 20 switch(SSmapping.cave_theme) @@ -342,6 +344,8 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me /obj/effect/spawner/oasisrock/proc/make_rock(radius) var/our_turf = get_turf(src) for(var/turf/oasis in circlerangeturfs(our_turf, radius)) + if(istype(oasis.loc, /area/ruin)) + continue oasis.ChangeTurf(/turf/simulated/mineral/random/high_chance/volcanic, ignore_air = TRUE) var/list/valid_turfs = circlerangeturfs(our_turf, radius + 1) valid_turfs -= circlerangeturfs(our_turf, radius) @@ -352,6 +356,9 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me qdel(src) /turf/simulated/floor/plating/asteroid/airless/cave/proc/SpawnFloor(turf/T, monsterprob = 30) + if(istype(T.loc, /area/ruin)) + return + for(var/S in RANGE_TURFS(1, src)) var/turf/NT = S if(!NT || isspaceturf(NT) || istype(NT.loc, /area/mine/explored) || istype(NT.loc, /area/lavaland/surface/outdoors/explored)) @@ -365,6 +372,9 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me T.ChangeTurf(turf_type, FALSE, FALSE, TRUE) /turf/simulated/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T, monsterprob = 30) + if(istype(T.loc, /area/ruin)) + return + if(prob(monsterprob)) if(istype(loc, /area/mine/explored) || !istype(loc, /area/lavaland/surface/outdoors/unexplored)) return @@ -406,6 +416,9 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me #undef RECURSION_MAX /turf/simulated/floor/plating/asteroid/airless/cave/proc/SpawnFlora(turf/T) + if(istype(T.loc, /area/ruin)) + return + var/floraprob = 12 switch(SSmapping.cave_theme) if(BLOCKED_BURROWS) diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 5f448fb60758..5a025355fa52 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -53,6 +53,7 @@ oxygen = 8 temperature = 500 +// Grass /turf/simulated/floor/grass name = "grass patch" icon = 'icons/turf/floors/grass.dmi' @@ -102,7 +103,6 @@ transform = null //Carpets - /turf/simulated/floor/carpet name = "carpet" icon = 'icons/turf/floors/carpet.dmi' @@ -204,9 +204,71 @@ oxygen = 0 nitrogen = 0 temperature = TCMB - //End of carpets +// Bamboo mats +/turf/simulated/floor/bamboo + name = "bamboo" + icon = 'icons/turf/floors/bamboo_mat.dmi' + icon_state = "mat-0" + base_icon_state = "mat" + floor_tile = /obj/item/stack/tile/bamboo + prying_tool_list = list(TOOL_SCREWDRIVER) + broken_states = list("bamboo-damaged") + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = list(SMOOTH_GROUP_TURF, SMOOTH_GROUP_BAMBOO) + canSmoothWith = list(SMOOTH_GROUP_BAMBOO) + footstep = FOOTSTEP_WOOD + barefootstep = FOOTSTEP_WOOD_BAREFOOT + clawfootstep = FOOTSTEP_WOOD_CLAW + heavyfootstep = FOOTSTEP_GENERIC_HEAVY + +/turf/simulated/floor/bamboo/Initialize(mapload) + . = ..() + update_icon() + +/turf/simulated/floor/bamboo/update_icon_state() + if(!broken && !burnt) + if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + QUEUE_SMOOTH(src) + else + make_plating() + if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + QUEUE_SMOOTH_NEIGHBORS(src) + +/turf/simulated/floor/bamboo/break_tile() + broken = TRUE + update_icon() + +/turf/simulated/floor/bamboo/burn_tile() + burnt = TRUE + update_icon() + +/turf/simulated/floor/bamboo/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + return FALSE + +/turf/simulated/floor/bamboo/airless + oxygen = 0 + nitrogen = 0 + temperature = TCMB + +// Bamboo tatami mat +/turf/simulated/floor/bamboo/tatami + desc = "A traditional Japanese floor mat." + icon_state = "bamboo-green" + broken_states = list("tatami-damaged") + floor_tile = /obj/item/stack/tile/bamboo/tatami + smoothing_flags = NONE + +/turf/simulated/floor/bamboo/tatami/purple + icon_state = "bamboo-purple" + floor_tile = /obj/item/stack/tile/bamboo/tatami/purple + +/turf/simulated/floor/bamboo/tatami/black + icon_state = "bamboo-black" + floor_tile = /obj/item/stack/tile/bamboo/tatami/black +// End of bamboo + /turf/simulated/floor/fakespace icon = 'icons/turf/space.dmi' icon_state = "0" diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index adb25eb65439..d8465c694317 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -56,7 +56,7 @@ /// The neighbors of the turf. var/list/atmos_adjacent_turfs = list() /// makes turfs less picky about where they transfer gas. Largely just used in the SM - var/atmos_supeconductivity = 0 + var/atmos_superconductivity = 0 /* Lighting Vars diff --git a/code/game/world.dm b/code/game/world.dm index c4fab4b9445b..37226335dd3d 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -58,7 +58,7 @@ GLOBAL_DATUM(test_runner, /datum/test_runner) if(byond_version < MIN_COMPILER_VERSION || byond_build < MIN_COMPILER_BUILD) log_world("Your server's byond version does not meet the recommended requirements for this code. Please update BYOND") - GLOB.timezoneOffset = text2num(time2text(0, "hh")) * 36000 + GLOB.timezoneOffset = world.timezone * 36000 update_status() diff --git a/code/modules/admin/misc_admin_procs.dm b/code/modules/admin/misc_admin_procs.dm index 0609b8f91fd6..4d7805a8bca9 100644 --- a/code/modules/admin/misc_admin_procs.dm +++ b/code/modules/admin/misc_admin_procs.dm @@ -508,6 +508,10 @@ GLOBAL_VAR_INIT(nologevent, 0) alert("Unable to start the game as it is not set up.") return + if(!SSticker.ticker_going) + alert("Remove the round-start delay first.") + return + if(GLOB.configuration.general.start_now_confirmation) if(alert(usr, "This is a live server. Are you sure you want to start now?", "Start game", "Yes", "No") != "Yes") return @@ -588,7 +592,14 @@ GLOBAL_VAR_INIT(nologevent, 0) if(!check_rights(R_SERVER)) return - if(!SSticker || SSticker.current_state != GAME_STATE_PREGAME) + if(!SSticker) + alert("Slow down a moment, let the ticker start first!") + return + + if(SSblackbox) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Delay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + if(SSticker.current_state > GAME_STATE_PREGAME) SSticker.delay_end = !SSticker.delay_end log_admin("[key_name(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].") message_admins("[key_name(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) @@ -604,7 +615,6 @@ GLOBAL_VAR_INIT(nologevent, 0) SSticker.ticker_going = TRUE to_chat(world, "The game will start soon.") log_admin("[key_name(usr)] removed the delay.") - SSblackbox.record_feedback("tally", "admin_verb", 1, "Delay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! ////////////////////////////////////////////////////////////////////////////////////////////////ADMIN HELPER PROCS @@ -827,13 +837,13 @@ GLOBAL_VAR_INIT(gamma_ship_location, 1) // 0 = station , 1 = space toArea = locate(/area/shuttle/gamma/station) for(var/obj/machinery/door/poddoor/impassable/gamma/H in GLOB.airlocks) H.open() - GLOB.major_announcement.Announce("Central Command has deployed the Gamma Armory shuttle.", new_sound = 'sound/AI/commandreport.ogg') + GLOB.major_announcement.Announce("Central Command has deployed the Gamma Armory shuttle.", new_sound = 'sound/AI/gamma_deploy.ogg') else fromArea = locate(/area/shuttle/gamma/station) toArea = locate(/area/shuttle/gamma/space) for(var/obj/machinery/door/poddoor/impassable/gamma/H in GLOB.airlocks) H.close() //DOOR STUCK - GLOB.major_announcement.Announce("Central Command has recalled the Gamma Armory shuttle.", new_sound = 'sound/AI/commandreport.ogg') + GLOB.major_announcement.Announce("Central Command has recalled the Gamma Armory shuttle.", new_sound = 'sound/AI/gamma_recall.ogg') fromArea.move_contents_to(toArea) for(var/obj/machinery/mech_bay_recharge_port/P in toArea) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index d70c4ab8ae12..e6a7dc606e1f 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2438,7 +2438,7 @@ if(!input) qdel(P) return - input = admin_pencode_to_html(html_encode(input)) // Encode everything from pencode to html + input = admin_pencode_to_html(input) // Encode everything from pencode to html var/customname = clean_input("Pick a title for the fax.", "Fax Title", null, owner) if(!customname) @@ -3318,7 +3318,7 @@ if(!check_rights(R_EVENT)) return var/list/type_choices = typesof(/datum/station_goal) - typesof(/datum/station_goal/secondary) - var/picked = input("Choose goal type") in type_choices|null + var/picked = input("Choose goal type") as null|anything in type_choices if(!picked) return var/datum/station_goal/G = new picked() @@ -3327,11 +3327,12 @@ if(!newname) return G.name = newname - var/description = input("Enter NAS Trurl message contents:") as message|null + var/description = input("Enter NAS Trurl message contents:") as null|message if(!description) return G.report_message = description message_admins("[key_name_admin(usr)] created \"[G.name]\" station goal.") + log_admin("[key_name_admin(usr)] created \"[G.name]\" station goal.") SSticker.mode.station_goals += G modify_goals() @@ -3365,13 +3366,14 @@ var/department_choices = list() for(var/obj/machinery/requests_console/RC in GLOB.allRequestConsoles) department_choices |= RC.department - var/department = input("Choose goal department") in department_choices|null + var/department = input("Choose goal department") as null|anything in department_choices if(!department) return G.department = department G.should_send_crate = alert("Send a personal crate?","Send crate","Yes","No") == "Yes" G.Initialize() message_admins("[key_name_admin(usr)] created \"[G.name]\" station goal. Description: [G.admin_desc]") + log_admin("[key_name_admin(usr)] created \"[G.name]\" station goal. Description: [G.admin_desc]") SSticker.mode.secondary_goals += G modify_goals() diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 98f8570eb404..5132c5a99f5f 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -27,7 +27,7 @@ else targets["(No Mob) - [T]"] = T var/list/sorted = sortList(targets) - var/target = input(src,"To whom shall we send a message?","Admin PM",null) as null|anything in sorted|null + var/target = input(src,"To whom shall we send a message?","Admin PM",null) as null|anything in sorted if(!target) return cmd_admin_pm(targets[target],null) diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index 3612c67aae02..a970f55675f2 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -16,7 +16,7 @@ var/list/data = list() data["author"] = usr.ckey data["source"] = GLOB.configuration.system.instance_id - data["message"] = msg + data["message"] = html_decode(msg) SSredis.publish("byond.asay", json_encode(data)) for(var/client/C in GLOB.admins) @@ -72,7 +72,7 @@ var/list/data = list() data["author"] = usr.ckey data["source"] = GLOB.configuration.system.instance_id - data["message"] = msg + data["message"] = html_decode(msg) SSredis.publish("byond.msay", json_encode(data)) for(var/client/C in GLOB.admins) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index aceb94764138..6385a515fdf0 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -60,7 +60,7 @@ SEND_SOUND(X, sound('sound/effects/adminhelp.ogg')) /proc/ERT_Announce(text, mob/Sender, repeat_warning) - var/msg = sanitizeSafe(text) + var/msg = sanitize(text) var/insert_this = list(list( "time" = station_time_timestamp(), "sender_real_name" = "[Sender.real_name ? Sender.real_name : Sender.name]", diff --git a/code/modules/antagonists/changeling/datum_changeling.dm b/code/modules/antagonists/changeling/datum_changeling.dm index f8c39e74fd9b..edf430caee9f 100644 --- a/code/modules/antagonists/changeling/datum_changeling.dm +++ b/code/modules/antagonists/changeling/datum_changeling.dm @@ -241,12 +241,24 @@ * * power_type - should be a define related to [/datum/action/changeling/var/power_type]. */ /datum/antagonist/changeling/proc/get_powers_of_type(power_type) + var/list/station_trait_restrictions = list( + // "Station trait" = Replace 1st with 2nd when trait active + STATION_TRAIT_CYBERNETIC_REVOLUTION = list(/datum/action/changeling/dissonant_shriek, /datum/action/changeling/dissonant_shriek/cyberrev) + ) + var/list/powers = list() for(var/power_path in subtypesof(/datum/action/changeling)) var/datum/action/changeling/power = power_path if(initial(power.power_type) != power_type) continue powers += power_path + + for(var/trait in station_trait_restrictions) + if(HAS_TRAIT(SSstation, trait)) + powers -= station_trait_restrictions[trait][1] + else + powers -= station_trait_restrictions[trait][2] + return powers /** diff --git a/code/modules/antagonists/changeling/powers/shriek.dm b/code/modules/antagonists/changeling/powers/shriek.dm index 90c98ab8e6c0..c7e629bd6618 100644 --- a/code/modules/antagonists/changeling/powers/shriek.dm +++ b/code/modules/antagonists/changeling/powers/shriek.dm @@ -13,7 +13,7 @@ /datum/action/changeling/resonant_shriek/sting_action(mob/user) if(istype(user.loc, /obj/machinery/atmospherics)) return FALSE - for(var/mob/living/M in get_mobs_in_view(4, user)) + for(var/mob/living/M as anything in get_mobs_in_view(4, user)) if(iscarbon(M)) if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -55,3 +55,7 @@ L.break_light_tube() empulse(get_turf(user), 3, 5, 1) return TRUE + +/// A more expensive version, used during rounds with cyber rev station trait for balance reasons. +/datum/action/changeling/dissonant_shriek/cyberrev + dna_cost = 5 diff --git a/code/modules/arcade/prize_counter.dm b/code/modules/arcade/prize_counter.dm index 29642c8fc8aa..65e7c230c77a 100644 --- a/code/modules/arcade/prize_counter.dm +++ b/code/modules/arcade/prize_counter.dm @@ -121,8 +121,11 @@ ui_interact(user) /obj/machinery/prize_counter/proc/print_tickets() + if(tickets <= 0) + tickets = 0 // Reset tickets to zero when trying to print a negative number + return if(tickets >= 9999) - new /obj/item/stack/tickets(get_turf(src), 9999) //max stack size + new /obj/item/stack/tickets(get_turf(src), 9999) // Max stack size tickets -= 9999 else new /obj/item/stack/tickets(get_turf(src), tickets) diff --git a/code/modules/arcade/prize_datums.dm b/code/modules/arcade/prize_datums.dm index 2225818773c5..40d8f4d54e30 100644 --- a/code/modules/arcade/prize_datums.dm +++ b/code/modules/arcade/prize_datums.dm @@ -9,7 +9,7 @@ GLOBAL_DATUM_INIT(global_prizes, /datum/prizes, new()) /datum/prizes/proc/PlaceOrder(obj/machinery/prize_counter/prize_counter, itemID) var/datum/prize_item/item = GLOB.global_prizes.prizes[itemID] - if(!prize_counter) + if(!prize_counter || prize_counter.tickets < item.cost) return if(!item) return diff --git a/code/modules/asset_cache/assets/asset_orbit_icons.dm b/code/modules/asset_cache/assets/asset_orbit_icons.dm new file mode 100644 index 000000000000..edc7c9923e1d --- /dev/null +++ b/code/modules/asset_cache/assets/asset_orbit_icons.dm @@ -0,0 +1,12 @@ +/// Sprites for Orbit Role UI +/datum/asset/spritesheet/orbit_job + name = "orbit_job" + +/datum/asset/spritesheet/orbit_job/create_spritesheets() + var/list/states = GLOB.joblist + "prisoner" + "centcom" + "solgov" + "soviet" + "unknown" + for(var/state in states) + Insert(ckey(state), 'icons/mob/hud/job_assets.dmi', ckey(state)) + +/datum/asset/spritesheet/orbit_job/ModifyInserted(icon/pre_asset) + pre_asset.Scale(16, 16) + return pre_asset diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm index 235e387135b4..d8f0c27dccb6 100644 --- a/code/modules/atmospherics/environmental/LINDA_system.dm +++ b/code/modules/atmospherics/environmental/LINDA_system.dm @@ -9,9 +9,9 @@ R = 1 if(O.BlockSuperconductivity()) //the direction and open/closed are already checked on CanAtmosPass() so there are no arguments var/D = get_dir(src, T) - atmos_supeconductivity |= D + atmos_superconductivity |= D D = get_dir(T, src) - T.atmos_supeconductivity |= D + T.atmos_superconductivity |= D return 0 //no need to keep going, we got all we asked for(var/obj/O in T.contents) @@ -19,15 +19,15 @@ R = 1 if(O.BlockSuperconductivity()) var/D = get_dir(src, T) - atmos_supeconductivity |= D + atmos_superconductivity |= D D = get_dir(T, src) - T.atmos_supeconductivity |= D + T.atmos_superconductivity |= D return 0 var/D = get_dir(src, T) - atmos_supeconductivity &= ~D + atmos_superconductivity &= ~D D = get_dir(T, src) - T.atmos_supeconductivity &= ~D + T.atmos_superconductivity &= ~D if(!R) return 1 diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index cfdfd6ee2ea9..09207440574a 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -451,7 +451,7 @@ //Does particate in air exchange so only consider directions not considered during process_cell() for(var/direction in GLOB.cardinal) var/turf/T = get_step(src, direction) - if(!(T in atmos_adjacent_turfs) && !(atmos_supeconductivity & direction)) + if(!(T in atmos_adjacent_turfs) && !(atmos_superconductivity & direction)) conductivity_directions += direction if(conductivity_directions > 0) diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index 209e30cb02a1..a2cef4fc3f5e 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -2,7 +2,7 @@ GLOBAL_LIST_EMPTY(gas_meters) /obj/machinery/atmospherics/meter name = "gas flow meter" - desc = "A gas flow meter" + desc = "A meter used by experienced atmospheric technicians to determine pressure and temperature in a pipe." icon = 'icons/obj/meter.dmi' icon_state = "meterX" layer = GAS_PIPE_VISIBLE_LAYER + GAS_PUMP_OFFSET diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 17ad87abc116..f21c1b3fbc3e 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -216,7 +216,7 @@ icon_state = "cardborg_h" item_state = "cardborg_h" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH + flags_cover = HEADCOVERSEYES species_disguise = "High-tech robot" dog_fashion = /datum/dog_fashion/head/cardborg sprite_sheets = list( diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 2fb402bf66b5..f1875a85c805 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -1,6 +1,6 @@ /obj/item/clothing/mask/gas name = "gas mask" - desc = "A face-covering mask that can be connected to an air supply." + desc = "A face-covering mask that can be connected to an air supply. Used by mischievous assistants and syndicate agents alike." icon_state = "gas_alt" flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT flags_inv = HIDEEARS|HIDEEYES|HIDEFACE diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 6b17ad572364..a25ea41f2c0d 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -147,55 +147,60 @@ /obj/item/clothing/accessory/stethoscope name = "stethoscope" - desc = "An outdated medical apparatus for listening to the sounds of the human body. It also makes you look like you know what you're doing." + desc = "An outdated medical apparatus, used to get a rough idea of the condition of the heart and lungs. It also makes you look like you know what you're doing." icon_state = "stethoscope" item_color = "stethoscope" /obj/item/clothing/accessory/stethoscope/attack(mob/living/carbon/human/M, mob/living/user) - if(ishuman(M) && isliving(user)) - if(user == M) - user.visible_message("[user] places [src] against [user.p_their()] chest and listens attentively.", "You place [src] against your chest...") - else - user.visible_message("[user] places \the [src] against [M]'s chest and listens attentively.", "You place \the [src] against [M]'s chest...") - var/datum/organ/heart/heart_datum = M.get_int_organ_datum(ORGAN_DATUM_HEART) - var/obj/item/organ/internal/H = heart_datum.linked_organ - var/datum/organ/lungs/lung_datum = M.get_int_organ_datum(ORGAN_DATUM_LUNGS) - var/obj/item/organ/internal/L = lung_datum.linked_organ - if(M.pulse && (H || (L && !HAS_TRAIT(M, TRAIT_NOBREATH)))) - var/color = "notice" - if(H) - var/heart_sound - switch(H.damage) - if(0 to 1) - heart_sound = "healthy" - if(1 to 25) - heart_sound = "offbeat" - if(25 to 50) - heart_sound = "uneven" - color = "warning" - if(50 to INFINITY) - heart_sound = "weak, unhealthy" - color = "warning" - to_chat(user, "You hear \an [heart_sound] pulse.") - if(L) - var/lung_sound - switch(L.damage) - if(0 to 1) - lung_sound = "healthy respiration" - if(1 to 25) - lung_sound = "labored respiration" - if(25 to 50) - lung_sound = "pained respiration" - color = "warning" - if(50 to INFINITY) - lung_sound = "gurgling" - color = "warning" - to_chat(user, "You hear [lung_sound].") - else - to_chat(user, "You don't hear anything.") + if(!ishuman(M) || !isliving(user)) + return ..(M, user) + + if(user == M) + user.visible_message("[user] places [src] against [user.p_their()] chest and listens attentively.", "You place [src] against your chest...") + else + user.visible_message("[user] places [src] against [M]'s chest and listens attentively.", "You place [src] against [M]'s chest...") + var/datum/organ/heart/heart_datum = M.get_int_organ_datum(ORGAN_DATUM_HEART) + var/datum/organ/lungs/lung_datum = M.get_int_organ_datum(ORGAN_DATUM_LUNGS) + if(!lung_datum || !heart_datum) + to_chat(user, "You don't hear anything.") + return + + var/obj/item/organ/internal/H = heart_datum.linked_organ + var/obj/item/organ/internal/L = lung_datum.linked_organ + if(!M.pulse || (!H || !(L && !HAS_TRAIT(M, TRAIT_NOBREATH)))) + to_chat(user, "You don't hear anything.") return - return ..(M,user) + var/color = "notice" + if(H) + var/heart_sound + switch(H.damage) + if(0 to 1) + heart_sound = "healthy" + if(1 to 25) + heart_sound = "offbeat" + if(25 to 50) + heart_sound = "uneven" + color = "warning" + if(50 to INFINITY) + heart_sound = "weak, unhealthy" + color = "warning" + to_chat(user, "You hear \an [heart_sound] pulse.") + + if(L) + var/lung_sound + switch(L.damage) + if(0 to 1) + lung_sound = "healthy respiration" + if(1 to 25) + lung_sound = "labored respiration" + if(25 to 50) + lung_sound = "pained respiration" + color = "warning" + if(50 to INFINITY) + lung_sound = "gurgling" + color = "warning" + to_chat(user, "You hear [lung_sound].") //Medals /obj/item/clothing/accessory/medal diff --git a/code/modules/economy/economy_machinery/eftpos.dm b/code/modules/economy/economy_machinery/eftpos.dm index b6abb56afc4f..acab3350a93b 100644 --- a/code/modules/economy/economy_machinery/eftpos.dm +++ b/code/modules/economy/economy_machinery/eftpos.dm @@ -218,7 +218,7 @@ /obj/item/eftpos/register name = "point of sale" - desc = "Also known as a cash register, or, more commonly, \"robbery magnet\". It's old and rusty, and had an EFTPOS module fitted in it." + desc = "Also known as a cash register, or, more commonly, \"robbery magnet\". It's old and rusty, and had an EFTPOS module fitted in it. Swipe your ID card to make purchases electronically." icon = 'icons/obj/machines/pos.dmi' icon_state = "pos" force = 10 diff --git a/code/modules/events/apc_short.dm b/code/modules/events/apc_short.dm index ccb5bd479804..21d8d7fd2a89 100644 --- a/code/modules/events/apc_short.dm +++ b/code/modules/events/apc_short.dm @@ -20,7 +20,7 @@ SEND_SOUND(M, S) /datum/event/apc_short/announce() - GLOB.minor_announcement.Announce("Overload detected in [station_name()]'s powernet. Engineering, please repair shorted APCs.", "Systems Power Failure", 'sound/AI/power_overload.ogg') + GLOB.minor_announcement.Announce("Overload detected in [station_name()]'s powernet. Engineering, please repair shorted APCs.", "Systems Power Failure", 'sound/AI/power_short.ogg') /datum/event/apc_short/end() return TRUE @@ -49,7 +49,7 @@ /area/station/engineering/engine/supermatter, /area/station/turret_protected/ai) if(announce) - GLOB.minor_announcement.Announce("Overload detected in [station_name()]'s powernet. Engineering, please repair shorted APCs.", "Systems Power Failure", 'sound/AI/power_overload.ogg') + GLOB.minor_announcement.Announce("Overload detected in [station_name()]'s powernet. Engineering, please repair shorted APCs.", "Systems Power Failure", 'sound/AI/power_short.ogg') // break APC_BREAK_PROBABILITY% of all of the APCs on the station var/affected_apc_count = 0 for(var/thing in GLOB.apcs) diff --git a/code/modules/events/blob/overmind.dm b/code/modules/events/blob/overmind.dm index a06f0c1ce151..026712d5ec2f 100644 --- a/code/modules/events/blob/overmind.dm +++ b/code/modules/events/blob/overmind.dm @@ -92,7 +92,7 @@ /mob/camera/blob/proc/blob_talk(message) log_say("(BLOB) [message]", src) - message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) + message = sanitize_for_ic(trim(copytext(message, 1, MAX_MESSAGE_LEN))) if(!message) return diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 61f9b450ed53..b8403cef9c39 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -536,7 +536,10 @@ color = "#ffffff" spawn_spacevine_piece(loc, null, muts) START_PROCESSING(SSobj, src) - if(potency != null && potency > 0) + if(!potency) + mutativeness = 0 + else + // 0 mutativeness at 1 potency // 1 mutativeness at 10 potency // 4 mutativeness at 100 potency mutativeness = log(10, potency) ** 2 diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 88d923bb4458..98416362cac7 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -286,6 +286,7 @@ item_state = "carton" throwforce = 0 is_glass = FALSE + gender = PLURAL list_reagents = list("orangejuice" = 100) /obj/item/reagent_containers/drinks/bottle/cream @@ -295,6 +296,7 @@ item_state = "carton" throwforce = 0 is_glass = FALSE + gender = PLURAL list_reagents = list("cream" = 100) /obj/item/reagent_containers/drinks/bottle/tomatojuice @@ -304,6 +306,7 @@ item_state = "carton" throwforce = 0 is_glass = FALSE + gender = PLURAL list_reagents = list("tomatojuice" = 100) /obj/item/reagent_containers/drinks/bottle/limejuice @@ -313,6 +316,7 @@ item_state = "carton" throwforce = 0 is_glass = FALSE + gender = PLURAL list_reagents = list("limejuice" = 100) /obj/item/reagent_containers/drinks/bottle/milk @@ -322,6 +326,7 @@ item_state = "carton" throwforce = 0 is_glass = FALSE + gender = PLURAL list_reagents = list("milk" = 100) ////////////////////////// MOLOTOV /////////////////////// diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index aa1d746e5e76..d4e386b18da3 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -1,6 +1,6 @@ #define GIBBER_ANIMATION_DELAY 16 /obj/machinery/gibber - name = "Gibber" + name = "\improper Gibber" desc = "The name isn't descriptive enough?" icon = 'icons/obj/kitchen.dmi' icon_state = "grinder" diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 6d7ef45eb2c3..41b5cf9bcc22 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -1,5 +1,6 @@ /obj/machinery/processor - name = "Food Processor" + name = "\improper Food Processor" + desc = "Used for turning ingredients into other ingredients." icon = 'icons/obj/kitchen.dmi' icon_state = "processor" layer = 2.9 diff --git a/code/modules/food_and_drinks/recipes/recipes_grill.dm b/code/modules/food_and_drinks/recipes/recipes_grill.dm index cbe5f7bcf92d..a126d5964d2f 100644 --- a/code/modules/food_and_drinks/recipes/recipes_grill.dm +++ b/code/modules/food_and_drinks/recipes/recipes_grill.dm @@ -285,7 +285,6 @@ reagents = list("bbqsauce" = 5) items = list( /obj/item/food/snacks/meat, - /obj/item/food/snacks/meat, - /obj/item/stack/rods + /obj/item/food/snacks/meat ) result = /obj/item/food/snacks/bbqribs diff --git a/code/modules/hydroponics/grown/misc_seeds.dm b/code/modules/hydroponics/grown/misc_seeds.dm index 6e4bf03af16f..30bf347ab554 100644 --- a/code/modules/hydroponics/grown/misc_seeds.dm +++ b/code/modules/hydroponics/grown/misc_seeds.dm @@ -83,6 +83,32 @@ tastes = list("sugarcane" = 1) distill_reagent = "rum" +/obj/item/seeds/bamboo + name = "pack of bamboo seeds" + desc = "A plant known for its flexible and resistant logs." + icon_state = "seed-bamboo" + species = "bamboo" + plantname = "Bamboo" + product = /obj/item/grown/log/bamboo + lifespan = 80 + endurance = 70 + maturation = 15 + production = 2 + yield = 5 + potency = 50 + growthstages = 3 + growing_icon = 'icons/obj/hydroponics/growing.dmi' + icon_dead = "bamboo-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) + mutatelist = null + +/obj/item/grown/log/bamboo + seed = /obj/item/seeds/bamboo + name = "bamboo log" + desc = "A long and resistant bamboo log." + icon_state = "bamboo" + plank_type = /obj/item/stack/sheet/bamboo // this needs to get datumized :) + plank_name = "bamboo sticks" // Gatfruit /obj/item/seeds/gatfruit diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index aeed24e75413..6364f1629b01 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -102,6 +102,26 @@ /obj/item/grown/log/steel/CheckAccepted(obj/item/I) return FALSE +/* + * Punji sticks + */ +/obj/structure/punji_sticks + name = "punji sticks" + desc = "Don't step on this." + icon = 'icons/obj/hydroponics/equipment.dmi' + icon_state = "punji" + resistance_flags = FLAMMABLE + max_integrity = 30 + anchored = TRUE + +/obj/structure/punji_sticks/Initialize(mapload) + . = ..() + AddComponent(/datum/component/caltrop, 20, 30, 100, 6 SECONDS, CALTROP_BYPASS_SHOES) + +/obj/structure/punji_sticks/spikes + name = "wooden spikes" + icon_state = "woodspike" + /////////BONFIRES////////// /obj/structure/bonfire diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 74393733a8c4..2544e159bbb5 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -334,7 +334,7 @@ return if(!(container ? container : src).Adjacent(user)) // Is the user next to the seed/container? return - variant = copytext(sanitize(html_encode(trim(V))), 1, 64) // Sanitization must happen after null check because it converts nulls to empty strings + variant = html_encode(copytext(trim(V), 1, 64)) if(variant == "") variant = null if(prev != variant) diff --git a/code/modules/library/library_computer.dm b/code/modules/library/library_computer.dm index 6debf40b576b..9e9741d1c788 100644 --- a/code/modules/library/library_computer.dm +++ b/code/modules/library/library_computer.dm @@ -18,6 +18,7 @@ */ /obj/machinery/computer/library name = "Library Computer" + desc = "Used by dusty librarians for their dusty books." icon = 'icons/obj/computer.dmi' icon_state = "oldcomp" icon_screen = "library" diff --git a/code/modules/library/library_equipment.dm b/code/modules/library/library_equipment.dm index 9c536cab0253..00790622c600 100644 --- a/code/modules/library/library_equipment.dm +++ b/code/modules/library/library_equipment.dm @@ -159,6 +159,7 @@ */ /obj/machinery/bookbinder name = "Book Binder" + desc = "Used by authors, poets, and librarians to scan papers and print copies of their fanfics." icon = 'icons/obj/library.dmi' icon_state = "binder" anchored = TRUE diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index 44bc6c90725c..7fafc804e937 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -1,6 +1,7 @@ /*****************Pickaxes & Drills & Shovels****************/ /obj/item/pickaxe name = "pickaxe" + desc = "A tool for digging rock and stone. Better get to work." icon = 'icons/obj/mining_tool.dmi' icon_state = "pickaxe" flags = CONDUCT diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index c8f0a1e584ed..cf5db27e82b6 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -145,10 +145,8 @@ /obj/structure/flora/ash/cacti/Initialize(mapload) . = ..() - // min dmg 3, max dmg 6, prob(70) AddComponent(/datum/component/caltrop, 3, 6, 70) - /********* * Rocks * *********/ diff --git a/code/modules/mob/dead/observer/observer_base.dm b/code/modules/mob/dead/observer/observer_base.dm index d1c642334ed3..a970301be260 100644 --- a/code/modules/mob/dead/observer/observer_base.dm +++ b/code/modules/mob/dead/observer/observer_base.dm @@ -40,6 +40,7 @@ GLOBAL_DATUM_INIT(ghost_crew_monitor, /datum/ui_module/crew_monitor/ghost, new) /// The "color" their runechat would have had var/alive_runechat_color = "#FFFFFF" hud_type = /datum/hud/ghost + speaks_ooc = TRUE /mob/dead/observer/New(mob/body=null, flags=1) set_invisibility(GLOB.observer_default_invisibility) diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index bd621a2f4cf1..1f002db0a954 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -15,6 +15,11 @@ ui = new(user, src, "Orbit", "Orbit") ui.open() +/datum/orbit_menu/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/orbit_job) + ) + /datum/orbit_menu/ui_act(action, list/params, datum/tgui/ui) . = ..() if(.) @@ -123,6 +128,13 @@ antag_serialized["antag"] = antag_name antagonists += list(antag_serialized) + // Antaghud? Let them see everyone's role + if(isliving(M)) + var/mob/living/L = M + if(L.mind?.has_normal_assigned_role()) + serialized["assigned_role"] = L.mind.assigned_role + serialized["assigned_role_sprite"] = ckey(L.mind.get_assigned_role_asset()) + // Player terror spiders (and other hostile player-controlled event mobs) have their own category to help see how much there are. // Not in the above block because terrors can be known whether AHUD is on or not. if(isterrorspider(M)) diff --git a/code/modules/mob/living/brain/robotic_brain.dm b/code/modules/mob/living/brain/robotic_brain.dm index 507af8e32417..3e34225ff2af 100644 --- a/code/modules/mob/living/brain/robotic_brain.dm +++ b/code/modules/mob/living/brain/robotic_brain.dm @@ -1,6 +1,6 @@ /obj/item/mmi/robotic_brain name = "robotic brain" - desc = "An advanced circuit, capable of housing a non-sentient synthetic intelligence." + desc = "A Beta-level artifical intelligence core containing a non-sapient mechanical mind." icon = 'icons/obj/module.dmi' icon_state = "boris_blank" var/blank_icon = "boris_blank" diff --git a/code/modules/mob/living/carbon/carbon_procs.dm b/code/modules/mob/living/carbon/carbon_procs.dm index 3e4868d28644..150fcfb7ab7b 100644 --- a/code/modules/mob/living/carbon/carbon_procs.dm +++ b/code/modules/mob/living/carbon/carbon_procs.dm @@ -759,19 +759,19 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, list(/obj/machinery/atmospherics/unary/ven user.set_machine(src) var/dat = {" - - + + "} - dat += "" - dat += "" + dat += "" - dat += "" + dat += "" if(istype(wear_mask, /obj/item/clothing/mask/muzzle)) var/obj/item/clothing/mask/muzzle/M = wear_mask diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index d1ecf83ad18a..5583cc77cd77 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -174,6 +174,7 @@ receiver.put_in_hands(I) I.add_fingerprint(receiver) I.on_give(giver, receiver) + I.pickup(receiver) receiver.visible_message("[giver] handed [I] to [receiver].") receiver.clear_alert("take item [item_UID]") diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index c1239ac9567d..fe394afcaefa 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -474,9 +474,11 @@ emp_act return FALSE var/obj/item/organ/external/affecting = get_organ(ran_zone(user.zone_selected)) + + // if the targeted limb doesn't exist, pick a new one at random so you don't have to swap target zone if(!affecting) - to_chat(user, "They are missing that limb!") - return FALSE + affecting = pick(bodyparts) + var/hit_area = parse_zone(affecting.limb_name) if(user != src) @@ -594,17 +596,23 @@ emp_act else if(I) if(((throwingdatum ? throwingdatum.speed : I.throw_speed) >= EMBED_THROWSPEED_THRESHOLD) || I.embedded_ignore_throwspeed_threshold) - if(can_embed(I)) - if(prob(I.embed_chance) && !HAS_TRAIT(src, TRAIT_PIERCEIMMUNE)) - var/obj/item/organ/external/L = pick(bodyparts) - L.add_embedded_object(I) - I.add_mob_blood(src)//it embedded itself in you, of course it's bloody! - L.receive_damage(I.w_class*I.embedded_impact_pain_multiplier) - visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!") - hitpush = FALSE - skipcatch = TRUE //can't catch the now embedded item + if(try_embed_object(I)) + hitpush = FALSE + skipcatch = TRUE //can't catch the now embedded item return ..() +/mob/living/carbon/human/proc/try_embed_object(obj/item/I) + if(!can_embed(I)) + return FALSE + if(!prob(I.embed_chance) || HAS_TRAIT(src, TRAIT_PIERCEIMMUNE)) + return FALSE + var/obj/item/organ/external/L = pick(bodyparts) + L.add_embedded_object(I) + I.add_mob_blood(src)//it embedded itself in you, of course it's bloody! + L.receive_damage(I.w_class * I.embedded_impact_pain_multiplier) + visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!") + return TRUE + /mob/living/carbon/human/proc/bloody_hands(mob/living/source, amount = 2) if(gloves) diff --git a/code/modules/mob/living/carbon/human/human_examine.dm b/code/modules/mob/living/carbon/human/human_examine.dm index b8ecb090471a..ff929ce611b8 100644 --- a/code/modules/mob/living/carbon/human/human_examine.dm +++ b/code/modules/mob/living/carbon/human/human_examine.dm @@ -140,7 +140,8 @@ msg += "[p_their(TRUE)] [ignore_limb_branding(E.limb_name)] has an open incision!\n" for(var/obj/item/I in E.embedded_objects) - msg += "[p_they(TRUE)] [p_have()] \a [bicon(I)] [I] embedded in [p_their()] [E.name]!\n" + // we cant just use \a here, as we want it to appear before the bicon + msg += "[p_they(TRUE)] [p_have()] [I.p_a()] [bicon(I)] [I.name] embedded in [p_their()] [E.name]!\n" //Handles the text strings being added to the actual description. //If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext. diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm index 1c9e0db7f612..f8d56e8934d8 100644 --- a/code/modules/mob/living/carbon/human/human_say.dm +++ b/code/modules/mob/living/carbon/human/human_say.dm @@ -165,7 +165,7 @@ GLOBAL_LIST_INIT(soapy_words, list( S.message = uppertext(S.message) verb = "yells loudly" - if(span) + if(span && !speaks_ooc) S.message = "[S.message]" if(wear_mask) diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index 917bd1a9460c..8ada26d0baaa 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -112,7 +112,10 @@ GLOBAL_LIST_EMPTY(channel_to_radio_key) return FALSE if(sanitize) - message = trim_strip_html_properly(message) + if(speaks_ooc) + message = sanitize(message) + else + message = sanitize_for_ic(message) if(stat) if(stat == DEAD) diff --git a/code/modules/mob/living/living_status_procs.dm b/code/modules/mob/living/living_status_procs.dm index ef65f8341552..2afbf16a7273 100644 --- a/code/modules/mob/living/living_status_procs.dm +++ b/code/modules/mob/living/living_status_procs.dm @@ -196,9 +196,9 @@ STATUS EFFECTS * Arguments: * * amount - Amount to add. Can be negative to reduce duration. * * bound_lower - Minimum bound to set at least to. Defaults to 0. - * * bound_upper - Maximum bound to set up to. Defaults to infinity. + * * bound_upper - Maximum bound to set up to. Defaults to 5 minutes. */ -/mob/living/proc/AdjustConfused(amount, bound_lower = 0, bound_upper = INFINITY) +/mob/living/proc/AdjustConfused(amount, bound_lower = 0, bound_upper = 5 MINUTES) SetConfused(directional_bounded_sum(get_confusion(), amount, bound_lower, bound_upper)) // DIZZY @@ -227,9 +227,9 @@ STATUS EFFECTS * Arguments: * * amount - Amount to add. Can be negative to reduce duration. * * bound_lower - Minimum bound to set at least to. Defaults to 0. - * * bound_upper - Maximum bound to set up to. Defaults to infinity. + * * bound_upper - Maximum bound to set up to. Defaults to 5 minutes. */ -/mob/living/proc/AdjustDizzy(amount, bound_lower = 0, bound_upper = INFINITY) +/mob/living/proc/AdjustDizzy(amount, bound_lower = 0, bound_upper = 5 MINUTES) SetDizzy(directional_bounded_sum(get_dizziness(), amount, bound_lower, bound_upper)) // DROWSY @@ -258,9 +258,9 @@ STATUS EFFECTS * Arguments: * * amount - Amount to add. Can be negative to reduce duration. * * bound_lower - Minimum bound to set at least to. Defaults to 0. - * * bound_upper - Maximum bound to set up to. Defaults to infinity. + * * bound_upper - Maximum bound to set up to. Defaults to 5 minutes. */ -/mob/living/proc/AdjustDrowsy(amount, bound_lower = 0, bound_upper = INFINITY) +/mob/living/proc/AdjustDrowsy(amount, bound_lower = 0, bound_upper = 5 MINUTES) SetDrowsy(directional_bounded_sum(get_drowsiness(), amount, bound_lower, bound_upper)) // DRUNK @@ -289,9 +289,9 @@ STATUS EFFECTS * Arguments: * * amount - Amount to add. Can be negative to reduce duration. * * bound_lower - Minimum bound to set at least to. Defaults to 0. - * * bound_upper - Maximum bound to set up to. Defaults to infinity. + * * bound_upper - Maximum bound to set up to. Defaults to 5 minutes. */ -/mob/living/proc/AdjustDrunk(amount, bound_lower = 0, bound_upper = INFINITY) +/mob/living/proc/AdjustDrunk(amount, bound_lower = 0, bound_upper = 5 MINUTES) SetDrunk(directional_bounded_sum(get_drunkenness(), amount, bound_lower, bound_upper)) // DRUGGY @@ -305,7 +305,7 @@ STATUS EFFECTS /mob/living/proc/SetDruggy(amount) SET_STATUS_EFFECT_STRENGTH(STATUS_EFFECT_DRUGGED, amount) -/mob/living/proc/AdjustDruggy(amount, bound_lower = 0, bound_upper = INFINITY) +/mob/living/proc/AdjustDruggy(amount, bound_lower = 0, bound_upper = 5 MINUTES) SetDruggy(directional_bounded_sum(AmountDruggy(), amount, bound_lower, bound_upper)) // EYE_BLIND @@ -318,7 +318,7 @@ STATUS EFFECTS /mob/living/proc/SetEyeBlind(amount) SET_STATUS_EFFECT_STRENGTH(STATUS_EFFECT_BLINDED, amount) -/mob/living/proc/AdjustEyeBlind(amount, bound_lower = 0, bound_upper = INFINITY, updating = TRUE) +/mob/living/proc/AdjustEyeBlind(amount, bound_lower = 0, bound_upper = 5 MINUTES, updating = TRUE) SetEyeBlind(directional_bounded_sum(AmountBlinded(), amount, bound_lower, bound_upper)) // EYE_BLURRY @@ -331,7 +331,7 @@ STATUS EFFECTS /mob/living/proc/SetEyeBlurry(amount) SET_STATUS_EFFECT_STRENGTH(STATUS_EFFECT_BLURRY_EYES, amount) -/mob/living/proc/AdjustEyeBlurry(amount, bound_lower = 0, bound_upper = INFINITY) +/mob/living/proc/AdjustEyeBlurry(amount, bound_lower = 0, bound_upper = 5 MINUTES) SetEyeBlurry(directional_bounded_sum(AmountEyeBlurry(), amount, bound_lower, bound_upper)) // HALLUCINATION @@ -344,7 +344,7 @@ STATUS EFFECTS /mob/living/proc/SetHallucinate(amount) SET_STATUS_EFFECT_STRENGTH(STATUS_EFFECT_HALLUCINATION, amount) -/mob/living/proc/AdjustHallucinate(amount, bound_lower = 0, bound_upper = INFINITY) +/mob/living/proc/AdjustHallucinate(amount, bound_lower = 0, bound_upper = 5 MINUTES) SetHallucinate(directional_bounded_sum(AmountHallucinate(), amount, bound_lower, bound_upper)) // JITTER @@ -360,7 +360,7 @@ STATUS EFFECTS return SET_STATUS_EFFECT_STRENGTH(STATUS_EFFECT_JITTER, amount) -/mob/living/proc/AdjustJitter(amount, bound_lower = 0, bound_upper = INFINITY, force = 0) +/mob/living/proc/AdjustJitter(amount, bound_lower = 0, bound_upper = 5 MINUTES, force = 0) SetJitter(directional_bounded_sum(AmountJitter(), amount, bound_lower, bound_upper), force) // LOSE_BREATH @@ -376,7 +376,7 @@ STATUS EFFECTS return SET_STATUS_EFFECT_STRENGTH(STATUS_EFFECT_LOSE_BREATH, amount) -/mob/living/proc/AdjustLoseBreath(amount, bound_lower = 0, bound_upper = INFINITY) +/mob/living/proc/AdjustLoseBreath(amount, bound_lower = 0, bound_upper = 5 MINUTES) SetLoseBreath(directional_bounded_sum(AmountLoseBreath(), amount, bound_lower, bound_upper)) // PARALYSE @@ -409,7 +409,7 @@ STATUS EFFECTS P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount) return P -/mob/living/proc/AdjustParalysis(amount, bound_lower = 0, bound_upper = INFINITY, ignore_canstun = FALSE) +/mob/living/proc/AdjustParalysis(amount, bound_lower = 0, bound_upper = 5 MINUTES, ignore_canstun = FALSE) return SetParalysis(directional_bounded_sum(AmountParalyzed(), amount, bound_lower, bound_upper), ignore_canstun) // SILENT @@ -440,7 +440,7 @@ STATUS EFFECTS /mob/living/proc/SetPreventOxyHeal(amount) SET_STATUS_EFFECT_STRENGTH(STATUS_EFFECT_NO_OXY_HEAL, amount) -/mob/living/proc/AdjustSilence(amount, bound_lower = 0, bound_upper = INFINITY) +/mob/living/proc/AdjustSilence(amount, bound_lower = 0, bound_upper = 5 MINUTES) SetSilence(directional_bounded_sum(AmountSilenced(), amount, bound_lower, bound_upper)) //DEAFNESS @@ -453,7 +453,7 @@ STATUS EFFECTS /mob/living/proc/SetDeaf(amount) SET_STATUS_EFFECT_STRENGTH(STATUS_EFFECT_DEAF, amount) -/mob/living/proc/AdjustDeaf(amount, bound_lower = 0, bound_upper = INFINITY) +/mob/living/proc/AdjustDeaf(amount, bound_lower = 0, bound_upper = 5 MINUTES) SetDeaf(directional_bounded_sum(AmountDeaf(), amount, bound_lower, bound_upper)) // SLEEPING @@ -506,7 +506,7 @@ STATUS EFFECTS S = apply_status_effect(STATUS_EFFECT_SLEEPING, -1) return S -/mob/living/proc/AdjustSleeping(amount, bound_lower = 0, bound_upper = INFINITY) +/mob/living/proc/AdjustSleeping(amount, bound_lower = 0, bound_upper = 5 MINUTES) SetSleeping(directional_bounded_sum(AmountSleeping(), amount, bound_lower, bound_upper)) // SLOWED @@ -556,7 +556,7 @@ STATUS EFFECTS /mob/living/proc/SetSlur(amount) SET_STATUS_EFFECT_STRENGTH(STATUS_EFFECT_SLURRING, amount) -/mob/living/proc/AdjustSlur(amount, bound_lower = 0, bound_upper = INFINITY) +/mob/living/proc/AdjustSlur(amount, bound_lower = 0, bound_upper = 5 MINUTES) SetSlur(directional_bounded_sum(AmountSluring(), amount, bound_lower, bound_upper)) // CULTSLURRING @@ -569,7 +569,7 @@ STATUS EFFECTS /mob/living/proc/SetCultSlur(amount) SET_STATUS_EFFECT_STRENGTH(STATUS_EFFECT_CULT_SLUR, amount) -/mob/living/proc/AdjustCultSlur(amount, bound_lower = 0, bound_upper = INFINITY) +/mob/living/proc/AdjustCultSlur(amount, bound_lower = 0, bound_upper = 5 MINUTES) SetCultSlur(directional_bounded_sum(AmountCultSlurring(), amount, bound_lower, bound_upper)) /* STUN */ @@ -678,7 +678,7 @@ STATUS EFFECTS return SET_STATUS_EFFECT_STRENGTH(STATUS_EFFECT_STAMMER, amount) -/mob/living/proc/AdjustStuttering(amount, bound_lower = 0, bound_upper = INFINITY, ignore_canstun = FALSE) +/mob/living/proc/AdjustStuttering(amount, bound_lower = 0, bound_upper = 5 MINUTES, ignore_canstun = FALSE) SetStuttering(directional_bounded_sum(AmountStuttering(), amount, bound_lower, bound_upper), ignore_canstun) // WEAKEN diff --git a/code/modules/mob/living/silicon/ai/ai_mob.dm b/code/modules/mob/living/silicon/ai/ai_mob.dm index 1fcd822f3838..dabfb32bafb7 100644 --- a/code/modules/mob/living/silicon/ai/ai_mob.dm +++ b/code/modules/mob/living/silicon/ai/ai_mob.dm @@ -135,6 +135,9 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( /mob/living/silicon/proc/subsystem_law_manager, /mob/living/silicon/proc/subsystem_power_monitor) + /// The cached AI annoucement help menu. + var/ai_announcement_string_menu + /mob/living/silicon/ai/proc/add_ai_verbs() add_verb(src, GLOB.ai_verbs_default) add_verb(src, silicon_subsystems) @@ -1545,6 +1548,13 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( var/mob/dead/observer/ghost = . ghost.forceMove(old_turf) +/mob/living/silicon/ai/can_vv_get(var_name) + if(!..()) + return FALSE + if(var_name == "ai_announcement_string_menu") // This single var has over 80 thousand characters in it. Not something you really want when VVing the AI + return FALSE + return TRUE + /mob/living/silicon/ai/proc/blurb_it() addtimer(CALLBACK(src, TYPE_PROC_REF(/mob/living/silicon/ai, show_ai_blurb)), 1 SECONDS) diff --git a/code/modules/mob/living/silicon/ai/ai_say.dm b/code/modules/mob/living/silicon/ai/ai_say.dm index d8b720ad7f2a..99f16c1228fb 100644 --- a/code/modules/mob/living/silicon/ai/ai_say.dm +++ b/code/modules/mob/living/silicon/ai/ai_say.dm @@ -74,24 +74,25 @@ GLOBAL_VAR_INIT(announcing_vox, 0) // Stores the time of the last announcement set desc = "Display a list of vocal words to announce to the crew." set category = "AI Commands" - var/list/dat = list() + if(!ai_announcement_string_menu) + var/list/dat = list() - dat += "Here is a list of words you can type into the 'Announcement' button to create sentences to vocally announce to everyone on the same level at you.
\ - \ - WARNING:
Misuse of the announcement system will get you job banned.
" + dat += "Here is a list of words you can type into the 'Announcement' button to create sentences to vocally announce to everyone on the same level at you.
\ + \ + WARNING:
Misuse of the announcement system will get you job banned.
" - // Show alert and voice sounds separately - var/vox_words = GLOB.vox_sounds - GLOB.vox_alerts - dat += help_format(GLOB.vox_alerts) - dat += "
" - dat += help_format(vox_words) + // Show alert and voice sounds separately + var/vox_words = GLOB.vox_sounds - GLOB.vox_alerts + dat += help_format(GLOB.vox_alerts) + dat += "
" + dat += help_format(vox_words) - var/string_dat = dat.Join("") + ai_announcement_string_menu = dat.Join("") var/datum/browser/popup = new(src, "announce_help", "Announcement Help", 500, 400) - popup.set_content(string_dat) + popup.set_content(ai_announcement_string_menu) popup.open() /mob/living/silicon/ai/proc/help_format(word_list) @@ -122,8 +123,8 @@ GLOBAL_VAR_INIT(announcing_vox, 0) // Stores the time of the last announcement var/list/words = splittext(trim(message), " ") var/list/incorrect_words = list() - if(words.len > 30) - words.len = 30 + if(length(words) > 30) + words.Cut(31) for(var/word in words) word = lowertext(trim(word)) @@ -133,7 +134,7 @@ GLOBAL_VAR_INIT(announcing_vox, 0) // Stores the time of the last announcement if(!GLOB.vox_sounds[word]) incorrect_words += word - if(incorrect_words.len) + if(length(incorrect_words)) to_chat(src, "These words are not available on the announcement system: [english_list(incorrect_words)].") return @@ -143,11 +144,10 @@ GLOBAL_VAR_INIT(announcing_vox, 0) // Stores the time of the last announcement message_admins("[key_name_admin(src)] made a vocal announcement: [message].") for(var/word in words) - play_vox_word(word, src.z, null) + play_vox_word(word, z, null) ai_voice_announcement_to_text(words) - /mob/living/silicon/ai/proc/ai_voice_announcement_to_text(words) var/words_string = jointext(words, " ") // Don't go through .Announce because we need to filter by clients which have TTS enabled diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 0478b375a996..b731acc296f9 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -208,7 +208,7 @@ on = TRUE REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, "depowered") set_light(initial(light_range)) - update_icon(UPDATE_ICON_STATE | UPDATE_OVERLAYS) + update_icon() update_controls() diag_hud_set_botstat() return TRUE @@ -218,7 +218,7 @@ ADD_TRAIT(src, TRAIT_IMMOBILIZED, "depowered") set_light(0) bot_reset() // Resets an AI's call, should it exist. - update_icon(UPDATE_ICON_STATE | UPDATE_OVERLAYS) + update_icon() update_controls() /mob/living/simple_animal/bot/Initialize(mapload) diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 10090833b576..0ecf75e9a7f3 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -3,7 +3,7 @@ name = "\improper Cleanbot" desc = "A little cleaning robot, he looks so excited!" icon = 'icons/obj/aibots.dmi' - icon_state = "cleanbot0" + icon_state = "cleanbot" density = FALSE anchored = FALSE health = 25 @@ -29,6 +29,7 @@ var/failed_steps var/next_dest var/next_dest_loc + var/area/area_locked var/static/list/clean_dirt = list( /obj/effect/decal/cleanable/vomit, /obj/effect/decal/cleanable/blood/gibs/robot, @@ -41,7 +42,8 @@ /obj/effect/decal/cleanable/flour, /obj/effect/decal/cleanable/ash, /obj/effect/decal/cleanable/greenglow, - /obj/effect/decal/cleanable/dirt + /obj/effect/decal/cleanable/dirt, + /obj/effect/decal/cleanable/glass ) var/static/list/clean_blood = list( /obj/effect/decal/cleanable/blood, @@ -50,7 +52,7 @@ /mob/living/simple_animal/bot/cleanbot/Initialize(mapload) . = ..() - icon_state = "cleanbot[on]" + update_icon(UPDATE_OVERLAYS) clean_dirt = typecacheof(clean_dirt) clean_blood = typecacheof(clean_blood) @@ -59,19 +61,26 @@ access_card.access += J.get_access() prev_access = access_card.access -/mob/living/simple_animal/bot/cleanbot/turn_on() - ..() - icon_state = "cleanbot[on]" +/mob/living/simple_animal/bot/cleanbot/update_icon_state() + return -/mob/living/simple_animal/bot/cleanbot/turn_off() - ..() - icon_state = "cleanbot[on]" +/mob/living/simple_animal/bot/cleanbot/update_overlays() + . = ..() + if(!on) + . += "clean_off" + return + if(mode == BOT_CLEANING) + . += "clean_brush" + . += "clean[area_locked ? "_restrict" : ""]_work" + return + . += "clean_[area_locked ? "restrict" : "on"]" /mob/living/simple_animal/bot/cleanbot/bot_reset() ..() ignore_list.Cut() //Allows the bot to clean targets it previously ignored due to being unreachable. target = null oldloc = null + area_locked = null /mob/living/simple_animal/bot/cleanbot/set_custom_texts() text_hack = "You corrupt [name]'s cleaning software." @@ -100,8 +109,14 @@ to_chat(user, "[src] buzzes and beeps.") /mob/living/simple_animal/bot/cleanbot/process_scan(obj/effect/decal/cleanable/D) - if(is_type_in_typecache(D, clean_dirt) || blood && is_type_in_typecache(D, clean_blood)) + if(!(is_type_in_typecache(D, clean_dirt) || blood && is_type_in_typecache(D, clean_blood))) + return FALSE + if(!area_locked) + return D + var/area/target_area = get_area(D) + if(target_area == area_locked) return D + return FALSE /mob/living/simple_animal/bot/cleanbot/handle_automated_action() if(!..()) @@ -157,11 +172,18 @@ oldloc = loc +/mob/living/simple_animal/bot/cleanbot/proc/assign_area() + if(area_locked) + area_locked = null + else + area_locked = get_area(loc) + update_icon(UPDATE_OVERLAYS) + /mob/living/simple_animal/bot/cleanbot/proc/start_clean(obj/effect/decal/cleanable/target) anchored = TRUE - icon_state = "cleanbot-c" visible_message("[src] begins to clean up [target]") mode = BOT_CLEANING + update_icon(UPDATE_OVERLAYS) addtimer(CALLBACK(src, PROC_REF(do_clean), target), 5 SECONDS) /mob/living/simple_animal/bot/cleanbot/proc/do_clean(obj/effect/decal/cleanable/target) @@ -170,7 +192,7 @@ QDEL_NULL(target) anchored = FALSE mode = BOT_IDLE - icon_state = "cleanbot[on]" + update_icon(UPDATE_OVERLAYS) /mob/living/simple_animal/bot/cleanbot/explode() on = FALSE @@ -200,6 +222,7 @@ /mob/living/simple_animal/bot/cleanbot/ui_data(mob/user) var/list/data = ..() data["cleanblood"] = blood + data["area"] = get_area_name(area_locked) return data /mob/living/simple_animal/bot/cleanbot/ui_act(action, params) @@ -225,6 +248,8 @@ remote_disabled = !remote_disabled if("blood") blood =!blood + if("area") + assign_area() if("ejectpai") ejectpai() diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 6886ae409010..f1e718cacbf7 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -172,9 +172,9 @@ popup.open() /mob/living/simple_animal/pet/dog/corgi/proc/get_invslot_content() - var/dat = "
Head:[html_encode(inventory_head)]" : "add_inv=head'>Nothing"]" - dat += "
Back:[html_encode(inventory_back)]" : "add_inv=back'>Nothing"]" - dat += "
Collar:[pcollar]" : "add_inv=collar'>Nothing"]" + var/dat = "
Head:[inventory_head]" : "add_inv=head'>Nothing"]" + dat += "
Back:[inventory_back]" : "add_inv=back'>Nothing"]" + dat += "
Collar:[pcollar]" : "add_inv=collar'>Nothing"]" return dat diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index e0e94660a064..089dacb4750c 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -213,6 +213,7 @@ var/amount_grown = 0 pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY + holder_type = /obj/item/holder/chicken can_hide = TRUE can_collar = TRUE gold_core_spawnable = FRIENDLY_SPAWN @@ -243,6 +244,11 @@ /mob/living/simple_animal/chick/npc_safe(mob/user) return TRUE +/mob/living/simple_animal/chick/attack_hand(mob/living/carbon/human/M) + if(M.a_intent == INTENT_HELP) + get_scooped(M, TRUE) + ..() + #define MAX_CHICKENS 50 GLOBAL_VAR_INIT(chicken_count, 0) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 3fe5977d923d..9b897ce6081e 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -134,10 +134,10 @@ var/dat = {"
Left Hand:[(l_hand && !(l_hand.flags&ABSTRACT)) ? html_encode(l_hand) : "Empty"]
Right Hand:[(r_hand && !(r_hand.flags&ABSTRACT)) ? html_encode(r_hand) : "Empty"]
Left Hand:[(l_hand && !(l_hand.flags&ABSTRACT)) ? l_hand : "Empty"]
Right Hand:[(r_hand && !(r_hand.flags&ABSTRACT)) ? r_hand : "Empty"]
 
Back:[(back && !(back.flags&ABSTRACT)) ? html_encode(back) : "Empty"]" + dat += "
Back:[(back && !(back.flags&ABSTRACT)) ? back : "Empty"]" if(istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/tank)) - dat += " [internal ? "Disable Internals" : "Set Internals"]" + dat += " [internal ? "Disable Internals" : "Set Internals"]" dat += "
 
Head:[(head && !(head.flags&ABSTRACT)) ? html_encode(head) : "Empty"]
Head:[(head && !(head.flags&ABSTRACT)) ? head : "Empty"]
Mask:[(wear_mask && !(wear_mask.flags&ABSTRACT)) ? html_encode(wear_mask) : "Empty"]
Mask:[(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "Empty"]
"} - dat += "" + dat += "" if(can_collar) dat += "" - dat += "" + dat += "" dat += {"
Headset:[(ears && !(ears.flags&ABSTRACT)) ? html_encode(ears) : "Empty"]
Headset:[(ears && !(ears.flags&ABSTRACT)) ? ears : "Empty"]
 
Collar:[(pcollar && !(pcollar.flags&ABSTRACT)) ? html_encode(pcollar) : "Empty"]
Collar:[(pcollar && !(pcollar.flags&ABSTRACT)) ? pcollar : "Empty"]
Close diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 9df1fb62e00d..bf0315b7bcfa 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -512,8 +512,8 @@ return user.set_machine(src) - var/dat = "
Collar:[(pcollar && !(pcollar.flags & ABSTRACT)) ? html_encode(pcollar) : "Empty"]
" - dat += "Close" + var/dat = "
Collar:[(pcollar && !(pcollar.flags & ABSTRACT)) ? pcollar : "Empty"]
" + dat += "Close" var/datum/browser/popup = new(user, "mob\ref[src]", "[src]", 440, 250) popup.set_content(dat) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 63f9134f5d72..e1b377412b9c 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -139,7 +139,7 @@ /mob/visible_message(message, self_message, blind_message) if(!isturf(loc)) // mobs inside objects (such as lockers) shouldn't have their actions visible to those outside the object - for(var/mob/M in get_mobs_in_view(3, src)) + for(var/mob/M as anything in get_mobs_in_view(3, src)) if(M.see_invisible < invisibility) continue //can't view the invisible var/msg = message @@ -151,7 +151,7 @@ msg = blind_message M.show_message(msg, EMOTE_VISIBLE, blind_message, EMOTE_AUDIBLE) return - for(var/mob/M in get_mobs_in_view(7, src)) + for(var/mob/M as anything in get_mobs_in_view(7, src)) if(M.see_invisible < invisibility) continue //can't view the invisible var/msg = message @@ -164,7 +164,7 @@ // message is output to anyone who can see, e.g. "The [src] does something!" // blind_message (optional) is what blind people will hear e.g. "You hear something!" /atom/proc/visible_message(message, blind_message) - for(var/mob/M in get_mobs_in_view(7, src)) + for(var/mob/M as anything in get_mobs_in_view(7, src)) if(!M.client) continue M.show_message(message, EMOTE_VISIBLE, blind_message, EMOTE_AUDIBLE) @@ -180,7 +180,7 @@ if(hearing_distance) range = hearing_distance var/msg = message - for(var/mob/M in get_mobs_in_view(range, src)) + for(var/mob/M as anything in get_mobs_in_view(range, src)) M.show_message(msg, EMOTE_AUDIBLE, deaf_message, EMOTE_VISIBLE) // based on say code @@ -206,7 +206,7 @@ var/range = 7 if(hearing_distance) range = hearing_distance - for(var/mob/M in get_mobs_in_view(range, src)) + for(var/mob/M as anything in get_mobs_in_view(range, src)) M.show_message(message, EMOTE_AUDIBLE, deaf_message, EMOTE_VISIBLE) /mob/proc/findname(msg) @@ -605,11 +605,11 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ /mob/proc/show_inv(mob/user) user.set_machine(src) var/dat = {" - - + + "} dat += {"
Left Hand:[(l_hand && !(l_hand.flags&ABSTRACT)) ? html_encode(l_hand) : "Empty"]
Right Hand:[(r_hand && !(r_hand.flags&ABSTRACT)) ? html_encode(r_hand) : "Empty"]
Left Hand:[(l_hand && !(l_hand.flags&ABSTRACT)) ? l_hand : "Empty"]
Right Hand:[(r_hand && !(r_hand.flags&ABSTRACT)) ? r_hand : "Empty"]
 
- Close + Close "} var/datum/browser/popup = new(user, "mob\ref[src]", "[src]", 440, 250) @@ -732,7 +732,7 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ set category = "IC" msg = copytext(msg, 1, MAX_MESSAGE_LEN) - msg = sanitize_simple(html_encode(msg), list("\n" = "
")) + msg = sanitize(msg, list("\n" = "
")) var/combined = length(memory + msg) if(mind && (combined < MAX_PAPER_MESSAGE_LEN)) @@ -772,7 +772,7 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ to_chat(usr, "You have to be conscious to change your flavor text") return msg = copytext(msg, 1, MAX_MESSAGE_LEN) - msg = html_encode(msg) + msg = msg flavor_text = msg diff --git a/code/modules/mob/mob_holder.dm b/code/modules/mob/mob_holder.dm index d5c0b5d0b278..127563083b5c 100644 --- a/code/modules/mob/mob_holder.dm +++ b/code/modules/mob/mob_holder.dm @@ -120,3 +120,9 @@ desc = "Hopefully the eggs are good this season." icon = 'icons/mob/animal.dmi' icon_state = "chicken_brown" + +/obj/item/holder/chick + name = "chick" + desc = "You're one of this chick's favorite peeps." + icon = 'icons/mob/animal.dmi' + icon_state = "chick" diff --git a/code/modules/mob/mob_say_base.dm b/code/modules/mob/mob_say_base.dm index 862fa495b39b..9182f8e6e355 100644 --- a/code/modules/mob/mob_say_base.dm +++ b/code/modules/mob/mob_say_base.dm @@ -1,7 +1,3 @@ - -#define ILLEGAL_CHARACTERS_LIST list("<" = "", ">" = "", \ - "\[" = "", "]" = "", "{" = "", "}" = "") - /mob/proc/say() return @@ -26,16 +22,14 @@ else if(response == "No") return */ - message = replace_characters(message, ILLEGAL_CHARACTERS_LIST) set_typing_indicator(FALSE) usr.say(message) - /mob/verb/me_verb(message as text) set name = "Me" set category = "IC" - message = strip_html_properly(message) + message = sanitize(message) set_typing_indicator(FALSE, TRUE) if(use_me) @@ -222,5 +216,3 @@ for(var/datum/multilingual_say_piece/S in message_pieces) . += S.message + " " . = trim_right(.) - -#undef ILLEGAL_CHARACTERS_LIST diff --git a/code/modules/mob/mob_vars.dm b/code/modules/mob/mob_vars.dm index d22ef54752b1..aa3f1f710982 100644 --- a/code/modules/mob/mob_vars.dm +++ b/code/modules/mob/mob_vars.dm @@ -246,3 +246,7 @@ var/next_click_modifier = 1 /// Tracks the open UIs that a mob has, used in TGUI for various things, such as updating UIs var/list/open_uis = list() + + /// Does this mob speak OOC? + /// Controls whether they can say some symbols. + var/speaks_ooc = FALSE diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 2de58c9f39ab..5c7d18eb303e 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -7,6 +7,7 @@ GLOBAL_LIST_EMPTY(fax_blacklist) /obj/machinery/photocopier/faxmachine name = "fax machine" + desc = "Because just talking to your coworkers is too efficient." icon = 'icons/obj/library.dmi' icon_state = "fax" insert_anim = "faxsend" @@ -59,6 +60,7 @@ GLOBAL_LIST_EMPTY(fax_blacklist) /obj/machinery/photocopier/faxmachine/longrange name = "long range fax machine" + desc = "A fax machine of the ancient days, now using modern entanglement networks, all the better to snitch on your coworkers." fax_network = "Central Command Quantum Entanglement Network" long_range_enabled = TRUE @@ -68,6 +70,7 @@ GLOBAL_LIST_EMPTY(fax_blacklist) /obj/machinery/photocopier/faxmachine/longrange/syndie name = "syndicate long range fax machine" + desc = "For requesting supplies from your benefactors, not that they'll send you any." emagged = TRUE syndie_restricted = TRUE req_one_access = list(ACCESS_SYNDICATE) diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index f0ed2903029c..ad8101088b0e 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -11,7 +11,7 @@ */ /obj/structure/filingcabinet name = "filing cabinet" - desc = "A large cabinet with drawers." + desc = "A large cabinet with drawers for holding only the finest papers, photos, and folders." icon = 'icons/obj/bureaucracy.dmi' icon_state = "filingcabinet" density = TRUE diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index f09a8253bcb2..0113e77452f8 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -1,6 +1,6 @@ /obj/item/folder name = "folder" - desc = "A folder." + desc = "A folder for keeping all your important papers and photos." icon = 'icons/obj/bureaucracy.dmi' icon_state = "folder" w_class = WEIGHT_CLASS_SMALL @@ -14,19 +14,19 @@ A.emp_act(severity) /obj/item/folder/blue - desc = "A blue folder." + desc = "A blue folder for keeping all the blueprints of your great ideas." icon_state = "folder_blue" /obj/item/folder/red - desc = "A red folder." + desc = "A red folder for storing all the documents you've \"acquired\"." icon_state = "folder_red" /obj/item/folder/yellow - desc = "A yellow folder." + desc = "A yellow folder for keeping all your very important court forms." icon_state = "folder_yellow" /obj/item/folder/white - desc = "A white folder." + desc = "A white folder for holding medical records, if anyone ever prints any." icon_state = "folder_white" /obj/item/folder/update_overlays() diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index c484d8daf50f..4eee3e05dc93 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -840,14 +840,15 @@ qdel(src) /obj/item/paper/pickup(user) - if(contact_poison && ishuman(user)) - var/mob/living/carbon/human/H = user - var/obj/item/clothing/gloves/G = H.gloves - if(!istype(G) || !G.safe_from_poison) - H.reagents.add_reagent(contact_poison, contact_poison_volume) - add_attack_logs(src, user, "Picked up [src], coated with [contact_poison] by [contact_poison_poisoner]") - contact_poison = null - . = ..() + ..() + if(!contact_poison || !ishuman(user)) + return + var/mob/living/carbon/human/H = user + var/obj/item/clothing/gloves/G = H.gloves + if(!istype(G) || !G.safe_from_poison) + H.reagents.add_reagent(contact_poison, contact_poison_volume) + add_attack_logs(src, user, "Picked up [src], coated with [contact_poison] by [contact_poison_poisoner]") + contact_poison = null /obj/item/paper/researchnotes name = "paper - 'Research Notes'" diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 649d994f32c9..132a08887551 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -1,5 +1,6 @@ /obj/item/paper_bin name = "paper bin" + desc = "The second-most important part of bureaucracy, after the pen of course." icon = 'icons/obj/bureaucracy.dmi' icon_state = "paper_bin1" item_state = "sheet-metal" diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 01fd87c905b4..139bb128b096 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -4,6 +4,7 @@ /obj/machinery/photocopier name = "photocopier" + desc = "For making copies of important documents, or more likely, your ass." icon = 'icons/obj/library.dmi' icon_state = "bigscanner" @@ -579,6 +580,7 @@ /obj/item/toner name = "toner cartridge" + desc = "Has 140 papers worth of ink in it! Shame you can only use 30 before it runs out of cyan..." icon = 'icons/obj/device.dmi' icon_state = "tonercartridge" var/toner_amount = 30 diff --git a/code/modules/power/engines/tesla/energy_ball.dm b/code/modules/power/engines/tesla/energy_ball.dm index c27b1e318930..2277dfd36e0d 100644 --- a/code/modules/power/engines/tesla/energy_ball.dm +++ b/code/modules/power/engines/tesla/energy_ball.dm @@ -138,8 +138,6 @@ var/area/where_to_move = pick(all_possible_areas) // Grabs a random area that isn't restricted var/turf/target_area_turfs = get_area_turfs(where_to_move) // Grabs the turfs from said area target_turf = pick(target_area_turfs) // Grabs a single turf from the entire list - return - /obj/singularity/energy_ball/proc/handle_energy() if(energy >= energy_to_raise) diff --git a/code/modules/power/lights.dm b/code/modules/power/lights.dm index 1b391b250888..238d7b7fc337 100644 --- a/code/modules/power/lights.dm +++ b/code/modules/power/lights.dm @@ -164,10 +164,9 @@ */ /obj/machinery/light name = "light fixture" + desc = "Industrial-grade light fixture for brightening up dark corners of the station." icon = 'icons/obj/lighting.dmi' - var/base_state = "tube" // Base description and icon_state icon_state = "tube1" - desc = "A lighting fixture." anchored = TRUE layer = 5 max_integrity = 100 @@ -175,6 +174,7 @@ idle_power_consumption = 2 //when in low power mode active_power_consumption = 20 //when in full power mode power_channel = PW_CHANNEL_LIGHTING //Lights are calc'd via area so they dont need to be in the machine list + var/base_state = "tube" // Base description and icon_state /// Is the light on or off? var/on = FALSE /// Is the light currently turning on? @@ -231,12 +231,12 @@ */ /obj/machinery/light/small icon_state = "bulb1" - base_state = "bulb" + desc = "A compact and cheap light fixture, perfect for keeping maintenance tunnels appropriately spooky." fitting = "bulb" + base_state = "bulb" brightness_range = 4 brightness_color = "#a0a080" nightshift_light_range = 4 - desc = "A small lighting fixture." light_type = /obj/item/light/bulb /obj/machinery/light/spot diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm index 39a292da9582..8095a203e9d4 100644 --- a/code/modules/projectiles/guns/syringe_gun.dm +++ b/code/modules/projectiles/guns/syringe_gun.dm @@ -399,3 +399,17 @@ /obj/item/gun/syringe/rapidsyringe/preloaded/beaker_blaster/attack_self(mob/living/user) // no printing infinite syringes. return + +/// craftable bamboo syringe gun +/obj/item/gun/syringe/blowgun + name = "blowgun" + desc = "Fire syringes at a short distance." + icon_state = "blowgun" + item_state = "gun" + +/obj/item/gun/syringe/blowgun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) + visible_message("[user] shoots the blowgun!") + + user.adjustStaminaLoss(20, FALSE) + user.adjustOxyLoss(20) + return ..() diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index d8de619c306d..d2c61d1021ed 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -1,5 +1,6 @@ /obj/machinery/chem_dispenser name = "chem dispenser" + desc = "For making chemicals, medicine, and explosions." density = TRUE anchored = TRUE icon = 'icons/obj/chemical.dmi' diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 567522866765..78b8fe058d09 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -18,6 +18,7 @@ /obj/machinery/chem_master name = "\improper ChemMaster 3000" + desc = "Used to turn reagents into pills, patches, and store them in bottles." density = TRUE anchored = TRUE icon = 'icons/obj/chemical.dmi' @@ -608,6 +609,7 @@ /obj/machinery/chem_master/condimaster name = "\improper CondiMaster 3000" + desc = "Used to remove reagents from that single beaker you're using, or create condiment packs and bottles; your choice." condi = TRUE /obj/machinery/chem_master/condimaster/Initialize(mapload) diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 89e6149bd0ec..09ed6ed24ef4 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -1,5 +1,6 @@ /obj/machinery/reagentgrinder name = "\improper All-In-One Grinder" + desc = "A chef's 9th most powerful weapon, right after the grill. Used for grinding items into reagents." icon = 'icons/obj/kitchen.dmi' icon_state = "juicer1" layer = 2.9 @@ -54,7 +55,8 @@ /obj/item/slime_extract = list(), /obj/item/food = list(), /obj/item/reagent_containers/pill = list(), - /obj/item/reagent_containers/patch = list() + /obj/item/reagent_containers/patch = list(), + /obj/item/clothing/mask/cigarette = list() ) var/list/juice_items = list ( @@ -520,10 +522,9 @@ if(beaker.reagents.holder_full()) return - // Everything else - Transfers reagents from it into beaker - for(var/obj/item/reagent_containers/O in holdingitems) + // Everything else - Transfers reagents from the items into the beaker + for(var/obj/item/O in holdingitems) O.reagents.trans_to(beaker, O.reagents.total_volume) - if(!O.reagents.total_volume) remove_object(O) if(beaker.reagents.holder_full()) diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm index 5b2d97525360..212f9095d286 100644 --- a/code/modules/reagents/chemistry/reagents/toxins.dm +++ b/code/modules/reagents/chemistry/reagents/toxins.dm @@ -468,7 +468,7 @@ id = "beer2" description = "An alcoholic beverage made from malted grains, hops, yeast, and water." color = "#664300" // rgb: 102, 67, 0 - metabolization_rate = 0.1 * REAGENTS_METABOLISM + metabolization_rate = 0.1 drink_icon ="beerglass" drink_name = "Beer glass" drink_desc = "A freezing pint of beer" diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index 44cc8cae37d8..b3e9897462e9 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -290,8 +290,8 @@ list_reagents = list("methamphetamine" = 10) /obj/item/reagent_containers/glass/bucket - desc = "It's a bucket." name = "bucket" + desc = "Useful for moving liquids, or having a helmet in the zombie apocalypse." icon = 'icons/obj/janitor.dmi' icon_state = "bucket" item_state = "bucket" diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 558f06a3a195..40b999c40130 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -60,6 +60,18 @@ /obj/item/reagent_containers/hypospray/attack_self(mob/user) return apply(user, user) +/obj/item/reagent_containers/hypospray/attackby(obj/item/I, mob/user, params) + if(is_pen(I)) + rename_interactive(user, I, use_prefix = TRUE, prompt = "Give [src] a title.") + return TRUE + + return ..() + +/obj/item/reagent_containers/hypospray/examine(mob/user) + . = ..() + if(Adjacent(user)) + . += "You can use a pen to add a label to [src]." + /obj/item/reagent_containers/hypospray/on_reagent_change() if(safety_hypo && !emagged) var/found_forbidden_reagent = FALSE diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index b2ec803cffac..ff2a5af0b700 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -271,3 +271,4 @@ amount_per_transfer_from_this = 50 volume = 50 list_reagents = list("toxin" = 15, "pancuronium" = 10, "cyanide" = 5, "facid" = 10, "fluorine" = 10) + diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index bebbaf729cf9..2cad9ad15e3c 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -9,7 +9,7 @@ /obj/machinery/disposal name = "disposal unit" - desc = "A pneumatic waste disposal unit. Alt-click to manually eject its contents." + desc = "A pneumatic waste disposal unit, or a basketball hoop if you're bored. Alt-click to manually eject its contents." icon = 'icons/obj/pipes/disposal.dmi' icon_state = "disposal" anchored = TRUE diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm index e3d556355a9d..8ceaabe419d4 100644 --- a/code/modules/research/designs/biogenerator_designs.dm +++ b/code/modules/research/designs/biogenerator_designs.dm @@ -210,11 +210,3 @@ materials = list(MAT_BIOMASS = 400) build_path = /obj/item/clothing/accessory/holster category = list("initial","Leather and Cloth") - -/datum/design/rice_hat - name = "Rice hat" - id = "rice_hat" - build_type = BIOGENERATOR - materials = list(MAT_BIOMASS = 300) - build_path = /obj/item/clothing/head/rice_hat - category = list("initial","Leather and Cloth") diff --git a/code/modules/ruins/ghost_bar.dm b/code/modules/ruins/ghost_bar.dm index bfe72c4cf3b0..51b0b4346bd7 100644 --- a/code/modules/ruins/ghost_bar.dm +++ b/code/modules/ruins/ghost_bar.dm @@ -87,6 +87,7 @@ /obj/effect/mob_spawn/human/alive/ghost_bar/proc/equip_item(mob/living/carbon/human/H, path, slot) var/obj/item/I = new path(H) H.equip_or_collect(I, slot, TRUE) + H.speaks_ooc = TRUE return I /obj/structure/ghost_bar_cryopod diff --git a/code/modules/security_levels/security_level_datums.dm b/code/modules/security_levels/security_level_datums.dm index 9cba1e40f4c1..f111ea82e14c 100644 --- a/code/modules/security_levels/security_level_datums.dm +++ b/code/modules/security_levels/security_level_datums.dm @@ -121,9 +121,9 @@ status_display_mode = STATUS_DISPLAY_ALERT status_display_data = "epsilonalert" lowering_to_announcement_title = "Attention! Epsilon security level activated!" - lowering_to_announcement_text = "Central Command has ordered the Epsilon security level on the station. Consider all contracts terminated." + lowering_to_announcement_text = "Central Command has ordered the Epsilon security level on the station." elevating_to_announcement_title = "Attention! Epsilon security level activated!" - elevating_to_announcement_text = "Central Command has ordered the Epsilon security level on the station. Consider all contracts terminated." + elevating_to_announcement_text = "Central Command has ordered the Epsilon security level on the station. Nanotrasen Representative, please prepare to abandon station. Consider all contracts terminated." /datum/security_level/epsilon/pre_change() sound_to_playing_players_on_station_level(S = sound('sound/effects/powerloss.ogg')) @@ -142,4 +142,4 @@ status_display_mode = STATUS_DISPLAY_ALERT status_display_data = "deltaalert" elevating_to_announcement_title = "Attention! Delta security level reached!" - elevating_to_announcement_text = "The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill." + elevating_to_announcement_text = "The station's self-destruct mechanism has been engaged. All crew are instructed to abandon the station immediately. This is not a drill." diff --git a/code/modules/station_goals/secondary/secondary_goal.dm b/code/modules/station_goals/secondary/secondary_goal.dm index ae5df8807c91..4fa42428614f 100644 --- a/code/modules/station_goals/secondary/secondary_goal.dm +++ b/code/modules/station_goals/secondary/secondary_goal.dm @@ -91,14 +91,22 @@ if(href_list["announce"]) send_report("CentCom", "A task for [department] has been issued by Central Command:") + message_admins("[key_name_admin(usr)] sent an announcement for secondary goal [src] ([admin_desc])") + log_admin("[key_name_admin(usr)] sent an announcement for secondary goal [src] ([admin_desc])") else if(href_list["remove"]) SSticker.mode.secondary_goals -= src + message_admins("[key_name_admin(usr)] removed secondary goal [src] ([admin_desc])") + log_admin("[key_name_admin(usr)] removed secondary goal [src] ([admin_desc])") qdel(src) usr.client.modify_goals() else if(href_list["mark_complete"]) completed = 1 usr.client.modify_goals() + message_admins("[key_name_admin(usr)] marked secondary goal [src] ([admin_desc]) as complete") + log_admin("[key_name_admin(usr)] marked secondary goal [src] ([admin_desc]) as complete") else if(href_list["reset_progress"]) completed = 0 tracker.reset() usr.client.modify_goals() + message_admins("[key_name_admin(usr)] reset progress of secondary goal [src] ([admin_desc])") + log_admin("[key_name_admin(usr)] reset progress of secondary goal [src] ([admin_desc])") diff --git a/code/modules/station_goals/station_goal.dm b/code/modules/station_goals/station_goal.dm index 5cf4c0b67d63..c77d9c79ce0f 100644 --- a/code/modules/station_goals/station_goal.dm +++ b/code/modules/station_goals/station_goal.dm @@ -12,7 +12,7 @@ var/report_message = "Complete this goal." /datum/station_goal/proc/send_report() - GLOB.minor_announcement.Announce("Priority Nanotrasen directive received. Project \"[name]\" details inbound.", "Incoming Priority Message", 'sound/AI/commandreport.ogg') + GLOB.minor_announcement.Announce("Priority Nanotrasen directive received. Project \"[html_decode(name)]\" details inbound.", "Incoming Priority Message", 'sound/AI/commandreport.ogg') print_command_report(get_report(), "Nanotrasen Directive [pick(GLOB.phonetic_alphabet)] \Roman[rand(1,50)]", FALSE) on_report() @@ -45,7 +45,11 @@ if(href_list["announce"]) on_report() send_report() + message_admins("[key_name_admin(usr)] sent an announcement for station goal [src]") + log_admin("[key_name_admin(usr)] sent an announcement for station goal [src]") else if(href_list["remove"]) SSticker.mode.station_goals -= src + message_admins("[key_name_admin(usr)] removed station goal [src]") + log_admin("[key_name_admin(usr)] removed station goal [src]") qdel(src) usr.client.modify_goals() diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 3445c426ea33..889fabfc84ff 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -185,6 +185,7 @@ "[user] has attached [C]'s [src] to the [amputation_point].", "You have attached [C]'s [src] to the [amputation_point].") return TRUE + return ..() /obj/item/organ/external/replaced(mob/living/carbon/human/target) owner = target diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index af6950b9911f..8bd59f17ec9a 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -157,10 +157,10 @@ GLOBAL_DATUM_INIT(multispin_words, /regex, regex("like a record baby")) /obj/item/organ/internal/vocal_cords/colossus/speak_with(message) var/log_message = uppertext(message) message = lowertext(message) - playsound(get_turf(owner), 'sound/magic/invoke_general.ogg', 300, 1, 5) + playsound(get_turf(owner), 'sound/magic/invoke_general.ogg', 300, TRUE, 5) var/list/mob/living/listeners = list() - for(var/mob/living/L in get_mobs_in_view(8, owner, TRUE)) + for(var/mob/living/L as anything in get_mobs_in_view(8, owner, TRUE)) if(L.can_hear() && !L.null_rod_check() && L != owner && L.stat != DEAD) if(ishuman(L)) var/mob/living/carbon/human/H = L diff --git a/code/modules/tgui/tgui_panel/telemetry.dm b/code/modules/tgui/tgui_panel/telemetry.dm index 8ddf9f98a4e1..6b63903d2242 100644 --- a/code/modules/tgui/tgui_panel/telemetry.dm +++ b/code/modules/tgui/tgui_panel/telemetry.dm @@ -69,7 +69,7 @@ // Check for a malformed history object if(!row || row.len < 3 || (!row["ckey"] || !row["address"] || !row["computer_id"])) return - if(world.IsBanned(row["ckey"], row["address"], row["computer_id"])) + if(world.IsBanned(row["ckey"], row["address"], row["computer_id"], FALSE, FALSE, FALSE, FALSE, FALSE)) found = row break CHECK_TICK diff --git a/code/modules/tgui_input/say_modal/tgui_say_speech.dm b/code/modules/tgui_input/say_modal/tgui_say_speech.dm index b7c9a48a065c..8843a80431bd 100644 --- a/code/modules/tgui_input/say_modal/tgui_say_speech.dm +++ b/code/modules/tgui_input/say_modal/tgui_say_speech.dm @@ -52,7 +52,7 @@ qdel(usr.client) message_admins("[hacker_man_ckey] was kicked for attemping to send a null message to TGUI-say.") CRASH("[hacker_man_ckey] entered in a null payload to the chat window.") - if(length(payload["entry"]) > MAX_MESSAGE_LEN) + if(length_char(payload["entry"]) > MAX_MESSAGE_LEN) var/hacker_man_ckey = usr.client.ckey qdel(usr.client) message_admins("[hacker_man_ckey] was kicked for attemping to bypass TGUI-say character limits.") diff --git a/config/example/config.toml b/config/example/config.toml index 27c295868fe1..41b058f84042 100644 --- a/config/example/config.toml +++ b/config/example/config.toml @@ -282,6 +282,8 @@ server_features = "Medium RP, varied species/jobs" allow_character_metadata = true # Lobby time before roundstart (Seconds) lobby_time = 240 +# Default timeout for world reboot (Seconds) +restart_timeout = 75 # Forbid people without a BYOND account joining the server guest_ban = true # Allow players to use antagHUD? diff --git a/icons/mob/hud/job_assets.dmi b/icons/mob/hud/job_assets.dmi new file mode 100644 index 000000000000..38d6fa4f0486 Binary files /dev/null and b/icons/mob/hud/job_assets.dmi differ diff --git a/icons/mob/inhands/chairs_lefthand.dmi b/icons/mob/inhands/chairs_lefthand.dmi index 7377787a63e4..6744dd8fa304 100644 Binary files a/icons/mob/inhands/chairs_lefthand.dmi and b/icons/mob/inhands/chairs_lefthand.dmi differ diff --git a/icons/mob/inhands/chairs_righthand.dmi b/icons/mob/inhands/chairs_righthand.dmi index f04962de189b..0809a7c06288 100644 Binary files a/icons/mob/inhands/chairs_righthand.dmi and b/icons/mob/inhands/chairs_righthand.dmi differ diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi index 7cb890d0548f..53d11a4380ba 100644 Binary files a/icons/mob/inhands/guns_lefthand.dmi and b/icons/mob/inhands/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi index bbbda0e17cdd..6993a2881f08 100644 Binary files a/icons/mob/inhands/guns_righthand.dmi and b/icons/mob/inhands/guns_righthand.dmi differ diff --git a/icons/mob/inhands/sheet_lefthand.dmi b/icons/mob/inhands/sheet_lefthand.dmi index 54da11d53cd3..3ef1e829bb2f 100644 Binary files a/icons/mob/inhands/sheet_lefthand.dmi and b/icons/mob/inhands/sheet_lefthand.dmi differ diff --git a/icons/mob/inhands/sheet_righthand.dmi b/icons/mob/inhands/sheet_righthand.dmi index fcf36e763e69..a72bd9c24ccc 100644 Binary files a/icons/mob/inhands/sheet_righthand.dmi and b/icons/mob/inhands/sheet_righthand.dmi differ diff --git a/icons/mob/inhands/weapons_lefthand.dmi b/icons/mob/inhands/weapons_lefthand.dmi index 807124c08e9a..a5c22c4cef80 100644 Binary files a/icons/mob/inhands/weapons_lefthand.dmi and b/icons/mob/inhands/weapons_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons_righthand.dmi b/icons/mob/inhands/weapons_righthand.dmi index d29e5e741eab..afcbe22ddcc3 100644 Binary files a/icons/mob/inhands/weapons_righthand.dmi and b/icons/mob/inhands/weapons_righthand.dmi differ diff --git a/icons/mob/slimes.dmi b/icons/mob/slimes.dmi index f9998d6f1061..f1b89f19463c 100644 Binary files a/icons/mob/slimes.dmi and b/icons/mob/slimes.dmi differ diff --git a/icons/obj/aibots.dmi b/icons/obj/aibots.dmi index ec433a4a2cae..e89bd2719707 100644 Binary files a/icons/obj/aibots.dmi and b/icons/obj/aibots.dmi differ diff --git a/icons/obj/barsigns.dmi b/icons/obj/barsigns.dmi index c1d1c5c9cb27..e1693d0d979a 100644 Binary files a/icons/obj/barsigns.dmi and b/icons/obj/barsigns.dmi differ diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi index 05fa48473975..aa0095e0cef5 100644 Binary files a/icons/obj/chairs.dmi and b/icons/obj/chairs.dmi differ diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index 1564d17b53bc..de9e8b650287 100644 Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi index 7951f304894d..aca66699d706 100644 Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ diff --git a/icons/obj/hydroponics/growing.dmi b/icons/obj/hydroponics/growing.dmi index 0e399f9354d5..f9a854620ab4 100644 Binary files a/icons/obj/hydroponics/growing.dmi and b/icons/obj/hydroponics/growing.dmi differ diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index cd11eb7b160e..7ca0e6915c40 100644 Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ diff --git a/icons/obj/pipes/transit_tube.dmi b/icons/obj/pipes/transit_tube.dmi index aca65d502fdc..f60ba71321b2 100644 Binary files a/icons/obj/pipes/transit_tube.dmi and b/icons/obj/pipes/transit_tube.dmi differ diff --git a/icons/obj/pipes/transit_tube_rpd.dmi b/icons/obj/pipes/transit_tube_rpd.dmi index 126748b724b7..377f4b6a88d9 100644 Binary files a/icons/obj/pipes/transit_tube_rpd.dmi and b/icons/obj/pipes/transit_tube_rpd.dmi differ diff --git a/icons/obj/pipes/transit_tube_station.dmi b/icons/obj/pipes/transit_tube_station.dmi index 348f6d29561a..08c787003506 100644 Binary files a/icons/obj/pipes/transit_tube_station.dmi and b/icons/obj/pipes/transit_tube_station.dmi differ diff --git a/icons/obj/stacks/organic.dmi b/icons/obj/stacks/organic.dmi index 76b414b32444..38b7f1955714 100644 Binary files a/icons/obj/stacks/organic.dmi and b/icons/obj/stacks/organic.dmi differ diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index 4168f09ab9b5..0d1820c13525 100644 Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ diff --git a/icons/obj/weapons/spears.dmi b/icons/obj/weapons/spears.dmi index 725e5a9718a5..e774da4e0bc9 100644 Binary files a/icons/obj/weapons/spears.dmi and b/icons/obj/weapons/spears.dmi differ diff --git a/icons/turf/floors/bamboo_mat.dmi b/icons/turf/floors/bamboo_mat.dmi new file mode 100644 index 000000000000..1bc197d6a037 Binary files /dev/null and b/icons/turf/floors/bamboo_mat.dmi differ diff --git a/modular_ss220/aesthetics/airlocks/code/airlock.dm b/modular_ss220/aesthetics/airlocks/code/airlock.dm index a7b766f6e37d..b97fcc82bd17 100644 --- a/modular_ss220/aesthetics/airlocks/code/airlock.dm +++ b/modular_ss220/aesthetics/airlocks/code/airlock.dm @@ -2,8 +2,3 @@ icon = 'modular_ss220/aesthetics/airlocks/icons/station/public.dmi' overlays_file = 'modular_ss220/aesthetics/airlocks/icons/station/overlays.dmi' note_overlay_file = 'modular_ss220/aesthetics/airlocks/icons/station/overlays.dmi' - - doorOpen = 'modular_ss220/aesthetics/airlocks/sound/open.ogg' - doorClose = 'modular_ss220/aesthetics/airlocks/sound/close.ogg' - boltUp = 'modular_ss220/aesthetics/airlocks/sound/bolts_up.ogg' - boltDown = 'modular_ss220/aesthetics/airlocks/sound/bolts_down.ogg' diff --git a/modular_ss220/aesthetics/airlocks/sound/bolts_down.ogg b/modular_ss220/aesthetics/airlocks/sound/bolts_down.ogg deleted file mode 100644 index 19d62b8acb2a..000000000000 Binary files a/modular_ss220/aesthetics/airlocks/sound/bolts_down.ogg and /dev/null differ diff --git a/modular_ss220/aesthetics/airlocks/sound/bolts_up.ogg b/modular_ss220/aesthetics/airlocks/sound/bolts_up.ogg deleted file mode 100644 index 0aac1a44fcc5..000000000000 Binary files a/modular_ss220/aesthetics/airlocks/sound/bolts_up.ogg and /dev/null differ diff --git a/modular_ss220/aesthetics/airlocks/sound/close.ogg b/modular_ss220/aesthetics/airlocks/sound/close.ogg deleted file mode 100644 index db94b73fb4b6..000000000000 Binary files a/modular_ss220/aesthetics/airlocks/sound/close.ogg and /dev/null differ diff --git a/modular_ss220/aesthetics/airlocks/sound/open.ogg b/modular_ss220/aesthetics/airlocks/sound/open.ogg deleted file mode 100644 index 0b8a0d5f94f1..000000000000 Binary files a/modular_ss220/aesthetics/airlocks/sound/open.ogg and /dev/null differ diff --git a/paradise.dme b/paradise.dme index 1e6bae53fb20..f23b5f5a4fc9 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1514,6 +1514,7 @@ #include "code\modules\asset_cache\assets\asset_materials.dm" #include "code\modules\asset_cache\assets\asset_mob_hunt.dm" #include "code\modules\asset_cache\assets\asset_nanomap.dm" +#include "code\modules\asset_cache\assets\asset_orbit_icons.dm" #include "code\modules\asset_cache\assets\asset_panels.dm" #include "code\modules\asset_cache\assets\asset_paper.dm" #include "code\modules\asset_cache\assets\asset_prize_counter.dm" diff --git a/sound/AI/delta.ogg b/sound/AI/delta.ogg index 5ed127bc694c..6d3be6658ff8 100644 Binary files a/sound/AI/delta.ogg and b/sound/AI/delta.ogg differ diff --git a/sound/AI/epsilon.ogg b/sound/AI/epsilon.ogg index 0ef61026881c..655b83f963c7 100644 Binary files a/sound/AI/epsilon.ogg and b/sound/AI/epsilon.ogg differ diff --git a/sound/AI/gamma_deploy.ogg b/sound/AI/gamma_deploy.ogg new file mode 100644 index 000000000000..29a41e9c62dd Binary files /dev/null and b/sound/AI/gamma_deploy.ogg differ diff --git a/sound/AI/gamma_recall.ogg b/sound/AI/gamma_recall.ogg new file mode 100644 index 000000000000..04bfb36611ec Binary files /dev/null and b/sound/AI/gamma_recall.ogg differ diff --git a/sound/AI/power_short.ogg b/sound/AI/power_short.ogg new file mode 100644 index 000000000000..d622f7d6131d Binary files /dev/null and b/sound/AI/power_short.ogg differ diff --git a/sound/machines/airlock_close.ogg b/sound/machines/airlock_close.ogg index 58a06817f008..db94b73fb4b6 100644 Binary files a/sound/machines/airlock_close.ogg and b/sound/machines/airlock_close.ogg differ diff --git a/sound/machines/airlock_open.ogg b/sound/machines/airlock_open.ogg index c0a4cfdcba6e..0b8a0d5f94f1 100644 Binary files a/sound/machines/airlock_open.ogg and b/sound/machines/airlock_open.ogg differ diff --git a/modular_ss220/aesthetics/airlocks/sound/close_force.ogg b/sound/machines/airlockforcedclose.ogg similarity index 100% rename from modular_ss220/aesthetics/airlocks/sound/close_force.ogg rename to sound/machines/airlockforcedclose.ogg diff --git a/modular_ss220/aesthetics/airlocks/sound/open_force.ogg b/sound/machines/airlockforcedopen.ogg similarity index 100% rename from modular_ss220/aesthetics/airlocks/sound/open_force.ogg rename to sound/machines/airlockforcedopen.ogg diff --git a/sound/machines/boltsdown.ogg b/sound/machines/boltsdown.ogg index c7320a04dfea..19d62b8acb2a 100644 Binary files a/sound/machines/boltsdown.ogg and b/sound/machines/boltsdown.ogg differ diff --git a/sound/machines/boltsup.ogg b/sound/machines/boltsup.ogg index bc422e287264..0aac1a44fcc5 100644 Binary files a/sound/machines/boltsup.ogg and b/sound/machines/boltsup.ogg differ diff --git a/tgui/.eslintrc.yml b/tgui/.eslintrc.yml index f6b81acf36b6..5c4a9aa52d55 100644 --- a/tgui/.eslintrc.yml +++ b/tgui/.eslintrc.yml @@ -1,4 +1,5 @@ root: true +extends: prettier parser: '@typescript-eslint/parser' parserOptions: ecmaVersion: 2020 @@ -17,11 +18,10 @@ plugins: settings: import/resolver: node: - extensions: ['.js','.jsx','.ts','.tsx'] + extensions: ['.js', '.jsx', '.ts', '.tsx'] react: version: '16.10' rules: - ## Possible Errors ## ---------------------------------------- @@ -764,7 +764,7 @@ rules: # react/jsx-wrap-multilines: error overrides: - - files: [ "*.ts", "*.mts", "*.cts", "*.tsx" ] + - files: ['*.ts', '*.mts', '*.cts', '*.tsx'] rules: # https://typescript-eslint.io/linting/troubleshooting/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors no-undef: off diff --git a/tgui/bin/tgui b/tgui/bin/tgui index 3ecba7fc6745..b622518d6793 100755 --- a/tgui/bin/tgui +++ b/tgui/bin/tgui @@ -73,7 +73,7 @@ task-test() { task-prettier() { cd "${base_dir}" - npx prettier --check packages --write "${@}" + npx prettier --check packages "${@}" } task-polyfill() { @@ -221,7 +221,7 @@ fi ## Run prettier if [[ ${1} == '--prettier' ]]; then shift 1 - task-prettier "${@}" + task-prettier --write "${@}" exit 0 fi @@ -237,7 +237,6 @@ fi if [[ -z ${1} ]]; then task-install task-lint --fix - task-prettier task-webpack --mode=production exit 0 fi diff --git a/tgui/bin/tgui-prettier.bat b/tgui/bin/tgui-prettier.bat new file mode 100644 index 000000000000..d3c8ff675295 --- /dev/null +++ b/tgui/bin/tgui-prettier.bat @@ -0,0 +1,9 @@ +@echo off +rem Copyright (c) 2020 Aleksej Komarov +rem SPDX-License-Identifier: MIT +call powershell.exe -NoLogo -ExecutionPolicy Bypass -File "%~dp0\tgui_.ps1" --prettier %* +rem Pause if launched in a separate shell unless initiated from powershell +echo %PSModulePath% | findstr %USERPROFILE% >NUL +if %errorlevel% equ 0 exit 0 +echo %cmdcmdline% | find /i "/c" +if %errorlevel% equ 0 pause diff --git a/tgui/bin/tgui_.ps1 b/tgui/bin/tgui_.ps1 index b0047894aaba..0de85aa82acb 100644 --- a/tgui/bin/tgui_.ps1 +++ b/tgui/bin/tgui_.ps1 @@ -63,7 +63,7 @@ function task-test { } function task-prettier { - npx prettier --check packages --write @Args + npx prettier --check packages @Args } function task-polyfill { @@ -177,7 +177,7 @@ if ($Args.Length -gt 0) { ## ## Run prettier if ($Args[0] -eq "--prettier") { $Rest = $Args | Select-Object -Skip 1 - task-prettier @Rest + task-prettier --write exit 0 } @@ -194,7 +194,6 @@ if ($Args.Length -gt 0) { if ($Args.Length -eq 0) { task-install task-lint --fix - task-prettier task-webpack --mode=production exit 0 } diff --git a/tgui/packages/tgui-dev-server/reloader.js b/tgui/packages/tgui-dev-server/reloader.js index cb477a6523b0..24891e9314f9 100644 --- a/tgui/packages/tgui-dev-server/reloader.js +++ b/tgui/packages/tgui-dev-server/reloader.js @@ -121,10 +121,17 @@ export const reloadByondCache = async (bundleDir) => { if (dss.length > 0) { logger.log(`notifying dreamseeker`); for (let dreamseeker of dss) { - dreamseeker.topic({ - tgui: 1, - type: 'cacheReloaded', - }); + try { + await dreamseeker.topic({ + tgui: 1, + type: 'cacheReloaded', + }); + } catch (error) { + logger.error( + `Unable to broadcast reload to ${dreamseeker.addr}@${dreamseeker.pid}`, + error + ); + } } } }; diff --git a/tgui/packages/tgui/interfaces/BotClean.js b/tgui/packages/tgui/interfaces/BotClean.js index f509c9dd2073..0a3ca915ee2d 100644 --- a/tgui/packages/tgui/interfaces/BotClean.js +++ b/tgui/packages/tgui/interfaces/BotClean.js @@ -1,5 +1,5 @@ import { useBackend } from '../backend'; -import { Button, Section } from '../components'; +import { Button, Section, Box, LabeledList } from '../components'; import { Window } from '../layouts'; import { BotStatus } from './common/BotStatus'; @@ -16,9 +16,10 @@ export const BotClean = (props, context) => { remote_disabled, painame, cleanblood, + area, } = data; return ( - +
@@ -30,6 +31,18 @@ export const BotClean = (props, context) => { onClick={() => act('blood')} />
+
+
{painame && (