diff --git a/.github/ISSUE_TEMPLATE/bug_report_form.yml b/.github/ISSUE_TEMPLATE/bug_report_form.yml new file mode 100644 index 0000000000000..f64b772437fc9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report_form.yml @@ -0,0 +1,65 @@ +name: Bug Report +description: Create a report to help reproduce and fix the issue. +body: + - type: markdown + attributes: + value: | + # **Please read the following guidelines. Follow all instructions or else your issue is subject to closure.** + ## If you use the "Report Issue" button in the top-right corner of the game, it will automatically fill in some of the information below. + + If you are reporting an issue found in another branch or codebase, you _must_ link the branch or codebase repo in your issue report or it will be closed. + For branches, If you have not pushed your code up, please either reproduce it on master or push your code up before making an issue report. + For other codebases, if you do not have a public code repository you will be refused help unless you can completely reproduce the issue on our master branch. + - type: input + id: reporting-version + attributes: + label: "Client Version:" + description: | + The BYOND version you are using to report this issue. You can find this information in the bottom left corner of the "About BYOND" window in the BYOND client. + It is strongly recommended that you include this, especially for concerns on the visual aspects of the game. + placeholder: "xxx.xxxx" + validations: + required: false + - type: textarea + id: issue-summary + attributes: + label: "Issue Summary:" + description: | + Briefly explain your issue in a few plain sentences. You may copy and paste the issue title here if it is suitable. + placeholder: | + "When I do X, Y happens instead of Z." + "X on Y map has Z issue." + validations: + required: true + - type: input + id: round-id + attributes: + label: "Round ID:" + description: | + If you discovered this issue from playing tgstation hosted servers, the Round ID can be found in the Status panel or retrieved from https://statbus.space/ + The Round ID lets us look up valuable information and logs for the round the bug happened. Leave this blank if there is no round ID. + placeholder: "XXXXXX" + validations: + required: false + - type: textarea + id: test-merges + attributes: + label: "Test Merge Information:" + description: | + If you're certain the issue is to be caused by a test merge [OOC Tab -> Show Server Revision], report it in the pull request's comment section rather than on the tracker. + If you're unsure you can refer to the issue number by prefixing said number with #. The issue number can be found beside the title after submission of this form. + validations: + required: false + - type: textarea + id: reproduction + attributes: + label: "Reproduction Steps:" + description: | + Describe the steps to reproduce the issue in detail. Include any relevant information, such as the map, round type, and any other factors that may be relevant. + If it is a runtime-related error, please include the runtime here as that is pertient information. Issues are not for oddities introduced by admin varedits, ensure these occur in normal circumstances. + placeholder: | + 1. Go to the X location + 2. Do Y action + 3. Observe Z result + validations: + required: true diff --git a/.github/gbp.toml b/.github/gbp.toml index fe086e79b55f9..382c65b308d6d 100644 --- a/.github/gbp.toml +++ b/.github/gbp.toml @@ -23,3 +23,4 @@ reset_label = "GBP: Reset" "Sound" = 3 "Sprites" = 3 "Unit Tests" = 6 +"Wallening Revert Recovery" = 10 \ No newline at end of file diff --git a/.github/workflows/detect_translate_conflicts.yml b/.github/workflows/detect_translate_conflicts.yml index 97feee0884552..e8f126ff9beef 100644 --- a/.github/workflows/detect_translate_conflicts.yml +++ b/.github/workflows/detect_translate_conflicts.yml @@ -19,6 +19,7 @@ jobs: run: | git config --local user.email "action@github.com" git config --local user.name "SS220Manager" + git config --local merge.conflictStyle zdiff3 - name: Try merging continue-on-error: true run: | @@ -28,10 +29,12 @@ jobs: { echo "MERGE_CONFLICTS<" + echo "$file" echo -e "\n\`\`\`diff" git diff --diff-filter=U "$file" | sed -n '/<<<<<<>>>>>>/p' echo -e "\n\`\`\`" + echo "" done echo EOF } >> $GITHUB_ENV @@ -39,15 +42,42 @@ jobs: uses: actions/github-script@v7 with: script: | - const { MERGE_CONFLICTS } = process.env - - if(!MERGE_CONFLICTS) { - return - } - - await github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: `This pr causes following conflicts on translate branch:\n ${MERGE_CONFLICTS} ` - }) + const { MERGE_CONFLICTS } = process.env; + + const conflict_message_header = "This PR causes following conflicts on translate branch:\n"; + const issue_body = `${conflict_message_header}${MERGE_CONFLICTS}`; + + const comments = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + + const action_comment = comments.data.find(comment => comment.body.startsWith(conflict_message_header) && comment.user.login === "github-actions[bot]"); + + if (action_comment) { + const comment_id = action_comment.id; + + if (!MERGE_CONFLICTS) { + await github.rest.issues.deleteComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: comment_id, + }); + return; + } + + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: comment_id, + body: issue_body, + }); + } else if (MERGE_CONFLICTS) { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: issue_body, + }); + } diff --git a/.github/workflows/update_tgs_dmapi.yml b/.github/workflows/update_tgs_dmapi.yml index 8dfdee90e36a0..232c02c0ecbed 100644 --- a/.github/workflows/update_tgs_dmapi.yml +++ b/.github/workflows/update_tgs_dmapi.yml @@ -21,6 +21,7 @@ jobs: - name: Apply DMAPI update uses: tgstation/tgs-dmapi-updater@v2 + id: dmapi-update with: header-path: 'code/__DEFINES/tgs.dm' library-path: 'code/modules/tgs' @@ -41,7 +42,7 @@ jobs: source_branch: "tgs-dmapi-update" destination_branch: "master" pr_title: "Automatic TGS DMAPI Update" - pr_body: "This pull request updates the TGS DMAPI to the latest version. Please note any changes that may be breaking or unimplemented in your codebase by checking what changes are in the definitions file: code/__DEFINES/tgs.dm before merging." + pr_body: "This pull request updates the TGS DMAPI to the latest version. Please note any changes that may be breaking or unimplemented in your codebase by checking what changes are in the definitions file: code/__DEFINES/tgs.dm before merging.\n\n${{ steps.dmapi-update.outputs.release-notes }}" pr_label: "Tools" pr_allow_empty: false github_token: ${{ secrets.COMFY_ORANGE_PAT }} diff --git a/README.md b/README.md index c0c5fc1f89bbf..6fccae54e43c1 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ This is the codebase for the /tg/station flavoured fork of SpaceStation 13. Space Station 13 is a paranoia-laden round-based roleplaying game set against the backdrop of a nonsensical, metal death trap masquerading as a space station, with charming spritework designed to represent the sci-fi setting and its dangerous undertones. Have fun, and survive! +*All github inquiries (such as moderation actions) may be handled via the /tg/station discord [#coding-general](https://discord.com/channels/326822144233439242/326831214667235328). Simply ping the `@Maintainer` role, following the guide on asking questions located in the channel description, with your issue!* + ## DOWNLOADING [Downloading](.github/guides/DOWNLOADING.md) diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm index 0e78558d6f38c..121f9e4ea45d4 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm @@ -300,7 +300,6 @@ /area/ruin/pizzeria) "kr" = ( /obj/structure/table, -/obj/item/trash/waffles, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm index ff3417fefce6d..d5c344e9cd31a 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm @@ -451,12 +451,8 @@ /area/ruin/comms_agent) "xq" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom{ - pixel_x = 31; - syndie = 1; - freerange = 1; - name = "syndicate radio intercom"; - desc = "A custom-made Syndicate-issue intercom used to transmit on all Nanotrasen frequencies. Particularly expensive." +/obj/item/radio/intercom/syndicate/freerange{ + pixel_x = 31 }, /obj/structure/table/reinforced, /obj/machinery/fax{ diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index 82f4d3677800a..85b662d04aa95 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -406,6 +406,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/ruin/powered/beach) +"mv" = ( +/obj/effect/spawner/message_in_a_bottle/low_prob, +/turf/open/misc/beach/coast, +/area/ruin/powered/beach) "mw" = ( /obj/structure/flora/coconuts, /turf/open/misc/beach/sand, @@ -985,6 +989,7 @@ dir = 1 }, /obj/machinery/light/directional/south, +/obj/effect/spawner/message_in_a_bottle/low_prob, /turf/open/misc/beach/coast/corner{ dir = 8 }, @@ -1990,7 +1995,7 @@ bG bL VI VI -yT +mv pz Eu pz diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_crashsite.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_crashsite.dmm new file mode 100644 index 0000000000000..828e7b7f74352 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_crashsite.dmm @@ -0,0 +1,908 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface) +"b" = ( +/obj/machinery/door/airlock/titanium{ + name = "Escape Pod Airlock" + }, +/turf/open/floor/mineral/titanium/blue, +/area/ruin/unpowered) +"c" = ( +/obj/item/gps/computer, +/obj/structure/tubes, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"d" = ( +/obj/structure/tubes, +/obj/structure/rack, +/obj/item/survivalcapsule, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"e" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/ruin/unpowered) +"f" = ( +/obj/structure/bed/pod{ + dir = 1 + }, +/obj/item/bedsheet/black{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"g" = ( +/obj/structure/rack, +/obj/item/clothing/suit/space/orange, +/obj/item/clothing/suit/space/orange, +/obj/item/clothing/head/helmet/space/fragile, +/obj/item/clothing/head/helmet/space/fragile, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"h" = ( +/obj/effect/decal/cleanable/rubble, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface) +"i" = ( +/obj/effect/mob_spawn/corpse/goliath, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface) +"j" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/item/bitrunning_disk/item/pka_mods, +/turf/open/floor/mineral/titanium/blue, +/area/ruin/unpowered) +"k" = ( +/obj/structure/girder, +/turf/open/floor/plating/lavaland_atmos, +/area/ruin/unpowered) +"l" = ( +/turf/open/water/lavaland_atmos, +/area/lavaland/surface) +"m" = ( +/obj/machinery/door/airlock/survival_pod/glass, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"n" = ( +/turf/closed/wall/mineral/titanium{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"o" = ( +/turf/closed/mineral/volcanic/lava_land_surface, +/area/lavaland/surface) +"p" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/emergency, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"q" = ( +/turf/closed/wall/mineral/titanium/interior, +/area/ruin/unpowered) +"r" = ( +/obj/machinery/door/airlock/titanium{ + name = "Escape Pod Airlock" + }, +/turf/open/floor/mineral/titanium/blue/lavaland_atmos, +/area/ruin/unpowered) +"s" = ( +/turf/open/floor/pod/dark, +/area/ruin/powered) +"t" = ( +/obj/structure/flora/tree/stump, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface) +"u" = ( +/obj/structure/bonfire/prelit, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface) +"v" = ( +/obj/effect/decal/cleanable/rubble, +/obj/item/stack/sheet/mineral/titanium, +/obj/item/stack/sheet/mineral/titanium, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface) +"w" = ( +/obj/effect/decal/cleanable/glass/titanium, +/obj/item/stack/sheet/mineral/titanium, +/obj/item/stack/sheet/mineral/titanium, +/turf/open/floor/plating, +/area/ruin/unpowered) +"x" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/turf/open/misc/ashplanet/wateryrock, +/area/lavaland/surface) +"y" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/mob_spawn/corpse/human/engineer, +/turf/open/floor/mineral/titanium/blue/lavaland_atmos, +/area/ruin/unpowered) +"z" = ( +/obj/item/book/manual/fish_catalog, +/turf/open/misc/ashplanet/wateryrock, +/area/lavaland/surface) +"B" = ( +/mob/living/basic/mining/goliath, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface) +"D" = ( +/obj/item/gun/energy/recharge/kinetic_accelerator, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface) +"E" = ( +/turf/open/misc/ashplanet/wateryrock, +/area/lavaland/surface) +"F" = ( +/obj/effect/mob_spawn/corpse/human/cargo_tech, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface) +"G" = ( +/turf/template_noop, +/area/template_noop) +"H" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/mob_spawn/corpse/human/cook, +/turf/open/floor/mineral/titanium/blue, +/area/ruin/unpowered) +"I" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/blue/lavaland_atmos, +/area/ruin/unpowered) +"J" = ( +/obj/machinery/smartfridge/survival_pod{ + desc = "A heated storage unit. This one's seen better days."; + name = "dusty survival pod storage" + }, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"K" = ( +/obj/structure/fans, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"L" = ( +/obj/item/storage/toolbox/fishing, +/turf/open/misc/ashplanet/wateryrock, +/area/lavaland/surface) +"M" = ( +/obj/structure/rack, +/obj/item/pickaxe/emergency, +/obj/item/pickaxe/emergency, +/obj/item/crowbar/large/emergency, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"N" = ( +/turf/closed/wall/mineral/titanium/survival/pod, +/area/ruin/powered) +"O" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/turf/open/floor/plating, +/area/ruin/unpowered) +"P" = ( +/obj/effect/mob_spawn/corpse/human/miner, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface) +"Q" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/ruin/unpowered) +"R" = ( +/mob/living/basic/mining/goliath/ancient, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface) +"S" = ( +/obj/structure/bed/pod, +/obj/item/bedsheet/black, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"T" = ( +/obj/structure/tubes, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"U" = ( +/obj/item/bait_can/worm/premium, +/turf/open/misc/ashplanet/wateryrock, +/area/lavaland/surface) +"V" = ( +/obj/structure/table/survival_pod, +/obj/item/food/meat/steak/goliath, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"Y" = ( +/obj/machinery/power/shuttle_engine/propulsion/burst{ + dir = 8 + }, +/turf/closed/wall/mineral/titanium/interior, +/area/ruin/unpowered) +"Z" = ( +/obj/machinery/power/shuttle_engine/propulsion/burst, +/turf/closed/wall/mineral/titanium/interior, +/area/ruin/unpowered) + +(1,1,1) = {" +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +"} +(2,1,1) = {" +G +G +G +G +G +G +G +o +o +G +o +o +G +o +o +G +G +G +G +G +G +G +G +G +G +"} +(3,1,1) = {" +G +G +G +G +G +G +o +o +o +o +o +o +o +o +o +o +G +o +G +G +G +G +G +G +G +"} +(4,1,1) = {" +G +G +G +G +G +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +G +o +G +G +G +"} +(5,1,1) = {" +G +G +G +G +o +o +o +o +o +E +E +E +E +E +E +o +o +o +o +o +o +o +o +G +G +"} +(6,1,1) = {" +G +G +G +o +o +o +o +a +a +E +l +l +l +l +E +E +F +N +N +N +N +N +o +G +G +"} +(7,1,1) = {" +G +G +G +o +o +a +a +a +t +E +l +l +l +l +E +E +a +N +K +s +M +N +o +G +G +"} +(8,1,1) = {" +G +G +G +o +o +a +a +a +a +E +E +l +l +l +E +h +a +N +J +s +p +N +o +G +G +"} +(9,1,1) = {" +G +G +G +o +n +q +q +Z +a +a +E +E +l +U +E +a +a +N +V +s +S +N +o +o +G +"} +(10,1,1) = {" +G +G +G +o +O +y +I +r +a +a +R +z +x +L +a +a +h +N +N +m +N +N +o +G +G +"} +(11,1,1) = {" +G +G +G +o +n +q +k +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +G +"} +(12,1,1) = {" +G +G +G +o +o +v +a +B +a +a +i +a +a +a +a +a +a +a +B +a +a +a +G +G +G +"} +(13,1,1) = {" +G +G +G +G +o +o +a +a +a +a +D +a +a +a +a +u +a +a +a +a +a +a +G +G +G +"} +(14,1,1) = {" +G +G +G +G +o +o +Y +b +Y +P +a +a +a +a +a +h +a +a +a +a +a +a +G +G +G +"} +(15,1,1) = {" +G +G +G +o +o +o +q +e +Q +N +N +m +N +N +t +a +a +a +a +a +a +a +G +G +G +"} +(16,1,1) = {" +G +G +G +o +o +o +q +j +Q +N +K +s +f +N +a +a +a +a +a +a +a +G +G +G +G +"} +(17,1,1) = {" +G +G +G +o +o +o +n +o +Q +N +J +s +g +N +a +Y +b +Y +a +a +a +o +o +G +G +"} +(18,1,1) = {" +G +G +G +G +o +o +o +o +o +N +c +T +d +N +a +q +e +q +a +a +o +o +o +G +G +"} +(19,1,1) = {" +G +G +G +G +G +o +o +o +o +N +N +N +N +N +o +q +H +q +a +o +o +o +o +G +G +"} +(20,1,1) = {" +G +G +G +G +G +o +o +o +o +o +o +o +o +o +o +q +w +o +o +o +o +G +G +G +G +"} +(21,1,1) = {" +G +G +G +G +G +G +G +o +o +o +o +o +o +o +o +o +o +o +o +o +G +G +G +G +G +"} +(22,1,1) = {" +G +G +G +G +G +G +G +G +G +G +G +G +o +o +o +o +o +o +o +G +G +G +G +G +G +"} +(23,1,1) = {" +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +"} +(24,1,1) = {" +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +"} +(25,1,1) = {" +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm index c70a28308c3ec..41b4510ea3459 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm @@ -338,7 +338,6 @@ /area/ruin/powered/seedvault) "bc" = ( /obj/machinery/light/directional/west, -/obj/machinery/hydroponics/constructable, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/green/line{ dir = 8 @@ -346,6 +345,7 @@ /obj/effect/turf_decal/trimline/green/line{ dir = 4 }, +/obj/machinery/hydroponics/constructable/fullupgrade, /turf/open/floor/mineral/plastitanium, /area/ruin/powered/seedvault) "bd" = ( @@ -375,10 +375,10 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/powered/seedvault) "bh" = ( -/obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/trimline/green/line{ dir = 6 }, +/obj/machinery/hydroponics/constructable/fullupgrade, /turf/open/floor/mineral/plastitanium, /area/ruin/powered/seedvault) "bi" = ( @@ -395,10 +395,10 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/powered/seedvault) "bj" = ( -/obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/trimline/green/line{ dir = 10 }, +/obj/machinery/hydroponics/constructable/fullupgrade, /turf/open/floor/mineral/plastitanium, /area/ruin/powered/seedvault) "bk" = ( @@ -413,7 +413,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/hydroponics/constructable, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/green/line{ dir = 8 @@ -421,6 +420,7 @@ /obj/effect/turf_decal/trimline/green/line{ dir = 4 }, +/obj/machinery/hydroponics/constructable/fullupgrade, /turf/open/floor/mineral/plastitanium, /area/ruin/powered/seedvault) "bm" = ( @@ -479,13 +479,13 @@ /area/ruin/powered/seedvault) "bw" = ( /obj/machinery/light/directional/south, -/obj/machinery/hydroponics/constructable, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/green/line{ dir = 1 }, /obj/effect/turf_decal/trimline/green/line, +/obj/machinery/hydroponics/constructable/fullupgrade, /turf/open/floor/mineral/plastitanium, /area/ruin/powered/seedvault) "bx" = ( @@ -511,17 +511,17 @@ /turf/closed/wall/r_wall, /area/ruin/powered/seedvault) "bB" = ( -/obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/trimline/green/line{ dir = 5 }, +/obj/machinery/hydroponics/constructable/fullupgrade, /turf/open/floor/mineral/plastitanium, /area/ruin/powered/seedvault) "bC" = ( -/obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/trimline/green/line{ dir = 9 }, +/obj/machinery/hydroponics/constructable/fullupgrade, /turf/open/floor/mineral/plastitanium, /area/ruin/powered/seedvault) "bD" = ( @@ -565,7 +565,6 @@ /turf/open/floor/iron/freezer, /area/ruin/powered/seedvault) "pZ" = ( -/obj/machinery/hydroponics/constructable, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/turf_decal/trimline/green/line{ @@ -574,10 +573,10 @@ /obj/effect/turf_decal/trimline/green/line{ dir = 4 }, +/obj/machinery/hydroponics/constructable/fullupgrade, /turf/open/floor/mineral/plastitanium, /area/ruin/powered/seedvault) "rF" = ( -/obj/machinery/hydroponics/constructable, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/green/line{ dir = 8 @@ -585,6 +584,7 @@ /obj/effect/turf_decal/trimline/green/line{ dir = 4 }, +/obj/machinery/hydroponics/constructable/fullupgrade, /turf/open/floor/mineral/plastitanium, /area/ruin/powered/seedvault) "rX" = ( @@ -656,12 +656,12 @@ /turf/open/floor/iron/freezer, /area/ruin/powered/seedvault) "VF" = ( -/obj/machinery/hydroponics/constructable, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/green/line{ dir = 1 }, /obj/effect/turf_decal/trimline/green/line, +/obj/machinery/hydroponics/constructable/fullupgrade, /turf/open/floor/mineral/plastitanium, /area/ruin/powered/seedvault) diff --git a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm index a7eac1fe1a8b1..edd734ee6f586 100644 --- a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm +++ b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm @@ -1062,7 +1062,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research/lab) "oJ" = ( -/obj/structure/closet/crate/medical, +/obj/structure/closet/crate/secure/interdyne, /obj/item/stack/medical/suture/emergency, /obj/item/stack/medical/gauze/twelve, /obj/item/reagent_containers/hypospray/medipen/blood_loss, @@ -2155,7 +2155,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research/lab) "BG" = ( -/obj/structure/closet/crate, +/obj/structure/closet/crate/secure/interdyne, /obj/item/stack/sheet/mineral/plasma/thirty, /obj/item/stack/sheet/mineral/wood/fifty, /obj/item/stack/sheet/iron/fifty, @@ -3658,7 +3658,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research) "VQ" = ( -/obj/structure/closet/crate, +/obj/structure/closet/crate/secure/interdyne, /obj/item/reagent_containers/cup/glass/waterbottle/large, /obj/item/reagent_containers/cup/glass/waterbottle/large, /obj/item/reagent_containers/cup/glass/waterbottle/large, diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm index a81508dbe1f40..6aca5d7938a01 100644 --- a/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm +++ b/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm @@ -491,9 +491,6 @@ /area/ruin/space/has_grav/garbagetruck/foodwaste) "xf" = ( /obj/item/trash/tray, -/obj/item/trash/waffles, -/obj/item/trash/waffles, -/obj/item/trash/waffles, /obj/item/food/grown/mushroom/plumphelmet, /obj/structure/closet/crate/trashcart, /mob/living/basic/mouse/rat, diff --git a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm index 21b981191aeb3..abccc6b550eb1 100644 --- a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm +++ b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm @@ -562,7 +562,7 @@ /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, /obj/machinery/icecream_vat{ - desc = "Waffle co. actually ordered these guys to steal one of these just to be sure." + desc = "Waffle Corp. actually ordered these guys to steal one of these just to be sure." }, /turf/open/floor/plating, /area/ruin/space/has_grav/infested_frigate) diff --git a/_maps/RandomZLevels/TheBeach.dmm b/_maps/RandomZLevels/TheBeach.dmm index 64cdcbb6d362e..41fcd3280d490 100644 --- a/_maps/RandomZLevels/TheBeach.dmm +++ b/_maps/RandomZLevels/TheBeach.dmm @@ -102,6 +102,17 @@ "bi" = ( /turf/open/floor/iron/white/textured_large, /area/awaymission/beach) +"bo" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_y = -1; + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/beach) "bx" = ( /obj/effect/turf_decal/sand, /obj/machinery/door/airlock/wood{ @@ -278,16 +289,6 @@ /obj/structure/musician/piano, /turf/open/floor/wood, /area/awaymission/beach) -"dx" = ( -/obj/structure/sign/directions/dorms/directional/north{ - pixel_y = 35 - }, -/obj/structure/sign/directions/medical/directional/north{ - pixel_y = 29 - }, -/obj/machinery/computer/slot_machine, -/turf/open/floor/wood/large, -/area/awaymission/beach) "dL" = ( /obj/machinery/door/airlock/public/glass{ name = "Locker Room" @@ -505,6 +506,10 @@ }, /turf/closed/wall/mineral/wood, /area/awaymission/beach) +"gq" = ( +/obj/item/broken_bottle, +/turf/open/misc/beach/sand, +/area/awaymission/beach) "gw" = ( /obj/item/stack/sheet/mineral/sandstone{ pixel_x = -8 @@ -894,17 +899,6 @@ /obj/structure/table/wood, /turf/open/floor/wood/large, /area/awaymission/beach) -"lk" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/effect/turf_decal/tile/dark/half{ - pixel_y = -1; - pixel_x = 5; - dir = 8 - }, -/turf/open/water/beach, -/area/awaymission/beach) "ll" = ( /obj/machinery/door/airlock/wood{ name = "Room 11"; @@ -1191,6 +1185,10 @@ }, /turf/open/misc/beach/sand, /area/awaymission/beach) +"pq" = ( +/obj/effect/spawner/random/trash/cigbutt, +/turf/open/misc/beach/sand, +/area/awaymission/beach) "pr" = ( /obj/item/reagent_containers/cup/soda_cans/space_mountain_wind{ pixel_x = -17; @@ -2573,13 +2571,6 @@ }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"FJ" = ( -/obj/item/instrument/guitar{ - pixel_y = 4; - pixel_x = -1 - }, -/turf/open/misc/beach/coast, -/area/awaymission/beach) "FK" = ( /obj/item/toy/seashell{ pixel_x = 12; @@ -2856,6 +2847,17 @@ /obj/machinery/light/directional/west, /turf/open/floor/wood/large, /area/awaymission/beach) +"Jv" = ( +/obj/item/paper/fluff/old_pirate_note{ + pixel_x = -5; + pixel_y = -7 + }, +/obj/item/pen/fountain{ + pixel_y = -11; + pixel_x = -8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) "JF" = ( /obj/structure/marker_beacon/burgundy, /turf/open/water/beach, @@ -2960,6 +2962,13 @@ }, /turf/open/misc/beach/sand, /area/awaymission/beach) +"KQ" = ( +/obj/item/instrument/guitar{ + pixel_y = 4; + pixel_x = -1 + }, +/turf/open/misc/beach/coast, +/area/awaymission/beach) "KV" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, @@ -3330,6 +3339,12 @@ }, /turf/open/misc/beach/sand, /area/awaymission/beach) +"Pb" = ( +/obj/item/fishing_rod, +/obj/structure/closet/crate/trashcart, +/obj/item/reagent_containers/cup/glass/bottle/rum/aged, +/turf/open/misc/beach/sand, +/area/awaymission/beach) "Pe" = ( /turf/open/misc/beach/coast{ dir = 5 @@ -3378,6 +3393,11 @@ }, /turf/open/misc/beach/sand, /area/awaymission/beach) +"PU" = ( +/obj/effect/mob_spawn/corpse/human/old_pirate_captain, +/obj/structure/bed/maint, +/turf/open/misc/beach/sand, +/area/awaymission/beach) "Qe" = ( /obj/effect/turf_decal/sand, /obj/machinery/door/airlock/wood{ @@ -3996,6 +4016,16 @@ "Zp" = ( /turf/open/floor/wood/large, /area/awaymission/beach) +"Zs" = ( +/obj/structure/sign/directions/dorms/directional/north{ + pixel_y = 35 + }, +/obj/structure/sign/directions/medical/directional/north{ + pixel_y = 29 + }, +/obj/machinery/computer/slot_machine, +/turf/open/floor/wood/large, +/area/awaymission/beach) "Zt" = ( /obj/structure/table/bronze, /obj/item/storage/toolbox/fishing{ @@ -7415,8 +7445,8 @@ XB XB Vf YV -VY -VY +Pb +gq hL ni XB @@ -7672,8 +7702,8 @@ XB XB Vf VY -VY -VY +pq +PU Er BK XB @@ -7929,7 +7959,7 @@ XB XB Vf VY -VY +Jv VY VY BK @@ -8187,7 +8217,7 @@ XB Vf IZ VY -VY +pq VY BK XB @@ -13210,7 +13240,7 @@ xv xv xv xv -dx +Zs Zp Zp mb @@ -16284,7 +16314,7 @@ vx Bq Xd Ej -lk +bo LC XB XB @@ -29420,7 +29450,7 @@ VY VY Rn VY -FJ +KQ xv CG Gh diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index 6f565143e790e..be1301a9fbabf 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -1909,11 +1909,6 @@ }, /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) -"ht" = ( -/obj/structure/table, -/obj/item/trash/waffles, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) "hu" = ( /obj/structure/chair{ dir = 8 @@ -5245,7 +5240,7 @@ desc = "A console meant for calling and sending a transit ferry. It seems iced-over and non-functional."; dir = 4; icon_screen = null; - name = "Shuttle Transist Console" + name = "Shuttle Transit Console" }, /turf/open/floor/iron/dark/snowdin, /area/awaymission/snowdin/outside) @@ -5830,7 +5825,7 @@ desc = "A console meant for calling and sending a transit ferry. It seems iced-over and non-functional."; dir = 1; icon_screen = null; - name = "Shuttle Transist Console" + name = "Shuttle Transit Console" }, /turf/open/floor/mineral/titanium/blue, /area/awaymission/snowdin/post/broken_shuttle) @@ -25007,7 +25002,7 @@ Kd ex fJ gA -ht +hq hW iH jz diff --git a/_maps/bandastation/automapper/automapper_config.toml b/_maps/bandastation/automapper/automapper_config.toml index 4bf2809b4d828..cb5858f12c712 100644 --- a/_maps/bandastation/automapper/automapper_config.toml +++ b/_maps/bandastation/automapper/automapper_config.toml @@ -16,3 +16,11 @@ # required_map = "MetaStation.dmm" # coordinates = [133, 182, 1] # trait_name = "Station" + +# Зона кекипажа +[templates.CentCom_kekypaj] +map_files = ["CentCom.dmm"] +directory = "_maps/bandastation/automapper/templates/centcom/" +required_map = "builtin" +coordinates = [12, 53, 1] +trait_name = "CentCom" diff --git a/_maps/bandastation/automapper/templates/centcom/CentCom.dmm b/_maps/bandastation/automapper/templates/centcom/CentCom.dmm new file mode 100644 index 0000000000000..ecc0798933b1b --- /dev/null +++ b/_maps/bandastation/automapper/templates/centcom/CentCom.dmm @@ -0,0 +1,8612 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/space/basic, +/area/space) +"ab" = ( +/obj/effect/light_emitter/podbay, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"ak" = ( +/obj/machinery/door/window/left/directional/east, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"ao" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/carpet/green, +/area/centcom/central_command_areas/planetary_port/library) +"at" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 10 + }, +/obj/structure/sign/poster/official/nanotrasen_logo/directional/south, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"av" = ( +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/hotel) +"ax" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 1 + }, +/turf/open/floor/carpet/neon/simple/blue, +/area/centcom/central_command_areas/planetary_port/club) +"aE" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/nanotrasen/double, +/obj/machinery/light/directional/east, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/planetary_port/hotel) +"aR" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner, +/obj/effect/light_emitter/podbay, +/turf/open/water/beach, +/area/centcom/central_command_areas/planetary_port/plaza) +"aY" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"bc" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"bt" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 4 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"bA" = ( +/obj/structure/chair/sofa/corp, +/turf/open/floor/carpet/blue, +/area/centcom/central_command_areas/planetary_port/club) +"bF" = ( +/obj/effect/turf_decal/trimline/yellow/filled/arrow_cw{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"bI" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ + pixel_y = 7 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"bK" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/structure/flora/bush/ferny/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"bL" = ( +/obj/machinery/door/airlock/public, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/hotel) +"bT" = ( +/obj/machinery/light/floor, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"bX" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/light_emitter/podbay, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"cd" = ( +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"ce" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/structure/railing/corner, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"cg" = ( +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port) +"cn" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 4 + }, +/obj/machinery/computer/records/security/syndie{ + dir = 8; + pixel_x = 3; + pixel_y = 0 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"cp" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 2 + }, +/turf/open/floor/carpet/neon/simple/blue, +/area/centcom/central_command_areas/planetary_port/club) +"cr" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/obj/structure/flora/bush/pointy/style_random{ + pixel_y = 6 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"ct" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner{ + dir = 4 + }, +/obj/machinery/photocopier, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"cw" = ( +/turf/open/floor/carpet/red, +/area/centcom/central_command_areas/planetary_port/club) +"cz" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"cE" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/machinery/light/directional/east, +/obj/machinery/recharger{ + pixel_x = 0; + pixel_y = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"cG" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/structure/flora/bush/pointy/style_random{ + pixel_y = 6 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"cO" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"cP" = ( +/obj/structure/rack, +/obj/structure/sign/poster/official/moth_piping/directional/west, +/obj/item/storage/medkit/tactical_lite{ + pixel_y = -7 + }, +/obj/item/storage/medkit/tactical_lite{ + pixel_y = -5; + pixel_x = 2 + }, +/obj/item/storage/medkit/tactical_lite{ + pixel_y = -3; + pixel_x = 4 + }, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"cQ" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"cR" = ( +/obj/structure/chair/sofa/corp{ + dir = 8 + }, +/obj/machinery/light/very_dim/directional/east, +/turf/open/floor/carpet/neon/simple/blue, +/area/centcom/central_command_areas/planetary_port/club) +"cS" = ( +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/centcom/central_command_areas/planetary_port/club) +"cX" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/spawner/random/food_or_drink/dinner, +/obj/effect/spawner/random/food_or_drink/dinner, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/centcom/central_command_areas/planetary_port/club) +"cZ" = ( +/obj/structure/flora/rock/pile/jungle/large/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"db" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 4 + }, +/turf/open/floor/carpet/neon/simple/blue, +/area/centcom/central_command_areas/planetary_port/club) +"dd" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"de" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 1 + }, +/obj/machinery/papershredder, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"dj" = ( +/obj/effect/turf_decal/siding/dark_blue, +/turf/open/floor/bluespace, +/area/centcom/central_command_areas/planetary_port/club) +"do" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/clipboard, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"dC" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"dG" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"dJ" = ( +/obj/machinery/light/floor, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port) +"dL" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/shuttledock, +/obj/structure/fans/tiny, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"dM" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/structure/flora/bush/jungle/a/style_random, +/obj/structure/flora/bush/pointy/style_random{ + pixel_y = 6 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"dP" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/clipboard, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"dS" = ( +/obj/structure/table/wood/fancy/royalblack, +/obj/item/flashlight/lamp/green{ + pixel_x = 4; + pixel_y = 9 + }, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/planetary_port/hotel) +"dX" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/spawner/random/food_or_drink/booze, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/club) +"ea" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"ej" = ( +/obj/effect/light_emitter/podbay, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"ex" = ( +/obj/machinery/vending/boozeomat, +/obj/item/reagent_containers/cup/glass/bottle/champagne{ + pixel_y = 25; + pixel_x = -8 + }, +/obj/item/reagent_containers/cup/glass/bottle/kahlua{ + pixel_x = 9; + pixel_y = 24 + }, +/obj/item/reagent_containers/cup/glass/bottle/cognac{ + pixel_x = 6; + pixel_y = 21 + }, +/obj/item/reagent_containers/cup/glass/bottle/vermouth{ + pixel_x = 0; + pixel_y = 20 + }, +/obj/machinery/barsign/all_access/directional/north, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/club) +"eA" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/machinery/chem_dispenser/drinks/fullupgrade{ + pixel_y = 7 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"eB" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"eE" = ( +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/turf/closed/indestructible/wood, +/area/centcom/central_command_areas/planetary_port/hotel) +"eK" = ( +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"eN" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 10 + }, +/turf/open/floor/bluespace, +/area/centcom/central_command_areas/planetary_port/club) +"eY" = ( +/obj/machinery/vending/cola/red, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port) +"fa" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/structure/flora/bush/reed/style_random, +/turf/open/water/beach, +/area/centcom/central_command_areas/planetary_port/plaza) +"fh" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/railing{ + dir = 6 + }, +/obj/effect/light_emitter/podbay, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"fi" = ( +/obj/structure/table/bronze, +/obj/effect/spawner/random/food_or_drink/booze, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/club) +"fq" = ( +/obj/structure/bookcase/manuals/research_and_development, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port/library) +"fs" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"fC" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"fE" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/turf/open/floor/bluespace, +/area/centcom/central_command_areas/planetary_port/club) +"fK" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/east{ + req_access = list("cent_captain") + }, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/item/pen/fountain, +/turf/open/floor/plating, +/area/centcom/central_command_areas/planetary_port) +"fL" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 8 + }, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"fS" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/folder/red{ + pixel_x = 4; + pixel_y = 2 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"fY" = ( +/obj/structure/bookcase/random/adult, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port/library) +"fZ" = ( +/obj/structure/table/wood/fancy/royalblack, +/obj/effect/spawner/random/entertainment/plushie_delux, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/planetary_port/hotel) +"gd" = ( +/obj/effect/turf_decal/tile/red/anticorner, +/obj/structure/table/reinforced, +/obj/item/clipboard, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"ge" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"gf" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/effect/light_emitter/podbay, +/turf/open/water/beach, +/area/centcom/central_command_areas/planetary_port/plaza) +"gl" = ( +/obj/structure/flora/bush/jungle/c/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"gp" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/kirbyplants/random{ + pixel_y = 12 + }, +/turf/open/floor/carpet/blue, +/area/centcom/central_command_areas/planetary_port/club) +"gy" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/kirbyplants/random{ + pixel_y = 12 + }, +/turf/open/floor/carpet/red, +/area/centcom/central_command_areas/planetary_port/club) +"gC" = ( +/obj/structure/bookcase/manuals/engineering, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/library) +"gF" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/obj/structure/flora/bush/pointy/style_random{ + pixel_y = 6 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"gK" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"gO" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/club) +"gP" = ( +/obj/structure/flora/bush/ferny/style_random, +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"gR" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/spawner/random/food_or_drink/salad, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port) +"gW" = ( +/obj/effect/turf_decal/trimline/yellow/filled/arrow_ccw{ + dir = 1 + }, +/obj/structure/sign/departments/security/directional/north, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"gY" = ( +/obj/machinery/door/airlock/highsecurity, +/obj/effect/mapping_helpers/airlock/access/all/admin/general, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"gZ" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/structure/flora/bush/grassy/style_random, +/obj/structure/flora/bush/pointy/style_random{ + pixel_y = 6 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"hk" = ( +/obj/effect/light_emitter/podbay, +/turf/open/water/beach, +/area/centcom/central_command_areas/planetary_port/plaza) +"hq" = ( +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/planetary_port/hotel) +"hx" = ( +/obj/machinery/stasis, +/obj/structure/curtain, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"hH" = ( +/turf/open/floor/stone, +/area/centcom/central_command_areas/evacuation) +"hI" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/cigarette/cigar/premium{ + pixel_x = 14 + }, +/obj/item/cigarette/cigar/premium{ + pixel_x = 16 + }, +/obj/item/cigarette/cigar/premium{ + pixel_x = 18 + }, +/obj/effect/spawner/random/food_or_drink/salad, +/turf/open/floor/carpet/red, +/area/centcom/central_command_areas/planetary_port/club) +"hJ" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"hM" = ( +/obj/machinery/door/airlock/wood/glass, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port/club) +"hW" = ( +/turf/open/floor/carpet/blue, +/area/centcom/central_command_areas/planetary_port/club) +"ia" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/club) +"ib" = ( +/obj/structure/bookcase/random/reference/wizard, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port/library) +"if" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"ig" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/railing{ + dir = 9 + }, +/obj/effect/light_emitter/podbay, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"iw" = ( +/obj/structure/flora/bush/jungle/a/style_random, +/obj/structure/flora/rock/pile/jungle/large/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"iz" = ( +/obj/machinery/door/airlock/service/glass{ + name = "кафе" + }, +/obj/effect/turf_decal/tile/green/full, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"iC" = ( +/turf/closed/indestructible/wood, +/area/centcom/central_command_areas/planetary_port/hotel) +"iI" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/spawner/random/food_or_drink/salad, +/turf/open/floor/carpet/red, +/area/centcom/central_command_areas/planetary_port/club) +"iS" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 8 + }, +/obj/item/reagent_containers/cup/glass/mug/nanotrasen{ + pixel_x = -6; + pixel_y = 0 + }, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"iT" = ( +/turf/open/floor/carpet/lone, +/area/centcom/central_command_areas/planetary_port/club) +"iZ" = ( +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port/library) +"jd" = ( +/turf/closed/indestructible/wood, +/area/centcom/central_command_areas/planetary_port/restroom) +"jh" = ( +/obj/structure/flora/rock/pile/jungle/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"jl" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/railing{ + dir = 10 + }, +/obj/effect/light_emitter/podbay, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"jm" = ( +/obj/machinery/shower/directional/west, +/obj/structure/curtain, +/turf/open/floor/iron/showroomfloor, +/area/centcom/central_command_areas/planetary_port/restroom) +"jq" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 4 + }, +/obj/machinery/computer/records/medical/syndie{ + dir = 8; + pixel_x = 3; + pixel_y = 0 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"js" = ( +/obj/structure/railing{ + dir = 6; + pixel_x = 0; + pixel_y = 0 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/obj/structure/flora/bush/pointy/style_random{ + pixel_y = 6 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"jt" = ( +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"jv" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/spawner/random/food_or_drink/cake_ingredients, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"jy" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 1 + }, +/obj/effect/light_emitter/podbay, +/turf/open/water/beach, +/area/centcom/central_command_areas/planetary_port/plaza) +"jB" = ( +/obj/item/banner/command, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port) +"jG" = ( +/obj/machinery/door/airlock/highsecurity, +/obj/effect/mapping_helpers/airlock/access/all/admin/general, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"jI" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"jL" = ( +/obj/structure/statue/sandstone/venus{ + pixel_y = 24 + }, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"jP" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"jT" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/flashlight/flare/candle/infinite{ + pixel_x = -3; + pixel_y = 12 + }, +/obj/effect/spawner/random/food_or_drink/salad, +/turf/open/floor/carpet/royalblack, +/area/centcom/central_command_areas/planetary_port/club) +"kd" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"ke" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"kf" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"kk" = ( +/obj/structure/table/bronze, +/obj/item/cigarette/cigar/premium, +/obj/item/cigarette/cigar/premium{ + pixel_x = 2; + pixel_y = 0 + }, +/obj/item/cigarette/cigar/premium{ + pixel_x = 4; + pixel_y = 0 + }, +/obj/item/cigarette/cigar/premium{ + pixel_x = 6; + pixel_y = 0 + }, +/obj/item/cigarette/cigar/premium{ + pixel_x = 8; + pixel_y = 0 + }, +/obj/effect/spawner/random/food_or_drink/booze, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/club) +"kr" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"ks" = ( +/obj/machinery/door/airlock/wood/glass, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"ku" = ( +/obj/structure/table/bronze, +/obj/item/cigarette/cigar/cohiba, +/obj/item/cigarette/cigar/cohiba, +/obj/item/cigarette/cigar/cohiba{ + pixel_x = 2; + pixel_y = 0 + }, +/obj/item/cigarette/cigar/cohiba{ + pixel_x = 4; + pixel_y = 0 + }, +/obj/item/cigarette/cigar/cohiba{ + pixel_x = 6; + pixel_y = 0 + }, +/obj/effect/spawner/random/food_or_drink/booze, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/club) +"kw" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"kA" = ( +/obj/structure/bookcase/random/adult, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/library) +"kD" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/kirbyplants/random{ + pixel_y = 12 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/club) +"kE" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/spawner/random/food_or_drink/dinner, +/obj/effect/spawner/random/food_or_drink/dinner, +/turf/open/floor/mineral/abductor, +/area/centcom/central_command_areas/planetary_port/club) +"kF" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"kJ" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"kN" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"kQ" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/item/pen/blue{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/pen/red{ + pixel_x = 4; + pixel_y = 0 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/bronze/flat, +/area/centcom/central_command_areas/planetary_port/library) +"kS" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"kT" = ( +/obj/structure/sign/flag/nanotrasen, +/turf/closed/indestructible/wood, +/area/centcom/central_command_areas/planetary_port/club) +"kX" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/cup/glass/waterbottle/large{ + pixel_x = -6; + pixel_y = 18 + }, +/obj/item/reagent_containers/cup/glass/waterbottle/large{ + pixel_x = 4; + pixel_y = 20 + }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/club) +"le" = ( +/obj/structure/flora/bush/jungle/c/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"lg" = ( +/obj/effect/light_emitter/podbay, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/water/beach, +/area/centcom/central_command_areas/planetary_port/plaza) +"ln" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"lr" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/hotel) +"lx" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/club) +"lA" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/surgery_tray/full/advanced, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/structure/window/reinforced/tinted/spawner/directional/west, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"lB" = ( +/obj/machinery/door/airlock/highsecurity, +/obj/effect/mapping_helpers/airlock/access/all/admin/general, +/obj/effect/mapping_helpers/airlock/autoname, +/obj/effect/baseturf_helper, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"lF" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/structure/flora/bush/pointy/style_random{ + pixel_y = 6 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"lK" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/turf/open/floor/bluespace, +/area/centcom/central_command_areas/planetary_port/club) +"lL" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"lN" = ( +/obj/structure/bookcase/random, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/library) +"lO" = ( +/obj/machinery/door/airlock/multi_tile/public/glass, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port/library) +"lU" = ( +/obj/structure/chair/sofa/corp/left, +/turf/open/floor/carpet/neon/simple/blue, +/area/centcom/central_command_areas/planetary_port/club) +"lX" = ( +/obj/machinery/light/dim/directional/east, +/turf/open/floor/carpet/red, +/area/centcom/central_command_areas/planetary_port/club) +"mg" = ( +/obj/structure/flora/rock/pile/jungle/large/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"ml" = ( +/obj/structure/chair/sofa/corp, +/turf/open/floor/carpet/red, +/area/centcom/central_command_areas/planetary_port/club) +"mC" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/spawner/random/food_or_drink/dinner, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/club) +"mJ" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/obj/structure/flora/bush/pointy/style_random{ + pixel_y = 6 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"mK" = ( +/obj/structure/chair/sofa/corp/left, +/turf/open/floor/carpet/red, +/area/centcom/central_command_areas/planetary_port/club) +"mV" = ( +/obj/structure/window/fulltile, +/obj/structure/flora/bush/flowers_pp/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port) +"na" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/railing, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"nf" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"ni" = ( +/obj/structure/table/bronze, +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ + pixel_y = 7 + }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/club) +"nj" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"nt" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"nw" = ( +/obj/structure/flora/bush/reed/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/water/beach, +/area/centcom/central_command_areas/planetary_port/plaza) +"ny" = ( +/obj/machinery/door/airlock/public, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/restroom) +"nC" = ( +/obj/structure/filingcabinet/security{ + pixel_x = 0; + pixel_y = 0 + }, +/obj/structure/filingcabinet/medical{ + pixel_x = -11; + pixel_y = 0 + }, +/obj/structure/filingcabinet{ + pixel_x = 11; + pixel_y = 0 + }, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"nF" = ( +/obj/structure/bookcase/manuals/research_and_development, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/library) +"nX" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/kirbyplants/random{ + pixel_y = 12 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/club) +"nY" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/spawner/random/food_or_drink/dinner, +/obj/effect/spawner/random/food_or_drink/dinner, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/centcom/central_command_areas/planetary_port/club) +"oc" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/bronze, +/area/centcom/central_command_areas/planetary_port/library) +"oi" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 1 + }, +/turf/open/floor/carpet/neon/simple/blue, +/area/centcom/central_command_areas/planetary_port/club) +"oo" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"or" = ( +/obj/structure/sign/painting/large/library_private{ + dir = 1; + pixel_y = -64 + }, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/bronze, +/area/centcom/central_command_areas/planetary_port/library) +"ov" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"oD" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/carpet/royalblack, +/area/centcom/central_command_areas/planetary_port/club) +"oF" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 8 + }, +/obj/structure/flora/rock/pile/jungle/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"oO" = ( +/obj/effect/baseturf_helper, +/turf/closed/wall/r_wall, +/area/centcom/central_command_areas/planetary_port) +"oQ" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "пункт первой медицинской помощи" + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"oS" = ( +/turf/open/floor/iron/stairs/right, +/area/centcom/central_command_areas/evacuation) +"oT" = ( +/obj/effect/turf_decal/trimline/yellow/filled/arrow_ccw{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"oW" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/special_lighter, +/turf/open/floor/carpet/blue, +/area/centcom/central_command_areas/planetary_port/club) +"pf" = ( +/obj/item/banner/command, +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/light/blacklight/directional/north, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/club) +"pi" = ( +/obj/structure/flora/bush/reed/style_random, +/turf/open/water/beach, +/area/centcom/central_command_areas/planetary_port/plaza) +"po" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/light_emitter/podbay, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"pp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/railing{ + dir = 5 + }, +/obj/effect/light_emitter/podbay, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"pB" = ( +/obj/machinery/defibrillator_mount/loaded{ + pixel_x = -28; + pixel_y = -2 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"pD" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/bookcase/random/adult, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port/library) +"pG" = ( +/obj/structure/sign/poster/official/high_class_martini, +/turf/closed/indestructible/wood, +/area/centcom/central_command_areas/planetary_port/club) +"pJ" = ( +/obj/machinery/door/airlock/multi_tile/public/glass, +/obj/machinery/scanner_gate/preset_guns, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/iron/stairs/right{ + dir = 1 + }, +/area/centcom/central_command_areas/planetary_port) +"pW" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"pY" = ( +/obj/machinery/door/airlock/bathroom, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/restroom) +"qh" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/spawner/random/food_or_drink/salad, +/turf/open/floor/carpet/blue, +/area/centcom/central_command_areas/planetary_port/club) +"qi" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/structure/flora/bush/jungle/b/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"qs" = ( +/obj/machinery/light/floor, +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/snack, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"qv" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/yellow/filled/shrink_ccw, +/obj/effect/turf_decal/trimline/yellow/filled/shrink_cw{ + dir = 1 + }, +/obj/structure/sign/poster/official/moth_epi/directional/west, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"qx" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/item/storage/box/drinkingglasses{ + pixel_x = -7; + pixel_y = 11 + }, +/obj/item/storage/box/drinkingglasses{ + pixel_x = 8; + pixel_y = 11 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"qy" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/table/wood, +/obj/item/kirbyplants/random{ + pixel_y = 12 + }, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"qz" = ( +/turf/closed/wall/r_wall, +/area/centcom/central_command_areas/planetary_port) +"qA" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 8 + }, +/obj/item/banner/security, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"qB" = ( +/turf/open/floor/iron/stairs/left, +/area/centcom/central_command_areas/evacuation) +"qD" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"qF" = ( +/obj/effect/baseturf_helper{ + baseturf = /turf/open/floor/grass + }, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"qK" = ( +/obj/machinery/light/floor, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"qN" = ( +/obj/structure/chair/sofa/corp{ + dir = 1 + }, +/turf/open/floor/carpet/neon/simple/blue, +/area/centcom/central_command_areas/planetary_port/club) +"qQ" = ( +/obj/machinery/light/dim/directional/west, +/turf/open/floor/carpet/blue, +/area/centcom/central_command_areas/planetary_port/club) +"rb" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/table/wood/fancy/black, +/obj/item/flashlight/lamp/green{ + pixel_x = -4; + pixel_y = 9 + }, +/turf/open/floor/carpet/green, +/area/centcom/central_command_areas/planetary_port/library) +"rd" = ( +/obj/machinery/vending/snack/teal, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"rl" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/structure/flora/tree/jungle/small/style_random{ + pixel_x = -23; + pixel_y = 0 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"rr" = ( +/obj/effect/light_emitter/podbay, +/turf/open/floor/asphalt, +/area/centcom/central_command_areas/planetary_port) +"rA" = ( +/obj/machinery/light/directional/west, +/obj/structure/chair/stool/bar/directional/north, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port) +"rC" = ( +/obj/structure/closet/crate/freezer/surplus_limbs, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"rO" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/table/wood/fancy/black, +/obj/item/folder{ + pixel_x = -5; + pixel_y = 0 + }, +/obj/item/folder/blue, +/obj/item/folder/red{ + pixel_x = 5; + pixel_y = 0 + }, +/turf/open/floor/carpet/green, +/area/centcom/central_command_areas/planetary_port/library) +"rS" = ( +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/club) +"rT" = ( +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port/library) +"rV" = ( +/obj/machinery/vending/boozeomat, +/obj/item/reagent_containers/cup/glass/bottle/coconut_rum{ + pixel_x = -8; + pixel_y = 23 + }, +/obj/item/reagent_containers/cup/glass/bottle/curacao{ + pixel_x = 3; + pixel_y = 22 + }, +/obj/item/reagent_containers/cup/glass/bottle/hcider{ + pixel_x = -4; + pixel_y = 18 + }, +/obj/item/reagent_containers/cup/glass/bottle/kahlua{ + pixel_x = 7; + pixel_y = 21 + }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/club) +"rY" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port/library) +"sg" = ( +/obj/effect/baseturf_helper{ + baseturf = /turf/open/floor/grass + }, +/turf/closed/wall, +/area/centcom/central_command_areas/planetary_port/library) +"sm" = ( +/obj/machinery/stasis{ + dir = 4 + }, +/obj/structure/curtain, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"sy" = ( +/obj/structure/flora/bush/ferny/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"sz" = ( +/obj/machinery/light/floor, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/hotel) +"sG" = ( +/obj/machinery/light/dim/directional/west, +/obj/structure/rack, +/obj/item/storage/medkit/advanced, +/obj/item/storage/medkit/advanced{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/storage/medkit/advanced{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"sM" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/cup/glass/waterbottle/large{ + pixel_x = 5; + pixel_y = 15 + }, +/obj/item/reagent_containers/cup/glass/waterbottle/large{ + pixel_x = -5; + pixel_y = 17 + }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/club) +"sP" = ( +/obj/structure/flora/bush/ferny/style_random, +/obj/structure/flora/bush/grassy/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"sS" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/structure/flora/bush/grassy/style_random, +/obj/structure/flora/bush/pointy/style_random{ + pixel_y = 6 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"sT" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 9 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"sX" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/flora/bush/large/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"sZ" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 9 + }, +/obj/structure/flora/bush/jungle/b/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"ta" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/obj/structure/flora/bush/ferny/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"tb" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/club) +"tg" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/carpet/royalblack, +/area/centcom/central_command_areas/planetary_port/club) +"tl" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/kirbyplants/random{ + pixel_y = 12 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port/library) +"tD" = ( +/obj/effect/turf_decal/trimline/green/filled/arrow_ccw{ + dir = 6 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"tI" = ( +/obj/structure/chair/comfy/beige{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port) +"tN" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port) +"tO" = ( +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/library) +"tZ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted/spawner/directional/west, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"uj" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/structure/flora/bush/jungle/c/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"uo" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"us" = ( +/turf/open/floor/iron/stairs/medium, +/area/centcom/central_command_areas/evacuation) +"uz" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/club) +"uB" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 4 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"uI" = ( +/obj/item/kirbyplants/random, +/obj/structure/sign/poster/official/here_for_your_safety/directional/east, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port) +"uV" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/effect/spawner/random/trash/bin, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"uW" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/west{ + req_access = list("cent_captain") + }, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/item/pen/fountain, +/turf/open/floor/plating, +/area/centcom/central_command_areas/planetary_port) +"uX" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/table/wood/fancy/black, +/obj/machinery/computer/libraryconsole/bookmanagement{ + dir = 4; + pixel_x = 0; + pixel_y = 7 + }, +/turf/open/floor/carpet/green, +/area/centcom/central_command_areas/planetary_port/library) +"va" = ( +/turf/closed/wall, +/area/centcom/central_command_areas/planetary_port/library) +"vd" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port) +"vg" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"vm" = ( +/obj/structure/bookcase/manuals/engineering, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port/library) +"vq" = ( +/obj/effect/turf_decal/tile/dark_blue/half, +/obj/machinery/papershredder, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"vt" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/structure/flora/bush/pointy/style_random{ + pixel_y = 6 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"vv" = ( +/obj/machinery/jukebox/disco/indestructible, +/turf/open/floor/mineral/abductor, +/area/centcom/central_command_areas/planetary_port/club) +"vx" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"vy" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/yellow/filled/shrink_cw, +/obj/effect/turf_decal/trimline/yellow/filled/shrink_ccw{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"vK" = ( +/obj/structure/flora/bush/jungle/b/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"vQ" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"vV" = ( +/obj/structure/chair/comfy/beige{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port) +"wb" = ( +/obj/machinery/vending/cola/black, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"wk" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"ws" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"wB" = ( +/obj/machinery/vending/wardrobe/curator_wardrobe, +/turf/open/floor/bronze/flat, +/area/centcom/central_command_areas/planetary_port/library) +"wI" = ( +/obj/structure/table/wood, +/obj/item/modular_computer/laptop/preset/civilian{ + pixel_x = -1; + pixel_y = 4 + }, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"wN" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port) +"wU" = ( +/obj/effect/turf_decal/tile/dark_blue/half, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"xj" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/carpet/royalblack, +/area/centcom/central_command_areas/planetary_port/club) +"xk" = ( +/obj/machinery/door/airlock/public, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/carpet/green, +/area/centcom/central_command_areas/planetary_port/hotel) +"xn" = ( +/obj/structure/chair/sofa/corp/right, +/turf/open/floor/carpet/neon/simple/blue, +/area/centcom/central_command_areas/planetary_port/club) +"xo" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/structure/railing/corner, +/obj/effect/light_emitter/podbay, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"xu" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"xv" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"xC" = ( +/obj/machinery/shower/directional/east, +/obj/structure/curtain, +/turf/open/floor/iron/showroomfloor, +/area/centcom/central_command_areas/planetary_port/restroom) +"xE" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 1 + }, +/obj/structure/flora/bush/jungle/a/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"xJ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"xN" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/machinery/icecream_vat, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"xO" = ( +/obj/structure/flora/tree/jungle/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"xS" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/light_emitter/podbay, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"xU" = ( +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/trimline/green/filled/arrow_cw{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"xZ" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/storage/medkit/advanced, +/obj/item/storage/medkit/advanced{ + pixel_y = 6 + }, +/obj/item/storage/medkit/advanced{ + pixel_y = 12 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"yc" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"yh" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"yj" = ( +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port) +"yl" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/structure/window/reinforced/tinted/spawner/directional/west, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"yp" = ( +/turf/closed/indestructible/rock, +/area/centcom/central_command_areas/planetary_port/plaza) +"yq" = ( +/obj/item/camera, +/obj/item/taperecorder, +/obj/item/storage/photo_album/library, +/obj/structure/table/wood/fancy/black, +/turf/open/floor/bronze/flat, +/area/centcom/central_command_areas/planetary_port/library) +"yC" = ( +/obj/structure/table/wood/fancy/black, +/obj/machinery/door/window/left/directional/north, +/turf/open/floor/carpet/green, +/area/centcom/central_command_areas/planetary_port/library) +"yH" = ( +/obj/structure/flora/bush/grassy/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"yL" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/spawner/random/food_or_drink/three_course_meal, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port) +"yQ" = ( +/obj/structure/flora/bush/jungle/a/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"yT" = ( +/obj/machinery/stasis, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/structure/curtain, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"yU" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"yZ" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/spawner/random/food_or_drink/dinner, +/turf/open/floor/carpet/neon/simple/blue, +/area/centcom/central_command_areas/planetary_port/club) +"za" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/siding/wood/end{ + dir = 1 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"zb" = ( +/turf/open/floor/carpet/royalblack, +/area/centcom/central_command_areas/planetary_port/club) +"zt" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/item/storage/fancy/cigarettes/cigars{ + pixel_x = 0; + pixel_y = 9 + }, +/obj/structure/sign/warning/yes_smoking/circle/directional/north, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"zx" = ( +/obj/machinery/light/floor, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"zy" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"zC" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/structure/flora/bush/grassy/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"zR" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner, +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"zS" = ( +/turf/closed/indestructible/rock, +/area/space/nearstation) +"zT" = ( +/obj/structure/flora/bush/jungle/b/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"zU" = ( +/obj/effect/turf_decal/trimline/green/filled/arrow_cw{ + dir = 5 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"zW" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/flora/tree/jungle/style_random{ + pixel_x = -50; + pixel_y = -13 + }, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"zZ" = ( +/obj/effect/turf_decal/trimline/green/filled/arrow_ccw, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Aa" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Aq" = ( +/obj/structure/flora/tree/jungle/small/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Av" = ( +/obj/structure/sign/poster/official/cohiba_robusto_ad/directional/north, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/club) +"Ax" = ( +/obj/structure/flora/tree/jungle/small/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Ay" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/item/storage/medkit/tactical_lite{ + pixel_y = -7 + }, +/obj/item/storage/medkit/tactical_lite{ + pixel_y = -5; + pixel_x = 2 + }, +/obj/item/storage/medkit/tactical_lite{ + pixel_y = -3; + pixel_x = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"AF" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/light_emitter/podbay, +/turf/open/water/beach, +/area/centcom/central_command_areas/planetary_port/plaza) +"AH" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/structure/flora/bush/jungle/a/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"AL" = ( +/obj/structure/table/bronze, +/obj/machinery/chem_dispenser/drinks/fullupgrade{ + pixel_y = 7 + }, +/obj/machinery/barsign/all_access/directional/north, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/club) +"AT" = ( +/turf/open/floor/iron/showroomfloor, +/area/centcom/central_command_areas/planetary_port/restroom) +"Bc" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Bi" = ( +/turf/closed/indestructible/wood, +/area/centcom/central_command_areas/planetary_port/club) +"Bj" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/rock/pile/jungle/large/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Bn" = ( +/obj/effect/turf_decal/tile/dark_blue/half, +/obj/machinery/computer/records/security{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Bw" = ( +/obj/structure/flora/bush/large/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Bx" = ( +/obj/effect/spawner/random/structure/closet_private, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/hotel) +"BI" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"BM" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/structure/flora/bush/pointy/style_random{ + pixel_y = 6 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"BS" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/obj/structure/flora/tree/jungle/small/style_random{ + pixel_x = -20; + pixel_y = 8 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"BU" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/spawner/random/food_or_drink/donkpockets{ + pixel_x = -2; + pixel_y = 6 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port) +"BW" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Cc" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 8 + }, +/turf/open/floor/carpet/neon/simple/blue, +/area/centcom/central_command_areas/planetary_port/club) +"Ce" = ( +/obj/structure/window/fulltile, +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port) +"Cj" = ( +/obj/machinery/scanner_gate/preset_guns, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/iron/stairs/right, +/area/centcom/central_command_areas/planetary_port) +"Ck" = ( +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port) +"Cr" = ( +/obj/machinery/vending/cola/sodie, +/turf/open/floor/carpet/royalblack, +/area/centcom/central_command_areas/planetary_port/club) +"Cw" = ( +/obj/structure/table/wood/fancy/black, +/obj/structure/sign/painting/library_private{ + pixel_y = 32 + }, +/obj/item/flashlight/lamp/green, +/turf/open/floor/bronze/flat, +/area/centcom/central_command_areas/planetary_port/library) +"CD" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port/library) +"CH" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 1 + }, +/obj/machinery/computer/records/medical, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"CI" = ( +/obj/structure/bookcase/random/religion, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port/library) +"CL" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/turf/open/floor/bluespace, +/area/centcom/central_command_areas/planetary_port/club) +"CW" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Db" = ( +/obj/effect/turf_decal/logo{ + dir = 1; + color = "#f4cd82" + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"De" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port) +"Dg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"Dh" = ( +/obj/structure/table/wood, +/obj/machinery/door/window/right/directional/east, +/obj/item/phone{ + pixel_x = 4; + pixel_y = 19 + }, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"Di" = ( +/turf/open/floor/asphalt, +/area/centcom/central_command_areas/planetary_port) +"Dm" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Dt" = ( +/obj/structure/table/wood/fancy/black, +/obj/machinery/computer/libraryconsole{ + dir = 4; + pixel_x = 0; + pixel_y = 8 + }, +/turf/open/floor/bronze/flat, +/area/centcom/central_command_areas/planetary_port/library) +"Du" = ( +/obj/machinery/scanner_gate/preset_guns, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/iron/stairs/left{ + dir = 1 + }, +/area/centcom/central_command_areas/planetary_port) +"Dz" = ( +/obj/machinery/light/dim/directional/west, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"DE" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/structure/flora/bush/reed/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/water/beach, +/area/centcom/central_command_areas/planetary_port/plaza) +"DO" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/item/paper_bin{ + pixel_x = -1; + pixel_y = 3 + }, +/obj/item/pen/red{ + pixel_x = 4; + pixel_y = 0 + }, +/obj/item/pen/blue{ + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"DP" = ( +/obj/structure/curtain/cloth/fancy, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"DR" = ( +/obj/structure/window/fulltile, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port) +"DS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"Eb" = ( +/obj/machinery/light/dim/directional/west, +/turf/open/floor/carpet/red, +/area/centcom/central_command_areas/planetary_port/club) +"Ei" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/library) +"Eq" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 9 + }, +/obj/effect/spawner/random/special_lighter, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Et" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Ew" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 4 + }, +/turf/open/floor/carpet/neon/simple/blue, +/area/centcom/central_command_areas/planetary_port/club) +"Ez" = ( +/obj/structure/chair/sofa/corp/right, +/turf/open/floor/carpet/red, +/area/centcom/central_command_areas/planetary_port/club) +"EB" = ( +/obj/item/banner/command, +/obj/machinery/light/blacklight/directional/north, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/club) +"EC" = ( +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/planetary_port/hotel) +"ED" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/turf/open/water/beach, +/area/centcom/central_command_areas/planetary_port/plaza) +"EM" = ( +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"ET" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"EY" = ( +/obj/machinery/door/airlock/multi_tile/public/glass, +/obj/machinery/scanner_gate/preset_guns, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/iron/stairs/left, +/area/centcom/central_command_areas/planetary_port) +"Fa" = ( +/obj/effect/turf_decal/trimline/yellow/filled/arrow_cw{ + dir = 9 + }, +/obj/structure/sign/poster/official/nanotrasen_logo/directional/north, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Fi" = ( +/obj/structure/flora/bush/grassy/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Fm" = ( +/obj/effect/turf_decal/trimline/green/filled/corner, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Fr" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/special_lighter, +/turf/open/floor/carpet/red, +/area/centcom/central_command_areas/planetary_port/club) +"Fv" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 6 + }, +/turf/open/floor/bluespace, +/area/centcom/central_command_areas/planetary_port/club) +"Fx" = ( +/obj/structure/table/wood/fancy/black, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port/library) +"FD" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/restroom) +"FG" = ( +/obj/effect/turf_decal/trimline/yellow/filled/arrow_cw{ + dir = 8 + }, +/obj/structure/sign/warning/no_smoking/directional/west, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"FU" = ( +/obj/effect/spawner/structure/window/reinforced/indestructible, +/turf/open/floor/plating, +/area/centcom/central_command_areas/planetary_port/club) +"FV" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/surgery_tray/full/advanced, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"FZ" = ( +/obj/machinery/door/airlock/public/glass{ + name = "зона для курения" + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Ge" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/club) +"Gn" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/club) +"Go" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Gp" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Gv" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 1 + }, +/obj/structure/flora/bush/ferny/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Gw" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Gz" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"GC" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 5 + }, +/turf/open/floor/bluespace, +/area/centcom/central_command_areas/planetary_port/club) +"GF" = ( +/obj/effect/turf_decal/trimline/green/filled/arrow_cw{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"GH" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/flashlight/flare/candle/infinite{ + pixel_x = 4; + pixel_y = 10 + }, +/obj/effect/spawner/random/food_or_drink/salad, +/turf/open/floor/carpet/royalblack, +/area/centcom/central_command_areas/planetary_port/club) +"GU" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/spawner/random/food_or_drink/donuts, +/obj/effect/spawner/random/food_or_drink/jelly_donuts, +/obj/effect/spawner/random/food_or_drink/any_snack_or_beverage, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"GV" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Hb" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Hd" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner, +/obj/machinery/photocopier, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Hi" = ( +/obj/structure/bookcase/random, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port/library) +"Hq" = ( +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/club) +"Hv" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"HA" = ( +/obj/structure/table/wood/fancy/royalblack, +/obj/item/flashlight/lamp/green{ + pixel_x = -4; + pixel_y = 9 + }, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/planetary_port/hotel) +"HH" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/structure/flora/bush/jungle/a/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"HJ" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 4 + }, +/obj/effect/light_emitter/podbay, +/turf/open/water/beach, +/area/centcom/central_command_areas/planetary_port/plaza) +"HN" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/machinery/light/directional/west, +/obj/item/folder/white{ + pixel_y = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"HP" = ( +/obj/structure/flora/bush/jungle/a/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"HR" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/siding/wood/end, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"Ia" = ( +/turf/open/floor/bronze, +/area/centcom/central_command_areas/planetary_port/library) +"Ib" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/structure/flora/tree/jungle/small/style_random{ + pixel_x = -27; + pixel_y = -5 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Ie" = ( +/obj/effect/baseturf_helper{ + baseturf = /turf/open/floor/grass + }, +/turf/closed/indestructible/wood, +/area/centcom/central_command_areas/planetary_port/hotel) +"Ig" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"Iu" = ( +/turf/closed/indestructible/fakedoor, +/area/centcom/central_command_areas/planetary_port/plaza) +"IB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/flora/tree/jungle/small/style_random{ + pixel_x = -19; + pixel_y = 4 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"ID" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"IE" = ( +/obj/structure/chair/sofa/left/brown{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"IG" = ( +/obj/effect/turf_decal/logo{ + color = "#f4cd82" + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"IK" = ( +/obj/structure/flora/bush/ferny/style_random, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"IO" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"IR" = ( +/obj/structure/flora/tree/jungle/small/style_random{ + pixel_x = -36; + pixel_y = 6 + }, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"IT" = ( +/obj/effect/turf_decal/trimline/green/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"IX" = ( +/obj/structure/chair/sofa/corp{ + dir = 4 + }, +/turf/open/floor/carpet/neon/simple/blue, +/area/centcom/central_command_areas/planetary_port/club) +"IZ" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Jl" = ( +/obj/structure/flora/bush/ferny/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Jo" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"Jp" = ( +/obj/item/kirbyplants/random, +/obj/structure/sign/poster/official/enlist/directional/east, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port) +"Jr" = ( +/obj/machinery/washing_machine, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/restroom) +"Jw" = ( +/turf/open/floor/bronze/filled, +/area/centcom/central_command_areas/planetary_port/library) +"Jz" = ( +/obj/effect/baseturf_helper{ + baseturf = /turf/open/floor/grass + }, +/turf/closed/indestructible/wood, +/area/centcom/central_command_areas/planetary_port/club) +"JA" = ( +/obj/effect/baseturf_helper{ + baseturf = /turf/open/floor/grass + }, +/turf/closed/indestructible/wood, +/area/centcom/central_command_areas/planetary_port/restroom) +"JE" = ( +/obj/item/banner/command, +/turf/open/floor/carpet/blue, +/area/centcom/central_command_areas/planetary_port/club) +"JG" = ( +/obj/effect/baseturf_helper{ + baseturf = /turf/open/floor/grass + }, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port) +"JK" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/structure/flora/tree/jungle/small/style_random{ + pixel_x = -32; + pixel_y = 4 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"JN" = ( +/obj/structure/destructible/cult/item_dispenser/archives/library, +/obj/item/book/codex_gigas, +/turf/open/floor/bronze/flat, +/area/centcom/central_command_areas/planetary_port/library) +"JT" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"JU" = ( +/turf/open/floor/mineral/abductor, +/area/centcom/central_command_areas/planetary_port/club) +"JV" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"JW" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/green/filled/shrink_cw{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/green/filled/shrink_ccw, +/obj/structure/sign/poster/official/moth_delam/directional/west, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Km" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/hotel) +"Kn" = ( +/obj/structure/sign/poster/official/corporate_perks_vacation/directional/west, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port) +"Kp" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 8 + }, +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Kq" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"KD" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"KN" = ( +/obj/structure/chair/comfy/brown, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/library) +"KR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"KS" = ( +/turf/open/water/beach, +/area/centcom/central_command_areas/planetary_port/plaza) +"KU" = ( +/obj/effect/light_emitter/podbay, +/obj/docking_port/stationary{ + dir = 4; + dwidth = 25; + height = 50; + json_key = "emergency"; + name = "CentCom Emergency Shuttle Dock"; + shuttle_id = "emergency_away"; + width = 50 + }, +/turf/open/floor/asphalt, +/area/centcom/central_command_areas/planetary_port) +"KW" = ( +/obj/effect/turf_decal/trimline/yellow/filled/arrow_ccw{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"KY" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/obj/structure/flora/bush/ferny/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Lb" = ( +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"Lz" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/west{ + req_access = list("cent_captain") + }, +/obj/item/banhammer, +/turf/open/floor/plating, +/area/centcom/central_command_areas/planetary_port) +"LJ" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/structure/bedsheetbin, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/restroom) +"LM" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/iv_drip, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"LQ" = ( +/obj/effect/turf_decal/logo{ + dir = 8; + color = "#f4cd82" + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"LR" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 4 + }, +/obj/structure/flora/bush/ferny/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"LT" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 1 + }, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"LU" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"LW" = ( +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"LX" = ( +/obj/machinery/light/dim/directional/north, +/turf/open/floor/bronze, +/area/centcom/central_command_areas/planetary_port/library) +"LZ" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port/library) +"Ma" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"Mf" = ( +/obj/structure/table/wood/fancy/black, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/library) +"Mp" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/obj/structure/filingcabinet/medical{ + pixel_x = -8; + pixel_y = 0 + }, +/obj/structure/filingcabinet/security{ + pixel_x = 8; + pixel_y = 0 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Ms" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/sink/directional/south, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Mt" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"Mz" = ( +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"MK" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/machinery/light/directional/west, +/obj/item/folder/blue, +/obj/item/folder/red{ + pixel_x = 4; + pixel_y = 2 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"MR" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/yellow/filled/shrink_ccw, +/obj/effect/turf_decal/trimline/yellow/filled/shrink_cw{ + dir = 1 + }, +/obj/structure/sign/poster/official/moth_delam/directional/west, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"MV" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"MZ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/club) +"Nk" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/kirbyplants/random{ + pixel_x = 0; + pixel_y = 12 + }, +/turf/open/floor/carpet/blue, +/area/centcom/central_command_areas/planetary_port/club) +"Nq" = ( +/obj/effect/spawner/structure/window/reinforced/indestructible, +/turf/open/floor/plating, +/area/centcom/central_command_areas/planetary_port) +"Nt" = ( +/obj/machinery/door/window/left/directional/north, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port/library) +"Nu" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"ND" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/storage/box/gloves{ + pixel_y = 14; + pixel_x = -7 + }, +/obj/item/storage/box/masks{ + pixel_y = 14; + pixel_x = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"NK" = ( +/obj/machinery/stasis{ + dir = 4 + }, +/obj/structure/curtain, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"NN" = ( +/obj/structure/flora/bush/ferny/style_random, +/obj/structure/flora/rock/pile/jungle/large/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"NP" = ( +/obj/effect/turf_decal/trimline/green/filled/arrow_ccw, +/obj/structure/sign/departments/security/directional/south, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"NS" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/structure/sign/departments/med_alt/directional/south, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"NU" = ( +/obj/structure/chair/sofa/right/brown, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"NW" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"NY" = ( +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/restroom) +"NZ" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/obj/structure/flora/bush/grassy/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Oa" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"Oh" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/cup/glass/shaker{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/glass/shaker{ + pixel_x = 6; + pixel_y = 9 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_x = 4; + pixel_y = 2 + }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/club) +"Oj" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"On" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/machinery/reagentgrinder{ + pixel_x = -6; + pixel_y = 13 + }, +/obj/item/reagent_containers/cup/beaker/large, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Oo" = ( +/obj/effect/turf_decal/tile/dark_blue/half, +/obj/machinery/computer/records/medical{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"OH" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/club) +"OQ" = ( +/obj/structure/curtain/cloth/fancy, +/turf/open/floor/carpet/blue, +/area/centcom/central_command_areas/planetary_port/club) +"OR" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 8 + }, +/turf/open/floor/carpet/neon/simple/blue, +/area/centcom/central_command_areas/planetary_port/club) +"OT" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"OV" = ( +/obj/effect/turf_decal/trimline/green/filled/line, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Pa" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/sink/directional/north, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Pb" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/flora/bush/sparsegrass/style_random{ + pixel_x = -1; + pixel_y = 2 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Pd" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/electrical{ + pixel_x = 0; + pixel_y = 5 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 0; + pixel_y = 0 + }, +/obj/structure/sign/painting/large/library{ + dir = 8; + pixel_x = -30; + pixel_y = -16 + }, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"Pi" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/machinery/light/directional/east, +/obj/item/folder/red{ + pixel_y = 3 + }, +/obj/item/folder/red{ + pixel_x = -7 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Pk" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"Pm" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 9 + }, +/turf/open/floor/bluespace, +/area/centcom/central_command_areas/planetary_port/club) +"Pq" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Py" = ( +/obj/structure/chair/sofa/corp, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/carpet/neon/simple/blue, +/area/centcom/central_command_areas/planetary_port/club) +"PD" = ( +/obj/item/banner/command, +/turf/open/floor/carpet/red, +/area/centcom/central_command_areas/planetary_port/club) +"PG" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 6; + pixel_y = 2 + }, +/obj/item/book/manual/wiki/security_space_law{ + pixel_y = 6; + pixel_x = 6 + }, +/obj/item/book/manual/wiki/security_space_law{ + pixel_y = 10; + pixel_x = 6 + }, +/obj/item/folder/yellow{ + pixel_x = -7; + pixel_y = 2 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"PH" = ( +/obj/structure/bed/double{ + dir = 1 + }, +/obj/item/bedsheet/nanotrasen/double{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/planetary_port/hotel) +"PN" = ( +/obj/structure/chair/stool/bar/directional/north, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port) +"Qc" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Ql" = ( +/obj/structure/chair/sofa/left/brown, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"Qr" = ( +/obj/structure/sign/poster/official/no_erp/directional/east, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"Qw" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 9 + }, +/obj/structure/flora/bush/pointy/style_random{ + pixel_y = 6 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"QC" = ( +/obj/effect/turf_decal/trimline/brown/filled/warning, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"QG" = ( +/obj/structure/table/wood/fancy/royalblack, +/obj/item/flashlight/lamp/green{ + pixel_x = 3; + pixel_y = 8 + }, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/planetary_port/hotel) +"QK" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/effect/spawner/random/food_or_drink/dinner, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/club) +"QP" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/obj/structure/flora/tree/jungle/style_random{ + pixel_x = -43; + pixel_y = -10 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Rd" = ( +/turf/open/floor/carpet/green, +/area/centcom/central_command_areas/planetary_port/library) +"Rf" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 8 + }, +/obj/structure/flora/bush/jungle/b/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Rg" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Rk" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/structure/flora/bush/reed/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/water/beach, +/area/centcom/central_command_areas/planetary_port/plaza) +"Rp" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Rt" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Rw" = ( +/obj/structure/curtain/cloth/fancy, +/turf/open/floor/carpet/red, +/area/centcom/central_command_areas/planetary_port/club) +"Rz" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/green/filled/shrink_cw, +/obj/effect/turf_decal/trimline/green/filled/shrink_ccw{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"RJ" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 4 + }, +/obj/structure/chair/office/light{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"RK" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/pen/red{ + pixel_x = -5; + pixel_y = 0 + }, +/obj/item/pen/blue{ + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"RO" = ( +/obj/machinery/vending/cola/starkist, +/turf/open/floor/carpet/royalblack, +/area/centcom/central_command_areas/planetary_port/club) +"RP" = ( +/obj/structure/chair/sofa/corp/right, +/turf/open/floor/carpet/blue, +/area/centcom/central_command_areas/planetary_port/club) +"RU" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/water/beach, +/area/centcom/central_command_areas/planetary_port/plaza) +"Sa" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/club) +"Se" = ( +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/centcom/central_command_areas/planetary_port/club) +"Sp" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/kirbyplants/random{ + pixel_y = 12 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/light/very_dim/directional/south, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"Su" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/green/filled/shrink_cw{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/green/filled/shrink_ccw, +/obj/structure/sign/poster/official/moth_epi/directional/west, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Sv" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/showroomfloor, +/area/centcom/central_command_areas/planetary_port/restroom) +"Sz" = ( +/obj/machinery/light/directional/west, +/obj/machinery/vending/coffee, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port) +"SB" = ( +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"SF" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/obj/structure/flora/bush/grassy/style_random, +/obj/structure/flora/bush/pointy/style_random{ + pixel_y = 6 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"SS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"SX" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/green/filled/arrow_cw{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"SY" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/trimline/green/filled/arrow_ccw, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Tc" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/filled/arrow_ccw, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Th" = ( +/obj/machinery/medical_kiosk, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Tj" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/library) +"Tn" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"To" = ( +/obj/effect/turf_decal/trimline/green/filled/corner, +/obj/effect/turf_decal/trimline/green/filled/arrow_cw{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Tr" = ( +/obj/structure/table/wood, +/obj/item/kirbyplants/random{ + pixel_y = 12 + }, +/turf/open/floor/carpet/green, +/area/centcom/central_command_areas/planetary_port/hotel) +"Tw" = ( +/obj/structure/flora/tree/jungle/style_random, +/obj/effect/light_emitter/podbay, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"TE" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner, +/obj/structure/flora/bush/jungle/b/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"TM" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"TP" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/centcom/central_command_areas/planetary_port/library) +"TS" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"TW" = ( +/turf/open/floor/bluespace, +/area/centcom/central_command_areas/planetary_port/club) +"TX" = ( +/obj/structure/chair/comfy/brown, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/hotel) +"Ub" = ( +/obj/structure/chair/sofa/right/brown{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Uc" = ( +/obj/structure/flora/bush/large/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Up" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/yellow/filled/shrink_ccw, +/obj/effect/turf_decal/trimline/yellow/filled/shrink_cw{ + dir = 1 + }, +/obj/structure/sign/poster/official/moth_hardhat/directional/west, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Uq" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 5 + }, +/obj/effect/spawner/random/special_lighter, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Uv" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"UC" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/green/filled/arrow_ccw, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"UF" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"UK" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/plaza) +"UL" = ( +/obj/structure/table/wood/fancy/blue, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/hotel) +"UO" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"UR" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/iron/showroomfloor, +/area/centcom/central_command_areas/planetary_port/restroom) +"US" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 8 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"UV" = ( +/obj/effect/turf_decal/trimline/green/filled/warning, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"UX" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/restroom) +"Va" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Vn" = ( +/obj/effect/spawner/structure/window/reinforced/indestructible, +/obj/structure/curtain/cloth/fancy/mechanical/start_closed, +/turf/open/floor/plating, +/area/centcom/central_command_areas/planetary_port/club) +"Vs" = ( +/obj/structure/chair/sofa/middle/brown{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"VD" = ( +/obj/machinery/door/airlock/bathroom, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/iron/showroomfloor, +/area/centcom/central_command_areas/planetary_port/restroom) +"VE" = ( +/obj/structure/chair/sofa/bench{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"VM" = ( +/obj/structure/flora/bush/jungle/a/style_random, +/obj/structure/flora/rock/pile/jungle/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"VZ" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/cigarette/cigar/premium{ + pixel_x = 14 + }, +/obj/item/cigarette/cigar/premium{ + pixel_x = 16 + }, +/obj/item/cigarette/cigar/premium{ + pixel_x = 18 + }, +/obj/effect/spawner/random/food_or_drink/salad, +/turf/open/floor/carpet/blue, +/area/centcom/central_command_areas/planetary_port/club) +"Wa" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"Wd" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner{ + dir = 1 + }, +/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Wr" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 4 + }, +/turf/open/floor/carpet/neon/simple/blue, +/area/centcom/central_command_areas/planetary_port/club) +"Wv" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/structure/flora/bush/ferny/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Wx" = ( +/obj/structure/table/bronze, +/obj/item/lighter/skull{ + pixel_x = 16; + pixel_y = 0 + }, +/obj/item/lighter/skull{ + pixel_x = -15; + pixel_y = 0 + }, +/obj/effect/spawner/random/food_or_drink/booze, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/planetary_port/club) +"WC" = ( +/obj/machinery/vending/snack, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port) +"WF" = ( +/obj/structure/table/wood/fancy/royalblack, +/obj/item/flashlight/lamp/green{ + pixel_x = -4; + pixel_y = 15 + }, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/planetary_port/hotel) +"WU" = ( +/obj/structure/table/wood/fancy/royalblack, +/obj/item/flashlight/lamp/green{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/planetary_port/hotel) +"WV" = ( +/obj/machinery/door/airlock/public, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port/library) +"WX" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/machinery/microwave{ + pixel_x = -1; + pixel_y = 6 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/planetary_port) +"WY" = ( +/obj/effect/spawner/structure/window/reinforced/indestructible, +/turf/open/floor/plating, +/area/centcom/central_command_areas/planetary_port/hotel) +"Xd" = ( +/obj/effect/turf_decal/trimline/yellow/filled/arrow_cw{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/obj/structure/sign/warning/no_smoking/directional/west, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Xe" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Xh" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 1 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Xk" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 1 + }, +/obj/machinery/computer/records/security, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Xq" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Xy" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/spawner/random/food_or_drink/booze, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/planetary_port/club) +"XB" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/kirbyplants/random{ + pixel_y = 12 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/light/very_dim/directional/south, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"XD" = ( +/obj/effect/turf_decal/trimline/yellow/filled/arrow_cw{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"XE" = ( +/obj/structure/flora/rock/pile/jungle/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"XI" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"XN" = ( +/obj/structure/table/wood/fancy/royalblack, +/obj/item/flashlight/lamp/green{ + pixel_x = 0; + pixel_y = 10 + }, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/planetary_port/hotel) +"Yj" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Ys" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/planetary_port/club) +"Yt" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/carpet/royalblack, +/area/centcom/central_command_areas/planetary_port/club) +"Yw" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Yx" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 8 + }, +/obj/effect/light_emitter/podbay, +/turf/open/water/beach, +/area/centcom/central_command_areas/planetary_port/plaza) +"YF" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/obj/structure/closet/secure_closet/freezer/kitchen/all_access, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"YU" = ( +/turf/open/floor/carpet/green, +/area/centcom/central_command_areas/planetary_port/hotel) +"YY" = ( +/obj/structure/chair/sofa/corp/left, +/turf/open/floor/carpet/blue, +/area/centcom/central_command_areas/planetary_port/club) +"Zi" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Zm" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Zn" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/structure/flora/bush/pointy/style_random{ + pixel_y = 6 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"Zr" = ( +/obj/effect/turf_decal/logo{ + dir = 4; + color = "#f4cd82" + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Zt" = ( +/obj/structure/chair/sofa/bench{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"Zu" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 1 + }, +/turf/open/floor/carpet/neon/simple/blue, +/area/centcom/central_command_areas/planetary_port/club) +"Zv" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/green/filled/shrink_cw{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/green/filled/shrink_ccw, +/obj/structure/sign/poster/official/moth_hardhat/directional/west, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"ZB" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/table/wood/fancy/black, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/item/pen/blue{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/pen/red{ + pixel_x = 4; + pixel_y = 0 + }, +/turf/open/floor/carpet/green, +/area/centcom/central_command_areas/planetary_port/library) +"ZH" = ( +/obj/structure/dresser, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/planetary_port/hotel) +"ZM" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"ZO" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/structure/flora/bush/jungle/c/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/planetary_port/plaza) +"ZR" = ( +/obj/machinery/light/dim/directional/east, +/turf/open/floor/carpet/blue, +/area/centcom/central_command_areas/planetary_port/club) +"ZS" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/planetary_port) +"ZU" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/spawner/random/trash/soap, +/turf/open/floor/stone, +/area/centcom/central_command_areas/planetary_port/restroom) +"ZV" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 8 + }, +/turf/open/floor/carpet/neon/simple/blue, +/area/centcom/central_command_areas/planetary_port/club) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +aa +aa +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +zS +zS +zS +zS +zS +zS +zS +zS +zS +aa +zS +yp +Iu +Iu +Iu +Iu +yp +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +aa +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +yp +Lb +Lb +Lb +Lb +yp +yp +iC +iC +iC +iC +iC +iC +iC +iC +iC +iC +iC +iC +iC +iC +iC +iC +iC +iC +iC +zS +zS +aa +aa +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +zS +zS +zS +zS +zS +yp +LW +gl +LW +TM +Fi +yp +yp +yp +yp +yp +Lb +Lb +Lb +Lb +yp +yp +iC +XN +PH +fZ +iC +RK +Dz +Pd +sG +cP +iC +dS +PH +fZ +iC +WF +PH +fZ +iC +zS +zS +aa +aa +aa +"} +(7,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +zS +zS +zS +yp +yp +yp +LW +LW +Tw +zT +NN +LW +LW +gl +LW +yp +yp +Lb +Lb +Lb +Lb +yp +yQ +iC +ZH +hq +EC +iC +wI +lr +av +av +SB +iC +ZH +hq +EC +iC +ZH +hq +EC +iC +zS +zS +aa +aa +aa +"} +(8,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +zS +zS +yp +TM +XE +ws +gl +LW +cd +Ax +yH +LW +LW +xO +zT +Fi +yp +Lb +Lb +Lb +Lb +Ib +VM +iC +Bx +av +av +iC +nC +av +av +Km +SB +iC +Bx +av +av +iC +Bx +av +av +iC +zS +zS +aa +aa +aa +"} +(9,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +zS +zS +yp +LW +LW +LW +Ax +sy +Fi +ov +LW +vK +LW +LW +cd +LW +sy +XI +Lb +Lb +Lb +Lb +Zn +iC +iC +iC +bL +iC +iC +qy +ak +iS +Dh +DO +iC +iC +bL +iC +iC +iC +bL +iC +iC +iC +zS +aa +aa +aa +"} +(10,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +zS +zS +yp +LW +cd +Tw +cd +iw +Bc +ab +cd +Aq +Jl +le +ab +Aq +Fi +lF +Lb +Lb +Lb +Lb +Lb +Lb +iC +bT +YU +bT +eK +SB +YU +YU +YU +SB +eK +bT +YU +SB +zx +SB +YU +TX +qs +iC +zS +aa +aa +aa +"} +(11,1,1) = {" +aa +aa +aa +aa +aa +aa +zS +zS +zS +yp +LW +sy +zT +LW +TM +LW +LW +cd +xO +cd +TM +Fi +cd +XE +TM +XI +Lb +ej +ej +Lb +Lb +Lb +xk +YU +YU +YU +YU +YU +YU +YU +YU +YU +YU +YU +YU +YU +YU +YU +YU +YU +Tr +iC +zS +aa +aa +aa +"} +(12,1,1) = {" +aa +aa +aa +aa +aa +aa +zS +zS +zS +yp +yQ +TM +ws +sy +XE +gl +LW +LW +LW +cd +xO +LW +cd +LW +xO +lF +Lb +ej +ej +Lb +Lb +Lb +iC +bT +YU +bT +Qr +SB +YU +YU +YU +SB +Qr +bT +YU +SB +qK +SB +YU +TX +qs +iC +zS +aa +aa +aa +"} +(13,1,1) = {" +aa +aa +aa +aa +aa +aa +zS +zS +Bi +Bi +Bi +Bi +FU +FU +Bi +Bi +Bi +Bi +LW +cd +LW +Uc +cd +LW +sy +zC +Lb +Lb +Lb +Lb +sT +iC +iC +iC +bL +iC +iC +hJ +sz +YU +sz +rd +iC +iC +bL +iC +iC +iC +bL +iC +iC +iC +zS +aa +aa +aa +"} +(14,1,1) = {" +aa +aa +zS +zS +zS +zS +zS +zS +Bi +Ew +IX +Wr +ke +IO +db +IX +ax +Bi +LW +ov +sy +Fi +Rt +LW +yQ +lF +Lb +Lb +Lb +Lb +dM +sy +iC +Bx +av +av +iC +NU +UL +YU +av +zy +iC +Bx +av +av +iC +Bx +av +av +iC +zS +zS +aa +aa +aa +"} +(15,1,1) = {" +zS +zS +zS +zS +zS +zS +zS +zS +Bi +Py +yZ +yZ +LU +Uv +yZ +yZ +qN +Vn +LW +cd +xO +gl +cd +LW +Ax +XI +ej +Lb +Lb +ej +ID +IR +iC +ZH +hq +EC +iC +Ql +UL +YU +av +wb +iC +ZH +hq +EC +iC +ZH +hq +EC +iC +zS +zS +aa +aa +aa +"} +(16,1,1) = {" +zS +zS +zS +zS +Bi +Bi +Bi +Bi +Bi +lU +yZ +yZ +LU +Uv +yZ +yZ +oi +Vn +LW +cd +XE +TM +Bj +sy +LW +lF +ej +Lb +Lb +ej +BM +XE +iC +QG +aE +fZ +iC +hJ +sz +YU +sz +aY +iC +HA +aE +fZ +iC +WU +aE +fZ +iC +zS +zS +aa +aa +aa +"} +(17,1,1) = {" +zS +zS +Bi +Bi +Bi +Yt +oD +Bi +Bi +za +KD +KD +yU +Wa +KD +KD +HR +Bi +LW +TM +ws +LW +cd +yQ +sy +XI +ej +Lb +Lb +ej +ID +Tw +iC +iC +WY +iC +iC +iC +iC +xk +iC +iC +Ie +iC +WY +iC +iC +iC +WY +iC +iC +zS +zS +zS +aa +aa +"} +(18,1,1) = {" +zS +zS +Bi +xj +zb +ke +uo +XB +Bi +Bi +Bi +Bi +DP +DP +Bi +Bi +Bi +Bi +Bi +Bi +Bi +LW +cd +xO +BW +cr +ej +Lb +Lb +ej +Zn +LR +zT +Jl +ws +sy +TM +iC +Lb +Lb +Lb +eE +bK +Pb +pi +KS +KS +RU +KS +KS +pi +yp +zS +zS +aa +aa +"} +(19,1,1) = {" +zS +zS +Bi +jT +zb +LU +Mz +QK +OH +dX +nX +MZ +uo +uo +MZ +ia +Bi +PD +Eb +gy +Bi +LW +LW +zR +yc +Lb +ej +Lb +Lb +ej +Lb +nf +bt +LW +yQ +xO +HP +XI +Lb +Lb +Lb +Xq +zW +KS +KS +KS +KS +hk +hk +KS +KS +KS +yp +zS +aa +aa +"} +(20,1,1) = {" +zS +zS +Bi +tg +zb +LU +Mz +rS +tb +tb +rS +rS +Mz +Mz +rS +gO +Rw +cw +Ez +hI +Vn +TM +TE +cr +Lb +Lb +xo +Ig +Ig +po +Lb +Lb +Zn +uB +cd +ws +cZ +lF +ej +Lb +ej +gF +KS +KS +hk +hk +lg +hk +hk +hk +hk +RU +yp +zS +aa +aa +"} +(21,1,1) = {" +zS +Bi +Bi +Bi +Bi +Pk +Mz +Mz +Mz +Mz +Mz +Mz +Mz +Mz +Mz +Uv +Rw +cw +ml +Fr +Vn +BW +yc +ej +ej +xo +fh +RU +KS +pp +po +ej +ej +nf +LR +sy +LW +JK +ej +Lb +ej +ta +pi +KS +KS +KS +KS +KS +KS +KS +KS +KS +yp +zS +aa +aa +"} +(22,1,1) = {" +zS +pG +EB +Hq +hM +LU +Pm +lK +lK +lK +lK +lK +lK +lK +eN +Uv +Rw +cw +mK +iI +Vn +gZ +Lb +ej +ce +Dg +KS +KS +KS +KS +dC +cO +ej +Lb +BM +LW +vK +lF +ej +Lb +ej +sX +kr +RU +KS +pi +KS +hk +hk +RU +KS +yp +zS +zS +zS +zS +"} +(23,1,1) = {" +zS +Bi +sM +iT +fi +Mt +fE +nY +kE +JU +Se +JU +kE +cX +dj +Uv +Bi +PD +lX +gy +Bi +XI +Lb +ej +na +KS +pi +KS +RU +KS +pi +kd +ej +Lb +ID +TM +xO +XI +ej +Lb +ej +AH +Gz +ea +ea +nj +IB +nw +hk +pi +KS +yp +zS +zS +zS +zS +"} +(24,1,1) = {" +zS +Bi +ex +Hq +fi +Mt +fE +kE +cX +TW +JU +TW +nY +kE +dj +Uv +Bi +Jz +Bi +Bi +Bi +cr +Lb +ej +na +KS +KS +KS +KS +RU +KS +kd +ej +Lb +Zn +eB +cG +KY +ej +Lb +ej +Go +js +Lb +Lb +sS +pW +jd +jd +jd +jd +jd +jd +jd +jd +zS +"} +(25,1,1) = {" +zS +Bi +ni +Hq +ku +Mt +fE +JU +TW +cS +JU +Se +TW +JU +dj +Mz +ks +Mz +qB +hH +hH +Lb +Lb +ej +na +KS +aR +Rk +gf +HJ +KS +kd +ej +ej +ej +ej +ej +ej +ej +Lb +ej +ej +ej +ej +ej +Lb +Lb +jd +ZU +LJ +ZU +jd +xC +xC +jd +zS +"} +(26,1,1) = {" +zS +kT +Oh +iT +Wx +Mt +fE +TW +JU +JU +vv +JU +JU +TW +dj +Sa +Bi +Av +us +hH +hH +Lb +Lb +ej +na +RU +ED +qF +jL +fa +KS +kd +Lb +Lb +Lb +Lb +Lb +Lb +Lb +Lb +Lb +Lb +Lb +Lb +Lb +Lb +Lb +ny +NY +NY +NY +pY +AT +UR +jd +zS +"} +(27,1,1) = {" +zS +Bi +AL +Hq +kk +Mt +fE +JU +TW +Se +JU +cS +TW +JU +dj +Mz +ks +Mz +oS +hH +hH +Lb +Lb +ej +na +KS +Yx +AF +DE +jy +KS +kd +ej +ej +ej +ej +ej +ej +ej +Lb +Lb +ej +ej +ej +ej +Lb +Lb +jd +NY +NY +NY +jd +jm +jm +jd +zS +"} +(28,1,1) = {" +zS +Bi +rV +Hq +fi +Mt +fE +kE +nY +TW +JU +TW +cX +kE +dj +Uv +Bi +Bi +Bi +Bi +Bi +SF +Lb +ej +na +KS +KS +KS +KS +KS +RU +kd +ej +Lb +sZ +vt +Yj +rl +NZ +Lb +Lb +sT +BS +Lb +Lb +sT +QP +jd +NY +FD +jd +jd +jd +jd +jd +zS +"} +(29,1,1) = {" +zS +Bi +kX +iT +fi +Mt +fE +cX +kE +JU +cS +JU +kE +nY +dj +Uv +Bi +JE +qQ +Nk +Bi +XI +Lb +ej +na +pi +KS +RU +KS +KS +KS +kd +ej +Lb +ID +sy +Bc +sy +lF +ej +ej +HH +zC +Lb +Lb +Wv +qi +jd +NY +NY +NY +NY +UX +LJ +jd +zS +"} +(30,1,1) = {" +zS +Bi +pf +Hq +hM +LU +GC +CL +CL +CL +CL +CL +CL +CL +Fv +Uv +OQ +hW +RP +VZ +Vn +lF +Lb +ej +Oa +UK +KS +KS +KS +pi +SS +qD +ej +Lb +ID +xO +va +va +va +rT +LZ +TP +TP +rT +LZ +va +va +JA +jd +NY +NY +NY +NY +Jr +jd +zS +"} +(31,1,1) = {" +zS +Bi +Bi +Bi +Bi +Pk +Mz +Mz +Mz +Mz +Mz +Mz +Mz +Mz +Mz +Uv +OQ +hW +bA +oW +Vn +oF +Qc +ej +ej +xS +jl +RU +KS +ig +bX +ej +ej +sT +LT +TM +va +Mf +Tj +iZ +iZ +Mf +Mf +iZ +iZ +kA +sg +va +jd +VD +jd +VD +jd +jd +jd +zS +"} +(32,1,1) = {" +zS +zS +Bi +xj +zb +LU +Mz +rS +Ge +Ge +rS +rS +Mz +Mz +rS +gO +OQ +hW +YY +qh +Vn +TM +Rf +mJ +Lb +Lb +xS +Jo +Jo +bX +Lb +Lb +Qw +xE +sy +TP +va +Mf +Tj +iZ +iZ +Ei +Ei +iZ +iZ +tO +nF +va +jd +Sv +jd +Sv +jd +zS +zS +zS +"} +(33,1,1) = {" +zS +zS +Bi +GH +zb +LU +Mz +Xy +mC +uz +kD +Gn +DS +DS +Gn +lx +Bi +JE +ZR +gp +Bi +cd +Jl +fL +Qc +Lb +ej +Lb +Lb +ej +Lb +sT +Gv +Bc +TP +TP +tl +iZ +iZ +iZ +iZ +iZ +iZ +iZ +iZ +tO +gC +va +jd +jd +jd +jd +jd +zS +zS +zS +"} +(34,1,1) = {" +zS +zS +Bi +tg +zb +kf +DS +Sp +Bi +Bi +Bi +Bi +DP +DP +Bi +Bi +Bi +Bi +Bi +Bi +Bi +LW +cd +xO +US +mJ +ej +Lb +Lb +ej +Qw +Xh +Fi +TP +TP +Hi +iZ +iZ +iZ +iZ +iZ +iZ +iZ +iZ +CD +lN +va +va +va +va +va +zS +zS +zS +zS +aa +"} +(35,1,1) = {" +zS +zS +Bi +Bi +Bi +Cr +RO +Bi +Bi +za +KR +KR +xJ +Ys +KR +KR +HR +Bi +ws +gl +LW +LW +ov +yQ +LW +XI +ej +Lb +Lb +ej +ID +Aq +va +TP +Fx +iZ +iZ +fY +tO +vm +tO +Hi +tO +ZB +uX +rO +va +Cw +kQ +Dt +va +zS +zS +zS +zS +aa +"} +(36,1,1) = {" +zS +zS +zS +zS +Bi +Bi +Bi +Bi +Bi +xn +yZ +yZ +LU +Uv +yZ +yZ +Zu +Vn +sy +sP +LW +Ax +vK +LW +TM +lF +ej +Lb +Lb +ej +Zn +eB +va +fY +rY +iZ +iZ +Hi +tO +fq +tO +Hi +tO +yC +ao +Rd +va +Jw +oc +Jw +va +zS +zS +aa +aa +aa +"} +(37,1,1) = {" +zS +zS +zS +zS +zS +zS +zS +zS +Bi +Py +yZ +yZ +LU +Uv +yZ +yZ +qN +Vn +ws +mg +cd +cd +jh +cd +Ax +XI +ej +Lb +Lb +Lb +Lb +ej +lO +iZ +iZ +iZ +iZ +Hi +tO +fY +tO +Hi +tO +rb +Rd +Rd +va +LX +Ia +or +va +zS +zS +aa +aa +aa +"} +(38,1,1) = {" +aa +aa +aa +zS +zS +zS +zS +zS +Bi +cp +cR +ZV +kf +Ma +Cc +cR +OR +Bi +LW +LW +xO +gl +Bc +LW +LW +lF +ej +Lb +Lb +Lb +Lb +ej +rT +iZ +iZ +iZ +iZ +iZ +iZ +iZ +iZ +iZ +iZ +Nt +iZ +iZ +WV +Jw +Ia +Jw +va +zS +zS +aa +aa +aa +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +zS +zS +Bi +Bi +Bi +Bi +FU +FU +Bi +Bi +Bi +Bi +LW +LW +Uc +Fi +Jl +LW +Uc +XI +ej +Lb +Lb +ej +Qw +uj +va +Hi +fY +CD +iZ +KN +Mf +Tj +iZ +iZ +CD +pD +ib +CI +va +JN +yq +wB +va +zS +zS +aa +aa +aa +"} +(40,1,1) = {" +aa +aa +aa +aa +aa +aa +zS +zS +yp +LW +xO +yQ +XE +TM +IK +LW +LW +gl +zT +TM +yQ +LW +cd +LW +xO +lF +ej +Lb +Lb +ej +ID +xO +va +va +va +TP +TP +TP +va +TP +TP +TP +va +va +va +va +va +va +va +va +va +zS +zS +aa +aa +aa +"} +(41,1,1) = {" +aa +aa +zS +zS +zS +zS +zS +zS +yp +XE +zT +cd +cd +Aq +cd +mg +cd +Tw +ov +cd +Aq +cd +mg +jh +Jl +XI +ej +ej +ej +ej +ln +vK +yH +Bc +HP +Bc +vK +cd +Jl +Bc +cd +Aq +Bc +cd +cd +cd +Tw +TM +zT +Jl +Bw +yp +zS +zS +zS +aa +"} +(42,1,1) = {" +aa +aa +zS +zS +zS +zS +zS +zS +yp +TM +sy +sy +Fi +yQ +zT +LW +LW +sy +XE +TM +LW +sy +Fi +gl +TM +lF +ej +ej +ej +ej +ZO +TM +ws +LW +Ax +TM +sy +LW +LW +xO +zT +sy +yQ +LW +TM +TM +gP +qz +qz +qz +qz +qz +qz +qz +zS +zS +"} +(43,1,1) = {" +aa +aa +zS +zS +qz +qz +qz +qz +qz +qz +qz +qz +Nq +Nq +Nq +Nq +Nq +Nq +Nq +qz +qz +qz +qz +qz +qz +qz +qz +Ck +wN +qz +qz +qz +qz +qz +qz +qz +qz +Nq +Nq +qz +qz +qz +Nq +Nq +Nq +Nq +qz +qz +sm +pB +rC +pB +NK +qz +zS +zS +"} +(44,1,1) = {" +aa +aa +zS +zS +qz +qx +ZM +On +YF +Tn +GU +rA +yj +vV +vV +yj +vV +vV +yj +Sz +qz +do +HN +fS +Nq +tN +Kn +cg +cg +Kn +tN +Nq +Wd +MK +dP +qz +Eq +wk +wk +vQ +Nq +jP +BI +BI +BI +BI +NW +qz +Ms +jt +jt +jt +Pa +qz +zS +zS +"} +(45,1,1) = {" +aa +aa +zS +zS +qz +xN +jt +jv +jt +OV +GU +PN +yj +yL +yL +yj +gR +gR +yj +eY +qz +de +OT +wU +Nq +cg +cg +cg +cg +cg +cg +Nq +Hv +OT +vq +qz +zt +jt +jt +uV +qz +Aa +Ub +Vs +Vs +IE +kS +qz +yT +LM +xv +LM +hx +qz +zS +zS +"} +(46,1,1) = {" +aa +aa +zS +zS +qz +eA +jt +jt +jt +OV +GU +PN +yj +tI +tI +yj +tI +tI +yj +WC +qz +CH +jt +wU +jG +cg +dJ +cg +cg +dJ +cg +jG +Hv +jt +Oo +qz +Gp +jt +jt +QC +FZ +Et +ZS +IZ +IZ +ge +NS +qz +yl +tZ +dd +tZ +lA +qz +zS +zS +"} +(47,1,1) = {" +aa +aa +zS +zS +qz +bI +GV +GV +GV +MV +GU +PN +yj +vV +vV +yj +vV +vV +yj +BU +qz +Xk +jt +wU +Nq +cg +cg +cg +cg +JG +cg +Nq +Hv +jt +Bn +qz +zt +jt +jt +uV +qz +JV +fC +Db +IG +xu +UF +oQ +lL +jt +jt +jt +FV +qz +zS +zS +"} +(48,1,1) = {" +aa +aa +zS +qz +qz +qz +qz +iz +qz +qz +qz +vd +yj +yL +yL +yj +gR +gR +yj +WX +qz +ct +RJ +cz +Nq +cg +cg +cg +cg +cg +cg +Nq +Xe +RJ +Hd +qz +Uq +UO +UO +cQ +Nq +JV +fC +LQ +Zr +xu +NS +qz +Th +kF +xZ +ND +Ay +qz +zS +zS +"} +(49,1,1) = {" +aa +aa +zS +qz +Zi +ZM +yh +ZM +ZM +ZM +ZM +Tn +yj +tI +tI +yj +tI +tI +yj +De +qz +Nq +fK +Nq +qz +jB +dJ +cg +cg +dJ +jB +qz +Nq +fK +Nq +qz +qz +Nq +Nq +qz +qz +JV +Kq +vg +vg +vx +Gw +qz +Nq +Nq +Nq +qz +qz +qz +zS +zS +"} +(50,1,1) = {" +aa +aa +zS +qz +GF +jt +jt +jt +jt +jt +jt +kN +ZM +ZM +ZM +ZM +ZM +ZM +ZM +ZM +yh +ZM +ZM +at +qz +cg +cg +cg +cg +cg +cg +qz +Fa +bF +bF +bF +XD +bF +bF +bF +FG +Rp +jt +jt +jt +jt +dG +Xd +bF +bF +bF +Zm +qz +zS +zS +zS +"} +(51,1,1) = {" +aa +aa +zS +qz +GF +jt +Fm +GV +GV +GV +GV +GV +fs +jt +Fm +GV +GV +GV +GV +GV +fs +jt +jt +UV +EY +cg +cg +cg +cg +cg +cg +pJ +Et +jt +jt +kJ +KW +KW +KW +KW +KW +Nu +jt +kJ +KW +KW +KW +KW +KW +Nu +jt +Gw +qz +zS +zS +aa +"} +(52,1,1) = {" +aa +aa +zS +qz +To +Rz +Tc +Pq +VE +VE +VE +oo +To +Rz +Tc +Pq +VE +VE +VE +oo +To +Rz +fs +UV +Cj +cg +dJ +cg +cg +dJ +cg +Du +Et +kJ +vy +nt +Pq +VE +VE +VE +oo +JT +vy +nt +Pq +VE +VE +VE +oo +JT +vy +nt +qz +zS +zS +aa +"} +(53,1,1) = {" +aa +zS +zS +qz +xU +qz +SY +mV +DR +mV +Ce +DR +xU +qz +SY +mV +DR +mV +Ce +DR +xU +qz +bc +zZ +qz +Jp +cg +cg +cg +cg +uI +qz +oT +kS +qz +ET +mV +DR +mV +Ce +DR +Rg +qz +ET +mV +DR +mV +Ce +DR +Rg +qz +ET +qz +zS +zS +aa +"} +(54,1,1) = {" +aa +zS +zS +qz +SX +Su +UC +Va +Zt +Zt +Zt +CW +SX +JW +UC +Va +Zt +Zt +Zt +CW +SX +Zv +Oj +zZ +qz +qz +Nq +Lz +uW +Nq +qz +qz +oT +dG +qv +Dm +Va +Zt +Zt +Zt +CW +Yw +MR +Dm +Va +Zt +Zt +Zt +CW +JV +Up +Dm +qz +zS +zS +aa +"} +(55,1,1) = {" +aa +zS +zS +qz +GF +jt +kN +ZM +ZM +ZM +ZM +ZM +Oj +jt +kN +ZM +ZM +ZM +ZM +ZM +Oj +jt +jt +NP +qz +Mp +qA +jI +Kp +qA +Hb +oO +gW +jt +jt +dG +bF +bF +bF +bF +bF +Rp +jt +dG +bF +bF +bF +bF +bF +Rp +jt +Gw +qz +zS +zS +aa +"} +(56,1,1) = {" +aa +zS +zS +qz +GF +jt +jt +jt +jt +jt +jt +jt +jt +jt +jt +jt +jt +jt +jt +jt +jt +jt +jt +zZ +gY +kw +jt +jt +jt +jt +EM +lB +Et +jt +jt +jt +jt +jt +jt +jt +jt +jt +jt +jt +jt +jt +jt +jt +jt +jt +jt +Gw +qz +zS +zS +zS +"} +(57,1,1) = {" +zS +zS +zS +qz +zU +IT +IT +IT +IT +IT +IT +IT +IT +IT +IT +IT +IT +IT +IT +IT +IT +IT +IT +tD +qz +PG +cE +jq +cn +Pi +gd +qz +gK +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +if +qz +zS +zS +zS +"} +(58,1,1) = {" +zS +qz +qz +qz +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +qz +qz +qz +qz +qz +qz +qz +qz +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +dL +qz +qz +qz +zS +"} +(59,1,1) = {" +zS +qz +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +qz +zS +"} +(60,1,1) = {" +zS +qz +Di +rr +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +Di +KU +Di +Di +Di +Di +rr +Di +Di +Di +Di +rr +Di +Di +Di +rr +Di +Di +Di +rr +Di +qz +zS +"} +(61,1,1) = {" +zS +qz +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +qz +zS +"} +(62,1,1) = {" +zS +qz +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +qz +zS +"} +(63,1,1) = {" +zS +qz +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +qz +zS +"} +(64,1,1) = {" +zS +qz +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +qz +zS +"} +(65,1,1) = {" +zS +qz +Di +rr +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +rr +Di +Di +Di +Di +rr +Di +Di +Di +rr +Di +Di +Di +rr +Di +qz +zS +"} +(66,1,1) = {" +zS +qz +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +qz +zS +"} +(67,1,1) = {" +zS +qz +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +qz +zS +"} +(68,1,1) = {" +zS +qz +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +qz +zS +"} +(69,1,1) = {" +zS +qz +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +qz +zS +"} +(70,1,1) = {" +zS +qz +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +qz +zS +"} +(71,1,1) = {" +zS +qz +Di +rr +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +rr +Di +Di +Di +Di +rr +Di +Di +Di +rr +Di +Di +Di +rr +Di +qz +zS +"} +(72,1,1) = {" +zS +qz +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +qz +zS +"} +(73,1,1) = {" +zS +qz +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +qz +zS +"} +(74,1,1) = {" +zS +qz +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +qz +zS +"} +(75,1,1) = {" +zS +qz +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +qz +zS +"} +(76,1,1) = {" +zS +qz +Di +rr +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +Di +rr +Di +Di +Di +Di +rr +Di +Di +Di +Di +rr +Di +Di +Di +rr +Di +Di +Di +rr +Di +qz +zS +"} +(77,1,1) = {" +zS +qz +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +qz +zS +"} +(78,1,1) = {" +zS +qz +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +qz +zS +"} +(79,1,1) = {" +zS +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +zS +"} +(80,1,1) = {" +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +zS +"} diff --git a/_maps/deathmatch/lattice_battles.dmm b/_maps/deathmatch/lattice_battles.dmm new file mode 100644 index 0000000000000..eab56ca3064a0 --- /dev/null +++ b/_maps/deathmatch/lattice_battles.dmm @@ -0,0 +1,994 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"bm" = ( +/obj/structure/lattice/catwalk, +/obj/structure/closet/crate/large/hats, +/turf/open/chasm, +/area/deathmatch/fullbright) +"bz" = ( +/obj/structure/railing/unbreakable{ + dir = 1 + }, +/obj/item/clothing/head/cone, +/obj/effect/playeronly_barrier, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"cN" = ( +/obj/structure/railing/unbreakable{ + dir = 8 + }, +/obj/effect/playeronly_barrier, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"df" = ( +/obj/structure/lattice/catwalk, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/chasm, +/area/deathmatch/fullbright) +"dM" = ( +/turf/open/chasm, +/area/deathmatch/fullbright) +"eK" = ( +/obj/structure/lattice/catwalk, +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/chasm, +/area/deathmatch/fullbright) +"gz" = ( +/obj/structure/flora/rock/pile/style_random, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"gN" = ( +/turf/closed/mineral/random, +/area/deathmatch/fullbright) +"gW" = ( +/obj/structure/railing/unbreakable{ + dir = 1 + }, +/obj/structure/flora/lunar_plant/style_1, +/obj/effect/playeronly_barrier, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"ho" = ( +/obj/structure/flora/lunar_plant/style_1, +/obj/effect/playeronly_barrier, +/obj/structure/railing/unbreakable{ + dir = 6 + }, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"hH" = ( +/obj/structure/railing/unbreakable{ + dir = 5 + }, +/obj/structure/flora/rock/pile/style_random, +/obj/structure/flora/lunar_plant/style_3, +/obj/effect/playeronly_barrier, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"jb" = ( +/obj/structure/flora/rock/style_random, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"lO" = ( +/obj/structure/railing/unbreakable{ + dir = 9 + }, +/obj/structure/flora/rock/pile/style_random, +/obj/structure/flora/lunar_plant/style_3, +/obj/effect/playeronly_barrier, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"rE" = ( +/obj/structure/flora/rock/pile/style_random, +/turf/closed/mineral/random, +/area/deathmatch/fullbright) +"sl" = ( +/mob/living/basic/spider/giant/hunter/away_caves, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/spider/stickyweb, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"sQ" = ( +/obj/structure/flora/lunar_plant/style_2, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"tw" = ( +/obj/structure/railing/unbreakable{ + dir = 4 + }, +/obj/effect/playeronly_barrier, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"tL" = ( +/obj/structure/railing/unbreakable, +/obj/effect/playeronly_barrier, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"uJ" = ( +/obj/structure/railing/unbreakable{ + dir = 4 + }, +/obj/item/clothing/head/cone, +/obj/effect/playeronly_barrier, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"uO" = ( +/obj/structure/lattice/catwalk, +/obj/structure/closet/crate/critter, +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/turf/open/chasm, +/area/deathmatch/fullbright) +"vk" = ( +/obj/structure/lattice/catwalk, +/turf/open/chasm, +/area/deathmatch/fullbright) +"vr" = ( +/obj/structure/flora/lunar_plant/style_2, +/obj/structure/spider/stickyweb/very_sticky, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"wb" = ( +/obj/structure/lattice/catwalk, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/chasm, +/area/deathmatch/fullbright) +"yB" = ( +/obj/structure/railing/unbreakable{ + dir = 8 + }, +/obj/structure/flora/lunar_plant/style_1, +/obj/effect/playeronly_barrier, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"AS" = ( +/mob/living/basic/pet/cat/space, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"BL" = ( +/obj/structure/railing/unbreakable{ + dir = 1 + }, +/obj/effect/playeronly_barrier, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"Cf" = ( +/obj/structure/flora/rock/pile/style_random, +/obj/structure/flora/lunar_plant/style_3, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"CI" = ( +/mob/living/basic/pet/dog/corgi/puppy/void, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"CP" = ( +/obj/structure/lattice/catwalk, +/obj/item/clothing/head/cone, +/turf/open/chasm, +/area/deathmatch/fullbright) +"Dk" = ( +/mob/living/basic/wumborian_fugu, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"He" = ( +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"Ia" = ( +/obj/machinery/power/floodlight, +/obj/structure/lattice/catwalk, +/turf/open/chasm, +/area/deathmatch/fullbright) +"IT" = ( +/obj/structure/lattice/catwalk, +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/decal/cleanable/rubble, +/turf/open/chasm, +/area/deathmatch/fullbright) +"JE" = ( +/obj/structure/railing/unbreakable{ + dir = 10 + }, +/obj/structure/flora/lunar_plant/style_1, +/obj/effect/playeronly_barrier, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"KO" = ( +/obj/structure/closet/crate/cardboard, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"LN" = ( +/obj/structure/railing/corner, +/obj/effect/playeronly_barrier, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"MF" = ( +/obj/structure/lattice, +/turf/open/chasm, +/area/deathmatch/fullbright) +"MZ" = ( +/obj/item/clothing/head/cone, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"Nf" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/structure/lattice, +/turf/open/chasm, +/area/deathmatch/fullbright) +"NA" = ( +/obj/structure/flora/lunar_plant/style_2, +/obj/effect/playeronly_barrier, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"NG" = ( +/obj/structure/lattice/catwalk, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate/cardboard, +/obj/item/statuebust, +/turf/open/chasm, +/area/deathmatch/fullbright) +"NI" = ( +/obj/structure/lattice/catwalk, +/obj/effect/decal/cleanable/rubble, +/turf/open/chasm, +/area/deathmatch/fullbright) +"NY" = ( +/obj/effect/playeronly_barrier, +/obj/structure/railing/unbreakable, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"OF" = ( +/obj/machinery/power/port_gen/pacman/pre_loaded, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"St" = ( +/mob/living/basic/spider/giant/nurse/away_caves, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"Sv" = ( +/obj/structure/lattice/catwalk, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/rubble, +/turf/open/chasm, +/area/deathmatch/fullbright) +"SL" = ( +/obj/structure/flora/rock/pile/style_random, +/obj/structure/flora/lunar_plant/style_3, +/obj/effect/playeronly_barrier, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"Uy" = ( +/obj/item/clothing/head/cone, +/obj/effect/playeronly_barrier, +/obj/structure/railing/corner/unbreakable{ + dir = 1 + }, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"UU" = ( +/obj/structure/railing{ + dir = 9 + }, +/obj/structure/flora/rock/style_random, +/obj/effect/playeronly_barrier, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"Xf" = ( +/obj/structure/flora/rock/pile/style_random, +/obj/structure/spider/stickyweb, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"Xk" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/power/floodlight, +/turf/open/chasm, +/area/deathmatch/fullbright) +"Xo" = ( +/obj/structure/flora/rock/style_random, +/obj/effect/playeronly_barrier, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"Yu" = ( +/obj/structure/flora/rock/pile/style_random, +/obj/structure/railing/unbreakable{ + dir = 6 + }, +/obj/structure/flora/lunar_plant/style_3, +/obj/effect/playeronly_barrier, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"YH" = ( +/obj/effect/playeronly_barrier, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"YV" = ( +/obj/structure/lattice/catwalk, +/obj/item/clothing/head/cone, +/obj/effect/decal/cleanable/rubble, +/turf/open/chasm, +/area/deathmatch/fullbright) +"Zp" = ( +/obj/effect/decal/cleanable/garbage, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) +"ZH" = ( +/obj/structure/flora/rock/pile/style_random, +/mob/living/basic/cow/moonicorn, +/turf/open/misc/asteroid/moon, +/area/deathmatch/fullbright) + +(1,1,1) = {" +rE +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +"} +(2,1,1) = {" +gN +gN +He +He +jb +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +"} +(3,1,1) = {" +gN +He +He +Dk +He +KO +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +"} +(4,1,1) = {" +gN +jb +Cf +He +LN +tw +uJ +tw +tw +Yu +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +"} +(5,1,1) = {" +gN +gN +OF +Zp +NY +dM +MF +MF +MF +MF +MF +gN +gN +gN +gN +gN +gN +gN +gN +MF +gN +gN +gN +gN +gN +"} +(6,1,1) = {" +gN +gN +gN +MZ +ho +vk +MF +vk +vk +MF +MF +MF +vk +df +vk +df +vk +MF +dM +dM +lO +gN +gN +gN +gN +"} +(7,1,1) = {" +gN +gN +gN +gN +gN +MF +MF +wb +vk +vk +MF +vk +wb +vk +vk +vk +vk +wb +MF +dM +bz +gN +gN +gN +gN +"} +(8,1,1) = {" +gN +gN +gN +gN +JE +MF +vk +vk +vk +vk +vk +NI +vk +vk +vk +vk +MF +vk +MF +MF +BL +sQ +gN +gN +gN +"} +(9,1,1) = {" +gN +gN +sQ +YH +tL +MF +vk +vk +vk +CP +vk +vk +vk +vk +vk +CP +MF +vk +vk +MF +BL +ZH +gN +gN +gN +"} +(10,1,1) = {" +gN +gN +gN +AS +tL +MF +vk +MF +MF +vk +df +Sv +vk +MF +vk +df +MF +vk +vk +MF +gW +jb +gN +gN +gN +"} +(11,1,1) = {" +gN +gN +gN +CI +tL +MF +vk +df +MF +MF +vk +vk +MF +MF +vk +df +vk +vk +df +vk +hH +gN +gN +gN +gN +"} +(12,1,1) = {" +gN +gN +gN +jb +tL +MF +vk +vk +vk +vk +vk +vk +vk +vk +vk +vk +vk +vk +df +NG +gN +gN +gN +gN +gN +"} +(13,1,1) = {" +gN +gN +gN +gN +Yu +MF +MF +eK +vk +vk +vk +vk +wb +CP +vk +vk +vk +wb +vk +Xk +gN +gN +gN +gN +gN +"} +(14,1,1) = {" +gN +gN +gN +gN +gN +Ia +MF +vk +vk +vk +vk +vk +vk +vk +vk +NI +vk +vk +vk +gN +gN +gN +gN +gN +gN +"} +(15,1,1) = {" +gN +gN +gN +gN +gN +gN +bm +df +vk +vk +vk +MF +MF +vk +vk +vk +MF +MF +vk +gN +gN +gN +gN +gN +gN +"} +(16,1,1) = {" +gN +gN +gN +gN +gN +gN +gN +MF +MF +vk +vk +MF +vk +vk +vk +df +MF +vk +vk +gN +gN +gN +gN +gN +gN +"} +(17,1,1) = {" +gN +gN +gN +gN +gN +gN +MF +MF +vk +vk +NI +vk +vk +vk +vk +CP +vk +vk +vk +gN +gN +gN +gN +gN +gN +"} +(18,1,1) = {" +gN +gN +gN +gN +gN +MF +MF +MF +vk +vk +YV +vk +MF +MF +vk +vk +vk +vk +df +gN +gN +gN +gN +gN +gN +"} +(19,1,1) = {" +gN +gN +gN +gN +SL +dM +MF +Nf +vk +vk +vk +MF +Nf +MF +MF +vk +vk +IT +vk +uO +gN +gN +gN +gN +gN +"} +(20,1,1) = {" +gN +gN +gN +gN +dM +dM +dM +MF +MF +vk +MF +MF +MF +MF +MF +MF +vk +vk +MF +MF +UU +gN +gN +gN +gN +"} +(21,1,1) = {" +gN +gN +gN +SL +dM +dM +dM +dM +uO +gN +gN +gN +gN +gN +gN +gN +vk +MF +dM +dM +BL +St +Xf +gN +gN +"} +(22,1,1) = {" +gN +gN +gN +jb +NA +dM +SL +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +lO +yB +cN +Uy +vr +gN +gN +gN +"} +(23,1,1) = {" +gN +gN +gN +gN +gz +Xo +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +sl +gz +gN +gN +gN +gN +gN +"} +(24,1,1) = {" +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +"} +(25,1,1) = {" +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +"} diff --git a/_maps/deathmatch/ragin_mages.dmm b/_maps/deathmatch/ragin_mages.dmm index 3dcdb966d1147..1a3d307181d08 100644 --- a/_maps/deathmatch/ragin_mages.dmm +++ b/_maps/deathmatch/ragin_mages.dmm @@ -8,7 +8,7 @@ dir = 4 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "aT" = ( /obj/item/cardboard_cutout/adaptive{ pixel_y = 14; @@ -17,7 +17,7 @@ /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "bb" = ( /obj/structure/chair/wood/wings{ dir = 8 @@ -28,15 +28,15 @@ set_luminosity = 4 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "bg" = ( /obj/effect/spawner/random/entertainment/arcade, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "bv" = ( /obj/machinery/power/shuttle_engine/propulsion, /turf/open/floor/plating/airless, -/area/deathmatch/teleport) +/area/deathmatch) "co" = ( /obj/structure/table/reinforced, /obj/item/paper_bin/carbon{ @@ -44,7 +44,7 @@ pixel_x = 7 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "ct" = ( /obj/structure/flora/bush/grassy/style_random, /mob/living/basic/pet/gondola{ @@ -52,24 +52,24 @@ faction = list("gondola", "Wizard") }, /turf/open/floor/grass, -/area/deathmatch/teleport) +/area/deathmatch) "cU" = ( /obj/structure/chair/wood/wings{ dir = 1 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "dj" = ( /obj/machinery/door/airlock/wood, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "ds" = ( /turf/open/floor/carpet/purple, -/area/deathmatch/teleport) +/area/deathmatch) "ez" = ( /obj/structure/closet/crate, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "fH" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/machinery/griddle, @@ -82,19 +82,19 @@ pixel_x = 9 }, /turf/open/floor/iron, -/area/deathmatch/teleport) +/area/deathmatch) "fI" = ( /turf/open/lava, -/area/deathmatch/teleport) +/area/deathmatch) "gn" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "gr" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/structure/chair/wood, /turf/open/floor/iron, -/area/deathmatch/teleport) +/area/deathmatch) "hg" = ( /obj/structure/railing/corner/end/flip{ dir = 8 @@ -104,14 +104,14 @@ dir = 8 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "hk" = ( /obj/item/kirbyplants/organic/plant10{ pixel_y = 21; pixel_x = -7 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "hK" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/light_emitter{ @@ -120,20 +120,20 @@ set_luminosity = 4 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "ig" = ( /obj/structure/table/wood, /obj/item/stack/medical/bruise_pack{ pixel_x = -12 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "iz" = ( /obj/structure/chair/comfy/brown{ dir = 1 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "iL" = ( /obj/effect/light_emitter{ set_cap = 2; @@ -141,7 +141,7 @@ set_luminosity = 4 }, /turf/open/floor/carpet/red, -/area/deathmatch/teleport) +/area/deathmatch) "iQ" = ( /obj/structure/table, /obj/structure/bedsheetbin{ @@ -149,42 +149,42 @@ pixel_x = 3 }, /turf/open/floor/plastic, -/area/deathmatch/teleport) +/area/deathmatch) "iZ" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/structure/sink/directional/west, /turf/open/floor/iron, -/area/deathmatch/teleport) +/area/deathmatch) "jb" = ( /obj/machinery/door/airlock/wood, /obj/structure/railing/corner/end/flip, /obj/structure/railing/corner/end, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "jg" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/effect/landmark/deathmatch_player_spawn, /turf/open/floor/iron, -/area/deathmatch/teleport) +/area/deathmatch) "jm" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/mystery_box/wands, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "js" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/deathmatch/teleport) +/area/deathmatch) "jM" = ( /obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "jV" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/machinery/door/airlock/wood, /turf/open/floor/iron, -/area/deathmatch/teleport) +/area/deathmatch) "kl" = ( /obj/structure/flora/bush/grassy/style_random, /obj/machinery/light/floor, @@ -194,7 +194,7 @@ set_luminosity = 4 }, /turf/open/floor/grass, -/area/deathmatch/teleport) +/area/deathmatch) "li" = ( /obj/structure/table, /obj/item/extinguisher{ @@ -206,7 +206,7 @@ pixel_x = -6 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "lM" = ( /obj/structure/bed{ dir = 1 @@ -220,19 +220,19 @@ set_luminosity = 4 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "lO" = ( /obj/structure/closet/crate, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "mu" = ( /obj/effect/turf_decal/stripes, /obj/structure/railing{ dir = 4 }, /turf/open/floor/iron, -/area/deathmatch/teleport) +/area/deathmatch) "mV" = ( /obj/structure/railing{ dir = 4 @@ -242,40 +242,40 @@ }, /obj/structure/mystery_box/tdome, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "nk" = ( /obj/item/gun/magic/wand/death, /obj/structure/window/reinforced/plasma/spawner/directional/east, /obj/structure/window/reinforced/plasma/spawner/directional/north, /obj/structure/window/reinforced/plasma/spawner/directional/west, /turf/open/floor/grass, -/area/deathmatch/teleport) +/area/deathmatch) "nx" = ( /obj/effect/landmark/deathmatch_player_spawn, /turf/open/floor/carpet/red, -/area/deathmatch/teleport) +/area/deathmatch) "nQ" = ( /obj/machinery/door/airlock/wood, /turf/open/floor/plastic, -/area/deathmatch/teleport) +/area/deathmatch) "on" = ( /obj/structure/table/wood, /turf/open/floor/carpet/red, -/area/deathmatch/teleport) +/area/deathmatch) "oP" = ( /obj/structure/destructible/cult/item_dispenser/archives/library, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "pe" = ( /obj/item/kirbyplants/organic/plant10{ pixel_y = 21; pixel_x = -7 }, /turf/open/floor/carpet/red, -/area/deathmatch/teleport) +/area/deathmatch) "ph" = ( /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "pv" = ( /obj/effect/light_emitter{ set_cap = 2; @@ -283,18 +283,18 @@ set_luminosity = 4 }, /turf/open/floor/iron, -/area/deathmatch/teleport) +/area/deathmatch) "pL" = ( /obj/effect/turf_decal/stripes{ dir = 1 }, /obj/structure/mystery_box/wands, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "pV" = ( /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, -/area/deathmatch/teleport) +/area/deathmatch) "qx" = ( /obj/effect/light_emitter{ set_cap = 2; @@ -302,15 +302,15 @@ set_luminosity = 4 }, /turf/open/floor/carpet/purple, -/area/deathmatch/teleport) +/area/deathmatch) "qY" = ( /obj/structure/closet/crate/bin, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "rj" = ( /obj/machinery/door/window/right/directional/east, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "rD" = ( /obj/structure/railing{ dir = 4 @@ -319,11 +319,11 @@ dir = 8 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "sf" = ( /obj/structure/mirror/directional/east, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "tL" = ( /obj/structure/flora/bush/fullgrass/style_random, /mob/living/simple_animal/hostile/ooze/gelatinous{ @@ -331,7 +331,7 @@ faction = list("slime", "Wizard") }, /turf/open/floor/grass, -/area/deathmatch/teleport) +/area/deathmatch) "ue" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/item/food/burger/yellow{ @@ -347,14 +347,14 @@ }, /obj/structure/table/reinforced, /turf/open/floor/iron, -/area/deathmatch/teleport) +/area/deathmatch) "ui" = ( /obj/effect/turf_decal/stripes, /turf/open/floor/iron, -/area/deathmatch/teleport) +/area/deathmatch) "uz" = ( /turf/open/floor/iron, -/area/deathmatch/teleport) +/area/deathmatch) "uR" = ( /obj/item/clothing/shoes/sandal/magic{ pixel_y = 16 @@ -365,82 +365,82 @@ set_luminosity = 4 }, /turf/open/floor/plastic, -/area/deathmatch/teleport) +/area/deathmatch) "vh" = ( /obj/structure/mystery_box/wands, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "vv" = ( /obj/vehicle/ridden/scooter/skateboard{ dir = 4 }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "vR" = ( /obj/structure/bookcase/random, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "wd" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/structure/mystery_box/wands, /turf/open/floor/iron, -/area/deathmatch/teleport) +/area/deathmatch) "wl" = ( /obj/item/kirbyplants/organic/plant10{ pixel_y = 1; pixel_x = -6 }, /turf/open/floor/carpet/purple, -/area/deathmatch/teleport) +/area/deathmatch) "wL" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/machinery/gibber/autogibber, /turf/open/floor/iron, -/area/deathmatch/teleport) +/area/deathmatch) "xk" = ( /obj/structure/sink/directional/south, /obj/structure/mirror/directional/north{ pixel_y = 36 }, /turf/open/floor/plastic, -/area/deathmatch/teleport) +/area/deathmatch) "xs" = ( /obj/structure/flora/bush/grassy/style_random, /turf/open/floor/grass, -/area/deathmatch/teleport) +/area/deathmatch) "yA" = ( /obj/structure/chair/wood/wings, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "zN" = ( /obj/structure/mystery_box/wands, /obj/structure/sign/poster/contraband/the_big_gas_giant_truth/directional/north, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "zO" = ( /obj/structure/closet, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Au" = ( /obj/structure/railing{ dir = 4 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "AD" = ( /obj/structure/sign/departments/restroom/directional/west, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Bm" = ( /obj/effect/landmark/deathmatch_player_spawn, /turf/open/floor/plastic, -/area/deathmatch/teleport) +/area/deathmatch) "Cb" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/structure/table/wood, /turf/open/floor/iron, -/area/deathmatch/teleport) +/area/deathmatch) "Cj" = ( /obj/structure/table, /obj/item/clothing/ears/earmuffs{ @@ -456,10 +456,10 @@ pixel_y = -10 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Cq" = ( /turf/open/floor/carpet/red, -/area/deathmatch/teleport) +/area/deathmatch) "CM" = ( /obj/structure/railing/corner, /obj/structure/railing/corner{ @@ -477,7 +477,7 @@ set_luminosity = 4 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "DK" = ( /obj/structure/railing{ dir = 8 @@ -489,11 +489,11 @@ dir = 4 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "DW" = ( /obj/machinery/computer, /turf/open/floor/carpet/red, -/area/deathmatch/teleport) +/area/deathmatch) "Eh" = ( /obj/effect/light_emitter{ set_cap = 2; @@ -501,64 +501,64 @@ set_luminosity = 4 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Fb" = ( /obj/effect/turf_decal/stripes{ dir = 1 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Fm" = ( /obj/structure/chair/comfy/black{ dir = 1 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Fv" = ( /obj/structure/chair/wood/wings{ dir = 4 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Fx" = ( /obj/item/target, /obj/structure/sign/flag/nanotrasen/directional/north, /turf/open/floor/iron, -/area/deathmatch/teleport) +/area/deathmatch) "FL" = ( /turf/open/floor/plastic, -/area/deathmatch/teleport) +/area/deathmatch) "Ge" = ( /obj/item/flashlight/flare{ pixel_x = -5; pixel_y = -12 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Gv" = ( /obj/item/kirbyplants/organic/plant10{ pixel_y = 2; pixel_x = 5 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "GC" = ( /obj/effect/spawner/structure/window, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "GZ" = ( /obj/structure/curtain, /obj/machinery/shower/directional/north, /obj/item/soap/syndie, /turf/open/floor/noslip, -/area/deathmatch/teleport) +/area/deathmatch) "Hf" = ( /obj/item/kirbyplants/organic/plant10{ pixel_y = 1; pixel_x = -6 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Hs" = ( /turf/template_noop, /area/template_noop) @@ -572,17 +572,17 @@ pixel_y = 4 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "HP" = ( /obj/structure/chair/comfy/black{ dir = 1 }, /turf/open/floor/carpet/red, -/area/deathmatch/teleport) +/area/deathmatch) "HS" = ( /obj/structure/table/wood/fancy, /turf/open/floor/plastic, -/area/deathmatch/teleport) +/area/deathmatch) "IE" = ( /obj/structure/table/wood, /obj/item/clothing/suit/wizrobe/black{ @@ -594,40 +594,40 @@ pixel_x = 6 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "IM" = ( /obj/item/kirbyplants/organic/plant10{ pixel_y = 2; pixel_x = 5 }, /turf/open/floor/carpet/purple, -/area/deathmatch/teleport) +/area/deathmatch) "Jm" = ( /turf/closed/wall/mineral/wood, -/area/deathmatch/teleport) +/area/deathmatch) "Jo" = ( /obj/structure/toilet{ dir = 4 }, /turf/open/floor/plastic, -/area/deathmatch/teleport) +/area/deathmatch) "Kr" = ( /obj/effect/landmark/deathmatch_player_spawn, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "KW" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Le" = ( /obj/structure/filingcabinet, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Mg" = ( /obj/machinery/computer, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Nl" = ( /obj/machinery/power/shuttle_engine/heater{ resistance_flags = 3 @@ -636,21 +636,21 @@ resistance_flags = 3 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Nm" = ( /obj/item/kirbyplants/organic/plant10{ pixel_y = 21; pixel_x = 6 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Nt" = ( /obj/item/target{ pixel_y = 11 }, /obj/effect/turf_decal/stripes, /turf/open/floor/iron, -/area/deathmatch/teleport) +/area/deathmatch) "NW" = ( /obj/structure/railing{ dir = 4 @@ -659,30 +659,30 @@ dir = 1 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Ok" = ( /obj/machinery/vending/cigarette, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "OD" = ( /obj/structure/filingcabinet, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "OK" = ( /obj/item/kirbyplants/organic/plant10{ pixel_y = 21; pixel_x = 6 }, /turf/open/floor/carpet/red, -/area/deathmatch/teleport) +/area/deathmatch) "PD" = ( /obj/structure/table/wood, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Qj" = ( /obj/structure/dresser, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "QH" = ( /obj/structure/table, /obj/item/clothing/head/wizard{ @@ -690,19 +690,19 @@ pixel_x = 4 }, /turf/open/floor/plastic, -/area/deathmatch/teleport) +/area/deathmatch) "QT" = ( /obj/structure/mystery_box/wands, /turf/open/floor/plastic, -/area/deathmatch/teleport) +/area/deathmatch) "RB" = ( /obj/machinery/vending/snack, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "RI" = ( /obj/effect/decal/cleanable/cobweb, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "RT" = ( /obj/machinery/power/shuttle_engine/heater{ resistance_flags = 3 @@ -711,14 +711,14 @@ resistance_flags = 3 }, /turf/open/lava, -/area/deathmatch/teleport) +/area/deathmatch) "Sa" = ( /turf/open/floor/grass, -/area/deathmatch/teleport) +/area/deathmatch) "SK" = ( /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, -/area/deathmatch/teleport) +/area/deathmatch) "Th" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/structure/table/reinforced, @@ -736,15 +736,15 @@ set_luminosity = 4 }, /turf/open/floor/iron, -/area/deathmatch/teleport) +/area/deathmatch) "Vk" = ( /obj/machinery/door/window/left/directional/east, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "VM" = ( /obj/structure/table/wood/poker, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Wl" = ( /obj/structure/railing{ dir = 4 @@ -755,37 +755,37 @@ set_luminosity = 4 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "WX" = ( /obj/machinery/vending/magivend, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Xv" = ( /obj/structure/railing, /obj/structure/railing{ dir = 1 }, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "YP" = ( /obj/structure/closet/crate/coffin, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "YS" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/engine/cult, -/area/deathmatch/teleport) +/area/deathmatch) "Zo" = ( /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, -/area/deathmatch/teleport) +/area/deathmatch) "ZS" = ( /obj/structure/railing/corner/end/flip, /turf/open/floor/iron, -/area/deathmatch/teleport) +/area/deathmatch) (1,1,1) = {" Hs diff --git a/_maps/deathmatch/ragnarok.dmm b/_maps/deathmatch/ragnarok.dmm new file mode 100644 index 0000000000000..328055398e71a --- /dev/null +++ b/_maps/deathmatch/ragnarok.dmm @@ -0,0 +1,2160 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aJ" = ( +/obj/item/wallframe/painting/eldritch/beauty, +/turf/open/floor/plating/heretic_rust, +/area/deathmatch) +"aN" = ( +/obj/structure/flora/rock/pile/jungle/style_random, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"bb" = ( +/obj/structure/flora/coconuts, +/turf/open/misc/dirt/jungle, +/area/deathmatch) +"bj" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/structure/bonfire/prelit, +/turf/open/floor/wood/large, +/area/deathmatch) +"bn" = ( +/turf/closed/wall/mineral/bronze, +/area/deathmatch) +"bv" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/water/jungle, +/area/deathmatch) +"bI" = ( +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"bO" = ( +/obj/structure/fluff/clockwork/alloy_shards/medium, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"bU" = ( +/turf/open/indestructible/plating, +/area/deathmatch) +"cb" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/cult, +/area/deathmatch) +"cr" = ( +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/cult, +/area/deathmatch) +"cs" = ( +/obj/structure/flora/grass/jungle/b/style_random, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/misc/dirt/jungle/wasteland, +/area/deathmatch) +"cH" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/cult, +/area/deathmatch) +"cR" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/weather/dirt, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"cT" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/tile, +/area/deathmatch) +"dv" = ( +/obj/structure/fluff/clockwork/clockgolem_remains, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/bronze, +/area/deathmatch) +"dI" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/misc/dirt/jungle/wasteland, +/area/deathmatch) +"dS" = ( +/obj/structure/flora/rock/pile/jungle/style_random, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"eB" = ( +/obj/effect/spawner/random/decoration/glowstick/on, +/turf/open/misc/dirt/jungle, +/area/deathmatch) +"eG" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"eL" = ( +/obj/effect/decal/remains/human, +/turf/open/floor/plating/heretic_rust, +/area/deathmatch) +"eU" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/remains/human, +/turf/open/floor/plating/heretic_rust, +/area/deathmatch) +"fc" = ( +/obj/effect/rune/wall, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/cult, +/area/deathmatch) +"fl" = ( +/obj/structure/fake_stairs/wood, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"ft" = ( +/obj/effect/turf_decal/siding/wood/end, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/water/jungle, +/area/deathmatch) +"fO" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/plating/heretic_rust, +/area/deathmatch) +"fW" = ( +/obj/structure/flora/rock/pile/style_random, +/obj/structure/fluff/clockwork/alloy_shards/medium, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"gi" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/flora/bush/jungle/a/style_random, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"gx" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/flora/coconuts, +/turf/open/misc/dirt/jungle, +/area/deathmatch) +"gz" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/cult, +/area/deathmatch) +"gJ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"hg" = ( +/obj/effect/visible_heretic_influence, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/plating/heretic_rust, +/area/deathmatch) +"hr" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"hw" = ( +/obj/structure/flora/bush/jungle/b/style_random, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"hV" = ( +/turf/open/chasm/jungle, +/area/deathmatch) +"hY" = ( +/mob/living/carbon/human/species/monkey, +/obj/item/flashlight/flare/torch, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"ih" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/flora/bush/jungle/b/style_random, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"ij" = ( +/obj/structure/flora/rock/pile/style_random, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"iq" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"iJ" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/water/jungle, +/area/deathmatch) +"iO" = ( +/obj/structure/flora/bush/jungle/b/style_random, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/misc/dirt/jungle/dark, +/area/deathmatch) +"jb" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/water/jungle, +/area/deathmatch) +"jv" = ( +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"jC" = ( +/obj/item/food/grown/banana, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"jI" = ( +/obj/effect/rune/wall, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/cult, +/area/deathmatch) +"jL" = ( +/obj/structure/flora/rock/style_random, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"jP" = ( +/obj/effect/decal/cleanable/blood/innards, +/turf/open/floor/cult, +/area/deathmatch) +"kc" = ( +/obj/structure/flora/grass/jungle/b/style_random, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/misc/dirt/jungle/wasteland, +/area/deathmatch) +"ku" = ( +/obj/structure/flora/tree/jungle/style_random, +/obj/item/food/grown/banana/bunch, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"lr" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/bonfire/prelit, +/turf/open/floor/wood/large, +/area/deathmatch) +"lx" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/misc/dirt/jungle, +/area/deathmatch) +"lC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/floor/cult, +/area/deathmatch) +"lK" = ( +/obj/structure/chair/wood/wings{ + dir = 1 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/wood/tile, +/area/deathmatch) +"lR" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/plating/heretic_rust, +/area/deathmatch) +"lX" = ( +/obj/effect/rune/blood_boil, +/obj/effect/turf_decal/weather/dirt, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/cult, +/area/deathmatch) +"mr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/vomit, +/turf/open/indestructible/plating, +/area/deathmatch) +"mD" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/cult, +/area/deathmatch) +"nO" = ( +/obj/structure/flora/bush/jungle/c/style_random, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"ou" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/water/jungle, +/area/deathmatch) +"ox" = ( +/obj/effect/cosmic_rune, +/turf/open/floor/plating/heretic_rust, +/area/deathmatch) +"oB" = ( +/turf/closed/wall/mineral/wood/nonmetal, +/area/deathmatch) +"oC" = ( +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/misc/dirt/jungle/wasteland, +/area/deathmatch) +"oF" = ( +/obj/structure/flora/rock/pile/style_random, +/obj/effect/decal/cleanable/rubble, +/obj/effect/turf_decal/weather/dirt, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"oO" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/water/jungle, +/area/deathmatch) +"pr" = ( +/obj/structure/flora/bush/jungle/a/style_random, +/obj/effect/decal/cleanable/ants/fire, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"px" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/rubble, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"pz" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt, +/obj/item/wallframe/painting/eldritch/vines, +/turf/open/indestructible/plating, +/area/deathmatch) +"pF" = ( +/obj/effect/rune/blood_boil, +/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/cult, +/area/deathmatch) +"qa" = ( +/turf/open/misc/grass/jungle, +/area/deathmatch) +"qg" = ( +/turf/open/floor/wood/tile, +/area/deathmatch) +"qh" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/water/jungle, +/area/deathmatch) +"qk" = ( +/obj/effect/decal/cleanable/blood/footprints, +/obj/effect/turf_decal/weather/dirt, +/obj/item/flashlight/flare/culttorch, +/turf/open/floor/cult, +/area/deathmatch) +"qp" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/structure/flora/tree/jungle/small/style_random, +/obj/structure/flora/coconuts, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"qL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"rc" = ( +/obj/structure/fluff/clockwork/alloy_shards, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/bronze/flat, +/area/deathmatch) +"rh" = ( +/obj/structure/fluff/clockwork/alloy_shards/medium, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"rm" = ( +/obj/structure/flora/rock/pile/jungle/large/style_random, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"rD" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/water/jungle, +/area/deathmatch) +"rH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/misc/dirt/jungle, +/area/deathmatch) +"sa" = ( +/obj/structure/flora/rock/style_random, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/rubble, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"sd" = ( +/obj/structure/table/bronze, +/obj/item/toy/clockwork_watch, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/bronze, +/area/deathmatch) +"sC" = ( +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/misc/dirt/jungle, +/area/deathmatch) +"sE" = ( +/obj/effect/visible_heretic_influence, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"sF" = ( +/obj/effect/decal/cleanable/blood/footprints, +/turf/open/floor/cult, +/area/deathmatch) +"sJ" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/cult, +/area/deathmatch) +"tl" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/closed/wall/r_wall/heretic_rust, +/area/deathmatch) +"tm" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/misc/dirt/jungle/wasteland, +/area/deathmatch) +"tE" = ( +/obj/effect/rune/malformed{ + icon_state = "hierophant"; + color = "#FFFF00" + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/bronze/filled, +/area/deathmatch) +"uT" = ( +/obj/structure/table/bronze, +/obj/item/clockwork_alloy, +/obj/item/stack/sheet/bronze/thirty, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/bronze, +/area/deathmatch) +"vI" = ( +/obj/structure/flora/tree/jungle/small/style_random, +/obj/structure/flora/coconuts, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"vR" = ( +/obj/structure/rack/skeletal, +/obj/item/clothing/head/helmet/chaplain/cage{ + pixel_y = 11; + pixel_x = -1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/tile, +/area/deathmatch) +"wf" = ( +/obj/structure/rack/skeletal, +/obj/item/clothing/head/helmet/chaplain{ + pixel_y = 9 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"wv" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/deathmatch) +"wH" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/deathmatch) +"wP" = ( +/obj/structure/flora/rock/style_random, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"wR" = ( +/obj/structure/flora/rock/pile/jungle/style_random, +/turf/open/misc/dirt/jungle, +/area/deathmatch) +"xc" = ( +/obj/structure/flora/grass/jungle/a/style_random, +/mob/living/carbon/human/species/monkey, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"xx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/flashlight/flare/culttorch, +/turf/open/floor/cult, +/area/deathmatch) +"xC" = ( +/obj/effect/rune/wall, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/cult, +/area/deathmatch) +"ye" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/cult, +/area/deathmatch) +"yv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/cult, +/area/deathmatch) +"yY" = ( +/obj/effect/decal/cleanable/vomit, +/obj/effect/spawner/random/decoration/glowstick/on, +/turf/open/floor/plating/heretic_rust, +/area/deathmatch) +"zo" = ( +/obj/structure/flora/rock/pile/jungle/style_random, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"zX" = ( +/obj/structure/girder/bronze, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/bronze/flat, +/area/deathmatch) +"Ab" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/effect/turf_decal/weather/dirt, +/obj/item/flashlight/flare/culttorch, +/turf/open/floor/cult, +/area/deathmatch) +"An" = ( +/obj/structure/fluff/clockwork/alloy_shards/large, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/bronze, +/area/deathmatch) +"Ar" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/floor/cult, +/area/deathmatch) +"Av" = ( +/obj/structure/flora/rock/pile/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"AE" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/cult, +/area/deathmatch) +"AN" = ( +/obj/structure/sacrificealtar, +/obj/item/knife/bloodletter{ + name = "McGuffin"; + desc = "An occult looking dagger that is cold to the touch. Somehow, the flawless orb on the pommel is made entirely of liquid blood. Honestly pretty disappointing as far as Mcguffins go." + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"AO" = ( +/obj/effect/decal/cleanable/ants, +/turf/closed/wall/heretic_rust, +/area/deathmatch) +"Ba" = ( +/obj/structure/destructible/cult/pylon, +/turf/open/floor/cult, +/area/deathmatch) +"Bd" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/plating/heretic_rust, +/area/deathmatch) +"Be" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/heretic_rust, +/area/deathmatch) +"Bi" = ( +/obj/item/food/grown/banana, +/turf/open/floor/plating/heretic_rust, +/area/deathmatch) +"Bl" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"Bp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/water/jungle, +/area/deathmatch) +"CB" = ( +/obj/structure/destructible/eldritch_crucible, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/vomit, +/obj/effect/heretic_rune/big, +/turf/open/indestructible/plating, +/area/deathmatch) +"CE" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/water/jungle, +/area/deathmatch) +"CR" = ( +/mob/living/carbon/human/species/monkey, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"Dn" = ( +/obj/structure/girder/cult, +/turf/open/floor/cult, +/area/deathmatch) +"Do" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/water/jungle, +/area/deathmatch) +"Ds" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/water/jungle, +/area/deathmatch) +"Du" = ( +/obj/structure/flora/rock/pile/style_random, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/item/flashlight/flare/torch, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"DA" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/water/jungle, +/area/deathmatch) +"EF" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"Fj" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"Fn" = ( +/obj/item/food/grown/banana/bunch, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"FK" = ( +/turf/open/misc/dirt/jungle, +/area/deathmatch) +"FO" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/deathmatch) +"FQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/ants, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"FS" = ( +/obj/structure/fluff/clockwork/alloy_shards/medium_gearbit, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/bronze, +/area/deathmatch) +"Ga" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/weather/dirt, +/turf/open/misc/dirt/jungle/wasteland, +/area/deathmatch) +"GD" = ( +/obj/structure/flora/bush/jungle/a/style_random, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"GE" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/cult, +/area/deathmatch) +"GO" = ( +/obj/item/food/grown/banana, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"GS" = ( +/obj/structure/girder/bronze, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/bronze/flat, +/area/deathmatch) +"HN" = ( +/obj/structure/flora/rock/pile/jungle/large/style_random, +/obj/item/flashlight/flare/torch, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"HS" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/bronze/filled, +/area/deathmatch) +"HV" = ( +/obj/effect/rune/empower, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/cult, +/area/deathmatch) +"Ic" = ( +/obj/effect/decal/cleanable/ants, +/turf/open/misc/dirt/jungle, +/area/deathmatch) +"Ig" = ( +/turf/closed/indestructible/rock, +/area/deathmatch) +"Ik" = ( +/obj/structure/flora/bush/jungle/b/style_random, +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"Io" = ( +/obj/structure/fluff/clockwork/blind_eye, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/bronze/filled, +/area/deathmatch) +"IG" = ( +/obj/structure/flora/bush/jungle/b/style_random, +/mob/living/carbon/human/species/monkey, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"IM" = ( +/obj/effect/decal/cleanable/blood/footprints, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/cult, +/area/deathmatch) +"Jf" = ( +/turf/open/misc/dirt/jungle/dark, +/area/deathmatch) +"JF" = ( +/obj/structure/flora/grass/jungle/a/style_random, +/turf/open/misc/dirt/jungle/wasteland, +/area/deathmatch) +"JL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"Kg" = ( +/turf/open/water/jungle, +/area/deathmatch) +"Kl" = ( +/obj/effect/spawner/structure/window/bronze, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"KL" = ( +/turf/open/floor/cult, +/area/deathmatch) +"KT" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/chasm/jungle, +/area/deathmatch) +"Lf" = ( +/obj/structure/fluff/clockwork/alloy_shards, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"LC" = ( +/obj/effect/decal/cleanable/blood/gibs/down, +/turf/open/floor/cult, +/area/deathmatch) +"LU" = ( +/obj/structure/flora/grass/jungle/a/style_random, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"My" = ( +/obj/structure/table/wood, +/obj/item/food/grown/holymelon, +/turf/open/floor/wood/tile, +/area/deathmatch) +"MM" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/chasm/jungle, +/area/deathmatch) +"Nf" = ( +/obj/structure/girder/cult, +/turf/open/misc/dirt/jungle/dark, +/area/deathmatch) +"NQ" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/water/jungle, +/area/deathmatch) +"NX" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/water/jungle, +/area/deathmatch) +"Or" = ( +/obj/structure/flora/tree/jungle/style_random, +/obj/structure/flora/coconuts, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"Ov" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"Pi" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/water/jungle, +/area/deathmatch) +"Px" = ( +/obj/structure/flora/tree/jungle/style_random, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"PH" = ( +/obj/effect/visible_heretic_influence, +/turf/open/misc/dirt/jungle, +/area/deathmatch) +"PI" = ( +/turf/open/floor/wood/large, +/area/deathmatch) +"PU" = ( +/obj/structure/flora/bush/jungle/c/style_random, +/obj/structure/flora/rock/style_random, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"Qf" = ( +/turf/closed/wall/r_wall, +/area/deathmatch) +"QF" = ( +/obj/effect/visible_heretic_influence, +/turf/open/misc/dirt/jungle/wasteland, +/area/deathmatch) +"QO" = ( +/obj/effect/forcefield/cult, +/turf/open/misc/dirt/jungle/dark, +/area/deathmatch) +"QQ" = ( +/turf/closed/wall/r_wall/heretic_rust, +/area/deathmatch) +"Rj" = ( +/obj/structure/flora/rock/style_random, +/obj/effect/turf_decal/weather/dirt, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"Rm" = ( +/obj/effect/forcefield/cult/permanent, +/turf/open/misc/dirt/jungle/dark, +/area/deathmatch) +"RE" = ( +/obj/structure/bonfire/prelit, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"RL" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/flora/rock/pile/jungle/style_random, +/turf/open/misc/dirt/jungle, +/area/deathmatch) +"RW" = ( +/obj/effect/decal/cleanable/shreds, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"Sf" = ( +/obj/effect/rune/wall, +/turf/open/misc/dirt/jungle/dark, +/area/deathmatch) +"Sh" = ( +/obj/effect/decal/cleanable/blood/gibs/up, +/turf/open/floor/cult, +/area/deathmatch) +"Sp" = ( +/obj/structure/fluff/clockwork/alloy_shards/small, +/obj/structure/fluff/clockwork/fallen_armor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/bronze, +/area/deathmatch) +"Sw" = ( +/turf/open/misc/dirt/jungle/wasteland, +/area/deathmatch) +"SC" = ( +/turf/closed/wall/heretic_rust, +/area/deathmatch) +"SE" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/water/jungle, +/area/deathmatch) +"SW" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/structure/flora/grass/jungle/b/style_random, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"Ti" = ( +/obj/effect/decal/cleanable/vomit, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"To" = ( +/obj/structure/flora/bush/jungle/c/style_random, +/obj/structure/flora/grass/jungle/b/style_random, +/obj/structure/flora/rock/pile/jungle/large/style_random, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"TE" = ( +/obj/structure/flora/rock/pile/style_random, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/misc/asteroid/moon, +/area/deathmatch) +"TN" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/water/jungle, +/area/deathmatch) +"TX" = ( +/obj/structure/flora/grass/jungle/b/style_random, +/obj/effect/decal/cleanable/ants/fire, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"UI" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/cult, +/area/deathmatch) +"UM" = ( +/obj/structure/flora/bush/jungle/b/style_random, +/obj/effect/turf_decal/siding/wood, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"UQ" = ( +/obj/structure/rack/skeletal, +/obj/item/clothing/head/helmet/chaplain/witchunter_hat{ + pixel_y = 8; + pixel_x = -1 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"UX" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/vomit, +/turf/open/floor/plating/heretic_rust, +/area/deathmatch) +"UY" = ( +/turf/open/floor/plating/heretic_rust, +/area/deathmatch) +"Vm" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/misc/dirt/jungle, +/area/deathmatch) +"Vv" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/water/jungle, +/area/deathmatch) +"VF" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/flora/bush/jungle/b/style_random, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"VP" = ( +/obj/effect/spawner/random/decoration/glowstick/on, +/turf/open/indestructible/plating, +/area/deathmatch) +"VY" = ( +/obj/structure/table/bronze, +/obj/item/clothing/shoes/bronze, +/obj/item/clothing/suit/costume/bronze, +/obj/item/clothing/head/costume/bronze, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/flashlight/flare/torch, +/turf/open/floor/bronze/flat, +/area/deathmatch) +"VZ" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"Wm" = ( +/obj/structure/fluff/clockwork/alloy_shards/medium, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/bronze, +/area/deathmatch) +"Wp" = ( +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/misc/dirt/jungle/dark, +/area/deathmatch) +"Xa" = ( +/obj/structure/rack/skeletal, +/obj/item/clothing/head/helmet/chaplain/ancient{ + pixel_y = 6 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"XL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/wallframe/painting/eldritch/weeping, +/turf/open/floor/plating/heretic_rust, +/area/deathmatch) +"XT" = ( +/turf/closed/wall/mineral/cult/artificer, +/area/deathmatch) +"Yn" = ( +/obj/effect/decal/cleanable/ants, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"Ys" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/flora/rock/pile/jungle/style_random, +/turf/open/misc/dirt/jungle, +/area/deathmatch) +"Yv" = ( +/obj/structure/flora/tree/jungle/small/style_random, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"Yx" = ( +/obj/structure/flora/rock/pile/jungle/style_random, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"YA" = ( +/obj/effect/decal/cleanable/blood/gibs/limb, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/floor/cult, +/area/deathmatch) +"YI" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/deathmatch) +"YN" = ( +/obj/structure/girder/cult, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/cult, +/area/deathmatch) +"YY" = ( +/obj/structure/girder/cult, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/cult, +/area/deathmatch) +"Zj" = ( +/obj/structure/flora/grass/jungle/b/style_random, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"Zw" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/tile, +/area/deathmatch) +"ZJ" = ( +/obj/structure/destructible/cult/pants_altar, +/obj/effect/rune/apocalypse{ + req_cultists = 999 + }, +/obj/item/knife/ritual, +/turf/open/floor/cult, +/area/deathmatch) +"ZR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"ZY" = ( +/obj/structure/bonfire/prelit, +/turf/open/misc/dirt/jungle, +/area/deathmatch) + +(1,1,1) = {" +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +"} +(2,1,1) = {" +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +SC +SC +SC +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +"} +(3,1,1) = {" +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +sa +UY +UY +TE +QQ +QQ +QQ +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +"} +(4,1,1) = {" +Ig +Ig +Ig +Ig +Ig +Ig +Ig +bI +qa +Px +qa +dS +bU +UY +UY +bU +QQ +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +"} +(5,1,1) = {" +Ig +Ig +Ig +Ig +Ig +Ig +ij +dS +GO +qa +qa +Sw +oC +EF +Sw +Sw +Sw +Px +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +"} +(6,1,1) = {" +Ig +Ig +Ig +Ig +Ig +jL +jv +CR +LU +Yn +Sw +Sw +yY +aJ +bU +QQ +QF +Sw +LU +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +"} +(7,1,1) = {" +Ig +Ig +Ig +Ig +jL +ij +qa +hw +qa +Sw +oC +SC +sE +UY +Be +ox +Qf +Sw +Sw +IG +ij +jL +Ig +Ig +Ig +Ig +Ig +Ig +Ig +"} +(8,1,1) = {" +Ig +Ig +Ig +Ig +bI +nO +HN +qa +vI +oC +QQ +QQ +UY +Be +UY +bU +UX +Bi +oC +LU +LU +dS +Ig +Ig +Ig +Ig +Ig +Ig +Ig +"} +(9,1,1) = {" +Ig +Ig +Ig +ij +qa +qa +LU +qa +Sw +JF +QQ +pz +UY +CB +eL +Be +XL +VP +AO +tm +qa +vI +pr +Ig +Ig +Ig +Ig +Ig +Ig +"} +(10,1,1) = {" +Ig +Ig +Ig +aN +qa +qa +Or +Bl +QF +Qf +tl +UY +eU +UY +UY +UY +SC +kc +Ga +PH +FK +FK +FK +ZY +Ig +Ig +Ig +Ig +Ig +"} +(11,1,1) = {" +Ig +Ig +Ig +GD +qa +LU +Fn +qa +Sw +Sw +oC +UY +UY +EF +UY +mr +dI +lx +PI +Vm +iJ +TN +qh +FK +wR +Ig +Ig +Ig +Ig +"} +(12,1,1) = {" +Ig +Ig +wR +ZY +Ic +FK +FK +sC +LU +pr +Sw +Ti +fO +lR +hg +Bd +FK +lx +PI +NX +NQ +NQ +NQ +TN +CE +DA +Ig +Ig +Ig +"} +(13,1,1) = {" +Ig +Ig +iJ +TN +TN +TN +qh +FK +FK +FK +cs +FK +eB +SC +FK +sC +iJ +Ds +PI +Bp +FK +FK +wR +SE +FK +sC +Ig +Ig +Ig +"} +(14,1,1) = {" +Ig +Ig +SE +NQ +NQ +NQ +Kg +TN +qh +FK +FK +iJ +qh +RL +PI +Do +Kg +Pi +PI +gx +FK +qa +FK +FK +FK +Du +Ig +Ig +Ig +"} +(15,1,1) = {" +Ig +Ig +sC +sC +FK +bb +SE +NQ +bv +PI +ou +NQ +Kg +Ds +ft +Vv +oO +FK +ZY +qa +GD +qa +jv +Yn +GD +RW +jL +Ig +Ig +"} +(16,1,1) = {" +Ig +Ig +wP +GD +qa +Wp +ZY +FK +RL +PI +Bp +bb +SE +rD +YI +jb +rH +Ys +iq +iq +hr +qp +GO +hY +qa +ij +Ig +Ig +Ig +"} +(17,1,1) = {" +Ig +Ig +jC +xc +QO +fc +Nf +Sf +Rm +yv +Jf +FK +sC +FK +sC +lx +oB +qg +qg +qg +vR +gJ +qa +rm +jv +nO +Ig +Ig +Ig +"} +(18,1,1) = {" +Ig +Ig +ij +Px +Nf +lX +Wp +Jf +Ab +Sf +Jf +qa +GD +qa +qa +gi +Xa +cT +My +qg +qg +fl +jv +qa +qa +ku +Ig +Ig +Ig +"} +(19,1,1) = {" +Ig +Ig +PU +cR +Jf +Ar +cH +cH +KL +YA +QO +Jf +Yv +qa +RE +Ov +qg +qg +AN +lK +qg +VF +qa +VZ +iq +Yx +Ig +Ig +Ig +"} +(20,1,1) = {" +Ig +Ig +Ig +oF +Nf +Wp +gz +KL +jP +KL +lC +Sf +Jf +qa +qa +Ov +wf +qg +My +qg +cT +fl +VZ +Zj +bj +Ig +Ig +Ig +Ig +"} +(21,1,1) = {" +Ig +Ig +Ig +Rj +XT +YY +Sh +ye +ZJ +ye +LC +pF +XT +qa +FQ +eG +oB +Zw +qg +qg +UQ +ZR +Zj +wH +FO +KT +Ig +Ig +Ig +"} +(22,1,1) = {" +Ig +Ig +XT +KL +sJ +AE +KL +cr +KL +AE +jI +Nf +Jf +qa +qa +ih +JL +JL +JL +JL +qL +SW +wH +FO +KT +hV +Ig +Ig +Ig +"} +(23,1,1) = {" +Ig +Ig +XT +GE +ij +Jf +IM +sF +qk +Nf +Wp +Jf +jv +hY +qa +qa +qa +qa +qa +qa +Ov +wH +FO +KT +hV +hV +Ig +Ig +Ig +"} +(24,1,1) = {" +Ig +Ig +Ig +Wp +Nf +UI +KL +Ba +xC +Jf +Jf +qa +qa +jv +To +qa +qa +jv +Or +TX +Ov +wv +KT +hV +hV +Ig +Ig +Ig +Ig +"} +(25,1,1) = {" +Ig +Ig +XT +mD +KL +HV +gz +KL +YN +Wp +qa +qa +Yn +qa +qa +qa +jv +qa +dS +qa +UM +lr +MM +hV +Ig +Ig +Ig +Ig +Ig +"} +(26,1,1) = {" +Ig +Ig +Ig +XT +xx +KL +Nf +Sf +Jf +RE +Px +Ik +GO +qa +nO +jL +Av +bO +rc +bn +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +"} +(27,1,1) = {" +Ig +Ig +Ig +Ig +Dn +cb +Wp +Jf +qa +jv +qa +qa +qa +jL +bI +Ig +Lf +px +fW +dv +Sp +zX +bn +Ig +Ig +Ig +Ig +Ig +Ig +"} +(28,1,1) = {" +Ig +Ig +Ig +Ig +Ig +iO +jL +ij +zo +Ig +Ig +Ig +Ig +Ig +Ig +Ig +An +HS +Fj +Fj +rh +sd +Kl +Ig +Ig +Ig +Ig +Ig +Ig +"} +(29,1,1) = {" +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +bn +GS +Wm +tE +Io +uT +Kl +Ig +Ig +Ig +Ig +Ig +Ig +"} +(30,1,1) = {" +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Kl +FS +VY +bn +Ig +Ig +Ig +Ig +Ig +Ig +Ig +"} +(31,1,1) = {" +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +Ig +"} diff --git a/_maps/deathmatch/species_warfare.dmm b/_maps/deathmatch/species_warfare.dmm new file mode 100644 index 0000000000000..e80485c2b5e5c --- /dev/null +++ b/_maps/deathmatch/species_warfare.dmm @@ -0,0 +1,2461 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aA" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/machinery/medical_kiosk, +/obj/structure/sign/poster/official/moth_meth/directional/east, +/turf/open/indestructible/white, +/area/deathmatch) +"aD" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/effect/spawner/random/vending/colavend, +/turf/open/indestructible, +/area/deathmatch) +"by" = ( +/mob/living/basic/mothroach, +/turf/open/indestructible/white, +/area/deathmatch) +"bL" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/surgery_tray/full, +/turf/open/indestructible/white, +/area/deathmatch) +"bX" = ( +/obj/effect/turf_decal/tile/dark_blue/full, +/obj/structure/table/glass, +/obj/item/storage/fancy/donut_box, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"cd" = ( +/obj/effect/turf_decal/tile/dark_blue/full, +/obj/machinery/light/built/directional/south, +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"cl" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/obj/machinery/light/small/blacklight/directional/north, +/turf/open/floor/wood, +/area/deathmatch) +"cs" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/vehicle/sealed/mecha/ripley, +/obj/item/mecha_parts/mecha_equipment/air_tank/full, +/turf/open/floor/iron/dark, +/area/deathmatch) +"cy" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/cryo_cell, +/turf/open/indestructible/white, +/area/deathmatch) +"dv" = ( +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/indestructible, +/area/deathmatch) +"dA" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/indestructible/white, +/area/deathmatch) +"dB" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/portable_atmospherics/canister, +/turf/open/indestructible, +/area/deathmatch) +"ee" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"em" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/turf/open/indestructible/white, +/area/deathmatch) +"es" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/stasis{ + dir = 1 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/obj/machinery/light/floor, +/turf/open/indestructible/white, +/area/deathmatch) +"eE" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/machinery/atmospherics/components/binary/crystallizer{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"eO" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"eW" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"fg" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/turf/open/indestructible/dark, +/area/deathmatch) +"fm" = ( +/obj/item/pillow/random, +/turf/open/floor/wood, +/area/deathmatch) +"fA" = ( +/obj/machinery/power/tracker, +/obj/structure/cable, +/turf/open/floor/plating/airless, +/area/deathmatch) +"fP" = ( +/obj/effect/turf_decal/tile/dark_blue/full, +/obj/machinery/door/airlock/command/glass, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"fV" = ( +/obj/effect/turf_decal/tile/purple/full, +/obj/machinery/door/airlock/science/glass, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"gH" = ( +/mob/living/basic/pet/cat/feral, +/obj/structure/bed, +/obj/item/bedsheet/runtime, +/obj/machinery/light/small/blacklight/directional/south, +/turf/open/floor/wood, +/area/deathmatch) +"gI" = ( +/turf/open/indestructible/dark, +/area/deathmatch) +"gM" = ( +/obj/effect/spawner/random/structure/closet_private, +/obj/effect/decal/cleanable/vomit, +/turf/open/floor/wood, +/area/deathmatch) +"hk" = ( +/obj/effect/turf_decal/tile/green/full, +/obj/machinery/door/airlock/glass, +/turf/open/indestructible/large, +/area/deathmatch) +"ho" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible, +/area/deathmatch) +"hA" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"hC" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/table/optable, +/obj/effect/decal/cleanable/blood, +/turf/open/indestructible/white, +/area/deathmatch) +"hG" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/decal/cleanable/oil/slippery, +/obj/item/mecha_parts/mecha_equipment/ripleyupgrade, +/turf/open/floor/iron/dark, +/area/deathmatch) +"hR" = ( +/obj/structure/reagent_dispensers/watertank/high, +/turf/open/indestructible/plating, +/area/deathmatch) +"is" = ( +/obj/item/grenade/spawnergrenade/cat, +/turf/open/floor/wood, +/area/deathmatch) +"iu" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/sleeper/self_control, +/turf/open/indestructible/white, +/area/deathmatch) +"ix" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"iK" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"iM" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/structure/table/glass, +/obj/item/surgery_tray/full, +/turf/open/indestructible/white, +/area/deathmatch) +"iV" = ( +/obj/item/card/id/advanced/engioutpost, +/obj/effect/decal/remains/human/smokey, +/turf/open/indestructible, +/area/deathmatch) +"jm" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 4 + }, +/obj/structure/closet/firecloset/full, +/turf/open/indestructible/dark, +/area/deathmatch) +"jn" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/machinery/light/floor, +/turf/open/indestructible/dark, +/area/deathmatch) +"ju" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"jw" = ( +/turf/open/space/basic, +/area/deathmatch) +"jR" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/obj/machinery/rnd/production/protolathe/offstation, +/obj/machinery/light/directional/east, +/turf/open/indestructible/white, +/area/deathmatch) +"ko" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/vending/cigarette/syndicate, +/obj/machinery/light/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"kY" = ( +/obj/machinery/door/airlock{ + id_tag = "Cabin2"; + name = "Cabin 4" + }, +/turf/open/chasm{ + icon_state = "wood"; + icon = 'icons/turf/floors.dmi'; + base_icon_state = "wood"; + name = "Dorms 4" + }, +/area/deathmatch) +"lF" = ( +/obj/effect/spawner/random/structure/closet_private, +/turf/open/floor/wood, +/area/deathmatch) +"mn" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/machinery/computer/security/wooden_tv{ + pixel_x = 1; + pixel_y = 6 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"mo" = ( +/obj/effect/turf_decal/tile/yellow/full, +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/west, +/turf/open/indestructible/large, +/area/deathmatch) +"mK" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/closet/emcloset, +/turf/open/indestructible/white, +/area/deathmatch) +"mO" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 4 + }, +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"nb" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/turf/open/indestructible/dark/textured, +/area/deathmatch) +"nf" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/cup/glass/bottle/champagne/cursed, +/obj/item/food/donut/trumpet, +/turf/open/indestructible/dark, +/area/deathmatch) +"nQ" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"nT" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted, +/obj/structure/closet/firecloset/full, +/turf/open/indestructible/white, +/area/deathmatch) +"oq" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/obj/effect/decal/cleanable/greenglow, +/turf/open/indestructible/white, +/area/deathmatch) +"oy" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/indestructible, +/area/deathmatch) +"oD" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/blacklight/directional/west, +/turf/open/indestructible/dark/textured, +/area/deathmatch) +"oN" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/indestructible, +/area/deathmatch) +"pD" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"pH" = ( +/obj/structure/cable, +/obj/structure/table/reinforced, +/obj/item/fireaxe/metal_h2_axe, +/turf/open/indestructible, +/area/deathmatch) +"pJ" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/light/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"pL" = ( +/mob/living/basic/lizard/wags_his_tail, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"qF" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted, +/turf/open/indestructible/white, +/area/deathmatch) +"qM" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/indestructible/white, +/area/deathmatch) +"qV" = ( +/obj/effect/turf_decal/tile/dark_blue/full, +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"rq" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/table/reinforced, +/obj/item/toy/plush/slimeplushie{ + pixel_y = 10 + }, +/obj/item/mecha_parts/mecha_equipment/weapon/energy/mecha_kineticgun, +/turf/open/floor/iron/dark, +/area/deathmatch) +"ru" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/rnd/production/circuit_imprinter/offstation, +/obj/item/mecha_parts/mecha_equipment/wormhole_generator, +/turf/open/indestructible/white, +/area/deathmatch) +"rO" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/obj/item/melee/supermatter_sword, +/obj/machinery/light/small/blacklight/directional/south, +/turf/open/floor/wood, +/area/deathmatch) +"rP" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/structure/table, +/obj/item/restraints/legcuffs/beartrap{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/restraints/legcuffs/beartrap{ + pixel_x = 2 + }, +/obj/item/key/janitor{ + pixel_y = 10 + }, +/turf/open/indestructible, +/area/deathmatch) +"rV" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/deathmatch) +"sn" = ( +/obj/effect/decal/cleanable/vomit, +/turf/open/floor/wood, +/area/deathmatch) +"st" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on, +/turf/open/indestructible/white, +/area/deathmatch) +"su" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/storage/belt/utility/full{ + pixel_y = 4 + }, +/obj/item/storage/belt/utility/full, +/turf/open/indestructible, +/area/deathmatch) +"sx" = ( +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"sJ" = ( +/turf/open/floor/wood, +/area/deathmatch) +"sL" = ( +/obj/effect/turf_decal/tile/dark_blue/full, +/obj/structure/table/glass, +/obj/item/storage/medkit/regular, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"sW" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"tR" = ( +/obj/effect/turf_decal/tile/dark_blue/full, +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"uq" = ( +/obj/structure/table, +/obj/effect/spawner/random/entertainment/dice, +/turf/open/indestructible, +/area/deathmatch) +"uQ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/indestructible/white, +/area/deathmatch) +"uX" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"vb" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/item/kirbyplants/random, +/turf/open/indestructible, +/area/deathmatch) +"vm" = ( +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"vq" = ( +/obj/structure/cable, +/turf/open/floor/iron/solarpanel/airless, +/area/deathmatch) +"vB" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible, +/area/deathmatch) +"vI" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/indestructible, +/area/deathmatch) +"vT" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/light/built/directional/south, +/turf/open/indestructible, +/area/deathmatch) +"wb" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/stasis{ + dir = 1 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/obj/machinery/light/floor, +/turf/open/indestructible/white, +/area/deathmatch) +"wd" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"wj" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"wA" = ( +/obj/structure/table/glass, +/obj/item/storage/box/syringes, +/obj/item/gun/syringe, +/obj/item/reagent_containers/cup/bottle/morphine{ + pixel_y = 17; + pixel_x = -7 + }, +/obj/item/reagent_containers/cup/bottle/traitor{ + pixel_y = 17; + pixel_x = 8 + }, +/obj/item/toy/plush/moth{ + name = "Mender Moff" + }, +/turf/open/indestructible/white, +/area/deathmatch) +"wG" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/structure/closet/firecloset/full, +/turf/open/indestructible/white, +/area/deathmatch) +"wM" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/obj/machinery/vending/wardrobe/jani_wardrobe, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/blacklight/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"xe" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/indestructible, +/area/deathmatch) +"xj" = ( +/obj/effect/decal/cleanable/blood/footprints, +/turf/open/indestructible/white, +/area/deathmatch) +"xL" = ( +/obj/effect/spawner/structure/window/reinforced/indestructible, +/turf/open/indestructible/large, +/area/deathmatch) +"xT" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/item/storage/medkit/brute{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/storage/medkit/fire{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/structure/cable, +/obj/structure/table/glass, +/turf/open/indestructible/white, +/area/deathmatch) +"yq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/turf/open/indestructible/white, +/area/deathmatch) +"yy" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/cup/glass/bottle/champagne/cursed, +/obj/item/food/donut/trumpet, +/turf/open/indestructible/dark, +/area/deathmatch) +"yD" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood, +/obj/machinery/light/cold/dim/directional/east, +/turf/open/indestructible/white, +/area/deathmatch) +"yU" = ( +/obj/effect/turf_decal/tile/green/anticorner/contrasted, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"zg" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted, +/obj/item/kirbyplants/random, +/turf/open/indestructible, +/area/deathmatch) +"zs" = ( +/obj/effect/turf_decal/tile/blue/full, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"zt" = ( +/obj/effect/turf_decal/tile/dark_blue/full, +/obj/machinery/light/built/directional/south, +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"zw" = ( +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"zx" = ( +/obj/item/stack/tile/iron/four{ + pixel_y = 7; + pixel_x = 10 + }, +/obj/structure/cable, +/turf/open/indestructible/plating, +/area/deathmatch) +"zJ" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"zK" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/turf/open/indestructible/dark, +/area/deathmatch) +"zZ" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/spawner/random/vending/colavend, +/turf/open/indestructible, +/area/deathmatch) +"Ac" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/machinery/light/floor, +/turf/open/indestructible, +/area/deathmatch) +"Ag" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/purple/half/contrasted, +/obj/effect/decal/cleanable/oil, +/turf/open/indestructible/white, +/area/deathmatch) +"AE" = ( +/obj/effect/turf_decal/tile/yellow/full, +/obj/machinery/door/airlock/engineering/glass, +/turf/open/indestructible/large, +/area/deathmatch) +"AQ" = ( +/mob/living/basic/migo/hatsune, +/obj/structure/bed, +/obj/item/bedsheet/cult, +/obj/machinery/light/small/blacklight/directional/south, +/turf/open/floor/wood, +/area/deathmatch) +"AZ" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/item/storage/medkit/brute{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/storage/medkit/fire{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/structure/table/glass, +/turf/open/indestructible/white, +/area/deathmatch) +"Bc" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/obj/structure/closet/secure_closet/engineering_electrical, +/obj/item/clothing/suit/armor/elder_atmosian, +/obj/item/clothing/head/helmet/elder_atmosian, +/turf/open/indestructible, +/area/deathmatch) +"Bh" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/structure/table/glass, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health{ + pixel_y = 6 + }, +/obj/machinery/light/cold/dim/directional/east, +/turf/open/indestructible/white, +/area/deathmatch) +"Bu" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold/green/visible, +/turf/open/indestructible, +/area/deathmatch) +"BA" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/obj/item/mecha_parts/mecha_equipment/drill/diamonddrill, +/turf/open/indestructible/white, +/area/deathmatch) +"BH" = ( +/turf/open/chasm{ + icon_state = "wood"; + icon = 'icons/turf/floors.dmi'; + base_icon_state = "wood"; + name = "Dorms 4" + }, +/area/deathmatch) +"BL" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"BV" = ( +/obj/effect/decal/cleanable/garbage, +/turf/open/indestructible, +/area/deathmatch) +"Dm" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/turf/open/indestructible/dark/textured, +/area/deathmatch) +"DN" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/machinery/vending/engivend, +/turf/open/indestructible, +/area/deathmatch) +"DV" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"DZ" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/deathmatch) +"El" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/machinery/vending/wardrobe/engi_wardrobe, +/obj/machinery/light/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"Es" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/structure/table/glass, +/obj/item/gun/ballistic/rifle/rebarxbow/forced, +/obj/item/ammo_casing/rebar, +/obj/item/ammo_casing/rebar, +/obj/item/ammo_casing/rebar, +/obj/machinery/light/built/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"EC" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/effect/decal/cleanable/ash/large, +/turf/open/indestructible, +/area/deathmatch) +"EN" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"FY" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/sleeper/self_control{ + dir = 1 + }, +/turf/open/indestructible/white, +/area/deathmatch) +"Gl" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/mecha_part_fabricator/maint, +/turf/open/floor/iron/dark, +/area/deathmatch) +"Gm" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/table/glass, +/obj/machinery/recharger, +/turf/open/indestructible/dark, +/area/deathmatch) +"Gp" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/machinery/light/floor, +/turf/open/indestructible/white, +/area/deathmatch) +"Gy" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"GA" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"GF" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/light/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"GY" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/structure/reagent_dispensers/fueltank/large, +/turf/open/indestructible, +/area/deathmatch) +"Hj" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/structure/closet/firecloset/full, +/turf/open/indestructible, +/area/deathmatch) +"Hy" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/cryo_cell{ + dir = 1 + }, +/turf/open/indestructible/white, +/area/deathmatch) +"Ia" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"Iq" = ( +/obj/effect/turf_decal/tile/dark_blue/full, +/obj/structure/rack, +/obj/item/gun/energy/e_gun/mini/practice_phaser, +/obj/machinery/light/built/directional/north, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Iu" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma, +/turf/open/indestructible/white, +/area/deathmatch) +"Iz" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/machinery/vending/tool, +/turf/open/indestructible, +/area/deathmatch) +"IA" = ( +/obj/effect/spawner/random/structure/closet_private, +/obj/item/toy/plush/awakenedplushie, +/turf/open/floor/wood, +/area/deathmatch) +"IJ" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/closet/secure_closet/engineering_electrical, +/turf/open/indestructible, +/area/deathmatch) +"IR" = ( +/obj/vehicle/ridden/janicart/upgraded, +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/tile/iron/four{ + pixel_y = 7; + pixel_x = 10 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"JL" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/obj/structure/table/glass, +/obj/machinery/recharger, +/turf/open/indestructible/dark, +/area/deathmatch) +"JS" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/indestructible, +/area/deathmatch) +"JX" = ( +/obj/item/melee/chainofcommand/tailwhip/kitty, +/turf/open/floor/wood, +/area/deathmatch) +"Ka" = ( +/obj/machinery/door/airlock{ + id_tag = "Cabin7"; + name = "Cabin 1" + }, +/turf/open/floor/wood, +/area/deathmatch) +"Kv" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/mecha_wreckage/durand, +/obj/item/mecha_parts/mecha_equipment/repair_droid, +/turf/open/indestructible/white, +/area/deathmatch) +"Lk" = ( +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"Lq" = ( +/obj/effect/turf_decal/tile/dark_blue/full, +/obj/machinery/computer, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Lr" = ( +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/mop_bucket/janitorialcart, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"Lt" = ( +/obj/effect/turf_decal/tile/green/anticorner/contrasted, +/turf/open/indestructible, +/area/deathmatch) +"LY" = ( +/obj/item/clothing/suit/pillow_suit, +/obj/item/clothing/head/pillow_hood, +/turf/open/floor/wood, +/area/deathmatch) +"Mi" = ( +/obj/structure/cable, +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible, +/area/deathmatch) +"Mn" = ( +/turf/open/indestructible/white, +/area/deathmatch) +"ME" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/clothing/head/collectable/welding, +/obj/item/sticker/syndicate/flash{ + pixel_x = 3 + }, +/obj/item/sticker/syndicate/flash{ + pixel_x = -4 + }, +/turf/open/indestructible/white, +/area/deathmatch) +"MG" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health{ + pixel_y = 6 + }, +/turf/open/indestructible/white, +/area/deathmatch) +"Nb" = ( +/obj/machinery/light/floor, +/turf/open/indestructible/white, +/area/deathmatch) +"Ne" = ( +/obj/effect/turf_decal/tile/purple/full, +/obj/effect/turf_decal/tile/purple/full, +/obj/effect/turf_decal/tile/purple/full, +/obj/effect/turf_decal/tile/purple/full, +/obj/structure/table/reinforced/plasmarglass, +/obj/machinery/door/window/right/directional/north, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"Nr" = ( +/obj/machinery/vending/medical, +/turf/open/indestructible/white, +/area/deathmatch) +"Ns" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/bucket, +/obj/item/mop, +/turf/open/indestructible, +/area/deathmatch) +"Nv" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/small/blacklight/directional/east, +/turf/open/indestructible/dark/textured, +/area/deathmatch) +"ND" = ( +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Oa" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/indestructible, +/area/deathmatch) +"Oo" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Os" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"Ot" = ( +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/indestructible/dark, +/area/deathmatch) +"OF" = ( +/obj/effect/turf_decal/tile/dark_blue/full, +/obj/structure/rack, +/obj/item/cane, +/obj/structure/fireaxecabinet/directional/south, +/obj/machinery/light/built/directional/south, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"ON" = ( +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/door/airlock/multi_tile/public/glass{ + dir = 8 + }, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"Ps" = ( +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"Qo" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted, +/mob/living/basic/bot/medbot, +/obj/item/mecha_parts/mecha_equipment/gravcatapult, +/turf/open/indestructible/white, +/area/deathmatch) +"QM" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible, +/area/deathmatch) +"RX" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -1; + pixel_y = 3 + }, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/toy/plush/lizard_plushie, +/turf/open/indestructible/plating, +/area/deathmatch) +"RY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 8 + }, +/obj/item/mecha_parts/mecha_equipment/extinguisher, +/turf/open/indestructible/white, +/area/deathmatch) +"Sh" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/turf/open/space/basic, +/area/deathmatch) +"Sm" = ( +/obj/structure/table/reinforced, +/obj/item/grenade/gas_crystal/crystal_foam, +/turf/open/indestructible, +/area/deathmatch) +"Sn" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/table/optable, +/obj/item/reagent_containers/syringe/contraband/methamphetamine, +/obj/effect/decal/cleanable/blood, +/turf/open/indestructible/white, +/area/deathmatch) +"Sy" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/obj/machinery/computer, +/turf/open/indestructible/white, +/area/deathmatch) +"To" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"TZ" = ( +/obj/structure/cable, +/turf/open/floor/plating/airless, +/area/deathmatch) +"Uj" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/indestructible, +/area/deathmatch) +"Ur" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/deathmatch) +"UD" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"UH" = ( +/obj/structure/table, +/obj/effect/spawner/random/entertainment/deck, +/turf/open/indestructible, +/area/deathmatch) +"Vl" = ( +/turf/open/indestructible, +/area/deathmatch) +"Vp" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/item/kirbyplants/photosynthetic, +/turf/open/indestructible/dark, +/area/deathmatch) +"VE" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/item/kirbyplants/random/dead, +/obj/effect/decal/cleanable/vomit, +/turf/open/indestructible, +/area/deathmatch) +"Wf" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/storage/medkit/fire, +/obj/item/toy/plush/plasmamanplushie, +/turf/open/indestructible, +/area/deathmatch) +"Wy" = ( +/obj/machinery/vending/drugs, +/turf/open/indestructible/white, +/area/deathmatch) +"WE" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible, +/area/deathmatch) +"XZ" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"Yb" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/structure/closet/firecloset/full, +/turf/open/indestructible, +/area/deathmatch) +"Yo" = ( +/mob/living/basic/cat_butcherer, +/obj/structure/bed, +/obj/item/bedsheet/runtime, +/obj/machinery/light/small/blacklight/directional/north, +/turf/open/floor/wood, +/area/deathmatch) +"Yr" = ( +/mob/living/basic/alien/maid, +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/obj/effect/decal/cleanable/vomit, +/obj/machinery/light/small/blacklight/directional/north, +/turf/open/floor/wood, +/area/deathmatch) +"YJ" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/obj/machinery/rnd/destructive_analyzer, +/turf/open/indestructible/white, +/area/deathmatch) +"YQ" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Za" = ( +/obj/effect/spawner/structure/window/reinforced/indestructible, +/turf/open/indestructible/plating, +/area/deathmatch) +"Zb" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"ZO" = ( +/obj/effect/turf_decal/tile/green, +/turf/open/indestructible, +/area/deathmatch) + +(1,1,1) = {" +jw +jw +jw +jw +jw +jw +jw +jw +jw +TZ +rV +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +"} +(2,1,1) = {" +jw +jw +jw +jw +jw +vq +vq +vq +vq +Sh +vq +vq +vq +vq +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +"} +(3,1,1) = {" +jw +jw +jw +jw +jw +jw +jw +jw +rV +Sh +rV +rV +Za +Za +Za +Za +Za +Za +Za +Za +rV +rV +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +"} +(4,1,1) = {" +jw +jw +jw +jw +jw +vq +vq +vq +vq +Sh +vq +zJ +zJ +mK +cy +st +dA +Hy +wG +zJ +zJ +rV +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +"} +(5,1,1) = {" +jw +jw +jw +jw +jw +jw +jw +jw +rV +Sh +rV +Za +hC +Mn +yq +yq +yq +yq +Mn +Sn +Za +rV +rV +rV +rV +jw +jw +jw +jw +jw +jw +jw +"} +(6,1,1) = {" +jw +jw +jw +jw +jw +jw +vq +vq +vq +Sh +vq +Za +bL +Mn +Mn +Mn +wA +xj +xj +iM +zJ +zJ +zJ +Za +zJ +zJ +jw +jw +jw +jw +jw +jw +"} +(7,1,1) = {" +jw +jw +rV +rV +rV +jw +jw +jw +jw +Sh +jw +Za +wb +Mn +Mn +by +Nr +by +Mn +es +zJ +Lr +rP +uX +IR +zJ +rV +jw +jw +jw +jw +jw +"} +(8,1,1) = {" +jw +rV +zJ +Za +Za +Za +zJ +rV +jw +Sh +jw +Za +AZ +Mn +Mn +Mn +Wy +Mn +Mn +xT +zJ +wM +BV +pL +dv +Za +rV +jw +jw +jw +jw +jw +"} +(9,1,1) = {" +rV +zJ +zJ +tR +sx +cd +zJ +zJ +rV +Sh +jw +Za +iu +Mn +Mn +Mn +Nb +Mn +Mn +FY +zJ +Ns +ZO +VE +hR +zJ +rV +rV +jw +jw +jw +jw +"} +(10,1,1) = {" +rV +zJ +Lq +Gy +YQ +eW +sL +zJ +rV +Sh +rV +Za +MG +yD +qM +qM +aA +qM +qM +Bh +zJ +RX +yU +zJ +xL +zJ +zJ +Za +zJ +jw +jw +jw +"} +(11,1,1) = {" +rV +Za +nf +gI +jn +gI +Gm +zJ +zJ +zJ +zJ +zJ +zJ +zJ +zs +ON +zJ +zs +ON +zJ +zJ +zJ +hk +Za +Iu +Kv +Gl +cs +zJ +jw +jw +jw +"} +(12,1,1) = {" +jw +Za +jm +ix +gI +gI +zK +fP +nb +fP +eO +wd +pD +pD +sW +Zb +Zb +Zb +Zb +ee +pJ +ho +vm +Za +ME +Ag +rq +hG +zJ +jw +jw +jw +"} +(13,1,1) = {" +rV +zJ +Iq +Oo +gI +Ot +fg +fP +Nv +fP +iK +QM +Vl +Vl +Vl +Vl +Vl +Vl +Vl +Vl +Vl +Vl +vI +Ne +BA +uQ +em +RY +Za +rV +jw +jw +"} +(14,1,1) = {" +rV +Za +Lq +BL +gI +Vp +OF +zJ +zJ +zJ +Hj +Vl +Ac +Vl +Vl +Vl +Vl +Vl +Vl +Ac +Vl +Vl +zg +Za +Sy +Mn +Gp +qF +Za +rV +jw +jw +"} +(15,1,1) = {" +rV +zJ +Iq +Oo +gI +DV +ju +fP +oD +fP +iK +Vl +Vl +Vl +Vl +Vl +Vl +Vl +Vl +Vl +Vl +Vl +JS +fV +oq +Mn +Mn +Qo +Za +rV +jw +jw +"} +(16,1,1) = {" +jw +Za +mn +EN +gI +gI +zK +fP +Dm +fP +UD +wj +GF +WE +Uj +aD +ko +zZ +xe +GA +GA +vB +Yb +Za +ru +jR +YJ +nT +zJ +rV +rV +jw +"} +(17,1,1) = {" +rV +Za +yy +gI +jn +gI +JL +zJ +zJ +zJ +zJ +hk +zJ +hk +zJ +zJ +zJ +zJ +Za +mo +Za +AE +Za +zJ +zJ +Za +Za +Za +zJ +zJ +rV +jw +"} +(18,1,1) = {" +rV +zJ +Lq +mO +To +nQ +bX +zJ +cl +sJ +zJ +Lk +vb +vm +zJ +sJ +rO +zJ +Oa +XZ +XZ +XZ +XZ +XZ +Os +dB +dB +dB +dB +zJ +rV +jw +"} +(19,1,1) = {" +rV +zJ +zJ +qV +ND +zt +zJ +zJ +lF +sJ +Ka +Ia +Ac +dv +kY +BH +IA +zJ +Wf +Vl +Vl +Vl +Vl +Vl +EC +dB +dB +dB +dB +zJ +jw +jw +"} +(20,1,1) = {" +jw +rV +zJ +Za +Za +Za +zJ +zJ +zJ +zJ +zJ +Ia +Vl +dv +zJ +zJ +zJ +zJ +Es +Vl +Sm +DZ +Ps +Vl +vT +zJ +zJ +zJ +zJ +zJ +jw +jw +"} +(21,1,1) = {" +jw +jw +jw +jw +rV +rV +rV +zJ +Yo +JX +zJ +Ia +uq +dv +zJ +sn +AQ +zJ +su +Vl +pH +zx +Mi +Vl +eE +zJ +rV +rV +rV +jw +jw +jw +"} +(22,1,1) = {" +jw +jw +vq +jw +jw +vq +rV +zJ +gM +sJ +Ka +Ia +UH +dv +Ka +sJ +lF +zJ +IJ +iV +Vl +Vl +Vl +oy +Bu +zJ +rV +rV +jw +jw +jw +jw +"} +(23,1,1) = {" +jw +jw +vq +rV +rV +vq +jw +zJ +zJ +zJ +zJ +Ia +Vl +dv +zJ +zJ +zJ +zJ +Bc +Iz +DN +El +GY +oN +hA +zJ +rV +jw +jw +jw +jw +jw +"} +(24,1,1) = {" +jw +fA +Sh +Sh +Sh +Sh +Sh +zJ +Yr +LY +zJ +Ia +Ac +dv +zJ +is +gH +zJ +zJ +Za +Za +zJ +Za +Za +zJ +zJ +jw +jw +jw +jw +jw +jw +"} +(25,1,1) = {" +jw +rV +vq +rV +rV +vq +jw +zJ +lF +fm +Ka +zw +Ur +Lt +Ka +sJ +lF +zJ +rV +rV +jw +Sh +rV +jw +jw +jw +jw +jw +jw +jw +jw +jw +"} +(26,1,1) = {" +jw +jw +vq +jw +jw +vq +rV +zJ +Za +zJ +zJ +zJ +Za +zJ +zJ +zJ +Za +zJ +rV +vq +vq +Sh +vq +vq +jw +jw +jw +jw +jw +jw +jw +jw +"} +(27,1,1) = {" +jw +jw +jw +jw +jw +jw +rV +rV +rV +rV +rV +jw +jw +jw +jw +rV +rV +rV +rV +jw +rV +Sh +rV +jw +jw +jw +jw +jw +jw +jw +jw +jw +"} +(28,1,1) = {" +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +rV +Sh +rV +jw +jw +jw +jw +jw +jw +jw +jw +jw +"} +(29,1,1) = {" +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +vq +vq +Sh +vq +vq +jw +jw +jw +jw +jw +jw +jw +jw +"} +(30,1,1) = {" +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +rV +TZ +rV +jw +jw +jw +jw +jw +jw +jw +jw +jw +"} +(31,1,1) = {" +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +rV +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +"} +(32,1,1) = {" +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +jw +"} diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 00961dbd7f5d6..2087d98e0ee5f 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -41227,9 +41227,9 @@ /turf/open/floor/iron/dark/small, /area/station/security/checkpoint/customs) "ohN" = ( -/obj/item/kirbyplants/random, /obj/item/radio/intercom/directional/north, /obj/machinery/firealarm/directional/west, +/obj/machinery/vending/cytopro, /turf/open/floor/iron/white, /area/station/science/cytology) "oig" = ( @@ -52468,6 +52468,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, +/obj/item/kirbyplants/random, /turf/open/floor/iron/white, /area/station/science/cytology) "rYx" = ( @@ -53177,6 +53178,7 @@ name = "Detective Requests Console" }, /obj/machinery/light/small/directional/west, +/obj/structure/detectiveboard/directional/west, /turf/open/floor/wood, /area/station/security/detectives_office) "smf" = ( diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 8959abab5589d..39d7cd24bdd2e 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -24906,6 +24906,7 @@ /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 1 }, +/obj/machinery/vending/cytopro, /turf/open/floor/iron, /area/station/science/xenobiology) "gfR" = ( diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index b88647d4934a0..a47e7176c77eb 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -293,6 +293,7 @@ dir = 8 }, /obj/machinery/status_display/ai/directional/north, +/obj/structure/closet/secure_closet/cytology, /turf/open/floor/iron/smooth_large, /area/station/science/cytology) "afz" = ( @@ -5684,7 +5685,6 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/item/trash/waffles, /turf/open/floor/plating, /area/station/maintenance/port/aft) "bGm" = ( @@ -69816,7 +69816,7 @@ /area/icemoon/underground/explored) "uNH" = ( /obj/structure/railing, -/obj/structure/closet/secure_closet/cytology, +/obj/machinery/vending/cytopro, /turf/open/floor/iron/smooth_large, /area/station/science/cytology) "uNV" = ( @@ -73744,6 +73744,7 @@ pixel_x = -5 }, /obj/structure/cable, +/obj/structure/detectiveboard/directional/west, /turf/open/floor/carpet, /area/station/security/detectives_office) "vZS" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index a719ae4c67114..a3b90c665b221 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -20128,7 +20128,6 @@ /area/station/cargo/sorting) "hlj" = ( /obj/structure/table/wood, -/obj/structure/secure_safe/directional/east, /obj/machinery/computer/security/wooden_tv{ pixel_x = 3; pixel_y = 2 @@ -20138,6 +20137,7 @@ name = "detective's office shutters control"; req_access = list("detective") }, +/obj/structure/detectiveboard/directional/east, /turf/open/floor/carpet, /area/station/security/detectives_office) "hlq" = ( @@ -26583,13 +26583,13 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmos) "juH" = ( -/obj/item/kirbyplants/random, /obj/machinery/firealarm/directional/west{ pixel_y = -9 }, /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 8 }, +/obj/machinery/vending/cytopro, /turf/open/floor/iron/white, /area/station/science/cytology) "juJ" = ( @@ -50063,6 +50063,11 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) +"rJh" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/secure_safe/directional/west, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office) "rJk" = ( /obj/machinery/door/airlock{ name = "Theater Backstage" @@ -54523,6 +54528,7 @@ /obj/machinery/atmospherics/components/binary/pump{ dir = 4 }, +/obj/item/kirbyplants/random, /turf/open/floor/iron/white, /area/station/science/cytology) "tmq" = ( @@ -99518,7 +99524,7 @@ sWV sWV sWV qJb -fEn +rJh hME olw olw diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index b4168c7d54d93..0d591a0ea0e1b 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -34444,6 +34444,7 @@ dir = 8 }, /obj/item/radio/intercom/directional/north, +/obj/structure/detectiveboard/directional/east, /turf/open/floor/carpet, /area/station/security/detectives_office) "iWW" = ( @@ -52447,6 +52448,7 @@ }, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/vending/cytopro, /turf/open/floor/iron, /area/station/science/cytology) "nxm" = ( diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 6c38b33783521..dfab71ec7974e 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -10,16 +10,22 @@ /turf/open/space, /area/space/nearstation) "ad" = ( -/turf/closed/wall/r_wall, -/area/station/maintenance/department/bridge) +/obj/effect/turf_decal/stripes/line, +/obj/structure/transit_tube/horizontal, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "ae" = ( /obj/structure/lattice, /obj/structure/grille, /turf/open/space, /area/space/nearstation) "af" = ( -/turf/open/floor/plating, -/area/station/maintenance/department/bridge) +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/transit_tube/crossing/horizontal, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "ag" = ( /turf/closed/wall/r_wall, /area/station/security/brig) @@ -129,13 +135,7 @@ /turf/open/floor/iron, /area/station/engineering/main) "aX" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Gravity Generator" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/iron/dark, +/turf/open/floor/iron, /area/station/engineering/gravity_generator) "aY" = ( /obj/machinery/light/directional/east, @@ -318,9 +318,9 @@ /turf/open/floor/iron, /area/station/security/brig) "bY" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/maintenance/department/bridge) +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "bZ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -593,6 +593,13 @@ }, /turf/open/floor/iron, /area/station/construction) +"dN" = ( +/obj/machinery/navbeacon{ + location = "1-Southwest"; + codes_txt = "patrol;next_patrol=2-Northwest" + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "dP" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -1090,8 +1097,7 @@ /area/station/security/brig) "gW" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/radiation/rad_area/directional/north, -/turf/open/floor/plating, +/turf/closed/wall/r_wall, /area/station/engineering/gravity_generator) "hm" = ( /obj/machinery/airalarm/directional/west, @@ -1116,6 +1122,13 @@ }, /turf/open/floor/iron, /area/station/medical/chemistry) +"hS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/transit_tube/station, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "ii" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -1307,6 +1320,13 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"pY" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=1-Southwest"; + location = "4-Southeast" + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "pZ" = ( /obj/machinery/light/directional/north, /obj/machinery/camera/directional/north, @@ -1327,6 +1347,13 @@ /obj/effect/turf_decal/stripes/full, /turf/open/floor/iron/dark, /area/station/cargo/storage) +"qq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/transit_tube/station/reverse, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "qv" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -1351,6 +1378,14 @@ "qQ" = ( /turf/open/floor/engine, /area/station/cargo/miningoffice) +"qR" = ( +/obj/effect/landmark/start, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + location = "Center" + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "rh" = ( /obj/machinery/door/airlock, /obj/structure/cable, @@ -1486,6 +1521,12 @@ /obj/machinery/door/airlock, /turf/open/floor/plating, /area/station/commons/storage/primary) +"vw" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Gravity Generator" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "vy" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -1562,9 +1603,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"wR" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=3-Northeast"; + location = "2-Northwest" + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "wU" = ( /turf/closed/wall/r_wall, /area/station/science/explab) +"xq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/transit_tube/station/dispenser/reverse/flipped, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "xD" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/blue/half/contrasted, @@ -2011,6 +2066,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) +"JJ" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=4-Southeast"; + location = "3-Northeast" + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "JV" = ( /obj/machinery/camera/autoname/directional/east, /obj/effect/turf_decal/stripes/line{ @@ -2040,9 +2102,17 @@ /turf/open/floor/plating, /area/station/engineering/atmos) "Lb" = ( -/obj/machinery/door/airlock, -/turf/open/floor/plating, -/area/station/medical/medbay) +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/transit_tube/station/reverse/flipped{ + dir = 1 + }, +/obj/structure/transit_tube_pod{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "Lq" = ( /obj/effect/turf_decal/stripes/full, /obj/machinery/door/airlock/external/glass/ruin{ @@ -2243,6 +2313,13 @@ }, /turf/open/floor/iron/white/corner, /area/station/medical/medbay) +"Qi" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/transit_tube/station/dispenser/reverse{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "Qu" = ( /obj/docking_port/stationary/mining_home{ dir = 8 @@ -2305,6 +2382,7 @@ dir = 5 }, /obj/structure/closet/radiation, +/obj/structure/sign/warning/radiation/rad_area/directional/north, /turf/open/floor/iron, /area/station/engineering/gravity_generator) "RD" = ( @@ -2382,9 +2460,6 @@ /obj/machinery/door/airlock/engineering/glass{ name = "Gravity Generator" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron, @@ -7355,14 +7430,14 @@ bE cS qv dJ +wR dJ dJ dJ dJ dJ dJ -dJ -dJ +dN dJ dJ cS @@ -7520,8 +7595,8 @@ aa aa aa aa -ad -ad +ak +ak ak ak ak @@ -7612,8 +7687,8 @@ aa aa aa aa -ad -af +aa +aa ak Va Bp @@ -7704,13 +7779,13 @@ aa aa aa aa -bY -af +aa +aa ak Rx -bh -bh -bh +aX +aX +aX br ak bS @@ -7726,7 +7801,7 @@ dt dJ dD dJ -dI +qR dJ XZ dJ @@ -7796,14 +7871,14 @@ aa aa aa aa -ad -af +aa +aa ak gW -aI +Lb aX -aI -aI +Qi +ak ak Ly EX @@ -7888,14 +7963,14 @@ aa aa aa aa -ad +aa +aa +aa +aI af -ak -av -av -av -av -av +aX +ad +aI by by ck @@ -7980,14 +8055,14 @@ aa aa aa aa -ad +aa +aa +aa +aI af -ak -av -MN -MN -MN -av +aX +ad +aI by Ot cl @@ -8072,14 +8147,14 @@ aa aa aa aa -ad +aa +aa +aa +aI af -ak -dT -MN -av -Jp -av +aX +ad +aI by DD cm @@ -8091,14 +8166,14 @@ Sj by jk dJ -dJ +JJ dJ dJ yl dJ dJ dJ -dJ +pY dJ dJ cS @@ -8164,14 +8239,14 @@ aa aa aa aa -ad +aa +aa +aa +aI af -ak -av -MN -MN -MN -av +aX +ad +aI by ER cm @@ -8256,14 +8331,14 @@ aa aa aa aa -ad +aa +aa +aa +aI af -ak -av -av -aY -av -av +bY +ad +aI by jZ cm @@ -8348,14 +8423,14 @@ aa aa aa aa -ad +aa +aa +aa +aI af -ak -ak -ak -ak -ak -ak +aX +ad +aI by er cm @@ -8440,15 +8515,15 @@ aa aa aa aa -ad -af -af -af -af -af -af +aa +aa +aa +aI af -Lb +aX +ad +aI +by wk PK PK @@ -8532,14 +8607,14 @@ aa aa aa aa +aa +aa +aa +aI +af +aX ad -ad -ad -ad -ad -ad -ad -ad +aI by by by @@ -8627,11 +8702,11 @@ aa fg fg fg -fg -fg -fg -fg -fg +aI +af +aX +ad +aI aa aa ck @@ -8719,11 +8794,11 @@ aa aa aa aa -aa -aa -aa -aa -aa +aI +hS +bY +ad +aI aa aa ck @@ -8811,11 +8886,11 @@ aa aa aa aa -aa -aa -aa -aa -aa +aI +af +aX +ad +aI aa aa by @@ -8903,11 +8978,11 @@ aa aa aa aa -aa -aa -aa -aa -aa +aI +af +aX +ad +aI aa aa aa @@ -8995,11 +9070,11 @@ aa aa aa aa -aa -aa -aa -aa -aa +aI +af +aX +ad +aI aa aa aa @@ -9087,11 +9162,11 @@ aa aa aa aa -aa -aa -aa -aa -aa +aI +af +aX +ad +aI aa aa aa @@ -9179,11 +9254,11 @@ aa aa aa aa -aa -aa -aa -aa -aa +aI +af +bY +ad +aI aa aa aa @@ -9271,11 +9346,11 @@ aa aa aa aa -aa -aa -aa -aa -aa +aI +af +aX +ad +aI aa aa aa @@ -9363,11 +9438,11 @@ aa aa aa aa -aa -aa -aa -aa -aa +aI +af +aX +ad +aI aa aa aa @@ -9455,11 +9530,11 @@ aa aa aa aa -aa -aa -aa -aa -aa +aI +af +aX +ad +aI aa aa aa @@ -9547,11 +9622,11 @@ aa aa aa aa -aa -aa -aa -aa -aa +aI +af +aX +ad +aI aa aa aa @@ -9639,11 +9714,11 @@ aa aa aa aa -aa -aa -aa -aa -aa +ak +qq +bh +xq +ak aa aa aa @@ -9730,13 +9805,13 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa +ak +ak +aI +vw +aI +ak +ak aa aa aa @@ -9822,13 +9897,13 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa +ak +av +av +av +av +av +ak aa aa aa @@ -9914,13 +9989,13 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa +ak +av +MN +MN +MN +av +ak aa aa aa @@ -10006,13 +10081,13 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa +ak +dT +MN +av +Jp +av +ak aa aa aa @@ -10098,13 +10173,13 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa +ak +av +MN +MN +MN +av +ak aa aa aa @@ -10190,13 +10265,13 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa +ak +av +av +aY +av +av +ak aa aa aa @@ -10282,13 +10357,13 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa +ak +ak +ak +ak +ak +ak +ak aa aa aa diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 1d1e21590b7e2..283ffc887bd84 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -196,13 +196,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) -"aV" = ( -/obj/structure/table/wood, -/obj/item/clipboard, -/obj/item/radio/headset/headset_cent, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) "aW" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -712,10 +705,21 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/admin) -"de" = ( -/obj/effect/landmark/start/new_player, -/turf/closed/indestructible/start_area, -/area/misc/start) +"df" = ( +/obj/structure/table/wood, +/obj/item/clipboard, +/obj/item/folder/red, +/obj/item/stamp/denied{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/stamp{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stamp/centcom, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/admin) "dh" = ( /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ dir = 4 @@ -785,6 +789,20 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) +"ds" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/centcom{ + name = "CentCom Security" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/admin/general, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) "dv" = ( /obj/structure/railing/corner{ dir = 8 @@ -1111,6 +1129,13 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) +"fb" = ( +/obj/machinery/flasher{ + id = "tdomeflash"; + name = "Thunderdome Flash" + }, +/turf/open/floor/circuit/green, +/area/centcom/tdome/arena) "fc" = ( /obj/effect/turf_decal/delivery, /obj/effect/light_emitter/thunderdome, @@ -1175,17 +1200,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) -"fy" = ( -/obj/structure/signpost/salvation{ - icon = 'icons/obj/structures.dmi'; - icon_state = "ladder10"; - invisibility = 100 - }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0 - }, -/area/awaymission/errorroom) "fA" = ( /obj/machinery/vending/cola, /obj/effect/turf_decal/delivery, @@ -1283,9 +1297,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/evacuation/ship) -"fX" = ( -/turf/closed/indestructible/start_area, -/area/misc/start) "fZ" = ( /obj/effect/landmark/ctf, /turf/open/space/basic, @@ -1322,11 +1333,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) -"gh" = ( -/turf/closed/indestructible/fakedoor{ - name = "Thunderdome Admin" - }, -/area/centcom/tdome/administration) "gi" = ( /obj/docking_port/stationary{ dir = 4; @@ -1480,6 +1486,19 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) +"gY" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/centcom{ + name = "CentCom" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) "gZ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -1663,6 +1682,13 @@ /obj/item/soap/nanotrasen, /turf/open/floor/iron/white, /area/centcom/tdome/observation) +"ig" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/taperecorder, +/obj/item/book/manual/wiki/security_space_law, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/ferry) "ih" = ( /obj/structure/bookcase/random, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -1778,11 +1804,6 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) -"iB" = ( -/turf/closed/indestructible/fakedoor{ - name = "CentCom Cell" - }, -/area/centcom/central_command_areas/prison/cells) "iC" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks/beer{ @@ -2412,10 +2433,7 @@ "lb" = ( /obj/structure/table/wood, /obj/machinery/door/window/left/directional/south, -/obj/item/radio/intercom{ - desc = "Talk smack through this."; - syndie = 1 - }, +/obj/item/radio/intercom/syndicate, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/courtroom) "lc" = ( @@ -2428,10 +2446,7 @@ /area/centcom/central_command_areas/courtroom) "ld" = ( /obj/structure/table/wood, -/obj/item/radio/intercom{ - desc = "Talk smack through this."; - syndie = 1 - }, +/obj/item/radio/intercom/syndicate, /obj/machinery/door/window/brigdoor/right/directional/south{ name = "CentCom Stand"; req_access = list("cent_captain") @@ -2600,10 +2615,8 @@ /obj/structure/chair{ dir = 8 }, -/obj/item/radio/intercom{ - desc = "Talk smack through this."; - pixel_x = -32; - syndie = 1 +/obj/item/radio/intercom/syndicate{ + pixel_x = -32 }, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/courtroom) @@ -2669,10 +2682,7 @@ /area/centcom/central_command_areas/courtroom) "mn" = ( /obj/structure/table/wood, -/obj/item/radio/intercom{ - desc = "Talk smack through this."; - syndie = 1 - }, +/obj/item/radio/intercom/syndicate, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/courtroom) "mo" = ( @@ -2905,6 +2915,11 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/fore) +"nz" = ( +/obj/structure/table/reinforced, +/obj/machinery/fax/admin, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/briefing) "nA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -3766,6 +3781,13 @@ /obj/effect/turf_decal/tile/dark_blue/fourcorners, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) +"rr" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/clipboard, +/obj/item/radio/headset/headset_cent, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "rs" = ( /obj/effect/landmark/prisonwarp, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -3811,6 +3833,10 @@ /obj/effect/turf_decal/siding/wood/corner, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/evacuation/ship) +"rA" = ( +/obj/effect/landmark/start/new_player, +/turf/cordon, +/area/misc/start) "rB" = ( /obj/structure/table/reinforced, /obj/item/storage/fancy/donut_box, @@ -4370,20 +4396,6 @@ /obj/structure/sign/poster/contraband/syndicate_recruitment/directional/north, /turf/open/indestructible/dark, /area/centcom/central_command_areas/admin) -"ub" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/centcom{ - name = "CentCom" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) "uc" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -4417,6 +4429,20 @@ /obj/structure/flora/bush/generic/style_random, /turf/open/floor/grass, /area/centcom/central_command_areas/prison) +"uk" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/centcom{ + name = "CentCom" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/all/admin/general, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) "ul" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/yellow/corner{ @@ -4473,18 +4499,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) -"uz" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 25; - height = 50; - json_key = "emergency"; - name = "CentCom Emergency Shuttle Dock"; - shuttle_id = "emergency_away"; - width = 50 - }, -/turf/open/space, -/area/space) "uA" = ( /obj/structure/chair{ dir = 4 @@ -4948,20 +4962,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) -"wu" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/centcom{ - name = "CentCom Security" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/turf/open/floor/iron, -/area/centcom/central_command_areas/ferry) "wv" = ( /obj/machinery/door/poddoor/shutters{ id = "XCCFerry"; @@ -5038,19 +5038,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/control) -"wJ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/centcom{ - name = "CentCom" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) "wK" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -5473,6 +5460,21 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) +"yR" = ( +/obj/item/clipboard, +/obj/item/folder/red, +/obj/item/stamp/denied{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/stamp{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/structure/table/reinforced, +/obj/item/stamp/centcom, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/briefing) "yS" = ( /obj/structure/table/reinforced, /obj/item/storage/box/emps, @@ -5483,19 +5485,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) -"yU" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/centcom{ - name = "CentCom" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) "yV" = ( /obj/docking_port/stationary{ dir = 8; @@ -5755,6 +5744,19 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/two) +"zO" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Red Team"; + network = list("thunder"); + pixel_x = 11; + pixel_y = -9; + resistance_flags = 64 + }, +/obj/effect/landmark/thunderdome/two, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "zR" = ( /obj/structure/closet/secure_closet/personal, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -6641,19 +6643,6 @@ /obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/centcom/tdome/arena) -"DT" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Green Team"; - network = list("thunder"); - pixel_x = 12; - pixel_y = -10; - resistance_flags = 64 - }, -/obj/effect/landmark/thunderdome/one, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/light_emitter/thunderdome, -/turf/open/floor/iron, -/area/centcom/tdome/arena) "DU" = ( /obj/item/kirbyplants/organic/plant21, /obj/effect/turf_decal/stripes/line, @@ -6751,6 +6740,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) +"EA" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/centcom{ + name = "CentCom" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/evacuation) "EB" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 8 @@ -6947,6 +6949,17 @@ /obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/centcom/tdome/arena) +"FM" = ( +/obj/structure/signpost/salvation{ + icon = 'icons/obj/structures.dmi'; + icon_state = "ladder10"; + invisibility = 100 + }, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0 + }, +/area/awaymission/errorroom) "FO" = ( /obj/structure/table/reinforced, /obj/item/computer_disk/quartermaster, @@ -6962,6 +6975,11 @@ /obj/effect/light_emitter/podbay, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/pod_storage) +"FU" = ( +/turf/closed/indestructible/fakedoor{ + name = "Thunderdome Admin" + }, +/area/centcom/tdome/administration) "FX" = ( /obj/machinery/computer/auxiliary_base/directional/north, /obj/structure/table/reinforced, @@ -6976,12 +6994,6 @@ }, /turf/open/floor/iron, /area/centcom/tdome/observation) -"Ga" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/fax, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/ferry) "Gb" = ( /obj/effect/light_emitter/thunderdome, /turf/closed/indestructible/fakeglass, @@ -7359,6 +7371,19 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) +"Im" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/centcom{ + name = "CentCom" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) "Io" = ( /obj/docking_port/stationary{ dir = 8; @@ -7402,6 +7427,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) +"IF" = ( +/turf/closed/indestructible/fakedoor{ + name = "CentCom Cell" + }, +/area/centcom/central_command_areas/prison/cells) "IK" = ( /obj/structure/closet/secure_closet/ert_sec, /obj/effect/turf_decal/stripes/line{ @@ -7440,13 +7470,6 @@ "Ji" = ( /turf/open/floor/circuit/green, /area/centcom/tdome/arena) -"Jj" = ( -/obj/machinery/flasher{ - id = "tdomeflash"; - name = "Thunderdome Flash" - }, -/turf/open/floor/circuit/green, -/area/centcom/tdome/arena) "Jl" = ( /obj/item/kirbyplants/organic/plant21, /obj/effect/turf_decal/tile/green/anticorner/contrasted, @@ -7523,17 +7546,6 @@ }, /turf/open/floor/iron, /area/centcom/tdome/observation) -"Ke" = ( -/obj/item/clipboard, -/obj/item/folder/red, -/obj/item/stamp/denied{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stamp, -/obj/structure/table/reinforced, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/briefing) "Kf" = ( /obj/machinery/door/airlock/centcom{ name = "Administrative Storage" @@ -7556,6 +7568,20 @@ }, /turf/open/floor/iron/white, /area/centcom/tdome/observation) +"Kv" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/centcom{ + name = "CentCom Security" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/all/admin/general, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) "KA" = ( /obj/effect/landmark/thunderdome/two, /obj/effect/turf_decal/stripes/line{ @@ -7654,6 +7680,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) +"KW" = ( +/obj/machinery/keycard_auth/wall_mounted/directional/south, +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/machinery/button/door/indestructible{ + id = "XCCFerry"; + name = "Hanger Bay Shutters"; + pixel_y = -38 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/ferry) "KZ" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -8233,6 +8271,27 @@ /obj/machinery/light/directional/south, /turf/open/floor/wood, /area/centcom/central_command_areas/admin) +"NN" = ( +/obj/machinery/keycard_auth/wall_mounted/directional/south, +/obj/structure/table/reinforced, +/obj/item/stack/package_wrap{ + pixel_y = 11; + pixel_x = -16 + }, +/obj/item/stack/cable_coil{ + pixel_y = 4; + pixel_x = -10 + }, +/obj/item/hand_labeler{ + pixel_y = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/hand_labeler_refill{ + pixel_x = 8; + pixel_y = 12 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/supply) "NO" = ( /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supplypod) @@ -8319,19 +8378,6 @@ /obj/machinery/light/floor, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) -"Oj" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/centcom{ - name = "CentCom" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) "Om" = ( /obj/structure/table/reinforced, /obj/item/clipboard, @@ -8788,19 +8834,6 @@ "PW" = ( /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/three) -"PX" = ( -/obj/structure/table/reinforced, -/obj/item/folder/red{ - pixel_x = -2; - pixel_y = -2 - }, -/obj/item/folder/blue{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/lighter, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/briefing) "PY" = ( /obj/structure/closet/crate/bin, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -9216,6 +9249,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) +"RQ" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Green Team"; + network = list("thunder"); + pixel_x = 12; + pixel_y = -10; + resistance_flags = 64 + }, +/obj/effect/landmark/thunderdome/one, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "RR" = ( /obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -9580,6 +9626,9 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) +"TJ" = ( +/turf/cordon, +/area/misc/start) "TK" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -9592,27 +9641,6 @@ /obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/centcom/tdome/arena) -"TO" = ( -/obj/machinery/keycard_auth/wall_mounted/directional/south, -/obj/structure/table/reinforced, -/obj/item/stack/package_wrap{ - pixel_y = 11; - pixel_x = -16 - }, -/obj/item/stack/cable_coil{ - pixel_y = 4; - pixel_x = -10 - }, -/obj/item/hand_labeler{ - pixel_y = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/hand_labeler_refill{ - pixel_x = 8; - pixel_y = 12 - }, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supply) "TS" = ( /obj/structure/table/wood, /obj/item/dice/d20{ @@ -9784,19 +9812,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, /area/centcom/tdome/observation) -"UE" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Red Team"; - network = list("thunder"); - pixel_x = 11; - pixel_y = -9; - resistance_flags = 64 - }, -/obj/effect/landmark/thunderdome/two, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/light_emitter/thunderdome, -/turf/open/floor/iron, -/area/centcom/tdome/arena) "UH" = ( /obj/machinery/light/directional/west, /obj/structure/closet/secure_closet/personal, @@ -10246,27 +10261,11 @@ /obj/machinery/computer/station_alert{ dir = 8 }, -/obj/item/radio/intercom{ - desc = "Talk smack through this."; - pixel_x = 28; - syndie = 1 +/obj/item/radio/intercom/syndicate{ + pixel_x = 28 }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) -"WQ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/centcom{ - name = "CentCom Security" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/turf/open/floor/iron, -/area/centcom/central_command_areas/ferry) "WR" = ( /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) @@ -10388,18 +10387,6 @@ "Xq" = ( /turf/open/floor/wood, /area/centcom/central_command_areas/admin) -"Xr" = ( -/obj/machinery/keycard_auth/wall_mounted/directional/south, -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/machinery/button/door/indestructible{ - id = "XCCFerry"; - name = "Hanger Bay Shutters"; - pixel_y = -38 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/ferry) "Xs" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, @@ -10503,17 +10490,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/centcom/central_command_areas/supplypod) -"XV" = ( -/obj/structure/table/wood, -/obj/item/clipboard, -/obj/item/folder/red, -/obj/item/stamp/denied{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stamp, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) "Ya" = ( /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/armory) @@ -10925,20 +10901,20 @@ /area/centcom/central_command_areas/supply) (1,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ gu aa aa @@ -11182,21 +11158,21 @@ aa aa "} (2,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ aa aa aa @@ -11439,21 +11415,21 @@ LV aa "} (3,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ aa aa aa @@ -11696,21 +11672,21 @@ LV aa "} (4,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ aa aa aa @@ -11953,21 +11929,21 @@ LV aa "} (5,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ aa aa aa @@ -12210,21 +12186,21 @@ LV aa "} (6,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ aa aa aa @@ -12467,21 +12443,21 @@ LV aa "} (7,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ aa aa aa @@ -12724,21 +12700,21 @@ LV aa "} (8,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -de -fX -fX -fX -fX -fX -fX -fX +TJ +TJ +TJ +TJ +TJ +TJ +TJ +rA +TJ +TJ +TJ +TJ +TJ +TJ +TJ aa aa aa @@ -12981,21 +12957,21 @@ LV aa "} (9,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ aa aa aa @@ -13232,27 +13208,27 @@ zi ik ik ZE -fy +FM LW LV aa "} (10,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ aa aa aa @@ -13495,21 +13471,21 @@ LV aa "} (11,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ aa aa aa @@ -13752,21 +13728,21 @@ LV aa "} (12,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ aa aa aa @@ -14009,21 +13985,21 @@ LV aa "} (13,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ aa aa aa @@ -14266,21 +14242,21 @@ LV aa "} (14,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ aa aa aa @@ -14523,21 +14499,21 @@ LV aa "} (15,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ aa aa aa @@ -14780,21 +14756,21 @@ LV aa "} (16,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ aa aa aa @@ -15037,21 +15013,21 @@ LV aa "} (17,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ +TJ aa aa aa @@ -45272,7 +45248,7 @@ aa aa aa oe -Ga +ig sq to ZN @@ -45532,7 +45508,7 @@ mD FX sr tp -Xr +KW mD aa oe @@ -47077,9 +47053,9 @@ tu mD mD mD -wu +ds xh -wu +ds mD gO cn @@ -47343,7 +47319,7 @@ WN cb Bu tb -aV +rr ho gO aa @@ -47591,9 +47567,9 @@ dx Hz dd mD -WQ +Kv xh -WQ +Kv mD WO eF @@ -48111,8 +48087,8 @@ fa mD PU eF -PX -Ke +nz +yR eV eF xU @@ -49122,7 +49098,7 @@ vo fP On Zw -XV +df hd To BT @@ -49945,7 +49921,7 @@ Bp Sz Sz uf -gh +FU uf aa aa @@ -50661,7 +50637,7 @@ iF Pg mH nm -TO +NN On Ui JC @@ -51479,7 +51455,7 @@ BY QC bR HK -UE +zO HK HK pb @@ -51960,9 +51936,9 @@ YU YU mD mD -wu +ds xh -wu +ds mD Ya rY @@ -52474,9 +52450,9 @@ iu iu io io -ub +uk mk -ub +uk io io iu @@ -54306,7 +54282,7 @@ Gb Ef NY NY -Jj +fb Jq NY NY @@ -55782,22 +55758,22 @@ aa aa Jb ir -iB +IF YX ir -iB +IF Jb ir -iB +IF Jb ir -iB +IF Jb ir -iB +IF YX ir -iB +IF Jb iH il @@ -56072,9 +56048,9 @@ Fq UO io io -yU +gY mk -yU +gY io io iu @@ -56586,9 +56562,9 @@ io yj io io -Oj +Im mk -Oj +Im io io iu @@ -57133,7 +57109,7 @@ Tf QC dj Mf -DT +RQ Mf Mf Zi @@ -58352,22 +58328,22 @@ aa aa Jb ir -iB +IF YX ir -iB +IF Jb ir -iB +IF Jb ir -iB +IF Jb ir -iB +IF YX ir -iB +IF Jb pc Hv @@ -58642,9 +58618,9 @@ cg cg cg cg -yU +gY GJ -yU +gY cg cg cg @@ -58683,7 +58659,7 @@ Bp Sz Sz uf -gh +FU uf aa aa @@ -59156,9 +59132,9 @@ cg cg cg cg -wJ +EA GJ -wJ +EA cg cg cg @@ -63780,7 +63756,7 @@ aa aa aa aa -uz +ad aa aa aa diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 469e5ec80fb3d..bcf24651157e8 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -44474,8 +44474,8 @@ /turf/closed/wall/r_wall, /area/station/engineering/supermatter) "oMh" = ( -/obj/structure/secure_safe/directional/east, /obj/machinery/airalarm/directional/north, +/obj/structure/detectiveboard/directional/east, /turf/open/floor/carpet, /area/station/security/detectives_office) "oMz" = ( @@ -47957,6 +47957,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 }, +/obj/machinery/vending/cytopro, /turf/open/floor/iron/white, /area/station/science/xenobiology) "pWC" = ( @@ -59837,6 +59838,7 @@ pixel_x = -23; pixel_y = 8 }, +/obj/structure/secure_safe/directional/south, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) "udZ" = ( diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index fa4ea9e4b3263..47ed0380935d8 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -8832,6 +8832,7 @@ "diI" = ( /obj/machinery/light/small/directional/north, /obj/machinery/computer/security, +/obj/structure/detectiveboard/directional/north, /turf/open/floor/carpet, /area/station/security/detectives_office) "diM" = ( @@ -13766,7 +13767,6 @@ "eTu" = ( /obj/effect/turf_decal/tile/neutral, /obj/structure/table, -/obj/item/trash/waffles, /turf/open/floor/iron, /area/station/hallway/primary/central) "eTZ" = ( @@ -21383,6 +21383,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/science/xenobiology) +"hAS" = ( +/obj/machinery/hydroponics/soil, +/obj/effect/decal/cleanable/dirt, +/obj/item/cultivator/rake, +/turf/open/floor/grass, +/area/station/security/prison/garden) "hAV" = ( /obj/structure/table/wood, /obj/item/flashlight/flare/candle{ @@ -24736,6 +24742,7 @@ /obj/machinery/hydroponics/soil, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, +/obj/item/plant_analyzer, /turf/open/floor/grass, /area/station/security/prison/garden) "iNv" = ( @@ -39062,6 +39069,7 @@ /area/station/command/bridge) "nPw" = ( /obj/structure/water_source/puddle, +/obj/item/reagent_containers/cup/watering_can, /turf/open/floor/grass, /area/station/security/prison/garden) "nPM" = ( @@ -46382,6 +46390,10 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/station/maintenance/department/cargo) +"qwB" = ( +/obj/item/shovel/spade, +/turf/open/floor/grass, +/area/station/security/prison/garden) "qwG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -52520,6 +52532,7 @@ /area/station/engineering/atmos) "syF" = ( /obj/effect/landmark/start/prisoner, +/obj/item/plant_analyzer, /turf/open/floor/grass, /area/station/security/prison/garden) "syL" = ( @@ -53709,6 +53722,12 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"sUD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/central/lesser) "sUI" = ( /obj/machinery/door/airlock{ name = "Kitchen Cold Room" @@ -60664,6 +60683,7 @@ /turf/open/floor/iron, /area/station/engineering/lobby) "vqN" = ( +/obj/machinery/vending/cytopro, /turf/open/floor/iron/dark/small, /area/station/science/cytology) "vqY" = ( @@ -82467,7 +82487,7 @@ dUc xrb xrb nPw -dEG +qwB iqf cKn pjt @@ -82979,7 +82999,7 @@ cLf dUc cLf xrb -nEx +hAS syF ckc sqk @@ -83750,7 +83770,7 @@ cLf iUF cLf sNu -nEx +hAS rXZ vjm hbw @@ -93566,7 +93586,7 @@ dTU pMD acc kYl -jUd +sUD dGc fDN enu diff --git a/_maps/safehouses/bathroom.dmm b/_maps/safehouses/bathroom.dmm index 76712d6193c44..69ad0b25e9520 100644 --- a/_maps/safehouses/bathroom.dmm +++ b/_maps/safehouses/bathroom.dmm @@ -27,7 +27,7 @@ dir = 4 }, /obj/machinery/light/small/blacklight/directional/east, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "v" = ( /obj/machinery/light/small/blacklight/directional/east, @@ -68,7 +68,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "M" = ( /obj/effect/decal/cleanable/dirt, diff --git a/_maps/safehouses/den.dmm b/_maps/safehouses/den.dmm index 15debc7e284e6..9b0b37f535150 100644 --- a/_maps/safehouses/den.dmm +++ b/_maps/safehouses/den.dmm @@ -18,7 +18,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "e" = ( /obj/structure/table/reinforced/plastitaniumglass, @@ -59,7 +59,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "z" = ( /obj/effect/turf_decal/trimline/yellow/corner{ diff --git a/_maps/safehouses/dig.dmm b/_maps/safehouses/dig.dmm index 73f0d247dfbe4..aa26f980d6089 100644 --- a/_maps/safehouses/dig.dmm +++ b/_maps/safehouses/dig.dmm @@ -20,7 +20,7 @@ dir = 8 }, /obj/effect/landmark/bitrunning/cache_goal_turf, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "i" = ( /obj/effect/turf_decal/siding/yellow{ @@ -98,7 +98,7 @@ /obj/effect/turf_decal/loading_area, /obj/effect/turf_decal/box/corners, /obj/effect/landmark/bitrunning/cache_goal_turf, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "T" = ( /obj/effect/landmark/bitrunning/hololadder_spawn, diff --git a/_maps/safehouses/ice.dmm b/_maps/safehouses/ice.dmm index 96d689339ab87..f9716de71032f 100644 --- a/_maps/safehouses/ice.dmm +++ b/_maps/safehouses/ice.dmm @@ -60,7 +60,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "p" = ( /obj/structure/railing, @@ -69,7 +69,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "u" = ( /obj/effect/decal/cleanable/dirt/dust, diff --git a/_maps/safehouses/lavaland_boss.dmm b/_maps/safehouses/lavaland_boss.dmm index 7331a5b79d7a0..56141803990a5 100644 --- a/_maps/safehouses/lavaland_boss.dmm +++ b/_maps/safehouses/lavaland_boss.dmm @@ -63,7 +63,7 @@ /obj/machinery/light/directional/east, /obj/structure/railing, /obj/effect/landmark/bitrunning/cache_goal_turf, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "A" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ diff --git a/_maps/safehouses/mine.dmm b/_maps/safehouses/mine.dmm index 904c3c5378e8a..4bf99ab14f3ac 100644 --- a/_maps/safehouses/mine.dmm +++ b/_maps/safehouses/mine.dmm @@ -26,7 +26,7 @@ }, /obj/machinery/light/directional/east, /obj/effect/landmark/bitrunning/cache_goal_turf, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "B" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -52,7 +52,7 @@ }, /obj/structure/railing, /obj/effect/landmark/bitrunning/cache_goal_turf, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "H" = ( /obj/machinery/door/airlock/external/glass{ diff --git a/_maps/safehouses/shuttle.dmm b/_maps/safehouses/shuttle.dmm index 75fe975258c51..19f0c4b73aacc 100644 --- a/_maps/safehouses/shuttle.dmm +++ b/_maps/safehouses/shuttle.dmm @@ -16,7 +16,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/bitrunning/cache_goal_turf, /obj/effect/turf_decal/loading_area, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "i" = ( /obj/effect/turf_decal/stripes/line{ @@ -41,7 +41,7 @@ /obj/machinery/light/small/directional/south, /obj/effect/landmark/bitrunning/cache_goal_turf, /obj/effect/turf_decal/loading_area, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "m" = ( /obj/modular_map_connector, diff --git a/_maps/safehouses/shuttle_space.dmm b/_maps/safehouses/shuttle_space.dmm index 0029f5b0a6e7d..2f4071a834755 100644 --- a/_maps/safehouses/shuttle_space.dmm +++ b/_maps/safehouses/shuttle_space.dmm @@ -67,7 +67,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/bitrunning/cache_goal_turf, /obj/effect/turf_decal/loading_area, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "z" = ( /obj/effect/turf_decal/stripes/line{ @@ -98,7 +98,7 @@ /obj/machinery/light/small/directional/south, /obj/effect/landmark/bitrunning/cache_goal_turf, /obj/effect/turf_decal/loading_area, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "E" = ( /obj/effect/turf_decal/stripes/line{ diff --git a/_maps/safehouses/wood.dmm b/_maps/safehouses/wood.dmm index 05fbb97f915fb..5faa33faa4181 100644 --- a/_maps/safehouses/wood.dmm +++ b/_maps/safehouses/wood.dmm @@ -19,7 +19,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "v" = ( /obj/machinery/light/small/directional/east, @@ -50,7 +50,7 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/safehouse) "T" = ( /obj/effect/landmark/bitrunning/hololadder_spawn, diff --git a/_maps/shuttles/pirate_ex_interdyne.dmm b/_maps/shuttles/pirate_ex_interdyne.dmm index dce984f19c993..4036972b7a87a 100644 --- a/_maps/shuttles/pirate_ex_interdyne.dmm +++ b/_maps/shuttles/pirate_ex_interdyne.dmm @@ -291,7 +291,7 @@ /area/shuttle/pirate) "aS" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/structure/closet/crate/freezer/blood, +/obj/structure/closet/crate/freezer/blood/interdyne, /obj/machinery/light/small/blacklight/directional/south, /obj/machinery/iv_drip, /turf/open/floor/iron/dark, diff --git a/_maps/templates/lazy_templates/ninja_den.dmm b/_maps/templates/lazy_templates/ninja_den.dmm index 88f4bce19d45a..f538a4e509673 100644 --- a/_maps/templates/lazy_templates/ninja_den.dmm +++ b/_maps/templates/lazy_templates/ninja_den.dmm @@ -1567,7 +1567,6 @@ /turf/open/floor/wood/tile, /area/centcom/central_command_areas/holding) "JV" = ( -/obj/structure/closet/secure_closet/freezer/kitchen, /obj/item/food/grown/rice, /obj/item/food/grown/rice, /obj/item/food/grown/rice, @@ -1583,6 +1582,9 @@ /obj/item/food/grown/onion/red, /obj/item/food/grown/onion/red, /obj/item/food/grown/coffee, +/obj/structure/closet/secure_closet/freezer/fridge/open{ + name = "kitchen cabinet" + }, /turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) "Kb" = ( diff --git a/_maps/virtual_domains/island_brawl.dmm b/_maps/virtual_domains/island_brawl.dmm index fa04316b9b626..c9010062f54b1 100644 --- a/_maps/virtual_domains/island_brawl.dmm +++ b/_maps/virtual_domains/island_brawl.dmm @@ -2540,7 +2540,7 @@ /area/virtual_domain) "GD" = ( /obj/effect/landmark/bitrunning/permanent_exit, -/turf/open/floor/bitrunning_transport, +/turf/open/indestructible/bitrunning_transport, /area/virtual_domain/protected_space/fullbright) "GI" = ( /turf/open/floor/iron/dark/textured_large, diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 4756b80f02737..bd1b7933e861a 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -16,8 +16,8 @@ #define MINOR_NEGATIVE 4 -//Mutation classes. Normal being on them, extra being additional mutations with instability and other being stuff you dont want people to fuck with like wizard mutate -/// A mutation that can be activated and deactived by completing a sequence +//Mutation classes. Normal being on them, extra being additional mutations with instability and other being stuff you don't want people to fuck with like wizard mutate +/// A mutation that can be activated and deactivated by completing a sequence #define MUT_NORMAL 1 /// A mutation that is in the mutations tab, and can be given and taken away through though the DNA console. Has a 0 before its name in the mutation section of the dna console #define MUT_EXTRA 2 diff --git a/code/__DEFINES/MC.dm b/code/__DEFINES/MC.dm index 8a658f3913d7d..2de9e7140ad26 100644 --- a/code/__DEFINES/MC.dm +++ b/code/__DEFINES/MC.dm @@ -19,7 +19,7 @@ ///creates a running average of "things elapsed" per time period when you need to count via a smaller time period. ///eg you want an average number of things happening per second but you measure the event every tick (50 milliseconds). -///make sure both time intervals are in the same units. doesnt work if current_duration > total_duration or if total_duration == 0 +///make sure both time intervals are in the same units. doesn't work if current_duration > total_duration or if total_duration == 0 #define MC_AVG_OVER_TIME(average, current, total_duration, current_duration) ((((total_duration) - (current_duration)) / (total_duration)) * (average) + (current)) #define MC_AVG_MINUTES(average, current, current_duration) (MC_AVG_OVER_TIME(average, current, 1 MINUTES, current_duration)) @@ -32,7 +32,7 @@ #define STOP_PROCESSING(Processor, Datum) Datum.datum_flags &= ~DF_ISPROCESSING;Processor.processing -= Datum;Processor.currentrun -= Datum /// Returns true if the MC is initialized and running. -/// Optional argument init_stage controls what stage the mc must have initializted to count as initialized. Defaults to INITSTAGE_MAX if not specified. +/// Optional argument init_stage controls what stage the mc must have initialized to count as initialized. Defaults to INITSTAGE_MAX if not specified. #define MC_RUNNING(INIT_STAGE...) (Master && Master.processing > 0 && Master.current_runlevel && Master.init_stage_completed == (max(min(INITSTAGE_MAX, ##INIT_STAGE), 1))) #define MC_LOOP_RTN_NEWSTAGES 1 @@ -133,3 +133,11 @@ }\ /datum/controller/subsystem/verb_manager/##X/fire() {..() /*just so it shows up on the profiler*/} \ /datum/controller/subsystem/verb_manager/##X + +#define AI_CONTROLLER_SUBSYSTEM_DEF(X) GLOBAL_REAL(SS##X, /datum/controller/subsystem/ai_controllers/##X);\ +/datum/controller/subsystem/ai_controllers/##X/New(){\ + NEW_SS_GLOBAL(SS##X);\ + PreInit();\ +}\ +/datum/controller/subsystem/ai_controllers/##X/fire() {..() /*just so it shows up on the profiler*/} \ +/datum/controller/subsystem/ai_controllers/##X diff --git a/code/__DEFINES/_flags.dm b/code/__DEFINES/_flags.dm index cbc17654078bf..687f5365f6d4a 100644 --- a/code/__DEFINES/_flags.dm +++ b/code/__DEFINES/_flags.dm @@ -25,7 +25,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define NO_SCREENTIPS_1 (1<<2) /// Prevent clicking things below it on the same turf eg. doors/ fulltile windows #define PREVENT_CLICK_UNDER_1 (1<<3) -///specifies that this atom is a hologram that isnt real +///specifies that this atom is a hologram that isn't real #define HOLOGRAM_1 (1<<4) ///Whether /atom/Initialize() has already run for the object #define INITIALIZED_1 (1<<5) @@ -52,7 +52,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 /// Whether or not this atom is storing contents for a disassociated storage object #define HAS_DISASSOCIATED_STORAGE_1 (1<<16) /// If this atom has experienced a decal element "init finished" sourced appearance update -/// We use this to ensure stacked decals don't double up appearance updates for no rasin +/// We use this to ensure stacked decals don't double up appearance updates for no reason /// Flag as an optimization, don't make this a trait without profiling /// Yes I know this is a stupid flag, no you can't take him from me #define DECAL_INIT_UPDATE_EXPERIENCED_1 (1<<17) @@ -81,9 +81,9 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define RICOCHET_HARD (1<<1) //TURF FLAGS -/// If a turf cant be jaunted through. +/// If a turf can't be jaunted through. #define NOJAUNT (1<<0) -/// If a turf is an usused reservation turf awaiting assignment +/// If a turf is an unused reservation turf awaiting assignment #define UNUSED_RESERVATION_TURF (1<<1) /// If a turf is a reserved turf #define RESERVATION_TURF (1<<2) @@ -281,8 +281,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define RELIGION_TOOL_SACRIFICE (1<<1) #define RELIGION_TOOL_SECTSELECT (1<<2) -// ---- Skillchip incompatability flags ---- // -// These flags control which skill chips are compatible with eachother. +// ---- Skillchip incompatibility flags ---- // +// These flags control which skill chips are compatible with each other. // By default, skillchips are incompatible with themselves and multiple of the same istype() cannot be implanted together. Set this flag to disable that check. #define SKILLCHIP_ALLOWS_MULTIPLE (1<<0) // This skillchip is incompatible with other skillchips from the incompatible_category list. diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index 325116eb5b869..7d0f804dc5028 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -326,7 +326,6 @@ ACCESS_PHARMACY, \ ACCESS_PLUMBING, \ ACCESS_PSYCHOLOGY, \ - ACCESS_QM, \ ACCESS_RESEARCH, \ ACCESS_ROBOTICS, \ ACCESS_SCIENCE, \ diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm index 0253df0b57a4d..4f1cf4b746ac6 100644 --- a/code/__DEFINES/achievements.dm +++ b/code/__DEFINES/achievements.dm @@ -57,6 +57,7 @@ #define MEDAL_DEBT_EXTINGUISHED "Debt Extinguished" #define MEDAL_SISYPHUS "Sisyphus" #define MEDAL_ARCHMAGE "Archmage" +#define MEDAL_CIGARETTES "Cigarettes" #define MEDAL_THEORETICAL_LIMITS "All Within Theoretical Limits" //Skill medal hub IDs diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 66f34f5f57b37..74c9120d804d4 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -73,8 +73,8 @@ #define ADMIN_LUAVIEW_CHUNK(state, log_index) "(VIEW CODE)" /// Displays "(SHOW)" in the chat, when clicked it tries to show atom(paper). First you need to set the request_state variable to TRUE for the paper. #define ADMIN_SHOW_PAPER(atom) "(SHOW)" -/// Displays "(PRINT)" in the chat, when clicked it will try to print the atom(paper) on the CentCom fax machine. -#define ADMIN_PRINT_FAX(atom, fax_name) "(PRINT)" +/// Displays "(PRINT)" in the chat, when clicked it will try to print the atom(paper) on the CentCom/Syndicate fax machine. +#define ADMIN_PRINT_FAX(atom, sender, destination) "(PRINT)" /// Displays "(PLAY)" in the chat, when clicked it tries to play internet sounds from the request. #define ADMIN_PLAY_INTERNET(text, credit) "(PLAY)" /// Displays "(SEE Z-LEVEL LAYOUT)" in the chat, when clicked it shows the z-level layouts for the current world state. diff --git a/code/__DEFINES/admin_verb.dm b/code/__DEFINES/admin_verb.dm index 04806e098b2c4..71e0475e5c39c 100644 --- a/code/__DEFINES/admin_verb.dm +++ b/code/__DEFINES/admin_verb.dm @@ -81,7 +81,7 @@ _ADMIN_VERB(verb_path_name, verb_permissions, verb_name, verb_desc, verb_categor #define ADMIN_CATEGORY_FUN "Admin.Fun" #define ADMIN_CATEGORY_GAME "Admin.Game" -// Special categories that are seperated +// Special categories that are separated #define ADMIN_CATEGORY_DEBUG "Debug" #define ADMIN_CATEGORY_SERVER "Server" #define ADMIN_CATEGORY_OBJECT "Object" diff --git a/code/__DEFINES/ai/ai.dm b/code/__DEFINES/ai/ai.dm index 37ee5c077e2a5..73a8f2d1900bd 100644 --- a/code/__DEFINES/ai/ai.dm +++ b/code/__DEFINES/ai/ai.dm @@ -68,7 +68,7 @@ ///macro for whether it's appropriate to resist right now, used by resist subtree #define SHOULD_RESIST(source) (source.on_fire || source.buckled || HAS_TRAIT(source, TRAIT_RESTRAINED) || (source.pulledby && source.pulledby.grab_state > GRAB_PASSIVE)) ///macro for whether the pawn can act, used generally to prevent some horrifying ai disasters -#define IS_DEAD_OR_INCAP(source) (source.incapacitated() || source.stat) +#define IS_DEAD_OR_INCAP(source) (source.incapacitated || source.stat) GLOBAL_LIST_INIT(all_radial_directions, list( "NORTH" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTH), diff --git a/code/__DEFINES/ai/ai_blackboard.dm b/code/__DEFINES/ai/ai_blackboard.dm index 4374288b07c5b..0c682f7d411a8 100644 --- a/code/__DEFINES/ai/ai_blackboard.dm +++ b/code/__DEFINES/ai/ai_blackboard.dm @@ -8,7 +8,7 @@ #define BB_FOOD_TARGET "bb_food_target" ///How close a mob must be for us to select it as a target, if that is less than how far we can maintain it as a target #define BB_AGGRO_RANGE "BB_aggro_range" -///are we hungry? determined by the udder compnent +///are we hungry? determined by the udder component #define BB_CHECK_HUNGRY "BB_check_hungry" ///are we ready to breed? #define BB_BREED_READY "BB_breed_ready" @@ -47,7 +47,7 @@ ///bane ai used by example script #define BB_BANE_BATMAN "BB_bane_batman" -//yep thats it +//yep that's it ///Hunting BB keys #define BB_CURRENT_HUNTING_TARGET "BB_current_hunting_target" @@ -133,6 +133,9 @@ ///Range for a MOD AI controller. #define MOD_AI_RANGE 200 +///Only target mobs with these traits +#define BB_TARGET_ONLY_WITH_TRAITS "BB_target_only_with_traits" + ///should we skip the faction check for the targeting strategy? #define BB_ALWAYS_IGNORE_FACTION "BB_always_ignore_factions" ///are we in some kind of temporary state of ignoring factions when targeting? can result in volatile results if multiple behaviours touch this diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index f94871d10ccfa..159f1da9b45ff 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -165,7 +165,7 @@ GLOBAL_LIST_INIT(syndicate_employers, list( "Waffle Corporation Terrorist", "Waffle Corporation", )) -///employers that are from nanotrasen +///employers that are from Nanotrasen GLOBAL_LIST_INIT(nanotrasen_employers, list( "Champions of Evil", "Corporate Climber", @@ -217,22 +217,28 @@ GLOBAL_LIST_INIT(ai_employers, list( /// Checks if the given mob is a traitor #define IS_TRAITOR(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/traitor)) +/** + * Cult checks + */ + /// Checks if the given mob is a blood cultist -#define IS_CULTIST(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/cult)) +#define IS_CULTIST(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/cult) || HAS_TRAIT(mob, TRAIT_ACT_AS_CULTIST)) + +/// Checks if the given mob is a blood cultist and is guaranteed to return the datum if possible - will cause issues with above trait +#define GET_CULTIST(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/cult)) /// Checks if the mob is a sentient or non-sentient cultist #define IS_CULTIST_OR_CULTIST_MOB(mob) ((IS_CULTIST(mob)) || (mob.faction.Find(FACTION_CULT))) -/// Checks if the given mob is a changeling -#define IS_CHANGELING(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/changeling)) - -/// Checks if the given mob is a nuclear operative -#define IS_NUKE_OP(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/nukeop)) -//Tells whether or not someone is a space ninja -#define IS_SPACE_NINJA(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/ninja)) +/** + * Heretic checks + */ /// Checks if the given mob is a heretic. -#define IS_HERETIC(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic)) +#define IS_HERETIC(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic) || HAS_TRAIT(mob, TRAIT_ACT_AS_HERETIC)) +/// Checks if the given mob is a heretic and is guaranteed to return the datum if possible - will cause issues with above trait +#define GET_HERETIC(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic)) + /// Check if the given mob is a heretic monster. #define IS_HERETIC_MONSTER(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic_monster)) /// Check if the given mob is a lunatic @@ -242,6 +248,19 @@ GLOBAL_LIST_INIT(ai_employers, list( /// CHecks if the given mob is in the mansus realm #define IS_IN_MANSUS(mob) (istype(get_area(mob), /area/centcom/heretic_sacrifice)) +/** + * Etc. + */ + +/// Checks if the given mob is a changeling +#define IS_CHANGELING(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/changeling)) + +/// Checks if the given mob is a nuclear operative +#define IS_NUKE_OP(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/nukeop)) + +//Tells whether or not someone is a space ninja +#define IS_SPACE_NINJA(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/ninja)) + /// Checks if the given mob is a wizard #define IS_WIZARD(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/wizard)) diff --git a/code/__DEFINES/atmospherics/atmos_helpers.dm b/code/__DEFINES/atmospherics/atmos_helpers.dm index ca32e4859809b..d5bcbf51471c4 100644 --- a/code/__DEFINES/atmospherics/atmos_helpers.dm +++ b/code/__DEFINES/atmospherics/atmos_helpers.dm @@ -82,7 +82,7 @@ GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0)) turf.archived_cycle = SSair.times_fired;\ turf.temperature_archived = turf.temperature; -/* Fetch the energy transferred when two gas mixtures's temperature equalize. +/* Fetch the energy transferred when two gas mixtures' temperature equalize. * * To equalize two gas mixtures, we simply pool the energy and divide it by the pooled heat capacity. * T' = (W1+W2) / (C1+C2) @@ -107,7 +107,7 @@ GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0)) * Not immediately obvious, but saves us operation time. * * We put a lot of parentheses here because the numbers get really really big. - * By prioritizing the division we try to tone the number down so we dont get overflows. + * By prioritizing the division we try to tone the number down so we don't get overflows. * * Arguments: * * temperature_delta: T2 - T1. [/datum/gas_mixture/var/temperature] diff --git a/code/__DEFINES/bodyparts.dm b/code/__DEFINES/bodyparts.dm index 8afda278a418b..18d0a3c7cb87c 100644 --- a/code/__DEFINES/bodyparts.dm +++ b/code/__DEFINES/bodyparts.dm @@ -16,7 +16,7 @@ #define LIMB_MAX_HP_ALIEN_CORE 500 //Used by xenomorph chests and heads /// Limb Body Damage Coefficient -/// A mutiplication of the burn and brute damage that the limb's stored damage contributes to its attached mob's overall wellbeing. +/// A multiplication of the burn and brute damage that the limb's stored damage contributes to its attached mob's overall wellbeing. /// For instance, if a limb has 50 damage, and has a coefficient of 50%, the human is considered to have suffered 25 damage to their total health. #define LIMB_BODY_DAMAGE_COEFFICIENT_ADVANCED 0.5 //Used by advanced robotic limbs. diff --git a/code/__DEFINES/cameranets.dm b/code/__DEFINES/cameranets.dm index 935e015e0cda0..3cd0d30660d3b 100644 --- a/code/__DEFINES/cameranets.dm +++ b/code/__DEFINES/cameranets.dm @@ -30,6 +30,7 @@ #define CAMERA_NETWORK_CARGO "cargo" #define CAMERANET_NETWORK_ABDUCTOR "abductor" #define OPERATIVE_CAMERA_NET "operative" +#define CAMERANET_NETWORK_CURATOR "curator" // Ruins/Away missiosn/Misc camera nets #define CAMERANET_NETWORK_MOON19_XENO "mo19x" diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 4c7a9c169623b..60cd3a7b018b7 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -13,14 +13,14 @@ #define OXY "oxygen" /// Exhaustion and nonlethal damage. #define STAMINA "stamina" -/// Brain damage. Should probably be decomissioned and replaced with proper organ damage. +/// Brain damage. Should probably be decommissioned and replaced with proper organ damage. #define BRAIN "brain" //Damage flag defines // /// Involves corrosive substances. #define ACID "acid" -/// Involved in checking wheter a disease can infect or spread. Also involved in xeno neurotoxin. +/// Involved in checking whether a disease can infect or spread. Also involved in xeno neurotoxin. #define BIO "bio" /// Involves a shockwave, usually from an explosion. #define BOMB "bomb" @@ -36,7 +36,7 @@ #define LASER "laser" /// Involves a melee attack or a thrown object. #define MELEE "melee" -/// Involved in checking the likelyhood of applying a wound to a mob. +/// Involved in checking the likelihood of applying a wound to a mob. #define WOUND "wound" #define ARMOR_ALL "all_damage_types" diff --git a/code/__DEFINES/construction/material.dm b/code/__DEFINES/construction/material.dm index 445b4e0dc88e4..57d55ab804281 100644 --- a/code/__DEFINES/construction/material.dm +++ b/code/__DEFINES/construction/material.dm @@ -1,4 +1,4 @@ -//Defines for amount of material retrived from sheets & other items +//Defines for amount of material retrieved from sheets & other items /// The amount of materials you get from a sheet of mineral like iron/diamond/glass etc. 100 Units. #define SHEET_MATERIAL_AMOUNT 100 /// The amount of materials you get from half a sheet. Used in standard object quantities. 50 units. diff --git a/code/__DEFINES/construction/rcd.dm b/code/__DEFINES/construction/rcd.dm index 95c5ab8005323..a8d98215af1dc 100644 --- a/code/__DEFINES/construction/rcd.dm +++ b/code/__DEFINES/construction/rcd.dm @@ -7,7 +7,7 @@ #define RCD_WINDOWGRILLE (1 << 1) /// Windoors & Airlocks #define RCD_AIRLOCK (1 << 2) - /// Literarly anything that is spawned on top of a turf such as tables, machines etc + /// Literally anything that is spawned on top of a turf such as tables, machines etc #define RCD_STRUCTURE (1 << 3) /// For wallmounts like air alarms, fire alarms & apc #define RCD_WALLFRAME (1 << 4) diff --git a/code/__DEFINES/crushing.dm b/code/__DEFINES/crushing.dm index 1261b98e730e8..62705e0e3b871 100644 --- a/code/__DEFINES/crushing.dm +++ b/code/__DEFINES/crushing.dm @@ -8,7 +8,7 @@ #define SUCCESSFULLY_FELL_OVER (1<<2) #define CRUSH_CRIT_SHATTER_LEGS "crush_crit_shatter_legs" -#define CRUSH_CRIT_PARAPALEGIC "crush_crit_parapalegic" +#define CRUSH_CRIT_PARAPLEGIC "crush_crit_paraplegic" #define CRUSH_CRIT_SQUISH_LIMB "crush_crit_pin" #define CRUSH_CRIT_HEADGIB "crush_crit_headgib" #define VENDOR_CRUSH_CRIT_PIN "vendor_crush_crit_pin" diff --git a/code/__DEFINES/database.dm b/code/__DEFINES/database.dm index 3d20b3b9a3cdc..22351b5052d74 100644 --- a/code/__DEFINES/database.dm +++ b/code/__DEFINES/database.dm @@ -4,3 +4,6 @@ #define DB_QUERY_FINISHED 1 /// When there was a problem with the execution of a query. #define DB_QUERY_BROKEN 2 + +///The probability of non-maploaded photos and papers being saved as bottle messages at the end of the round. +#define MESSAGE_BOTTLE_CHANCE 0.2 diff --git a/code/__DEFINES/dcs/flags.dm b/code/__DEFINES/dcs/flags.dm index 9b181e226a9c8..950a37d3c43c8 100644 --- a/code/__DEFINES/dcs/flags.dm +++ b/code/__DEFINES/dcs/flags.dm @@ -30,7 +30,7 @@ #define ELEMENT_DONT_SORT_LIST_ARGS (1<<3) /** * Elements with this flag will be ignored by the dcs_check_list_arguments test. - * A good example is connect_loc, for which it's pratically undoable unless we force every signal proc to have a different name. + * A good example is connect_loc, for which it's practically undoable unless we force every signal proc to have a different name. */ #define ELEMENT_NO_LIST_UNIT_TEST (1<<4) diff --git a/code/__DEFINES/dcs/helpers.dm b/code/__DEFINES/dcs/helpers.dm index df6acffd761a8..01abfac80d4d5 100644 --- a/code/__DEFINES/dcs/helpers.dm +++ b/code/__DEFINES/dcs/helpers.dm @@ -1,5 +1,5 @@ /// Used to trigger signals and call procs registered for that signal -/// The datum hosting the signal is automaticaly added as the first argument +/// The datum hosting the signal is automatically added as the first argument /// Returns a bitfield gathered from all registered procs /// Arguments given here are packaged in a list and given to _SendSignal #define SEND_SIGNAL(target, sigtype, arguments...) ( !target._listen_lookup?[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) ) diff --git a/code/__DEFINES/dcs/signals/signals_action.dm b/code/__DEFINES/dcs/signals/signals_action.dm index 2226e34bcccbd..c6e042a0581d5 100644 --- a/code/__DEFINES/dcs/signals/signals_action.dm +++ b/code/__DEFINES/dcs/signals/signals_action.dm @@ -2,7 +2,7 @@ ///from base of datum/action/proc/Trigger(): (datum/action) #define COMSIG_ACTION_TRIGGER "action_trigger" - // Return to block the trigger from occuring + // Return to block the trigger from occurring #define COMPONENT_ACTION_BLOCK_TRIGGER (1<<0) /// From /datum/action/Grant(): (mob/grant_to) #define COMSIG_ACTION_GRANTED "action_grant" diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm index d75d8bacec73a..24d7cd0b1701a 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm @@ -74,7 +74,7 @@ #define COMSIG_MOVABLE_DISPOSING "movable_disposing" // called when movable is expelled from a disposal pipe, bin or outlet on obj/pipe_eject: (direction) #define COMSIG_MOVABLE_PIPE_EJECTING "movable_pipe_ejecting" -///called when the movable sucessfully has its anchored var changed, from base atom/movable/set_anchored(): (value) +///called when the movable successfully has its anchored var changed, from base atom/movable/set_anchored(): (value) #define COMSIG_MOVABLE_SET_ANCHORED "movable_set_anchored" ///from base of atom/movable/setGrabState(): (newstate) #define COMSIG_MOVABLE_SET_GRAB_STATE "living_set_grab_state" @@ -119,6 +119,9 @@ /// From base of area/Exited(): (area/left, direction) #define COMSIG_MOVABLE_EXITED_AREA "movable_exited_area" +///from base of /atom/movable/point_at: (atom/A, obj/effect/temp_visual/point/point) +#define COMSIG_MOVABLE_POINTED "movable_pointed" + /// Sent to movables when they are being stolen by a spy: (mob/living/spy, datum/spy_bounty/bounty) #define COMSIG_MOVABLE_SPY_STEALING "movable_spy_stealing" /// Called when something is pushed by a living mob bumping it: (mob/living/pusher, push force) diff --git a/code/__DEFINES/dcs/signals/signals_fish.dm b/code/__DEFINES/dcs/signals/signals_fish.dm index 2fbf99446ab94..8af3b8dfca79c 100644 --- a/code/__DEFINES/dcs/signals/signals_fish.dm +++ b/code/__DEFINES/dcs/signals/signals_fish.dm @@ -17,6 +17,12 @@ #define COMSIG_FISH_EATEN_BY_OTHER_FISH "fish_eaten_by_other_fish" ///From /obj/item/fish/feed: (fed_reagents, fed_reagent_type) #define COMSIG_FISH_FED "fish_on_fed" +///from /obj/item/fish/pet_fish +#define COMSIG_FISH_PETTED "fish_petted" +///From /obj/item/fish/update_size_and_weight: (new_size, new_weight) +#define COMSIG_FISH_UPDATE_SIZE_AND_WEIGHT "fish_update_size_and_weight" +///From /obj/item/fish/update_fish_force: (weight_rank, bonus_malus) +#define COMSIG_FISH_FORCE_UPDATED "fish_force_updated" /// Fishing challenge completed #define COMSIG_FISHING_CHALLENGE_COMPLETED "fishing_completed" diff --git a/code/__DEFINES/dcs/signals/signals_food.dm b/code/__DEFINES/dcs/signals/signals_food.dm index 36a8b7b3392cf..113826a448630 100644 --- a/code/__DEFINES/dcs/signals/signals_food.dm +++ b/code/__DEFINES/dcs/signals/signals_food.dm @@ -16,6 +16,9 @@ /// called when an edible ingredient is added: (datum/component/edible/ingredient) #define COMSIG_FOOD_INGREDIENT_ADDED "edible_ingredient_added" +/// from base of /datum/component/edible/get_recipe_complexity(): (list/extra_complexity) +#define COMSIG_FOOD_GET_EXTRA_COMPLEXITY "food_get_extra_complexity" + // Deep frying foods /// An item becomes fried - From /datum/element/fried_item/Attach: (fry_time) #define COMSIG_ITEM_FRIED "item_fried" @@ -31,6 +34,8 @@ #define COMPONENT_MICROWAVE_BAD_RECIPE (1<<1) ///called on item when created through microwaving (): (obj/machinery/microwave/M, cooking_efficiency) #define COMSIG_ITEM_MICROWAVE_COOKED "microwave_cooked" +///called on the ingredient through microwawing: (result) +#define COMSIG_ITEM_MICROWAVE_COOKED_FROM "item_microwave_cooked_from" // Grilling foods (griddle, grill, and bonfire) ///Called when an object is placed onto a griddle @@ -46,6 +51,9 @@ ///Called when an object is turned into another item through grilling ontop of a griddle #define COMSIG_ITEM_GRILLED "item_grill_completed" +///Called when the object is grilled by the grill (not to be confused by the griddle, but oh gee the two should be merged in one) +#define COMSIG_ITEM_BARBEQUE_GRILLED "item_barbeque_grilled" + // Baking foods (oven) //Called when an object is inserted into an oven (atom/oven, mob/baker) #define COMSIG_ITEM_OVEN_PLACED_IN "item_placed_in_oven" diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index 5e9011f5f4075..bda49bb4b4ae6 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -57,7 +57,7 @@ #define COMSIG_GLOB_NEW_MACHINE "!new_machine" /// a client (re)connected, after all /client/New() checks have passed : (client/connected_client) #define COMSIG_GLOB_CLIENT_CONNECT "!client_connect" -/// a weather event of some kind occured +/// a weather event of some kind occurred #define COMSIG_WEATHER_TELEGRAPH(event_type) "!weather_telegraph [event_type]" #define COMSIG_WEATHER_START(event_type) "!weather_start [event_type]" #define COMSIG_WEATHER_WINDDOWN(event_type) "!weather_winddown [event_type]" diff --git a/code/__DEFINES/dcs/signals/signals_mind.dm b/code/__DEFINES/dcs/signals/signals_mind.dm index 72f43f518ebcd..e9a62a26102cf 100644 --- a/code/__DEFINES/dcs/signals/signals_mind.dm +++ b/code/__DEFINES/dcs/signals/signals_mind.dm @@ -6,3 +6,6 @@ /// Called on the mind when an antagonist is being removed, after the antagonist list has updated (datum/antagonist/antagonist) #define COMSIG_ANTAGONIST_REMOVED "antagonist_removed" + +/// Called on the mob when losing an antagonist datum (datum/antagonist/antagonist) +#define COMSIG_MOB_ANTAGONIST_REMOVED "mob_antagonist_removed" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm index 026247acf57ab..16f7e00e78a19 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm @@ -9,3 +9,5 @@ ///Signal sent when a bot is reset #define COMSIG_BOT_RESET "bot_reset" +///Sent off /mob/living/basic/bot/proc/set_mode_flags() : (new_flags) +#define COMSIG_BOT_MODE_FLAGS_SET "bot_mode_flags_set" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm index 051953bd7e508..56d5ddf452471 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm @@ -3,14 +3,14 @@ /// Stops the rest of the help #define COMPONENT_BLOCK_HELP_ACT (1<<0) -///Called from /mob/living/carbon/help_shake_act, before any hugs have ocurred. (mob/living/helper) +///Called from /mob/living/carbon/help_shake_act, before any hugs have occurred. (mob/living/helper) #define COMSIG_CARBON_PRE_MISC_HELP "carbon_pre_misc_help" - /// Stops the rest of help act (hugging, etc) from occuring + /// Stops the rest of help act (hugging, etc) from occurring #define COMPONENT_BLOCK_MISC_HELP (1<<0) -///Called from /mob/living/carbon/help_shake_act on the person being helped, after any hugs have ocurred. (mob/living/helper) +///Called from /mob/living/carbon/help_shake_act on the person being helped, after any hugs have occurred. (mob/living/helper) #define COMSIG_CARBON_HELP_ACT "carbon_help" -///Called from /mob/living/carbon/help_shake_act on the helper, after any hugs have ocurred. (mob/living/helped) +///Called from /mob/living/carbon/help_shake_act on the helper, after any hugs have occurred. (mob/living/helped) #define COMSIG_CARBON_HELPED "carbon_helped_someone" ///When a carbon slips. Called on /turf/open/handle_slip() @@ -95,11 +95,11 @@ #define COMPONENT_OVERRIDE_HEALTH_HUD (1<<0) ///Called when a carbon updates their sanity (source = carbon) #define COMSIG_CARBON_SANITY_UPDATE "carbon_sanity_update" -///Called when a carbon attempts to breath, before the breath has actually occured +///Called when a carbon attempts to breath, before the breath has actually occurred #define COMSIG_CARBON_ATTEMPT_BREATHE "carbon_attempt_breathe" // Prevents the breath #define COMSIG_CARBON_BLOCK_BREATH (1 << 0) -///Called when a carbon breathes, before the breath has actually occured +///Called when a carbon breathes, before the breath has actually occurred #define COMSIG_CARBON_PRE_BREATHE "carbon_pre_breathe" ///Called when a carbon updates their mood #define COMSIG_CARBON_MOOD_UPDATE "carbon_mood_update" @@ -133,6 +133,10 @@ #define VISIBLE_NAME_FACE 1 //Index for the name of the id #define VISIBLE_NAME_ID 2 + //Index for whether their name is being overridden instead of obfuscated + #define VISIBLE_NAME_FORCED 3 +///from /mob/living/carbon/human/get_id_name; only returns if the mob has TRAIT_UNKNOWN and it's being overridden: (identity) +#define COMSIG_HUMAN_GET_FORCED_NAME "human_get_forced_name" // Mob transformation signals ///Called when a human turns into a monkey, from /mob/living/carbon/proc/finish_monkeyize() @@ -155,10 +159,10 @@ #define HANDLE_BLOOD_HANDLED (1<<0) /// Return to skip default nutrition -> blood conversion #define HANDLE_BLOOD_NO_NUTRITION_DRAIN (1<<1) - /// Return to skip oxyloss and similar effecst from blood level + /// Return to skip oxyloss and similar effects from blood level #define HANDLE_BLOOD_NO_OXYLOSS (1<<2) -/// from /datum/status_effect/limp/proc/check_step(mob/whocares, OldLoc, Dir, forced) iodk where it shuld go +/// from /datum/status_effect/limp/proc/check_step(mob/whocares, OldLoc, Dir, forced) iodk where it should go #define COMSIG_CARBON_LIMPING "mob_limp_check" #define COMPONENT_CANCEL_LIMP (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index dfbfe68ad52cd..85e6a62d46c18 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -50,7 +50,7 @@ #define COMSIG_MOB_CLIENT_BLOCK_PRE_MOVE COMPONENT_MOVABLE_BLOCK_PRE_MOVE /// The argument of move_args which corresponds to the loc we're moving to #define MOVE_ARG_NEW_LOC 1 - /// The arugment of move_args which dictates our movement direction + /// The argument of move_args which dictates our movement direction #define MOVE_ARG_DIRECTION 2 /// From base of /client/Move(): (direction, old_dir) #define COMSIG_MOB_CLIENT_MOVED "mob_client_moved" @@ -72,7 +72,7 @@ #define COMSIG_MOB_MIND_TRANSFERRED_INTO "mob_mind_transferred_into" ///from mind/transfer_from. Sent to the mob the mind is being transferred out of. #define COMSIG_MOB_MIND_TRANSFERRED_OUT_OF "mob_mind_transferred_out_of" -/// From /mob/proc/ghostize() Called when a mob sucessfully ghosts +/// From /mob/proc/ghostize() Called when a mob successfully ghosts #define COMSIG_MOB_GHOSTIZED "mob_ghostized" ///from base of obj/allowed(mob/M): (/obj) returns ACCESS_ALLOWED if mob has id access to the obj @@ -138,6 +138,7 @@ #define SPEECH_FILTERPROOF 8 #define SPEECH_RANGE 9 #define SPEECH_SAYMODE 10 + #define SPEECH_MODS 11 ///from /mob/say_dead(): (mob/speaker, message) #define COMSIG_MOB_DEADSAY "mob_deadsay" @@ -150,8 +151,6 @@ /// from base of mob/swap_hand(): () /// Performed after the hands are swapped. #define COMSIG_MOB_SWAP_HANDS "mob_swap_hands" -///from base of /mob/verb/pointed: (atom/A) -#define COMSIG_MOB_POINTED "mob_pointed" ///Mob is trying to open the wires of a target [/atom], from /datum/wires/interactable(): (atom/target) #define COMSIG_TRY_WIRES_INTERACT "try_wires_interact" #define COMPONENT_CANT_INTERACT_WIRES (1<<0) @@ -248,3 +247,6 @@ /// from /mob/proc/key_down(): (key, client/client, full_key) #define COMSIG_MOB_KEYDOWN "mob_key_down" + +/// from /mob/update_incapacitated(): (old_incap, new_incap) +#define COMSIG_MOB_INCAPACITATE_CHANGED "mob_incapacitated" diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 45b671141a380..797256017d456 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -153,12 +153,12 @@ /// Sebt from obj/item/ui_action_click(): (mob/user, datum/action) #define COMSIG_ITEM_UI_ACTION_CLICK "item_action_click" - /// Return to prevent the default behavior (attack_selfing) from ocurring. + /// Return to prevent the default behavior (attack_selfing) from occurring. #define COMPONENT_ACTION_HANDLED (1<<0) /// Sent from obj/item/item_action_slot_check(): (mob/user, datum/action, slot) #define COMSIG_ITEM_UI_ACTION_SLOT_CHECKED "item_action_slot_checked" - /// Return to prevent the default behavior (attack_selfing) from ocurring. + /// Return to prevent the default behavior (attack_selfing) from occurring. #define COMPONENT_ITEM_ACTION_SLOT_INVALID (1<<0) ///from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone) @@ -530,6 +530,9 @@ /// from /datum/component/dart_insert/on_reskin() #define COMSIG_DART_INSERT_PARENT_RESKINNED "dart_insert_parent_reskinned" +/// from /datum/element/undertile/hide() +#define COMSIG_UNDERTILE_UPDATED "undertile_updated" + /// Sent from /obj/item/update_weight_class(). (old_w_class, new_w_class) #define COMSIG_ITEM_WEIGHT_CLASS_CHANGED "item_weight_class_changed" /// Sent from /obj/item/update_weight_class(), to its loc. (obj/item/changed_item, old_w_class, new_w_class) diff --git a/code/__DEFINES/dcs/signals/signals_reagent.dm b/code/__DEFINES/dcs/signals/signals_reagent.dm index 5bb2c89d4ef33..367ec946361d0 100644 --- a/code/__DEFINES/dcs/signals/signals_reagent.dm +++ b/code/__DEFINES/dcs/signals/signals_reagent.dm @@ -53,8 +53,6 @@ #define COMSIG_REAGENTS_EXPOSE_MOB "reagents_expose_mob" ///from base of [/turf/proc/expose_reagents]: (/turf, /list, methods, volume_modifier, show_message) #define COMSIG_REAGENTS_EXPOSE_TURF "reagents_expose_turf" -///from base of [/datum/component/personal_crafting/proc/del_reqs]: () -#define COMSIG_REAGENTS_CRAFTING_PING "reagents_crafting_ping" /// sent when reagents are transfered from a cup, to something refillable (atom/transfer_to) #define COMSIG_REAGENTS_CUP_TRANSFER_TO "reagents_cup_transfer_to" /// sent when reagents are transfered from some reagent container, to a cup (atom/transfer_from) diff --git a/code/__DEFINES/dcs/signals/signals_spell.dm b/code/__DEFINES/dcs/signals/signals_spell.dm index d9ef98527e25c..8d02affded85a 100644 --- a/code/__DEFINES/dcs/signals/signals_spell.dm +++ b/code/__DEFINES/dcs/signals/signals_spell.dm @@ -113,7 +113,7 @@ // Charge /// Sent from /datum/action/cooldown/spell/charge/cast(), to the item in hand being charged: (datum/action/cooldown/spell/spell, mob/user) #define COMSIG_ITEM_MAGICALLY_CHARGED "item_magic_charged" - /// Return if an item was successfuly recharged + /// Return if an item was successful recharged #define COMPONENT_ITEM_CHARGED (1 << 0) /// Return if the item had a negative side effect occur while recharging #define COMPONENT_ITEM_BURNT_OUT (1 << 1) diff --git a/code/__DEFINES/dcs/signals/signals_tools.dm b/code/__DEFINES/dcs/signals/signals_tools.dm index 562aa29d595c0..110db1ed89c16 100644 --- a/code/__DEFINES/dcs/signals/signals_tools.dm +++ b/code/__DEFINES/dcs/signals/signals_tools.dm @@ -1,6 +1,6 @@ // Notifies tools that something is happening. -// Sucessful actions against an atom. +// Successful actions against an atom. ///Called from /atom/proc/tool_act (atom) #define COMSIG_TOOL_ATOM_ACTED_PRIMARY(tooltype) "tool_atom_acted_[tooltype]" ///Called from /atom/proc/tool_act (atom) diff --git a/code/__DEFINES/events.dm b/code/__DEFINES/events.dm index 2b1755b22c4b4..7045d8f0c65f7 100644 --- a/code/__DEFINES/events.dm +++ b/code/__DEFINES/events.dm @@ -22,7 +22,7 @@ #define EVENT_CATEGORY_FRIENDLY "Friendly" ///Events that affect the body and mind #define EVENT_CATEGORY_HEALTH "Health" -///Events reserved for special occassions +///Events reserved for special occasions #define EVENT_CATEGORY_HOLIDAY "Holiday" ///Events with enemy groups with a more complex plan #define EVENT_CATEGORY_INVASION "Invasion" diff --git a/code/__DEFINES/fish.dm b/code/__DEFINES/fish.dm index 3671ff3d8cdc6..d6bcc2ec796e5 100644 --- a/code/__DEFINES/fish.dm +++ b/code/__DEFINES/fish.dm @@ -1,5 +1,7 @@ /// Use in fish tables to denote miss chance. #define FISHING_DUD "dud" +///Used in the the hydro tray fishing spot to define a random seed reward +#define FISHING_RANDOM_SEED "Random seed" // Baseline fishing difficulty levels #define FISHING_DEFAULT_DIFFICULTY 15 @@ -14,11 +16,6 @@ #define FISH_TRAIT_MINOR_DIFFICULTY_BOOST 5 -// These define how the fish will behave in the minigame -#define FISH_AI_DUMB "dumb" -#define FISH_AI_ZIPPY "zippy" -#define FISH_AI_SLOW "slow" - ///Slot defines for the fishing rod and its equipment #define ROD_SLOT_BAIT "bait" #define ROD_SLOT_LINE "line" @@ -89,7 +86,12 @@ #define FISH_ICON_GEM "gem" #define FISH_ICON_CRAB "crab" #define FISH_ICON_JELLYFISH "jellyfish" +#define FISH_ICON_BOTTLE "bottle" #define FISH_ICON_BONE "bone" +#define FISH_ICON_ELECTRIC "electric" +#define FISH_ICON_WEAPON "weapon" +#define FISH_ICON_CRITTER "critter" +#define FISH_ICON_SEED "seed" #define AQUARIUM_ANIMATION_FISH_SWIM "fish" #define AQUARIUM_ANIMATION_FISH_DEAD "dead" @@ -110,8 +112,11 @@ ///Fish size thresholds for w_class. #define FISH_SIZE_TINY_MAX 30 #define FISH_SIZE_SMALL_MAX 50 -#define FISH_SIZE_NORMAL_MAX 90 -#define FISH_SIZE_BULKY_MAX 130 +#define FISH_SIZE_NORMAL_MAX 80 +#define FISH_SIZE_BULKY_MAX 120 +///size threshold for requiring two-handed carry +#define FISH_SIZE_TWO_HANDS_REQUIRED 135 +#define FISH_SIZE_HUGE_MAX 165 ///The coefficient for maximum weight/size divergence relative to the averages. #define MAX_FISH_DEVIATION_COEFF 2.5 @@ -121,6 +126,15 @@ ///The number of fillets is multiplied by the fish' size and divided by this. #define FISH_FILLET_NUMBER_SIZE_DIVISOR 30 +///The slowdown of the fish when carried begins at this value +#define FISH_WEIGHT_SLOWDOWN 2100 +///The value of the slowdown equals to the weight divided by this (and then at the power of a sub-1 exponent) +#define FISH_WEIGHT_SLOWDOWN_DIVISOR 500 +///The sub-one exponent that results in the final slowdown of the fish item +#define FISH_WEIGHT_SLOWDOWN_EXPONENT 0.54 +///Used to calculate the force of the fish by comparing (1 + log(weight/this_define)) and the w_class of the item. +#define FISH_WEIGHT_FORCE_DIVISOR 250 + ///The breeding timeout for newly instantiated fish is multiplied by this. #define NEW_FISH_BREEDING_TIMEOUT_MULT 2 ///The last feeding timestamp of newly instantiated fish is multiplied by this: ergo, they spawn 50% hungry. @@ -164,3 +178,7 @@ //Fish breeding stops if fish count exceeds this. #define AQUARIUM_MAX_BREEDING_POPULATION 20 + +//Minigame defines +/// The height of the minigame slider. Not in pixels, but minigame units. +#define FISHING_MINIGAME_AREA 1000 diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index 3787aeb4df7b9..c9b7cb43cf0d9 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -139,7 +139,7 @@ GLOBAL_LIST_INIT(food_quality_events, list( FOOD_QUALITY_TOP = /datum/mood_event/food/top, )) -/// Crafted food buffs grouped by crafting_complexity +/// Weighted lists of crafted food buffs randomly given according to crafting_complexity unless the food has a specific buff GLOBAL_LIST_INIT(food_buffs, list( FOOD_COMPLEXITY_1 = list( /datum/status_effect/food/haste = 1, @@ -152,11 +152,9 @@ GLOBAL_LIST_INIT(food_buffs, list( ), FOOD_COMPLEXITY_4 = list( /datum/status_effect/food/haste = 1, - /datum/status_effect/food/trait/shockimmune = 1, ), FOOD_COMPLEXITY_5 = list( /datum/status_effect/food/haste = 1, - /datum/status_effect/food/trait/shockimmune = 2, ), )) diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm index a853fde0c5dee..5fce59b17fb72 100644 --- a/code/__DEFINES/icon_smoothing.dm +++ b/code/__DEFINES/icon_smoothing.dm @@ -206,6 +206,8 @@ DEFINE_BITFIELD(smoothing_junction, list( #define SMOOTH_GROUP_SPIDER_WEB_WALL_TOUGH S_OBJ(73) // /obj/structure/spider/stickyweb/sealed/thick #define SMOOTH_GROUP_SPIDER_WEB_WALL_MIRROR S_OBJ(74) // /obj/structure/spider/stickyweb/sealed/reflector +#define SMOOTH_GROUP_GRAV_FIELD S_OBJ(69) + /// Performs the work to set smoothing_groups and canSmoothWith. /// An inlined function used in both turf/Initialize and atom/Initialize. #define SETUP_SMOOTHING(...) \ diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 63054e533b1bf..c58f12bf5c957 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -63,6 +63,8 @@ #define ITEM_SLOT_HANDCUFFED (1<<18) /// Legcuff slot (bolas, beartraps) #define ITEM_SLOT_LEGCUFFED (1<<19) +/// Inside of a character's BELT......... +#define ITEM_SLOT_BELTPACK (1<<20) /// Total amount of slots #define SLOTS_AMT 20 // Keep this up to date! @@ -148,12 +150,18 @@ DEFINE_BITFIELD(no_equip_flags, list( #define DIGITIGRADE_STYLE 2 //Flags (actual flags, fucker ^) for /obj/item/var/supports_variations_flags -///No alternative sprites based on bodytype +/// No alternative sprites or handling based on bodytype #define CLOTHING_NO_VARIATION (1<<0) -///Has a sprite for digitigrade legs specifically. +/// Has a sprite for digitigrade legs specifically. #define CLOTHING_DIGITIGRADE_VARIATION (1<<1) -///The sprite works fine for digitigrade legs as-is. +/// The sprite works fine for digitigrade legs as-is. #define CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON (1<<2) +/// Auto-generates the leg portion of the sprite with GAGS +/// Suggested that you set [/obj/item/var/digitigrade_greyscale_config_worn] when using this flag +#define CLOTHING_DIGITIGRADE_MASK (1<<3) + +/// All variation flags which render "correctly" on a digitigrade leg setup +#define DIGITIGRADE_VARIATIONS (CLOTHING_DIGITIGRADE_VARIATION|CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON|CLOTHING_DIGITIGRADE_MASK) //flags for covering body parts #define GLASSESCOVERSEYES (1<<0) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 0d9d28d4d858a..8846672efe1b7 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -69,6 +69,8 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define isplatingturf(A) (istype(A, /turf/open/floor/plating)) +#define iscatwalkturf(A) (istype(A, /turf/open/floor/catwalk_floor)) + #define isasteroidturf(A) (istype(A, /turf/open/misc/asteroid)) #define istransparentturf(A) (HAS_TRAIT(A, TURF_Z_TRANSPARENT_TRAIT)) @@ -137,19 +139,15 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list( //Silicon mobs #define issilicon(A) (istype(A, /mob/living/silicon)) -///Define on whether A has access to Silicon stuff either through being a silicon, admin ghost or is a non-silicon holding the Silicon remote. -///This can only be used for instances where you are not specifically looking for silicon, but access. -#define HAS_SILICON_ACCESS(A) (istype(A, /mob/living/silicon) || isAdminGhostAI(A) || A.has_unlimited_silicon_privilege || istype(A.get_active_held_item(), /obj/item/machine_remote)) - #define isAI(A) (istype(A, /mob/living/silicon/ai)) -///Define on whether A has access to AI stuff either through being a AI, admin ghost, or is a non-silicon holding the Silicon remote -///This can only be used for instances where you are not specifically looking for silicon, but access. -#define HAS_AI_ACCESS(A) (istype(A, /mob/living/silicon/ai) || isAdminGhostAI(A) || istype(A.get_active_held_item(), /obj/item/machine_remote)) - #define iscyborg(A) (istype(A, /mob/living/silicon/robot)) - #define ispAI(A) (istype(A, /mob/living/silicon/pai)) +///This is used to see if you have Silicon access. This includes things like Admins, Drones, Bots, and Human wands. +#define HAS_SILICON_ACCESS(possible_silicon) (HAS_TRAIT(possible_silicon, TRAIT_SILICON_ACCESS) || isAdminGhostAI(possible_silicon)) +///This is used to see if you have the access of an AI. This doesn't mean you are an AI, just have the same access as one. +#define HAS_AI_ACCESS(possible_ai) (HAS_TRAIT(possible_ai, TRAIT_AI_ACCESS) || isAdminGhostAI(possible_ai)) + // basic mobs #define isbasicmob(A) (istype(A, /mob/living/basic)) diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index cd6ee5ec0c9bd..d530185c14288 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -27,6 +27,7 @@ #define LANGUAGE_GLAND "gland" #define LANGUAGE_HAT "hat" #define LANGUAGE_QUIRK "quirk" +#define LANGUAGE_DRINK "drink" #define LANGUAGE_MALF "malf" #define LANGUAGE_PIRATE "pirate" #define LANGUAGE_MASTER "master" diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 55272920fdd5a..d5c17a877a4b6 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -145,9 +145,9 @@ #define WIRE_LAYER (9 + TOPDOWN_LAYER) #define GLASS_FLOOR_LAYER (10 + TOPDOWN_LAYER) #define TRAM_RAIL_LAYER (11 + TOPDOWN_LAYER) +#define ABOVE_OPEN_TURF_LAYER (12 + TOPDOWN_LAYER) ///catwalk overlay of /turf/open/floor/plating/catwalk_floor -#define CATWALK_LAYER (12 + TOPDOWN_LAYER) -#define ABOVE_OPEN_TURF_LAYER (13 + TOPDOWN_LAYER) +#define CATWALK_LAYER (13 + TOPDOWN_LAYER) //WALL_PLANE layers #define BELOW_CLOSED_TURF_LAYER 2.053 @@ -253,7 +253,7 @@ //---------- EMISSIVES ------------- //Layering order of these is not particularly meaningful. -//Important part is the seperation of the planes for control via plane_master +//Important part is the separation of the planes for control via plane_master /// The layer you should use if you _really_ don't want an emissive overlay to be blocked. #define EMISSIVE_LAYER_UNBLOCKABLE 9999 diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 2c3c1c34f0836..a59d1b2c14449 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -77,21 +77,21 @@ #define _EMISSIVE_COLOR(val) list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, val,val,val,0) /// The color matrix applied to all emissive overlays. Should be solely dependent on alpha and not have RGB overlap with [EM_BLOCK_COLOR]. #define EMISSIVE_COLOR _EMISSIVE_COLOR(1) -/// A globaly cached version of [EMISSIVE_COLOR] for quick access. +/// A globally cached version of [EMISSIVE_COLOR] for quick access. GLOBAL_LIST_INIT(emissive_color, EMISSIVE_COLOR) #define _EM_BLOCK_COLOR(val) list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,val, 0,0,0,0) /// The color matrix applied to all emissive blockers. Should be solely dependent on alpha and not have RGB overlap with [EMISSIVE_COLOR]. #define EM_BLOCK_COLOR _EM_BLOCK_COLOR(1) -/// A globaly cached version of [EM_BLOCK_COLOR] for quick access. +/// A globally cached version of [EM_BLOCK_COLOR] for quick access. GLOBAL_LIST_INIT(em_block_color, EM_BLOCK_COLOR) /// A set of appearance flags applied to all emissive and emissive blocker overlays. -/// KEEP_APART to prevent parent hooking, KEEP_TOGETHER for children, and we reset the color and alpha of our parent so nothing gets overriden +/// KEEP_APART to prevent parent hooking, KEEP_TOGETHER for children, and we reset the color and alpha of our parent so nothing gets overridden #define EMISSIVE_APPEARANCE_FLAGS (KEEP_APART|KEEP_TOGETHER|RESET_COLOR|RESET_ALPHA) -/// The color matrix used to mask out emissive blockers on the emissive plane. Alpha should default to zero, be solely dependent on the RGB value of [EMISSIVE_COLOR], and be independant of the RGB value of [EM_BLOCK_COLOR]. +/// The color matrix used to mask out emissive blockers on the emissive plane. Alpha should default to zero, be solely dependent on the RGB value of [EMISSIVE_COLOR], and be independent of the RGB value of [EM_BLOCK_COLOR]. #define EM_MASK_MATRIX list(0,0,0,1/3, 0,0,0,1/3, 0,0,0,1/3, 0,0,0,0, 1,1,1,0) -/// A globaly cached version of [EM_MASK_MATRIX] for quick access. +/// A globally cached version of [EM_MASK_MATRIX] for quick access. GLOBAL_LIST_INIT(em_mask_matrix, EM_MASK_MATRIX) /// Parse the hexadecimal color into lumcounts of each perspective. diff --git a/code/__DEFINES/living.dm b/code/__DEFINES/living.dm index 63993f4bc620b..340bf3608bb5d 100644 --- a/code/__DEFINES/living.dm +++ b/code/__DEFINES/living.dm @@ -4,3 +4,6 @@ /// Always does *deathgasp when they die /// If unset mobs will only deathgasp if supplied a death sound or custom death message #define ALWAYS_DEATHGASP (1<<1) + +/// Getter for a mob/living's lying angle, otherwise protected +#define GET_LYING_ANGLE(mob) (UNLINT(mob.lying_angle)) diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index d7245d8b6f362..9d2cf451c62e1 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -52,7 +52,7 @@ #define BYPASS_DOOR_CHECKS 2 //used in design to specify which machine can build it -//Note: More than one of these can be added to a design but imprinter and lathe designs are incompatable. +//Note: More than one of these can be added to a design but imprinter and lathe designs are incompatible. #define IMPRINTER (1<<0) //For circuits. Uses glass/chemicals. #define PROTOLATHE (1<<1) //New stuff. Uses various minerals #define AUTOLATHE (1<<2) //Prints basic designs without research diff --git a/code/__DEFINES/market.dm b/code/__DEFINES/market.dm index f0a19ad056d9a..e0bd457835208 100644 --- a/code/__DEFINES/market.dm +++ b/code/__DEFINES/market.dm @@ -10,3 +10,5 @@ // Sends a supply pod to the buyer's location, showy. #define SHIPPING_METHOD_SUPPLYPOD "Supply Pod" +/// The percentage on gains that's removed when selling an item through the blackmarket with the LTSRBT +#define MARKET_WITHHOLDING_TAX 0.15 diff --git a/code/__DEFINES/melee.dm b/code/__DEFINES/melee.dm index 8b3a422fc0b25..1880c75c97b8d 100644 --- a/code/__DEFINES/melee.dm +++ b/code/__DEFINES/melee.dm @@ -1,8 +1,9 @@ //Martial arts defines #define MARTIALART_BOXING "boxing" -#define MARTIALART_EVIL_BOXING "evil boxing" #define MARTIALART_CQC "CQC" +#define MARTIALART_EVIL_BOXING "evil boxing" +#define MARTIALART_HUNTER_BOXING "hunter boxing" #define MARTIALART_KRAVMAGA "krav maga" #define MARTIALART_MUSHPUNCH "mushroom punch" #define MARTIALART_PLASMAFIST "plasma fist" diff --git a/code/__DEFINES/mobfactions.dm b/code/__DEFINES/mobfactions.dm index aea143dad253c..cb934a28f5c5a 100644 --- a/code/__DEFINES/mobfactions.dm +++ b/code/__DEFINES/mobfactions.dm @@ -33,13 +33,13 @@ #define FACTION_HELL "hell" /// Hivebots #define FACTION_HIVEBOT "hivebot" -/// Illusionary creaturs +/// Illusionary creatures #define FACTION_ILLUSION "illusion" /// Creatures of the never finished jungle planet, and gorillas #define FACTION_JUNGLE "jungle" /// Small lizards #define FACTION_LIZARD "lizard" -/// Maint creatures have mutual respect for eachother. +/// Maint creatures have mutual respect for each other. #define FACTION_MAINT_CREATURES "maint_creatures" /// Animated objects and statues #define FACTION_MIMIC "mimic" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index b722c1a96155b..0de4d7e6ab763 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -152,7 +152,10 @@ ///The species is forced to have digitigrade legs in generation. #define DIGITIGRADE_FORCED 2 -///Digitigrade's prefs, used in features for legs if you're meant to be a Digitigrade. +// Preferences for leg types +/// Legs that are normal +#define NORMAL_LEGS "Normal Legs" +/// Digitgrade legs that are like bended and uhhh no shoes #define DIGITIGRADE_LEGS "Digitigrade Legs" // Health/damage defines @@ -305,7 +308,7 @@ #define BRUTE_DAMAGE_REQUIRED_TO_STOP_CRYSTALIZATION 30 -#define CRYSTALIZE_STAGE_ENGULFING 100 //Cant use second defines +#define CRYSTALIZE_STAGE_ENGULFING 100 //Can't use second defines #define CRYSTALIZE_STAGE_ENCROACHING 300 //In switches #define CRYSTALIZE_STAGE_SMALL 600 //Because they're not static @@ -508,7 +511,7 @@ #define WABBAJACK_HUMAN "humanoid" #define WABBAJACK_ANIMAL "animal" -// Reasons a defibrilation might fail +// Reasons a defibrillation might fail #define DEFIB_POSSIBLE (1<<0) #define DEFIB_FAIL_SUICIDE (1<<1) #define DEFIB_FAIL_HUSK (1<<2) @@ -713,7 +716,7 @@ GLOBAL_LIST_INIT(human_heights_to_offsets, list( /// Glasses layer #define GLASSES_LAYER 17 /// Belt layer -#define BELT_LAYER 16 //Possible make this an overlay of somethign required to wear a belt? +#define BELT_LAYER 16 //Possible make this an overlay of something required to wear a belt? /// Suit storage layer (tucking a gun or baton underneath your armor) #define SUIT_STORE_LAYER 15 /// Neck layer (for wearing capes and bedsheets) @@ -844,7 +847,7 @@ GLOBAL_LIST_INIT(layers_to_offset, list( #define NEED_VENTCRAWL (1<<8) /// Skips adjacency checks #define BYPASS_ADJACENCY (1<<9) -/// Skips reccursive loc checks +/// Skips recursive loc checks #define NOT_INSIDE_TARGET (1<<10) /// Checks for base adjacency, but silences the error #define SILENT_ADJACENCY (1<<11) @@ -878,6 +881,8 @@ GLOBAL_LIST_INIT(layers_to_offset, list( /// Possible value of [/atom/movable/buckle_lying]. If set to a different (positive-or-zero) value than this, the buckling thing will force a lying angle on the buckled. #define NO_BUCKLE_LYING -1 +/// Possible value of [/atom/movable/buckle_dir]. If set to a different (positive-or-zero) value than this, the buckling thing will force a dir on the buckled. +#define BUCKLE_MATCH_DIR -1 // Flags for fully_heal(). @@ -974,6 +979,8 @@ GLOBAL_LIST_INIT(layers_to_offset, list( /// The duration of the flip emote animation #define FLIP_EMOTE_DURATION 0.7 SECONDS +///The duration of a taunt emote, so how long they can deflect projectiles +#define TAUNT_EMOTE_DURATION 0.9 SECONDS // Sprites for photocopying butts #define BUTT_SPRITE_HUMAN_MALE "human_male" diff --git a/code/__DEFINES/mod.dm b/code/__DEFINES/mod.dm index 8257e1969bedb..1a4bed1ca9922 100644 --- a/code/__DEFINES/mod.dm +++ b/code/__DEFINES/mod.dm @@ -5,7 +5,7 @@ #define DEFAULT_CHARGE_DRAIN (0.005 * STANDARD_CELL_CHARGE) // A standard cell lasts 200 seconds with this on active power usage, while a high power one lasts 2,000 seconds. /// Default time for a part of the suit to seal. -#define MOD_ACTIVATION_STEP_TIME (2 SECONDS) +#define MOD_ACTIVATION_STEP_TIME (1 SECONDS) /// Passive module, just acts when put in naturally. #define MODULE_PASSIVE 0 diff --git a/code/__DEFINES/paper.dm b/code/__DEFINES/paper.dm index 0d70a2f3ca40d..9cede4214bd93 100644 --- a/code/__DEFINES/paper.dm +++ b/code/__DEFINES/paper.dm @@ -18,3 +18,29 @@ #define BARCODE_SCANNER_INVENTORY "inventory" #define IS_WRITING_UTENSIL(thing) (thing?.get_writing_implement_details()?["interaction_mode"] == MODE_WRITING) + +/** + * key defines used when converting a paper to and fro' a data/json list. It's really important that they stay the same + * lest we break persistence. + */ +#define LIST_PAPER_COLOR "paper_color" +#define LIST_PAPER_NAME "paper_name" + +#define LIST_PAPER_RAW_TEXT_INPUT "raw_text_input" +#define LIST_PAPER_RAW_FIELD_INPUT "raw_field_input" +#define LIST_PAPER_RAW_STAMP_INPUT "raw_stamp_input" + +#define LIST_PAPER_RAW_TEXT "raw_text" +#define LIST_PAPER_FONT "font" +#define LIST_PAPER_FIELD_COLOR "color" +#define LIST_PAPER_BOLD "bold" +#define LIST_PAPER_ADVANCED_HTML "advanced_html" + +#define LIST_PAPER_FIELD_INDEX "field_index" +#define LIST_PAPER_FIELD_DATA "field_data" +#define LIST_PAPER_IS_SIGNATURE "is_signature" + +#define LIST_PAPER_CLASS "class" +#define LIST_PAPER_STAMP_X "x" +#define LIST_PAPER_STAMP_Y "y" +#define LIST_PAPER_ROTATION "rotation" diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index 686c42e07d075..44e4417a20996 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -37,6 +37,10 @@ #define RADIO_KEY_AI_PRIVATE "o" #define RADIO_TOKEN_AI_PRIVATE ":o" +#define RADIO_CHANNEL_ENTERTAINMENT "Entertainment" +#define RADIO_KEY_ENTERTAINMENT "p" +#define RADIO_TOKEN_ENTERTAINMENT ":p" + #define RADIO_CHANNEL_SYNDICATE "Syndicate" #define RADIO_KEY_SYNDICATE "t" @@ -73,6 +77,7 @@ #define FREQ_MEDICAL 1355 // Medical comms frequency, soft blue #define FREQ_ENGINEERING 1357 // Engineering comms frequency, orange #define FREQ_SECURITY 1359 // Security comms frequency, red +#define FREQ_ENTERTAINMENT 1415 // Used by entertainment monitors, cyan #define FREQ_HOLOGRID_SOLUTION 1433 #define FREQ_STATUS_DISPLAYS 1435 @@ -130,3 +135,10 @@ #define RADIO_FREQENCY_LOCKED 1 /// Radio frequency is locked and unchangeable, but can be unlocked by an emag #define RADIO_FREQENCY_EMAGGABLE_LOCK 2 + +///Bitflag for if a headset can use the syndicate radio channel +#define RADIO_SPECIAL_SYNDIE (1<<0) +///Bitflag for if a headset can use the centcom radio channel +#define RADIO_SPECIAL_CENTCOM (1<<1) +///Bitflag for if a headset can use the binary radio channel +#define RADIO_SPECIAL_BINARY (1<<2) diff --git a/code/__DEFINES/reactions.dm b/code/__DEFINES/reactions.dm index 98f8d4a18278d..a8c111c516476 100644 --- a/code/__DEFINES/reactions.dm +++ b/code/__DEFINES/reactions.dm @@ -89,7 +89,7 @@ #define FREON_MAXIMUM_BURN_TEMPERATURE 283 ///Minimum temperature allowed for the burn to go at max speed, we would have negative pressure otherwise #define FREON_LOWER_TEMPERATURE 60 -///Terminal temperature after wich we stop the reaction +///Terminal temperature after which we stop the reaction #define FREON_TERMINAL_TEMPERATURE 20 /// Multiplier for freonfire with O2 moles * FREON_OXYGEN_FULLBURN for the maximum fuel consumption #define FREON_OXYGEN_FULLBURN 10 diff --git a/code/__DEFINES/research/anomalies.dm b/code/__DEFINES/research/anomalies.dm index 93f1bc924c288..e04aead3464bc 100644 --- a/code/__DEFINES/research/anomalies.dm +++ b/code/__DEFINES/research/anomalies.dm @@ -2,7 +2,7 @@ #define MAX_CORES_BLUESPACE 3 #define MAX_CORES_GRAVITATIONAL 6 #define MAX_CORES_FLUX 8 -#define MAX_CORES_VORTEX 1 +#define MAX_CORES_VORTEX 3 #define MAX_CORES_PYRO 8 #define MAX_CORES_HALLUCINATION 8 #define MAX_CORES_BIOSCRAMBLER 8 diff --git a/code/__DEFINES/research/techweb_nodes.dm b/code/__DEFINES/research/techweb_nodes.dm index 3c730e02169fa..f27225f1fedee 100644 --- a/code/__DEFINES/research/techweb_nodes.dm +++ b/code/__DEFINES/research/techweb_nodes.dm @@ -14,7 +14,7 @@ #define TECHWEB_NODE_BEAM_WEAPONS "beam_weapons" #define TECHWEB_NODE_BIO_SCAN "bio_scan" #define TECHWEB_NODE_BITRUNNING "bitrunning" -#define TECHWEB_NODE_BLUESPACE "bluespace" +#define TECHWEB_NODE_MECH_EQUIP_BLUESPACE "mech_equip_bluespace" #define TECHWEB_NODE_BLUESPACE_THEORY "bluespace_theory" #define TECHWEB_NODE_BLUESPACE_TRAVEL "bluespace_travel" #define TECHWEB_NODE_BORG_ENGI "borg_engi" diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index 6f15ea6521638..759121e3b8dd8 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -36,7 +36,7 @@ /// These shuttles leave when the main emergency shuttle does but don't dock anywhere (to save space), so this counts as "escaped". #define ENDGAME_TRANSIT 3 -//positive value = cannot puchase +//positive value = cannot purchase #define SHUTTLEPURCHASE_PURCHASABLE 0 //station can buy a shuttle #define SHUTTLEPURCHASE_PURCHASED 1 //station has already bought a shuttle, so cannot #define SHUTTLEPURCHASE_FORCED 2 //station was given a new shuttle through events or other shenanigans diff --git a/code/__DEFINES/sight.dm b/code/__DEFINES/sight.dm index 645e009413593..5a3e0d17ef348 100644 --- a/code/__DEFINES/sight.dm +++ b/code/__DEFINES/sight.dm @@ -71,7 +71,7 @@ //------------------------ // INVISIBILITY SOURCE IDS // Though don't feel the need to add one here if you have a simple effect that -// gets added and/or removed in only one place near eachother in the code. +// gets added and/or removed in only one place near each other in the code. #define INVISIBILITY_SOURCE_INVISIMIN "invisimin" #define INVISIBILITY_SOURCE_STEALTHMODE "stealthmode" diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 0034ce1c38e6f..168e4f9d85dfe 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -180,3 +180,11 @@ GLOBAL_LIST_INIT(announcer_keys, list( #define SFX_PORTAL_CLOSE "portal_closed" #define SFX_PORTAL_CREATED "portal_created" #define SFX_SCREECH "screech" +#define SFX_TOOL_SWITCH "tool_switch" +#define SFX_KEYBOARD_CLICKS "keyboard_clicks" +#define SFX_STONE_DROP "stone_drop" +#define SFX_STONE_PICKUP "stone_pickup" +#define SFX_MUFFLED_SPEECH "muffspeech" +#define SFX_DEFAULT_FISH_SLAP "default_fish_slap" +#define SFX_ALT_FISH_SLAP "alt_fish_slap" +#define SFX_FISH_PICKUP "fish_pickup" diff --git a/code/__DEFINES/span.dm b/code/__DEFINES/span.dm index fadd00053156d..259a13e1e9afe 100644 --- a/code/__DEFINES/span.dm +++ b/code/__DEFINES/span.dm @@ -48,6 +48,7 @@ #define span_drone(str) ("" + str + "") #define span_engradio(str) ("" + str + "") #define span_extremelybig(str) ("" + str + "") +#define span_enteradio(str) ("" + str + "") #define span_game_say(str) ("" + str + "") #define span_ghostalert(str) ("" + str + "") #define span_green(str) ("" + str + "") diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 8ada83a2109cb..ead7764d60523 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -24,12 +24,18 @@ #define CURSE_GRASPING (1<<3) //Incapacitated status effect flags -/// If the incapacitated status effect will ignore a mob in restraints (handcuffs) -#define IGNORE_RESTRAINTS (1<<0) -/// If the incapacitated status effect will ignore a mob in stasis (stasis beds) -#define IGNORE_STASIS (1<<1) -/// If the incapacitated status effect will ignore a mob being agressively grabbed -#define IGNORE_GRAB (1<<2) +/// If the mob is normal incapacitated. Should never need this, just avoids issues if we ever overexpand this +#define TRADITIONAL_INCAPACITATED (1<<0) +/// If the incapacitated status effect is being caused by restraints (handcuffs) +#define INCAPABLE_RESTRAINTS (1<<1) +/// If the incapacitated status effect is being caused by stasis (stasis beds) +#define INCAPABLE_STASIS (1<<2) +/// If the incapacitated status effect is being caused by being agressively grabbed +#define INCAPABLE_GRAB (1<<3) + +/// Checks to see if a mob would be incapacitated even while ignoring some types +/// Does this by inverting the passed in flags and seeing if we're still incapacitated +#define INCAPACITATED_IGNORING(mob, flags) (mob.incapacitated & ~(flags)) /// Maxamounts of fire stacks a mob can get #define MAX_FIRE_STACKS 20 diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index e24ea5e862e4d..60db08791205a 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -39,7 +39,7 @@ * Timing should be based on how timing progresses on clients, not the server. * * Tracking this is more expensive, - * should only be used in conjuction with things that have to progress client side, such as + * should only be used in conjunction with things that have to progress client side, such as * animate() or sound() */ #define TIMER_CLIENT_TIME (1<<2) @@ -81,15 +81,15 @@ ///Nothing happens #define INITIALIZE_HINT_NORMAL 0 /** - * call LateInitialize at the end of all atom Initalization + * call LateInitialize at the end of all atom Initialization * * The item will be added to the late_loaders list, this is iterated over after - * initalization of subsystems is complete and calls LateInitalize on the atom + * initialization of subsystems is complete and calls LateInitalize on the atom * see [this file for the LateIntialize proc](atom.html#proc/LateInitialize) */ #define INITIALIZE_HINT_LATELOAD 1 -///Call qdel on the atom after intialization +///Call qdel on the atom after initialization #define INITIALIZE_HINT_QDEL 2 ///type and all subtypes should always immediately call Initialize in New() @@ -106,23 +106,23 @@ //! ### SS initialization hints /** - * Negative values incidate a failure or warning of some kind, positive are good. - * 0 and 1 are unused so that TRUE and FALSE are guarenteed to be invalid values. + * Negative values indicate a failure or warning of some kind, positive are good. + * 0 and 1 are unused so that TRUE and FALSE are guaranteed to be invalid values. */ /// Subsystem failed to initialize entirely. Print a warning, log, and disable firing. #define SS_INIT_FAILURE -2 -/// The default return value which must be overriden. Will succeed with a warning. +/// The default return value which must be overridden. Will succeed with a warning. #define SS_INIT_NONE -1 -/// Subsystem initialized sucessfully. +/// Subsystem initialized successfully. #define SS_INIT_SUCCESS 2 /// If your system doesn't need to be initialized (by being disabled or something) #define SS_INIT_NO_NEED 3 -/// Succesfully initialized, BUT do not announce it to players (generally to hide game mechanics it would otherwise spoil) +/// Successfully initialized, BUT do not announce it to players (generally to hide game mechanics it would otherwise spoil) #define SS_INIT_NO_MESSAGE 4 //! ### SS initialization load orders @@ -137,7 +137,7 @@ #define INIT_ORDER_BLACKBOX 94 #define INIT_ORDER_SERVER_MAINT 93 #define INIT_ORDER_INPUT 85 -#define INIT_ORDER_ADMIN_VERBS 84 // needs to be pretty high, admins cant do much without it +#define INIT_ORDER_ADMIN_VERBS 84 // needs to be pretty high, admins can't do much without it #define INIT_ORDER_SOUNDS 83 #define INIT_ORDER_INSTRUMENTS 82 #define INIT_ORDER_GREYSCALE 81 @@ -157,6 +157,7 @@ #define INIT_ORDER_TCG 55 #define INIT_ORDER_AUTOMAPPER 51 // BANDASTATION EDIT ADDITION #define INIT_ORDER_MAPPING 50 +#define INIT_ORDER_AI_IDLE_CONTROLLERS 50 #define INIT_ORDER_EARLY_ASSETS 48 #define INIT_ORDER_RESEARCH 47 #define INIT_ORDER_TIMETRACK 46 @@ -193,7 +194,7 @@ // Subsystem fire priority, from lowest to highest priority // If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child) - +#define FIRE_PRIORITY_IDLE_NPC 5 #define FIRE_PRIORITY_PING 10 #define FIRE_PRIORITY_SERVER_MAINT 10 #define FIRE_PRIORITY_RESEARCH 10 diff --git a/code/__DEFINES/text.dm b/code/__DEFINES/text.dm index 8b0fda53cd79e..3b5cb5d795011 100644 --- a/code/__DEFINES/text.dm +++ b/code/__DEFINES/text.dm @@ -112,3 +112,7 @@ #define SPLASH_FILE "splashes.json" ///File location for mother hallucination lines #define MOTHER_FILE "mother.json" + +#define ALPHABET list("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z") +#define VOWELS list("a", "e", "i", "o", "u") +#define CONSONANTS (ALPHABET - VOWELS) diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index 17464b44dae81..4766b3dfe661e 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,18 +1,19 @@ // tgstation-server DMAPI +// The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in IETF RFC 2119. -#define TGS_DMAPI_VERSION "7.1.3" +#define TGS_DMAPI_VERSION "7.2.1" // All functions and datums outside this document are subject to change with any version and should not be relied on. // CONFIGURATION -/// Create this define if you want to do TGS configuration outside of this file. +/// Consumers SHOULD create this define if you want to do TGS configuration outside of this file. #ifndef TGS_EXTERNAL_CONFIGURATION -// Comment this out once you've filled in the below. +// Consumers MUST comment this out once you've filled in the below and are not using [TGS_EXTERNAL_CONFIGURATION]. #error TGS API unconfigured -// Uncomment this if you wish to allow the game to interact with TGS 3.. +// Consumers MUST uncomment this if you wish to allow the game to interact with TGS version 3. // This will raise the minimum required security level of your game to TGS_SECURITY_TRUSTED due to it utilizing call()(). //#define TGS_V3_API @@ -52,7 +53,7 @@ #ifndef TGS_FILE2TEXT_NATIVE #ifdef file2text -#error Your codebase is re-defining the BYOND proc file2text. The DMAPI requires the native version to read the result of world.Export(). You can fix this by adding "#define TGS_FILE2TEXT_NATIVE file2text" before your override of file2text to allow the DMAPI to use the native version. This will only be used for world.Export(), not regular file accesses +#error Your codebase is re-defining the BYOND proc file2text. The DMAPI requires the native version to read the result of world.Export(). You SHOULD fix this by adding "#define TGS_FILE2TEXT_NATIVE file2text" before your override of file2text to allow the DMAPI to use the native version. This will only be used for world.Export(), not regular file accesses #endif #define TGS_FILE2TEXT_NATIVE file2text #endif @@ -152,16 +153,17 @@ //REQUIRED HOOKS /** - * Call this somewhere in [/world/proc/New] that is always run. This function may sleep! + * Consumers MUST call this somewhere in [/world/proc/New] that is always run. This function may sleep! * * * event_handler - Optional user defined [/datum/tgs_event_handler]. * * minimum_required_security_level: The minimum required security level to run the game in which the DMAPI is integrated. Can be one of [TGS_SECURITY_ULTRASAFE], [TGS_SECURITY_SAFE], or [TGS_SECURITY_TRUSTED]. + * * http_handler - Optional user defined [/datum/tgs_http_handler]. */ -/world/proc/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE) +/world/proc/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE, datum/tgs_http_handler/http_handler) return /** - * Call this when your initializations are complete and your game is ready to play before any player interactions happen. + * Consumers MUST call this when world initializations are complete and the game is ready to play before any player interactions happen. * * This may use [/world/var/sleep_offline] to make this happen so ensure no changes are made to it while this call is running. * Afterwards, consider explicitly setting it to what you want to avoid this BYOND bug: http://www.byond.com/forum/post/2575184 @@ -170,12 +172,10 @@ /world/proc/TgsInitializationComplete() return -/// Put this at the start of [/world/proc/Topic]. +/// Consumers MUST run this macro at the start of [/world/proc/Topic]. #define TGS_TOPIC var/tgs_topic_return = TgsTopic(args[1]); if(tgs_topic_return) return tgs_topic_return -/** - * Call this as late as possible in [world/proc/Reboot] (BEFORE ..()). - */ +/// Consumers MUST call this as late as possible in [world/proc/Reboot] (BEFORE ..()). /world/proc/TgsReboot() return @@ -269,7 +269,7 @@ /// The [/datum/tgs_chat_channel] the user was from. var/datum/tgs_chat_channel/channel -/// User definable handler for TGS events. +/// User definable handler for TGS events This abstract version SHOULD be overridden to be used. /datum/tgs_event_handler /// If the handler receieves [TGS_EVENT_HEALTH_CHECK] events. var/receive_health_checks = FALSE @@ -283,7 +283,41 @@ set waitfor = FALSE return -/// User definable chat command. +/// User definable handler for HTTP calls. This abstract version MUST be overridden to be used. +/datum/tgs_http_handler + +/** + * User definable callback for executing HTTP GET requests. + * MUST perform BYOND sleeps while the request is in flight. + * MUST return a [/datum/tgs_http_result]. + * SHOULD log its own errors + * + * url - The full URL to execute the GET request for including query parameters. + */ +/datum/tgs_http_handler/proc/PerformGet(url) + CRASH("[type]/PerformGet not implemented!") + +/// Result of a [/datum/tgs_http_handler] call. MUST NOT be overridden. +/datum/tgs_http_result + /// HTTP response as text + var/response_text + /// Boolean request success flag. Set for any 2XX response code. + var/success + +/** + * Create a [/datum/tgs_http_result]. + * + * * response_text - HTTP response as text. Must be provided in New(). + * * success - Boolean request success flag. Set for any 2XX response code. Must be provided in New(). + */ +/datum/tgs_http_result/New(response_text, success) + if(response_text && !istext(response_text)) + CRASH("response_text was not text!") + + src.response_text = response_text + src.success = success + +/// User definable chat command. This abstract version MUST be overridden to be used. /datum/tgs_chat_command /// The string to trigger this command on a chat bot. e.g `@bot name ...` or `!tgs name ...`. var/name = "" @@ -296,21 +330,27 @@ /** * Process command activation. Should return a [/datum/tgs_message_content] to respond to the issuer with. + * MUST be implemented * - * sender - The [/datum/tgs_chat_user] who issued the command. - * params - The trimmed string following the command `/datum/tgs_chat_command/var/name]. + * * sender - The [/datum/tgs_chat_user] who issued the command. + * * params - The trimmed string following the command `/datum/tgs_chat_command/var/name]. */ /datum/tgs_chat_command/proc/Run(datum/tgs_chat_user/sender, params) CRASH("[type] has no implementation for Run()") -/// User definable chat message. +/// User definable chat message. MUST NOT be overridden. /datum/tgs_message_content - /// The tring content of the message. Must be provided in New(). + /// The string content of the message. Must be provided in New(). var/text /// The [/datum/tgs_chat_embed] to embed in the message. Not supported on all chat providers. var/datum/tgs_chat_embed/structure/embed +/** + * Create a [/datum/tgs_message_content]. + * + * * text - The string content of the message. + */ /datum/tgs_message_content/New(text) ..() if(!istext(text)) @@ -319,7 +359,7 @@ src.text = text -/// User definable chat embed. Currently mirrors Discord chat embeds. See https://discord.com/developers/docs/resources/channel#embed-object-embed-structure for details. +/// User definable chat embed. Currently mirrors Discord chat embeds. See https://discord.com/developers/docs/resources/message#embed-object for details. /datum/tgs_chat_embed/structure var/title var/description @@ -331,13 +371,13 @@ /// Colour must be #AARRGGBB or #RRGGBB hex string. var/colour - /// See https://discord.com/developers/docs/resources/channel#embed-object-embed-image-structure for details. + /// See https://discord.com/developers/docs/resources/message#embed-object-embed-image-structure for details. var/datum/tgs_chat_embed/media/image - /// See https://discord.com/developers/docs/resources/channel#embed-object-embed-thumbnail-structure for details. + /// See https://discord.com/developers/docs/resources/message#embed-object-embed-thumbnail-structure for details. var/datum/tgs_chat_embed/media/thumbnail - /// See https://discord.com/developers/docs/resources/channel#embed-object-embed-image-structure for details. + /// See https://discord.com/developers/docs/resources/message#embed-object-embed-video-structure for details. var/datum/tgs_chat_embed/media/video var/datum/tgs_chat_embed/footer/footer @@ -346,7 +386,7 @@ var/list/datum/tgs_chat_embed/field/fields -/// Common datum for similar discord embed medias. +/// Common datum for similar Discord embed medias. /datum/tgs_chat_embed/media /// Must be set in New(). var/url @@ -354,6 +394,7 @@ var/height var/proxy_url +/// Create a [/datum/tgs_chat_embed]. /datum/tgs_chat_embed/media/New(url) ..() if(!istext(url)) @@ -361,13 +402,14 @@ src.url = url -/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-footer-structure for details. +/// See https://discord.com/developers/docs/resources/message#embed-object-embed-footer-structure for details. /datum/tgs_chat_embed/footer /// Must be set in New(). var/text var/icon_url var/proxy_icon_url +/// Create a [/datum/tgs_chat_embed/footer]. /datum/tgs_chat_embed/footer/New(text) ..() if(!istext(text)) @@ -375,16 +417,17 @@ src.text = text -/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-provider-structure for details. +/// See https://discord.com/developers/docs/resources/message#embed-object-embed-provider-structure for details. /datum/tgs_chat_embed/provider var/name var/url -/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-author-structure for details. Must have name set in New(). +/// See https://discord.com/developers/docs/resources/message#embed-object-embed-author-structure for details. Must have name set in New(). /datum/tgs_chat_embed/provider/author var/icon_url var/proxy_icon_url +/// Create a [/datum/tgs_chat_embed/footer]. /datum/tgs_chat_embed/provider/author/New(name) ..() if(!istext(name)) @@ -392,12 +435,15 @@ src.name = name -/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-field-structure for details. Must have name and value set in New(). +/// See https://discord.com/developers/docs/resources/message#embed-object-embed-field-structure for details. /datum/tgs_chat_embed/field + /// Must be set in New(). var/name + /// Must be set in New(). var/value var/is_inline +/// Create a [/datum/tgs_chat_embed/field]. /datum/tgs_chat_embed/field/New(name, value) ..() if(!istext(name)) diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 294d32ddc3b0f..11b1e0d2b3127 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -24,7 +24,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_PULL_BLOCKED "pullblocked" /// Abstract condition that prevents movement if being pulled and might be resisted against. Handcuffs and straight jackets, basically. #define TRAIT_RESTRAINED "restrained" -/// Apply this to make a mob not dense, and remove it when you want it to no longer make them undense, other sorces of undesity will still apply. Always define a unique source when adding a new instance of this! +/// Apply this to make a mob not dense, and remove it when you want it to no longer make them undense, other sources of undesity will still apply. Always define a unique source when adding a new instance of this! #define TRAIT_UNDENSE "undense" /// Expands our FOV by 30 degrees if restricted #define TRAIT_EXPANDED_FOV "expanded_fov" @@ -50,7 +50,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_DEAF "deaf" #define TRAIT_FAT "fat" #define TRAIT_HUSK "husk" -///Blacklisted from being revived via defibrilator +///Blacklisted from being revived via defibrillator #define TRAIT_DEFIB_BLACKLISTED "defib_blacklisted" #define TRAIT_BADDNA "baddna" #define TRAIT_CLUMSY "clumsy" @@ -149,8 +149,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_MUTANT_COLORS "mutcolors" /// Species with this trait have mutant colors that cannot be chosen by the player, nor altered ingame by external means #define TRAIT_FIXED_MUTANT_COLORS "fixed_mutcolors" -/// Species with this trait have a haircolor that cannot be chosen by the player, nor altered ingame by external means -#define TRAIT_FIXED_HAIRCOLOR "fixed_haircolor" /// Humans with this trait won't get bloody hands, nor bloody feet #define TRAIT_NO_BLOOD_OVERLAY "no_blood_overlay" /// Humans with this trait cannot have underwear @@ -171,7 +169,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NO_ZOMBIFY "no_zombify" /// Carbons with this trait can't have their DNA copied by diseases nor changelings #define TRAIT_NO_DNA_COPY "no_dna_copy" -/// Carbons with this trait cant have their dna scrambled by genetics or a disease retrovirus. +/// Carbons with this trait can't have their DNA scrambled by genetics or a disease retrovirus. #define TRAIT_NO_DNA_SCRAMBLE "no_dna_scramble" /// Carbons with this trait can eat blood to regenerate their own blood volume, instead of injecting it #define TRAIT_DRINKS_BLOOD "drinks_blood" @@ -227,10 +225,16 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_EXAMINE_FISHING_SPOT "examine_fishing_spot" ///lobstrosities and carps will prioritize/flee from those that have this trait (given by the skill-locked hat) #define TRAIT_SCARY_FISHERMAN "scary_fisherman" +///This trait lets you get the size and weight of the fish by examining them +#define TRAIT_EXAMINE_FISH "examine_fish" +///This trait lets you roughly know if the fish is dead, starving, drowning or sick by examining them +#define TRAIT_EXAMINE_DEEPER_FISH "examine_deeper_fish" ///Trait given to turfs or objects that can be fished from #define TRAIT_FISHING_SPOT "fishing_spot" ///Trait given to mobs that can fish without a rod #define TRAIT_PROFOUND_FISHER "profound_fisher" +/// If an atom has this trait, then you can toss a bottle with a message in it. +#define TRAIT_MESSAGE_IN_A_BOTTLE_LOCATION "message_in_a_bottle_location" /// This trait lets you evaluate someone's fitness level against your own #define TRAIT_EXAMINE_FITNESS "reveal_power_level" /// These mobs have particularly hygienic tongues @@ -251,7 +255,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Stop the mob from sliding around from being slipped, but not the slip part. /// DOES NOT include ice slips. #define TRAIT_NO_SLIP_SLIDE "noslip_slide" -/// Stops all slipping and sliding from ocurring +/// Stops all slipping and sliding from occurring #define TRAIT_NO_SLIP_ALL "noslip_all" /// Unlinks gliding from movement speed, meaning that there will be a delay between movements rather than a single move movement between tiles @@ -263,7 +267,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NODEATH "nodeath" #define TRAIT_NOHARDCRIT "nohardcrit" #define TRAIT_NOSOFTCRIT "nosoftcrit" +/// Makes someone show up as mindshielded on sechuds. Does NOT actually make them unconvertable - See TRAIT_UNCONVERTABLE for that #define TRAIT_MINDSHIELD "mindshield" +/// Makes it impossible for someone to be converted by cult/revs/etc. +#define TRAIT_UNCONVERTABLE "unconvertable" #define TRAIT_DISSECTED "dissected" #define TRAIT_SURGICALLY_ANALYZED "surgically_analyzed" /// Lets the user succumb even if they got NODEATH @@ -357,16 +364,14 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_GUNFLIP "gunflip" /// Increases chance of getting special traumas, makes them harder to cure #define TRAIT_SPECIAL_TRAUMA_BOOST "special_trauma_boost" -/// Doubles the duration and cooldown of a flip -#define TRAIT_SLOW_FLIP "slow_flip" #define TRAIT_SPACEWALK "spacewalk" -/// Sanity trait to keep track of when we're in hyperspace and add the appropriate element if we werent +/// Sanity trait to keep track of when we're in hyperspace and add the appropriate element if we weren't #define TRAIT_HYPERSPACED "hyperspaced" ///Gives the movable free hyperspace movement without being pulled during shuttle transit #define TRAIT_FREE_HYPERSPACE_MOVEMENT "free_hyperspace_movement" ///Lets the movable move freely in the soft-cordon area of transit space, which would otherwise teleport them away just before they got to see the true cordon #define TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT "free_hyperspace_softcordon_movement" -///Deletes the object upon being dumped into space, usually from exiting hyperspace. Useful if you're spawning in a lot of stuff for hyperspace events that dont need to flood the entire game +///Deletes the object upon being dumped into space, usually from exiting hyperspace. Useful if you're spawning in a lot of stuff for hyperspace events that don't need to flood the entire game #define TRAIT_DEL_ON_SPACE_DUMP "del_on_hyperspace_leave" /// We can walk up or around cliffs, or at least we don't fall off of it #define TRAIT_CLIFF_WALKER "cliff_walker" @@ -419,6 +424,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_ANTENNAE "antennae" /// Blowing kisses actually does damage to the victim #define TRAIT_KISS_OF_DEATH "kiss_of_death" +/// Syndie kisses can apply burn damage +#define TRAIT_SYNDIE_KISS "syndie_kiss" /// Used to activate french kissing #define TRAIT_GARLIC_BREATH "kiss_of_garlic_death" /// Addictions don't tick down, basically they're permanently addicted @@ -431,7 +438,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_BLOODSHOT_EYES "bloodshot_eyes" /// This mob should never close UI even if it doesn't have a client #define TRAIT_PRESERVE_UI_WITHOUT_CLIENT "preserve_ui_without_client" -/// This mob overrides certian SSlag_switch measures with this special trait +/// This mob overrides certain SSlag_switch measures with this special trait #define TRAIT_BYPASS_MEASURES "bypass_lagswitch_measures" /// Someone can safely be attacked with honorbound with ONLY a combat mode check, the trait is assuring holding a weapon and hitting won't hurt them.. #define TRAIT_ALLOWED_HONORBOUND_ATTACK "allowed_honorbound_attack" @@ -527,9 +534,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Mobs with this trait cannot be hit by projectiles, meaning the projectiles will just go through. #define TRAIT_UNHITTABLE_BY_PROJECTILES "unhittable_by_projectiles" -/// Projectile with this trait will always hit the defined zone of a struck living mob. -#define TRAIT_ALWAYS_HIT_ZONE "always_hit_zone" - /// Mobs with this trait do care about a few grisly things, such as digging up graves. They also really do not like bringing people back to life or tending wounds, but love autopsies and amputations. #define TRAIT_MORBID "morbid" @@ -574,6 +578,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait that determines vulnerability to being stunned from a shove #define TRAIT_STUN_ON_NEXT_SHOVE "stun on next shove" +/// Trait that determines whether our mob gains more strength from drinking during a fist fight +#define TRAIT_DRUNKEN_BRAWLER "drunken brawler" + // METABOLISMS // Various jobs on the station have historically had better reactions // to various drinks and foodstuffs. Security liking donuts is a classic @@ -667,6 +674,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// This movable atom has the explosive block element #define TRAIT_BLOCKING_EXPLOSIVES "blocking_explosives" +///This mob is currently blocking a projectile. +#define TRAIT_BLOCKING_PROJECTILES "blocking_projectiles" ///Lava will be safe to cross while it has this trait. #define TRAIT_LAVA_STOPPED "lava_stopped" ///Chasms will be safe to cross while they've this trait. @@ -733,16 +742,18 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_FOOD_SILVER "food_silver" /// If this item's been made by a chef instead of being map-spawned or admin-spawned or such #define TRAIT_FOOD_CHEF_MADE "food_made_by_chef" +/// This atom has a quality_food_ingredient element attached +#define TRAIT_QUALITY_FOOD_INGREDIENT "quality_food_ingredient" /// The items needs two hands to be carried #define TRAIT_NEEDS_TWO_HANDS "needstwohands" /// Can't be catched when thrown #define TRAIT_UNCATCHABLE "uncatchable" -/// Fish in this won't die -#define TRAIT_FISH_SAFE_STORAGE "fish_case" /// Stuff that can go inside fish cases #define TRAIT_FISH_CASE_COMPATIBILE "fish_case_compatibile" /// If the item can be used as a bit. #define TRAIT_FISHING_BAIT "fishing_bait" +/// This bait will kill any fish that doesn't have it on its favorite_bait list +#define TRAIT_POISONOUS_BAIT "poisonous_bait" /// The quality of the bait. It influences odds of catching fish #define TRAIT_BASIC_QUALITY_BAIT "baic_quality_bait" #define TRAIT_GOOD_QUALITY_BAIT "good_quality_bait" @@ -928,6 +939,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_MECHA_CREATED_NORMALLY "trait_mecha_created_normally" ///fish traits +#define TRAIT_FISH_STASIS "fish_stasis" +#define TRAIT_FISH_FLOPPING "fish_flopping" #define TRAIT_RESIST_EMULSIFY "resist_emulsify" #define TRAIT_FISH_SELF_REPRODUCE "fish_self_reproduce" #define TRAIT_FISH_NO_MATING "fish_no_mating" @@ -942,6 +955,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_FISH_FROM_CASE "fish_from_case" ///Fish will also occasionally fire weak tesla zaps #define TRAIT_FISH_ELECTROGENESIS "fish_electrogenesis" +///Offsprings from this fish will never be of its same type (unless it's self-reproducing). +#define TRAIT_FISH_RECESSIVE "fish_recessive" +///This fish comes equipped with a stinger (increased damage and potentially venomous if also toxic) +#define TRAIT_FISH_STINGER "fish_stinger" /// Trait given to angelic constructs to let them purge cult runes #define TRAIT_ANGELIC "angelic" @@ -1039,6 +1056,13 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// things with this trait are treated as having no access in /atom/movable/proc/check_access(obj/item) #define TRAIT_ALWAYS_NO_ACCESS "alwaysnoaccess" +///The entity has Silicon 'access', so is either a silicon, has an access wand, or is an admin ghost AI. +///This is put on the mob, it is used on the client for Admins but they are the exception as they use `isAdminGhostAI`. +#define TRAIT_SILICON_ACCESS "silicon_access_trait" +///The entity has AI 'access', so is either an AI, has an access wand, or is an admin ghost AI. Used to block off regular Silicons from things. +///This is put on the mob, it is used on the client for Admins but they are the exception as they use `isAdminGhostAI`. +#define TRAIT_AI_ACCESS "ai_access_trait" + ///Used by wearable_client_colour to determine whether the mob wants to have the colours of the screen affected by worn items (some still do regardless). #define TRAIT_SEE_WORN_COLOURS "see_worn_colour" @@ -1084,14 +1108,16 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Currently fishing #define TRAIT_GONE_FISHING "fishing" +/// Currently fishing, and it's the active minigame phase +#define TRAIT_ACTIVELY_FISHING "actively_fishing" -/// Makes a species be better/worse at tackling depending on their wing's status +/// Makes a character be better/worse at tackling depending on their wing's status #define TRAIT_TACKLING_WINGED_ATTACKER "tacking_winged_attacker" -/// Makes a species be frail and more likely to roll bad results if they hit a wall +/// Makes a character be frail and more likely to roll bad results if they hit a wall #define TRAIT_TACKLING_FRAIL_ATTACKER "tackling_frail_attacker" -/// Makes a species be better/worse at defending against tackling depending on their tail's status +/// Makes a character be better/worse at defending against tackling depending on their tail's status #define TRAIT_TACKLING_TAILED_DEFENDER "tackling_tailed_defender" /// Is runechat for this atom/movable currently disabled, regardless of prefs or anything? @@ -1189,6 +1215,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait given to anything linked to, not necessarily allied to, the mansus #define TRAIT_MANSUS_TOUCHED "mansus_touched" + +// These traits are used in IS_X() as an OR, and is utilized for pseudoantags (such as deathmatch or domains) so they don't need to actually get antag status. +// To specifically and only get the antag datum, GET_X() exists now. +#define TRAIT_ACT_AS_CULTIST "act_as_cultist" +#define TRAIT_ACT_AS_HERETIC "act_as_heretic" + /// Appiled when wizard buy (/datum/spellbook_entry/perks/spalls_lottery) perk. /// Give 50/25% chance not spend a spellbook charge on 1/2 cost spell. /// Appiled it wizard can't refund any spells. diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm index f11cc50dbbd58..ecdbdd15e3591 100644 --- a/code/__DEFINES/traits/sources.dm +++ b/code/__DEFINES/traits/sources.dm @@ -36,6 +36,8 @@ #define VENDING_MACHINE_TRAIT "vending_machine" +///A trait given by a held item +#define HELD_ITEM_TRAIT "held-item-trait" #define ABSTRACT_ITEM_TRAIT "abstract-item" /// A trait given by any status effect #define STATUS_EFFECT_TRAIT "status-effect" @@ -45,7 +47,8 @@ /// Trait given by an Action datum #define ACTION_TRAIT "action" - +///A trait given by someone blocking. +#define BLOCKING_TRAIT "blocking" #define CLOTHING_TRAIT "clothing" #define HELMET_TRAIT "helmet" /// inherited from the mask diff --git a/code/__DEFINES/uplink.dm b/code/__DEFINES/uplink.dm index cdfdf4680f792..929b558dfec47 100644 --- a/code/__DEFINES/uplink.dm +++ b/code/__DEFINES/uplink.dm @@ -36,7 +36,7 @@ /// Typepath used for uplink items which don't actually produce an item (essentially just a placeholder) /// Future todo: Make this not necessary / make uplink items support item-less items natively -#define ABSTRACT_UPLINK_ITEM /obj/effect/gibspawner/generic +#define ABSTRACT_UPLINK_ITEM /obj/item/loot_table_maker /// Lower threshold for which an uplink items's TC cost is considered "low" for spy bounties picking rewards #define SPY_LOWER_COST_THRESHOLD 5 diff --git a/code/__HELPERS/_dreamluau.dm b/code/__HELPERS/_dreamluau.dm index 76d38effd19a2..1e1e315a2aebd 100644 --- a/code/__HELPERS/_dreamluau.dm +++ b/code/__HELPERS/_dreamluau.dm @@ -1,6 +1,12 @@ -#define DREAMLUAU (world.system_type == MS_WINDOWS ? "dreamluau.dll" : "libdreamluau.so") +/* This comment bypasses grep checks */ /var/__dreamluau -#define DREAMLUAU_CALL(func) call_ext(DREAMLUAU, "byond:[#func]") +/* This comment also bypasses grep checks */ /var/__dreamluau_exists + +#define DREAMLUAU_EXISTS (__dreamluau_exists ||= fexists(DREAMLUAU)) + +#define DREAMLUAU (world.system_type == MS_WINDOWS ? "dreamluau.dll" : (__dreamluau ||= __detect_auxtools("dreamluau"))) + +#define DREAMLUAU_CALL(func) (!DREAMLUAU_EXISTS) ? null : call_ext(DREAMLUAU, "byond:[#func]") /** * All of the following functions will return a string if the underlying rust code returns an error or a wrapped panic. diff --git a/code/__HELPERS/_planes.dm b/code/__HELPERS/_planes.dm index 779319114076f..87e9ff2d1ce69 100644 --- a/code/__HELPERS/_planes.dm +++ b/code/__HELPERS/_planes.dm @@ -29,8 +29,8 @@ // Now for the more niche things -/// Takes an object, new plane, and multipler, and offsets the plane -/// This is for cases where you have a multipler precalculated, and just want to use it +/// Takes an object, new plane, and multiplier, and offsets the plane +/// This is for cases where you have a multiplier precalculated, and just want to use it /// Often an optimization, sometimes a necessity #define SET_PLANE_W_SCALAR(thing, new_value, multiplier) (thing.plane = GET_NEW_PLANE(new_value, multiplier)) diff --git a/code/__HELPERS/atmospherics.dm b/code/__HELPERS/atmospherics.dm index 2a59cf60b403f..9ebafd5fbb528 100644 --- a/code/__HELPERS/atmospherics.dm +++ b/code/__HELPERS/atmospherics.dm @@ -105,13 +105,13 @@ GLOBAL_LIST_EMPTY(gas_handbook) factor_info["factor_name"] = factor factor_info["factor_type"] = "misc" if(factor == "Temperature" || factor == "Pressure") - factor_info["tooltip"] = "Reaction is influenced by the [LOWER_TEXT(factor)] of the place where the reaction is occuring." + factor_info["tooltip"] = "Reaction is influenced by the [LOWER_TEXT(factor)] of the place where the reaction is occurring." else if(factor == "Energy") factor_info["tooltip"] = "Energy released by the reaction, may or may not result in linear temperature change depending on a slew of other factors." else if(factor == "Radiation") factor_info["tooltip"] = "This reaction emits dangerous radiation! Take precautions." else if (factor == "Location") - factor_info["tooltip"] = "This reaction has special behaviour when occuring in specific locations." + factor_info["tooltip"] = "This reaction has special behaviour when occurring in specific locations." else if(factor == "Hot Ice") factor_info["tooltip"] = "Hot ice are solidified stacks of plasma. Ignition of one will result in a raging fire." reaction_info["factors"] += list(factor_info) @@ -138,13 +138,13 @@ GLOBAL_LIST_EMPTY(gas_handbook) factor_info["factor_name"] = factor factor_info["factor_type"] = "misc" if(factor == "Temperature" || factor == "Pressure") - factor_info["tooltip"] = "Reaction is influenced by the [LOWER_TEXT(factor)] of the place where the reaction is occuring." + factor_info["tooltip"] = "Reaction is influenced by the [LOWER_TEXT(factor)] of the place where the reaction is occurring." else if(factor == "Energy") factor_info["tooltip"] = "Energy released by the reaction, may or may not result in linear temperature change depending on a slew of other factors." else if(factor == "Radiation") factor_info["tooltip"] = "This reaction emits dangerous radiation! Take precautions." else if (factor == "Location") - factor_info["tooltip"] = "This reaction has special behaviour when occuring in specific locations." + factor_info["tooltip"] = "This reaction has special behaviour when occurring in specific locations." reaction_info["factors"] += list(factor_info) GLOB.reaction_handbook += list(reaction_info) qdel(reaction) diff --git a/code/__HELPERS/construction.dm b/code/__HELPERS/construction.dm index f7b0ece13f894..166a009f06661 100644 --- a/code/__HELPERS/construction.dm +++ b/code/__HELPERS/construction.dm @@ -61,7 +61,7 @@ . = new target.type(target.drop_location(), amount, FALSE, target.mats_per_unit) /** - * divides a list of materials uniformly among all contents of the target_object reccursively + * divides a list of materials uniformly among all contents of the target_object recursively * Used to set materials of printed items with their design cost by taking into consideration their already existing materials * e.g. if 12 iron is to be divided uniformly among 2 objects A, B who's current iron contents are 3 & 7 * Then first we normalize those values i.e. find their weights to decide who gets an higher share of iron @@ -81,7 +81,7 @@ target_object.set_custom_materials(custom_materials, multiplier) return - //Step 1: Get reccursive contents of all objects, only filter obj cause that what's material container accepts + //Step 1: Get recursive contents of all objects, only filter obj cause that what's material container accepts var/list/reccursive_contents = target_object.get_all_contents_type(/obj/item) //Step 2: find the sum of each material type per object and record their amounts into an 2D list diff --git a/code/__HELPERS/duplicating.dm b/code/__HELPERS/duplicating.dm index 225dca91fb5b1..f0f3f9a9fce97 100644 --- a/code/__HELPERS/duplicating.dm +++ b/code/__HELPERS/duplicating.dm @@ -15,8 +15,6 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars, list( "contents", "cooldowns", "_datum_components", - "external_organs", - "external_organs_slot", "group", "hand_bodyparts", "held_items", diff --git a/code/__HELPERS/heap.dm b/code/__HELPERS/heap.dm index eeabfa6a20b4e..ede4c39f95040 100644 --- a/code/__HELPERS/heap.dm +++ b/code/__HELPERS/heap.dm @@ -26,7 +26,7 @@ swim(length(L)) //removes and returns the first element of the heap -//(i.e the max or the min dependant on the comparison function) +//(i.e the max or the min dependent on the comparison function) /datum/heap/proc/pop() if(!length(L)) return 0 diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 8d8727a90b052..127ae5387e1b0 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -272,7 +272,7 @@ world Blend(mask_icon, ICON_ADD) /// Converts an rgb color into a list storing hsva -/// Exists because it's useful to have a guarenteed alpha value +/// Exists because it's useful to have a guaranteed alpha value /proc/rgb2hsv(rgb) var/list/hsv = rgb2num(rgb, COLORSPACE_HSV) if(length(hsv) < 4) @@ -815,11 +815,11 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) /// generates a filename for a given asset. /// like generate_asset_name(), except returns the rsc reference and the rsc file hash as well as the asset name (sans extension) -/// used so that certain asset files dont have to be hashed twice +/// used so that certain asset files don't have to be hashed twice /proc/generate_and_hash_rsc_file(file, dmi_file_path) var/rsc_ref = fcopy_rsc(file) var/hash - //if we have a valid dmi file path we can trust md5'ing the rsc file because we know it doesnt have the bug described in http://www.byond.com/forum/post/2611357 + //if we have a valid dmi file path we can trust md5'ing the rsc file because we know it doesn't have the bug described in http://www.byond.com/forum/post/2611357 if(dmi_file_path) hash = md5(rsc_ref) else //otherwise, we need to do the expensive fcopy() workaround @@ -845,7 +845,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) fdel(savefile_path) return new /savefile(savefile_path) catch(var/exception/error) - // if we failed to create a dummy once, try again; maybe someone slept somewhere they shouldnt have + // if we failed to create a dummy once, try again; maybe someone slept somewhere they shouldn't have if(from_failure) // this *is* the retry, something fucked up CRASH("get_dummy_savefile failed to create a dummy savefile: '[error]'") return get_dummy_savefile(from_failure = TRUE) @@ -890,18 +890,18 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) var/atom/atom_icon = icon icon = atom_icon.icon //atom icons compiled in from 'icons/path/to/dmi_file.dmi' are weird and not really icon objects that you generate with icon(). - //if theyre unchanged dmi's then they're stringifiable to "icons/path/to/dmi_file.dmi" + //if they're unchanged dmi's then they're stringifiable to "icons/path/to/dmi_file.dmi" if(isicon(icon) && isfile(icon)) - //icons compiled in from 'icons/path/to/dmi_file.dmi' at compile time are weird and arent really /icon objects, - ///but they pass both isicon() and isfile() checks. theyre the easiest case since stringifying them gives us the path we want + //icons compiled in from 'icons/path/to/dmi_file.dmi' at compile time are weird and aren't really /icon objects, + ///but they pass both isicon() and isfile() checks. they're the easiest case since stringifying them gives us the path we want var/icon_ref = text_ref(icon) var/locate_icon_string = "[locate(icon_ref)]" icon_path = locate_icon_string else if(isicon(icon) && "[icon]" == "/icon") - // icon objects generated from icon() at runtime are icons, but they ARENT files themselves, they represent icon files. + // icon objects generated from icon() at runtime are icons, but they AREN'T files themselves, they represent icon files. // if the files they represent are compile time dmi files in the rsc, then // the rsc reference returned by fcopy_rsc() will be stringifiable to "icons/path/to/dmi_file.dmi" var/rsc_ref = fcopy_rsc(icon) @@ -960,7 +960,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) if(!length(targets)) return - //check if the given object is associated with a dmi file in the icons folder. if it is then we dont need to do a lot of work + //check if the given object is associated with a dmi file in the icons folder. if it is then we don't need to do a lot of work //for asset generation to get around byond limitations var/icon_path = get_icon_dmi_path(thing) @@ -1004,7 +1004,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) var/list/name_and_ref = generate_and_hash_rsc_file(icon2collapse, icon_path)//pretend that tuples exist - var/rsc_ref = name_and_ref[1] //weird object thats not even readable to the debugger, represents a reference to the icons rsc entry + var/rsc_ref = name_and_ref[1] //weird object that's not even readable to the debugger, represents a reference to the icons rsc entry var/file_hash = name_and_ref[2] key = "[name_and_ref[3]].png" @@ -1239,6 +1239,8 @@ GLOBAL_LIST_EMPTY(transformation_animation_objects) var/mutable_appearance/alert_overlay = new(source) alert_overlay.pixel_x = 0 alert_overlay.pixel_y = 0 + alert_overlay.pixel_z = 0 + alert_overlay.pixel_w = 0 var/scale = 1 var/list/icon_dimensions = get_icon_dimensions(source.icon) diff --git a/code/__HELPERS/levels.dm b/code/__HELPERS/levels.dm index 096655ad748bd..ca2cd3c5db3a3 100644 --- a/code/__HELPERS/levels.dm +++ b/code/__HELPERS/levels.dm @@ -56,5 +56,5 @@ // Syndicate recon outpost is on some moon or something return TRUE - // Finally, more specific checks are ran for edge cases, such as lazyily loaded map templates or away missions. Not perfect. + // Finally, more specific checks are ran for edge cases, such as lazily loaded map templates or away missions. Not perfect. return istype(what_turf) && what_turf.planetary_atmos && what_turf.has_gravity() diff --git a/code/__HELPERS/logging/mob.dm b/code/__HELPERS/logging/mob.dm index 7b4b0ac070586..b6bebf74f689b 100644 --- a/code/__HELPERS/logging/mob.dm +++ b/code/__HELPERS/logging/mob.dm @@ -1,5 +1,5 @@ /** - * Logs a mesage to the mob_tags log, including the mobs tag + * Logs a message to the mob_tags log, including the mobs tag * Arguments: * * text - text to log. */ diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm index 0271b2e4601cc..5a55fd46fd296 100644 --- a/code/__HELPERS/maths.dm +++ b/code/__HELPERS/maths.dm @@ -60,7 +60,7 @@ var/y_distance_sign = SIGN(y_distance) var/x = abs_x_distance >> 1 //Counters for steps taken, setting to distance/2 - var/y = abs_y_distance >> 1 //Bit-shifting makes me l33t. It also makes get_line() unnessecarrily fast. + var/y = abs_y_distance >> 1 //Bit-shifting makes me l33t. It also makes get_line() unnecessarily fast. if(abs_x_distance >= abs_y_distance) //x distance is greater than y for(var/distance_counter in 0 to (abs_x_distance - 1))//It'll take abs_x_distance steps to get there @@ -86,7 +86,7 @@ /** * Get a list of turfs in a perimeter given the `center_atom` and `radius`. - * Automatically rounds down decimals and does not accept values less than positive 1 as they dont play well with it. + * Automatically rounds down decimals and does not accept values less than positive 1 as they don't play well with it. * Is efficient on large circles but ugly on small ones * Uses [Jesko`s method to the midpoint circle Algorithm](https://en.wikipedia.org/wiki/Midpoint_circle_algorithm). */ diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index ba1f7fc4e1d15..7c8e84e226d23 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -542,8 +542,8 @@ GLOBAL_LIST_INIT(skin_tone_names, list( * When passed the difference between two temperatures returns the amount of change to temperature to apply. * The change rate should be kept at a low value tween 0.16 and 0.02 for optimal results. * vars: - * * temp_diff (required) The differance between two temperatures - * * change_rate (optional)(Default: 0.06) The rate of range multiplyer + * * temp_diff (required) The difference between two temperatures + * * change_rate (optional)(Default: 0.06) The rate of range multiplier */ /proc/get_temp_change_amount(temp_diff, change_rate = 0.06) if(temp_diff < 0) @@ -693,6 +693,8 @@ GLOBAL_LIST_INIT(skin_tone_names, list( slot_strings += "dextrous storage" if(slot_flags & ITEM_SLOT_BACKPACK) slot_strings += "backpack" + if(slot_flags & ITEM_SLOT_BELTPACK) + slot_strings += "belt" // ? return slot_strings ///Returns the direction that the initiator and the target are facing diff --git a/code/__HELPERS/paths/path.dm b/code/__HELPERS/paths/path.dm index 189120b76c3bc..9530a5452351a 100644 --- a/code/__HELPERS/paths/path.dm +++ b/code/__HELPERS/paths/path.dm @@ -16,7 +16,7 @@ */ /proc/get_path_to(atom/movable/caller, atom/end, max_distance = 30, mintargetdist, access=list(), simulated_only = TRUE, turf/exclude, skip_first=TRUE, diagonal_handling=DIAGONAL_REMOVE_CLUNKY) var/list/hand_around = list() - // We're guarenteed that list will be the first list in pathfinding_finished's argset because of how callback handles the arguments list + // We're guaranteed that list will be the first list in pathfinding_finished's argset because of how callback handles the arguments list var/datum/callback/await = list(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(pathfinding_finished), hand_around)) if(!SSpathfinder.pathfind(caller, end, max_distance, mintargetdist, access, simulated_only, exclude, skip_first, diagonal_handling, await)) return list() @@ -49,7 +49,7 @@ */ /proc/get_swarm_path_to(atom/movable/caller, atom/end, max_distance = 30, mintargetdist, age = MAP_REUSE_INSTANT, access = list(), simulated_only = TRUE, turf/exclude, skip_first=TRUE) var/list/hand_around = list() - // We're guarenteed that list will be the first list in pathfinding_finished's argset because of how callback handles the arguments list + // We're guaranteed that list will be the first list in pathfinding_finished's argset because of how callback handles the arguments list var/datum/callback/await = list(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(pathfinding_finished), hand_around)) if(!SSpathfinder.swarmed_pathfind(caller, end, max_distance, mintargetdist, age, access, simulated_only, exclude, skip_first, await)) return list() @@ -62,7 +62,7 @@ /proc/get_sssp(atom/movable/caller, max_distance = 30, access = list(), simulated_only = TRUE, turf/exclude) var/list/hand_around = list() - // We're guarenteed that list will be the first list in pathfinding_finished's argset because of how callback handles the arguments list + // We're guaranteed that list will be the first list in pathfinding_finished's argset because of how callback handles the arguments list var/datum/callback/await = list(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(pathfinding_finished), hand_around)) if(!SSpathfinder.build_map(caller, get_turf(caller), max_distance, access, simulated_only, exclude, await)) return null @@ -335,7 +335,7 @@ src.has_gravity = construct_from.has_gravity() if(ismob(construct_from)) var/mob/living/mob_construct = construct_from - src.incapacitated = mob_construct.incapacitated() + src.incapacitated = mob_construct.incapacitated if(mob_construct.buckled) src.buckled_info = new(mob_construct.buckled, access, no_id, call_depth + 1) if(isobserver(construct_from)) diff --git a/code/__HELPERS/paths/sssp.dm b/code/__HELPERS/paths/sssp.dm index f735c66469487..21e520ea0164c 100644 --- a/code/__HELPERS/paths/sssp.dm +++ b/code/__HELPERS/paths/sssp.dm @@ -130,7 +130,7 @@ /// Returns a new /datum/pathfind/sssp based off our settings /// Will have an invalid source mob, no max distance, and no ending callback /datum/path_map/proc/settings_to_path() - // Default creation to not set any vars incidentially + // Default creation to not set any vars incidentally var/static/mob/jeremy = new() var/datum/pathfind/sssp/based_on_what = new() based_on_what.setup(pass_info, null, INFINITY, pass_space, avoid) @@ -155,7 +155,7 @@ working_index -= 1 var/list/hand_around = list() - // We're guarenteed that hand_around will be the first list in pathfinding_finished's argset because of how callback handles the arguments list + // We're guaranteed that hand_around will be the first list in pathfinding_finished's argset because of how callback handles the arguments list var/datum/callback/await = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(pathfinding_finished), hand_around) // We're gonna build a pathfind datum from our settings and set it running diff --git a/code/__HELPERS/reagents.dm b/code/__HELPERS/reagents.dm index cb87e21cefa54..51ff7df475ee1 100644 --- a/code/__HELPERS/reagents.dm +++ b/code/__HELPERS/reagents.dm @@ -180,14 +180,23 @@ else return null -///Returns a random reagent object minus blacklisted reagents -/proc/get_random_reagent_id() - var/static/list/random_reagents = list() - if(!random_reagents.len) +///Returns a random reagent object, with the option to blacklist reagents. +/proc/get_random_reagent_id(list/blacklist) + var/static/list/reagent_static_list = list() //This is static, and will be used by default if a blacklist is not passed. + var/list/reagent_list_to_process + if(blacklist) //If we do have a blacklist, we recompile a new list with the excluded reagents not present and pick from there. + reagent_list_to_process = list() + else + reagent_list_to_process = reagent_static_list + + if(!reagent_list_to_process.len) for(var/datum/reagent/reagent_path as anything in subtypesof(/datum/reagent)) + if(is_path_in_list(reagent_path, blacklist)) + continue if(initial(reagent_path.chemical_flags) & REAGENT_CAN_BE_SYNTHESIZED) - random_reagents += reagent_path - var/picked_reagent = pick(random_reagents) + reagent_list_to_process += reagent_path + + var/picked_reagent = pick(reagent_list_to_process) return picked_reagent ///Returns a random reagent consumable ethanol object minus blacklisted reagents diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index ed8d882393b5c..71e80014bb54a 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -192,7 +192,7 @@ GLOBAL_LIST_INIT(achievements_unlocked, list()) if(human_mob.mind && (length(human_mob.mind.antag_datums) > 0)) for(var/datum/antagonist/antag_datums as anything in human_mob.mind.antag_datums) - if(!antag_datums.hardcore_random_bonus) //dont give bonusses to dumb stuff like revs or hypnos + if(!antag_datums.hardcore_random_bonus) //don't give bonuses to dumb stuff like revs or hypnos continue if(initial(antag_datums.can_assign_self_objectives) && !antag_datums.can_assign_self_objectives) continue // You don't get a prize if you picked your own objective, you can't fail those diff --git a/code/__HELPERS/sorts/sort_instance.dm b/code/__HELPERS/sorts/sort_instance.dm index bd1bbe0582a28..eaae55c18d399 100644 --- a/code/__HELPERS/sorts/sort_instance.dm +++ b/code/__HELPERS/sorts/sort_instance.dm @@ -392,7 +392,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new()) var/count1 = 0 //# of times in a row that first run won var/count2 = 0 // " " " " " " second run won - //do the straightfoward thin until one run starts winning consistently + //do the straightforward thin until one run starts winning consistently do //ASSERT(len1 > 1 && len2 > 0) @@ -417,7 +417,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new()) while((count1 | count2) < minGallop) - //one run is winning consistently so galloping may provide huge benifits + //one run is winning consistently so galloping may provide huge benefits //so try galloping, until such time as the run is no longer consistently winning do //ASSERT(len1 > 1 && len2 > 0) @@ -493,7 +493,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new()) var/count1 = 0 //# of times in a row that first run won var/count2 = 0 // " " " " " " second run won - //do the straightfoward thing until one run starts winning consistently + //do the straightforward thing until one run starts winning consistently do //ASSERT(len1 > 0 && len2 > 1) if(call(cmp)(fetchElement(L,cursor2), fetchElement(L,cursor1)) < 0) @@ -516,7 +516,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new()) break outer while((count1 | count2) < minGallop) - //one run is winning consistently so galloping may provide huge benifits + //one run is winning consistently so galloping may provide huge benefits //so try galloping, until such time as the run is no longer consistently winning do //ASSERT(len1 > 0 && len2 > 1) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index feea67939f836..ee9e734428487 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -71,7 +71,7 @@ return t t = matchMiddle.group[1] - // Replace any non-space whitespace characters with spaces, and also multiple occurences with just one space + // Replace any non-space whitespace characters with spaces, and also multiple occurrences with just one space var/static/regex/matchSpacing = new(@"\s+", "g") t = replacetext(t, matchSpacing, " ") @@ -153,7 +153,7 @@ /** * Filters out undesirable characters from names. * - * * strict - return null immidiately instead of filtering out + * * strict - return null immediately instead of filtering out * * allow_numbers - allows numbers and common special characters - used for silicon/other weird things names * * cap_after_symbols - words like Bob's will be capitalized to Bob'S by default. False is good for titles. */ @@ -169,7 +169,7 @@ var/char = "" // This is a sanity short circuit, if the users name is three times the maximum allowable length of name - // We bail out on trying to process the name at all, as it could be a bug or malicious input and we dont + // We bail out on trying to process the name at all, as it could be a bug or malicious input and we don't // Want to iterate all of it. if(t_len > 3 * MAX_NAME_LEN) return @@ -1142,8 +1142,8 @@ GLOBAL_LIST_INIT(binary, list("0","1")) return word var/first_letter = copytext(word, 1, 2) var/first_two_letters = copytext(word, 1, 3) - var/first_word_is_vowel = (first_letter in list("a", "e", "i", "o", "u")) - var/second_word_is_vowel = (copytext(word, 2, 3) in list("a", "e", "i", "o", "u")) + var/first_word_is_vowel = (first_letter in VOWELS) + var/second_word_is_vowel = (copytext(word, 2, 3) in VOWELS) //If a word starts with a vowel add the word "way" at the end of the word. if(first_word_is_vowel) return word + pick("yay", "way", "hay") //in cultures around the world it's different, so heck lets have fun and make it random. should still be readable diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm index 93da26ef292f8..c4867ba999373 100644 --- a/code/__HELPERS/turfs.dm +++ b/code/__HELPERS/turfs.dm @@ -76,7 +76,7 @@ Turf and target are separate in case you want to teleport some distance from a t //destination_list = new() /*This will draw a block around the target turf, given what the error is. Specifying the values above will basically draw a different sort of block. - If the values are the same, it will be a square. If they are different, it will be a rectengle. + If the values are the same, it will be a square. If they are different, it will be a rectangle. In either case, it will center based on offset. Offset is position from center. Offset always calculates in relation to direction faced. In other words, depending on the direction of the teleport, the offset should remain positioned in relation to destination.*/ @@ -206,7 +206,7 @@ Turf and target are separate in case you want to teleport some distance from a t * NOTE: if your atom has non-standard bounds then this proc * will handle it, but: * if the bounds are even, then there are an even amount of "middle" turfs, the one to the EAST, NORTH, or BOTH is picked - * this may seem bad, but you're atleast as close to the center of the atom as possible, better than byond's default loc being all the way off) + * this may seem bad, but you're at least as close to the center of the atom as possible, better than byond's default loc being all the way off) * if the bounds are odd, the true middle turf of the atom is returned **/ /proc/get_turf_pixel(atom/checked_atom) diff --git a/code/__HELPERS/visual_effects.dm b/code/__HELPERS/visual_effects.dm index d219d11e1ce82..2b845c2131b00 100644 --- a/code/__HELPERS/visual_effects.dm +++ b/code/__HELPERS/visual_effects.dm @@ -44,9 +44,9 @@ speed /= segments if(parallel) - animate(src, transform = matrices[1], time = speed, loops , flags = ANIMATION_PARALLEL) + animate(src, transform = matrices[1], time = speed, loop = loops, flags = ANIMATION_PARALLEL) else - animate(src, transform = matrices[1], time = speed, loops) + animate(src, transform = matrices[1], time = speed, loop = loops) for(var/i in 2 to segments) //2 because 1 is covered above animate(transform = matrices[i], time = speed) //doesn't have an object argument because this is "Stacking" with the animate call above diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 5186860f53bfd..c42754644bb1a 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -19,7 +19,7 @@ /// We'll use another define to convert uses of the proc over. That'll be all // #define APPEARANCE_SUCCESS_TRACKING -///Used to find the sources of harddels, quite laggy, don't be surpised if it freezes your client for a good while +///Used to find the sources of harddels, quite laggy, don't be surprised if it freezes your client for a good while //#define REFERENCE_TRACKING #ifdef REFERENCE_TRACKING @@ -83,7 +83,8 @@ // If this is uncommented, we do a single run though of the game setup and tear down process with unit tests in between // #define UNIT_TESTS -// If this is uncommented, will attempt to load and initialize prof.dll/libprof.so. +// If this is uncommented, will attempt to load and initialize prof.dll/libprof.so by default. +// Even if it's not defined, you can pass "tracy" via -params in order to try to load it. // We do not ship byond-tracy. Build it yourself here: https://github.com/mafemergency/byond-tracy/ // #define USE_BYOND_TRACY diff --git a/code/_globalvars/admin.dm b/code/_globalvars/admin.dm index 96f07e3cca870..e14a56c16814c 100644 --- a/code/_globalvars/admin.dm +++ b/code/_globalvars/admin.dm @@ -76,6 +76,7 @@ GLOBAL_LIST_INIT(spanname_to_formatting, list( "Drone Radio" = "drone", "Engineering Radio" = "engradio", "Extremely Big" = "extremelybig", + "Entertainment Radio" = "enteradio", "Game Say" = "game say", "Ghost Alert" = "ghostalert", "Green" = "green", diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 27c0d27ec2e92..8db59bccc3532 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -442,6 +442,7 @@ DEFINE_BITFIELD(supports_variations_flags, list( "CLOTHING_NO_VARIATION" = CLOTHING_NO_VARIATION, "CLOTHING_DIGITIGRADE_VARIATION" = CLOTHING_DIGITIGRADE_VARIATION, "CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON" = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON, + "CLOTHING_DIGITIGRADE_MASK" = CLOTHING_DIGITIGRADE_MASK, )) DEFINE_BITFIELD(flora_flags, list( diff --git a/code/_globalvars/lists/basic_ai.dm b/code/_globalvars/lists/basic_ai.dm new file mode 100644 index 0000000000000..8d79c9bfafeaf --- /dev/null +++ b/code/_globalvars/lists/basic_ai.dm @@ -0,0 +1,12 @@ +///all basic ai subtrees +GLOBAL_LIST_EMPTY(ai_subtrees) + +///basic ai controllers based on status +GLOBAL_LIST_INIT(ai_controllers_by_status, list( + AI_STATUS_ON = list(), + AI_STATUS_OFF = list(), + AI_STATUS_IDLE = list(), +)) + +///basic ai controllers based on their z level +GLOBAL_LIST_EMPTY(ai_controllers_by_zlevel) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index faaabd77ba134..82cc3f1cf10b3 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -265,3 +265,5 @@ GLOBAL_LIST_INIT(status_display_state_pictures, list( "blank", "shuttle", )) + +GLOBAL_LIST_INIT(fishing_tips, world.file2list("strings/fishing_tips.txt")) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index e44516d2f2873..fe28ec63969ba 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -151,6 +151,7 @@ GLOBAL_LIST_INIT(common_loot, list( //common: basic items /obj/item/stack/spacecash/c10 = 1, /obj/item/stack/sticky_tape = 1, /obj/item/tank/internals/emergency_oxygen = 1, + /obj/item/paper/paperslip/fishing_tip = 1, //light sources /obj/effect/spawner/random/decoration/glowstick = 1, diff --git a/code/_globalvars/lists/quirks.dm b/code/_globalvars/lists/quirks.dm index 22ef830ea773d..896504beb7b2a 100644 --- a/code/_globalvars/lists/quirks.dm +++ b/code/_globalvars/lists/quirks.dm @@ -92,3 +92,9 @@ GLOBAL_LIST_INIT(organ_choice, list( "Liver" = ORGAN_SLOT_LIVER, "Stomach" = ORGAN_SLOT_STOMACH, )) + +///Paraplegic Quirk +GLOBAL_LIST_INIT(paraplegic_choice, list( + "Default" = FALSE, + "Amputee" = TRUE, +)) diff --git a/code/_globalvars/lists/reagents.dm b/code/_globalvars/lists/reagents.dm index 685eda9357610..dc18f9814c63f 100644 --- a/code/_globalvars/lists/reagents.dm +++ b/code/_globalvars/lists/reagents.dm @@ -49,7 +49,7 @@ GLOBAL_LIST_INIT(chemical_reagents_list, init_chemical_reagent_list()) GLOBAL_LIST(chemical_reactions_results_lookup_list) /// list of all reagents that are parent types used to define a bunch of children - but aren't used themselves as anything. GLOBAL_LIST(fake_reagent_blacklist) -/// Turfs metalgen cant touch +/// Turfs metalgen can't touch GLOBAL_LIST_INIT(blacklisted_metalgen_types, typecacheof(list( /turf/closed/indestructible, //indestructible turfs should be indestructible, metalgen transmutation to plasma allows them to be destroyed /turf/open/indestructible @@ -176,7 +176,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagentlist()) /proc/build_name2reagentlist() . = list() - //build map with keys stored seperatly + //build map with keys stored separately var/list/name_to_reagent = list() var/list/only_names = list() for (var/datum/reagent/reagent as anything in GLOB.chemical_reagents_list) diff --git a/code/_globalvars/lists/typecache.dm b/code/_globalvars/lists/typecache.dm index 805cea677a092..b1460165564e6 100644 --- a/code/_globalvars/lists/typecache.dm +++ b/code/_globalvars/lists/typecache.dm @@ -1,5 +1,5 @@ //please store common type caches here. -//type caches should only be stored here if used in mutiple places or likely to be used in mutiple places. +//type caches should only be stored here if used in multiple places or likely to be used in multiple places. //Note: typecache can only replace istype if you know for sure the thing is at least a datum. diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index dcda2365c4b0f..8a3697eaa4b56 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -19,9 +19,11 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DRYABLE" = TRAIT_DRYABLE, "TRAIT_FOOD_CHEF_MADE" = TRAIT_FOOD_CHEF_MADE, "TRAIT_FOOD_FRIED" = TRAIT_FOOD_FRIED, + "TRAIT_QUALITY_FOOD_INGREDIENT" = TRAIT_QUALITY_FOOD_INGREDIENT, "TRAIT_FOOD_SILVER" = TRAIT_FOOD_SILVER, "TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER, "TRAIT_LIGHTING_DEBUGGED" = TRAIT_LIGHTING_DEBUGGED, + "TRAIT_MESSAGE_IN_A_BOTTLE_LOCATION" = TRAIT_MESSAGE_IN_A_BOTTLE_LOCATION, "TRAIT_RECENTLY_COINED" = TRAIT_RECENTLY_COINED, "TRAIT_RUSTY" = TRAIT_RUSTY, "TRAIT_SPINNING" = TRAIT_SPINNING, @@ -37,7 +39,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_CASTABLE_LOC" = TRAIT_CASTABLE_LOC, "TRAIT_DEL_ON_SPACE_DUMP" = TRAIT_DEL_ON_SPACE_DUMP, "TRAIT_FISH_CASE_COMPATIBILE" = TRAIT_FISH_CASE_COMPATIBILE, - "TRAIT_FISH_SAFE_STORAGE" = TRAIT_FISH_SAFE_STORAGE, "TRAIT_FROZEN" = TRAIT_FROZEN, "TRAIT_HAS_LABEL" = TRAIT_HAS_LABEL, "TRAIT_HEARING_SENSITIVE" = TRAIT_HEARING_SENSITIVE, @@ -117,8 +118,12 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_CONTRABAND" = TRAIT_CONTRABAND, ), /mob = list( + "TRAIT_AI_ACCESS" = TRAIT_AI_ACCESS, "TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING, "TRAIT_ABDUCTOR_TRAINING" = TRAIT_ABDUCTOR_TRAINING, + "TRAIT_ACT_AS_CULTIST" = TRAIT_ACT_AS_CULTIST, + "TRAIT_ACT_AS_HERETIC" = TRAIT_ACT_AS_HERETIC, + "TRAIT_ACTIVELY_FISHING" = TRAIT_ACTIVELY_FISHING, "TRAIT_ADAMANTINE_EXTRACT_ARMOR" = TRAIT_ADAMANTINE_EXTRACT_ARMOR, "TRAIT_ADVANCEDTOOLUSER" = TRAIT_ADVANCEDTOOLUSER, "TRAIT_AGENDER" = TRAIT_AGENDER, @@ -148,6 +153,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_BIRTHDAY_BOY" = TRAIT_BIRTHDAY_BOY, "TRAIT_BLOB_ALLY" = TRAIT_BLOB_ALLY, "TRAIT_BLOCK_SHUTTLE_MOVEMENT" = TRAIT_BLOCK_SHUTTLE_MOVEMENT, + "TRAIT_BLOCKING_PROJECTILES" = TRAIT_BLOCKING_PROJECTILES, "TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS, "TRAIT_BLOODSHOT_EYES" = TRAIT_BLOODSHOT_EYES, "TRAIT_BLOODY_MESS" = TRAIT_BLOODY_MESS, @@ -204,6 +210,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DOUBLE_TAP" = TRAIT_DOUBLE_TAP, "TRAIT_DREAMING" = TRAIT_DREAMING, "TRAIT_DRINKS_BLOOD" = TRAIT_DRINKS_BLOOD, + "TRAIT_DRUNKEN_BRAWLER" = TRAIT_DRUNKEN_BRAWLER, "TRAIT_DUMB" = TRAIT_DUMB, "TRAIT_DWARF" = TRAIT_DWARF, "TRAIT_EASILY_WOUNDED" = TRAIT_EASILY_WOUNDED, @@ -216,6 +223,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_EMOTEMUTE" = TRAIT_EMOTEMUTE, "TRAIT_EMPATH" = TRAIT_EMPATH, "TRAIT_ENTRAILS_READER" = TRAIT_ENTRAILS_READER, + "TRAIT_EXAMINE_DEEPER_FISH" = TRAIT_EXAMINE_DEEPER_FISH, + "TRAIT_EXAMINE_FISH" = TRAIT_EXAMINE_FISH, "TRAIT_EXAMINE_FISHING_SPOT" = TRAIT_EXAMINE_FISHING_SPOT, "TRAIT_EXAMINE_FITNESS" = TRAIT_EXAMINE_FITNESS, "TRAIT_EXPANDED_FOV" = TRAIT_EXPANDED_FOV, @@ -230,7 +239,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_FENCE_CLIMBER" = TRAIT_FENCE_CLIMBER, "TRAIT_FINGERPRINT_PASSTHROUGH" = TRAIT_FINGERPRINT_PASSTHROUGH, "TRAIT_FIST_MINING" = TRAIT_FIST_MINING, - "TRAIT_FIXED_HAIRCOLOR" = TRAIT_FIXED_HAIRCOLOR, "TRAIT_FIXED_MUTANT_COLORS" = TRAIT_FIXED_MUTANT_COLORS, "TRAIT_FLESH_DESIRE" = TRAIT_FLESH_DESIRE, "TRAIT_FLOORED" = TRAIT_FLOORED, @@ -288,6 +296,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_IWASBATONED" = TRAIT_IWASBATONED, "TRAIT_JOLLY" = TRAIT_JOLLY, "TRAIT_KISS_OF_DEATH" = TRAIT_KISS_OF_DEATH, + "TRAIT_SYNDIE_KISS" = TRAIT_SYNDIE_KISS, "TRAIT_KNOCKEDOUT" = TRAIT_KNOCKEDOUT, "TRAIT_KNOW_ENGI_WIRES" = TRAIT_KNOW_ENGI_WIRES, "TRAIT_KNOW_ROBO_WIRES" = TRAIT_KNOW_ROBO_WIRES, @@ -442,11 +451,11 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE, "TRAIT_SIGN_LANG" = TRAIT_SIGN_LANG, "TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS, + "TRAIT_SILICON_ACCESS" = TRAIT_SILICON_ACCESS, "TRAIT_SILICON_EMOTES_ALLOWED" = TRAIT_SILICON_EMOTES_ALLOWED, "TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE, "TRAIT_SKITTISH" = TRAIT_SKITTISH, "TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE, - "TRAIT_SLOW_FLIP" = TRAIT_SLOW_FLIP, "TRAIT_SMOKER" = TRAIT_SMOKER, "TRAIT_SNEAK" = TRAIT_SNEAK, "TRAIT_SNOB" = TRAIT_SNOB, @@ -500,6 +509,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_TUMOR_SUPPRESSION" = TRAIT_TUMOR_SUPPRESSED, "TRAIT_UI_BLOCKED" = TRAIT_UI_BLOCKED, "TRAIT_UNBREAKABLE" = TRAIT_UNBREAKABLE, + "TRAIT_UNCONVERTABLE" = TRAIT_UNCONVERTABLE, "TRAIT_UNDENSE" = TRAIT_UNDENSE, "TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE" = TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE, "TRAIT_UNHUSKABLE" = TRAIT_UNHUSKABLE, @@ -559,6 +569,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NODROP" = TRAIT_NODROP, "TRAIT_OMNI_BAIT" = TRAIT_OMNI_BAIT, "TRAIT_PLANT_WILDMUTATE" = TRAIT_PLANT_WILDMUTATE, + "TRAIT_POISONOUS_BAIT" = TRAIT_POISONOUS_BAIT, "TRAIT_T_RAY_VISIBLE" = TRAIT_T_RAY_VISIBLE, "TRAIT_TRANSFORM_ACTIVE" = TRAIT_TRANSFORM_ACTIVE, "TRAIT_UNCATCHABLE" = TRAIT_UNCATCHABLE, @@ -589,13 +600,17 @@ GLOBAL_LIST_INIT(traits_by_type, list( /obj/item/fish = list( "TRAIT_FISH_AMPHIBIOUS" = TRAIT_FISH_AMPHIBIOUS, "TRAIT_FISH_CROSSBREEDER" = TRAIT_FISH_CROSSBREEDER, + "TRAIT_FISH_ELECTROGENESIS" = TRAIT_FISH_ELECTROGENESIS, "TRAIT_FISH_FED_LUBE" = TRAIT_FISH_FED_LUBE, + "TRAIT_FISH_FLOPPING" = TRAIT_FISH_FLOPPING, "TRAIT_FISH_FROM_CASE" = TRAIT_FISH_FROM_CASE, "TRAIT_FISH_NO_HUNGER" = TRAIT_FISH_NO_HUNGER, "TRAIT_FISH_NO_MATING" = TRAIT_FISH_NO_MATING, + "TRAIT_FISH_RECESSIVE" = TRAIT_FISH_RECESSIVE, "TRAIT_FISH_SELF_REPRODUCE" = TRAIT_FISH_SELF_REPRODUCE, + "TRAIT_FISH_STASIS" = TRAIT_FISH_STASIS, + "TRAIT_FISH_STINGER" = TRAIT_FISH_STINGER, "TRAIT_FISH_TOXIN_IMMUNE" = TRAIT_FISH_TOXIN_IMMUNE, - "TRAIT_FISH_ELECTROGENESIS" = TRAIT_FISH_ELECTROGENESIS, "TRAIT_RESIST_EMULSIFY" = TRAIT_RESIST_EMULSIFY, "TRAIT_YUCKY_FISH" = TRAIT_YUCKY_FISH, ), @@ -632,9 +647,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( /obj/machinery/modular_computer = list( "TRAIT_MODPC_INTERACTING_WITH_FRAME" = TRAIT_MODPC_INTERACTING_WITH_FRAME, ), - /obj/projectile = list( - "TRAIT_ALWAYS_HIT_ZONE" = TRAIT_ALWAYS_HIT_ZONE, - ), /obj/structure = list( "TRAIT_RADSTORM_IMMUNE" = TRAIT_RADSTORM_IMMUNE, ), diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 98c3fd6ab1fca..afb8709109832 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -26,6 +26,8 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( /mob = list( "TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING, "TRAIT_ABDUCTOR_TRAINING" = TRAIT_ABDUCTOR_TRAINING, + "TRAIT_ACT_AS_CULTIST" = TRAIT_ACT_AS_CULTIST, + "TRAIT_ACT_AS_HERETIC" = TRAIT_ACT_AS_HERETIC, "TRAIT_ADVANCEDTOOLUSER" = TRAIT_ADVANCEDTOOLUSER, "TRAIT_AGENDER" = TRAIT_AGENDER, "TRAIT_AGEUSIA" = TRAIT_AGEUSIA, @@ -101,7 +103,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_FEARLESS" = TRAIT_FEARLESS, "TRAIT_FENCE_CLIMBER" = TRAIT_FENCE_CLIMBER, "TRAIT_FIST_MINING" = TRAIT_FIST_MINING, - "TRAIT_FIXED_HAIRCOLOR" = TRAIT_FIXED_HAIRCOLOR, "TRAIT_FIXED_MUTANT_COLORS" = TRAIT_FIXED_MUTANT_COLORS, "TRAIT_FLESH_DESIRE" = TRAIT_FLESH_DESIRE, "TRAIT_FLOORED" = TRAIT_FLOORED, @@ -259,7 +260,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE, "TRAIT_SKITTISH" = TRAIT_SKITTISH, "TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE, - "TRAIT_SLOW_FLIP" = TRAIT_SLOW_FLIP, "TRAIT_SMOKER" = TRAIT_SMOKER, "TRAIT_SNOB" = TRAIT_SNOB, "TRAIT_SOFTSPOKEN" = TRAIT_SOFTSPOKEN, @@ -289,6 +289,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_TRAIT_MEDIBOTCOMINGTHROUGH" = TRAIT_MEDIBOTCOMINGTHROUGH, "TRAIT_TUMOR_SUPPRESSION" = TRAIT_TUMOR_SUPPRESSED, "TRAIT_UI_BLOCKED" = TRAIT_UI_BLOCKED, + "TRAIT_UNCONVERTABLE" = TRAIT_UNCONVERTABLE, "TRAIT_UNDENSE" = TRAIT_UNDENSE, "TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE" = TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE, "TRAIT_UNHUSKABLE" = TRAIT_UNHUSKABLE, @@ -333,13 +334,19 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_MAGNETIC_ID_CARD" = TRAIT_MAGNETIC_ID_CARD, ), /obj/item/fish = list( + "TRAIT_FISH_AMPHIBIOUS" = TRAIT_FISH_AMPHIBIOUS, "TRAIT_FISH_CROSSBREEDER" = TRAIT_FISH_CROSSBREEDER, + "TRAIT_FISH_ELECTROGENESIS" = TRAIT_FISH_ELECTROGENESIS, "TRAIT_FISH_FED_LUBE" = TRAIT_FISH_FED_LUBE, + "TRAIT_FISH_FROM_CASE" = TRAIT_FISH_FROM_CASE, "TRAIT_FISH_NO_HUNGER" = TRAIT_FISH_NO_HUNGER, "TRAIT_FISH_NO_MATING" = TRAIT_FISH_NO_MATING, + "TRAIT_FISH_RECESSIVE" = TRAIT_FISH_RECESSIVE, "TRAIT_FISH_SELF_REPRODUCE" = TRAIT_FISH_SELF_REPRODUCE, + "TRAIT_FISH_STASIS" = TRAIT_FISH_STASIS, + "TRAIT_FISH_STINGER" = TRAIT_FISH_STINGER, "TRAIT_FISH_TOXIN_IMMUNE" = TRAIT_FISH_TOXIN_IMMUNE, - "TRAIT_RESIST_EMULSIFY" = TRAIT_RESIST_EMULSIFY, + "TRAIT_RESIST_EMULSIFY" = TRAIT_RESIST_EMULSIFY, "TRAIT_YUCKY_FISH" = TRAIT_YUCKY_FISH, ), /obj/item/organ/internal/liver = list( diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index ab5b3f4aad974..a4a8ae1cdc41a 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -68,6 +68,8 @@ /atom/movable/Adjacent(atom/neighbor, atom/target, atom/movable/mover) if(neighbor == loc) return TRUE + if(neighbor?.loc == src) + return TRUE var/turf/T = loc if(!istype(T)) return FALSE @@ -79,6 +81,8 @@ /obj/item/Adjacent(atom/neighbor, atom/target, atom/movable/mover, recurse = 1) if(neighbor == loc) return TRUE + if(neighbor?.loc == src) + return TRUE if(isitem(loc)) if(recurse > 0) return loc.Adjacent(neighbor, target, mover, recurse - 1) diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index ec76dee9c8e22..200f56bed971c 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -7,7 +7,7 @@ Note that AI have no need for the adjacency proc, and so this proc is a lot cleaner. */ /mob/living/silicon/ai/DblClickOn(atom/A, params) - if(control_disabled || incapacitated()) + if(control_disabled || incapacitated) return if(ismob(A)) @@ -39,7 +39,7 @@ if(check_click_intercept(params,A)) return - if(control_disabled || incapacitated()) + if(control_disabled || incapacitated) return var/turf/pixel_turf = get_turf_pixel(A) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 1d7e07f7b9912..0c441ba928ee4 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -101,7 +101,7 @@ CtrlClickOn(A) return - if(incapacitated(IGNORE_RESTRAINTS|IGNORE_STASIS)) + if(INCAPACITATED_IGNORING(src, INCAPABLE_RESTRAINTS|INCAPABLE_STASIS)) return face_atom(A) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index a2dda93f4011f..60640d01d5a1f 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -58,7 +58,7 @@ return if(W) - if(incapacitated()) + if(incapacitated) return //while buckled, you can still connect to and control things like doors, but you can't use your modules diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index 84efaf77c5dc9..aaad7457f6d3c 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -2,7 +2,7 @@ icon = 'icons/hud/screen_ai.dmi' /atom/movable/screen/ai/Click() - if(isobserver(usr) || usr.incapacitated()) + if(isobserver(usr) || usr.incapacitated) return TRUE /atom/movable/screen/ai/aicore diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 1b1314bbcd5e5..73497bf418ff1 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -584,7 +584,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( listed_actions.check_against_view() palette_actions.check_against_view() for(var/atom/movable/screen/movable/action_button/floating_button as anything in floating_actions) - var/list/current_offsets = screen_loc_to_offset(floating_button.screen_loc) + var/list/current_offsets = screen_loc_to_offset(floating_button.screen_loc, our_view) // We set the view arg here, so the output will be properly hemm'd in by our new view floating_button.screen_loc = offset_to_screen_loc(current_offsets[1], current_offsets[2], view = our_view) diff --git a/code/_onclick/hud/map_view.dm b/code/_onclick/hud/map_view.dm index bc304f20f8a15..06a4197fe45eb 100644 --- a/code/_onclick/hud/map_view.dm +++ b/code/_onclick/hud/map_view.dm @@ -16,10 +16,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/map_view) /atom/movable/screen/map_view/Destroy() for(var/datum/weakref/client_ref in viewers_to_huds) - var/client/our_client = client_ref.resolve() - if(!our_client) - continue - hide_from(our_client.mob) + hide_from_client(client_ref.resolve()) return ..() @@ -55,12 +52,18 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/map_view) return pop_planes /atom/movable/screen/map_view/proc/hide_from(mob/hide_from) - hide_from?.canon_client.clear_map(assigned_map) - var/client_ref = WEAKREF(hide_from?.canon_client) + hide_from_client(hide_from?.canon_client) +/atom/movable/screen/map_view/proc/hide_from_client(client/hide_from) + if(!hide_from) + return + hide_from.clear_map(assigned_map) + + var/datum/weakref/client_ref = WEAKREF(hide_from) // Make sure we clear the *right* hud var/datum/weakref/hud_ref = viewers_to_huds[client_ref] viewers_to_huds -= client_ref + var/datum/hud/clear_from = hud_ref?.resolve() if(!clear_from) return diff --git a/code/_onclick/hud/parallax/parallax.dm b/code/_onclick/hud/parallax/parallax.dm index 0a3732e134fc4..135c3f0caef6e 100644 --- a/code/_onclick/hud/parallax/parallax.dm +++ b/code/_onclick/hud/parallax/parallax.dm @@ -273,7 +273,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) /atom/movable/screen/parallax_layer/Initialize(mapload, datum/hud/hud_owner, template = FALSE) . = ..() - // Parallax layers are independant of hud, they care about client + // Parallax layers are independent of hud, they care about client // Not doing this will just create a bunch of hard deletes set_new_hud(hud_owner = null) @@ -335,7 +335,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) /atom/movable/screen/parallax_layer/planet icon_state = "planet" blend_mode = BLEND_OVERLAY - absolute = TRUE //Status of seperation + absolute = TRUE //Status of separation speed = 3 layer = 30 diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index dc425083ad896..3bd370120b3a4 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -317,14 +317,14 @@ GLOBAL_LIST_EMPTY(radial_menus) current_page = WRAP(current_page + 1,1,pages+1) update_screen_objects() -/datum/radial_menu/proc/show_to(mob/M) +/datum/radial_menu/proc/show_to(mob/M, offset_x = 0, offset_y = 0) if(current_user) hide() if(!M.client || !anchor) return current_user = M.client //Blank - menu_holder = image(icon='icons/effects/effects.dmi',loc=anchor,icon_state="nothing", layer = RADIAL_BACKGROUND_LAYER) + menu_holder = image(icon='icons/effects/effects.dmi',loc=anchor,icon_state="nothing", layer = RADIAL_BACKGROUND_LAYER, pixel_x = offset_x, pixel_y = offset_y) SET_PLANE_EXPLICIT(menu_holder, ABOVE_HUD_PLANE, M) menu_holder.appearance_flags |= KEEP_APART|RESET_ALPHA|RESET_COLOR|RESET_TRANSFORM menu_holder.vis_contents += elements + close_button @@ -356,7 +356,7 @@ GLOBAL_LIST_EMPTY(radial_menus) Choices should be a list where list keys are movables or text used for element names and return value and list values are movables/icons/images used for element icons */ -/proc/show_radial_menu(mob/user, atom/anchor, list/choices, uniqueid, radius, datum/callback/custom_check, require_near = FALSE, tooltips = FALSE, no_repeat_close = FALSE, radial_slice_icon = "radial_slice", autopick_single_option = TRUE, entry_animation = TRUE, click_on_hover = FALSE) +/proc/show_radial_menu(mob/user, atom/anchor, list/choices, uniqueid, radius, datum/callback/custom_check, require_near = FALSE, tooltips = FALSE, no_repeat_close = FALSE, radial_slice_icon = "radial_slice", autopick_single_option = TRUE, entry_animation = TRUE, click_on_hover = FALSE, user_space = FALSE) if(!user || !anchor || !length(choices)) return @@ -379,11 +379,18 @@ GLOBAL_LIST_EMPTY(radial_menus) menu.radius = radius if(istype(custom_check)) menu.custom_check_callback = custom_check - menu.anchor = anchor + menu.anchor = user_space ? user : anchor menu.radial_slice_icon = radial_slice_icon menu.check_screen_border(user) //Do what's needed to make it look good near borders or on hud menu.set_choices(choices, tooltips, click_on_hover) - menu.show_to(user) + var/offset_x = 0 + var/offset_y = 0 + if (user_space) + var/turf/user_turf = get_turf(user) + var/turf/anchor_turf = get_turf(anchor) + offset_x = (anchor_turf.x - user_turf.x) * world.icon_size + anchor.pixel_x - user.pixel_x + offset_y = (anchor_turf.y - user_turf.y) * world.icon_size + anchor.pixel_y - user.pixel_y + menu.show_to(user, offset_x, offset_y) menu.wait(user, anchor, require_near) var/answer = menu.selected_choice qdel(menu) diff --git a/code/_onclick/hud/rendering/_render_readme.md b/code/_onclick/hud/rendering/_render_readme.md index 2c5e9875801b6..493b9c68491ee 100644 --- a/code/_onclick/hud/rendering/_render_readme.md +++ b/code/_onclick/hud/rendering/_render_readme.md @@ -8,11 +8,11 @@ ## Byond internal functionality This part of the guide will assume that you have read the byond reference entry for rendering at www.byond.com/docs/ref//#/{notes}/renderer -When you create an atom, this will always create an internal byond structure called an "appearance". This appearance you will likely be familiar with, as it is exposed through the /atom/var/appearance var. This appearance var holds data on how to render the object, ie what icon/icon_state/color etc it is using. Note that appearance vars will always copy, and do not hold a reference. When you update a var, for example lets pretend we add a filter, the appearance will be updated to include the filter. Note that, however, vis_contents objets are uniquely excluded from appearances. Then, when the filter is updated, the appearance will be recreated, and the atom marked as "dirty". After it has been updated, the SendMaps() function (sometimes also called maptick), which is a internal byond function that iterates over all objects in a clients view and in the clients.mob.contents, checks for "dirty" atoms, then resends any "dirty" appearances to clients as needed and unmarks them as dirty. This function is notoriosly slow, but we can see its tick usage through the world.map_cpu var. We can also avoid more complex checks checking whether an object is visible on a clients screen by using the TILE_BOUND appearance flag. +When you create an atom, this will always create an internal byond structure called an "appearance". This appearance you will likely be familiar with, as it is exposed through the /atom/var/appearance var. This appearance var holds data on how to render the object, ie what icon/icon_state/color etc it is using. Note that appearance vars will always copy, and do not hold a reference. When you update a var, for example lets pretend we add a filter, the appearance will be updated to include the filter. Note that, however, vis_contents objets are uniquely excluded from appearances. Then, when the filter is updated, the appearance will be recreated, and the atom marked as "dirty". After it has been updated, the SendMaps() function (sometimes also called maptick), which is a internal byond function that iterates over all objects in a clients view and in the clients.mob.contents, checks for "dirty" atoms, then resends any "dirty" appearances to clients as needed and unmarks them as dirty. This function is notoriously slow, but we can see its tick usage through the world.map_cpu var. We can also avoid more complex checks checking whether an object is visible on a clients screen by using the TILE_BOUND appearance flag. -Finally, we arrive at clientside behavior, where we have two main clientside functions: GetMapIcons, and Render. GetMapIcons is repsonsible for actual rendering calculations on the clientside, such as "Group Icons and Set bounds", which performs clientside calculations for transform matrixes. Note that particles here are handled in a separate thread and are not diplayed in the clientside profiler. Render handles the actual drawing of the screen. +Finally, we arrive at clientside behavior, where we have two main clientside functions: GetMapIcons, and Render. GetMapIcons is responsible for actual rendering calculations on the clientside, such as "Group Icons and Set bounds", which performs clientside calculations for transform matrixes. Note that particles here are handled in a separate thread and are not displayed in the clientside profiler. Render handles the actual drawing of the screen. -For debugging rendering issues its reccomended you do two things: +For debugging rendering issues its recommended you do two things: A) Talk to someone who has inside knowledge(like lummox) about it, most of this is undocumented and bugs often B) Use the undocumented debug printer which reads of data on icons rendering, this is very dense but can be useful in some cases. To use: Right click top tab -> Options & Messages -> Client -> Command -> Enter ".debug profile mapicons" and press Enter -> go to your Byond directory and find BYOND/cfg/mapicons.json . Yes this is one giant one-line json. @@ -22,9 +22,9 @@ The following is an incomplete list of pitfalls that come from byond snowflake t 1. Transforms are very slow on clientside. This is not usually noticable, but if you start using large amounts of them it will grind you to a halt quickly, regardless of whether its on overlays or objs 2. The darkness plane. This is unused, as it doesn't work with our rendering format, so this section is purely academic. The darkness plane has specific variables it needs to render correctly, and these can be found in the plane masters file. it is composed internally of two parts, a black mask over the clients screen, and a non rendering mask that blocks all luminosity=0 turfs and their contents from rendering if the SEE_BLACKNESS flag is set properly. The blocker will always block rendering but the mask can be layered under other objects. 3. render_target/source. Render_target/source will only copy certain rendering instructions, and these are only defined as "etc." in the byond reference. Known non copied appearance vars include: blend_mode, plane, layer, vis_contents, mouse_opacity... -4. Large icons on the screen that peek over the edge will instead of only rendering partly like you would expect will instead stretch the screen while not adgusting the render buffer, which means that you can actively see as tiles and map objects are rendered. You can use this for an easy "offscreen" UI. +4. Large icons on the screen that peek over the edge will instead of only rendering partly like you would expect will instead stretch the screen while not adjusting the render buffer, which means that you can actively see as tiles and map objects are rendered. You can use this for an easy "offscreen" UI. 5. Numerically large filters on objects of any size will torpedo performance, even though large objects with small filters will perform massively better. (ie blur(size=20) BAD) -6. Texture Atlas: the texture atlas byond uses to render icons is very susceptible to corruption and can regularily replace icons with other icons or just not render at all. This can be exasperated by alt tabbing or pausing the dreamseeker process. +6. Texture Atlas: the texture atlas byond uses to render icons is very susceptible to corruption and can regularly replace icons with other icons or just not render at all. This can be exasperated by alt tabbing or pausing the dreamseeker process. 7. The renderer is awful code and lummox said he will try changing a large part of it for 515 so keep an eye on that 8. Byond uses DirectX 9 (Lummox said he wants to update to DirectX 11) 9. Particles are just fancy overlays and are not independent of their owner @@ -32,7 +32,7 @@ The following is an incomplete list of pitfalls that come from byond snowflake t 11. Displacement filter: The byond "displacement filter" does not, as the name would make you expect, use displacement maps, but instead uses normal maps. ## The rendering solution -One of the main issues with making pretty effects is how objects can only render to one plane, and how filters can only be applied to single objects. Quite simply it means we cant apply effects to multiple planes at once, and an effect to one plane only by treating it as a single unit: +One of the main issues with making pretty effects is how objects can only render to one plane, and how filters can only be applied to single objects. Quite simply it means we can't apply effects to multiple planes at once, and an effect to one plane only by treating it as a single unit: ![](https://raw.githubusercontent.com/tgstation/documentation-assets/main/rendering/renderpipe_old.png) @@ -50,8 +50,8 @@ Through these this allows us to treat planes as single objects, and lets us dist ## Render plates -The rendering system uses two objects to unify planes: render_relay and render_plates. Render relays use render_target/source and the relay_render_to_plane proc to replicate the plane master on the render relay. This render relay is then rendered onto a render_plate, which is a plane master that renders the render_relays onto itself. This plate can then be hierachically rendered with the same process until it reaches the master render_plate, which is the plate that will actually render to the player. These plates naturally in the byond style have quirks. For example, rendering to two plates will double any effects such as color or filters, and as such you need to carefully manage how you render them. Keep in mind as well that when sorting the layers for rendering on a plane that they should not be negative, this is handled automatically in relay_render_to_plane. When debugging note that mouse_opacity can act bizzarly with this method, such as only allowing you to click things that are layered over objects on a certain plane but auomatically setting the mouse_opacity should be handling this. Note that if you decide to manipulate a plane with internal byond objects that you will have to manually extrapolate the vars that are set if you want to render them to another plane (See blackness plane for example), and that this is not documented anywhere. +The rendering system uses two objects to unify planes: render_relay and render_plates. Render relays use render_target/source and the relay_render_to_plane proc to replicate the plane master on the render relay. This render relay is then rendered onto a render_plate, which is a plane master that renders the render_relays onto itself. This plate can then be hierarchically rendered with the same process until it reaches the master render_plate, which is the plate that will actually render to the player. These plates naturally in the byond style have quirks. For example, rendering to two plates will double any effects such as color or filters, and as such you need to carefully manage how you render them. Keep in mind as well that when sorting the layers for rendering on a plane that they should not be negative, this is handled automatically in relay_render_to_plane. When debugging note that mouse_opacity can act bizarrely with this method, such as only allowing you to click things that are layered over objects on a certain plane but automatically setting the mouse_opacity should be handling this. Note that if you decide to manipulate a plane with internal byond objects that you will have to manually extrapolate the vars that are set if you want to render them to another plane (See blackness plane for example), and that this is not documented anywhere. -Goodluck and godspeed with coding +Good luck and godspeed with coding - Just another contributor diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index d0f6426254936..cb06e00d116ef 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -110,7 +110,7 @@ if(world.time <= usr.next_move) return 1 - if(usr.incapacitated()) + if(usr.incapacitated) return 1 if(ismob(usr)) @@ -143,7 +143,7 @@ screen_loc = ui_building /atom/movable/screen/area_creator/Click() - if(usr.incapacitated() || (isobserver(usr) && !isAdminGhostAI(usr))) + if(usr.incapacitated || (isobserver(usr) && !isAdminGhostAI(usr))) return TRUE var/area/A = get_area(usr) if(!A.outdoors) @@ -204,7 +204,7 @@ if(world.time <= usr.next_move) return TRUE - if(usr.incapacitated(IGNORE_STASIS)) + if(INCAPACITATED_IGNORING(usr, INCAPABLE_STASIS)) return TRUE if(ismecha(usr.loc)) // stops inventory actions in a mech return TRUE @@ -294,7 +294,7 @@ return TRUE if(world.time <= user.next_move) return TRUE - if(user.incapacitated()) + if(user.incapacitated) return TRUE if (ismecha(user.loc)) // stops inventory actions in a mech return TRUE @@ -471,7 +471,7 @@ if(world.time <= usr.next_move) return TRUE - if(usr.incapacitated()) + if(usr.incapacitated) return TRUE if(ismecha(usr.loc)) // stops inventory actions in a mech return TRUE @@ -887,9 +887,9 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/splash) /atom/movable/screen/hunger/update_appearance(updates) var/old_state = state update_hunger_state() // Do this before we call all the other update procs - . = ..() if(state == old_state) // Let's not be wasteful return + . = ..() if(state == HUNGER_STATE_FINE) SetInvisibility(INVISIBILITY_ABSTRACT, name) return @@ -907,9 +907,10 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/splash) remove_filter("hunger_outline") // Update color of the food - underlays -= food_image - food_image.color = state == HUNGER_STATE_FAT ? COLOR_DARK : null - underlays += food_image + if((state == HUNGER_STATE_FAT) != (old_state == HUNGER_STATE_FAT)) + underlays -= food_image + food_image.color = state == HUNGER_STATE_FAT ? COLOR_DARK : null + underlays += food_image /atom/movable/screen/hunger/update_icon_state() . = ..() diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 17de9f9d5cb77..5af9b7e016156 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -270,12 +270,12 @@ /// Called from [/obj/item/proc/attack_atom] and [/obj/item/proc/attack] if the attack succeeds /atom/proc/attacked_by(obj/item/attacking_item, mob/living/user) if(!uses_integrity) - CRASH("attacked_by() was called on an object that doesnt use integrity!") + CRASH("attacked_by() was called on an object that doesn't use integrity!") if(!attacking_item.force) return - var/damage = take_damage(attacking_item.force, attacking_item.damtype, MELEE, 1) + var/damage = take_damage(attacking_item.force, attacking_item.damtype, MELEE, 1, get_dir(src, user)) //only witnesses close by and the victim see a hit message. user.visible_message(span_danger("[user] hits [src] with [attacking_item][damage ? "." : ", without leaving a mark!"]"), \ span_danger("You hit [src] with [attacking_item][damage ? "." : ", without leaving a mark!"]"), null, COMBAT_MESSAGE_RANGE) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 2f1465ac4ffe2..eab5f0a7cd9c9 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -109,11 +109,11 @@ if(!(interaction_flags_atom & INTERACT_ATOM_IGNORE_INCAPACITATED)) var/ignore_flags = NONE if(interaction_flags_atom & INTERACT_ATOM_IGNORE_RESTRAINED) - ignore_flags |= IGNORE_RESTRAINTS + ignore_flags |= INCAPABLE_RESTRAINTS if(!(interaction_flags_atom & INTERACT_ATOM_CHECK_GRAB)) - ignore_flags |= IGNORE_GRAB + ignore_flags |= INCAPABLE_GRAB - if(user.incapacitated(ignore_flags)) + if(INCAPACITATED_IGNORING(user, ignore_flags)) return FALSE return TRUE diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index b7f48fcab5e4a..6ba6cd2de09fc 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -506,7 +506,7 @@ Example config: if(!fexists(file(config_toml))) SSjob.legacy_mode = TRUE - message += "jobconfig.toml not found, falling back to legacy mode (using jobs.txt). To surpress this warning, generate a jobconfig.toml by running the verb 'Generate Job Configuration' in the Server tab.\n\ + message += "jobconfig.toml not found, falling back to legacy mode (using jobs.txt). To suppress this warning, generate a jobconfig.toml by running the verb 'Generate Job Configuration' in the Server tab.\n\ From there, you can then add it to the /config folder of your server to have it take effect for future rounds." if(!fexists(file(config_txt))) diff --git a/code/controllers/failsafe.dm b/code/controllers/failsafe.dm index f6d03eb828d4c..e92e30079b878 100644 --- a/code/controllers/failsafe.dm +++ b/code/controllers/failsafe.dm @@ -16,7 +16,7 @@ GLOBAL_REAL(Failsafe, /datum/controller/failsafe) // The alert level. For every failed poke, we drop a DEFCON level. Once we hit DEFCON 1, restart the MC. var/defcon = 5 //the world.time of the last check, so the mc can restart US if we hang. - // (Real friends look out for *eachother*) + // (Real friends look out for *each other*) var/lasttick = 0 // Track the MC iteration to make sure its still on track. diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 109a82a697e47..c3f0478cedb96 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -78,6 +78,10 @@ GLOBAL_REAL(Master, /datum/controller/master) /// Whether the Overview UI will update as fast as possible for viewers. var/overview_fast_update = FALSE + /// Enables rolling usage averaging + var/use_rolling_usage = FALSE + /// How long to run our rolling usage averaging + var/rolling_usage_length = 5 SECONDS /datum/controller/master/New() if(!config) @@ -151,12 +155,32 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie if(isnull(ui)) ui = new /datum/tgui(user, src, "ControllerOverview") ui.open() + use_rolling_usage = TRUE + +/datum/controller/master/ui_close(mob/user) + var/valid_found = FALSE + for(var/datum/tgui/open_ui as anything in open_uis) + if(open_ui.user == user) + continue + valid_found = TRUE + if(!valid_found) + use_rolling_usage = FALSE + return ..() /datum/controller/master/ui_data(mob/user) var/list/data = list() var/list/subsystem_data = list() for(var/datum/controller/subsystem/subsystem as anything in subsystems) + var/list/rolling_usage = subsystem.rolling_usage + subsystem.prune_rolling_usage() + + // Then we sum + var/sum = 0 + for(var/i in 2 to length(rolling_usage) step 2) + sum += rolling_usage[i] + var/average = sum / DS2TICKS(rolling_usage_length) + subsystem_data += list(list( "name" = subsystem.name, "ref" = REF(subsystem), @@ -167,6 +191,7 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie "doesnt_fire" = !!(subsystem.flags & SS_NO_FIRE), "cost_ms" = subsystem.cost, "tick_usage" = subsystem.tick_usage, + "usage_per_tick" = average, "tick_overrun" = subsystem.tick_overrun, "initialized" = subsystem.initialized, "initialization_failure_message" = subsystem.initialization_failure_message, @@ -175,6 +200,7 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie data["world_time"] = world.time data["map_cpu"] = world.map_cpu data["fast_update"] = overview_fast_update + data["rolling_length"] = rolling_usage_length return data @@ -187,6 +213,13 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie overview_fast_update = !overview_fast_update return TRUE + if("set_rolling_length") + var/length = text2num(params["rolling_length"]) + if(!length || length < 0) + return + rolling_usage_length = length SECONDS + return TRUE + if("view_variables") var/datum/controller/subsystem/subsystem = locate(params["ref"]) in subsystems if(isnull(subsystem)) @@ -542,7 +575,7 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie //Anti-tick-contention heuristics: if (init_stage == INITSTAGE_MAX) - //if there are mutiple sleeping procs running before us hogging the cpu, we have to run later. + //if there are multiple sleeping procs running before us hogging the cpu, we have to run later. // (because sleeps are processed in the order received, longer sleeps are more likely to run first) if (starting_tick_usage > TICK_LIMIT_MC) //if there isn't enough time to bother doing anything this tick, sleep a bit. sleep_delta *= 2 @@ -764,6 +797,12 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie var/state = queue_node.ignite(queue_node_paused) tick_usage = TICK_USAGE - tick_usage + if(use_rolling_usage) + queue_node.prune_rolling_usage() + // Rolling usage is an unrolled list that we know the order off + // OPTIMIZATION POSTING + queue_node.rolling_usage += list(DS2TICKS(world.time), tick_usage) + if(queue_node.profiler_focused) world.Profile(PROFILE_STOP) @@ -903,3 +942,4 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie return FALSE last_profiled = REALTIMEOFDAY SSprofiler.DumpFile(allow_yield = FALSE) + diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index c9a2f07c4ee83..4bde26e3c9d10 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -19,7 +19,7 @@ /// Time to wait (in deciseconds) between each call to fire(). Must be a positive integer. var/wait = 20 - /// Priority Weight: When mutiple subsystems need to run in the same tick, higher priority subsystems will be given a higher share of the tick before MC_TICK_CHECK triggers a sleep, higher priority subsystems also run before lower priority subsystems + /// Priority Weight: When multiple subsystems need to run in the same tick, higher priority subsystems will be given a higher share of the tick before MC_TICK_CHECK triggers a sleep, higher priority subsystems also run before lower priority subsystems var/priority = FIRE_PRIORITY_DEFAULT /// [Subsystem Flags][SS_NO_INIT] to control binary behavior. Flags must be set at compile time or before preinit finishes to take full effect. (You can also restart the mc to force them to process again) @@ -63,6 +63,9 @@ /// Running average of the amount of tick usage (in percents of a game tick) the subsystem has spent past its allocated time without pausing var/tick_overrun = 0 + /// Flat list of usage and time, every odd index is a log time, every even index is a usage + var/list/rolling_usage = list() + /// How much of a tick (in percents of a tick) were we allocated last fire. var/tick_allocation_last = 0 @@ -269,7 +272,7 @@ /datum/controller/subsystem/proc/OnConfigLoad() /** - * Used to initialize the subsystem. This is expected to be overriden by subtypes. + * Used to initialize the subsystem. This is expected to be overridden by subtypes. */ /datum/controller/subsystem/Initialize() return SS_INIT_NONE @@ -299,6 +302,15 @@ if (can_fire && cycles >= 1) postponed_fires += cycles +/// Prunes out of date entries in our rolling usage list +/datum/controller/subsystem/proc/prune_rolling_usage() + var/list/rolling_usage = src.rolling_usage + var/cut_to = 0 + while(cut_to + 2 <= length(rolling_usage) && rolling_usage[cut_to + 1] < DS2TICKS(world.time - Master.rolling_usage_length)) + cut_to += 2 + if(cut_to) + rolling_usage.Cut(1, cut_to + 1) + //usually called via datum/controller/subsystem/New() when replacing a subsystem (i.e. due to a recurring crash) //should attempt to salvage what it can from the old instance of subsystem /datum/controller/subsystem/Recover() diff --git a/code/controllers/subsystem/ai_controllers.dm b/code/controllers/subsystem/ai_controllers.dm index a6badb44a3f0e..30d3c4986f2a2 100644 --- a/code/controllers/subsystem/ai_controllers.dm +++ b/code/controllers/subsystem/ai_controllers.dm @@ -6,40 +6,23 @@ SUBSYSTEM_DEF(ai_controllers) init_order = INIT_ORDER_AI_CONTROLLERS wait = 0.5 SECONDS //Plan every half second if required, not great not terrible. runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - - ///List of all ai_subtree singletons, key is the typepath while assigned value is a newly created instance of the typepath. See setup_subtrees() - var/list/datum/ai_planning_subtree/ai_subtrees = list() - ///Assoc List of all AI statuses and all AI controllers with that status. - var/list/ai_controllers_by_status = list( - AI_STATUS_ON = list(), - AI_STATUS_OFF = list(), - AI_STATUS_IDLE = list(), - ) - ///Assoc List of all AI controllers and the Z level they are on, which we check when someone enters/leaves a Z level to turn them on/off. - var/list/ai_controllers_by_zlevel = list() + ///type of status we are interested in running + var/planning_status = AI_STATUS_ON /// The tick cost of all active AI, calculated on fire. - var/cost_on - /// The tick cost of all idle AI, calculated on fire. - var/cost_idle - + var/our_cost /datum/controller/subsystem/ai_controllers/Initialize() setup_subtrees() return SS_INIT_SUCCESS /datum/controller/subsystem/ai_controllers/stat_entry(msg) - var/list/active_list = ai_controllers_by_status[AI_STATUS_ON] - var/list/inactive_list = ai_controllers_by_status[AI_STATUS_OFF] - var/list/idle_list = ai_controllers_by_status[AI_STATUS_IDLE] - msg = "Active AIs:[length(active_list)]/[round(cost_on,1)]%|Inactive:[length(inactive_list)]|Idle:[length(idle_list)]/[round(cost_idle,1)]%" + var/list/planning_list = GLOB.ai_controllers_by_status[planning_status] + msg = "Planning AIs:[length(planning_list)]/[round(our_cost,1)]%" return ..() /datum/controller/subsystem/ai_controllers/fire(resumed) var/timer = TICK_USAGE_REAL - cost_idle = MC_AVERAGE(cost_idle, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) - - timer = TICK_USAGE_REAL - for(var/datum/ai_controller/ai_controller as anything in ai_controllers_by_status[AI_STATUS_ON]) + for(var/datum/ai_controller/ai_controller as anything in GLOB.ai_controllers_by_status[planning_status]) if(!COOLDOWN_FINISHED(ai_controller, failed_planning_cooldown)) continue @@ -49,18 +32,20 @@ SUBSYSTEM_DEF(ai_controllers) if(!LAZYLEN(ai_controller.current_behaviors)) //Still no plan COOLDOWN_START(ai_controller, failed_planning_cooldown, AI_FAILED_PLANNING_COOLDOWN) - cost_on = MC_AVERAGE(cost_on, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + our_cost = MC_AVERAGE(our_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) ///Creates all instances of ai_subtrees and assigns them to the ai_subtrees list. /datum/controller/subsystem/ai_controllers/proc/setup_subtrees() + if(length(GLOB.ai_subtrees)) + return for(var/subtree_type in subtypesof(/datum/ai_planning_subtree)) var/datum/ai_planning_subtree/subtree = new subtree_type - ai_subtrees[subtree_type] = subtree + GLOB.ai_subtrees[subtree_type] = subtree ///Called when the max Z level was changed, updating our coverage. /datum/controller/subsystem/ai_controllers/proc/on_max_z_changed() - if (!islist(ai_controllers_by_zlevel)) - ai_controllers_by_zlevel = new /list(world.maxz,0) - while (SSai_controllers.ai_controllers_by_zlevel.len < world.maxz) - SSai_controllers.ai_controllers_by_zlevel.len++ - SSai_controllers.ai_controllers_by_zlevel[ai_controllers_by_zlevel.len] = list() + if(!length(GLOB.ai_controllers_by_zlevel)) + GLOB.ai_controllers_by_zlevel = new /list(world.maxz,0) + while (GLOB.ai_controllers_by_zlevel.len < world.maxz) + GLOB.ai_controllers_by_zlevel.len++ + GLOB.ai_controllers_by_zlevel[GLOB.ai_controllers_by_zlevel.len] = list() diff --git a/code/controllers/subsystem/ai_idle_controllers.dm b/code/controllers/subsystem/ai_idle_controllers.dm new file mode 100644 index 0000000000000..367a2c82ffc95 --- /dev/null +++ b/code/controllers/subsystem/ai_idle_controllers.dm @@ -0,0 +1,8 @@ +AI_CONTROLLER_SUBSYSTEM_DEF(ai_idle_controllers) + name = "AI Idle Controllers" + flags = SS_POST_FIRE_TIMING | SS_BACKGROUND + priority = FIRE_PRIORITY_IDLE_NPC + init_order = INIT_ORDER_AI_IDLE_CONTROLLERS + wait = 5 SECONDS + runlevels = RUNLEVEL_GAME + planning_status = AI_STATUS_IDLE diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 1cb3e2dec3783..4557e153db190 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -559,7 +559,7 @@ SUBSYSTEM_DEF(air) // If it's already been processed, then it's already talked to us if(enemy_tile.current_cycle == -INFINITE) continue - // .air instead of .return_air() because we can guarentee that the proc won't do anything + // .air instead of .return_air() because we can guarantee that the proc won't do anything if(potential_diff.air.compare(enemy_tile.air)) //testing("Active turf found. Return value of compare(): [T.air.compare(enemy_tile.air)]") if(!potential_diff.excited) @@ -707,7 +707,7 @@ SUBSYSTEM_DEF(air) CHECK_TICK //this can't be done with setup_atmos_machinery() because -// all atmos machinery has to initalize before the first +// all atmos machinery has to initialize before the first // pipenet can be built. /datum/controller/subsystem/air/proc/setup_pipenets() for (var/obj/machinery/atmospherics/AM in atmos_machinery) diff --git a/code/controllers/subsystem/ambience.dm b/code/controllers/subsystem/ambience.dm index cae5d85246d80..7258b0b16e948 100644 --- a/code/controllers/subsystem/ambience.dm +++ b/code/controllers/subsystem/ambience.dm @@ -124,7 +124,7 @@ SUBSYSTEM_DEF(ambience) client.current_ambient_sound = null return - //Station ambience is dependant on a functioning and charged APC with enviorment power enabled. + //Station ambience is dependent on a functioning and charged APC with environment power enabled. if(!is_mining_level(my_area.z) && ((!my_area.apc || !my_area.apc.operating || !my_area.apc.cell?.charge && my_area.requires_power || !my_area.power_environ))) SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = CHANNEL_BUZZ)) client.current_ambient_sound = null diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 71eaed14ea23f..20d5a093be6da 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -75,7 +75,7 @@ SUBSYSTEM_DEF(atoms) rustg_file_write(json_encode(mapload_init_times), "[GLOB.log_directory]/init_times.json") #endif -/// Actually creates the list of atoms. Exists soley so a runtime in the creation logic doesn't cause initalized to totally break +/// Actually creates the list of atoms. Exists solely so a runtime in the creation logic doesn't cause initialized to totally break /datum/controller/subsystem/atoms/proc/CreateAtoms(list/atoms, list/atoms_to_return = null, mapload_source = null) if (atoms_to_return) LAZYINITLIST(created_atoms) @@ -137,8 +137,8 @@ SUBSYSTEM_DEF(atoms) return null return initialized_state[state_length][1] -/// Use this to set initialized to prevent error states where the old initialized is overriden, and we end up losing all context -/// Accepts a state and a source, the most recent state is used, sources exist to prevent overriding old values accidentially +/// Use this to set initialized to prevent error states where the old initialized is overridden, and we end up losing all context +/// Accepts a state and a source, the most recent state is used, sources exist to prevent overriding old values accidentally /datum/controller/subsystem/atoms/proc/set_tracked_initalized(state, source) if(!length(initialized_state)) base_initialized = initialized diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index 3ea1a9a40d88f..18ba37eb13785 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -152,6 +152,8 @@ SUBSYSTEM_DEF(blackbox) record_feedback("tally", "radio_usage", 1, "centcom") if(FREQ_AI_PRIVATE) record_feedback("tally", "radio_usage", 1, "ai private") + if(FREQ_ENTERTAINMENT) + record_feedback("tally", "radio_usage", 1, "entertainment") if(FREQ_CTF_RED) record_feedback("tally", "radio_usage", 1, "CTF red team") if(FREQ_CTF_BLUE) diff --git a/code/controllers/subsystem/dynamic/dynamic.dm b/code/controllers/subsystem/dynamic/dynamic.dm index a45644813afc4..56fcaac27fcb2 100644 --- a/code/controllers/subsystem/dynamic/dynamic.dm +++ b/code/controllers/subsystem/dynamic/dynamic.dm @@ -140,10 +140,10 @@ SUBSYSTEM_DEF(dynamic) /// The maximum amount of time for antag random events to be hijacked. var/random_event_hijack_maximum = 18 MINUTES - /// What is the lower bound of when the roundstart annoucement is sent out? + /// What is the lower bound of when the roundstart announcement is sent out? var/waittime_l = 600 - /// What is the higher bound of when the roundstart annoucement is sent out? + /// What is the higher bound of when the roundstart announcement is sent out? var/waittime_h = 1800 /// A number between 0 and 100. The maximum amount of threat allowed to generate. diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_latejoin.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_latejoin.dm index d853876fed143..b204b62e965aa 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_latejoin.dm @@ -167,7 +167,7 @@ /// Checks for revhead loss conditions and other antag datums. /datum/dynamic_ruleset/latejoin/provocateur/proc/check_eligible(datum/mind/M) var/turf/T = get_turf(M.current) - if(!considered_afk(M) && considered_alive(M) && is_station_level(T.z) && !M.antag_datums?.len && !HAS_TRAIT(M, TRAIT_MINDSHIELD)) + if(!considered_afk(M) && considered_alive(M) && is_station_level(T.z) && !M.antag_datums?.len && !HAS_MIND_TRAIT(M.current, TRAIT_UNCONVERTABLE)) return TRUE return FALSE diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm index 9396728159480..3476702e741ed 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm @@ -349,6 +349,7 @@ requirements = REQUIREMENTS_VERY_HIGH_THREAT_NEEDED flags = HIGH_IMPACT_RULESET ruleset_lazy_templates = list(LAZY_TEMPLATE_KEY_WIZARDDEN) + signup_item_path = /obj/item/clothing/head/wizard /datum/dynamic_ruleset/midround/from_ghosts/wizard/ready(forced = FALSE) if(!check_candidates()) @@ -388,6 +389,7 @@ requirements = REQUIREMENTS_VERY_HIGH_THREAT_NEEDED ruleset_lazy_templates = list(LAZY_TEMPLATE_KEY_NUKIEBASE) flags = HIGH_IMPACT_RULESET + signup_item_path = /obj/machinery/nuclearbomb var/list/operative_cap = list(2,2,3,3,4,5,5,5,5,5) @@ -433,6 +435,7 @@ cost = 8 minimum_players = 25 repeatable = TRUE + signup_item_path = /obj/structure/blob/normal /datum/dynamic_ruleset/midround/from_ghosts/blob/generate_ruleset_body(mob/applicant) var/body = applicant.become_overmind() @@ -506,6 +509,7 @@ cost = 10 minimum_players = 25 repeatable = TRUE + signup_item_path = /mob/living/basic/alien var/list/vents = list() /datum/dynamic_ruleset/midround/from_ghosts/xenomorph/forget_startup() @@ -554,6 +558,7 @@ cost = 5 minimum_players = 15 repeatable = TRUE + signup_item_path = /obj/item/light_eater /datum/dynamic_ruleset/midround/from_ghosts/nightmare/acceptable(population = 0, threat_level = 0) var/turf/spawn_loc = find_maintenance_spawn(atmos_sensitive = TRUE, require_darkness = TRUE) //Checks if there's a single safe, dark tile on station. @@ -590,6 +595,7 @@ cost = 7 minimum_players = 25 repeatable = TRUE + signup_item_path = /mob/living/basic/space_dragon var/list/spawn_locs = list() /datum/dynamic_ruleset/midround/from_ghosts/space_dragon/forget_startup() @@ -669,6 +675,7 @@ minimum_players = 30 repeatable = TRUE ruleset_lazy_templates = list(LAZY_TEMPLATE_KEY_NINJA_HOLDING_FACILITY) // I mean, no one uses the nets anymore but whateva + signup_item_path = /obj/item/energy_katana var/list/spawn_locs = list() @@ -728,6 +735,7 @@ cost = 5 minimum_players = 15 repeatable = TRUE + signup_item_path = /mob/living/basic/revenant var/dead_mobs_required = 20 var/need_extra_spawns_value = 15 var/list/spawn_locs = list() @@ -870,6 +878,7 @@ cost = 7 minimum_players = 15 repeatable = TRUE + signup_item_path = /obj/effect/meteor/meaty/changeling /datum/dynamic_ruleset/midround/from_ghosts/changeling_midround/generate_ruleset_body(mob/applicant) var/body = generate_changeling_meteor(applicant) diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm index 72554a108e328..999cd156b18d8 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm @@ -574,7 +574,7 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) /// Checks for revhead loss conditions and other antag datums. /datum/dynamic_ruleset/roundstart/revs/proc/check_eligible(datum/mind/M) var/turf/T = get_turf(M.current) - if(!considered_afk(M) && considered_alive(M) && is_station_level(T.z) && !M.antag_datums?.len && !HAS_TRAIT(M, TRAIT_MINDSHIELD)) + if(!considered_afk(M) && considered_alive(M) && is_station_level(T.z) && !M.antag_datums?.len && !HAS_MIND_TRAIT(M.current, TRAIT_UNCONVERTABLE)) return TRUE return FALSE diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 897bf0c4549ba..38fbdaa793bbb 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -8,7 +8,7 @@ SUBSYSTEM_DEF(events) var/list/running = list() ///cache of currently running events, for lag checking. var/list/currentrun = list() - ///The next world.time that a naturally occuring random event can be selected. + ///The next world.time that a naturally occurring random event can be selected. var/scheduled = 0 ///The lower bound for how soon another random event can be scheduled. var/frequency_lower = 2.5 MINUTES diff --git a/code/controllers/subsystem/id_access.dm b/code/controllers/subsystem/id_access.dm index 38bf3b568a1f9..b80e5718128bd 100644 --- a/code/controllers/subsystem/id_access.dm +++ b/code/controllers/subsystem/id_access.dm @@ -291,7 +291,7 @@ SUBSYSTEM_DEF(id_access) desc_by_access["[ACCESS_VIROLOGY]"] = "Virology" desc_by_access["[ACCESS_PSYCHOLOGY]"] = "Psychology" desc_by_access["[ACCESS_CMO]"] = "CMO Office" - desc_by_access["[ACCESS_QM]"] = "Quartermaster" + desc_by_access["[ACCESS_QM]"] = "QM Office" desc_by_access["[ACCESS_SURGERY]"] = "Surgery" desc_by_access["[ACCESS_THEATRE]"] = "Theatre" desc_by_access["[ACCESS_RESEARCH]"] = "Science" @@ -398,6 +398,8 @@ SUBSYSTEM_DEF(id_access) id_card.clear_access() id_card.trim = trim + id_card.big_pointer = trim.big_pointer + id_card.pointer_color = trim.pointer_color if(copy_access) id_card.access = trim.access.Copy() @@ -441,6 +443,8 @@ SUBSYSTEM_DEF(id_access) id_card.department_color_override = trim.department_color id_card.department_state_override = trim.department_state id_card.subdepartment_color_override = trim.subdepartment_color + id_card.big_pointer = trim.big_pointer + id_card.pointer_color = trim.pointer_color if(!check_forged || !id_card.forged) id_card.assignment = trim.assignment @@ -461,6 +465,8 @@ SUBSYSTEM_DEF(id_access) id_card.department_color_override = null id_card.department_state_override = null id_card.subdepartment_color_override = null + id_card.big_pointer = id_card.trim.big_pointer + id_card.pointer_color = id_card.trim.pointer_color /** * Adds the accesses associated with a trim to an ID card. diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index 65dc1e31a1e42..e4e12418a7576 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -19,7 +19,7 @@ VERB_MANAGER_SUBSYSTEM_DEF(input) ///running average of how many movement iterations from player input the server processes every second. used for the subsystem stat entry var/movements_per_second = 0 ///running average of the amount of real time clicks take to truly execute after the command is originally sent to the server. - ///if a click isnt delayed at all then it counts as 0 deciseconds. + ///if a click isn't delayed at all then it counts as 0 deciseconds. var/average_click_delay = 0 /datum/controller/subsystem/verb_manager/input/Initialize() @@ -31,7 +31,7 @@ VERB_MANAGER_SUBSYSTEM_DEF(input) return SS_INIT_SUCCESS -// This is for when macro sets are eventualy datumized +// This is for when macro sets are eventually datumized /datum/controller/subsystem/verb_manager/input/proc/setup_default_macro_sets() macro_set = list( "Any" = "\"KeyDown \[\[*\]\]\"", @@ -75,7 +75,7 @@ VERB_MANAGER_SUBSYSTEM_DEF(input) movements_per_second = MC_AVG_SECONDS(movements_per_second, moves_this_run, wait TICKS) /datum/controller/subsystem/verb_manager/input/run_verb_queue() - var/deferred_clicks_this_run = 0 //acts like current_clicks but doesnt count clicks that dont get processed by SSinput + var/deferred_clicks_this_run = 0 //acts like current_clicks but doesn't count clicks that don't get processed by SSinput for(var/datum/callback/verb_callback/queued_click as anything in verb_queue) if(!istype(queued_click)) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 5c1a32d099c1e..8dce11f137746 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -184,17 +184,20 @@ SUBSYSTEM_DEF(mapping) if(index) lists_to_reserve.Cut(1, index) return - var/turf/T = packet[packetlen] - T.empty(RESERVED_TURF_TYPE, RESERVED_TURF_TYPE, null, TRUE) - LAZYINITLIST(unused_turfs["[T.z]"]) - unused_turfs["[T.z]"] |= T - var/area/old_area = T.loc - LISTASSERTLEN(old_area.turfs_to_uncontain_by_zlevel, T.z, list()) - old_area.turfs_to_uncontain_by_zlevel[T.z] += T - T.turf_flags = UNUSED_RESERVATION_TURF - world_contents += T - LISTASSERTLEN(world_turf_contents_by_z, T.z, list()) - world_turf_contents_by_z[T.z] += T + var/turf/reserving_turf = packet[packetlen] + reserving_turf.empty(RESERVED_TURF_TYPE, RESERVED_TURF_TYPE, null, TRUE) + LAZYINITLIST(unused_turfs["[reserving_turf.z]"]) + unused_turfs["[reserving_turf.z]"] |= reserving_turf + var/area/old_area = reserving_turf.loc + LISTASSERTLEN(old_area.turfs_to_uncontain_by_zlevel, reserving_turf.z, list()) + old_area.turfs_to_uncontain_by_zlevel[reserving_turf.z] += reserving_turf + reserving_turf.turf_flags = UNUSED_RESERVATION_TURF + // reservation turfs are not allowed to interact with atmos at all + reserving_turf.blocks_air = TRUE + + world_contents += reserving_turf + LISTASSERTLEN(world_turf_contents_by_z, reserving_turf.z, list()) + world_turf_contents_by_z[reserving_turf.z] += reserving_turf packet.len-- packetlen = length(packet) @@ -739,6 +742,7 @@ ADMIN_VERB(load_away_mission, R_FUN, "Load Away Mission", "Load a specific away for(var/turf/T as anything in block) // No need to empty() these, because they just got created and are already /turf/open/space/basic. T.turf_flags = UNUSED_RESERVATION_TURF + T.blocks_air = TRUE CHECK_TICK // Gotta create these suckers if we've not done so already diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm index 3a704d01a82fd..f000688fbc71b 100644 --- a/code/controllers/subsystem/materials.dm +++ b/code/controllers/subsystem/materials.dm @@ -35,7 +35,7 @@ SUBSYSTEM_DEF(materials) ///A list of dimensional themes used by the dimensional anomaly and other things, most of which require materials to function. var/list/datum/dimension_theme/dimensional_themes -///Ran on initialize, populated the materials and materials_by_category dictionaries with their appropiate vars (See these variables for more info) +///Ran on initialize, populated the materials and materials_by_category dictionaries with their appropriate vars (See these variables for more info) /datum/controller/subsystem/materials/proc/InitializeMaterials() materials = list() materials_by_type = list() @@ -53,7 +53,7 @@ SUBSYSTEM_DEF(materials) /** Creates and caches a material datum. * - * Arugments: + * Arguments: * - [arguments][/list]: The arguments to use to create the material datum * - The first element is the type of material to initialize. */ @@ -134,7 +134,7 @@ SUBSYSTEM_DEF(materials) value = arguments[key] if(!(istext(key) || isnum(key))) key = REF(key) - key = "[key]" // Key is stringified so numbers dont break things + key = "[key]" // Key is stringified so numbers don't break things if(!isnull(value)) if(!(istext(value) || isnum(value))) value = REF(value) diff --git a/code/controllers/subsystem/modular_computers.dm b/code/controllers/subsystem/modular_computers.dm index c8efa4aa4ee24..0a985fc055c47 100644 --- a/code/controllers/subsystem/modular_computers.dm +++ b/code/controllers/subsystem/modular_computers.dm @@ -1,4 +1,4 @@ -s///The maximum amount of logs that can be generated before they start overwriting eachother. +s///The maximum amount of logs that can be generated before they start overwriting each other. #define MAX_LOG_COUNT 300 SUBSYSTEM_DEF(modular_computers) @@ -47,7 +47,7 @@ SUBSYSTEM_DEF(modular_computers) var/static/list/discounts = list("0.10" = 7, "0.15" = 16, "0.20" = 20, "0.25" = 16, "0.50" = 8, "0.66" = 1) var/static/list/flash_discounts = list("0.30" = 3, "0.40" = 8, "0.50" = 8, "0.66" = 2, "0.75" = 1) - ///Eliminates non-alphanumeri characters, as well as the word "Single-Pack" or "Pack" or "Crate" from the coupon code + ///Eliminates non-alphanumeric characters, as well as the word "Single-Pack" or "Pack" or "Crate" from the coupon code var/static/regex/strip_pack_name = regex("\[^a-zA-Z0-9]|(Single-)?Pack|Crate", "g") var/datum/supply_pack/discounted_pack = pick(GLOB.discountable_packs[pick_weight(GLOB.pack_discount_odds)]) diff --git a/code/controllers/subsystem/overlays.dm b/code/controllers/subsystem/overlays.dm index db94c291a18bd..fda892be7a432 100644 --- a/code/controllers/subsystem/overlays.dm +++ b/code/controllers/subsystem/overlays.dm @@ -17,7 +17,7 @@ SUBSYSTEM_DEF(overlays) /// Don't have access to that type tho, so this is the best you're gonna get /proc/overlays2text(list/overlays) var/list/unique_overlays = list() - // As anything because we're basically doing type coerrsion, rather then actually filtering for mutable apperances + // As anything because we're basically doing type coercion, rather then actually filtering for mutable appearances for(var/mutable_appearance/overlay as anything in overlays) var/key = "[overlay.icon]-[overlay.icon_state]-[overlay.dir]" unique_overlays[key] += 1 diff --git a/code/controllers/subsystem/pathfinder.dm b/code/controllers/subsystem/pathfinder.dm index fa1a7af5c8598..70dc152b06df2 100644 --- a/code/controllers/subsystem/pathfinder.dm +++ b/code/controllers/subsystem/pathfinder.dm @@ -158,7 +158,7 @@ SUBSYSTEM_DEF(pathfinder) /// Takes a set of pathfind info, returns the first valid pathmap that would work if one exists /// Optionally takes a max age to accept (defaults to 0 seconds) and a minimum acceptable range -/// If include_building is true and we can only find a building path, ew'll use that instead. tho we will wait for it to finish first +/// If include_building is true and we can only find a building path, we'll use that instead. tho we will wait for it to finish first /datum/controller/subsystem/pathfinder/proc/get_valid_map(datum/can_pass_info/pass_info, turf/target, simulated_only = TRUE, turf/exclude, age = MAP_REUSE_INSTANT, min_range = -INFINITY, include_building = FALSE) // Walk all the maps that match our caller's turf OR our target's // Then hold onto em. If their cache time is short we can reuse/expand them, if not we'll have to make a new one diff --git a/code/controllers/subsystem/persistence/_persistence.dm b/code/controllers/subsystem/persistence/_persistence.dm index 36679fa1d2a02..6438015d11d38 100644 --- a/code/controllers/subsystem/persistence/_persistence.dm +++ b/code/controllers/subsystem/persistence/_persistence.dm @@ -43,13 +43,22 @@ SUBSYSTEM_DEF(persistence) /// List of persistene ids which piggy banks. var/list/queued_broken_piggy_ids - var/list/broken_piggy_banks - var/rounds_since_engine_exploded = 0 var/delam_highscore = 0 var/tram_hits_this_round = 0 var/tram_hits_last_round = 0 + /// A json database to data/message_bottles.json + var/datum/json_database/message_bottles_database + /// An index used to create unique ids for the message bottles database + var/message_bottles_index = 0 + /** + * A list of non-maploaded photos or papers that met the 0.2% chance to be saved in the message bottles database + * because I don't want the database to feel empty unless there's someone constantly throwing bottles in the + * sea or beach/ocean fishing portals. + */ + var/list/queued_message_bottles + /datum/controller/subsystem/persistence/Initialize() load_poly() load_wall_engravings() @@ -74,11 +83,13 @@ SUBSYSTEM_DEF(persistence) save_scars() save_custom_outfits() save_delamination_counter() + save_queued_message_bottles() if(SStransport.can_fire) for(var/datum/transport_controller/linear/tram/transport as anything in SStransport.transports_by_type[TRANSPORT_TYPE_TRAM]) save_tram_history(transport.specific_transport_id) save_tram_counter() + ///Loads up Poly's speech buffer. /datum/controller/subsystem/persistence/proc/load_poly() for(var/mob/living/basic/parrot/poly/bird in GLOB.alive_mob_list) diff --git a/code/controllers/subsystem/persistence/message_bottles.dm b/code/controllers/subsystem/persistence/message_bottles.dm new file mode 100644 index 0000000000000..ce1efe5e59c5e --- /dev/null +++ b/code/controllers/subsystem/persistence/message_bottles.dm @@ -0,0 +1,54 @@ +///This proc is used to save photos, papers and cash stored inside a bottle when tossed into the ocean. +/datum/controller/subsystem/persistence/proc/save_message_bottle(obj/item/message, bottle_type = /obj/item/reagent_containers/cup/glass/bottle) + if(isnull(message_bottles_database)) + message_bottles_database = new("data/message_bottles.json") + + var/list/data = list() + data["bottle_type"] = text2path(bottle_type) + if(istype(message, /obj/item/paper)) + var/obj/item/paper/paper = message + if(!length(paper.raw_text_inputs) && !length(paper.raw_stamp_data) && !length(paper.raw_field_input_data)) + return + data["paper"] = paper.convert_to_data() + else if(istype(message, /obj/item/photo)) + var/obj/item/photo/photo = message + if(!photo.picture?.id) + return + data["photo_id"] = photo.picture.id + else if(istype(message, /obj/item/stack/spacecash)) + var/obj/item/stack/spacecash/cash = message + data["cash"] = text2path(cash.type) + data["amount"] = cash.amount + message_bottles_index++ + message_bottles_database.set_key("message-[GLOB.round_id]-[message_bottles_index]", data) + +/datum/controller/subsystem/persistence/proc/load_message_bottle(atom/loc) + if(isnull(message_bottles_database)) + message_bottles_database = new("data/message_bottles.json") + + var/list/data = message_bottles_database.pick_and_take_key() + if(!data) + var/obj/item/reagent_containers/cup/glass/bottle/bottle = new(loc) + return bottle + + var/bottle_type = text2path(data["bottle_type"]) || /obj/item/reagent_containers/cup/glass/bottle + var/obj/item/reagent_containers/cup/glass/bottle/bottle = new bottle_type(loc) + bottle.reagents.remove_all(bottle.reagents.maximum_volume) + if(data["photo_id"]) + var/obj/item/photo/old/photo = load_photo_from_disk(data["photo_id"], bottle) + bottle.message_in_a_bottle = photo + else if(data["cash"]) + var/cash_type = text2path(data["cash"]) || /obj/item/stack/spacecash/c10 + var/obj/item/stack/spacecash/cash = new cash_type(bottle, data["amount"]) + bottle.message_in_a_bottle = cash + else if(data["paper"]) + var/obj/item/paper/paper = new(bottle) + paper.write_from_data(data["paper"]) + bottle.message_in_a_bottle = paper + + bottle.update_icon(UPDATE_OVERLAYS) + +/datum/controller/subsystem/persistence/proc/save_queued_message_bottles() + for(var/item in queued_message_bottles) + save_message_bottle(item) + queued_message_bottles = null diff --git a/code/controllers/subsystem/polling.dm b/code/controllers/subsystem/polling.dm index fa219cd3da9f0..6cdcfbfd45949 100644 --- a/code/controllers/subsystem/polling.dm +++ b/code/controllers/subsystem/polling.dm @@ -130,10 +130,9 @@ SUBSYSTEM_DEF(polling) // Image to display var/image/poll_image - if(ispath(alert_pic, /atom)) - poll_image = image(alert_pic) - else if(isatom(alert_pic)) + if(ispath(alert_pic, /atom) || isatom(alert_pic)) poll_image = new /mutable_appearance(alert_pic) + poll_image.pixel_z = 0 else if(!isnull(alert_pic)) poll_image = alert_pic else @@ -176,6 +175,8 @@ SUBSYSTEM_DEF(polling) UNTIL(new_poll.finished) if(!(amount_to_pick > 0)) return new_poll.signed_up + if(length(new_poll.signed_up) < amount_to_pick) + return new_poll.signed_up for(var/pick in 1 to amount_to_pick) new_poll.chosen_candidates += pick_n_take(new_poll.signed_up) if(announce_chosen) diff --git a/code/controllers/subsystem/processing/ai_idle_behaviors.dm b/code/controllers/subsystem/processing/ai_idle_behaviors.dm new file mode 100644 index 0000000000000..cda3d354882f4 --- /dev/null +++ b/code/controllers/subsystem/processing/ai_idle_behaviors.dm @@ -0,0 +1,6 @@ +PROCESSING_SUBSYSTEM_DEF(idle_ai_behaviors) + name = "idle_ai_behaviors" + flags = SS_NO_INIT | SS_BACKGROUND + wait = 1.5 SECONDS + priority = FIRE_PRIORITY_IDLE_NPC + init_order = INIT_ORDER_AI_IDLE_CONTROLLERS //must execute only after ai behaviors are initialized diff --git a/code/controllers/subsystem/processing/fishing.dm b/code/controllers/subsystem/processing/fishing.dm index da10d3d631aef..ca54141de82a8 100644 --- a/code/controllers/subsystem/processing/fishing.dm +++ b/code/controllers/subsystem/processing/fishing.dm @@ -1,7 +1,4 @@ -/** - * So far, only used by the fishing minigame. Feel free to rename it to something like veryfastprocess - * if you need one that fires 10 times a second - */ +/// subsystem for the fishing minigame processing. PROCESSING_SUBSYSTEM_DEF(fishing) name = "Fishing" - wait = 0.1 SECONDS + wait = 0.05 SECONDS // If you raise it to 0.1 SECONDS, you better also modify [datum/fish_movement/move_fish()] diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index f8ee167befbf8..11a055d292ce2 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -1036,7 +1036,7 @@ SUBSYSTEM_DEF(shuttle) return data -/datum/controller/subsystem/shuttle/ui_act(action, params) +/datum/controller/subsystem/shuttle/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/controllers/subsystem/sprite_accessories.dm b/code/controllers/subsystem/sprite_accessories.dm index 21bafd5330c97..c59e8d89a0e1f 100644 --- a/code/controllers/subsystem/sprite_accessories.dm +++ b/code/controllers/subsystem/sprite_accessories.dm @@ -40,7 +40,6 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity var/list/horns_list var/list/frills_list var/list/spines_list - var/list/legs_list var/list/tail_spines_list //Mutant Human bits @@ -99,14 +98,13 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity frills_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, add_blank = TRUE)[DEFAULT_SPRITE_LIST] spines_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, add_blank = TRUE)[DEFAULT_SPRITE_LIST] tail_spines_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/tail_spines, add_blank = TRUE)[DEFAULT_SPRITE_LIST] - legs_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/legs)[DEFAULT_SPRITE_LIST] caps_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/caps)[DEFAULT_SPRITE_LIST] moth_wings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings)[DEFAULT_SPRITE_LIST] moth_antennae_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_antennae)[DEFAULT_SPRITE_LIST] moth_markings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, add_blank = TRUE)[DEFAULT_SPRITE_LIST] pod_hair_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair)[DEFAULT_SPRITE_LIST] -/// This proc just intializes all /datum/sprite_accessory/hair_gradient into an list indexed by gradient-style name +/// This proc just initializes all /datum/sprite_accessory/hair_gradient into an list indexed by gradient-style name /datum/controller/subsystem/accessories/proc/init_hair_gradients() hair_gradients_list = list() facial_hair_gradients_list = list() diff --git a/code/controllers/subsystem/time_track.dm b/code/controllers/subsystem/time_track.dm index aaaf5520e0fc3..b3a4fe7e8698f 100644 --- a/code/controllers/subsystem/time_track.dm +++ b/code/controllers/subsystem/time_track.dm @@ -108,7 +108,7 @@ SUBSYSTEM_DEF(time_track) text2file(sendmaps_json,"bad_sendmaps.json") can_fire = FALSE return - var/send_maps_sort = send_maps_data.Copy() //Doing it like this guarentees us a properly sorted list + var/send_maps_sort = send_maps_data.Copy() //Doing it like this guarantees us a properly sorted list for(var/list/packet in send_maps_data) send_maps_sort[packet["name"]] = packet diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 8ecb0c9dc6a56..c314fa7d38ba7 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -524,7 +524,7 @@ SUBSYSTEM_DEF(timer) 2 = timeToRun, 3 = wait, 4 = flags, - 5 = callBack, /* Safe to hold this directly becasue it's never del'd */ + 5 = callBack, /* Safe to hold this directly because it's never del'd */ 6 = "[callBack.object]", 7 = text_ref(callBack.object), 8 = getcallingtype(), @@ -539,7 +539,7 @@ SUBSYSTEM_DEF(timer) 2 = timeToRun, 3 = wait, 4 = flags, - 5 = callBack, /* Safe to hold this directly becasue it's never del'd */ + 5 = callBack, /* Safe to hold this directly because it's never del'd */ 6 = "[callBack.object]", 7 = getcallingtype(), 8 = callBack.delegate, diff --git a/code/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm index 1f40dd921dddf..dbaa7ddeb48c0 100644 --- a/code/controllers/subsystem/title.dm +++ b/code/controllers/subsystem/title.dm @@ -60,7 +60,7 @@ SUBSYSTEM_DEF(title) for(var/thing in GLOB.clients) if(!thing) continue - var/atom/movable/screen/splash/S = new(thing, FALSE) + var/atom/movable/screen/splash/S = new(null, thing, FALSE) S.Fade(FALSE,FALSE) /datum/controller/subsystem/title/Recover() diff --git a/code/controllers/subsystem/verb_manager.dm b/code/controllers/subsystem/verb_manager.dm index 337386cff8e0b..f09c050964154 100644 --- a/code/controllers/subsystem/verb_manager.dm +++ b/code/controllers/subsystem/verb_manager.dm @@ -8,15 +8,15 @@ * plus TICK_BYOND_RESERVE from the tick and uses up to that amount of time (minus the percentage of the tick used by the time it executes subsystems) * on subsystems running cool things like atmospherics or Life or SSInput or whatever. * - * Without this subsystem, verbs are likely to cause overtime if the MC uses all of the time it has alloted for itself in the tick, and SendMaps + * Without this subsystem, verbs are likely to cause overtime if the MC uses all of the time it has allotted for itself in the tick, and SendMaps * uses as much as its expected to, and an expensive verb ends up executing that tick. This is because the MC is completely blind to the cost of * verbs, it can't account for it at all. The only chance for verbs to not cause overtime in a tick where the MC used as much of the tick - * as it alloted itself and where SendMaps costed as much as it was expected to is if the verb(s) take less than TICK_BYOND_RESERVE percent of - * the tick, which isnt much. Not to mention if SendMaps takes more than 30% of the tick and the MC forces itself to take at least 70% of the + * as it allotted itself and where SendMaps costed as much as it was expected to is if the verb(s) take less than TICK_BYOND_RESERVE percent of + * the tick, which isn't much. Not to mention if SendMaps takes more than 30% of the tick and the MC forces itself to take at least 70% of the * normal tick duration which causes ticks to naturally overrun even in the absence of verbs. * * With this subsystem, the MC can account for the cost of verbs and thus stop major overruns of ticks. This means that the most important subsystems - * like SSinput can start at the same time they were supposed to, leading to a smoother experience for the player since ticks arent riddled with + * like SSinput can start at the same time they were supposed to, leading to a smoother experience for the player since ticks aren't riddled with * minor hangs over and over again. */ SUBSYSTEM_DEF(verb_manager) @@ -36,17 +36,17 @@ SUBSYSTEM_DEF(verb_manager) ///if TRUE we treat usr's with holders just like usr's without holders. otherwise they always execute immediately var/can_queue_admin_verbs = FALSE - ///if this is true all verbs immediately execute and dont queue. in case the mc is fucked or something + ///if this is true all verbs immediately execute and don't queue. in case the mc is fucked or something var/FOR_ADMINS_IF_VERBS_FUCKED_immediately_execute_all_verbs = FALSE ///used for subtypes to determine if they use their own stats for the stat entry var/use_default_stats = TRUE ///if TRUE this will... message admins every time a verb is queued to this subsystem for the next tick with stats. - ///for obvious reasons dont make this be TRUE on the code level this is for admins to turn on + ///for obvious reasons don't make this be TRUE on the code level this is for admins to turn on var/message_admins_on_queue = FALSE - ///always queue if possible. overides can_queue_admin_verbs but not FOR_ADMINS_IF_VERBS_FUCKED_immediately_execute_all_verbs + ///always queue if possible. overrides can_queue_admin_verbs but not FOR_ADMINS_IF_VERBS_FUCKED_immediately_execute_all_verbs var/always_queue = FALSE /** @@ -87,7 +87,7 @@ SUBSYSTEM_DEF(verb_manager) #else if(QDELETED(usr) || isnull(usr.client)) - stack_trace("_queue_verb() returned false because it wasnt called from player input!") + stack_trace("_queue_verb() returned false because it wasn't called from player input!") return FALSE #endif diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 1c519e8aff159..7bed63cc36fc8 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -356,7 +356,7 @@ SUBSYSTEM_DEF(vote) data["VoteCD"] = CONFIG_GET(number/vote_delay) return data -/datum/controller/subsystem/vote/ui_act(action, params) +/datum/controller/subsystem/vote/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/datums/achievements/_awards.dm b/code/datums/achievements/_awards.dm index d99659ea780f9..e7d18f98124ac 100644 --- a/code/datums/achievements/_awards.dm +++ b/code/datums/achievements/_awards.dm @@ -67,7 +67,7 @@ /datum/award/proc/parse_value(raw_value) return default_value -///Can be overriden for achievement specific events +///Can be overridden for achievement specific events /datum/award/proc/on_unlock(mob/user) return diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm index 1d7b9da3a015a..bd1719783e12a 100644 --- a/code/datums/achievements/misc_achievements.dm +++ b/code/datums/achievements/misc_achievements.dm @@ -232,3 +232,9 @@ desc = "Successfully carry a boulder from Lavaland all the way to Centcom, without ever dropping it. We must imagine you're happy to unlock this." database_id = MEDAL_SISYPHUS icon_state = "sisyphus" + +/datum/award/achievement/misc/cigarettes + name = "Unhealthy snacks" + desc = "You were curious to taste it. And then another. You must have more!" + database_id = MEDAL_CIGARETTES + icon_state = "cigarettes" diff --git a/code/datums/actions/items/reload_rebar.dm b/code/datums/actions/items/reload_rebar.dm new file mode 100644 index 0000000000000..a29b02f6b227e --- /dev/null +++ b/code/datums/actions/items/reload_rebar.dm @@ -0,0 +1,5 @@ +/datum/action/item_action/reload_rebar + name = "Reload Rebar" + desc = "Reloads a held crossbow" + button_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "bolts" diff --git a/code/datums/actions/mobs/blood_warp.dm b/code/datums/actions/mobs/blood_warp.dm index 4b070eebfe781..1e48c6e5aa419 100644 --- a/code/datums/actions/mobs/blood_warp.dm +++ b/code/datums/actions/mobs/blood_warp.dm @@ -21,14 +21,21 @@ /datum/action/cooldown/mob_cooldown/blood_warp/proc/blood_warp(atom/target) if(owner.Adjacent(target)) return FALSE - var/list/can_jaunt = get_bloodcrawlable_pools(get_turf(owner), 1) + + var/turf/target_turf = get_turf(target) + var/turf/owner_turf = get_turf(owner) + + if (target_turf.z != owner_turf.z) + return FALSE + + var/list/can_jaunt = get_bloodcrawlable_pools(owner_turf, 1) if(!can_jaunt.len) return FALSE var/chosen_pick_range = get_pick_range() - var/list/pools = get_bloodcrawlable_pools(get_turf(target), chosen_pick_range) + var/list/pools = get_bloodcrawlable_pools(target_turf, chosen_pick_range) if(remove_inner_pools) - var/list/pools_to_remove = get_bloodcrawlable_pools(get_turf(target), chosen_pick_range - 1) + var/list/pools_to_remove = get_bloodcrawlable_pools(target_turf, chosen_pick_range - 1) pools -= pools_to_remove if(!pools.len) return FALSE @@ -42,16 +49,16 @@ qdel(DA) var/obj/effect/decal/cleanable/blood/found_bloodpool - pools = get_bloodcrawlable_pools(get_turf(target), chosen_pick_range) + pools = get_bloodcrawlable_pools(target_turf, chosen_pick_range) if(remove_inner_pools) - var/list/pools_to_remove = get_bloodcrawlable_pools(get_turf(target), chosen_pick_range - 1) + var/list/pools_to_remove = get_bloodcrawlable_pools(target_turf, chosen_pick_range - 1) pools -= pools_to_remove if(pools.len) shuffle_inplace(pools) found_bloodpool = pick(pools) if(found_bloodpool) owner.visible_message("[owner] sinks into the blood...") - playsound(get_turf(owner), 'sound/magic/enter_blood.ogg', 100, TRUE, -1) + playsound(owner_turf, 'sound/magic/enter_blood.ogg', 100, TRUE, -1) owner.forceMove(get_turf(found_bloodpool)) playsound(get_turf(owner), 'sound/magic/exit_blood.ogg', 100, TRUE, -1) owner.visible_message("And springs back out!") diff --git a/code/datums/actions/mobs/lava_swoop.dm b/code/datums/actions/mobs/lava_swoop.dm index 0b0735bc471c0..aa512b2d28e8d 100644 --- a/code/datums/actions/mobs/lava_swoop.dm +++ b/code/datums/actions/mobs/lava_swoop.dm @@ -50,7 +50,7 @@ negative = FALSE else if(target.x == initial_x) //if their x is the same, pick a direction negative = prob(50) - var/obj/effect/temp_visual/dragon_flight/F = new /obj/effect/temp_visual/dragon_flight(owner.loc, negative) + var/obj/effect/temp_visual/dragon_flight/flight_vis = new /obj/effect/temp_visual/dragon_flight(owner.loc, negative) negative = !negative //invert it for the swoop down later @@ -60,7 +60,7 @@ for(var/i in 1 to 3) sleep(0.1 SECONDS) if(QDELETED(owner) || owner.stat == DEAD) //we got hit and died, rip us - qdel(F) + qdel(flight_vis) if(owner.stat == DEAD) swooping = FALSE animate(owner, alpha = 255, transform = oldtransform, time = 0, flags = ANIMATION_END_NOW) //reset immediately @@ -72,9 +72,11 @@ owner.mouse_opacity = MOUSE_OPACITY_TRANSPARENT SLEEP_CHECK_DEATH(7, owner) - while(target && owner.loc != get_turf(target)) - owner.forceMove(get_step(owner, get_dir(owner, target))) + var/turf/target_turf = get_turf(target) + while(!QDELETED(target) && owner.loc != target_turf && owner.z == target_turf.z) + owner.forceMove(get_step(owner, get_dir(owner, target_turf))) SLEEP_CHECK_DEATH(0.5, owner) + target_turf = get_turf(target) // Ash drake flies onto its target and rains fire down upon them var/descentTime = 10 @@ -82,7 +84,6 @@ if(lava_arena) lava_success = lava_arena(target) - //ensure swoop direction continuity. if(negative) if(ISINRANGE(owner.x, initial_x + 1, initial_x + SWOOP_DIRECTION_CHANGE_RANGE)) @@ -96,20 +97,20 @@ SLEEP_CHECK_DEATH(descentTime, owner) owner.mouse_opacity = initial(owner.mouse_opacity) playsound(owner.loc, 'sound/effects/meteorimpact.ogg', 200, TRUE) - for(var/mob/living/L in orange(1, owner) - owner) - L.adjustBruteLoss(75) - if(!QDELETED(L)) // Some mobs are deleted on death - var/throw_dir = get_dir(owner, L) - if(L.loc == owner.loc) + for(var/mob/living/victim in orange(1, owner) - owner) + victim.adjustBruteLoss(75) + if(!QDELETED(victim)) // Some mobs are deleted on death + var/throw_dir = get_dir(owner, victim) + if(victim.loc == owner.loc) throw_dir = pick(GLOB.alldirs) var/throwtarget = get_edge_target_turf(owner, throw_dir) - L.throw_at(throwtarget, 3) - owner.visible_message(span_warning("[L] is thrown clear of [owner]!")) - for(var/obj/vehicle/sealed/mecha/M in orange(1, owner)) - M.take_damage(75, BRUTE, MELEE, 1) + victim.throw_at(throwtarget, 3) + owner.visible_message(span_warning("[victim] is thrown clear of [owner]!")) + for(var/obj/vehicle/sealed/mecha/mech in orange(1, owner)) + mech.take_damage(75, BRUTE, MELEE, 1) - for(var/mob/M in range(7, owner)) - shake_camera(M, 15, 1) + for(var/mob/observer in range(7, owner)) + shake_camera(observer, 15, 1) REMOVE_TRAIT(owner, TRAIT_UNDENSE, SWOOPING_TRAIT) SLEEP_CHECK_DEATH(1, owner) @@ -126,15 +127,16 @@ while(amount > 0) if(QDELETED(target)) break - var/turf/TT = get_turf(target) - var/turf/T = pick(RANGE_TURFS(1,TT)) - var/obj/effect/temp_visual/lava_warning/LW = new /obj/effect/temp_visual/lava_warning(T, 60) // longer reset time for the lava - LW.owner = owner + var/turf/target_turf = get_turf(target) + var/turf/lava_turf = pick(RANGE_TURFS(1, target_turf)) + var/obj/effect/temp_visual/lava_warning/warn_effect = new /obj/effect/temp_visual/lava_warning(lava_turf, 60) // longer reset time for the lava + warn_effect.owner = owner amount-- SLEEP_CHECK_DEATH(delay, owner) /datum/action/cooldown/mob_cooldown/lava_swoop/proc/lava_arena(atom/target) - if(!target || !isliving(target)) + var/turf/target_turf = get_turf(target) + if(QDELETED(target) || !isliving(target) || target_turf.z != owner.z) return target.visible_message(span_boldwarning("[owner] encases you in an arena of fire!")) var/amount = 3 @@ -147,9 +149,7 @@ for(var/turf/T in RANGE_TURFS(2, center)) if(isindestructiblefloor(T)) continue - if(!isindestructiblewall(T)) - T.TerraformTurf(/turf/open/misc/asteroid/basalt/lava_land_surface, flags = CHANGETURF_INHERIT_AIR) - else + if(isindestructiblewall(T)) indestructible_turfs += T SLEEP_CHECK_DEATH(1 SECONDS, owner) // give them a bit of time to realize what attack is actually happening diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index 33b63f09a01dc..a2fc1cdc62e18 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -63,6 +63,12 @@ multiple modular subtrees with behaviors ///What distance should we be checking for interesting things when considering idling/deidling? Defaults to AI_DEFAULT_INTERESTING_DIST var/interesting_dist = AI_DEFAULT_INTERESTING_DIST + /// TRUE if we're able to run, FALSE if we aren't + /// Should not be set manually, override get_able_to_run() instead + /// Make sure you hook update_able_to_run() in setup_able_to_run() to whatever parameters changing that you added + /// Otherwise we will not pay attention to them changing + var/able_to_run = FALSE + /datum/ai_controller/New(atom/new_pawn) change_ai_movement_type(ai_movement) init_subtrees() @@ -103,12 +109,13 @@ multiple modular subtrees with behaviors return var/list/temp_subtree_list = list() for(var/subtree in planning_subtrees) - var/subtree_instance = SSai_controllers.ai_subtrees[subtree] + var/subtree_instance = GLOB.ai_subtrees[subtree] temp_subtree_list += subtree_instance planning_subtrees = temp_subtree_list ///Proc to move from one pawn to another, this will destroy the target's existing controller. /datum/ai_controller/proc/PossessPawn(atom/new_pawn) + SHOULD_CALL_PARENT(TRUE) if(pawn) //Reset any old signals UnpossessPawn(FALSE) @@ -124,7 +131,7 @@ multiple modular subtrees with behaviors var/turf/pawn_turf = get_turf(pawn) if(pawn_turf) - SSai_controllers.ai_controllers_by_zlevel[pawn_turf.z] += src + GLOB.ai_controllers_by_zlevel[pawn_turf.z] += src SEND_SIGNAL(src, COMSIG_AI_CONTROLLER_POSSESSED_PAWN) @@ -133,6 +140,8 @@ multiple modular subtrees with behaviors RegisterSignal(pawn, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_changed)) RegisterSignal(pawn, COMSIG_MOB_LOGIN, PROC_REF(on_sentience_gained)) RegisterSignal(pawn, COMSIG_QDELETING, PROC_REF(on_pawn_qdeleted)) + update_able_to_run() + setup_able_to_run() our_cells = new(interesting_dist, interesting_dist, 1) set_new_cells() @@ -248,14 +257,11 @@ multiple modular subtrees with behaviors if((mob_pawn?.client && !continue_processing_when_client)) return if(old_turf) - SSai_controllers.ai_controllers_by_zlevel[old_turf.z] -= src - if(new_turf) - SSai_controllers.ai_controllers_by_zlevel[new_turf.z] += src - var/new_level_clients = SSmobs.clients_by_zlevel[new_turf.z].len - if(new_level_clients) - set_ai_status(AI_STATUS_IDLE) - else - set_ai_status(AI_STATUS_OFF) + GLOB.ai_controllers_by_zlevel[old_turf.z] -= src + if(isnull(new_turf)) + return + GLOB.ai_controllers_by_zlevel[new_turf.z] += src + reset_ai_status() ///Abstract proc for initializing the pawn to the new controller /datum/ai_controller/proc/TryPossessPawn(atom/new_pawn) @@ -263,25 +269,38 @@ multiple modular subtrees with behaviors ///Proc for deinitializing the pawn to the old controller /datum/ai_controller/proc/UnpossessPawn(destroy) + SHOULD_CALL_PARENT(TRUE) if(isnull(pawn)) return // instantiated without an applicable pawn, fine set_ai_status(AI_STATUS_OFF) UnregisterSignal(pawn, list(COMSIG_MOVABLE_Z_CHANGED, COMSIG_MOB_LOGIN, COMSIG_MOB_LOGOUT, COMSIG_MOB_STATCHANGE, COMSIG_QDELETING)) + clear_able_to_run() if(ai_movement.moving_controllers[src]) ai_movement.stop_moving_towards(src) var/turf/pawn_turf = get_turf(pawn) if(pawn_turf) - SSai_controllers.ai_controllers_by_zlevel[pawn_turf.z] -= src + GLOB.ai_controllers_by_zlevel[pawn_turf.z] -= src if(ai_status) - SSai_controllers.ai_controllers_by_status[ai_status] -= src + GLOB.ai_controllers_by_status[ai_status] -= src pawn.ai_controller = null pawn = null if(destroy) qdel(src) -///Returns TRUE if the ai controller can actually run at the moment. -/datum/ai_controller/proc/able_to_run() +/datum/ai_controller/proc/setup_able_to_run() + // paused_until is handled by PauseAi() manually + RegisterSignals(pawn, list(SIGNAL_ADDTRAIT(TRAIT_AI_PAUSED), SIGNAL_REMOVETRAIT(TRAIT_AI_PAUSED)), PROC_REF(update_able_to_run)) + +/datum/ai_controller/proc/clear_able_to_run() + UnregisterSignal(pawn, list(SIGNAL_ADDTRAIT(TRAIT_AI_PAUSED), SIGNAL_REMOVETRAIT(TRAIT_AI_PAUSED))) + +/datum/ai_controller/proc/update_able_to_run() + SIGNAL_HANDLER + able_to_run = get_able_to_run() + +///Returns TRUE if the ai controller can actually run at the moment, FALSE otherwise +/datum/ai_controller/proc/get_able_to_run() if(HAS_TRAIT(pawn, TRAIT_AI_PAUSED)) return FALSE if(world.time < paused_until) @@ -291,7 +310,7 @@ multiple modular subtrees with behaviors ///Runs any actions that are currently running /datum/ai_controller/process(seconds_per_tick) - if(!able_to_run()) + if(!able_to_run) GLOB.move_manager.stop_looping(pawn) //stop moving return //this should remove them from processing in the future through event-based stuff. @@ -386,18 +405,30 @@ multiple modular subtrees with behaviors //remove old status, if we've got one if(ai_status) - SSai_controllers.ai_controllers_by_status[ai_status] -= src + GLOB.ai_controllers_by_status[ai_status] -= src + stop_previous_processing() ai_status = new_ai_status - SSai_controllers.ai_controllers_by_status[new_ai_status] += src + GLOB.ai_controllers_by_status[new_ai_status] += src switch(ai_status) if(AI_STATUS_ON) START_PROCESSING(SSai_behaviors, src) - if(AI_STATUS_OFF, AI_STATUS_IDLE) - STOP_PROCESSING(SSai_behaviors, src) + if(AI_STATUS_IDLE) + START_PROCESSING(SSidle_ai_behaviors, src) + CancelActions() + if(AI_STATUS_OFF) CancelActions() +/datum/ai_controller/proc/stop_previous_processing() + switch(ai_status) + if(AI_STATUS_ON) + STOP_PROCESSING(SSai_behaviors, src) + if(AI_STATUS_IDLE) + STOP_PROCESSING(SSidle_ai_behaviors, src) + /datum/ai_controller/proc/PauseAi(time) paused_until = world.time + time + update_able_to_run() + addtimer(CALLBACK(src, PROC_REF(update_able_to_run)), time) /datum/ai_controller/proc/modify_cooldown(datum/ai_behavior/behavior, new_cooldown) behavior_cooldowns[behavior] = new_cooldown diff --git a/code/datums/ai/bane/bane_controller.dm b/code/datums/ai/bane/bane_controller.dm index 8d6820a800bdc..64e1dcf31af3a 100644 --- a/code/datums/ai/bane/bane_controller.dm +++ b/code/datums/ai/bane/bane_controller.dm @@ -12,7 +12,19 @@ And the only victory you achieved was a lie. Now you understand Gotham is beyond return AI_CONTROLLER_INCOMPATIBLE return ..() //Run parent at end -/datum/ai_controller/bane/able_to_run() +/datum/ai_controller/bane/on_stat_changed(mob/living/source, new_stat) + . = ..() + update_able_to_run() + +/datum/ai_controller/bane/setup_able_to_run() + . = ..() + RegisterSignal(pawn, COMSIG_MOB_INCAPACITATE_CHANGED, PROC_REF(update_able_to_run)) + +/datum/ai_controller/bane/clear_able_to_run() + UnregisterSignal(pawn, list(COMSIG_MOB_INCAPACITATE_CHANGED, COMSIG_MOB_STATCHANGE)) + return ..() + +/datum/ai_controller/bane/get_able_to_run() var/mob/living/living_pawn = pawn if(IS_DEAD_OR_INCAP(living_pawn)) return FALSE diff --git a/code/datums/ai/basic_mobs/base_basic_controller.dm b/code/datums/ai/basic_mobs/base_basic_controller.dm index cd025b28bcb2b..a14630fa0e83a 100644 --- a/code/datums/ai/basic_mobs/base_basic_controller.dm +++ b/code/datums/ai/basic_mobs/base_basic_controller.dm @@ -12,17 +12,29 @@ return ..() //Run parent at end +/datum/ai_controller/basic_controller/on_stat_changed(mob/living/source, new_stat) + . = ..() + update_able_to_run() -/datum/ai_controller/basic_controller/able_to_run() +/datum/ai_controller/basic_controller/setup_able_to_run() . = ..() - if(!isliving(pawn)) - return - var/mob/living/living_pawn = pawn - var/incap_flags = NONE - if (ai_traits & CAN_ACT_IN_STASIS) - incap_flags |= IGNORE_STASIS - if(!(ai_traits & CAN_ACT_WHILE_DEAD) && (living_pawn.incapacitated(incap_flags) || living_pawn.stat)) + RegisterSignal(pawn, COMSIG_MOB_INCAPACITATE_CHANGED, PROC_REF(update_able_to_run)) + +/datum/ai_controller/basic_controller/clear_able_to_run() + UnregisterSignal(pawn, list(COMSIG_MOB_INCAPACITATE_CHANGED, COMSIG_MOB_STATCHANGE)) + return ..() + +/datum/ai_controller/basic_controller/get_able_to_run() + . = ..() + if(!.) return FALSE + var/mob/living/living_pawn = pawn + if(!(ai_traits & CAN_ACT_WHILE_DEAD)) + // Unroll for flags here + if (ai_traits & CAN_ACT_IN_STASIS && (living_pawn.stat || INCAPACITATED_IGNORING(living_pawn, INCAPABLE_STASIS))) + return FALSE + else if(IS_DEAD_OR_INCAP(living_pawn)) + return FALSE if(ai_traits & PAUSE_DURING_DO_AFTER && LAZYLEN(living_pawn.do_afters)) return FALSE diff --git a/code/datums/ai/basic_mobs/basic_subtrees/call_reinforcements.dm b/code/datums/ai/basic_mobs/basic_subtrees/call_reinforcements.dm index 44d7cb4fe480b..f78697b2b8132 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/call_reinforcements.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/call_reinforcements.dm @@ -44,6 +44,6 @@ other_mob.ai_controller.set_blackboard_key(BB_BASIC_MOB_REINFORCEMENT_TARGET, pawn_mob) controller.set_blackboard_key(BB_BASIC_MOB_REINFORCEMENTS_COOLDOWN, world.time + REINFORCEMENTS_COOLDOWN) - return AI_BEHAVIOR_DELAY + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED #undef REINFORCEMENTS_COOLDOWN diff --git a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_nearest_target_to_flee.dm b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_nearest_target_to_flee.dm index d9e0d1e7fb9ff..83e514f327020 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_nearest_target_to_flee.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_nearest_target_to_flee.dm @@ -21,4 +21,5 @@ controller.queue_behavior(/datum/ai_behavior/target_from_retaliate_list/nearest, BB_BASIC_MOB_RETALIATE_LIST, target_key, targeting_key, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee/from_flee_key + target_key = BB_BASIC_MOB_FLEE_TARGET targeting_key = BB_FLEE_TARGETING_STRATEGY diff --git a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm index 42608730f9891..759355283acd4 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm @@ -1,8 +1,10 @@ /datum/ai_planning_subtree/simple_find_target + /// Variable to store target in + var/target_key = BB_BASIC_MOB_CURRENT_TARGET /datum/ai_planning_subtree/simple_find_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() - controller.queue_behavior(/datum/ai_behavior/find_potential_targets, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + controller.queue_behavior(/datum/ai_behavior/find_potential_targets, target_key, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) // Prevents finding a target if a human is nearby /datum/ai_planning_subtree/simple_find_target/not_while_observed @@ -12,3 +14,6 @@ if(watcher.stat != DEAD) return return ..() + +/datum/ai_planning_subtree/simple_find_target/to_flee + target_key = BB_BASIC_MOB_FLEE_TARGET diff --git a/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm b/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm index 2394f2a38623b..709acb8d5e892 100644 --- a/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm +++ b/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm @@ -29,6 +29,9 @@ if(M.status_flags & GODMODE) return FALSE + if (vision_range && get_dist(living_mob, the_target) > vision_range) + return FALSE + if(!ignore_sight && !can_see(living_mob, the_target, vision_range)) //Target has moved behind cover and we have lost line of sight to it return FALSE @@ -85,6 +88,21 @@ // trust fall exercise return TRUE +/datum/targeting_strategy/basic/require_traits + +/datum/targeting_strategy/basic/require_traits/can_attack(mob/living/living_mob, atom/the_target, vision_range) + . = ..() + if (!.) + return FALSE + var/list/required_traits = living_mob.ai_controller.blackboard[BB_TARGET_ONLY_WITH_TRAITS] + if (!length(required_traits)) + return TRUE + + for (var/trait as anything in required_traits) + if (HAS_TRAIT(the_target, trait)) + return TRUE + return FALSE + /// Subtype which searches for mobs of a size relative to ours /datum/targeting_strategy/basic/of_size /// If true, we will return mobs which are smaller than us. If false, larger. diff --git a/code/datums/ai/monkey/monkey_behaviors.dm b/code/datums/ai/monkey/monkey_behaviors.dm index a5febe03143f1..e6720d7d96a78 100644 --- a/code/datums/ai/monkey/monkey_behaviors.dm +++ b/code/datums/ai/monkey/monkey_behaviors.dm @@ -197,7 +197,7 @@ var/can_shoot = gun?.can_shoot() || FALSE if(gun && controller.blackboard[BB_MONKEY_GUN_WORKED] && prob(95)) // We attempt to attack even if we can't shoot so we get the effects of pulling the trigger - gun.melee_attack_chain(living_pawn, real_target) + gun.interact_with_atom(real_target, living_pawn) controller.set_blackboard_key(BB_MONKEY_GUN_WORKED, can_shoot ? TRUE : prob(80)) // Only 20% likely to notice it didn't work if(can_shoot) controller.set_blackboard_key(BB_MONKEY_GUN_NEURONS_ACTIVATED, TRUE) diff --git a/code/datums/ai/monkey/monkey_controller.dm b/code/datums/ai/monkey/monkey_controller.dm index 451d692b65d34..e92ec519b209a 100644 --- a/code/datums/ai/monkey/monkey_controller.dm +++ b/code/datums/ai/monkey/monkey_controller.dm @@ -104,10 +104,22 @@ have ways of interacting with a specific mob and control it. . = ..() set_trip_mode(mode = TRUE) -/datum/ai_controller/monkey/able_to_run() +/datum/ai_controller/monkey/on_stat_changed(mob/living/source, new_stat) + . = ..() + update_able_to_run() + +/datum/ai_controller/monkey/setup_able_to_run() + . = ..() + RegisterSignal(pawn, COMSIG_MOB_INCAPACITATE_CHANGED, PROC_REF(update_able_to_run)) + +/datum/ai_controller/monkey/clear_able_to_run() + UnregisterSignal(pawn, list(COMSIG_MOB_INCAPACITATE_CHANGED, COMSIG_MOB_STATCHANGE)) + return ..() + +/datum/ai_controller/monkey/get_able_to_run() var/mob/living/living_pawn = pawn - if(living_pawn.incapacitated(IGNORE_RESTRAINTS | IGNORE_GRAB | IGNORE_STASIS) || living_pawn.stat > CONSCIOUS) + if(INCAPACITATED_IGNORING(living_pawn, INCAPABLE_RESTRAINTS|INCAPABLE_STASIS|INCAPABLE_GRAB) || living_pawn.stat > CONSCIOUS) return FALSE return ..() @@ -134,7 +146,7 @@ have ways of interacting with a specific mob and control it. for(var/obj/item/item in oview(2, living_pawn)) nearby_items += item - for(var/obj/item/item in living_pawn.held_items) // If we've got some garbage in out hands thats going to stop us from effectivly attacking, we should get rid of it. + for(var/obj/item/item in living_pawn.held_items) // If we've got some garbage in out hands that's going to stop us from effectively attacking, we should get rid of it. if(item.force < 2) living_pawn.dropItemToGround(item) @@ -151,7 +163,7 @@ have ways of interacting with a specific mob and control it. if(!weapon || (weapon in living_pawn.held_items)) return FALSE - if(weapon.force < 2) // our bite does 2 damage on avarage, no point in settling for anything less + if(weapon.force < 2) // our bite does 2 damage on average, no point in settling for anything less return FALSE set_blackboard_key(BB_MONKEY_PICKUPTARGET, weapon) diff --git a/code/datums/ai/movement/_ai_movement.dm b/code/datums/ai/movement/_ai_movement.dm index d48166eeb23ac..c1b3aae5bd60f 100644 --- a/code/datums/ai/movement/_ai_movement.dm +++ b/code/datums/ai/movement/_ai_movement.dm @@ -1,4 +1,4 @@ -///This datum is an abstract class that can be overriden for different types of movement +///This datum is an abstract class that can be overridden for different types of movement /datum/ai_movement ///Assoc list ist of controllers that are currently moving as key, and what they are moving to as value var/list/moving_controllers = list() @@ -59,7 +59,7 @@ var/datum/ai_controller/controller = source.extra_info // Check if this controller can actually run, so we don't chase people with corpses - if(!controller.able_to_run()) + if(!controller.able_to_run) controller.CancelActions() qdel(source) //stop moving return MOVELOOP_SKIP_STEP diff --git a/code/datums/ai/oldhostile/hostile_tameable.dm b/code/datums/ai/oldhostile/hostile_tameable.dm index 1c30cb95487c1..907ab955a8d53 100644 --- a/code/datums/ai/oldhostile/hostile_tameable.dm +++ b/code/datums/ai/oldhostile/hostile_tameable.dm @@ -50,7 +50,19 @@ if(buckler != blackboard[BB_HOSTILE_FRIEND]) return COMPONENT_BLOCK_BUCKLE -/datum/ai_controller/hostile_friend/able_to_run() +/datum/ai_controller/hostile_friend/on_stat_changed(mob/living/source, new_stat) + . = ..() + update_able_to_run() + +/datum/ai_controller/hostile_friend/setup_able_to_run() + . = ..() + RegisterSignal(pawn, COMSIG_MOB_INCAPACITATE_CHANGED, PROC_REF(update_able_to_run)) + +/datum/ai_controller/hostile_friend/clear_able_to_run() + UnregisterSignal(pawn, list(COMSIG_MOB_INCAPACITATE_CHANGED, COMSIG_MOB_STATCHANGE)) + return ..() + +/datum/ai_controller/hostile_friend/get_able_to_run() var/mob/living/living_pawn = pawn if(IS_DEAD_OR_INCAP(living_pawn)) @@ -77,14 +89,14 @@ if(pawn.Adjacent(pawn, new_friend)) new_friend.visible_message("[pawn] looks at [new_friend] in a friendly manner!", span_notice("[pawn] looks at you in a friendly manner!")) set_blackboard_key(BB_HOSTILE_FRIEND, new_friend) - RegisterSignal(new_friend, COMSIG_MOB_POINTED, PROC_REF(check_point)) + RegisterSignal(new_friend, COMSIG_MOVABLE_POINTED, PROC_REF(check_point)) RegisterSignal(new_friend, COMSIG_MOB_SAY, PROC_REF(check_verbal_command)) /// Someone is being mean to us, take them off our friends (add actual enemies behavior later) /datum/ai_controller/hostile_friend/proc/unfriend() var/mob/living/old_friend = blackboard[BB_HOSTILE_FRIEND] if(old_friend) - UnregisterSignal(old_friend, list(COMSIG_MOB_POINTED, COMSIG_MOB_SAY)) + UnregisterSignal(old_friend, list(COMSIG_MOVABLE_POINTED, COMSIG_MOB_SAY)) clear_blackboard_key(BB_HOSTILE_FRIEND) /// Someone is looking at us, if we're currently carrying something then show what it is, and include a message if they're our friend @@ -129,7 +141,7 @@ /datum/ai_controller/hostile_friend/proc/check_menu(mob/user) if(!istype(user)) CRASH("A non-mob is trying to issue an order to [pawn].") - if(user.incapacitated() || !can_see(user, pawn)) + if(user.incapacitated || !can_see(user, pawn)) return FALSE return TRUE @@ -190,7 +202,7 @@ set_blackboard_key(BB_HOSTILE_ORDER_MODE, HOSTILE_COMMAND_ATTACK) /// Someone we like is pointing at something, see if it's something we might want to interact with (like if they might want us to fetch something for them) -/datum/ai_controller/hostile_friend/proc/check_point(mob/pointing_friend, atom/movable/pointed_movable) +/datum/ai_controller/hostile_friend/proc/check_point(mob/pointing_friend, atom/movable/pointed_movable, obj/effect/temp_visual/point/point) SIGNAL_HANDLER var/mob/living/simple_animal/hostile/living_pawn = pawn diff --git a/code/datums/ai/robot_customer/robot_customer_behaviors.dm b/code/datums/ai/robot_customer/robot_customer_behaviors.dm index 7aa0f34f5207d..8712049901383 100644 --- a/code/datums/ai/robot_customer/robot_customer_behaviors.dm +++ b/code/datums/ai/robot_customer/robot_customer_behaviors.dm @@ -63,7 +63,7 @@ return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED controller.add_blackboard_key(BB_CUSTOMER_PATIENCE, seconds_per_tick * -1 SECONDS) // Convert seconds_per_tick to a SECONDS equivalent. - if(controller.blackboard[BB_CUSTOMER_PATIENCE] < 0 || controller.blackboard[BB_CUSTOMER_LEAVING]) // Check if we're leaving because sometthing mightve forced us to + if(controller.blackboard[BB_CUSTOMER_PATIENCE] < 0 || controller.blackboard[BB_CUSTOMER_LEAVING]) // Check if we're leaving because something might've forced us to return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED // SPT_PROB 1.5 is about a 40% chance that the tourist will have vocalised at least once every minute. @@ -78,7 +78,7 @@ if(my_seat) controller.pawn.setDir(my_seat.dir) //Sit in your seat - ///Now check if theres a meal infront of us. + ///Now check if there's a meal infront of us. var/datum/venue/attending_venue = controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE] var/turf/infront_turf = get_step(controller.pawn, controller.pawn.dir) @@ -100,7 +100,7 @@ if(greytider || QDELETED(src) || QDELETED(customer_pawn)) return controller.set_blackboard_key(BB_CUSTOMER_LEAVING, TRUE) - customer_pawn.update_icon() //They might have a special leaving accesoiry (french flag) + customer_pawn.update_icon() //They might have a special leaving accessory (French flag) if(succeeded) customer_pawn.say(pick(customer_data.leave_happy_lines)) else diff --git a/code/datums/armor/_armor.dm b/code/datums/armor/_armor.dm index 616ad00c324ad..961c7827b1de4 100644 --- a/code/datums/armor/_armor.dm +++ b/code/datums/armor/_armor.dm @@ -139,15 +139,15 @@ GLOBAL_LIST_INIT(armor_by_type, generate_armor_type_cache()) /// Gets the rating of armor for the specified rating /datum/armor/proc/get_rating(rating) - // its not that I dont trust coders, its just that I don't trust coders + // its not that I don't trust coders, its just that I don't trust coders if(!(rating in ARMOR_LIST_ALL())) - CRASH("Attempted to get a rating '[rating]' that doesnt exist") + CRASH("Attempted to get a rating '[rating]' that doesn't exist") return vars[rating] /datum/armor/immune/get_rating(rating) return 100 -/// Converts all the ratings of the armor into a list, optionally inversed +/// Converts all the ratings of the armor into a list, optionally inverted /datum/armor/proc/get_rating_list(inverse = FALSE) var/ratings = list() for(var/rating in ARMOR_LIST_ALL()) diff --git a/code/datums/bodypart_overlays/bodypart_overlay.dm b/code/datums/bodypart_overlays/bodypart_overlay.dm index 15b1e01114943..4059e7968d481 100644 --- a/code/datums/bodypart_overlays/bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/bodypart_overlay.dm @@ -26,7 +26,7 @@ ) return all_images -///Generate the image. Needs to be overriden +///Generate the image. Needs to be overridden /datum/bodypart_overlay/proc/get_image(layer, obj/item/bodypart/limb) CRASH("Get image needs to be overridden") @@ -42,7 +42,7 @@ /datum/bodypart_overlay/proc/removed_from_limb(obj/item/bodypart/limb) return -///Use this to change the appearance (and yes you must overwrite hahahahahah) (or dont use this, I just dont want people directly changing the image) +///Use this to change the appearance (and yes you must overwrite hahahahahah) (or don't use this, I just don't want people directly changing the image) /datum/bodypart_overlay/proc/set_appearance() CRASH("Update appearance needs to be overridden") diff --git a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm index 3115e3ad62ea2..d0250cce686eb 100644 --- a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm @@ -13,6 +13,24 @@ ///Take on the dna/preference from whoever we're gonna be inserted in var/imprint_on_next_insertion = TRUE +/datum/bodypart_overlay/mutant/New(obj/item/organ/attached_organ) + . = ..() + + RegisterSignal(attached_organ, COMSIG_ORGAN_IMPLANTED, PROC_REF(on_mob_insert)) + +/datum/bodypart_overlay/mutant/proc/on_mob_insert(obj/item/organ/parent, mob/living/carbon/receiver) + SIGNAL_HANDLER + + if(!should_visual_organ_apply_to(parent.type, receiver)) + stack_trace("adding a [parent.type] to a [receiver.type] when it shouldn't be!") + + if(imprint_on_next_insertion) //We only want this set *once* + var/feature_name = receiver.dna.features[feature_key] + if (isnull(feature_name)) + feature_name = receiver.dna.species.mutant_organs[parent.type] + set_appearance_from_name(feature_name) + imprint_on_next_insertion = FALSE + /datum/bodypart_overlay/mutant/get_overlay(layer, obj/item/bodypart/limb) inherit_color(limb) // If draw_color is not set yet, go ahead and do that return ..() @@ -67,7 +85,6 @@ return appearance /datum/bodypart_overlay/mutant/color_image(image/overlay, layer, obj/item/bodypart/limb) - overlay.color = sprite_datum.color_src ? draw_color : null /datum/bodypart_overlay/mutant/added_to_limb(obj/item/bodypart/limb) @@ -139,3 +156,4 @@ CRASH("External organ [type] couldn't find sprite accessory [accessory_name]!") else CRASH("External organ [type] had fetch_sprite_datum called with a null accessory name!") + diff --git a/code/datums/bodypart_overlays/simple_bodypart_overlay.dm b/code/datums/bodypart_overlays/simple_bodypart_overlay.dm index 6c9eb4240ecd0..20467eede042b 100644 --- a/code/datums/bodypart_overlays/simple_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/simple_bodypart_overlay.dm @@ -25,11 +25,6 @@ icon_state = "sixpack" layers = EXTERNAL_ADJACENT -///A creampie drawn on the head -/datum/bodypart_overlay/simple/creampie - icon_state = "creampie_human" - layers = EXTERNAL_FRONT - ///bags drawn beneath the eyes /datum/bodypart_overlay/simple/bags icon_state = "bags" diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index d5f0a0e91240a..cd45ae1abf468 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -407,7 +407,7 @@ var/obj/item/bodypart/bodypart = owner.get_bodypart(owner.get_random_valid_zone(even_weights = TRUE)) if(!(bodypart && IS_ORGANIC_LIMB(bodypart)) && bodypart.bodypart_flags & BODYPART_PSEUDOPART) return - if(owner.incapacitated()) + if(owner.incapacitated) return bodypart.receive_damage(scratch_damage) if(SPT_PROB(33, seconds_per_tick)) diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index 325203dbb350a..6d0f8fc565415 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -322,7 +322,7 @@ if(!. || !client) return FALSE to_chat(src, span_notice("You're the incredibly inebriated leftovers of your host's consciousness! Make sure to act the part and leave a trail of confusion and chaos in your wake.")) - to_chat(src, span_boldwarning("Do not commit suicide or put the body in danger, you have a minor liscense to grief just like a clown, do not kill anyone or create a situation leading to the body being in danger or in harm ways. While you're drunk, you're not suicidal.")) + to_chat(src, span_boldwarning("While you're drunk, you're not suicidal. Do not commit suicide or put the body in danger. You have a minor license to grief just like a clown, but do not kill anyone or create a situation leading to the body being put in danger or at risk of being harmed.")) #undef OWNER #undef STRANGER diff --git a/code/datums/browser.dm b/code/datums/browser.dm index f74ecf6c5a343..b9d859552389d 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -99,7 +99,7 @@ /datum/browser/proc/open(use_onclose = TRUE) if(isnull(window_id)) //null check because this can potentially nuke goonchat WARNING("Browser [title] tried to open with a null ID") - to_chat(user, span_userdanger("The [title] browser you tried to open failed a sanity check! Please report this on github!")) + to_chat(user, span_userdanger("The [title] browser you tried to open failed a sanity check! Please report this on GitHub!")) return var/window_size = "" if (width && height) diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index 998c10a3b9b44..ee278cdae6212 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -314,7 +314,7 @@ speaker = v.source spans |= "virtual-speaker" - // Ignore virtual speaker (most often radio messages) from ourself + // Ignore virtual speaker (most often radio messages) from ourselves if (originalSpeaker != src && speaker == src) return diff --git a/code/datums/components/acid.dm b/code/datums/components/acid.dm index fc60e0312fd72..74fa1b1ae7f88 100644 --- a/code/datums/components/acid.dm +++ b/code/datums/components/acid.dm @@ -148,7 +148,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e var/acid_used = min(acid_volume * 0.05, 20) * seconds_per_tick var/applied_targets = 0 for(var/atom/movable/target_movable as anything in target_turf) - // Dont apply acid to things under the turf + // Don't apply acid to things under the turf if(target_turf.underfloor_accessibility < UNDERFLOOR_INTERACTABLE && HAS_TRAIT(target_movable, TRAIT_T_RAY_VISIBLE)) continue // Ignore mobs if turf_acid_ignores_mobs is TRUE diff --git a/code/datums/components/aquarium_content.dm b/code/datums/components/aquarium_content.dm index 21c6c75ca169a..57d62cdb0ee26 100644 --- a/code/datums/components/aquarium_content.dm +++ b/code/datums/components/aquarium_content.dm @@ -24,15 +24,15 @@ //Current layer for the visual object var/base_layer - /** - * Fish sprite how to: - * Need to be centered on 16,16 in the dmi and facing left by default. - * sprite_height/sprite_width is the size it will have in aquarium and used to control animation boundaries. - * source_height/source_width is the size of the original icon (ideally only the non-empty parts) + * Fish sprite how to: + * The aquarium icon state needs to be centered on 16,16 in the dmi and facing left by default. + * sprite_width/sprite_height are the sizes it will have in aquarium and used to control animation boundaries. + * Ideally these two vars represent the size of the aquarium icon state, but they can be one or two units shorter + * to give more room for the visual to float around inside the aquarium, since the aquarium tank frame overlay will likely + * cover the extra pixels anyway. */ - /// Icon used for in aquarium sprite var/icon = 'icons/obj/aquarium/fish.dmi' /// If this is set this icon state will be used for the holder while icon_state will only be used for item/catalog. Transformation from source_width/height WON'T be applied. @@ -52,10 +52,6 @@ var/sprite_height = 3 var/sprite_width = 3 - //This is the size of the source sprite. This will be used to calculate scale down factor. - var/source_width = 32 - var/source_height = 32 - /// Currently playing animation var/current_animation @@ -97,6 +93,7 @@ ADD_TRAIT(parent, TRAIT_FISH_CASE_COMPATIBILE, REF(src)) RegisterSignal(parent, COMSIG_TRY_INSERTING_IN_AQUARIUM, PROC_REF(is_ready_to_insert)) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(enter_aquarium)) + RegisterSignal(parent, COMSIG_FISH_PETTED, PROC_REF(on_fish_petted)) //If component is added to something already in aquarium at the time initialize it properly. var/atom/movable/movable_parent = parent @@ -112,18 +109,9 @@ sprite_width = fish.sprite_width aquarium_vc_color = fish.aquarium_vc_color - if(fish.dedicated_in_aquarium_icon_state) - if(fish.dedicated_in_aquarium_icon) - icon = fish.dedicated_in_aquarium_icon - icon_state = fish.dedicated_in_aquarium_icon_state - base_transform = matrix() - else - icon_state = fish.icon_state - var/matrix/matrix = matrix() - var/x_scale = fish.sprite_width / fish.source_width - var/y_scale = fish.sprite_height / fish.source_height - matrix.Scale(x_scale, y_scale) - base_transform = matrix + icon = fish.dedicated_in_aquarium_icon + icon_state = fish.dedicated_in_aquarium_icon_state + base_transform = matrix() randomize_position = TRUE @@ -274,7 +262,6 @@ dead_animation() return - /// Create looping random path animation, pixel offsets parameters include offsets already /datum/component/aquarium_content/proc/swim_animation() var/avg_width = round(sprite_width / 2) @@ -325,6 +312,11 @@ base_layer = current_aquarium.request_layer(layer_mode) vc_obj.layer = base_layer +/datum/component/aquarium_content/proc/on_fish_petted() + SIGNAL_HANDLER + + new /obj/effect/temp_visual/heart(get_turf(parent)) + /datum/component/aquarium_content/proc/randomize_base_position() var/list/aq_properties = current_aquarium.get_surface_properties() var/avg_width = round(sprite_width / 2) diff --git a/code/datums/components/bakeable.dm b/code/datums/components/bakeable.dm index afc71936f1b92..93e96f65d58fc 100644 --- a/code/datums/components/bakeable.dm +++ b/code/datums/components/bakeable.dm @@ -93,11 +93,11 @@ var/list/asomnia_hadders = list() for(var/mob/smeller in get_hearers_in_view(DEFAULT_MESSAGE_RANGE, used_oven)) if(HAS_TRAIT(smeller, TRAIT_ANOSMIA)) - asomnia_hadders += smeller + asomnia_hadders += smeller if(positive_result) used_oven.visible_message( - span_notice("You smell something great coming from [used_oven]."), + span_notice("You smell something great coming from [used_oven]."), blind_message = span_notice("You smell something great..."), ignored_mobs = asomnia_hadders, ) diff --git a/code/datums/components/callouts.dm b/code/datums/components/callouts.dm index 24e7f081fbe78..98d489cc915a9 100644 --- a/code/datums/components/callouts.dm +++ b/code/datums/components/callouts.dm @@ -111,7 +111,7 @@ for(var/datum/callout_option/callout_option as anything in callout_options) callout_items[callout_option] = image(icon = 'icons/hud/radial.dmi', icon_state = callout_option::icon_state) - var/datum/callout_option/selection = show_radial_menu(user, get_turf(clicked_atom), callout_items, entry_animation = FALSE, click_on_hover = TRUE) + var/datum/callout_option/selection = show_radial_menu(user, get_turf(clicked_atom), callout_items, entry_animation = FALSE, click_on_hover = TRUE, user_space = TRUE) if (!selection) return diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index 3f6bba15541b1..cd06bdb2a00d7 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -30,7 +30,7 @@ ///So we can update ant damage dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS -/datum/component/caltrop/Initialize(min_damage = 0, max_damage = 0, probability = 100, paralyze_duration = 6 SECONDS, flags = NONE, soundfile = null) +/datum/component/caltrop/Initialize(min_damage = 0, max_damage = 0, probability = 100, paralyze_duration = 2 SECONDS, flags = NONE, soundfile = null) . = ..() if(!isatom(parent)) return COMPONENT_INCOMPATIBLE diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index b4406857ac1e3..6cae053afd17d 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -212,6 +212,10 @@ REMOVE_TRAIT(fallen_mob, TRAIT_NO_TRANSFORM, REF(src)) if (fallen_mob.stat != DEAD) fallen_mob.investigate_log("has died from falling into a chasm.", INVESTIGATE_DEATHS) + if(issilicon(fallen_mob)) + //Silicons are held together by hopes and dreams, unfortunately, I'm having a nightmare + var/mob/living/silicon/robot/fallen_borg = fallen_mob + fallen_borg.mmi = null fallen_mob.death(TRUE) fallen_mob.apply_damage(300) @@ -247,14 +251,51 @@ GLOBAL_LIST_EMPTY(chasm_fallen_mobs) /obj/effect/abstract/chasm_storage/Entered(atom/movable/arrived) . = ..() if(isliving(arrived)) + //Mobs that have fallen in reserved area should be deleted to avoid fishing stuff from the deathmatch or VR. + if(is_reserved_level(loc.z) && !istype(get_area(loc), /area/shuttle)) + qdel(arrived) + return RegisterSignal(arrived, COMSIG_LIVING_REVIVE, PROC_REF(on_revive)) - GLOB.chasm_fallen_mobs += arrived + LAZYADD(GLOB.chasm_fallen_mobs[get_chasm_category(loc)], arrived) /obj/effect/abstract/chasm_storage/Exited(atom/movable/gone) . = ..() if(isliving(gone)) UnregisterSignal(gone, COMSIG_LIVING_REVIVE) - GLOB.chasm_fallen_mobs -= gone + LAZYREMOVE(GLOB.chasm_fallen_mobs[get_chasm_category(loc)], gone) + +/obj/effect/abstract/chasm_storage/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) + . = ..() + var/old_cat = get_chasm_category(old_turf) + var/new_cat = get_chasm_category(new_turf) + var/list/mobs = list() + for(var/mob/fallen in src) + mobs += fallen + LAZYREMOVE(GLOB.chasm_fallen_mobs[old_cat], mobs) + LAZYADD(GLOB.chasm_fallen_mobs[new_cat], mobs) + +/** + * Returns a key to store, remove and access fallen mobs depending on the z-level. + * This stops rescuing people from places that are waaaaaaaay too far-fetched. + */ +/proc/get_chasm_category(turf/turf) + var/z_level = turf?.z + var/area/area = get_area(turf) + if(istype(area, /area/shuttle)) //shuttle move between z-levels, so they're a special case. + return area + + if(is_away_level(z_level)) + return ZTRAIT_AWAY + if(is_mining_level(z_level)) + return ZTRAIT_MINING + if(is_station_level(z_level)) + return ZTRAIT_STATION + if(is_centcom_level(z_level)) + return ZTRAIT_CENTCOM + if(is_reserved_level(z_level)) + return ZTRAIT_RESERVED + + return ZTRAIT_SPACE_RUINS #define CHASM_TRAIT "chasm trait" /** diff --git a/code/datums/components/connect_mob_behalf.dm b/code/datums/components/connect_mob_behalf.dm index b8aa014f81010..18ab0eebed8c8 100644 --- a/code/datums/components/connect_mob_behalf.dm +++ b/code/datums/components/connect_mob_behalf.dm @@ -1,6 +1,6 @@ /// This component behaves similar to connect_loc_behalf, but working off clients and mobs instead of loc /// To be clear, we hook into a signal on a tracked client's mob -/// We retain the ability to react to that signal on a seperate listener, which makes this quite powerful +/// We retain the ability to react to that signal on a separate listener, which makes this quite powerful /datum/component/connect_mob_behalf dupe_mode = COMPONENT_DUPE_UNIQUE diff --git a/code/datums/components/connect_range.dm b/code/datums/components/connect_range.dm index d3407f4671456..af8ec247eb262 100644 --- a/code/datums/components/connect_range.dm +++ b/code/datums/components/connect_range.dm @@ -1,6 +1,6 @@ /** * This component behaves similar to connect_loc_behalf but for all turfs in range, hooking into a signal on each of them. - * Just like connect_loc_behalf, It can react to that signal on behalf of a seperate listener. + * Just like connect_loc_behalf, It can react to that signal on behalf of a separate listener. * Good for components, though it carries some overhead. Can't be an element as that may lead to bugs. */ /datum/component/connect_range diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 8f436faa9c6c4..ec6df83b8042f 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -308,7 +308,6 @@ var/datum/reagents/holder var/list/surroundings var/list/Deletion = list() - var/data var/amt var/list/requirements = list() if(R.reqs) @@ -345,7 +344,6 @@ RC.reagents.trans_to(holder, reagent_volume, target_id = path_key, no_react = TRUE) surroundings -= RC amt -= reagent_volume - SEND_SIGNAL(RC.reagents, COMSIG_REAGENTS_CRAFTING_PING) // - [] TODO: Make this entire thing less spaghetti else surroundings -= RC RC.update_appearance(UPDATE_ICON) @@ -359,7 +357,7 @@ SD = new S.type() Deletion += SD S.use(amt) - SD = locate(S.type) in Deletion + SD = SD || locate(S.type) in Deletion // SD might be already set here, no sense in searching for it again SD.amount += amt continue main_loop else @@ -367,9 +365,9 @@ if(!locate(S.type) in Deletion) Deletion += S else - data = S.amount - S = locate(S.type) in Deletion - S.add(data) + SD = SD || locate(S.type) in Deletion + SD.add(S.amount) // add the amount to our tally stack, SD + qdel(S) // We can just delete it straight away as it's going to be fully consumed anyway, saving some overhead from calling use() surroundings -= S else var/atom/movable/I @@ -537,7 +535,7 @@ return TRUE -/datum/component/personal_crafting/ui_act(action, params) +/datum/component/personal_crafting/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return @@ -611,6 +609,9 @@ data["name"] = "[data["name"]] [recipe.result_amount]x" data["desc"] = recipe.desc || initial(atom.desc) + if(ispath(recipe.result, /obj/item/food)) + var/obj/item/food/food = recipe.result + data["has_food_effect"] = !!food.crafted_food_buff // Crafting if(recipe.non_craftable) diff --git a/code/datums/components/crafting/equipment.dm b/code/datums/components/crafting/equipment.dm index 75b257156084e..dfd79e696224c 100644 --- a/code/datums/components/crafting/equipment.dm +++ b/code/datums/components/crafting/equipment.dm @@ -23,7 +23,7 @@ time = 4 SECONDS category = CAT_EQUIPMENT -/datum/crafting_recipe/improvisedshield +/datum/crafting_recipe/moonflowershield name = "Moonflower Shield" result = /obj/item/shield/buckler/moonflower reqs = list( diff --git a/code/datums/components/crafting/ranged_weapon.dm b/code/datums/components/crafting/ranged_weapon.dm index 0e3c7b119169b..174c0226a423e 100644 --- a/code/datums/components/crafting/ranged_weapon.dm +++ b/code/datums/components/crafting/ranged_weapon.dm @@ -77,7 +77,7 @@ reqs = list( /obj/item/assembly/signaler/anomaly/flux = 2, /obj/item/assembly/signaler/anomaly/grav = 1, - /obj/item/assembly/signaler/anomaly/vortex = MAX_CORES_VORTEX, + /obj/item/assembly/signaler/anomaly/vortex = (MAX_CORES_VORTEX - 1), /obj/item/assembly/signaler/anomaly/bluespace = 1, /obj/item/weaponcrafting/gunkit/beam_rifle = 1, ) diff --git a/code/datums/components/crafting/tailoring.dm b/code/datums/components/crafting/tailoring.dm index 3c498f74416bd..0bd3194813398 100644 --- a/code/datums/components/crafting/tailoring.dm +++ b/code/datums/components/crafting/tailoring.dm @@ -603,3 +603,43 @@ . = ..() if(HAS_TRAIT(user, TRAIT_BALLOON_SUTRA)) return TRUE + +/datum/crafting_recipe/press_armor + name = "press armor vest" + result = /obj/item/clothing/suit/armor/vest/press + time = 2 SECONDS + tool_paths = list(/obj/item/clothing/accessory/press_badge) + reqs = list( + /obj/item/clothing/suit/armor/vest = 1, + ) + category = CAT_CLOTHING + +/datum/crafting_recipe/press_helmet + name = "press helmet vest" + result = /obj/item/clothing/head/helmet/press + time = 2 SECONDS + tool_paths = list(/obj/item/clothing/accessory/press_badge) + reqs = list( + /obj/item/clothing/head/helmet/sec = 1, + ) + category = CAT_CLOTHING + +/datum/crafting_recipe/press_vest + name = "press vest" + result = /obj/item/clothing/suit/hazardvest/press + time = 2 SECONDS + tool_paths = list(/obj/item/clothing/accessory/press_badge) + reqs = list( + /obj/item/clothing/suit/hazardvest = 1, + ) + category = CAT_CLOTHING + +/datum/crafting_recipe/press_fedora + name = "press fedora" + result = /obj/item/clothing/head/fedora/beige/press + time = 2 SECONDS + tool_paths = list(/obj/item/clothing/accessory/press_badge) + reqs = list( + /obj/item/clothing/head/fedora/beige = 1, + ) + category = CAT_CLOTHING diff --git a/code/datums/components/cult_ritual_item.dm b/code/datums/components/cult_ritual_item.dm index dedd30bda0ef5..71e07e6380e11 100644 --- a/code/datums/components/cult_ritual_item.dm +++ b/code/datums/components/cult_ritual_item.dm @@ -404,7 +404,7 @@ if(!rune.Adjacent(cultist)) return FALSE - if(cultist.incapacitated()) + if(cultist.incapacitated) return FALSE if(cultist.stat == DEAD) @@ -427,7 +427,7 @@ if(QDELETED(tool) || !cultist.is_holding(tool)) return FALSE - if(cultist.incapacitated() || cultist.stat == DEAD) + if(cultist.incapacitated || cultist.stat == DEAD) to_chat(cultist, span_warning("You can't draw a rune right now.")) return FALSE diff --git a/code/datums/components/dejavu.dm b/code/datums/components/dejavu.dm index 8a1902526c42a..fefa9d7e6bee8 100644 --- a/code/datums/components/dejavu.dm +++ b/code/datums/components/dejavu.dm @@ -2,6 +2,7 @@ * A component to reset the parent to its previous state after some time passes */ /datum/component/dejavu + dupe_mode = COMPONENT_DUPE_ALLOWED ///message sent when dejavu rewinds var/rewind_message = "You remember a time not so long ago..." @@ -16,6 +17,8 @@ var/rewinds_remaining /// How long to wait between each rewind var/rewind_interval + /// Do we add a new component before teleporting the target to they teleport to the place where *we* teleported them from? + var/repeating_component /// The starting value of toxin loss at the beginning of the effect var/tox_loss = 0 @@ -34,13 +37,14 @@ /// A list of body parts saved at the beginning of the effect var/list/datum/saved_bodypart/saved_bodyparts -/datum/component/dejavu/Initialize(rewinds = 1, interval = 10 SECONDS) +/datum/component/dejavu/Initialize(rewinds = 1, interval = 10 SECONDS, add_component = FALSE) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE starting_turf = get_turf(parent) rewinds_remaining = rewinds rewind_interval = interval + repeating_component = add_component if(isliving(parent)) var/mob/living/L = parent @@ -92,6 +96,9 @@ qdel(src) /datum/component/dejavu/proc/rewind_living() + if (rewinds_remaining == 1 && repeating_component && !iscarbon(parent) && !isanimal_or_basicmob(parent)) + parent.AddComponent(type, 1, rewind_interval, TRUE) + var/mob/living/master = parent master.setToxLoss(tox_loss) master.setOxyLoss(oxy_loss) @@ -100,18 +107,27 @@ rewind() /datum/component/dejavu/proc/rewind_carbon() + if (rewinds_remaining == 1 && repeating_component) + parent.AddComponent(type, 1, rewind_interval, TRUE) + if(saved_bodyparts) var/mob/living/carbon/master = parent master.apply_saved_bodyparts(saved_bodyparts) rewind_living() /datum/component/dejavu/proc/rewind_animal() + if (rewinds_remaining == 1 && repeating_component) + parent.AddComponent(type, 1, rewind_interval, TRUE) + var/mob/living/master = parent master.bruteloss = brute_loss master.updatehealth() rewind_living() /datum/component/dejavu/proc/rewind_obj() + if (rewinds_remaining == 1 && repeating_component) + parent.AddComponent(type, 1, rewind_interval, TRUE) + var/obj/master = parent master.update_integrity(integrity) rewind() @@ -124,3 +140,10 @@ /datum/component/dejavu/timeline/rewind() playsound(get_turf(parent), 'sound/items/modsuit/rewinder.ogg') . = ..() + +/datum/component/dejavu/wizard + rewind_message = "Your temporal ward activated, pulling you through spacetime!" + +/datum/component/dejavu/wizard/rewind() + playsound(get_turf(parent), 'sound/items/modsuit/rewinder.ogg') + . = ..() diff --git a/code/datums/components/creamed.dm b/code/datums/components/face_decal.dm similarity index 50% rename from code/datums/components/creamed.dm rename to code/datums/components/face_decal.dm index d1ff1b792e17a..f045a4f18df6e 100644 --- a/code/datums/components/creamed.dm +++ b/code/datums/components/face_decal.dm @@ -1,37 +1,37 @@ -GLOBAL_LIST_INIT(creamable, typecacheof(list( - /mob/living/carbon/human, - /mob/living/basic/pet/dog/corgi, - /mob/living/silicon/ai))) /** - * Creamed component + * Face decal component * - * For when you have pie on your face + * For when you have some dirt on your face */ -/datum/component/creamed - dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS - /// Creampie overlay we use for non-carbon mobs + +/datum/component/face_decal + dupe_mode = COMPONENT_DUPE_HIGHLANDER + /// Overlay we use for non-carbon mobs var/mutable_appearance/normal_overlay - /// Creampie bodypart overlay we use for carbon mobs - var/datum/bodypart_overlay/simple/creampie/bodypart_overlay - /// Cached head for carbons, to ensure proper removal of the creampie overlay + /// Bodypart overlay we use for carbon mobs + var/datum/bodypart_overlay/simple/bodypart_overlay + /// Cached head for carbons, to ensure proper removal of our overlay var/obj/item/bodypart/my_head + /// Base icon state we use for the effect + var/icon_state + /// Layers for the bodypart_overlay to draw on + var/layers + /// Color that the overlay is modified by + var/color -/datum/component/creamed/Initialize() - if(!is_type_in_typecache(parent, GLOB.creamable)) - return COMPONENT_INCOMPATIBLE - - SEND_SIGNAL(parent, COMSIG_MOB_CREAMED, src) - - add_memory_in_range(parent, 7, /datum/memory/witnessed_creampie, protagonist = parent) +/datum/component/face_decal/Initialize(icon_state, layers, color) + src.icon_state = icon_state + src.layers = layers + src.color = color -/datum/component/creamed/Destroy(force) +/datum/component/face_decal/Destroy(force) . = ..() normal_overlay = null my_head = null QDEL_NULL(bodypart_overlay) -/datum/component/creamed/RegisterWithParent() +/datum/component/face_decal/RegisterWithParent() if(iscarbon(parent)) var/mob/living/carbon/human/carbon_parent = parent my_head = carbon_parent.get_bodypart(BODY_ZONE_HEAD) @@ -39,32 +39,38 @@ GLOBAL_LIST_INIT(creamable, typecacheof(list( qdel(src) return bodypart_overlay = new() + bodypart_overlay.layers = layers if(carbon_parent.bodyshape & BODYSHAPE_SNOUTED) //stupid, but external organ bodytypes are not stored on the limb - bodypart_overlay.icon_state = "creampie_lizard" + bodypart_overlay.icon_state = "[icon_state]_lizard" else if(my_head.bodyshape & BODYSHAPE_MONKEY) - bodypart_overlay.icon_state = "creampie_monkey" + bodypart_overlay.icon_state = "[icon_state]_monkey" else - bodypart_overlay.icon_state = "creampie_human" + bodypart_overlay.icon_state = "[icon_state]_human" + if (!isnull(color)) + bodypart_overlay.draw_color = color my_head.add_bodypart_overlay(bodypart_overlay) RegisterSignals(my_head, list(COMSIG_BODYPART_REMOVED, COMSIG_QDELETING), PROC_REF(lost_head)) - carbon_parent.add_mood_event("creampie", /datum/mood_event/creampie) carbon_parent.update_body_parts() - else if(iscorgi(parent)) - normal_overlay = mutable_appearance('icons/mob/effects/creampie.dmi', "creampie_corgi") - else if(isAI(parent)) - normal_overlay = mutable_appearance('icons/mob/effects/creampie.dmi', "creampie_ai") + else + normal_overlay = get_normal_overlay() RegisterSignals(parent, list( COMSIG_COMPONENT_CLEAN_ACT, COMSIG_COMPONENT_CLEAN_FACE_ACT), PROC_REF(clean_up) ) - if(normal_overlay) + + if (!isnull(normal_overlay)) + if (!isnull(color)) + normal_overlay.color = color var/atom/atom_parent = parent RegisterSignal(atom_parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(update_overlays)) atom_parent.update_appearance() -/datum/component/creamed/UnregisterFromParent() +/datum/component/face_decal/proc/get_normal_overlay() + return + +/datum/component/face_decal/UnregisterFromParent() UnregisterSignal(parent, list( COMSIG_COMPONENT_CLEAN_ACT, COMSIG_COMPONENT_CLEAN_FACE_ACT)) @@ -78,7 +84,6 @@ GLOBAL_LIST_INIT(creamable, typecacheof(list( my_head = null if(iscarbon(parent)) var/mob/living/carbon/carbon_parent = parent - carbon_parent.clear_mood_event("creampie") carbon_parent.update_body_parts() if(normal_overlay) var/atom/atom_parent = parent @@ -86,8 +91,8 @@ GLOBAL_LIST_INIT(creamable, typecacheof(list( atom_parent.update_appearance() normal_overlay = null -///Callback to remove pieface -/datum/component/creamed/proc/clean_up(datum/source, clean_types) +///Callback to remove our decal +/datum/component/face_decal/proc/clean_up(datum/source, clean_types) SIGNAL_HANDLER if(!(clean_types & CLEAN_TYPE_BLOOD)) @@ -97,14 +102,48 @@ GLOBAL_LIST_INIT(creamable, typecacheof(list( return COMPONENT_CLEANED /// Ensures normal_overlay overlay in case the mob is not a carbon -/datum/component/creamed/proc/update_overlays(atom/parent_atom, list/overlays) +/datum/component/face_decal/proc/update_overlays(atom/parent_atom, list/overlays) SIGNAL_HANDLER if(normal_overlay) overlays += normal_overlay -/// Removes creampie when the head gets dismembered -/datum/component/creamed/proc/lost_head(obj/item/bodypart/source, mob/living/carbon/owner, dismembered) +/// Removes the decal when the head gets dismembered +/datum/component/face_decal/proc/lost_head(obj/item/bodypart/source, mob/living/carbon/owner, dismembered) SIGNAL_HANDLER - qdel(src) + +/// Creampie subtype, handling signals and mood logic + +GLOBAL_LIST_INIT(creamable, typecacheof(list( + /mob/living/carbon/human, + /mob/living/basic/pet/dog/corgi, + /mob/living/silicon/ai, +))) + +/datum/component/face_decal/creampie/Initialize() + . = ..() + if(!is_type_in_typecache(parent, GLOB.creamable)) + return COMPONENT_INCOMPATIBLE + + SEND_SIGNAL(parent, COMSIG_MOB_CREAMED, src) + add_memory_in_range(parent, 7, /datum/memory/witnessed_creampie, protagonist = parent) + +/datum/component/face_decal/creampie/get_normal_overlay() + if(iscorgi(parent)) + return mutable_appearance('icons/mob/effects/creampie.dmi', "[icon_state]_corgi") + + if(isAI(parent)) + return mutable_appearance('icons/mob/effects/creampie.dmi', "[icon_state]_ai") + +/datum/component/face_decal/creampie/RegisterWithParent() + . = ..() + if(iscarbon(parent)) + var/mob/living/carbon/human/carbon_parent = parent + carbon_parent.add_mood_event("creampie", /datum/mood_event/creampie) + +/datum/component/face_decal/creampie/UnregisterFromParent() + . = ..() + if(iscarbon(parent)) + var/mob/living/carbon/carbon_parent = parent + carbon_parent.clear_mood_event("creampie") diff --git a/code/datums/components/fishing_spot.dm b/code/datums/components/fishing_spot.dm index 6638c822ff6a5..cc21f22eb4b62 100644 --- a/code/datums/components/fishing_spot.dm +++ b/code/datums/components/fishing_spot.dm @@ -12,7 +12,7 @@ fish_source = configuration else return COMPONENT_INCOMPATIBLE - fish_source.on_fishing_spot_init() + fish_source.on_fishing_spot_init(src) RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(handle_attackby)) RegisterSignal(parent, COMSIG_FISHING_ROD_CAST, PROC_REF(handle_cast)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examined)) @@ -22,6 +22,7 @@ ADD_TRAIT(parent, TRAIT_FISHING_SPOT, REF(src)) /datum/component/fishing_spot/Destroy() + fish_source.on_fishing_spot_del(src) fish_source = null return ..() diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm index 056f1e5791e6c..c034300f982fe 100644 --- a/code/datums/components/food/edible.dm +++ b/code/datums/components/food/edible.dm @@ -40,6 +40,8 @@ Behavior that's still missing from this component that original food items had t var/volume = 50 ///The flavortext for taste (haha get it flavor text) var/list/tastes + ///Whether to tell the examiner that this is edible or not. + var/show_examine = TRUE /datum/component/edible/Initialize( list/initial_reagents, @@ -55,6 +57,7 @@ Behavior that's still missing from this component that original food items had t datum/callback/on_consume, datum/callback/check_liked, reagent_purity = 0.5, + show_examine = TRUE, ) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE @@ -70,12 +73,13 @@ Behavior that's still missing from this component that original food items had t src.on_consume = on_consume src.tastes = string_assoc_list(tastes) src.check_liked = check_liked + src.show_examine = show_examine setup_initial_reagents(initial_reagents, reagent_purity) /datum/component/edible/RegisterWithParent() RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) - RegisterSignals(parent, COMSIG_ATOM_ATTACK_ANIMAL, PROC_REF(UseByAnimal)) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_ANIMAL, PROC_REF(UseByAnimal)) RegisterSignal(parent, COMSIG_ATOM_CHECKPARTS, PROC_REF(OnCraft)) RegisterSignal(parent, COMSIG_ATOM_CREATEDBY_PROCESSING, PROC_REF(OnProcessed)) RegisterSignal(parent, COMSIG_FOOD_INGREDIENT_ADDED, PROC_REF(edible_ingredient_added)) @@ -212,7 +216,8 @@ Behavior that's still missing from this component that original food items had t SIGNAL_HANDLER var/atom/owner = parent - + if(!show_examine) + return if(foodtypes) var/list/types = bitfield_to_list(foodtypes, FOOD_FLAGS) examine_list += span_notice("It is [LOWER_TEXT(english_list(types))].") @@ -523,13 +528,13 @@ Behavior that's still missing from this component that original food items had t /datum/component/edible/proc/apply_buff(mob/eater) var/buff var/recipe_complexity = get_recipe_complexity() - if(recipe_complexity == 0) + if(recipe_complexity <= 0) return var/obj/item/food/food = parent if(!isnull(food.crafted_food_buff)) buff = food.crafted_food_buff else - buff = pick_weight(GLOB.food_buffs[recipe_complexity]) + buff = pick_weight(GLOB.food_buffs[min(recipe_complexity, FOOD_COMPLEXITY_5)]) if(!isnull(buff)) var/mob/living/living_eater = eater var/atom/owner = parent @@ -590,10 +595,13 @@ Behavior that's still missing from this component that original food items had t /// Get the complexity of the crafted food /datum/component/edible/proc/get_recipe_complexity() + var/list/extra_complexity = list(0) + SEND_SIGNAL(parent, COMSIG_FOOD_GET_EXTRA_COMPLEXITY, extra_complexity) + var/complexity_to_add = extra_complexity[1] if(!HAS_TRAIT(parent, TRAIT_FOOD_CHEF_MADE) || !istype(parent, /obj/item/food)) - return 0 // It is factory made. Soulless. + return complexity_to_add // It is factory made. Soulless. var/obj/item/food/food = parent - return food.crafting_complexity + return food.crafting_complexity + complexity_to_add /// Get food quality adjusted according to eater's preferences /datum/component/edible/proc/get_perceived_food_quality(mob/living/carbon/human/eater) diff --git a/code/datums/components/food/germ_sensitive.dm b/code/datums/components/food/germ_sensitive.dm index d0acc49714ab5..3e47c3fe1ecd8 100644 --- a/code/datums/components/food/germ_sensitive.dm +++ b/code/datums/components/food/germ_sensitive.dm @@ -25,7 +25,7 @@ GLOBAL_LIST_INIT(floor_diseases, list( RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(handle_movement)) - RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(wash)) //Wash germs off dirty things + RegisterSignals(parent, list(COMSIG_COMPONENT_CLEAN_ACT, COMSIG_ITEM_FRIED, COMSIG_ITEM_BARBEQUE_GRILLED, COMSIG_ATOM_FIRE_ACT), PROC_REF(delete_germs)) RegisterSignals(parent, list( COMSIG_ITEM_DROPPED, //Dropped into the world @@ -50,6 +50,9 @@ GLOBAL_LIST_INIT(floor_diseases, list( COMSIG_ATOM_EXAMINE, COMSIG_ATOM_EXITED, COMSIG_COMPONENT_CLEAN_ACT, + COMSIG_ITEM_FRIED, + COMSIG_ITEM_BARBEQUE_GRILLED, + COMSIG_ATOM_FIRE_ACT, COMSIG_ITEM_DROPPED, COMSIG_ITEM_PICKUP, COMSIG_MOVABLE_MOVED, @@ -116,7 +119,7 @@ GLOBAL_LIST_INIT(floor_diseases, list( var/random_disease = pick_weight(GLOB.floor_diseases) parent.AddComponent(/datum/component/infective, new random_disease, weak = TRUE) -/datum/component/germ_sensitive/proc/wash() +/datum/component/germ_sensitive/proc/delete_germs() SIGNAL_HANDLER if(infective) infective = FALSE diff --git a/code/datums/components/fullauto.dm b/code/datums/components/fullauto.dm index 1faa04ceacc75..a3f2009b3b506 100644 --- a/code/datums/components/fullauto.dm +++ b/code/datums/components/fullauto.dm @@ -275,7 +275,7 @@ // Gun procs. /obj/item/gun/proc/on_autofire_start(mob/living/shooter) - if(semicd || shooter.incapacitated() || !can_trigger_gun(shooter)) + if(semicd || shooter.incapacitated || !can_trigger_gun(shooter)) return FALSE if(!can_shoot()) shoot_with_empty_chamber(shooter) @@ -295,7 +295,7 @@ /obj/item/gun/proc/do_autofire(datum/source, atom/target, mob/living/shooter, allow_akimbo, params) SIGNAL_HANDLER - if(semicd || shooter.incapacitated()) + if(semicd || shooter.incapacitated) return NONE if(!can_shoot()) shoot_with_empty_chamber(shooter) diff --git a/code/datums/components/gunpoint.dm b/code/datums/components/gunpoint.dm index ed4142f41ceba..edde591c0c386 100644 --- a/code/datums/components/gunpoint.dm +++ b/code/datums/components/gunpoint.dm @@ -48,7 +48,7 @@ RegisterSignals(targ, list(COMSIG_LIVING_DISARM_HIT, COMSIG_LIVING_GET_PULLED), PROC_REF(cancel)) RegisterSignals(weapon, list(COMSIG_ITEM_DROPPED, COMSIG_ITEM_EQUIPPED), PROC_REF(cancel)) - var/distance = min(get_dist(shooter, target), 1) // treat 0 distance as adjacent + var/distance = max(get_dist(shooter, target), 1) // treat 0 distance as adjacent var/distance_description = (distance <= 1 ? "point blank " : "") shooter.visible_message(span_danger("[shooter] aims [weapon] [distance_description]at [target]!"), diff --git a/code/datums/components/material/material_container.dm b/code/datums/components/material/material_container.dm index 6ee50f5d78c94..10544116ce579 100644 --- a/code/datums/components/material/material_container.dm +++ b/code/datums/components/material/material_container.dm @@ -124,10 +124,10 @@ * Material Validation : Checks how much materials are available, Extracts materials from items if the container can hold them * Material Removal : Removes material from the container * - * Each Proc furthur belongs to a specific category + * Each Proc further belongs to a specific category * LOW LEVEL: Procs that are used internally & should not be used anywhere else unless you know what your doing * MID LEVEL: Procs that can be used by machines(like recycler, stacking machines) to bypass majority of checks - * HIGH LEVEL: Procs that can be used by anyone publically and guarentees safty checks & limits + * HIGH LEVEL: Procs that can be used by anyone publicly and guarantees safety checks & limits */ //================================Material Insertion procs============================== @@ -236,7 +236,7 @@ //do the insert var/last_inserted_id = insert_item_materials(target, multiplier, context) if(!isnull(last_inserted_id)) - if(delete_item || target != weapon) //we could have split the stack ourself + if(delete_item || target != weapon) //we could have split the stack ourselves qdel(target) //item gone return material_amount else if(!isnull(item_stack) && item_stack != target) //insertion failed, merge the split stack back into the original @@ -250,7 +250,7 @@ //===================================HIGH LEVEL=================================================== /** - * inserts an item from the players hand into the container. Loops through all the contents inside reccursively + * inserts an item from the players hand into the container. Loops through all the contents inside recursively * Does all explicit checking for mat flags & callbacks to check if insertion is valid * This proc is what you should be using for almost all cases * @@ -259,7 +259,7 @@ * * user - the mob inserting this item * * context - the atom performing the operation, this is the last argument sent in COMSIG_MATCONTAINER_ITEM_CONSUMED and is used mostly for silo logging */ -/datum/component/material_container/proc/user_insert(obj/item/held_item, mob/living/user, atom/context = parent) +/datum/component/material_container/proc/user_insert(obj/item/held_item, mob/living/user, atom/context = parent, forced_type = FALSE) set waitfor = FALSE . = 0 @@ -297,7 +297,7 @@ if(SEND_SIGNAL(src, COMSIG_MATCONTAINER_PRE_USER_INSERT, target_item, user) & MATCONTAINER_BLOCK_INSERT) continue //item is either indestructible, not allowed for redemption or not in the allowed types - if((target_item.resistance_flags & INDESTRUCTIBLE) || (target_item.item_flags & NO_MAT_REDEMPTION) || (allowed_item_typecache && !is_type_in_typecache(target_item, allowed_item_typecache))) + if((target_item.resistance_flags & INDESTRUCTIBLE) || (target_item.item_flags & NO_MAT_REDEMPTION) || (allowed_item_typecache && !is_type_in_typecache(target_item, allowed_item_typecache) && !forced_type)) if(!(mat_container_flags & MATCONTAINER_SILENT)) var/list/status_data = chat_msgs["[MATERIAL_INSERT_ITEM_FAILURE]"] || list() var/list/item_data = status_data[target_item.name] || list() @@ -455,9 +455,9 @@ if(MATERIAL_INSERT_ITEM_SUCCESS) //no problems full item was consumed if(chat_data["stack"]) var/sheets = min(count, amount) //minimum between sheets inserted vs sheets consumed(values differ for alloys) - to_chat(user, span_notice("[sheets > 1 ? sheets : ""] [item_name][sheets > 1 ? "s were" : " was"] added to [parent].")) + to_chat(user, span_notice("[sheets > 1 ? "[sheets] " : ""][item_name][sheets > 1 ? "s were" : " was"] added to [parent].")) else - to_chat(user, span_notice("[count > 1 ? count : ""] [item_name][count > 1 ? "s" : ""], worth [amount] sheets, [count > 1 ? "were" : "was"] added to [parent].")) + to_chat(user, span_notice("[count > 1 ? "[count] " : ""][item_name][count > 1 ? "s" : ""], worth [amount] sheets, [count > 1 ? "were" : "was"] added to [parent].")) if(MATERIAL_INSERT_ITEM_NO_SPACE) //no space to_chat(user, span_warning("[parent] has no space to accept [item_name]!")) if(MATERIAL_INSERT_ITEM_NO_MATS) //no materials inside these items @@ -584,7 +584,7 @@ for(var/x in mats) //Loop through all required materials var/wanted = OPTIMAL_COST(mats[x] * coefficient) * multiplier if(!has_enough_of_material(x, wanted))//Not a category, so just check the normal way - testing("didnt have: [x] wanted: [wanted]") + testing("didn't have: [x] wanted: [wanted]") return FALSE return TRUE @@ -605,7 +605,7 @@ //round amount amt = OPTIMAL_COST(amt) - //get ref if nessassary + //get ref if necessary if(!istype(mat)) mat = GET_MATERIAL_REF(mat) diff --git a/code/datums/components/material/remote_materials.dm b/code/datums/components/material/remote_materials.dm index d630ce8e77f9b..8ae52069c1bcb 100644 --- a/code/datums/components/material/remote_materials.dm +++ b/code/datums/components/material/remote_materials.dm @@ -23,13 +23,16 @@ handles linking back and forth. var/mat_container_flags = NONE ///List of signals to hook onto the local container var/list/mat_container_signals + ///Typecache for items that the silo will accept through this remote no matter what + var/list/whitelist_typecache /datum/component/remote_materials/Initialize( mapload, allow_standalone = TRUE, force_connect = FALSE, mat_container_flags = NONE, - list/mat_container_signals = null + list/mat_container_signals = null, + list/whitelist_typecache = null ) if (!isatom(parent)) return COMPONENT_INCOMPATIBLE @@ -37,6 +40,7 @@ handles linking back and forth. src.allow_standalone = allow_standalone src.mat_container_flags = mat_container_flags src.mat_container_signals = mat_container_signals + src.whitelist_typecache = whitelist_typecache RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(OnMultitool)) @@ -93,6 +97,9 @@ handles linking back and forth. allowed_items = /obj/item/stack \ ) + if (whitelist_typecache) + mat_container.allowed_item_typecache |= whitelist_typecache + /datum/component/remote_materials/proc/toggle_holding(force_hold = FALSE) if(isnull(silo)) return @@ -140,7 +147,7 @@ handles linking back and forth. return if(silo) - mat_container.user_insert(target, user, parent) + mat_container.user_insert(target, user, parent, (whitelist_typecache && is_type_in_typecache(target, whitelist_typecache))) return COMPONENT_NO_AFTERATTACK diff --git a/code/datums/components/mind_linker.dm b/code/datums/components/mind_linker.dm index ba3f0a6841bee..4449a8fe36e8e 100644 --- a/code/datums/components/mind_linker.dm +++ b/code/datums/components/mind_linker.dm @@ -184,7 +184,7 @@ return ..() /datum/component/mind_linker/active_linking/link_mob(mob/living/to_link) - if(HAS_TRAIT(to_link, TRAIT_MINDSHIELD)) // Mindshield implant - no dice + if(HAS_MIND_TRAIT(to_link, TRAIT_UNCONVERTABLE)) // Protected mind, so they can't be added to the mindlink return FALSE if(to_link.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0)) return FALSE diff --git a/code/datums/components/omen.dm b/code/datums/components/omen.dm index e4094ba679a7e..bb72654f978ae 100644 --- a/code/datums/components/omen.dm +++ b/code/datums/components/omen.dm @@ -143,12 +143,12 @@ return for(var/obj/machinery/light/evil_light in the_turf) - if((evil_light.status == LIGHT_BURNED || evil_light.status == LIGHT_BROKEN) || (HAS_TRAIT(living_guy, TRAIT_SHOCKIMMUNE))) // we cant do anything :( // Why in the world is there no get_siemens_coeff proc??? + if((evil_light.status == LIGHT_BURNED || evil_light.status == LIGHT_BROKEN) || (HAS_TRAIT(living_guy, TRAIT_SHOCKIMMUNE))) // we can't do anything :( // Why in the world is there no get_siemens_coeff proc??? to_chat(living_guy, span_warning("[evil_light] sparks weakly for a second.")) do_sparks(2, FALSE, evil_light) // hey maybe it'll ignite them return - to_chat(living_guy, span_warning("[evil_light] glows ominously...")) // omenously + to_chat(living_guy, span_warning("[evil_light] glows ominously...")) // ominously evil_light.visible_message(span_boldwarning("[evil_light] suddenly flares brightly and sparks!")) evil_light.break_light_tube(skip_sound_and_sparks = FALSE) do_sparks(number = 4, cardinal_only = FALSE, source = evil_light) diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm index 258b8f87972e0..642feee3ac0e8 100644 --- a/code/datums/components/overlay_lighting.dm +++ b/code/datums/components/overlay_lighting.dm @@ -62,13 +62,13 @@ var/directional = FALSE ///Whether we're a beam light var/beam = FALSE - ///A cone overlay for directional light, its alpha and color are dependant on the light + ///A cone overlay for directional light, its alpha and color are dependent on the light var/image/cone ///Current tracked direction for the directional cast behaviour var/current_direction - ///Tracks current directional x offset so we dont update unecessarily + ///Tracks current directional x offset so we don't update unnecessarily var/directional_offset_x - ///Tracks current directional y offset so we dont update unecessarily + ///Tracks current directional y offset so we don't update unnecessarily var/directional_offset_y ///Cast range for the directional cast (how far away the atom is moved) var/cast_range = 2 diff --git a/code/datums/components/pet_commands/pet_command.dm b/code/datums/components/pet_commands/pet_command.dm index a8db88d3a44ef..52b4cc8834920 100644 --- a/code/datums/components/pet_commands/pet_command.dm +++ b/code/datums/components/pet_commands/pet_command.dm @@ -186,14 +186,14 @@ /datum/pet_command/point_targeting/add_new_friend(mob/living/tamer) . = ..() - RegisterSignal(tamer, COMSIG_MOB_POINTED, PROC_REF(on_point)) + RegisterSignal(tamer, COMSIG_MOVABLE_POINTED, PROC_REF(on_point)) /datum/pet_command/point_targeting/remove_friend(mob/living/unfriended) . = ..() - UnregisterSignal(unfriended, COMSIG_MOB_POINTED) + UnregisterSignal(unfriended, COMSIG_MOVABLE_POINTED) /// Target the pointed atom for actions -/datum/pet_command/point_targeting/proc/on_point(mob/living/friend, atom/pointed_atom) +/datum/pet_command/point_targeting/proc/on_point(mob/living/friend, atom/pointed_atom, obj/effect/temp_visual/point/point) SIGNAL_HANDLER var/mob/living/parent = weak_parent.resolve() diff --git a/code/datums/components/phylactery.dm b/code/datums/components/phylactery.dm index 4a58660992a8d..572f816b5ad22 100644 --- a/code/datums/components/phylactery.dm +++ b/code/datums/components/phylactery.dm @@ -18,7 +18,7 @@ var/phylactery_color = COLOR_VERY_DARK_LIME_GREEN // Internal vars. - /// The number of ressurections that have occured from this phylactery. + /// The number of resurrections that have occurred from this phylactery. var/num_resurrections = 0 /// A timerid to the current revival timer. var/revive_timer @@ -150,7 +150,7 @@ UnregisterSignal(source, COMSIG_LIVING_REVIVE) /** - * Actually undergo the process of reviving the lich at the site of the phylacery. + * Actually undergo the process of reviving the lich at the site of the phylactery. * * Arguments * * corpse - optional, the old body of the lich. Can be QDELETED or null. diff --git a/code/datums/components/pinata.dm b/code/datums/components/pinata.dm index 064bc2de26b26..62e1a8e55527f 100644 --- a/code/datums/components/pinata.dm +++ b/code/datums/components/pinata.dm @@ -1,8 +1,8 @@ -///Objects or mobs with this componenet will drop items when taking damage. +///Objects or mobs with this component will drop items when taking damage. /datum/component/pinata ///How much damage does an attack need to do to have a chance to drop "candy" var/minimum_damage - ///What is the likelyhood some "candy" should drop when attacked. + ///What is the likelihood some "candy" should drop when attacked. var/drop_chance ///A list of "candy" items that can be dropped when taking damage var/candy diff --git a/code/datums/components/profound_fisher.dm b/code/datums/components/profound_fisher.dm index 4485115db06e6..947e9d26f5197 100644 --- a/code/datums/components/profound_fisher.dm +++ b/code/datums/components/profound_fisher.dm @@ -1,39 +1,107 @@ -///component that allows player mobs to play the fishing minigame, non-player mobs will "pretend" fish +///component that allows player mobs to play the fishing minigame without a rod equipped, non-player mobs will "pretend" fish /datum/component/profound_fisher ///the fishing rod this mob will use var/obj/item/fishing_rod/mob_fisher/our_rod -/datum/component/profound_fisher/Initialize(list/npc_fishing_preset = list()) - if(!isliving(parent)) - return - our_rod = new(parent) - ADD_TRAIT(parent, TRAIT_PROFOUND_FISHER, REF(src)) +/datum/component/profound_fisher/Initialize(our_rod) + var/isgloves = istype(parent, /obj/item/clothing/gloves) + if(!isliving(parent) && !isgloves) + return COMPONENT_INCOMPATIBLE + src.our_rod = our_rod || new(parent) + src.our_rod.internal = TRUE + RegisterSignal(src.our_rod, COMSIG_QDELETING, PROC_REF(on_rod_qdel)) + + if(!isgloves) + RegisterSignal(parent, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) + else + var/obj/item/clothing/gloves = parent + RegisterSignal(gloves, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) + RegisterSignal(gloves, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) + RegisterSignal(gloves, COMSIG_ATOM_ATTACK_HAND_SECONDARY, PROC_REF(open_rod_menu)) + RegisterSignal(gloves, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + gloves.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 + RegisterSignal(gloves, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) + var/mob/living/wearer = gloves.loc + if(istype(wearer) && wearer.get_item_by_slot(ITEM_SLOT_GLOVES) == gloves) + RegisterSignal(wearer, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_unarmed_attack)) -/datum/component/profound_fisher/RegisterWithParent() - RegisterSignal(parent, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) +/datum/component/profound_fisher/proc/on_requesting_context_from_item(datum/source, list/context, obj/item/held_item, mob/living/user) + SIGNAL_HANDLER + if(isnull(held_item) && user.contains(parent)) + context[SCREENTIP_CONTEXT_RMB] = "Open rod UI" + return CONTEXTUAL_SCREENTIP_SET -/datum/component/profound_fisher/UnregisterFromParent() - UnregisterSignal(parent, COMSIG_HOSTILE_PRE_ATTACKINGTARGET) - REMOVE_TRAIT(parent, TRAIT_PROFOUND_FISHER, REF(src)) +/datum/component/profound_fisher/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + examine_list += span_info("When [EXAMINE_HINT("held")] or [EXAMINE_HINT("equipped")], [EXAMINE_HINT("right-click")] with a empty hand to open the integrated fishing rod interface.") + examine_list += span_tinynoticeital("To fish, you need to turn combat mode off.") + +/datum/component/profound_fisher/proc/on_rod_qdel(datum/source) + SIGNAL_HANDLER + qdel(src) /datum/component/profound_fisher/Destroy() - QDEL_NULL(our_rod) + our_rod.internal = FALSE + UnregisterSignal(our_rod, COMSIG_QDELETING) + our_rod = null return ..() -/datum/component/profound_fisher/proc/pre_attack(datum/source, atom/target) +/datum/component/profound_fisher/proc/on_equip(obj/item/source, atom/equipper, slot) SIGNAL_HANDLER + if(slot != ITEM_SLOT_GLOVES) + return + RegisterSignal(equipper, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_unarmed_attack)) - if(!HAS_TRAIT(target, TRAIT_FISHING_SPOT)) - return NONE - var/mob/living/living_parent = parent - if(living_parent.combat_mode || !living_parent.CanReach(target)) - return NONE - if(living_parent.client) - INVOKE_ASYNC(our_rod, TYPE_PROC_REF(/obj/item, melee_attack_chain), parent, target) +/datum/component/profound_fisher/proc/open_rod_menu(datum/source, mob/user, list/modifiers) + SIGNAL_HANDLER + INVOKE_ASYNC(our_rod, TYPE_PROC_REF(/datum, ui_interact), user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/datum/component/profound_fisher/proc/on_drop(datum/source, atom/dropper) + SIGNAL_HANDLER + UnregisterSignal(dropper, COMSIG_LIVING_UNARMED_ATTACK) + REMOVE_TRAIT(dropper, TRAIT_PROFOUND_FISHER, TRAIT_GENERIC) //this will cancel the current minigame if the fishing rod was internal. + +/datum/component/profound_fisher/proc/on_unarmed_attack(mob/living/source, atom/attack_target, proximity_flag, list/modifiers) + SIGNAL_HANDLER + if(!source.client || !should_fish_on(source, attack_target)) + return + INVOKE_ASYNC(src, PROC_REF(begin_fishing), source, attack_target) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/datum/component/profound_fisher/proc/pre_attack(mob/living/source, atom/target) + SIGNAL_HANDLER + + if(!should_fish_on(source, target)) + return + if(source.client) + INVOKE_ASYNC(src, PROC_REF(begin_fishing), source, target) else INVOKE_ASYNC(src, PROC_REF(pretend_fish), target) return COMPONENT_HOSTILE_NO_ATTACK +/datum/component/profound_fisher/proc/should_fish_on(mob/living/user, atom/target) + if(!HAS_TRAIT(target, TRAIT_FISHING_SPOT) || HAS_TRAIT(user, TRAIT_GONE_FISHING)) + return FALSE + if(user.combat_mode || !user.CanReach(target)) + return FALSE + return TRUE + +/datum/component/profound_fisher/proc/begin_fishing(mob/living/user, atom/target) + RegisterSignal(user, SIGNAL_ADDTRAIT(TRAIT_GONE_FISHING), PROC_REF(actually_fishing_with_internal_rod)) + our_rod.melee_attack_chain(user, target) + UnregisterSignal(user, SIGNAL_ADDTRAIT(TRAIT_GONE_FISHING)) + +/datum/component/profound_fisher/proc/actually_fishing_with_internal_rod(datum/source) + SIGNAL_HANDLER + ADD_TRAIT(source, TRAIT_PROFOUND_FISHER, REF(parent)) + RegisterSignal(source, SIGNAL_REMOVETRAIT(TRAIT_GONE_FISHING), PROC_REF(remove_profound_fisher)) + +/datum/component/profound_fisher/proc/remove_profound_fisher(datum/source) + SIGNAL_HANDLER + REMOVE_TRAIT(source, TRAIT_PROFOUND_FISHER, TRAIT_GENERIC) + UnregisterSignal(source, SIGNAL_REMOVETRAIT(TRAIT_GONE_FISHING)) + /datum/component/profound_fisher/proc/pretend_fish(atom/target) var/mob/living/living_parent = parent if(DOING_INTERACTION_WITH_TARGET(living_parent, target)) @@ -56,8 +124,6 @@ qdel(lure) /obj/item/fishing_rod/mob_fisher - display_fishing_line = FALSE line = /obj/item/fishing_line/reinforced bait = /obj/item/food/bait/doughball/synthetic/unconsumable - - + resistance_flags = INDESTRUCTIBLE diff --git a/code/datums/components/riding/riding.dm b/code/datums/components/riding/riding.dm index 7ead11012b024..cfdaf605878bf 100644 --- a/code/datums/components/riding/riding.dm +++ b/code/datums/components/riding/riding.dm @@ -9,7 +9,6 @@ /datum/component/riding dupe_mode = COMPONENT_DUPE_UNIQUE - var/last_move_diagonal = FALSE ///tick delay between movements, lower = faster, higher = slower var/vehicle_move_delay = 2 diff --git a/code/datums/components/riding/riding_mob.dm b/code/datums/components/riding/riding_mob.dm index 50798fce50157..1e3c94d84c6a3 100644 --- a/code/datums/components/riding/riding_mob.dm +++ b/code/datums/components/riding/riding_mob.dm @@ -58,10 +58,10 @@ if(living_parent.body_position != STANDING_UP) // if we move while on the ground, the rider falls off . = FALSE // for piggybacks and (redundant?) borg riding, check if the rider is stunned/restrained - else if((ride_check_flags & RIDER_NEEDS_ARMS) && (HAS_TRAIT(rider, TRAIT_RESTRAINED) || rider.incapacitated(IGNORE_RESTRAINTS|IGNORE_GRAB))) + else if((ride_check_flags & RIDER_NEEDS_ARMS) && (HAS_TRAIT(rider, TRAIT_RESTRAINED) || INCAPACITATED_IGNORING(rider, INCAPABLE_RESTRAINTS|INCAPABLE_GRAB))) . = FALSE // for fireman carries, check if the ridden is stunned/restrained - else if((ride_check_flags & CARRIER_NEEDS_ARM) && (HAS_TRAIT(living_parent, TRAIT_RESTRAINED) || living_parent.incapacitated(IGNORE_RESTRAINTS|IGNORE_GRAB))) + else if((ride_check_flags & CARRIER_NEEDS_ARM) && (HAS_TRAIT(living_parent, TRAIT_RESTRAINED) || INCAPACITATED_IGNORING(living_parent, INCAPABLE_RESTRAINTS|INCAPABLE_GRAB))) . = FALSE else if((ride_check_flags & JUST_FRIEND_RIDERS) && !(living_parent.faction.Find(REF(rider)))) . = FALSE @@ -105,9 +105,7 @@ to_chat(user, span_warning("You need a [initial(key.name)] to ride [movable_parent]!")) return COMPONENT_DRIVER_BLOCK_MOVE var/mob/living/living_parent = parent - var/turf/next = get_step(living_parent, direction) step(living_parent, direction) - last_move_diagonal = ((direction & (direction - 1)) && (living_parent.loc == next)) var/modified_move_cooldown = vehicle_move_cooldown var/modified_move_delay = vehicle_move_delay if(ishuman(user) && HAS_TRAIT(user, TRAIT_ROUGHRIDER)) // YEEHAW! @@ -133,7 +131,7 @@ if(SANITY_LEVEL_INSANE) modified_move_cooldown *= 1.2 modified_move_delay *= 1.2 - COOLDOWN_START(src, vehicle_move_cooldown = modified_move_cooldown, (last_move_diagonal ? 2 : 1) * modified_move_delay) + COOLDOWN_START(src, vehicle_move_cooldown = modified_move_cooldown, modified_move_delay) return ..() /// Yeets the rider off, used for animals and cyborgs, redefined for humans who shove their piggyback rider off @@ -515,9 +513,9 @@ /datum/component/riding/creature/leaper/Initialize(mob/living/riding_mob, force = FALSE, ride_check_flags = NONE, potion_boost = FALSE) . = ..() - RegisterSignal(riding_mob, COMSIG_MOB_POINTED, PROC_REF(attack_pointed)) + RegisterSignal(riding_mob, COMSIG_MOVABLE_POINTED, PROC_REF(attack_pointed)) -/datum/component/riding/creature/leaper/proc/attack_pointed(mob/living/rider, atom/pointed) +/datum/component/riding/creature/leaper/proc/attack_pointed(mob/living/rider, atom/pointed, obj/effect/temp_visual/point/point) SIGNAL_HANDLER if(!isclosedturf(pointed)) return @@ -529,7 +527,7 @@ /datum/component/riding/leaper/handle_unbuckle(mob/living/rider) . = ..() - UnregisterSignal(rider, COMSIG_MOB_POINTED) + UnregisterSignal(rider, COMSIG_MOVABLE_POINTED) /datum/component/riding/creature/raptor require_minigame = TRUE diff --git a/code/datums/components/riding/riding_vehicle.dm b/code/datums/components/riding/riding_vehicle.dm index 5555369c67ae8..f7ee78673e057 100644 --- a/code/datums/components/riding/riding_vehicle.dm +++ b/code/datums/components/riding/riding_vehicle.dm @@ -97,8 +97,7 @@ return step(movable_parent, direction) - last_move_diagonal = ((direction & (direction - 1)) && (movable_parent.loc == next)) - COOLDOWN_START(src, vehicle_move_cooldown, (last_move_diagonal? 2 : 1) * vehicle_move_delay) + COOLDOWN_START(src, vehicle_move_cooldown, vehicle_move_delay) if(QDELETED(src)) return diff --git a/code/datums/components/soapbox.dm b/code/datums/components/soapbox.dm index 4622cc089288c..4d4577d5e12c8 100644 --- a/code/datums/components/soapbox.dm +++ b/code/datums/components/soapbox.dm @@ -33,7 +33,7 @@ SIGNAL_HANDLER for(var/atom/movable/loud as anything in soapboxers) UnregisterSignal(loud, COMSIG_MOB_SAY) - soapboxers = list() + soapboxers.Cut() ///Gives a mob a unique say span /datum/component/soapbox/proc/soapbox_speech(datum/source, list/speech_args) diff --git a/code/datums/components/space_kidnap.dm b/code/datums/components/space_kidnap.dm index 8a1de2123d9d3..7d59a6d7f9fde 100644 --- a/code/datums/components/space_kidnap.dm +++ b/code/datums/components/space_kidnap.dm @@ -23,7 +23,7 @@ target.balloon_alert(parent, "is dead!") return COMPONENT_CANCEL_ATTACK_CHAIN - if(!victim.incapacitated()) + if(!victim.incapacitated) return if(!isspaceturf(get_turf(target))) @@ -39,7 +39,7 @@ var/obj/particles = new /obj/effect/abstract/particle_holder (victim, /particles/void_kidnap) kidnapping = TRUE - if(do_after(parent, kidnap_time, victim, extra_checks = CALLBACK(victim, TYPE_PROC_REF(/mob, incapacitated)))) + if(do_after(parent, kidnap_time, victim, extra_checks = victim.incapacitated)) take_them(victim) qdel(particles) diff --git a/code/datums/components/speechmod.dm b/code/datums/components/speechmod.dm index 2506a0b914077..8ffa3e8624e49 100644 --- a/code/datums/components/speechmod.dm +++ b/code/datums/components/speechmod.dm @@ -34,6 +34,12 @@ var/atom/owner = parent + if (istype(parent, /datum/status_effect)) + var/datum/status_effect/effect = parent + targeted = effect.owner + RegisterSignal(targeted, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + return + if (ismob(parent)) targeted = parent RegisterSignal(targeted, COMSIG_MOB_SAY, PROC_REF(handle_speech)) diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index c5d42797ab433..94521486bcc5f 100644 --- a/code/datums/components/squeak.dm +++ b/code/datums/components/squeak.dm @@ -128,7 +128,7 @@ UnregisterSignal(user, COMSIG_QDELETING) holder = null -///just gets rid of the reference to holder in the case that theyre qdeleted +///just gets rid of the reference to holder in the case that they're qdeleted /datum/component/squeak/proc/holder_deleted(datum/source, datum/possible_holder) SIGNAL_HANDLER if(possible_holder == holder) @@ -138,7 +138,7 @@ /datum/component/squeak/proc/disposing_react(datum/source, obj/structure/disposalholder/disposal_holder, obj/machinery/disposal/disposal_source) SIGNAL_HANDLER - //We don't need to worry about unregistering this signal as it will happen for us automaticaly when the holder is qdeleted + //We don't need to worry about unregistering this signal as it will happen for us automatically when the holder is qdeleted RegisterSignal(disposal_holder, COMSIG_ATOM_DIR_CHANGE, PROC_REF(holder_dir_change)) /datum/component/squeak/proc/holder_dir_change(datum/source, old_dir, new_dir) diff --git a/code/datums/components/sticker.dm b/code/datums/components/sticker.dm index 2c87d856da872..a11ab10e7c6f8 100644 --- a/code/datums/components/sticker.dm +++ b/code/datums/components/sticker.dm @@ -13,18 +13,21 @@ var/atom/movable/our_sticker /// Reference to the created overlay, used during component deletion. var/mutable_appearance/sticker_overlay - // Callback invoked when sticker is applied to the parent. + /// Callback invoked when sticker is applied to the parent. var/datum/callback/stick_callback - // Callback invoked when sticker is peeled (not removed) from the parent. + /// Callback invoked when sticker is peeled (not removed) from the parent. var/datum/callback/peel_callback + /// Text added to the atom's examine when stickered. + var/examine_text -/datum/component/sticker/Initialize(atom/stickering_atom, dir = NORTH, px = 0, py = 0, datum/callback/stick_callback, datum/callback/peel_callback) +/datum/component/sticker/Initialize(atom/stickering_atom, dir = NORTH, px = 0, py = 0, datum/callback/stick_callback, datum/callback/peel_callback, examine_text) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE src.our_sticker = our_sticker src.stick_callback = stick_callback src.peel_callback = peel_callback + src.examine_text = examine_text stick(stickering_atom, px, py) register_turf_signals(dir) @@ -45,9 +48,10 @@ /datum/component/sticker/RegisterWithParent() RegisterSignal(parent, COMSIG_LIVING_IGNITED, PROC_REF(on_ignite)) RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(on_clean)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) /datum/component/sticker/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_LIVING_IGNITED, COMSIG_COMPONENT_CLEAN_ACT)) + UnregisterSignal(parent, list(COMSIG_LIVING_IGNITED, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_ATOM_EXAMINE)) /// Subscribes to `COMSIG_TURF_EXPOSE` if parent atom is a turf. If turf is closed - subscribes to signal /datum/component/sticker/proc/register_turf_signals(dir) @@ -116,3 +120,9 @@ if(exposed_temperature >= FIRE_MINIMUM_TEMPERATURE_TO_EXIST) qdel(our_sticker) // which qdels us + +/datum/component/sticker/proc/on_examine(atom/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + if(!isnull(examine_text)) + examine_list += span_warning(examine_text) diff --git a/code/datums/components/style/style.dm b/code/datums/components/style/style.dm index 9bc420cc175c0..cc8b061fd353e 100644 --- a/code/datums/components/style/style.dm +++ b/code/datums/components/style/style.dm @@ -98,8 +98,7 @@ RegisterSignal(parent, COMSIG_USER_ITEM_INTERACTION, PROC_REF(hotswap)) RegisterSignal(parent, COMSIG_MOB_MINED, PROC_REF(on_mine)) RegisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_take_damage)) - RegisterSignal(parent, COMSIG_MOB_EMOTED("flip"), PROC_REF(on_flip)) - RegisterSignal(parent, COMSIG_MOB_EMOTED("spin"), PROC_REF(on_spin)) + RegisterSignal(parent, COMSIG_MOB_EMOTED("taunt"), PROC_REF(on_taunt)) RegisterSignal(parent, COMSIG_MOB_ITEM_ATTACK, PROC_REF(on_attack)) RegisterSignal(parent, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_punch)) RegisterSignal(SSdcs, COMSIG_GLOB_MOB_DEATH, PROC_REF(on_death)) @@ -114,7 +113,7 @@ UnregisterSignal(parent, COMSIG_USER_ITEM_INTERACTION) UnregisterSignal(parent, COMSIG_MOB_MINED) UnregisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE) - UnregisterSignal(parent, list(COMSIG_MOB_EMOTED("flip"), COMSIG_MOB_EMOTED("spin"))) + UnregisterSignal(parent, COMSIG_MOB_EMOTED("taunt")) UnregisterSignal(parent, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_LIVING_UNARMED_ATTACK)) UnregisterSignal(SSdcs, COMSIG_GLOB_MOB_DEATH) UnregisterSignal(parent, COMSIG_LIVING_RESONATOR_BURST) @@ -407,19 +406,12 @@ // Emote-based multipliers -/datum/component/style/proc/on_flip() +/datum/component/style/proc/on_taunt() SIGNAL_HANDLER point_multiplier = round(min(point_multiplier + 0.5, 3), 0.1) update_screen() -/datum/component/style/proc/on_spin() - SIGNAL_HANDLER - - point_multiplier = round(min(point_multiplier + 0.3, 3), 0.1) - update_screen() - - // Negative effects /datum/component/style/proc/on_take_damage(...) SIGNAL_HANDLER diff --git a/code/datums/components/subtype_picker.dm b/code/datums/components/subtype_picker.dm index 78401c9e02293..2cc76e42ecf1f 100644 --- a/code/datums/components/subtype_picker.dm +++ b/code/datums/components/subtype_picker.dm @@ -87,6 +87,6 @@ return FALSE if(QDELETED(target)) return FALSE - if(user.incapacitated() || !user.is_holding(target)) + if(user.incapacitated || !user.is_holding(target)) return FALSE return TRUE diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index 8e902ced2fdbf..0c23733ea1658 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -74,10 +74,7 @@ if(modifiers[ALT_CLICK] || modifiers[SHIFT_CLICK] || modifiers[CTRL_CLICK] || modifiers[MIDDLE_CLICK]) return - if(!modifiers[RIGHT_CLICK]) - return - - if(!user.throw_mode || user.get_active_held_item() || user.pulling || user.buckled || user.incapacitated()) + if(!user.throw_mode || user.get_active_held_item() || user.pulling || user.buckled || user.incapacitated) return if(!clicked_atom || !(isturf(clicked_atom) || isturf(clicked_atom.loc))) diff --git a/code/datums/components/tactical.dm b/code/datums/components/tactical.dm index 59df008b2b100..17309b888eac3 100644 --- a/code/datums/components/tactical.dm +++ b/code/datums/components/tactical.dm @@ -42,6 +42,9 @@ RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(unmodify)) RegisterSignal(parent, COMSIG_ATOM_UPDATED_ICON, PROC_REF(on_icon_update)) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + RegisterSignal(user, COMSIG_HUMAN_GET_VISIBLE_NAME, PROC_REF(on_name_inquiry)) + RegisterSignal(user, COMSIG_HUMAN_GET_FORCED_NAME, PROC_REF(on_name_inquiry)) + ADD_TRAIT(user, TRAIT_UNKNOWN, REF(src)) current_slot = slot @@ -62,6 +65,24 @@ image.plane = FLOAT_PLANE user.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "sneaking_mission[REF(src)]", image) + +/datum/component/tactical/proc/on_name_inquiry(obj/item/source, list/identity) + SIGNAL_HANDLER + + var/tactical_disguise_power = INFINITY // it's a flawless plan: they'll never look behind this unassuming potted plant + if(identity[VISIBLE_NAME_FORCED]) + if(identity[VISIBLE_NAME_FORCED] >= tactical_disguise_power) // my disguise is too powerful for you, traveler! but seriously this is bad + stack_trace("A name forcing signal ([identity[VISIBLE_NAME_FACE]]) has a priority collision with [src].") + else + identity[VISIBLE_NAME_FORCED] = tactical_disguise_power + else + identity[VISIBLE_NAME_FORCED] = tactical_disguise_power + + var/obj/item/flawless_disguise = parent + identity[VISIBLE_NAME_FACE] = flawless_disguise.name + identity[VISIBLE_NAME_ID] = flawless_disguise.name // for Unknown (as 'potted plant') says + + /datum/component/tactical/proc/unmodify(obj/item/source, mob/user) SIGNAL_HANDLER if(!source) @@ -77,8 +98,14 @@ COMSIG_MOVABLE_MOVED, COMSIG_ATOM_UPDATED_ICON, )) + + UnregisterSignal(user, list( + COMSIG_HUMAN_GET_VISIBLE_NAME, + COMSIG_HUMAN_GET_FORCED_NAME, + )) current_slot = null user.remove_alt_appearance("sneaking_mission[REF(src)]") + REMOVE_TRAIT(user, TRAIT_UNKNOWN, REF(src)) ///Checks if a mob is holding us, and if so we will modify our appearance to properly match w/ the mob. /datum/component/tactical/proc/tactical_update(obj/item/source) diff --git a/code/datums/components/unobserved_actor.dm b/code/datums/components/unobserved_actor.dm index 7956c9034772a..007d39a0ae845 100644 --- a/code/datums/components/unobserved_actor.dm +++ b/code/datums/components/unobserved_actor.dm @@ -6,16 +6,19 @@ /datum/component/unobserved_actor /// Dictates what behaviour you're blocked from while observed var/unobserved_flags = NONE + /// List of action types which cannot be used while observed. Applies to all actions if not set, and does nothing if NO_OBSERVED_ACTIONS flag isnt present + var/list/affected_actions = null /// Cooldown to prevent message spam when holding a move button COOLDOWN_DECLARE(message_cooldown) -/datum/component/unobserved_actor/Initialize(unobserved_flags = NONE) +/datum/component/unobserved_actor/Initialize(unobserved_flags = NONE, list/affected_actions = null) . = ..() if (!isliving(parent)) return ELEMENT_INCOMPATIBLE if (unobserved_flags == NONE) CRASH("No behaviour flags provided to unobserved actor element") src.unobserved_flags = unobserved_flags + src.affected_actions = affected_actions /datum/component/unobserved_actor/RegisterWithParent() if (unobserved_flags & NO_OBSERVED_MOVEMENT) @@ -52,17 +55,21 @@ return COMPONENT_ATOM_BLOCK_DIR_CHANGE /// Called when the mob tries to use an ability -/datum/component/unobserved_actor/proc/on_tried_ability(mob/living/source) +/datum/component/unobserved_actor/proc/on_tried_ability(mob/living/source, datum/action) SIGNAL_HANDLER if (!check_if_seen(source)) return + if (!isnull(affected_actions) && !(action.type in affected_actions)) + return return COMPONENT_BLOCK_ABILITY_START /// Called when the mob tries to cast a spell -/datum/component/unobserved_actor/proc/on_tried_spell(mob/living/source) +/datum/component/unobserved_actor/proc/on_tried_spell(mob/living/source, datum/action) SIGNAL_HANDLER if (!check_if_seen(source)) return + if (!isnull(affected_actions) && !(action.type in affected_actions)) + return return SPELL_CANCEL_CAST /// Called when the mob tries to attack @@ -92,7 +99,7 @@ // We aren't in darkness, loop for viewers. for(var/mob/living/mob_target in oview(my_turf, 7)) // They probably cannot see us if we cannot see them... can they? - if(mob_target.client && !mob_target.is_blind() && !mob_target.has_unlimited_silicon_privilege && !HAS_TRAIT(mob_target, TRAIT_UNOBSERVANT)) + if(mob_target.client && !mob_target.is_blind() && !HAS_TRAIT(mob_target, TRAIT_UNOBSERVANT)) return TRUE for(var/obj/vehicle/sealed/mecha/mecha_mob_target in oview(my_turf, 7)) for(var/mob/mechamob_target as anything in mecha_mob_target.occupants) diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index a5ff46964bf6f..d64022d22b872 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -227,9 +227,12 @@ for(var/datum/uplink_item/item as anything in uplink_handler.extra_purchasable) if(item.stock_key in stock_list) extra_purchasable_stock[REF(item)] = stock_list[item.stock_key] + var/atom/actual_item = item.item extra_purchasable += list(list( "id" = item.type, "name" = item.name, + "icon" = actual_item.icon, + "icon_state" = actual_item.icon_state, "cost" = item.cost, "desc" = item.desc, "category" = item.category ? initial(item.category.name) : null, @@ -288,6 +291,13 @@ return item = SStraitor.uplink_items_by_type[item_path] uplink_handler.purchase_item(ui.user, item, parent) + if("buy_raw_tc") + if (uplink_handler.telecrystals <= 0) + return + var/desired_amount = tgui_input_number(ui.user, "How many raw telecrystals to buy?", "Buy Raw TC", default = uplink_handler.telecrystals, max_value = uplink_handler.telecrystals) + if(!desired_amount || desired_amount < 1) + return + uplink_handler.purchase_raw_tc(ui.user, desired_amount, parent) if("lock") if(!lockable) return TRUE diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 59a1d54571d3c..a4169004fc982 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -111,9 +111,6 @@ tag = null datum_flags &= ~DF_USE_TAG //In case something tries to REF us weak_reference = null //ensure prompt GCing of weakref. - if(!(datum_flags & DF_STATIC_OBJECT)) - DREAMLUAU_CLEAR_REF_USERDATA(vars) // vars ceases existing when src does, so we need to clear any lua refs to it that exist. - DREAMLUAU_CLEAR_REF_USERDATA(src) if(_active_timers) var/list/timers = _active_timers @@ -145,6 +142,10 @@ _clear_signal_refs() //END: ECS SHIT + if(!(datum_flags & DF_STATIC_OBJECT)) + DREAMLUAU_CLEAR_REF_USERDATA(vars) // vars ceases existing when src does, so we need to clear any lua refs to it that exist. + DREAMLUAU_CLEAR_REF_USERDATA(src) + return QDEL_HINT_QUEUE ///Only override this if you know what you're doing. You do not know what you're doing @@ -343,7 +344,7 @@ . = ..() update_item_action_buttons() -/** Update a filter's parameter to the new one. If the filter doesnt exist we won't do anything. +/** Update a filter's parameter to the new one. If the filter doesn't exist we won't do anything. * * Arguments: * * name - Filter name @@ -361,7 +362,7 @@ filter_data[name][thing] = new_params[thing] update_filters() -/** Update a filter's parameter and animate this change. If the filter doesnt exist we won't do anything. +/** Update a filter's parameter and animate this change. If the filter doesn't exist we won't do anything. * Basically a [datum/proc/modify_filter] call but with animations. Unmodified filter parameters are kept. * * Arguments: diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index aeea8b22cbaab..944532324af10 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -23,8 +23,8 @@ /** * Gets all the dropdown options in the vv menu. - * When overriding, make sure to call . = ..() first and appent to the result, that way parent items are always at the top and child items are further down. - * Add seperators by doing VV_DROPDOWN_OPTION("", "---") + * When overriding, make sure to call . = ..() first and append to the result, that way parent items are always at the top and child items are further down. + * Add separators by doing VV_DROPDOWN_OPTION("", "---") */ /datum/proc/vv_get_dropdown() SHOULD_CALL_PARENT(TRUE) @@ -44,7 +44,7 @@ /** * This proc is only called if everything topic-wise is verified. The only verifications that should happen here is things like permission checks! * href_list is a reference, modifying it in these procs WILL change the rest of the proc in topic.dm of admin/view_variables! - * This proc is for "high level" actions like admin heal/set species/etc/etc. The low level debugging things should go in admin/view_variables/topic_basic.dm incase this runtimes. + * This proc is for "high level" actions like admin heal/set species/etc/etc. The low level debugging things should go in admin/view_variables/topic_basic.dm in case this runtimes. */ /datum/proc/vv_do_topic(list/href_list) if(!usr || !usr.client || !usr.client.holder || !check_rights(NONE)) diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 9560820f2f048..154027b8b9ae6 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -146,6 +146,8 @@ cycles_to_beat = max(DISEASE_RECOVERY_SCALING, DISEASE_CYCLES_HARMFUL) if(DISEASE_SEVERITY_BIOHAZARD) cycles_to_beat = max(DISEASE_RECOVERY_SCALING, DISEASE_CYCLES_BIOHAZARD) + else + cycles_to_beat = max(DISEASE_RECOVERY_SCALING, DISEASE_CYCLES_NONTHREAT) peaked_cycles += stage/max_stages //every cycle we spend sick counts towards eventually curing the virus, faster at higher stages recovery_prob += DISEASE_RECOVERY_CONSTANT + (peaked_cycles / (cycles_to_beat / DISEASE_RECOVERY_SCALING)) //more severe viruses are beaten back more aggressively after the peak if(stage_peaked) diff --git a/code/datums/diseases/adrenal_crisis.dm b/code/datums/diseases/adrenal_crisis.dm index cd9a2dd318010..aa9587c2e1ab9 100644 --- a/code/datums/diseases/adrenal_crisis.dm +++ b/code/datums/diseases/adrenal_crisis.dm @@ -8,7 +8,7 @@ agent = "Shitty Adrenal Glands" viable_mobtypes = list(/mob/living/carbon/human) spreading_modifier = 1 - desc = "If left untreated the subject will suffer from lethargy, dizziness and periodic loss of conciousness." + desc = "If left untreated the subject will suffer from lethargy, dizziness and periodic loss of consciousness." severity = DISEASE_SEVERITY_MEDIUM spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS spread_text = "Organ failure" diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 8c8e8e02169b4..82099a7532b52 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -265,7 +265,7 @@ properties["severity"] += round((properties["transmittable"] / 8), 1) properties["severity"] = round((properties["severity"] / 2), 1) properties["severity"] *= (symptoms.len / VIRUS_SYMPTOM_LIMIT) //fewer symptoms, less severity - properties["severity"] = clamp(properties["severity"], 1, 7) + properties["severity"] = round(clamp(properties["severity"], 1, 7), 1) properties["capacity"] = get_symptom_weights() // Assign the properties that are in the list. diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm index 47044068f242e..6ae9fe42b6e3a 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -74,7 +74,7 @@ Asphyxiation Very very noticable. Decreases stage speed. - Decreases transmittablity. + Decreases transmittability. Bonus Inflicts large spikes of oxyloss diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm index 3ec095feb5c7f..3fe097920cc4b 100644 --- a/code/datums/diseases/advance/symptoms/fire.dm +++ b/code/datums/diseases/advance/symptoms/fire.dm @@ -2,7 +2,7 @@ * Slightly hidden. * Lowers resistance tremendously. * Decreases stage speed tremendously. - * Decreases transmittablity tremendously. + * Decreases transmittability tremendously. * Fatal level * Bonus: Ignites infected mob. */ diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm index 90070aa15fb9f..005a651b7f338 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -70,7 +70,7 @@ Autophagocytosis (AKA Programmed mass cell death) Very noticable. Lowers resistance. Fast stage speed. - Decreases transmittablity. + Decreases transmittability. Fatal Level. Bonus diff --git a/code/datums/diseases/chronic_illness.dm b/code/datums/diseases/chronic_illness.dm index 37778a158ad79..b1afd1d1939a9 100644 --- a/code/datums/diseases/chronic_illness.dm +++ b/code/datums/diseases/chronic_illness.dm @@ -1,7 +1,7 @@ /datum/disease/chronic_illness name = "Hereditary Manifold Sickness" max_stages = 5 - spread_text = "Unspread Illness" + spread_text = "Non-communicable disease" spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS disease_flags = CHRONIC infectable_biotypes = MOB_ORGANIC | MOB_MINERAL | MOB_ROBOTIC diff --git a/code/datums/dna.dm b/code/datums/dna.dm index df92d57c59b4c..f16cf5bc50cf0 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -63,7 +63,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) var/list/features = list("mcolor" = COLOR_WHITE) ///Stores the hashed values of the person's non-human features var/unique_features - ///Stores the real name of the person who originally got this dna datum. Used primarely for changelings, + ///Stores the real name of the person who originally got this dna datum. Used primarily for changelings, var/real_name ///All mutations are from now on here var/list/mutations = list() @@ -77,7 +77,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) ///List of the default genes from this mutation to allow DNA Scanner highlighting var/default_mutation_genes[DNA_MUTATION_BLOCKS] var/stability = 100 - ///Did we take something like mutagen? In that case we cant get our genes scanned to instantly cheese all the powers. + ///Did we take something like mutagen? In that case we can't get our genes scanned to instantly cheese all the powers. var/scrambled = FALSE /// Weighted list of nonlethal meltdowns var/static/list/nonfatal_meltdowns = list() @@ -682,8 +682,8 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if(dna.features["pod_hair"]) dna.features["pod_hair"] = SSaccessories.pod_hair_list[deconstruct_block(get_uni_feature_block(features, DNA_POD_HAIR_BLOCK), length(SSaccessories.pod_hair_list))] - for(var/obj/item/organ/external/external_organ in organs) - external_organ.mutate_feature(features, src) + for(var/obj/item/organ/organ in organs) + organ.mutate_feature(features, src) if(icon_update) update_body(is_creating = mutcolor_update) @@ -743,7 +743,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if(istype(mutation, /datum/mutation/human)) var/datum/mutation/human/M = mutation mutation_type = M.type - if(!mutation_in_sequence(mutation_type)) //cant activate what we dont have, use add_mutation + if(!mutation_in_sequence(mutation_type)) //can't activate what we don't have, use add_mutation return FALSE add_mutation(mutation, MUT_NORMAL) return TRUE diff --git a/code/datums/ductnet.dm b/code/datums/ductnet.dm index e97add695d9a3..5cc241cce2b5b 100644 --- a/code/datums/ductnet.dm +++ b/code/datums/ductnet.dm @@ -35,7 +35,7 @@ demanders += P return TRUE -///remove a plumber. we dont delete ourselves because ductnets dont persist through plumbing objects +///remove a plumber. we don't delete ourselves because ductnets don't persist through plumbing objects /datum/ductnet/proc/remove_plumber(datum/component/plumbing/P) suppliers.Remove(P) //we're probably only in one of these, but Remove() is inherently sane so this is fine demanders.Remove(P) @@ -62,7 +62,7 @@ var/obj/machinery/duct/M = A M.duct = src //forget your old master - D.ducts.Cut() //clear this so the other network doesnt clear the ducts along with themselves (this took the life out of me) + D.ducts.Cut() //clear this so the other network doesn't clear the ducts along with themselves (this took the life out of me) D.destroy_network() ///destroy the network and tell all our ducts and plumbers we are gone @@ -72,5 +72,5 @@ for(var/A in ducts) var/obj/machinery/duct/D = A D.duct = null - if(delete) //I don't want code to run with qdeleted objects because that can never be good, so keep this in-case the ductnet has some business left to attend to before commiting suicide + if(delete) //I don't want code to run with qdeleted objects because that can never be good, so keep this in-case the ductnet has some business left to attend to before committing suicide qdel(src) diff --git a/code/datums/elements/bane.dm b/code/datums/elements/bane.dm index 95e21251657d7..110a755de23b0 100644 --- a/code/datums/elements/bane.dm +++ b/code/datums/elements/bane.dm @@ -1,6 +1,6 @@ /// Deals extra damage to mobs of a certain type, species, or biotype. -/// This doesn't directly modify the normal damage of the weapon, instead it applies its own damage seperatedly ON TOP of normal damage -/// ie. a sword that does 10 damage with a bane elment attacthed that has a 0.5 damage_multiplier will do: +/// This doesn't directly modify the normal damage of the weapon, instead it applies its own damage separately ON TOP of normal damage +/// ie. a sword that does 10 damage with a bane element attached that has a 0.5 damage_multiplier will do: /// 10 damage from the swords normal attack + 5 damage (50%) from the bane element /datum/element/bane element_flags = ELEMENT_BESPOKE diff --git a/code/datums/elements/block_turf_fingerprints.dm b/code/datums/elements/block_turf_fingerprints.dm new file mode 100644 index 0000000000000..f3b7ab9cf19f1 --- /dev/null +++ b/code/datums/elements/block_turf_fingerprints.dm @@ -0,0 +1,56 @@ +/** + * ## block_turf_fingerprints + * + * Attach to a movable, prevents mobs from leaving fingerprints on the turf below it + */ +/datum/element/block_turf_fingerprints + element_flags = ELEMENT_DETACH_ON_HOST_DESTROY + +/datum/element/block_turf_fingerprints/Attach(datum/target) + . = ..() + if(!ismovable(target)) + return ELEMENT_INCOMPATIBLE + + var/atom/movable/target_movable = target + if(isturf(target_movable.loc)) + apply_to_turf(target_movable.loc) + + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(move_turf)) + +/datum/element/block_turf_fingerprints/Detach(atom/movable/target) + . = ..() + if(isturf(target.loc)) + remove_from_turf(target.loc) + + UnregisterSignal(target, COMSIG_MOVABLE_MOVED) + +/datum/element/block_turf_fingerprints/proc/apply_to_turf(turf/the_turf) + // It's possible two things with this element could be on the same turf, so let's avoid double-applying + if(the_turf.interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND) + // But what if the turf has this flag by default? We still need to override register a signal. + // Otherwise we may run into a very niche bug: + // - A turf as this flag by default + // - A movable with this element is placed on the turf + // - It does not gain the flag nor register a signal + // - The turf changes, and the new turf does not gain the flag + if(initial(the_turf.interaction_flags_atom) & INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND) + RegisterSignal(the_turf, COMSIG_TURF_CHANGE, PROC_REF(replace_our_turf), override = TRUE) + return + + the_turf.interaction_flags_atom |= INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND + RegisterSignal(the_turf, COMSIG_TURF_CHANGE, PROC_REF(replace_our_turf)) + +/datum/element/block_turf_fingerprints/proc/remove_from_turf(turf/the_turf) + the_turf.interaction_flags_atom &= ~INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND + UnregisterSignal(the_turf, COMSIG_TURF_CHANGE) + +/datum/element/block_turf_fingerprints/proc/move_turf(atom/movable/source, atom/old_loc) + SIGNAL_HANDLER + if(isturf(old_loc)) + remove_from_turf(old_loc) + if(isturf(source.loc)) + apply_to_turf(source.loc) + +/datum/element/block_turf_fingerprints/proc/replace_our_turf(datum/source, path, new_baseturfs, flags, post_change_callbacks) + SIGNAL_HANDLER + post_change_callbacks += CALLBACK(src, PROC_REF(apply_to_turf)) diff --git a/code/datums/elements/elevation.dm b/code/datums/elements/elevation.dm index b83548c6b5f41..959fa14f79837 100644 --- a/code/datums/elements/elevation.dm +++ b/code/datums/elements/elevation.dm @@ -151,8 +151,8 @@ /datum/element/elevation_core/proc/on_initialized_on(turf/source, atom/movable/spawned) SIGNAL_HANDLER - if(isliving(spawned)) - elevate_mob(spawned) + if(isliving(spawned) && !HAS_TRAIT(spawned, TRAIT_ON_ELEVATED_SURFACE)) + on_entered(entered = spawned) /datum/element/elevation_core/proc/on_exited(turf/source, atom/movable/gone) SIGNAL_HANDLER diff --git a/code/datums/elements/fish_safe_storage.dm b/code/datums/elements/fish_safe_storage.dm new file mode 100644 index 0000000000000..bb7864ced0e6a --- /dev/null +++ b/code/datums/elements/fish_safe_storage.dm @@ -0,0 +1,53 @@ +///An element that puts in stasis any fish that enters the atom. +/datum/element/fish_safe_storage + element_flags = ELEMENT_DETACH_ON_HOST_DESTROY + var/list/tracked_fish = list() + +/datum/element/fish_safe_storage/New() + . = ..() + START_PROCESSING(SSprocessing, src) + +/datum/element/fish_safe_storage/Attach(atom/target) + . = ..() + if(!isatom(target)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_ATOM_ENTERED, PROC_REF(on_enter)) + RegisterSignal(target, COMSIG_ATOM_EXITED, PROC_REF(on_exit)) + RegisterSignal(target, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(on_init_on)) + for(var/obj/item/fish/fish in target) + tracked_fish |= fish + fish.enter_stasis() + +/datum/element/fish_safe_storage/Detach(atom/source) + for(var/obj/item/fish/fish in source) + tracked_fish -= fish + fish.exit_stasis() + UnregisterSignal(source, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_EXITED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON)) + return ..() + +/datum/element/fish_safe_storage/proc/on_enter(datum/source, obj/item/fish/arrived) + SIGNAL_HANDLER + if(isfish(arrived)) + tracked_fish |= arrived + arrived.enter_stasis() + +/datum/element/fish_safe_storage/proc/on_init_on(datum/source, obj/item/fish/created) + SIGNAL_HANDLER + if(isfish(created) && !QDELETED(created)) + tracked_fish |= created + created.enter_stasis() + +/datum/element/fish_safe_storage/proc/on_exit(datum/source, obj/item/fish/gone) + SIGNAL_HANDLER + if(isfish(gone)) + tracked_fish -= gone + gone.exit_stasis() + +/datum/element/fish_safe_storage/process(seconds_per_tick) + for(var/obj/item/fish/fish as anything in tracked_fish) + ///Keep delaying hunger and breeding while in stasis, and also heal them. + fish.last_feeding += seconds_per_tick SECONDS + fish.breeding_wait += seconds_per_tick SECONDS + if(fish.health < initial(fish.health) * 0.65) + fish.adjust_health(fish.health + 0.75 * seconds_per_tick) diff --git a/code/datums/elements/food/grilled_item.dm b/code/datums/elements/food/grilled_item.dm index de6c2ef41c1b9..74e772eb73c92 100644 --- a/code/datums/elements/food/grilled_item.dm +++ b/code/datums/elements/food/grilled_item.dm @@ -28,6 +28,8 @@ if(grill_time > 30 SECONDS && isnull(this_food.GetComponent(/datum/component/edible))) this_food.AddComponent(/datum/component/edible, foodtypes = FRIED) + SEND_SIGNAL(this_food, COMSIG_ITEM_BARBEQUE_GRILLED) + /datum/element/grilled_item/Detach(atom/source, ...) source.name = initial(source.name) source.desc = initial(source.desc) diff --git a/code/datums/elements/food/microwavable.dm b/code/datums/elements/food/microwavable.dm index 8e7305545c0b0..5fdd4c084add1 100644 --- a/code/datums/elements/food/microwavable.dm +++ b/code/datums/elements/food/microwavable.dm @@ -44,6 +44,7 @@ var/efficiency = istype(used_microwave) ? used_microwave.efficiency : 1 SEND_SIGNAL(result, COMSIG_ITEM_MICROWAVE_COOKED, source, efficiency) + SEND_SIGNAL(source, COMSIG_ITEM_MICROWAVE_COOKED_FROM, result, efficiency) if(IS_EDIBLE(result) && (result_typepath != default_typepath)) BLACKBOX_LOG_FOOD_MADE(result.type) diff --git a/code/datums/elements/leeching_walk.dm b/code/datums/elements/leeching_walk.dm index c0afc52b24583..c9f547189e699 100644 --- a/code/datums/elements/leeching_walk.dm +++ b/code/datums/elements/leeching_walk.dm @@ -55,3 +55,5 @@ // Heals blood loss if(source.blood_volume < BLOOD_VOLUME_NORMAL) source.blood_volume += 2.5 * seconds_per_tick + // Slowly regulates your body temp + source.adjust_bodytemperature((source.get_body_temp_normal() - source.bodytemperature)/5) diff --git a/code/datums/elements/pet_collar.dm b/code/datums/elements/pet_collar.dm new file mode 100644 index 0000000000000..5c49de2eceb5b --- /dev/null +++ b/code/datums/elements/pet_collar.dm @@ -0,0 +1,95 @@ +/datum/element/wears_collar + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + ///our icon's pathfile + var/collar_icon + ///our collar's icon state + var/collar_icon_state + ///iconstate of our collar while resting + var/collar_resting_icon_state + +/datum/element/wears_collar/Attach(datum/target, collar_icon = 'icons/mob/simple/pets.dmi', collar_resting_icon_state = FALSE, collar_icon_state) + . = ..() + + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + + src.collar_icon = collar_icon + src.collar_icon_state = collar_icon_state + src.collar_resting_icon_state = collar_resting_icon_state + + RegisterSignal(target, COMSIG_ATOM_ATTACKBY, PROC_REF(attach_collar)) + RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_overlays_updated)) + RegisterSignal(target, COMSIG_ATOM_EXITED, PROC_REF(on_content_exit)) + RegisterSignal(target, COMSIG_ATOM_ENTERED, PROC_REF(on_content_enter)) + RegisterSignal(target, COMSIG_LIVING_RESTING, PROC_REF(on_rest)) + RegisterSignal(target, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_change)) + +/datum/element/wears_collar/Detach(datum/target) + . = ..() + UnregisterSignal(target, list( + COMSIG_ATOM_ATTACKBY, + COMSIG_ATOM_UPDATE_OVERLAYS, + COMSIG_ATOM_EXITED, + COMSIG_ATOM_ENTERED, + COMSIG_LIVING_RESTING, + COMSIG_MOB_STATCHANGE, + )) + +/datum/element/wears_collar/proc/on_stat_change(mob/living/source) + SIGNAL_HANDLER + + if(collar_icon_state) + source.update_icon(UPDATE_OVERLAYS) + +/datum/element/wears_collar/proc/on_content_exit(mob/living/source, atom/moved) + SIGNAL_HANDLER + + if(!istype(moved, /obj/item/clothing/neck/petcollar)) + return + source.fully_replace_character_name(null, source::name) + if(collar_icon_state) + source.update_appearance() + +/datum/element/wears_collar/proc/on_content_enter(mob/living/source, obj/item/clothing/neck/petcollar/new_collar) + SIGNAL_HANDLER + + if(!istype(new_collar)) + return + + source.fully_replace_character_name(null, "\proper [new_collar.tagname]") + if(collar_icon_state) + source.update_appearance() + +/datum/element/wears_collar/proc/attach_collar(atom/source, atom/movable/attacking_item, atom/user, params) + SIGNAL_HANDLER + + if(!istype(attacking_item, /obj/item/clothing/neck/petcollar)) + return NONE + if(locate(/obj/item/clothing/neck/petcollar) in source) + user.balloon_alert(source, "already wearing a collar!") + return NONE + attacking_item.forceMove(source) + return COMPONENT_NO_AFTERATTACK + +/datum/element/wears_collar/proc/on_overlays_updated(mob/living/source, list/overlays) + SIGNAL_HANDLER + + if(!locate(/obj/item/clothing/neck/petcollar) in source) + return + + var/icon_tag = "" + + if(source.stat == DEAD || HAS_TRAIT(source, TRAIT_FAKEDEATH)) + icon_tag = "_dead" + else if(collar_resting_icon_state && source.resting) + icon_tag = "_rest" + + overlays += mutable_appearance(collar_icon, "[collar_icon_state][icon_tag]collar") + overlays += mutable_appearance(collar_icon, "[collar_icon_state][icon_tag]tag") + + +/datum/element/wears_collar/proc/on_rest(atom/movable/source) + SIGNAL_HANDLER + + source.update_icon(UPDATE_OVERLAYS) diff --git a/code/datums/elements/pet_cult.dm b/code/datums/elements/pet_cult.dm new file mode 100644 index 0000000000000..36941e7b74299 --- /dev/null +++ b/code/datums/elements/pet_cult.dm @@ -0,0 +1,127 @@ +#define PET_CULT_ATTACK_UPPER 15 +#define PET_CULT_HEALTH 50 + +/datum/element/cultist_pet + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + ///our pet cult icon's pathfile + var/pet_cult_icon + ///our pet cult icon state + var/pet_cult_icon_state + +/datum/element/cultist_pet/Attach(datum/target, pet_cult_icon = 'icons/mob/simple/pets.dmi', pet_cult_icon_state) + . = ..() + + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + + src.pet_cult_icon = pet_cult_icon + src.pet_cult_icon_state = pet_cult_icon_state + + RegisterSignal(target, COMSIG_LIVING_CULT_SACRIFICED, PROC_REF(become_cultist)) + RegisterSignal(target, COMSIG_MOB_CLIENT_LOGIN, PROC_REF(on_login)) + RegisterSignal(target, COMSIG_ATOM_UPDATE_ICON_STATE, PROC_REF(on_icon_state_updated)) + RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_overlays_updated)) + +/datum/element/cultist_pet/Detach(datum/target) + . = ..() + UnregisterSignal(target, list( + COMSIG_MOB_LOGIN, + COMSIG_LIVING_CULT_SACRIFICED, + COMSIG_ATOM_UPDATE_ICON_STATE, + COMSIG_ATOM_UPDATE_OVERLAYS, + )) + +/datum/element/cultist_pet/proc/on_overlays_updated(mob/living/basic/source, list/overlays) + SIGNAL_HANDLER + + if(isnull(source.mind) && (FACTION_CULT in source.faction)) //cult indicator we show for non sentient pets + var/image/cult_indicator = image(icon = 'icons/mob/simple/pets.dmi', icon_state = "pet_cult_indicator", layer = ABOVE_GAME_PLANE) + overlays += cult_indicator + +/datum/element/cultist_pet/proc/on_icon_state_updated(mob/living/basic/source) + SIGNAL_HANDLER + + if(pet_cult_icon_state && (FACTION_CULT in source.faction)) + source.icon_state = pet_cult_icon_state + source.icon_living = pet_cult_icon_state + +///turn into terrifying beasts +/datum/element/cultist_pet/proc/become_cultist(mob/living/basic/source, list/invokers, datum/team) + SIGNAL_HANDLER + + if(source.stat == DEAD) + return + + if(FACTION_CULT in source.faction) + return STOP_SACRIFICE + + source.mind?.add_antag_datum(/datum/antagonist/cult, team) + qdel(source.GetComponent(/datum/component/obeys_commands)) //if we obey commands previously, forget about them + source.melee_damage_lower = max(PET_CULT_ATTACK_UPPER - 5, source::melee_damage_lower) + source.melee_damage_upper = max(PET_CULT_ATTACK_UPPER, source::melee_damage_upper) + source.maxHealth = max(PET_CULT_HEALTH, source::maxHealth) + source.fully_heal() + + source.faction = list(FACTION_CULT) //we only serve the cult + + if(isnull(pet_cult_icon_state)) + source.add_atom_colour(RUNE_COLOR_MEDIUMRED, FIXED_COLOUR_PRIORITY) + + var/static/list/cult_appetite = list( + /obj/item/organ, + /obj/effect/decal/cleanable/blood, + ) + + var/static/list/death_loot = list( + /obj/effect/gibspawner/generic, + /obj/item/soulstone, + ) + + source.AddElement(/datum/element/basic_eating, heal_amt = 15, food_types = cult_appetite) + source.AddElement(/datum/element/death_drops, death_loot) + + source.basic_mob_flags &= DEL_ON_DEATH + qdel(source.ai_controller) + source.ai_controller = new /datum/ai_controller/basic_controller/pet_cult(source) + var/datum/action/cooldown/spell/conjure/revive_rune/rune_ability = new(source) + rune_ability.Grant(source) + source.ai_controller.set_blackboard_key(BB_RUNE_ABILITY, rune_ability) + source.ai_controller.set_blackboard_key(BB_CULT_TEAM, team) + + var/static/list/new_pet_commands = list( + /datum/pet_command/point_targeting/attack, + /datum/pet_command/follow, + /datum/pet_command/free, + /datum/pet_command/idle, + /datum/pet_command/untargeted_ability/draw_rune, + ) + source.AddComponent(/datum/component/obeys_commands, new_pet_commands) + RegisterSignal(source, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(activate_rune)) + source.update_appearance() + return STOP_SACRIFICE + + +/datum/element/cultist_pet/proc/activate_rune(datum/source, atom/target) + SIGNAL_HANDLER + + if(!istype(target, /obj/effect/rune/raise_dead)) //we can only revive people... + return NONE + + INVOKE_ASYNC(target, TYPE_PROC_REF(/atom, attack_hand), source) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/datum/element/cultist_pet/proc/on_login(mob/living/source) + SIGNAL_HANDLER + + if(!(FACTION_CULT in source.faction)) + return + var/datum/team/cult_team = source.ai_controller.blackboard[BB_CULT_TEAM] + if(isnull(cult_team)) + return + source.mind.add_antag_datum(/datum/antagonist/cult, cult_team) + source.update_appearance(UPDATE_OVERLAYS) + + +#undef PET_CULT_ATTACK_UPPER +#undef PET_CULT_HEALTH diff --git a/code/datums/elements/quality_food_ingredient.dm b/code/datums/elements/quality_food_ingredient.dm new file mode 100644 index 0000000000000..e9bfec246c52c --- /dev/null +++ b/code/datums/elements/quality_food_ingredient.dm @@ -0,0 +1,71 @@ +///An element that adds extra food quality to any edible that was made from an atom with this attached. +/datum/element/quality_food_ingredient + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + ///The increase of recipe complexity (basically hardcoded food quality) of edibles made with this. + var/complexity_increase = 0 + +/datum/element/quality_food_ingredient/Attach(datum/target, complexity_increase) + . = ..() + if(!isatom(target)) + return ELEMENT_INCOMPATIBLE + if(HAS_TRAIT_FROM(target, TRAIT_QUALITY_FOOD_INGREDIENT, REF(src))) //It already has this element attached. + return + + src.complexity_increase = complexity_increase + + RegisterSignal(target, COMSIG_ATOM_USED_IN_CRAFT, PROC_REF(used_in_craft)) + RegisterSignal(target, COMSIG_ITEM_BAKED, PROC_REF(item_baked)) + RegisterSignal(target, COMSIG_ITEM_MICROWAVE_COOKED_FROM, PROC_REF(microwaved_from)) + RegisterSignal(target, COMSIG_ITEM_GRILLED, PROC_REF(item_grilled)) + RegisterSignals(target, list(COMSIG_ITEM_BARBEQUE_GRILLED, COMSIG_ITEM_FRIED), PROC_REF(simply_cooked)) + RegisterSignal(target, COMSIG_ITEM_USED_AS_INGREDIENT, PROC_REF(used_as_ingredient)) + +/datum/element/quality_food_ingredient/Detach(datum/source) + UnregisterSignal(source, list( + COMSIG_ATOM_USED_IN_CRAFT, + COMSIG_ITEM_BAKED, + COMSIG_ITEM_MICROWAVE_COOKED_FROM, + COMSIG_ITEM_GRILLED, + COMSIG_ITEM_BARBEQUE_GRILLED, + COMSIG_ITEM_FRIED, + COMSIG_ITEM_USED_AS_INGREDIENT, + COMSIG_FOOD_GET_EXTRA_COMPLEXITY, + )) + REMOVE_TRAIT(source, TRAIT_QUALITY_FOOD_INGREDIENT, REF(src)) + return ..() + +/datum/element/quality_food_ingredient/proc/used_in_craft(datum/source, atom/result) + SIGNAL_HANDLER + add_quality(result) + +/datum/element/quality_food_ingredient/proc/item_baked(datum/source, atom/baked_result) + SIGNAL_HANDLER + add_quality(baked_result) + +/datum/element/quality_food_ingredient/proc/microwaved_from(datum/source, atom/result) + SIGNAL_HANDLER + add_quality(result) + +/datum/element/quality_food_ingredient/proc/item_grilled(datum/source, atom/grill_result) + SIGNAL_HANDLER + add_quality(grill_result) + +/datum/element/quality_food_ingredient/proc/simply_cooked(datum/source) + SIGNAL_HANDLER + //The target of the food quality and the source are the same, there's no need to re-add the whole element. + RegisterSignal(source, COMSIG_FOOD_GET_EXTRA_COMPLEXITY, PROC_REF(add_complexity), TRUE) + ADD_TRAIT(source, TRAIT_QUALITY_FOOD_INGREDIENT, REF(src)) + +/datum/element/quality_food_ingredient/proc/used_as_ingredient(datum/source, atom/container) + SIGNAL_HANDLER + add_quality(container) + +/datum/element/quality_food_ingredient/proc/add_quality(atom/target) + target.AddElement(/datum/element/quality_food_ingredient, complexity_increase) + RegisterSignal(target, COMSIG_FOOD_GET_EXTRA_COMPLEXITY, PROC_REF(add_complexity), TRUE) + ADD_TRAIT(target, TRAIT_QUALITY_FOOD_INGREDIENT, REF(src)) + +/datum/element/quality_food_ingredient/proc/add_complexity(datum/source, list/extra_complexity) + SIGNAL_HANDLER + extra_complexity[1] += complexity_increase diff --git a/code/datums/elements/undertile.dm b/code/datums/elements/undertile.dm index ed901b196c1aa..229b292b31ae9 100644 --- a/code/datums/elements/undertile.dm +++ b/code/datums/elements/undertile.dm @@ -43,8 +43,13 @@ var/turf/T = get_turf(source) if(underfloor_accessibility < UNDERFLOOR_INTERACTABLE) - SET_PLANE_IMPLICIT(source, FLOOR_PLANE) // We do this so that turfs that allow you to see what's underneath them don't have to be on the game plane (which causes ambient occlusion weirdness) - source.layer = ABOVE_OPEN_TURF_LAYER + // We only want to change the layer/plane for things that aren't already on the floor plane, + // as overriding the settings for those would cause layering issues + if(PLANE_TO_TRUE(source.plane) != FLOOR_PLANE) + // We do this so that turfs that allow you to see what's underneath them don't have to be on the game plane (which causes ambient occlusion weirdness) + SET_PLANE_IMPLICIT(source, FLOOR_PLANE) + source.layer = ABOVE_OPEN_TURF_LAYER + ADD_TRAIT(source, TRAIT_UNDERFLOOR, REF(src)) if(tile_overlay) @@ -77,6 +82,8 @@ if(use_anchor) source.set_anchored(FALSE) + SEND_SIGNAL(source, COMSIG_UNDERTILE_UPDATED) + /datum/element/undertile/Detach(atom/movable/source, visibility_trait, invisibility_level = INVISIBILITY_MAXIMUM) . = ..() diff --git a/code/datums/elements/waddling.dm b/code/datums/elements/waddling.dm index e63d0329bb630..45c7fe5e93773 100644 --- a/code/datums/elements/waddling.dm +++ b/code/datums/elements/waddling.dm @@ -18,7 +18,7 @@ return if(isliving(moved)) var/mob/living/living_moved = moved - if (living_moved.incapacitated() || living_moved.body_position == LYING_DOWN) + if (living_moved.incapacitated || living_moved.body_position == LYING_DOWN) return waddling_animation(moved) diff --git a/code/datums/elements/wheel.dm b/code/datums/elements/wheel.dm index 2bb8977ca5cae..a50addb15a382 100644 --- a/code/datums/elements/wheel.dm +++ b/code/datums/elements/wheel.dm @@ -17,7 +17,7 @@ return if(isliving(moved)) var/mob/living/living_moved = moved - if (living_moved.incapacitated() || living_moved.body_position == LYING_DOWN) + if (living_moved.incapacitated || living_moved.body_position == LYING_DOWN) return var/rotation_degree = (360 / 3) if(direction & SOUTHWEST) diff --git a/code/datums/ert.dm b/code/datums/ert.dm index 7e358b38cecb4..58500bb3cc33c 100644 --- a/code/datums/ert.dm +++ b/code/datums/ert.dm @@ -1,5 +1,4 @@ /datum/ert - var/mobtype = /mob/living/carbon/human var/team = /datum/team/ert var/opendoors = TRUE var/leader_role = /datum/antagonist/ert/commander @@ -20,6 +19,8 @@ var/datum/map_template/ert_template /// If we should actually _use_ the ert_template custom shuttle var/use_custom_shuttle = TRUE + /// Used for spawning bodies for your ERT. Unless customized in the Summon-ERT verb settings, will be overridden and should not be defined at the datum level. + var/mob/living/carbon/human/mob_type /datum/ert/New() if (!polldesc) diff --git a/code/datums/greyscale/README.md b/code/datums/greyscale/README.md index 9ff6bbca1d189..0d8106ebec687 100644 --- a/code/datums/greyscale/README.md +++ b/code/datums/greyscale/README.md @@ -4,7 +4,7 @@ If you're wanting to add easy recolors for your sprite then this is the system f - Multiple color layers so your sprite can be generated from more than one color. - Mixed greyscale and colored sprite layers; You can choose to only greyscale a part of the sprite or have premade filters applied to layers. -- Blend modes; Instead of just putting layers of sprites on top of eachother you can use the more advanced blend modes. +- Blend modes; Instead of just putting layers of sprites on top of each other you can use the more advanced blend modes. - Reusable configurations; You can reference greyscale sprites from within the configuration of another, allowing you to have a bunch of styles with minimal additional configuration. ## Other Documents @@ -31,7 +31,7 @@ This is simply some pointers in the code linking together your dmi and the json ## Json Configuration File -The json is made up of some metadata and a list of layers used while creating the sprite. Inner lists are processed as their own chunk before being applied elsewhere, this is useful when you start using more advanced blend modes. Most of the time though you're just going to want a list of icons overlaid on top of eachother. +The json is made up of some metadata and a list of layers used while creating the sprite. Inner lists are processed as their own chunk before being applied elsewhere, this is useful when you start using more advanced blend modes. Most of the time though you're just going to want a list of icons overlaid on top of each other. ```json { diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm index 377a2fa16938e..bdc2a7d2928c5 100644 --- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm @@ -276,6 +276,11 @@ icon_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' json_config = 'code/datums/greyscale/json_configs/jumpsuit_prison_inhand.json' +/datum/greyscale_config/jumpsuit/worn_digi + name = "Jumpsuit Worn (Digitigrate)" + icon_file = 'icons/mob/clothing/under/digi_template.dmi' + json_config = 'code/datums/greyscale/json_configs/jumpsuit_worn_digilegs.json' + /datum/greyscale_config/eth_tunic name = "Ethereal Tunic" icon_file = 'icons/obj/clothing/under/ethereal.dmi' diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_effects.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_effects.dm index 34db9013a893d..91cfb618c210f 100644 --- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_effects.dm +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_effects.dm @@ -2,3 +2,8 @@ name = "Transmutation Rune" icon_file = 'icons/effects/96x96.dmi' json_config = 'code/datums/greyscale/json_configs/heretic_rune.json' + +/datum/greyscale_config/manipulator_hand + name = "Manipulator Hand" + icon_file = 'icons/obj/machines/big_manipulator_parts/big_manipulator_hand.dmi' + json_config = 'code/datums/greyscale/json_configs/manipulator_hand.json' diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_objects.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_objects.dm index 7202c41ecc540..9556612be189c 100644 --- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_objects.dm +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_objects.dm @@ -3,6 +3,11 @@ icon_file = 'icons/obj/doors/airlocks/material/material.dmi' json_config = 'code/datums/greyscale/json_configs/material_airlock.json' +/datum/greyscale_config/big_manipulator + name = "Big Manipulator" + icon_file = 'icons/obj/machines/big_manipulator_parts/big_manipulator_core.dmi' + json_config = 'code/datums/greyscale/json_configs/big_manipulator.json' + // // BENCHES // diff --git a/code/datums/greyscale/json_configs/big_manipulator.json b/code/datums/greyscale/json_configs/big_manipulator.json new file mode 100644 index 0000000000000..c7f96bac2abaa --- /dev/null +++ b/code/datums/greyscale/json_configs/big_manipulator.json @@ -0,0 +1,15 @@ +{ + "core": [ + { + "type": "icon_state", + "icon_state": "core", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "core_colour", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/jumpsuit_worn_digilegs.json b/code/datums/greyscale/json_configs/jumpsuit_worn_digilegs.json new file mode 100644 index 0000000000000..9aa201cece3c1 --- /dev/null +++ b/code/datums/greyscale/json_configs/jumpsuit_worn_digilegs.json @@ -0,0 +1,10 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "jumpsuit", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/manipulator_hand.json b/code/datums/greyscale/json_configs/manipulator_hand.json new file mode 100644 index 0000000000000..be7c96df62b64 --- /dev/null +++ b/code/datums/greyscale/json_configs/manipulator_hand.json @@ -0,0 +1,15 @@ +{ + "hand": [ + { + "type": "icon_state", + "icon_state": "hand", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "hand_colour", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/layer.dm b/code/datums/greyscale/layer.dm index 06a001c1ad835..f12fb1992c9db 100644 --- a/code/datums/greyscale/layer.dm +++ b/code/datums/greyscale/layer.dm @@ -64,7 +64,7 @@ /datum/greyscale_layer/proc/CrossVerify() return -/// Used to actualy create the layer using the given colors +/// Used to actually create the layer using the given colors /// Do not override, use InternalGenerate instead /datum/greyscale_layer/proc/Generate(list/colors, list/render_steps, icon/new_icon) var/list/processed_colors = list() diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index c69a279938dd1..fead0417db9b2 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -179,7 +179,7 @@ if(QDELETED(src)) return FALSE - . = !QDELETED(user) && !user.incapacitated() && !QDELETED(calling_holopad) && calling_holopad.is_operational && user.loc == calling_holopad.loc + . = !QDELETED(user) && !user.incapacitated && !QDELETED(calling_holopad) && calling_holopad.is_operational && user.loc == calling_holopad.loc if(.) if(!connected_holopad) diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 10a623b394e8b..fbe99dd8095ac 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -39,11 +39,11 @@ GLOBAL_LIST_INIT(trait_to_hud, list( // by z level so when they change z's we can adjust what images they see from this hud. var/list/hud_users = list() - ///used for signal tracking purposes, associative list of the form: list(hud atom = TRUE) that isnt separated by z level + ///used for signal tracking purposes, associative list of the form: list(hud atom = TRUE) that isn't separated by z level var/list/atom/hud_atoms_all_z_levels = list() ///used for signal tracking purposes, associative list of the form: list(hud user = number of times this hud was added to this user). - ///that isnt separated by z level + ///that isn't separated by z level var/list/mob/hud_users_all_z_levels = list() ///these will be the indexes for the atom's hud_list @@ -53,10 +53,10 @@ GLOBAL_LIST_INIT(trait_to_hud, list( var/list/next_time_allowed = list() ///mobs that have triggered the cooldown and are queued to see the hud, but do not yet var/list/queued_to_see = list() - /// huduser = list(atoms with their hud hidden) - aka everyone hates targeted invisiblity + /// huduser = list(atoms with their hud hidden) - aka everyone hates targeted invisibility var/list/hud_exceptions = list() ///whether or not this atom_hud type updates the global huds_by_category list. - ///some subtypes cant work like this since theyre supposed to "belong" to + ///some subtypes can't work like this since they're supposed to "belong" to ///one target atom each. it will still go in the other global hud lists. var/uses_global_hud_category = TRUE @@ -175,9 +175,9 @@ GLOBAL_LIST_INIT(trait_to_hud, list( hud_users_all_z_levels[former_viewer] -= 1//decrement number of sources for this hud on this user (bad way to track i know) - if (absolute || hud_users_all_z_levels[former_viewer] <= 0)//if forced or there arent any sources left, remove the user + if (absolute || hud_users_all_z_levels[former_viewer] <= 0)//if forced or there aren't any sources left, remove the user - if(!hud_atoms_all_z_levels[former_viewer])//make sure we arent unregistering changes on a mob thats also a hud atom for this hud + if(!hud_atoms_all_z_levels[former_viewer])//make sure we aren't unregistering changes on a mob that's also a hud atom for this hud UnregisterSignal(former_viewer, COMSIG_MOVABLE_Z_CHANGED) UnregisterSignal(former_viewer, COMSIG_QDELETING) @@ -222,7 +222,7 @@ GLOBAL_LIST_INIT(trait_to_hud, list( if(!hud_atom_to_remove || !hud_atoms_all_z_levels[hud_atom_to_remove]) return FALSE - //make sure we arent unregistering a hud atom thats also a hud user mob + //make sure we aren't unregistering a hud atom that's also a hud user mob if(!hud_users_all_z_levels[hud_atom_to_remove]) UnregisterSignal(hud_atom_to_remove, COMSIG_MOVABLE_Z_CHANGED) UnregisterSignal(hud_atom_to_remove, COMSIG_QDELETING) @@ -278,12 +278,12 @@ GLOBAL_LIST_INIT(trait_to_hud, list( for(var/mob/hud_user as anything in get_hud_users_for_z_level(atom_turf.z)) if(!hud_user.client) continue - hud_user.client.images -= hud_atom.active_hud_list[hud_category_to_remove]//by this point it shouldnt be in active_hud_list + hud_user.client.images -= hud_atom.active_hud_list[hud_category_to_remove]//by this point it shouldn't be in active_hud_list return TRUE -///when a hud atom or hud user changes z levels this makes sure it gets the images it needs and removes the images it doesnt need. -///because of how signals work we need the same proc to handle both use cases because being a hud atom and being a hud user arent mutually exclusive +///when a hud atom or hud user changes z levels this makes sure it gets the images it needs and removes the images it doesn't need. +///because of how signals work we need the same proc to handle both use cases because being a hud atom and being a hud user aren't mutually exclusive /datum/atom_hud/proc/on_atom_or_user_z_level_changed(atom/movable/moved_atom, turf/old_turf, turf/new_turf) SIGNAL_HANDLER if(old_turf) @@ -300,7 +300,7 @@ GLOBAL_LIST_INIT(trait_to_hud, list( if(new_turf) if(hud_users_all_z_levels[moved_atom]) - hud_users[new_turf.z][moved_atom] = TRUE //hud users is associative, hud atoms isnt + hud_users[new_turf.z][moved_atom] = TRUE //hud users is associative, hud atoms isn't add_all_atoms_to_single_mob_hud(moved_atom, get_hud_atoms_for_z_level(new_turf.z)) diff --git a/code/datums/id_trim/_id_trim.dm b/code/datums/id_trim/_id_trim.dm index 067e2e3826390..562232214b3d1 100644 --- a/code/datums/id_trim/_id_trim.dm +++ b/code/datums/id_trim/_id_trim.dm @@ -24,6 +24,11 @@ /// Accesses that this trim unlocks on a card that require wildcard slots to apply. If a card cannot accept all a trim's wildcard accesses, the card is incompatible with the trim. var/list/wildcard_access = list() + ///If true, IDs with this trim will grant wearers with bigger arrows when pointing + var/big_pointer = FALSE + ///If set, IDs with this trim will give wearers arrows of different colors when pointing + var/pointer_color + /// Returns the SecHUD job icon state for whatever this object's ID card is, if it has one. /obj/item/proc/get_sechud_job_icon_state() var/obj/item/card/id/id_card = GetID() diff --git a/code/datums/id_trim/admin.dm b/code/datums/id_trim/admin.dm index 9de155c9a0468..ee0cf1b977e0a 100644 --- a/code/datums/id_trim/admin.dm +++ b/code/datums/id_trim/admin.dm @@ -5,6 +5,8 @@ department_color = COLOR_CENTCOM_BLUE subdepartment_color = COLOR_SERVICE_LIME threat_modifier = -INFINITY + big_pointer = TRUE + pointer_color = COLOR_GREEN /datum/id_trim/admin/New() . = ..() diff --git a/code/datums/id_trim/centcom.dm b/code/datums/id_trim/centcom.dm index 5cc24f4bd6e19..498a4de254e3b 100644 --- a/code/datums/id_trim/centcom.dm +++ b/code/datums/id_trim/centcom.dm @@ -7,6 +7,8 @@ department_color = COLOR_CENTCOM_BLUE subdepartment_color = COLOR_CENTCOM_BLUE threat_modifier = -10 // Centcom are legally allowed to do whatever they want + big_pointer = TRUE + pointer_color = COLOR_CENTCOM_BLUE /// Trim for Centcom VIPs /datum/id_trim/centcom/vip @@ -20,6 +22,7 @@ trim_state = "trim_janitor" department_color = COLOR_CENTCOM_BLUE subdepartment_color = COLOR_SERVICE_LIME + big_pointer = FALSE /// Trim for Centcom Thunderdome Overseers. /datum/id_trim/centcom/thunderdome_overseer @@ -35,10 +38,12 @@ /datum/id_trim/centcom/intern access = list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_WEAPONS) assignment = "CentCom Intern" + big_pointer = FALSE /// Trim for Centcom Head Interns. Different assignment, common station access added on. /datum/id_trim/centcom/intern/head assignment = "CentCom Head Intern" + big_pointer = TRUE /datum/id_trim/centcom/intern/head/New() . = ..() @@ -49,11 +54,13 @@ /datum/id_trim/centcom/bounty_hunter access = list(ACCESS_CENT_GENERAL) assignment = "Bounty Hunter" + big_pointer = FALSE /// Trim for Centcom Bartenders. /datum/id_trim/centcom/bartender access = list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_BAR) assignment = JOB_CENTCOM_BARTENDER + big_pointer = FALSE /// Trim for Centcom Medical Officers. /datum/id_trim/centcom/medical_officer @@ -68,6 +75,7 @@ /// Trim for Centcom Specops Officers. All Centcom and Station Access. /datum/id_trim/centcom/specops_officer assignment = JOB_CENTCOM_SPECIAL_OFFICER + big_pointer = FALSE /datum/id_trim/centcom/specops_officer/New() . = ..() @@ -129,6 +137,7 @@ trim_state = "trim_securityofficer" subdepartment_color = COLOR_SECURITY_RED sechud_icon_state = SECHUD_SECURITY_RESPONSE_OFFICER + big_pointer = FALSE /datum/id_trim/centcom/ert/security/New() . = ..() @@ -141,6 +150,7 @@ trim_state = "trim_stationengineer" subdepartment_color = COLOR_ENGINEERING_ORANGE sechud_icon_state = SECHUD_ENGINEERING_RESPONSE_OFFICER + big_pointer = FALSE /datum/id_trim/centcom/ert/engineer/New() . = ..() @@ -153,6 +163,7 @@ trim_state = "trim_medicaldoctor" subdepartment_color = COLOR_MEDICAL_BLUE sechud_icon_state = SECHUD_MEDICAL_RESPONSE_OFFICER + big_pointer = FALSE /datum/id_trim/centcom/ert/medical/New() . = ..() @@ -165,6 +176,7 @@ trim_state = "trim_chaplain" subdepartment_color = COLOR_SERVICE_LIME sechud_icon_state = SECHUD_RELIGIOUS_RESPONSE_OFFICER + big_pointer = FALSE /datum/id_trim/centcom/ert/chaplain/New() . = ..() @@ -177,6 +189,7 @@ trim_state = "trim_ert_janitor" subdepartment_color = COLOR_SERVICE_LIME sechud_icon_state = SECHUD_JANITORIAL_RESPONSE_OFFICER + big_pointer = FALSE /datum/id_trim/centcom/ert/janitor/New() . = ..() @@ -189,6 +202,7 @@ trim_state = "trim_clown" subdepartment_color = COLOR_MAGENTA sechud_icon_state = SECHUD_ENTERTAINMENT_RESPONSE_OFFICER + big_pointer = FALSE /datum/id_trim/centcom/ert/clown/New() . = ..() @@ -197,6 +211,8 @@ /datum/id_trim/centcom/ert/militia assignment = "Frontier Militia" + big_pointer = FALSE /datum/id_trim/centcom/ert/militia/general assignment = "Frontier Militia General" + big_pointer = TRUE diff --git a/code/datums/id_trim/jobs.dm b/code/datums/id_trim/jobs.dm index 190c4a38a299c..a42018406b2a5 100644 --- a/code/datums/id_trim/jobs.dm +++ b/code/datums/id_trim/jobs.dm @@ -238,6 +238,8 @@ ACCESS_CHANGE_IDS, ) job = /datum/job/captain + big_pointer = TRUE + pointer_color = COLOR_COMMAND_BLUE /// Captain gets all station accesses hardcoded in because it's the Captain. /datum/id_trim/job/captain/New() @@ -360,6 +362,8 @@ ACCESS_CHANGE_IDS, ) job = /datum/job/chief_engineer + big_pointer = TRUE + pointer_color = COLOR_ENGINEERING_ORANGE /datum/id_trim/job/chief_medical_officer assignment = JOB_CHIEF_MEDICAL_OFFICER @@ -399,6 +403,8 @@ ACCESS_CHANGE_IDS, ) job = /datum/job/chief_medical_officer + big_pointer = TRUE + pointer_color = COLOR_MEDICAL_BLUE /datum/id_trim/job/clown assignment = JOB_CLOWN @@ -612,6 +618,8 @@ ACCESS_CHANGE_IDS, ) job = /datum/job/head_of_personnel + big_pointer = TRUE + pointer_color = COLOR_SERVICE_LIME /datum/id_trim/job/head_of_security assignment = JOB_HEAD_OF_SECURITY @@ -661,6 +669,8 @@ ACCESS_CHANGE_IDS, ) job = /datum/job/head_of_security + big_pointer = TRUE + pointer_color = COLOR_SECURITY_RED /datum/id_trim/job/head_of_security/refresh_trim_access() . = ..() @@ -893,6 +903,8 @@ ACCESS_CHANGE_IDS, ) job = /datum/job/quartermaster + big_pointer = TRUE + pointer_color = COLOR_CARGO_BROWN /datum/id_trim/job/research_director assignment = JOB_RESEARCH_DIRECTOR @@ -941,6 +953,8 @@ ACCESS_CHANGE_IDS, ) job = /datum/job/research_director + big_pointer = TRUE + pointer_color = COLOR_SCIENCE_PINK /datum/id_trim/job/roboticist assignment = JOB_ROBOTICIST @@ -957,13 +971,13 @@ ACCESS_ROBOTICS, ACCESS_SCIENCE, ACCESS_TECH_STORAGE, + ACCESS_ORDNANCE, + ACCESS_ORDNANCE_STORAGE, ) extra_access = list( ACCESS_GENETICS, ACCESS_XENOBIOLOGY, ACCESS_MORGUE_SECURE, - ACCESS_ORDNANCE, - ACCESS_ORDNANCE_STORAGE, ) template_access = list( ACCESS_CAPTAIN, @@ -1206,6 +1220,7 @@ extra_access = list() template_access = list() job = /datum/job/veteran_advisor + big_pointer = TRUE /datum/id_trim/job/veteran_advisor/refresh_trim_access() . = ..() @@ -1275,3 +1290,5 @@ extra_access = list() template_access = list() job = /datum/job/human_ai + big_pointer = TRUE + pointer_color = COLOR_MODERATE_BLUE diff --git a/code/datums/id_trim/ruins.dm b/code/datums/id_trim/ruins.dm index e308287ec5c5d..1eccc77a985b5 100644 --- a/code/datums/id_trim/ruins.dm +++ b/code/datums/id_trim/ruins.dm @@ -72,6 +72,7 @@ /datum/id_trim/centcom/corpse/commander assignment = "Commander" access = list(ACCESS_CENT_CAPTAIN, ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_MEDICAL, ACCESS_CENT_STORAGE) + big_pointer = TRUE /// Trim for various Centcom corpses. /datum/id_trim/centcom/corpse/private_security @@ -115,6 +116,7 @@ /datum/id_trim/pirate/captain assignment = "Pirate Captain" trim_state = "trim_captain" + big_pointer = TRUE /datum/id_trim/pirate/silverscale assignment = "Silver Scale Member" @@ -130,6 +132,7 @@ /datum/id_trim/away/dangerous_research/head_occultist assignment = "Head Occultist" access = list(ACCESS_AWAY_SCIENCE, ACCESS_AWAY_COMMAND) + big_pointer = TRUE //Trims for waystation.dmm space ruin /datum/id_trim/away/waystation/cargo_technician @@ -143,6 +146,7 @@ trim_state = "trim_quartermaster" department_color = COLOR_CARGO_BROWN access = list(ACCESS_AWAY_SUPPLY, ACCESS_AWAY_COMMAND) + big_pointer = TRUE /datum/id_trim/away/waystation/security assignment = "Waystation Security Officer" @@ -162,8 +166,9 @@ /datum/id_trim/away/the_outlet/mad_manager assignment = "The Mad Manager" access = list(ACCESS_AWAY_GENERAL, ACCESS_AWAY_MEDICAL, ACCESS_AWAY_SEC) + big_pointer = TRUE -//Haunted Trading Post IDs // +//Haunted Trading Post IDs /datum/id_trim/away/hauntedtradingpost assignment = "Donk Co. Employee" department_color = COLOR_ENGINEERING_ORANGE @@ -174,4 +179,4 @@ /datum/id_trim/away/hauntedtradingpost/boss assignment = "Donk Co. Executive" access = list(ACCESS_SYNDICATE, ACCESS_AWAY_COMMAND) -// // + big_pointer = TRUE diff --git a/code/datums/id_trim/syndicate.dm b/code/datums/id_trim/syndicate.dm index 9a3e0c5fc9173..41c76aaf3784c 100644 --- a/code/datums/id_trim/syndicate.dm +++ b/code/datums/id_trim/syndicate.dm @@ -7,11 +7,14 @@ sechud_icon_state = SECHUD_SYNDICATE access = list(ACCESS_SYNDICATE) threat_modifier = 5 // Bad guy on deck + big_pointer = TRUE + pointer_color = COLOR_SYNDIE_RED /// Trim for Syndicate mobs, outfits and corpses. /datum/id_trim/syndicom/crew assignment = "Syndicate Operative" access = list(ACCESS_SYNDICATE, ACCESS_ROBOTICS) + big_pointer = FALSE /// Interdyne medical Staff /datum/id_trim/syndicom/Interdyne/pharmacist @@ -19,6 +22,8 @@ trim_state = "trim_medicaldoctor" sechud_icon_state = SECHUD_SYNDICATE_INTERDYNE access = list(ACCESS_SYNDICATE, ACCESS_ROBOTICS, ACCESS_SURGERY) + big_pointer = FALSE + pointer_color = null /// Interdyne head medical Staff /datum/id_trim/syndicom/Interdyne/pharmacist_director @@ -28,6 +33,8 @@ subdepartment_color = COLOR_SYNDIE_RED_HEAD sechud_icon_state = SECHUD_SYNDICATE_INTERDYNE_HEAD access = list(ACCESS_SYNDICATE, ACCESS_ROBOTICS, ACCESS_SURGERY) + big_pointer = TRUE + pointer_color = COLOR_SYNDIE_RED_HEAD /// Trim for the space IRS agents (why are they syndie access? I wouldn't worry about it.) /datum/id_trim/syndicom/irs @@ -37,11 +44,14 @@ subdepartment_color = COLOR_COMMAND_BLUE sechud_icon_state = SECHUD_DEATH_COMMANDO access = list(ACCESS_SYNDICATE, ACCESS_MAINT_TUNNELS) + big_pointer = FALSE + pointer_color = null /datum/id_trim/syndicom/irs/auditor assignment = "Internal Revenue Service Head Auditor" trim_state = "trim_quartermaster" sechud_icon_state = SECHUD_QUARTERMASTER + big_pointer = TRUE /// Trim for Syndicate mobs, outfits and corpses. /datum/id_trim/syndicom/captain @@ -60,6 +70,8 @@ /datum/id_trim/battlecruiser/captain assignment = "Syndicate Battlecruiser Captain" access = list(ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER) + big_pointer = TRUE + pointer_color = COLOR_SYNDIE_RED /// Trim for Chameleon ID cards. Many outfits, nuke ops and some corpses hold Chameleon ID cards. /datum/id_trim/chameleon @@ -79,6 +91,8 @@ /datum/id_trim/chameleon/operative/nuke_leader assignment = "Syndicate Operative Leader" access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER) + big_pointer = TRUE + pointer_color = COLOR_SYNDIE_RED /// Trim for Chameleon ID cards. Many outfits, nuke ops and some corpses hold Chameleon ID cards. /datum/id_trim/chameleon/operative/clown @@ -89,3 +103,5 @@ /datum/id_trim/chameleon/operative/clown_leader assignment = "Syndicate Entertainment Operative Leader" access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER) + big_pointer = TRUE + pointer_color = COLOR_SYNDIE_RED diff --git a/code/datums/json_database.dm b/code/datums/json_database.dm index ea3ff354b48ce..6baeb44ab091b 100644 --- a/code/datums/json_database.dm +++ b/code/datums/json_database.dm @@ -61,6 +61,16 @@ /datum/json_database/proc/get_key(key) return cached_data[key] +/// Picks the data of a random key and then removes that key from the database. +/// Since the list is no longer inside the database, you can mutate and use it as you like. +/datum/json_database/proc/pick_and_take_key() + if(!length(cached_data)) + return null + var/key = pick(cached_data) + . = cached_data[key] + cached_data -= key + queue_save() + /// Sets the data at the key to the value, and queues a save. /datum/json_database/proc/set_key(key, value) cached_data[key] = value diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm index 54185efdb8dda..122eab2861e99 100644 --- a/code/datums/looping_sounds/_looping_sound.dm +++ b/code/datums/looping_sounds/_looping_sound.dm @@ -2,7 +2,7 @@ * A datum for sounds that need to loop, with a high amount of configurability. */ /datum/looping_sound - /// (list or soundfile) Since this can be either a list or a single soundfile you can have random sounds. May contain further lists but must contain a soundfile at the end. + /// (list or soundfile) Since this can be either a list or a single soundfile you can have random sounds. May contain further lists but must contain a soundfile at the end. In a list, path must have also be assigned a value or it will be assigned 0 and not play. var/mid_sounds /// The length of time to wait between playing mid_sounds. var/mid_length diff --git a/code/datums/looping_sounds/breathing.dm b/code/datums/looping_sounds/breathing.dm index 82b33ee8311b1..73474149ae4bb 100644 --- a/code/datums/looping_sounds/breathing.dm +++ b/code/datums/looping_sounds/breathing.dm @@ -1,8 +1,19 @@ /datum/looping_sound/breathing - mid_sounds = 'sound/voice/breathing.ogg' + mid_sounds = list( + 'sound/voice/breathing/internals_breathing1.ogg' = 1, + 'sound/voice/breathing/internals_breathing2.ogg' = 1, + 'sound/voice/breathing/internals_breathing3.ogg' = 1, + 'sound/voice/breathing/internals_breathing4.ogg' = 1, + 'sound/voice/breathing/internals_breathing5.ogg' = 1, + 'sound/voice/breathing/internals_breathing6.ogg' = 1, + 'sound/voice/breathing/internals_breathing7.ogg' = 1, + 'sound/voice/breathing/internals_breathing8.ogg' = 1, + ) //Calculated this by using the average breathing time of an adult (12 to 20 per minute, which on average is 16 per minute) - mid_length = 3.75 SECONDS - mid_length_vary = 0.2 SECONDS + // realism is overrated, make it longer to reduce ear fatigue + mid_length = 7 SECONDS + mid_length_vary = 0.7 SECONDS //spess station- - volume = 13 + volume = 7 pressure_affected = FALSE + vary = TRUE diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm index 2d5e3564e6d09..bc32b03125660 100644 --- a/code/datums/looping_sounds/machinery_sounds.dm +++ b/code/datums/looping_sounds/machinery_sounds.dm @@ -116,7 +116,7 @@ start_sound = 'sound/machines/computer/computer_start.ogg' start_length = 7.2 SECONDS start_volume = 10 - mid_sounds = list('sound/machines/computer/computer_mid1.ogg', 'sound/machines/computer/computer_mid2.ogg') + mid_sounds = list('sound/machines/computer/computer_mid1.ogg' = 1, 'sound/machines/computer/computer_mid2.ogg' = 1) mid_length = 1.8 SECONDS end_sound = 'sound/machines/computer/computer_end.ogg' end_volume = 10 @@ -126,10 +126,17 @@ falloff_distance = 1 //Instant falloff after initial tile /datum/looping_sound/gravgen - mid_sounds = list('sound/machines/gravgen/gravgen_mid1.ogg' = 1, 'sound/machines/gravgen/gravgen_mid2.ogg' = 1, 'sound/machines/gravgen/gravgen_mid3.ogg' = 1, 'sound/machines/gravgen/gravgen_mid4.ogg' = 1) - mid_length = 1.8 SECONDS - extra_range = 10 - volume = 20 + start_sound = 'sound/machines/gravgen/grav_gen_start.ogg' + start_length = 1 SECONDS + mid_sounds = list( + 'sound/machines/gravgen/grav_gen_mid1.ogg' = 12, + 'sound/machines/gravgen/grav_gen_mid2.ogg' = 1, + ) + mid_length = 1.1 SECONDS + end_sound = 'sound/machines/gravgen/grav_gen_end.ogg' + extra_range = 8 + vary = TRUE + volume = 70 falloff_distance = 5 falloff_exponent = 20 diff --git a/code/datums/martial/_martial.dm b/code/datums/martial/_martial.dm index e5dc7860b0b2a..8475c9e43f9f0 100644 --- a/code/datums/martial/_martial.dm +++ b/code/datums/martial/_martial.dm @@ -211,7 +211,7 @@ * Resets the current streak. * * Arguments - * * mob/living/new_target - (Optional) The mob being attacked while the reset is occuring. + * * mob/living/new_target - (Optional) The mob being attacked while the reset is occurring. * * update_icon - If TRUE, the combo display will be updated. */ /datum/martial_art/proc/reset_streak(mob/living/new_target, update_icon = TRUE) diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index 5c24aaf45b7b2..9d6252855d3e1 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -7,8 +7,10 @@ name = "Boxing" id = MARTIALART_BOXING pacifist_style = TRUE - ///Boolean on whether we are sportsmanlike in our tussling; TRUE means we have restrictions + /// Boolean on whether we are sportsmanlike in our tussling; TRUE means we have restrictions var/honorable_boxer = TRUE + /// Default damage type for our boxing. + var/default_damage_type = STAMINA /// List of traits applied to users of this martial art. var/list/boxing_traits = list(TRAIT_BOXING_READY) /// Balloon alert cooldown for warning our boxer to alternate their blows to get more damage @@ -40,10 +42,16 @@ if(findtext(streak, LEFT_RIGHT_COMBO) || findtext(streak, RIGHT_LEFT_COMBO)) reset_streak() + // If we have an extra effect from the combo, perform it here. By default, we have no extra effect. + perform_extra_effect(attacker, defender) return combo_multiplier * 1.5 return combo_multiplier +/// An extra effect on some moves and attacks. +/datum/martial_art/boxing/proc/perform_extra_effect(mob/living/attacker, mob/living/defender) + return + /datum/martial_art/boxing/disarm_act(mob/living/attacker, mob/living/defender) if(honor_check(defender)) add_to_streak("D", defender) @@ -88,8 +96,8 @@ // If true, grants experience for punching; we only gain experience if we punch another boxer. var/grant_experience = FALSE - // What type of damage does our kind of boxing do? Defaults to STAMINA, unless you're performing EVIL BOXING - var/damage_type = honorable_boxer ? STAMINA : attacker.get_attack_type() + // What type of damage does our kind of boxing do? Defaults to STAMINA for normal boxing, unless you're performing EVIL BOXING. Subtypes use different damage types. + var/damage_type = honorable_boxer ? default_damage_type : attacker.get_attack_type() attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) @@ -147,12 +155,12 @@ log_combat(attacker, defender, "punched (boxing) ") + if(defender.stat == DEAD || !honor_check(defender)) //early returning here so we don't worry about knockout probs or experience gain + return TRUE + if(grant_experience) skill_experience_adjustment(attacker, (damage/lower_force)) - if(defender.stat == DEAD || !honor_check(defender)) //early returning here so we don't worry about knockout probs - return TRUE - //Determine our attackers athletics level as a knockout probability bonus var/attacker_athletics_skill = (attacker.mind?.get_skill_modifier(/datum/skill/athletics, SKILL_RANDS_MODIFIER) + base_unarmed_effectiveness) @@ -165,6 +173,18 @@ if(!prob(final_knockout_probability)) return TRUE + crit_effect(attacker, defender, armor_block, damage_type, damage) + + experience_earned *= 2 //Double our experience gain on a crit hit + + playsound(defender, 'sound/effects/coin2.ogg', 40, TRUE) + new /obj/effect/temp_visual/crit(get_turf(defender)) + skill_experience_adjustment(attacker, experience_earned) //double experience for a successful crit + + return TRUE + +/// Our crit effect. For normal boxing, this applies a stagger, then applies a knockout if they're staggered. Other types of boxing apply different kinds of effects. +/datum/martial_art/boxing/proc/crit_effect(mob/living/attacker, mob/living/defender, armor_block = 0, damage_type = STAMINA, damage = 0) if(defender.get_timed_status_effect_duration(/datum/status_effect/staggered)) defender.visible_message( span_danger("[attacker] knocks [defender] out with a haymaker!"), @@ -189,14 +209,6 @@ to_chat(attacker, span_danger("You stagger [defender] with a haymaker!")) log_combat(attacker, defender, "staggered (boxing) ") - experience_earned *= 2 //Double our experience gain on a crit hit - - playsound(defender, 'sound/effects/coin2.ogg', 40, TRUE) - new /obj/effect/temp_visual/crit(get_turf(defender)) - skill_experience_adjustment(attacker, experience_earned) //double experience for a successful crit - - return TRUE - /// Returns whether whoever is checked by this proc is complying with the rules of boxing. The boxer cannot block non-boxers, and cannot apply their scariest moves against non-boxers. /datum/martial_art/boxing/proc/honor_check(mob/living/possible_boxer) if(!honorable_boxer) @@ -220,7 +232,7 @@ /datum/martial_art/boxing/proc/check_block(mob/living/boxer, atom/movable/hitby, damage, attack_text, attack_type, ...) SIGNAL_HANDLER - if(!can_use(boxer) || !boxer.throw_mode || boxer.incapacitated(IGNORE_GRAB)) + if(!can_use(boxer) || !boxer.throw_mode || INCAPACITATED_IGNORING(boxer, INCAPABLE_GRAB)) return NONE if(attack_type != UNARMED_ATTACK) @@ -254,8 +266,9 @@ return NONE if(istype(attacker) && boxer.Adjacent(attacker)) - attacker.apply_damage(10, STAMINA) + attacker.apply_damage(10, default_damage_type) boxer.apply_damage(5, STAMINA) + perform_extra_effect(boxer, attacker) boxer.visible_message( span_danger("[boxer] [block_text]s [attack_text]!"), @@ -271,6 +284,8 @@ return FALSE return ..() +// Boxing Variants! + /// Evil Boxing; for sick, evil scoundrels. Has no honor, making it more lethal (therefore unable to be used by pacifists). /// Grants Strength and Stimmed to speed up any experience gain. @@ -281,6 +296,68 @@ honorable_boxer = FALSE boxing_traits = list(TRAIT_BOXING_READY, TRAIT_STRENGTH, TRAIT_STIMMED) +/// Hunter Boxing: for the uncaring, completely deranged one-spacer ecological disaster. +/// The honor check accepts boxing ready targets, OR various biotypes as valid targets. Uses a special crit effect rather than the standard one (against monsters). +/// I guess technically, this allows for lethal boxing. If you want. +/datum/martial_art/boxing/hunter + name = "Hunter Boxing" + id = MARTIALART_HUNTER_BOXING + pacifist_style = FALSE + default_damage_type = BRUTE + boxing_traits = list(TRAIT_BOXING_READY) + /// The mobs we are looking for to pass the honor check + var/honorable_mob_biotypes = MOB_BEAST | MOB_SPECIAL | MOB_PLANT | MOB_BUG + /// Our crit shout words. First word is then paired with a second word to form an attack name. + var/list/first_word_strike = list("Extinction", "Brutalization", "Explosion", "Adventure", "Thunder", "Lightning", "Sonic", "Atomizing", "Whirlwind", "Tornado", "Shark", "Falcon") + var/list/second_word_strike = list(" Punch", " Pawnch", "-punch", " Jab", " Hook", " Fist", " Uppercut", " Straight", " Strike", " Lunge") + +/datum/martial_art/boxing/hunter/honor_check(mob/living/possible_boxer) + if(HAS_TRAIT(possible_boxer, TRAIT_BOXING_READY)) + return TRUE + + if(possible_boxer.mob_biotypes & MOB_HUMANOID && !istype(possible_boxer, /mob/living/simple_animal/hostile/megafauna)) //We're after animals, not people. Unless they want to box. (Or a megafauna) + return FALSE + + if(possible_boxer.mob_biotypes & honorable_mob_biotypes) //We're after animals, not people + return TRUE + + return FALSE //rather than default assume TRUE, we default assume FALSE. After all, there could be mobs that are none of our biotypes and also not humanoid. By default, they would be valid for being boxed if TRUE. + +// Our hunter boxer applies a rebuke and double damage against the target of their crit. If the target is humanoid, we just perform our regular crit effect instead. + +/datum/martial_art/boxing/hunter/crit_effect(mob/living/attacker, mob/living/defender, armor_block = 0, damage_type = STAMINA, damage = 0) + if(defender.mob_biotypes & MOB_HUMANOID && !istype(defender, /mob/living/simple_animal/hostile/megafauna)) + return ..() //Applies the regular crit effect if it is a normal human, and not a megafauna + + var/first_word_pick = pick(first_word_strike) + var/second_word_pick = pick(second_word_strike) + + defender.visible_message( + span_danger("[attacker] knocks the absolute bajeezus out of [defender] utilizing the terrifying [first_word_pick][second_word_pick]!!!"), + span_userdanger("You have the absolute bajeezus knocked out of you by [attacker]!!!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) + to_chat(attacker, span_danger("You knock the absolute bajeezus out of [defender] out with the terrifying [first_word_pick][second_word_pick]!!!")) + if(ishuman(attacker)) + var/mob/living/carbon/human/human_attacker = attacker + human_attacker.force_say() + human_attacker.say("[first_word_pick][second_word_pick]!!!", forced = "hunter boxing enthusiastic battlecry") + defender.apply_status_effect(/datum/status_effect/rebuked) + defender.apply_damage(damage * 2, default_damage_type, BODY_ZONE_CHEST, armor_block) //deals double our damage AGAIN + attacker.reagents.add_reagent(/datum/reagent/medicine/omnizine/godblood, 3) //Get a little healing in return for a successful crit + log_combat(attacker, defender, "hunter crit punched (boxing)") + +// Our hunter boxer speeds up their attacks when completing a combo against a valid target, and does a sizable amount of extra damage. + +/datum/martial_art/boxing/hunter/perform_extra_effect(mob/living/attacker, mob/living/defender) + if(defender.mob_biotypes & MOB_HUMANOID && !istype(defender, /mob/living/simple_animal/hostile/megafauna)) + return // Does not apply to humans (who aren't megafauna) + + attacker.changeNext_move(CLICK_CD_RAPID) + defender.apply_damage(rand(15,20), default_damage_type, BODY_ZONE_CHEST) + #undef LEFT_RIGHT_COMBO #undef RIGHT_LEFT_COMBO #undef LEFT_LEFT_COMBO diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index 8e33ac5a851ea..28b820278e21b 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -46,7 +46,7 @@ /datum/martial_art/cqc/proc/check_block(mob/living/cqc_user, atom/movable/hitby, damage, attack_text, attack_type, ...) SIGNAL_HANDLER - if(!can_use(cqc_user) || !cqc_user.throw_mode || cqc_user.incapacitated(IGNORE_GRAB)) + if(!can_use(cqc_user) || !cqc_user.throw_mode || INCAPACITATED_IGNORING(cqc_user, INCAPABLE_GRAB)) return NONE if(attack_type == PROJECTILE_ATTACK) return NONE diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 330c224070c3e..02d0452fad265 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -184,7 +184,7 @@ /datum/martial_art/the_sleeping_carp/proc/can_deflect(mob/living/carp_user) if(!can_use(carp_user) || !carp_user.combat_mode) return FALSE - if(carp_user.incapacitated(IGNORE_GRAB)) //NO STUN + if(INCAPACITATED_IGNORING(carp_user, INCAPABLE_GRAB)) //NO STUN return FALSE if(!(carp_user.mobility_flags & MOBILITY_USE)) //NO UNABLE TO USE return FALSE @@ -263,11 +263,10 @@ AddComponent(/datum/component/two_handed, \ force_unwielded = 10, \ force_wielded = 24, \ - icon_wielded = "[base_icon_state]1", \ ) /obj/item/staff/bostaff/update_icon_state() - icon_state = "[base_icon_state]0" + icon_state = inhand_icon_state = "[base_icon_state][HAS_TRAIT(src, TRAIT_WIELDED)]" return ..() /obj/item/staff/bostaff/attack(mob/target, mob/living/user, params) diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm index b340d95e90fbd..5dc8c26d0f6a3 100644 --- a/code/datums/materials/_material.dm +++ b/code/datums/materials/_material.dm @@ -70,7 +70,7 @@ Simple datum which is instanced once per type and is used for every object of sa /** Handles initializing the material. * - * Arugments: + * Arguments: * - _id: The ID the material should use. Overrides the existing ID. */ /datum/material/proc/Initialize(_id, ...) diff --git a/code/datums/mind/_mind.dm b/code/datums/mind/_mind.dm index f7597da54cc48..36e9d7ba6d024 100644 --- a/code/datums/mind/_mind.dm +++ b/code/datums/mind/_mind.dm @@ -64,7 +64,6 @@ ///If this mind's master is another mob (i.e. adamantine golems). Weakref of a /living. var/datum/weakref/enslaved_to - var/unconvertable = FALSE var/late_joiner = FALSE /// has this mind ever been an AI var/has_ever_been_ai = FALSE diff --git a/code/datums/mood.dm b/code/datums/mood.dm index 8193f9c1c15c9..3834ea866b8da 100644 --- a/code/datums/mood.dm +++ b/code/datums/mood.dm @@ -288,7 +288,7 @@ if (SANITY_LEVEL_INSANE) mood_screen_object.color = "#f15d36" - if (!conflicting_moodies.len) // theres no special icons, use the normal icon states + if (!conflicting_moodies.len) // there's no special icons, use the normal icon states mood_screen_object.icon_state = "mood[mood_level]" return diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index 60551f73911d1..c86f7d7003334 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -160,8 +160,7 @@ // This is specifically happening because they're not used to their new height and are stumbling around into machinery made for normal humans /datum/mutation/human/acromegaly/proc/head_bonk(mob/living/parent) SIGNAL_HANDLER - var/turf/airlock_turf = get_turf(parent) - var/atom/movable/whacked_by = locate(/obj/machinery/door/airlock) in airlock_turf || locate(/obj/machinery/door/firedoor) in airlock_turf || locate(/obj/structure/mineral_door) in airlock_turf + var/atom/movable/whacked_by = (locate(/obj/machinery/door/airlock) in parent.loc) || (locate(/obj/machinery/door/firedoor) in parent.loc) || (locate(/obj/structure/mineral_door) in parent.loc) if(!whacked_by || prob(100 - (8 * GET_MUTATION_SYNCHRONIZER(src)))) return to_chat(parent, span_danger("You hit your head on \the [whacked_by]'s header!")) diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index 4bc6c77a9fe81..38ecb0fa07356 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -113,7 +113,7 @@ return if(!user.throw_mode || user.get_active_held_item() || user.zone_selected != BODY_ZONE_PRECISE_GROIN) return - if(user.grab_state < GRAB_NECK || !iscarbon(user.pulling) || user.buckled || user.incapacitated()) + if(user.grab_state < GRAB_NECK || !iscarbon(user.pulling) || user.buckled || user.incapacitated) return var/mob/living/carbon/possible_throwable = user.pulling @@ -166,7 +166,7 @@ * For each step of the swinging, with the delay getting shorter along the way. Checks to see we still have them in our grasp at each step. */ /datum/mutation/human/hulk/proc/swing_loop(mob/living/carbon/human/the_hulk, mob/living/carbon/yeeted_person, step, original_dir) - if(!yeeted_person || !the_hulk || the_hulk.incapacitated()) + if(!yeeted_person || !the_hulk || the_hulk.incapacitated) return if(get_dist(the_hulk, yeeted_person) > 1 || !isturf(the_hulk.loc) || !isturf(yeeted_person.loc)) to_chat(the_hulk, span_warning("You lose your grasp on [yeeted_person]!")) @@ -237,7 +237,7 @@ /// Time to toss the victim at high speed /datum/mutation/human/hulk/proc/finish_swing(mob/living/carbon/human/the_hulk, mob/living/carbon/yeeted_person, original_dir) - if(!yeeted_person || !the_hulk || the_hulk.incapacitated()) + if(!yeeted_person || !the_hulk || the_hulk.incapacitated) return if(get_dist(the_hulk, yeeted_person) > 1 || !isturf(the_hulk.loc) || !isturf(yeeted_person.loc)) to_chat(the_hulk, span_warning("You lose your grasp on [yeeted_person]!")) diff --git a/code/datums/mutations/sight.dm b/code/datums/mutations/sight.dm index 3aceb3e7d8ad2..5a8d7458f3d0f 100644 --- a/code/datums/mutations/sight.dm +++ b/code/datums/mutations/sight.dm @@ -110,7 +110,7 @@ ///X-ray Vision lets you see through walls. /datum/mutation/human/xray name = "X Ray Vision" - desc = "A strange genome that allows the user to see between the spaces of walls." //actual x-ray would mean you'd constantly be blasting rads, wich might be fun for later //hmb + desc = "A strange genome that allows the user to see between the spaces of walls." //actual x-ray would mean you'd constantly be blasting rads, which might be fun for later //hmb text_gain_indication = span_notice("The walls suddenly disappear!") instability = POSITIVE_INSTABILITY_MAJOR locked = TRUE diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm index d6b6f714e5964..b9367cfdcdc81 100644 --- a/code/datums/mutations/speech.dm +++ b/code/datums/mutations/speech.dm @@ -2,9 +2,6 @@ //Individual ones aren't commented since their functions should be evident at a glance // no they arent bro -#define ALPHABET list("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z") -#define VOWELS list("a", "e", "i", "o", "u") -#define CONSONANTS (ALPHABET - VOWELS) /datum/mutation/human/nervousness name = "Nervousness" @@ -300,7 +297,3 @@ var/spoken_message = speech_args[SPEECH_MESSAGE] spoken_message = piglatin_sentence(spoken_message) speech_args[SPEECH_MESSAGE] = spoken_message - -#undef ALPHABET -#undef VOWELS -#undef CONSONANTS diff --git a/code/datums/mutations/touch.dm b/code/datums/mutations/touch.dm index 98d3d18807fea..2483ef2e0fa1a 100644 --- a/code/datums/mutations/touch.dm +++ b/code/datums/mutations/touch.dm @@ -51,7 +51,7 @@ /datum/action/cooldown/spell/touch/shock/cast_on_hand_hit(obj/item/melee/touch_attack/hand, atom/victim, mob/living/carbon/caster) if(iscarbon(victim)) var/mob/living/carbon/carbon_victim = victim - if(carbon_victim.electrocute_act(15, caster, 1, SHOCK_NOGLOVES | SHOCK_NOSTUN))//doesnt stun. never let this stun + if(carbon_victim.electrocute_act(15, caster, 1, SHOCK_NOGLOVES | SHOCK_NOSTUN))//doesn't stun. never let this stun carbon_victim.dropItemToGround(carbon_victim.get_active_held_item()) carbon_victim.dropItemToGround(carbon_victim.get_inactive_held_item()) carbon_victim.adjust_confusion(15 SECONDS) @@ -156,7 +156,7 @@ heal_multiplier = initial(heal_multiplier) * power_coefficient pain_multiplier = initial(pain_multiplier) * synchronizer_coefficient - // Message to show on a succesful heal if the healer has a special pacifism interaction with the mutation. + // Message to show on a successful heal if the healer has a special pacifism interaction with the mutation. var/peaceful_message = null // Heal more, hurt a bit more. @@ -340,7 +340,7 @@ /obj/item/melee/touch_attack/lay_on_hands name = "mending touch" - desc = "Unlike in your favorite tabletop games, you sadly can't cast this on yourself, so you can't use that as a Scapegoat." // mayus is reference. if you get it youre cool + desc = "Unlike in your favorite tabletop games, you sadly can't cast this on yourself, so you can't use that as a Scapegoat." // mayus is reference. if you get it you're cool icon = 'icons/obj/weapons/hand.dmi' icon_state = "greyscale" color = COLOR_VERY_PALE_LIME_GREEN diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index e427b2994f066..542d0d6504672 100644 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -49,6 +49,13 @@ /// Type path of item to go in belt slot var/belt = null + /** + * list of items that should go in the belt of the user + * + * Format of this list should be: list(path=count,otherpath=count) + */ + var/list/belt_contents = null + /// Type path of item to go in ears slot var/ears = null @@ -252,6 +259,14 @@ for(var/i in 1 to number) EQUIP_OUTFIT_ITEM(path, ITEM_SLOT_BACKPACK) + if(belt_contents) + for(var/path in belt_contents) + var/number = belt_contents[path] + if(!isnum(number))//Default to 1 + number = 1 + for(var/i in 1 to number) + EQUIP_OUTFIT_ITEM(path, ITEM_SLOT_BELTPACK) + post_equip(user, visualsOnly) if(!visualsOnly) @@ -354,8 +369,18 @@ preload += suit_store preload += back //Load in backpack gear and shit - for(var/datum/type_to_load in backpack_contents) - for(var/i in 1 to backpack_contents[type_to_load]) + for(var/type_to_load in backpack_contents) + var/num_to_load = backpack_contents[type_to_load] + if(!isnum(num_to_load)) + num_to_load = 1 + for(var/i in 1 to num_to_load) + preload += type_to_load + //Load in belt gear and shit + for(var/type_to_load in belt_contents) + var/num_to_load = belt_contents[type_to_load] + if(!isnum(num_to_load)) + num_to_load = 1 + for(var/i in 1 to num_to_load) preload += type_to_load preload += belt preload += ears @@ -403,6 +428,7 @@ .["l_hand"] = l_hand .["internals_slot"] = internals_slot .["backpack_contents"] = backpack_contents + .["belt_contents"] = belt_contents .["box"] = box .["implants"] = implants .["accessory"] = accessory @@ -430,6 +456,7 @@ l_hand = target.l_hand internals_slot = target.internals_slot backpack_contents = target.backpack_contents + belt_contents = target.belt_contents box = target.box implants = target.implants accessory = target.accessory @@ -473,6 +500,12 @@ var/itype = text2path(item) if(itype) backpack_contents[itype] = backpack[item] + var/list/beltpack = outfit_data["belt_contents"] + belt_contents = list() + for(var/item in beltpack) + var/itype = text2path(item) + if(itype) + belt_contents[itype] = belt[item] box = text2path(outfit_data["box"]) var/list/impl = outfit_data["implants"] implants = list() diff --git a/code/datums/pod_style.dm b/code/datums/pod_style.dm index 483f46209eda0..5dc09e3751303 100644 --- a/code/datums/pod_style.dm +++ b/code/datums/pod_style.dm @@ -67,7 +67,7 @@ /datum/pod_style/missile name = "cruise missile" ui_name = "Missile" - desc = "A big ass missile that didn't seem to fully detonate. It was likely launched from some far-off deep space missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible." + desc = "A big ass missile that didn't seem to fully detonate. It was likely launched from some far-off deep space missile silo. There appears to be an auxiliary payload hatch on the side, though manually opening it is likely impossible." shape = POD_SHAPE_OTHER icon_state = "missile" has_door = FALSE @@ -79,7 +79,7 @@ /datum/pod_style/missile/syndicate name = "\improper Syndicate cruise missile" ui_name = "Syndie Missile" - desc = "A big ass, blood-red missile that didn't seem to fully detonate. It was likely launched from some deep space Syndicate missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible." + desc = "A big ass, blood-red missile that didn't seem to fully detonate. It was likely launched from some deep space Syndicate missile silo. There appears to be an auxiliary payload hatch on the side, though manually opening it is likely impossible." icon_state = "smissile" id = "syndie_missile" diff --git a/code/datums/proximity_monitor/fields/gravity.dm b/code/datums/proximity_monitor/fields/gravity.dm index b7e22840041dc..745072d69e10a 100644 --- a/code/datums/proximity_monitor/fields/gravity.dm +++ b/code/datums/proximity_monitor/fields/gravity.dm @@ -63,3 +63,63 @@ /datum/proximity_monitor/advanced/gravity/warns_on_entrance/proc/clear_recent_warning(mob_ref_key) LAZYREMOVE(recently_warned, mob_ref_key) + +/obj/gravity_fluff_field + icon = 'icons/obj/smooth_structures/grav_field.dmi' + icon_state = "grav_field-0" + base_icon_state = "grav_field" + obj_flags = NONE + anchored = TRUE + move_resist = INFINITY + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + pass_flags_self = LETPASSCLICKS + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_GRAV_FIELD + canSmoothWith = SMOOTH_GROUP_GRAV_FIELD + alpha = 200 + /// our emissive appearance + var/mutable_appearance/emissive + +/obj/gravity_fluff_field/Initialize(mapload, strength) + . = ..() + if(isnull(strength)) + return INITIALIZE_HINT_QDEL + QUEUE_SMOOTH(src) + QUEUE_SMOOTH_NEIGHBORS(src) + switch(strength) + if(2 to INFINITY) + particles = new /particles/grav_field_down/strong() + if(1 to 2) + particles = new /particles/grav_field_down() + if(0 to 1) + particles = new /particles/grav_field_float() + if(-INFINITY to -1) + particles = new /particles/grav_field_up() + color = particles.color + RegisterSignal(src, COMSIG_ATOM_SMOOTHED_ICON, PROC_REF(smoothed)) + +/obj/gravity_fluff_field/Destroy(force) + . = ..() + QDEL_NULL(particles) + emissive = null + +/obj/gravity_fluff_field/proc/smoothed(datum/source) + SIGNAL_HANDLER + cut_overlay(emissive) + // because it uses a different name + emissive = emissive_appearance('icons/obj/smooth_structures/grav_field_emissive.dmi', "grav_field_emissive-[splittext(icon_state, "-")[2]]", src) + add_overlay(emissive) + +// Subtype which adds a subtle overlay to all turfs +/datum/proximity_monitor/advanced/gravity/subtle_effect + +/datum/proximity_monitor/advanced/gravity/subtle_effect/setup_field_turf(turf/target) + . = ..() + if(!isopenturf(target)) + return + new /obj/gravity_fluff_field(target, gravity_value) + +/datum/proximity_monitor/advanced/gravity/subtle_effect/cleanup_field_turf(turf/target) + . = ..() + qdel(locate(/obj/gravity_fluff_field) in target) diff --git a/code/datums/quirks/_quirk_constant_data.dm b/code/datums/quirks/_quirk_constant_data.dm index 1984acecec06e..34bde6d9883f2 100644 --- a/code/datums/quirks/_quirk_constant_data.dm +++ b/code/datums/quirks/_quirk_constant_data.dm @@ -35,7 +35,7 @@ GLOBAL_LIST_INIT_TYPED(all_quirk_constant_data, /datum/quirk_constant_data, gene /datum/quirk_constant_data/New() . = ..() - ASSERT(abstract_type != type && !isnull(associated_typepath), "associated_typepath null - please set it! occured on: [src.type]") + ASSERT(abstract_type != type && !isnull(associated_typepath), "associated_typepath null - please set it! occurred on: [src.type]") /// Returns a list of savefile_keys derived from the preference typepaths in [customization_options]. Used in quirks middleware to supply the preferences to render. /datum/quirk_constant_data/proc/get_customization_data() @@ -47,7 +47,7 @@ GLOBAL_LIST_INIT_TYPED(all_quirk_constant_data, /datum/quirk_constant_data, gene var/datum/preference/pref_instance = GLOB.preference_entries[pref_type] if (isnull(pref_instance)) stack_trace("get_customization_data was called before instantiation of [pref_type]!") - continue // just in case its a fluke and its only this one thats not instantiated, we'll check the other pref entries + continue // just in case its a fluke and its only this one that's not instantiated, we'll check the other pref entries customization_data += pref_instance.savefile_key diff --git a/code/datums/quirks/negative_quirks/paraplegic.dm b/code/datums/quirks/negative_quirks/paraplegic.dm index 58e1c4ba31e87..1cbb2dbac1017 100644 --- a/code/datums/quirks/negative_quirks/paraplegic.dm +++ b/code/datums/quirks/negative_quirks/paraplegic.dm @@ -9,6 +9,10 @@ hardcore_value = 15 mail_goodies = list(/obj/vehicle/ridden/wheelchair/motorized) //yes a fullsized unfolded motorized wheelchair does fit +/datum/quirk_constant_data/paraplegic + associated_typepath = /datum/quirk/paraplegic + customization_options = list(/datum/preference/choiced/paraplegic) + /datum/quirk/paraplegic/add_unique(client/client_source) if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs. quirk_holder.buckled.unbuckle_mob(quirk_holder) @@ -32,6 +36,16 @@ if(dropped_item.fingerprintslast == quirk_holder.ckey) quirk_holder.put_in_hands(dropped_item) + // Finally, removes their legs if they have opted as such, deleting the shoes + var/amputee = GLOB.paraplegic_choice[client_source?.prefs?.read_preference(/datum/preference/choiced/paraplegic)] + if(amputee) + delete_legs(quirk_holder) + +/datum/quirk/paraplegic/proc/delete_legs(mob/living/carbon/human/human_holder) + qdel(human_holder.get_item_by_slot(ITEM_SLOT_FEET)) + qdel(human_holder.get_bodypart(BODY_ZONE_L_LEG)) + qdel(human_holder.get_bodypart(BODY_ZONE_R_LEG)) + /datum/quirk/paraplegic/add(client/client_source) var/mob/living/carbon/human/human_holder = quirk_holder human_holder.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic, TRAUMA_RESILIENCE_ABSOLUTE) diff --git a/code/datums/quirks/neutral_quirks/transhumanist.dm b/code/datums/quirks/neutral_quirks/transhumanist.dm index ea6494a6b327b..aa8ae075df395 100644 --- a/code/datums/quirks/neutral_quirks/transhumanist.dm +++ b/code/datums/quirks/neutral_quirks/transhumanist.dm @@ -127,10 +127,10 @@ else if(isorgan(new_part)) var/obj/item/organ/new_organ = new_part old_part = human_holder.get_organ_slot(new_organ.slot) - if(new_organ.Insert(human_holder, special = TRUE)) - old_part.moveToNullspace() - STOP_PROCESSING(SSobj, old_part) - slot_string = new_organ.name + new_organ.Insert(human_holder, special = TRUE) + old_part.moveToNullspace() + STOP_PROCESSING(SSobj, old_part) + slot_string = new_organ.name /datum/quirk/transhumanist/post_add() if(!slot_string) diff --git a/code/datums/quirks/positive_quirks/spacer.dm b/code/datums/quirks/positive_quirks/spacer.dm index 4be27fe16b2e2..051798b4c06a6 100644 --- a/code/datums/quirks/positive_quirks/spacer.dm +++ b/code/datums/quirks/positive_quirks/spacer.dm @@ -4,7 +4,7 @@ /datum/quirk/spacer_born name = "Spacer" desc = "You were born in space, and have never known the comfort of a planet's gravity. Your body has adapted to this. \ - You are more comfortable in zero and artifical gravity and are more resistant to the effects of space, \ + You are more comfortable in zero and artificial gravity and are more resistant to the effects of space, \ but travelling to a planet's surface for an extended period of time will make you feel sick." gain_text = span_notice("You feel at home in space.") lose_text = span_danger("You feel homesick.") diff --git a/code/datums/records/crime.dm b/code/datums/records/crime.dm index a22ce7c816ad2..729b85c56b8e3 100644 --- a/code/datums/records/crime.dm +++ b/code/datums/records/crime.dm @@ -12,6 +12,8 @@ var/time /// Whether the crime is active or not var/valid = TRUE + /// Player that marked the crime as invalid + var/voider /datum/crime/New(name = "Crime", details = "No details provided.", author = "Anonymous") src.author = author diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm index 14909ab0861f5..2445b4da242e6 100644 --- a/code/datums/ruins/icemoon.dm +++ b/code/datums/ruins/icemoon.dm @@ -167,7 +167,7 @@ suffix = "icemoon_underground_frozen_comms.dmm" /datum/map_template/ruin/icemoon/underground/comms_agent - name = "Icemoon Listening Post" + name = "Ice-Ruin Listening Post" id = "icemoon_comms_agent" description = "Radio signals are being detected and the source is this completely innocent pile of snow." suffix = "icemoon_underground_comms_agent.dmm" diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index 2cde66f187d14..bb5f58500e2d1 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -323,3 +323,10 @@ description = "Not every shuttle makes it back to CentCom." suffix = "lavaland_surface_shuttle_wreckage.dmm" allow_duplicates = FALSE + +/datum/map_template/ruin/lavaland/crashsite + name = "Lava-Ruin Pod Crashsite" + id = "crashsite" + description = "They launched too early" + suffix = "lavaland_surface_crashsite.dmm" + allow_duplicates = FALSE diff --git a/code/datums/skills/fishing.dm b/code/datums/skills/fishing.dm index fac1855c98dbc..93c1a57d44175 100644 --- a/code/datums/skills/fishing.dm +++ b/code/datums/skills/fishing.dm @@ -11,11 +11,17 @@ /datum/skill/fishing/New() . = ..() + levelUpMessages[SKILL_LEVEL_NOVICE] = span_nicegreen("I'm starting to figure out what [name] really is! I can guess a fish size and weight at a glance.") + levelUpMessages[SKILL_LEVEL_APPRENTICE] = span_nicegreen("I'm getting a little better at [name]! I can tell if a fish is hungry, dying and otherwise.") levelUpMessages[SKILL_LEVEL_JOURNEYMAN] = span_nicegreen("I feel like I've become quite proficient at [name]! I can tell what fishes I can catch at any given fishing spot.") levelUpMessages[SKILL_LEVEL_MASTER] = span_nicegreen("I've begun to truly understand the surprising depth behind [name]. As a master [title], I can guess what I'm going to catch now!") /datum/skill/fishing/level_gained(datum/mind/mind, new_level, old_level, silent) . = ..() + if(new_level >= SKILL_LEVEL_NOVICE && old_level < SKILL_LEVEL_NOVICE) + ADD_TRAIT(mind, TRAIT_EXAMINE_FISH, SKILL_TRAIT) + if(new_level >= SKILL_LEVEL_APPRENTICE && old_level < SKILL_LEVEL_APPRENTICE) + ADD_TRAIT(mind, TRAIT_EXAMINE_DEEPER_FISH, SKILL_TRAIT) if(new_level >= SKILL_LEVEL_JOURNEYMAN && old_level < SKILL_LEVEL_JOURNEYMAN) ADD_TRAIT(mind, TRAIT_EXAMINE_FISHING_SPOT, SKILL_TRAIT) if(new_level >= SKILL_LEVEL_MASTER && old_level < SKILL_LEVEL_MASTER) @@ -27,3 +33,7 @@ REMOVE_TRAIT(mind, TRAIT_REVEAL_FISH, SKILL_TRAIT) if(old_level >= SKILL_LEVEL_JOURNEYMAN && new_level < SKILL_LEVEL_JOURNEYMAN) REMOVE_TRAIT(mind, TRAIT_EXAMINE_FISHING_SPOT, SKILL_TRAIT) + if(old_level >= SKILL_LEVEL_APPRENTICE && new_level < SKILL_LEVEL_APPRENTICE) + REMOVE_TRAIT(mind, TRAIT_EXAMINE_DEEPER_FISH, SKILL_TRAIT) + if(old_level >= SKILL_LEVEL_NOVICE && new_level < SKILL_LEVEL_NOVICE) + REMOVE_TRAIT(mind, TRAIT_EXAMINE_FISH, SKILL_TRAIT) diff --git a/code/datums/sprite_accessories.dm b/code/datums/sprite_accessories.dm index a37926405f9c0..a4394b64d52e5 100644 --- a/code/datums/sprite_accessories.dm +++ b/code/datums/sprite_accessories.dm @@ -34,8 +34,6 @@ * This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none. */ var/color_src = MUTANT_COLOR - /// Decides if this sprite has an "inner" part, such as the fleshy parts on ears. - var/hasinner = FALSE /// Is this part locked from roundstart selection? Used for parts that apply effects. var/locked = FALSE /// Should we center the sprite? @@ -1890,7 +1888,6 @@ /datum/sprite_accessory/ears/cat name = "Cat" icon_state = "cat" - hasinner = TRUE color_src = HAIR_COLOR /datum/sprite_accessory/ears/cat/big @@ -1917,7 +1914,6 @@ icon = 'icons/mob/human/fox_features.dmi' name = "Fox" icon_state = "fox" - hasinner = TRUE color_src = HAIR_COLOR locked = TRUE @@ -2124,16 +2120,6 @@ name = "Aquatic" icon_state = "aqua" -/datum/sprite_accessory/legs //legs are a special case, they aren't actually sprite_accessories but are updated with them. - icon = null //These datums exist for selecting legs on preference, and little else - em_block = TRUE - -/datum/sprite_accessory/legs/none - name = "Normal Legs" - -/datum/sprite_accessory/legs/digitigrade_lizard - name = DIGITIGRADE_LEGS - /datum/sprite_accessory/caps icon = 'icons/mob/human/species/mush_cap.dmi' color_src = HAIR_COLOR diff --git a/code/datums/station_alert.dm b/code/datums/station_alert.dm index 5b969afb00513..4c5f3ca7c51c5 100644 --- a/code/datums/station_alert.dm +++ b/code/datums/station_alert.dm @@ -61,7 +61,7 @@ data["alarms"] += list(nominal_category) return data -/datum/station_alert/ui_act(action, params) +/datum/station_alert/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/datums/station_traits/_station_trait.dm b/code/datums/station_traits/_station_trait.dm index 174b127b2d474..ef91a183d9f27 100644 --- a/code/datums/station_traits/_station_trait.dm +++ b/code/datums/station_traits/_station_trait.dm @@ -95,6 +95,7 @@ GLOBAL_LIST_EMPTY(lobby_station_traits) /// Apply any additional handling we need to our lobby button /datum/station_trait/proc/setup_lobby_button(atom/movable/screen/lobby/button/sign_up/lobby_button) SHOULD_CALL_PARENT(TRUE) + lobby_button.name = name lobby_buttons |= lobby_button RegisterSignal(lobby_button, COMSIG_ATOM_UPDATE_ICON, PROC_REF(on_lobby_button_update_icon)) RegisterSignal(lobby_button, COMSIG_SCREEN_ELEMENT_CLICK, PROC_REF(on_lobby_button_click)) diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm index d92467e5edf01..83d1bfa14f4c9 100644 --- a/code/datums/station_traits/negative_traits.dm +++ b/code/datums/station_traits/negative_traits.dm @@ -618,8 +618,14 @@ send_supply_pod_to_area(supply_pack_shielding.generate(null), /area/station/command/bridge, /obj/structure/closet/supplypod/centcompod) // Let medical know resistence is futile - send_fax_to_area(new /obj/item/paper/fluff/radiation_nebula_virologist(), /area/station/medical/virology, "NT Virology Department", \ - force = TRUE, force_pod_type = /obj/structure/closet/supplypod/centcompod) + if (/area/station/medical/virology in GLOB.areas_by_type) + send_fax_to_area( + new /obj/item/paper/fluff/radiation_nebula_virologist, + /area/station/medical/virology, + "NT Virology Department", + force = TRUE, + force_pod_type = /obj/structure/closet/supplypod/centcompod, + ) //Disables radstorms, they don't really make sense since we already have the nebula causing storms var/datum/round_event_control/modified_event = locate(/datum/round_event_control/radiation_storm) in SSevents.control diff --git a/code/datums/station_traits/neutral_traits.dm b/code/datums/station_traits/neutral_traits.dm index 3069e644d6e1b..5432701992b29 100644 --- a/code/datums/station_traits/neutral_traits.dm +++ b/code/datums/station_traits/neutral_traits.dm @@ -479,7 +479,7 @@ return if((skub_stance == RANDOM_SKUB && prob(50)) || skub_stance == PRO_SKUB) - var/obj/item/storage/box/skub/boxie = new(spawned.loc) + var/obj/item/storage/box/stickers/skub/boxie = new(spawned.loc) spawned.equip_to_slot_if_possible(boxie, ITEM_SLOT_BACKPACK, indirect_action = TRUE) if(ishuman(spawned)) var/obj/item/clothing/suit/costume/wellworn_shirt/skub/shirt = new(spawned.loc) @@ -496,24 +496,28 @@ shirt.forceMove(boxie) /// A box containing a skub, for easier carry because skub is a bulky item. -/obj/item/storage/box/skub - name = "skub box" - desc = "A box to store your skub and pro-skub shirt in. A label on the back reads: \"Skubtide, Stationwide\"." - icon_state = "hugbox" - illustration = "skub" - -/obj/item/storage/box/skub/Initialize(mapload) +/obj/item/storage/box/stickers/skub + name = "skub fan pack" + desc = "A vinyl pouch to store your skub and pro-skub shirt in. A label on the back reads: \"Skubtide, Stationwide\"." + icon_state = "skubpack" + illustration = "label_skub" + w_class = WEIGHT_CLASS_SMALL + +/obj/item/storage/box/stickers/skub/Initialize(mapload) . = ..() + atom_storage.max_slots = 3 atom_storage.exception_hold = typecacheof(list(/obj/item/skub, /obj/item/clothing/suit/costume/wellworn_shirt/skub)) -/obj/item/storage/box/skub/PopulateContents() +/obj/item/storage/box/stickers/skub/PopulateContents() new /obj/item/skub(src) new /obj/item/sticker/skub(src) new /obj/item/sticker/skub(src) /obj/item/storage/box/stickers/anti_skub - name = "anti-skub stickers box" - desc = "The enemy may have been given a skub and a shirt, but I've more stickers! Plus the box can hold my anti-skub shirt." + name = "anti-skub stickers pack" + desc = "The enemy may have been given a skub and a shirt, but I've got more stickers! Plus the pack can hold my anti-skub shirt." + icon_state = "skubpack" + illustration = "label_anti_skub" /obj/item/storage/box/stickers/anti_skub/Initialize(mapload) . = ..() diff --git a/code/datums/status_effects/food_effects.dm b/code/datums/status_effects/buffs/food/_food_effect.dm similarity index 64% rename from code/datums/status_effects/food_effects.dm rename to code/datums/status_effects/buffs/food/_food_effect.dm index f36f1e2034d9c..fe63df29e3a8a 100644 --- a/code/datums/status_effects/food_effects.dm +++ b/code/datums/status_effects/buffs/food/_food_effect.dm @@ -1,19 +1,18 @@ /// Buffs given by eating hand-crafted food. The duration scales with consumable reagents purity. /datum/status_effect/food - id = "food_buff" + id = "food_effect" duration = 5 MINUTES // Same as food mood buffs status_type = STATUS_EFFECT_REPLACE // Only one food buff allowed alert_type = /atom/movable/screen/alert/status_effect/food show_duration = TRUE - /// Buff power + /// Buff power equal to food complexity (1 to 5) var/strength /datum/status_effect/food/on_creation(mob/living/new_owner, timeout_mod = 1, strength = 1) + . = ..() src.strength = strength - //Generate alert when not specified if(isnum(timeout_mod)) duration *= timeout_mod - . = ..() if(istype(linked_alert, /atom/movable/screen/alert/status_effect/food)) linked_alert.icon_state = "[linked_alert.base_icon_state]_[strength]" @@ -22,19 +21,3 @@ desc = "Eating it made me feel better." icon_state = "food_buff_1" base_icon_state = "food_buff" - -/// Makes you gain a trait -/datum/status_effect/food/trait - var/trait = TRAIT_DUMB // You need to override this - -/datum/status_effect/food/trait/on_apply() - ADD_TRAIT(owner, trait, type) - return ..() - -/datum/status_effect/food/trait/be_replaced() - REMOVE_TRAIT(owner, trait, type) - return ..() - -/datum/status_effect/food/trait/on_remove() - REMOVE_TRAIT(owner, trait, type) - return ..() diff --git a/code/datums/status_effects/buffs/food/food_traits.dm b/code/datums/status_effects/buffs/food/food_traits.dm deleted file mode 100644 index dfd0b888aa096..0000000000000 --- a/code/datums/status_effects/buffs/food/food_traits.dm +++ /dev/null @@ -1,7 +0,0 @@ -/datum/status_effect/food/trait/shockimmune - alert_type = /atom/movable/screen/alert/status_effect/food/trait_shockimmune - trait = TRAIT_SHOCKIMMUNE - -/atom/movable/screen/alert/status_effect/food/trait_shockimmune - name = "Grounded" - desc = "That meal made me feel like a superconductor..." diff --git a/code/datums/status_effects/buffs/food/grant_trait.dm b/code/datums/status_effects/buffs/food/grant_trait.dm new file mode 100644 index 0000000000000..f25be3b0b3bfd --- /dev/null +++ b/code/datums/status_effects/buffs/food/grant_trait.dm @@ -0,0 +1,56 @@ +/// Makes you gain a trait +/datum/status_effect/food/trait + var/trait = TRAIT_DUMB // You need to override this + +/datum/status_effect/food/trait/on_apply() + if(!HAS_TRAIT_FROM(owner, trait, type)) // Check if trait was already applied + ADD_TRAIT(owner, trait, type) + return ..() + +/datum/status_effect/food/trait/be_replaced() + REMOVE_TRAIT(owner, trait, type) + return ..() + +/datum/status_effect/food/trait/on_remove() + REMOVE_TRAIT(owner, trait, type) + return ..() + +/datum/status_effect/food/trait/shockimmune + alert_type = /atom/movable/screen/alert/status_effect/shockimmune + trait = TRAIT_SHOCKIMMUNE + +/atom/movable/screen/alert/status_effect/shockimmune + name = "Grounded" + desc = "That meal made me feel like a superconductor..." + icon_state = "shock_immune" + +/datum/status_effect/food/trait/mute + alert_type = /atom/movable/screen/alert/status_effect/mute + trait = TRAIT_MUTE + +/atom/movable/screen/alert/status_effect/mute + name = "..." + desc = "..." + icon_state = "mute" + +/datum/status_effect/food/trait/ashstorm_immune + alert_type = /atom/movable/screen/alert/status_effect/ashstorm_immune + trait = TRAIT_ASHSTORM_IMMUNE + +/atom/movable/screen/alert/status_effect/ashstorm_immune + name = "Ashstorm-proof" + desc = "That meal makes me feel born on Lavaland." + icon_state = "ashstorm_immune" + +/datum/status_effect/food/trait/waddle + alert_type = /atom/movable/screen/alert/status_effect/waddle + trait = TRAIT_WADDLING + +/datum/status_effect/food/trait/waddle/on_apply() + owner.AddElementTrait(trait, type, /datum/element/waddling) + return ..() + +/atom/movable/screen/alert/status_effect/waddle + name = "Waddling" + desc = "That meal makes me want to joke around." + icon_state = "waddle" diff --git a/code/datums/status_effects/buffs/food/speech.dm b/code/datums/status_effects/buffs/food/speech.dm new file mode 100644 index 0000000000000..634fd739709b3 --- /dev/null +++ b/code/datums/status_effects/buffs/food/speech.dm @@ -0,0 +1,45 @@ +///Temporary modifies the speech using the /datum/component/speechmod +/datum/status_effect/food/speech + +/datum/status_effect/food/speech/italian + alert_type = /atom/movable/screen/alert/status_effect/italian_speech + +/datum/status_effect/food/speech/italian/on_apply() + AddComponent( \ + /datum/component/speechmod, \ + replacements = strings("italian_replacement.json", "italian"), \ + end_string = list( + " Ravioli, ravioli, give me the formuoli!", + " Mamma-mia!", + " Mamma-mia! That's a spicy meat-ball!", + " La la la la la funiculi funicula!" + ), \ + end_string_chance = 3 \ + ) + return ..() + +/atom/movable/screen/alert/status_effect/italian_speech + name = "Linguini Embrace" + desc = "You feel a sudden urge to gesticulate wildly." + icon_state = "food_italian" + +/datum/status_effect/food/speech/french + alert_type = /atom/movable/screen/alert/status_effect/french_speech + +/datum/status_effect/food/speech/french/on_apply() + AddComponent( \ + /datum/component/speechmod, \ + replacements = strings("french_replacement.json", "french"), \ + end_string = list( + " Honh honh honh!", + " Honh!", + " Zut Alors!" + ), \ + end_string_chance = 3, \ + ) + return ..() + +/atom/movable/screen/alert/status_effect/french_speech + name = "Café Chic" + desc = "Suddenly, everything seems worthy of a passionate debate." + icon_state = "food_french" diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index df93089633629..08f5ae101bf77 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -1,11 +1,11 @@ /// The damage healed per tick while sleeping without any modifiers #define HEALING_SLEEP_DEFAULT 0.2 -/// The sleep healing multipler for organ passive healing (since organs heal slowly) +/// The sleep healing multiplier for organ passive healing (since organs heal slowly) #define HEALING_SLEEP_ORGAN_MULTIPLIER 5 -/// The sleep multipler for fitness xp conversion +/// The sleep multiplier for fitness xp conversion #define SLEEP_QUALITY_WORKOUT_MULTIPLER 10 -//Largely negative status effects go here, even if they have small benificial effects +//Largely negative status effects go here, even if they have small beneficial effects //STUN EFFECTS /datum/status_effect/incapacitating tick_interval = -1 @@ -606,7 +606,7 @@ alert_type = null /datum/status_effect/spasms/tick(seconds_between_ticks) - if(owner.stat >= UNCONSCIOUS || owner.incapacitated() || HAS_TRAIT(owner, TRAIT_HANDS_BLOCKED) || HAS_TRAIT(owner, TRAIT_IMMOBILIZED)) + if(owner.stat >= UNCONSCIOUS || owner.incapacitated || HAS_TRAIT(owner, TRAIT_HANDS_BLOCKED) || HAS_TRAIT(owner, TRAIT_IMMOBILIZED)) return if(!prob(15)) return @@ -732,7 +732,7 @@ status_type = STATUS_EFFECT_REPLACE tick_interval = 0.2 SECONDS alert_type = null - var/msg_stage = 0//so you dont get the most intense messages immediately + var/msg_stage = 0//so you don't get the most intense messages immediately /datum/status_effect/fake_virus/on_apply() if(HAS_TRAIT(owner, TRAIT_VIRUSIMMUNE)) diff --git a/code/datums/status_effects/debuffs/slime/slime_leech.dm b/code/datums/status_effects/debuffs/slime/slime_leech.dm index 49bd0f7b82c84..78ccacc89d8cb 100644 --- a/code/datums/status_effects/debuffs/slime/slime_leech.dm +++ b/code/datums/status_effects/debuffs/slime/slime_leech.dm @@ -66,7 +66,7 @@ if(need_mob_update) owner.updatehealth() - if(totaldamage >= 0) // AdjustBruteLoss returns a negative value on succesful damage adjustment + if(totaldamage >= 0) // AdjustBruteLoss returns a negative value on successful damage adjustment our_slime.balloon_alert(our_slime, "not food!") our_slime.stop_feeding() return diff --git a/code/datums/status_effects/debuffs/staggered.dm b/code/datums/status_effects/debuffs/staggered.dm index 9db72e1fd06ee..1291da1307a61 100644 --- a/code/datums/status_effects/debuffs/staggered.dm +++ b/code/datums/status_effects/debuffs/staggered.dm @@ -4,7 +4,7 @@ /// Staggered can occur most often via shoving, but can also occur in other places too. /datum/status_effect/staggered id = "staggered" - tick_interval = 0.5 SECONDS + tick_interval = 0.8 SECONDS alert_type = null remove_on_fullheal = TRUE @@ -25,7 +25,7 @@ UnregisterSignal(owner, COMSIG_LIVING_DEATH) owner.remove_movespeed_modifier(/datum/movespeed_modifier/staggered) // Resetting both X on remove so we're back to normal - owner.pixel_x = owner.base_pixel_x + animate(owner, pixel_x = owner.base_pixel_x, time = 0.2 SECONDS, flags = ANIMATION_PARALLEL) /// Signal proc that self deletes our staggered effect /datum/status_effect/staggered/proc/clear_staggered(datum/source) @@ -40,13 +40,16 @@ return if(HAS_TRAIT(owner, TRAIT_FAKEDEATH)) return - owner.do_stagger_animation() + INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob/living, do_stagger_animation)) /// Helper proc that causes the mob to do a stagger animation. /// Doesn't change significantly, just meant to represent swaying back and forth /mob/living/proc/do_stagger_animation() - animate(src, pixel_x = 4, time = 0.2 SECONDS, loop = 6, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL) - animate(pixel_x = -4, time = 0.2 SECONDS, flags = ANIMATION_RELATIVE) + animate(src, pixel_x = 4, time = 0.2 SECONDS, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL) + sleep(0.2 SECONDS) + animate(src, pixel_x = -8, time = 0.2 SECONDS, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL) + sleep(0.2 SECONDS) + animate(src, pixel_x = 4, time = 0.2 SECONDS, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL) /// Status effect specifically for instances where someone is vulnerable to being stunned when shoved. /datum/status_effect/next_shove_stuns diff --git a/code/datums/status_effects/debuffs/strandling.dm b/code/datums/status_effects/debuffs/strandling.dm index 6050a3df304da..0ce0ad4188221 100644 --- a/code/datums/status_effects/debuffs/strandling.dm +++ b/code/datums/status_effects/debuffs/strandling.dm @@ -57,7 +57,7 @@ * tool - the tool the user's using to remove the strange. Can be null. */ /datum/status_effect/strandling/proc/try_remove_effect(mob/user, obj/item/tool) - if(user.incapacitated() || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) + if(user.incapacitated || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) return user.visible_message( diff --git a/code/datums/status_effects/drug_effects.dm b/code/datums/status_effects/drug_effects.dm index 1d37c8f0e43eb..bb86e2b014bf3 100644 --- a/code/datums/status_effects/drug_effects.dm +++ b/code/datums/status_effects/drug_effects.dm @@ -52,7 +52,7 @@ owner.set_jitter_if_lower(100 SECONDS) owner.Paralyze(duration) owner.visible_message(span_warning("[owner] drops to the ground as [owner.p_they()] start seizing up."), \ - span_warning("[pick("You can't collect your thoughts...", "You suddenly feel extremely dizzy...", "You cant think straight...","You can't move your face properly anymore...")]")) + span_warning("[pick("You can't collect your thoughts...", "You suddenly feel extremely dizzy...", "You can't think straight...","You can't move your face properly anymore...")]")) return TRUE /atom/movable/screen/alert/status_effect/seizure diff --git a/code/datums/status_effects/stacking_effect.dm b/code/datums/status_effects/stacking_effect.dm index 98dd1c3ad14e7..b54734155ad92 100644 --- a/code/datums/status_effects/stacking_effect.dm +++ b/code/datums/status_effects/stacking_effect.dm @@ -8,7 +8,7 @@ /// How many stacks are currently accumulated. /// Also, the default stacks number given on application. var/stacks = 0 - // Deciseconds until ticks start occuring, which removes stacks + // Deciseconds until ticks start occurring, which removes stacks /// (first stack will be removed at this time plus tick_interval) var/delay_before_decay /// How many stacks are lost per tick (decay trigger) @@ -31,11 +31,11 @@ /// Put the state name without the number in these state vars var/overlay_state /// Icon state for underlays applied when the status effect is applied - /// The number is concatonated onto the string based on the number of stacks to get the correct state name. + /// The number is concatenated onto the string based on the number of stacks to get the correct state name. var/underlay_state /// A reference to our overlay appearance var/mutable_appearance/status_overlay - /// A referenceto our underlay appearance + /// A reference to our underlay appearance var/mutable_appearance/status_underlay /// Effects that occur when the stack count crosses stack_threshold @@ -90,7 +90,7 @@ owner.underlays -= status_underlay stacks += stacks_added if(stacks > 0) - if(stacks >= stack_threshold && !threshold_crossed) //threshold_crossed check prevents threshold effect from occuring if changing from above threshold to still above threshold + if(stacks >= stack_threshold && !threshold_crossed) //threshold_crossed check prevents threshold effect from occurring if changing from above threshold to still above threshold threshold_crossed = TRUE on_threshold_cross() if(consumed_on_threshold) diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index 7cdb9d406152b..8bdfa3f3de2a3 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -43,7 +43,10 @@ /// Determines whether we play a rustle animation when inserting/removing items. var/animated = TRUE /// Determines whether we play a rustle sound when inserting/removing items. - var/rustle_sound = TRUE + var/do_rustle = TRUE + var/rustle_vary = TRUE + /// Path for the item's rustle sound. + var/rustle_sound = SFX_RUSTLE /// The sound to play when we open/access the storage var/open_sound var/open_sound_vary = TRUE @@ -386,7 +389,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) user.balloon_alert(user, "no room!") return FALSE - var/can_hold_it = isnull(can_hold) || is_type_in_typecache(to_insert, can_hold) + var/can_hold_it = isnull(can_hold) || is_type_in_typecache(to_insert, can_hold) || is_type_in_typecache(to_insert, exception_hold) var/cant_hold_it = is_type_in_typecache(to_insert, cant_hold) var/trait_says_no = HAS_TRAIT(to_insert, TRAIT_NO_STORAGE_INSERT) if(!can_hold_it || cant_hold_it || trait_says_no) @@ -529,8 +532,8 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(silent) return - if(rustle_sound) - playsound(parent, SFX_RUSTLE, 50, TRUE, -5) + if(do_rustle) + playsound(parent, rustle_sound, 50, rustle_vary, -5) if(!silent_for_user) to_chat(user, span_notice("You put [thing] [insert_preposition]to [parent].")) @@ -560,7 +563,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) reset_item(thing) thing.forceMove(remove_to_loc) - if(rustle_sound && !silent) + if(do_rustle && !silent) playsound(parent, SFX_RUSTLE, 50, TRUE, -5) else thing.moveToNullspace() @@ -735,7 +738,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) /datum/storage/proc/on_mousedrop_onto(datum/source, atom/over_object, mob/user) SIGNAL_HANDLER - if(ismecha(user.loc) || !user.canUseStorage()) + if(ismecha(user.loc) || user.incapacitated || !user.canUseStorage()) return if(istype(over_object, /atom/movable/screen/inventory/hand)) @@ -794,7 +797,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(dest_object.atom_storage) to_chat(user, span_notice("You dump the contents of [parent] into [dest_object].")) - if(rustle_sound) + if(do_rustle) playsound(parent, SFX_RUSTLE, 50, TRUE, -5) for(var/obj/item/to_dump in real_location) @@ -824,6 +827,9 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) return if(!iscarbon(user) && !isdrone(user)) return + var/mob/living/user_living = user + if(user_living.incapacitated) + return attempt_insert(dropping, user) return COMPONENT_CANCEL_MOUSEDROPPED_ONTO @@ -957,7 +963,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(animated) animate_parent() - if(rustle_sound) + if(do_rustle && !silent) playsound(parent, (open_sound ? open_sound : SFX_RUSTLE), 50, open_sound_vary, -5) return TRUE diff --git a/code/datums/storage/subtypes/extract_inventory.dm b/code/datums/storage/subtypes/extract_inventory.dm index 9d75b6eb1d336..621e44654511c 100644 --- a/code/datums/storage/subtypes/extract_inventory.dm +++ b/code/datums/storage/subtypes/extract_inventory.dm @@ -5,7 +5,7 @@ attack_hand_interact = FALSE quickdraw = FALSE locked = STORAGE_FULLY_LOCKED - rustle_sound = FALSE + do_rustle = FALSE silent = TRUE // Snowflake so you can feed it insert_on_attack = FALSE diff --git a/code/datums/storage/subtypes/fish_case.dm b/code/datums/storage/subtypes/fish_case.dm index 82733d37ad985..47103e931b1f8 100644 --- a/code/datums/storage/subtypes/fish_case.dm +++ b/code/datums/storage/subtypes/fish_case.dm @@ -1,6 +1,6 @@ /datum/storage/fish_case max_slots = 1 - max_specific_storage = WEIGHT_CLASS_HUGE + max_specific_storage = WEIGHT_CLASS_GIGANTIC can_hold_description = "Fish and aquarium equipment" /datum/storage/fish_case/can_insert(obj/item/to_insert, mob/user, messages, force) @@ -13,11 +13,13 @@ return FALSE return . +/datum/storage/fish_case/adjust_size + /* * Change the size of the storage item to match the inserted item's * Because of that, we also check if conditions to keep it inside another storage or pockets are still met. */ -/datum/storage/fish_case/handle_enter(datum/source, obj/item/arrived) +/datum/storage/fish_case/adjust_size/handle_enter(datum/source, obj/item/arrived) . = ..() if(!isitem(parent) || !istype(arrived)) return @@ -26,7 +28,7 @@ return item_parent.update_weight_class(arrived.w_class) -/datum/storage/fish_case/handle_exit(datum/source, obj/item/gone) +/datum/storage/fish_case/adjust_size/handle_exit(datum/source, obj/item/gone) . = ..() if(!isitem(parent) || !istype(gone)) return diff --git a/code/datums/storage/subtypes/pockets.dm b/code/datums/storage/subtypes/pockets.dm index edf3816c274ee..4e0e233121a28 100644 --- a/code/datums/storage/subtypes/pockets.dm +++ b/code/datums/storage/subtypes/pockets.dm @@ -2,7 +2,7 @@ max_slots = 2 max_specific_storage = WEIGHT_CLASS_SMALL max_total_storage = 50 - rustle_sound = FALSE + do_rustle = FALSE /datum/storage/pockets/attempt_insert(obj/item/to_insert, mob/user, override, force, messages) . = ..() diff --git a/code/datums/view.dm b/code/datums/view.dm index 19ba66c390040..90d07c667967c 100644 --- a/code/datums/view.dm +++ b/code/datums/view.dm @@ -1,19 +1,19 @@ //This is intended to be a full wrapper. DO NOT directly modify its values ///Container for client viewsize /datum/view_data - /// Width offset to apply to the default view string if we're not supressed for some reason + /// Width offset to apply to the default view string if we're not suppressed for some reason var/width = 0 /// Height offset to apply to the default view string, see above var/height = 0 /// This client's current "default" view, in the format "WidthxHeight" /// We add/remove from this when we want to change their window size var/default = "" - /// This client's current zoom level, if it's not being supressed + /// This client's current zoom level, if it's not being suppressed /// If it's 0, we autoscale to the size of the window. Otherwise it's treated as the ratio between /// the pixels on the map and output pixels. Only looks proper nice in increments of whole numbers (iirc) /// Stored here so other parts of the code have a non blocking way of getting a user's functional zoom var/zoom = 0 - /// If the view is currently being supressed by some other "monitor" + /// If the view is currently being suppressed by some other "monitor" /// For when you want to own the client's eye without fucking with their viewport /// Doesn't make sense for a binocoler to effect your view in a camera console var/is_suppressed = FALSE @@ -73,7 +73,7 @@ apply() /datum/view_data/proc/setTo(toAdd) - var/list/shitcode = getviewsize(toAdd) //Backward compatability to account + var/list/shitcode = getviewsize(toAdd) //Backward compatibility to account width = shitcode[1] //for a change in how sizes get calculated. we used to include world.view in height = shitcode[2] //this, but it was jank, so I had to move it apply() diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index a20b552df4f04..8a1cfff765733 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -20,7 +20,7 @@ protected_areas = list(/area/station/maintenance, /area/station/ai_monitored/turret_protected/ai_upload, /area/station/ai_monitored/turret_protected/ai_upload_foyer, /area/station/ai_monitored/turret_protected/aisat/maint, /area/station/ai_monitored/command/storage/satellite, /area/station/ai_monitored/turret_protected/ai, /area/station/commons/storage/emergency/starboard, /area/station/commons/storage/emergency/port, - /area/shuttle, /area/station/security/prison/safe, /area/station/security/prison/toilet, /area/icemoon/underground, /area/ruin/comms_agent/maint) + /area/shuttle, /area/station/security/prison/safe, /area/station/security/prison/toilet, /area/mine/maintenance, /area/icemoon/underground, /area/ruin/comms_agent/maint) target_trait = ZTRAIT_STATION immunity_type = TRAIT_RADSTORM_IMMUNE diff --git a/code/datums/weather/weather_types/void_storm.dm b/code/datums/weather/weather_types/void_storm.dm index 4d3638c582711..90cc7d44cfbe1 100644 --- a/code/datums/weather/weather_types/void_storm.dm +++ b/code/datums/weather/weather_types/void_storm.dm @@ -34,8 +34,8 @@ /datum/weather/void_storm/weather_act(mob/living/victim) var/need_mob_update = FALSE - victim.adjustFireLoss(1, updating_health = FALSE) - victim.adjustOxyLoss(rand(1, 3), updating_health = FALSE) + need_mob_update += victim.adjustFireLoss(1, updating_health = FALSE) + need_mob_update += victim.adjustOxyLoss(rand(1, 3), updating_health = FALSE) if(need_mob_update) victim.updatehealth() victim.adjust_eye_blur(rand(0 SECONDS, 2 SECONDS)) diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index c3c8a1c0e93e1..73bdc511ee4ba 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -348,7 +348,7 @@ data["proper_name"] = (proper_name != "Unknown") ? proper_name : null return data -/datum/wires/ui_act(action, params) +/datum/wires/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(. || !interactable(usr)) return diff --git a/code/datums/wires/mecha.dm b/code/datums/wires/mecha.dm index 4e11eda65f7f6..2fe8f19517403 100644 --- a/code/datums/wires/mecha.dm +++ b/code/datums/wires/mecha.dm @@ -95,12 +95,13 @@ if(mecha.Adjacent(target) && !TIMER_COOLDOWN_RUNNING(mecha, COOLDOWN_MECHA_MELEE_ATTACK) && target.mech_melee_attack(mecha)) TIMER_COOLDOWN_START(mecha, COOLDOWN_MECHA_MELEE_ATTACK, mecha.melee_cooldown) -/datum/wires/mecha/ui_act(action, params) +/datum/wires/mecha/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return + var/mob/user = ui.user var/obj/vehicle/sealed/mecha/mecha = holder - if(!HAS_SILICON_ACCESS(usr) && mecha.internal_damage & MECHA_INT_SHORT_CIRCUIT && mecha.shock(usr)) + if(!HAS_SILICON_ACCESS(user) && mecha.internal_damage & MECHA_INT_SHORT_CIRCUIT && mecha.shock(usr)) return FALSE /datum/wires/mecha/can_reveal_wires(mob/user) diff --git a/code/datums/wires/mod.dm b/code/datums/wires/mod.dm index 00d836a52eba4..8250bc45f69c9 100644 --- a/code/datums/wires/mod.dm +++ b/code/datums/wires/mod.dm @@ -50,9 +50,10 @@ if(WIRE_INTERFACE) mod.interface_break = !mend -/datum/wires/mod/ui_act(action, params) +/datum/wires/mod/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) var/obj/item/mod/control/mod = holder - if(!HAS_SILICON_ACCESS(usr) && mod.seconds_electrified && mod.shock(usr)) + var/mob/user = ui.user + if(!HAS_SILICON_ACCESS(user) && mod.seconds_electrified && mod.shock(user)) return FALSE return ..() diff --git a/code/datums/wounds/_wound_static_data.dm b/code/datums/wounds/_wound_static_data.dm index f996bb258c795..f8b03d1856b5d 100644 --- a/code/datums/wounds/_wound_static_data.dm +++ b/code/datums/wounds/_wound_static_data.dm @@ -1,6 +1,6 @@ // This datum is merely a singleton instance that allows for custom "can be applied" behaviors without instantiating a wound instance. // For example: You can make a pregen_data subtype for your wound that overrides can_be_applied_to to only apply to specifically slimeperson limbs. -// Without this, youre stuck with very static initial variables. +// Without this, you're stuck with very static initial variables. /// A singleton datum that holds pre-gen and static data about a wound. Each wound datum should have a corresponding wound_pregen_data. /datum/wound_pregen_data @@ -56,9 +56,9 @@ if (!abstract) if (required_limb_biostate == null) - stack_trace("required_limb_biostate null - please set it! occured on: [src.type]") + stack_trace("required_limb_biostate null - please set it! occurred on: [src.type]") if (wound_path_to_generate == null) - stack_trace("wound_path_to_generate null - please set it! occured on: [src.type]") + stack_trace("wound_path_to_generate null - please set it! occurred on: [src.type]") scar_priorities = generate_scar_priorities() @@ -82,8 +82,8 @@ * * random_roll = FALSE: If this is in the context of a random wound generation, and this wound wasn't specifically checked. * * Returns: - * FALSE if the limb cannot be wounded, if the wounding types dont match ours (via wounding_types_valid()), if we have a higher severity wound already in our series, - * if we have a biotype mismatch, if the limb isnt in a viable zone, or if theres any duplicate wound types. + * FALSE if the limb cannot be wounded, if the wounding types don't match ours (via wounding_types_valid()), if we have a higher severity wound already in our series, + * if we have a biotype mismatch, if the limb isn't in a viable zone, or if there's any duplicate wound types. * TRUE otherwise. */ /datum/wound_pregen_data/proc/can_be_applied_to(obj/item/bodypart/limb, list/suggested_wounding_types = required_wounding_types, datum/wound/old_wound, random_roll = FALSE, duplicates_allowed = src.duplicates_allowed, care_about_existing_wounds = TRUE) diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index 47f29a21e9dd5..eb531dd3dc92b 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -127,7 +127,7 @@ return ..() -/// If we should have an actionspeed_mod, ensures we do and updates its slowdown. Otherwise, ensures we dont have one +/// If we should have an actionspeed_mod, ensures we do and updates its slowdown. Otherwise, ensures we don't have one /// by qdeleting any existing modifier. /datum/wound/proc/update_actionspeed_modifier() if (should_have_actionspeed_modifier()) @@ -323,7 +323,7 @@ SIGNAL_HANDLER qdel(src) -/// Remove the wound from whatever it's afflicting, and cleans up whateverstatus effects it had or modifiers it had on interaction times. ignore_limb is used for detachments where we only want to forget the victim +/// Remove the wound from whatever it's afflicting, and cleans up whatever status effects it had or modifiers it had on interaction times. ignore_limb is used for detachments where we only want to forget the victim /datum/wound/proc/remove_wound(ignore_limb, replaced = FALSE) //TODO: have better way to tell if we're getting removed without replacement (full heal) scar stuff var/old_victim = victim @@ -341,7 +341,7 @@ if(limb && !ignore_limb) set_limb(null, replaced) // since we're removing limb's ref to us, we should do the same - // if you want to keep the ref, do it externally, theres no reason for us to remember it + // if you want to keep the ref, do it externally, there's no reason for us to remember it if (ismob(old_victim)) var/mob/mob_victim = old_victim @@ -688,7 +688,7 @@ /datum/wound/proc/get_limb_examine_description() return -/// Gets the flat percentage chance increment of a dismember occuring, if a dismember is attempted (requires mangled flesh and bone). returning 15 = +15%. +/// Gets the flat percentage chance increment of a dismember occurring, if a dismember is attempted (requires mangled flesh and bone). returning 15 = +15%. /datum/wound/proc/get_dismember_chance_bonus(existing_chance) SHOULD_BE_PURE(TRUE) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 0c6847e7db348..04d26a5e50a5a 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -128,7 +128,7 @@ * A list of teleport locations * * Adding a wizard area teleport list because motherfucking lag -- Urist - * I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game + * I am far too lazy to make it a proper list of areas so I'll just make it run the usual teleport routine at the start of the game */ GLOBAL_LIST_EMPTY(teleportlocs) @@ -168,9 +168,9 @@ GLOBAL_LIST_EMPTY(teleportlocs) return ..() /* - * Initalize this area + * Initialize this area * - * intializes the dynamic area lighting and also registers the area with the z level via + * initializes the dynamic area lighting and also registers the area with the z level via * reg_in_areas_in_z * * returns INITIALIZE_HINT_LATELOAD @@ -414,7 +414,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) /** * Update the icon state of the area * - * Im not sure what the heck this does, somethign to do with weather being able to set icon + * I'm not sure what the heck this does, something to do with weather being able to set icon * states on areas?? where the heck would that even display? */ /area/update_icon_state() @@ -439,7 +439,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) /** * Returns int 1 or 0 if the area has power for the given channel * - * evalutes a mixture of variables mappers can set, requires_power, always_unpowered and then + * evaluates a mixture of variables mappers can set, requires_power, always_unpowered and then * per channel power_equip, power_light, power_environ */ /area/proc/powered(chan) // return true if the area has power to given channel diff --git a/code/game/area/areas/away_content.dm b/code/game/area/areas/away_content.dm index ded38af6201ab..5e2219ef857e0 100644 --- a/code/game/area/areas/away_content.dm +++ b/code/game/area/areas/away_content.dm @@ -13,16 +13,6 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" sound_environment = SOUND_ENVIRONMENT_ROOM area_flags = UNIQUE_AREA -/area/awaymission/beach - name = "Beach" - icon_state = "away" - static_lighting = FALSE - base_lighting_alpha = 255 - base_lighting_color = "#FFFFCC" - requires_power = FALSE - has_gravity = STANDARD_GRAVITY - ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg','sound/ambience/ambiodd.ogg','sound/ambience/ambinice.ogg') - /area/awaymission/museum name = "Nanotrasen Museum" icon_state = "awaycontent28" diff --git a/code/game/area/areas/ruins/icemoon.dm b/code/game/area/areas/ruins/icemoon.dm index fd983f763a3a2..d0049e7007c49 100644 --- a/code/game/area/areas/ruins/icemoon.dm +++ b/code/game/area/areas/ruins/icemoon.dm @@ -44,7 +44,7 @@ mood_message = "I feel like I am being watched..." /area/ruin/bughabitat - name = "\improper Entemology Outreach Center" + name = "\improper Entomology Outreach Center" mood_bonus = 1 mood_message = "This place seems strangely serene." diff --git a/code/game/atom/alternate_appearance.dm b/code/game/atom/alternate_appearance.dm index 228462f7936a4..108b72b95d286 100644 --- a/code/game/atom/alternate_appearance.dm +++ b/code/game/atom/alternate_appearance.dm @@ -35,20 +35,51 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) GLOB.active_alternate_appearances += src for(var/mob in GLOB.player_list) - if(mobShouldSee(mob)) - show_to(mob) + apply_to_new_mob(mob) /datum/atom_hud/alternate_appearance/Destroy() GLOB.active_alternate_appearances -= src return ..() -/datum/atom_hud/alternate_appearance/proc/onNewMob(mob/M) - if(mobShouldSee(M)) - show_to(M) +/// Wrapper for applying this alt hud to the passed mob (if they should see it) +/datum/atom_hud/alternate_appearance/proc/apply_to_new_mob(mob/applying_to) + if(mobShouldSee(applying_to)) + if(!hud_users_all_z_levels[applying_to]) + show_to(applying_to) + return TRUE + return FALSE +/// Checks if the passed mob should be seeing this hud /datum/atom_hud/alternate_appearance/proc/mobShouldSee(mob/M) return FALSE +/datum/atom_hud/alternate_appearance/show_to(mob/new_viewer) + . = ..() + if(!new_viewer) + return + track_mob(new_viewer) + +/// Registers some signals to track the mob's state to determine if they should be seeing the hud still +/datum/atom_hud/alternate_appearance/proc/track_mob(mob/new_viewer) + return + +/datum/atom_hud/alternate_appearance/hide_from(mob/former_viewer, absolute) + . = ..() + if(!former_viewer || hud_atoms_all_z_levels[former_viewer] >= 1) + return + untrack_mob(former_viewer) + +/// Unregisters the signals that were tracking the mob's state +/datum/atom_hud/alternate_appearance/proc/untrack_mob(mob/former_viewer) + return + +/datum/atom_hud/alternate_appearance/proc/check_hud(mob/source) + SIGNAL_HANDLER + // Attempt to re-apply the hud entirely + if(!apply_to_new_mob(source)) + // If that failed, probably shouldn't be seeing it at all, so nuke it + hide_from(source, absolute = TRUE) + /datum/atom_hud/alternate_appearance/add_atom_to_hud(atom/A, image/I) . = ..() if(.) @@ -99,6 +130,22 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) if(ghost_appearance) QDEL_NULL(ghost_appearance) +/datum/atom_hud/alternate_appearance/basic/track_mob(mob/new_viewer) + RegisterSignals(new_viewer, list( + COMSIG_MOB_ANTAGONIST_REMOVED, + COMSIG_MOB_GHOSTIZED, + COMSIG_MOB_MIND_TRANSFERRED_INTO, + COMSIG_MOB_MIND_TRANSFERRED_OUT_OF, + ), PROC_REF(check_hud), override = TRUE) + +/datum/atom_hud/alternate_appearance/basic/untrack_mob(mob/former_viewer) + UnregisterSignal(former_viewer, list( + COMSIG_MOB_ANTAGONIST_REMOVED, + COMSIG_MOB_GHOSTIZED, + COMSIG_MOB_MIND_TRANSFERRED_INTO, + COMSIG_MOB_MIND_TRANSFERRED_OUT_OF, + )) + /datum/atom_hud/alternate_appearance/basic/add_atom_to_hud(atom/A) LAZYINITLIST(A.hud_list) A.hud_list[appearance_key] = image @@ -136,16 +183,10 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) /datum/atom_hud/alternate_appearance/basic/noncult /datum/atom_hud/alternate_appearance/basic/noncult/mobShouldSee(mob/M) - if(!IS_CULTIST(M)) - return TRUE - return FALSE - -/datum/atom_hud/alternate_appearance/basic/cult + return !IS_CULTIST(M) -/datum/atom_hud/alternate_appearance/basic/cult/mobShouldSee(mob/M) - if(IS_CULTIST(M)) - return TRUE - return FALSE +/datum/atom_hud/alternate_appearance/basic/has_antagonist/cult + antag_datum_type = /datum/antagonist/cult /datum/atom_hud/alternate_appearance/basic/blessed_aware diff --git a/code/game/atom/atom_act.dm b/code/game/atom/atom_act.dm index acd33976e51b6..c9951b9209422 100644 --- a/code/game/atom/atom_act.dm +++ b/code/game/atom/atom_act.dm @@ -208,7 +208,7 @@ ///wrapper proc that passes our mob's rust_strength to the target we are rusting /mob/living/proc/do_rust_heretic_act(atom/target) - var/datum/antagonist/heretic/heretic_data = IS_HERETIC(src) + var/datum/antagonist/heretic/heretic_data = GET_HERETIC(src) target.rust_heretic_act(heretic_data?.rust_strength) /mob/living/basic/heretic_summon/rust_walker/do_rust_heretic_act(atom/target) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 046478c9b366a..e4aadc639e486 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -66,7 +66,7 @@ /** * In case you have multiple types, you automatically use the most useful one. * IE: Skating on ice, flippers on water, flying over chasm/space, etc. - * I reccomend you use the movetype_handler system and not modify this directly, especially for living mobs. + * I recommend you use the movetype_handler system and not modify this directly, especially for living mobs. */ var/movement_type = GROUND @@ -130,7 +130,7 @@ /mutable_appearance/emissive_blocker/New() . = ..() - // Need to do this here because it's overriden by the parent call + // Need to do this here because it's overridden by the parent call color = EM_BLOCK_COLOR appearance_flags = EMISSIVE_APPEARANCE_FLAGS @@ -142,7 +142,7 @@ #endif #if EMISSIVE_BLOCK_GENERIC != 0 - #error EMISSIVE_BLOCK_GENERIC is expected to be 0 to faciliate a weird optimization hack where we rely on it being the most common. + #error EMISSIVE_BLOCK_GENERIC is expected to be 0 to facilitate a weird optimization hack where we rely on it being the most common. #error Read the comment in code/game/atoms_movable.dm for details. #endif @@ -632,7 +632,7 @@ if(!newloc || newloc == loc) return - // A mid-movement... movement... occured, resolve that first. + // A mid-movement... movement... occurred, resolve that first. RESOLVE_ACTIVE_MOVEMENT if(!direction) @@ -799,7 +799,7 @@ if (pulledby) if (pulledby.currently_z_moving) check_pulling(z_allowed = TRUE) - //dont call check_pulling() here at all if there is a pulledby that is not currently z moving + //don't call check_pulling() here at all if there is a pulledby that is not currently z moving //because it breaks stair conga lines, for some fucking reason. //it's fine because the pull will be checked when this whole proc is called by the mob doing the pulling anyways else @@ -1086,7 +1086,7 @@ for(var/atom/movable/location as anything in get_nested_locs(src) + src) LAZYREMOVEASSOC(location.important_recursive_contents, RECURSIVE_CONTENTS_ACTIVE_STORAGE, src) -///Sets the anchored var and returns if it was sucessfully changed or not. +///Sets the anchored var and returns if it was successfully changed or not. /atom/movable/proc/set_anchored(anchorvalue) SHOULD_CALL_PARENT(TRUE) if(anchored == anchorvalue) diff --git a/code/game/communications.dm b/code/game/communications.dm index 6d26a9779937d..aba409b558710 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -104,6 +104,7 @@ GLOBAL_LIST_INIT(radiochannels, list( RADIO_CHANNEL_SUPPLY = FREQ_SUPPLY, RADIO_CHANNEL_SERVICE = FREQ_SERVICE, RADIO_CHANNEL_AI_PRIVATE = FREQ_AI_PRIVATE, + RADIO_CHANNEL_ENTERTAINMENT = FREQ_ENTERTAINMENT, RADIO_CHANNEL_CTF_RED = FREQ_CTF_RED, RADIO_CHANNEL_CTF_BLUE = FREQ_CTF_BLUE, RADIO_CHANNEL_CTF_GREEN = FREQ_CTF_GREEN, @@ -123,6 +124,7 @@ GLOBAL_LIST_INIT(reverseradiochannels, list( "[FREQ_SUPPLY]" = RADIO_CHANNEL_SUPPLY, "[FREQ_SERVICE]" = RADIO_CHANNEL_SERVICE, "[FREQ_AI_PRIVATE]" = RADIO_CHANNEL_AI_PRIVATE, + "[FREQ_ENTERTAINMENT]" = RADIO_CHANNEL_ENTERTAINMENT, "[FREQ_CTF_RED]" = RADIO_CHANNEL_CTF_RED, "[FREQ_CTF_BLUE]" = RADIO_CHANNEL_CTF_BLUE, "[FREQ_CTF_GREEN]" = RADIO_CHANNEL_CTF_GREEN, @@ -141,10 +143,11 @@ GLOBAL_LIST_INIT(radiocolors, list( RADIO_CHANNEL_SUPPLY = "#a8732b", RADIO_CHANNEL_SERVICE = "#6eaa2c", RADIO_CHANNEL_AI_PRIVATE = "#ff00ff", + RADIO_CHANNEL_ENTERTAINMENT = "#00ff99", RADIO_CHANNEL_CTF_RED = "#ff0000", RADIO_CHANNEL_CTF_BLUE = "#0000ff", RADIO_CHANNEL_CTF_GREEN = "#00ff00", - RADIO_CHANNEL_CTF_YELLOW = "#d1ba22" + RADIO_CHANNEL_CTF_YELLOW = "#d1ba22", )) /datum/radio_frequency diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index 679a3182a57cd..16a6615497ce4 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -279,7 +279,7 @@ return data -/obj/machinery/pdapainter/ui_act(action, params) +/obj/machinery/pdapainter/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 45a75f06133dd..8a7e9846561be 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -686,10 +686,11 @@ return ..() /obj/machinery/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - add_fingerprint(usr) - update_last_used(usr) - if(HAS_AI_ACCESS(usr) && !GLOB.cameranet.checkTurfVis(get_turf(src))) //We check if they're an AI specifically here, so borgs can still access off-camera stuff. - to_chat(usr, span_warning("You can no longer connect to this device!")) + var/mob/user = ui.user + add_fingerprint(user) + update_last_used(user) + if(isAI(user) && !GLOB.cameranet.checkTurfVis(get_turf(src))) //We check if they're an AI specifically here, so borgs/adminghosts/human wand can still access off-camera stuff. + to_chat(user, span_warning("You can no longer connect to this device!")) return FALSE return ..() diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 07c3b0c057584..0a89c4e8b5b08 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -100,7 +100,7 @@ /obj/machinery/autolathe/proc/AfterMaterialInsert(container, obj/item/item_inserted, last_inserted_id, mats_consumed, amount_inserted, atom/context) SIGNAL_HANDLER - //we use initial(active_power_usage) because higher tier parts will have higher active usage but we have no benifit from it + //we use initial(active_power_usage) because higher tier parts will have higher active usage but we have no benefit from it if(directly_use_energy(ROUND_UP((amount_inserted / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * 0.4 * initial(active_power_usage)))) flick_overlay_view(mutable_appearance('icons/obj/machines/lathes.dmi', "autolathe_mat"), 1 SECONDS) diff --git a/code/game/machinery/barsigns.dm b/code/game/machinery/barsigns.dm index e59de18ffcb18..11dc005269b7b 100644 --- a/code/game/machinery/barsigns.dm +++ b/code/game/machinery/barsigns.dm @@ -425,7 +425,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign, 32) /datum/barsign/maltroach name = "Maltroach" icon_state = "maltroach" - desc = "Mothroaches politely greet you into the bar, or are they greeting eachother?" + desc = "Mothroaches politely greet you into the bar, or are they greeting each other?" neon_color = "#649e8a" /datum/barsign/rock_bottom diff --git a/code/game/machinery/big_manipulator.dm b/code/game/machinery/big_manipulator.dm new file mode 100644 index 0000000000000..8d2bde3e145ae --- /dev/null +++ b/code/game/machinery/big_manipulator.dm @@ -0,0 +1,282 @@ +/// Manipulator Core. Main part of the mechanism that carries out the entire process. +/obj/machinery/big_manipulator + name = "Big Manipulator" + desc = "Take and drop objects. Innovation..." + icon = 'icons/obj/machines/big_manipulator_parts/big_manipulator_core.dmi' + icon_state = "core" + density = TRUE + circuit = /obj/item/circuitboard/machine/big_manipulator + greyscale_colors = "#d8ce13" + greyscale_config = /datum/greyscale_config/big_manipulator + /// How many time manipulator need to take and drop item. + var/working_speed = 2 SECONDS + /// Using high tier manipulators speeds up big manipulator and requires more energy. + var/power_use_lvl = 0.2 + /// When manipulator already working with item inside he don't take any new items. + var/on_work = FALSE + /// Activate mechanism. + var/on = FALSE + /// Dir to get turf where we take items. + var/take_here = NORTH + /// Dir to get turf where we drop items. + var/drop_here = SOUTH + /// Turf where we take items. + var/turf/take_turf + /// Turf where we drop items. + var/turf/drop_turf + /// Obj inside manipulator. + var/datum/weakref/containment_obj + /// Other manipulator component. + var/obj/effect/manipulator_hand + +/obj/machinery/big_manipulator/Initialize(mapload) + . = ..() + take_and_drop_turfs_check() + create_manipulator_hand() + RegisterSignal(manipulator_hand, COMSIG_QDELETING, PROC_REF(on_hand_qdel)) + manipulator_lvl() + if(on) + press_on(pressed_by = null) + +/obj/machinery/big_manipulator/examine(mob/user) + . = ..() + . += "You can change direction with alternative wrench usage." + +/obj/machinery/big_manipulator/Destroy(force) + . = ..() + qdel(manipulator_hand) + if(isnull(containment_obj)) + return + var/obj/obj_resolve = containment_obj?.resolve() + obj_resolve?.forceMove(get_turf(obj_resolve)) + +/obj/machinery/big_manipulator/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + . = ..() + take_and_drop_turfs_check() + if(isnull(get_turf(src))) + qdel(manipulator_hand) + return + if(!manipulator_hand) + create_manipulator_hand() + +/obj/machinery/big_manipulator/wrench_act(mob/living/user, obj/item/tool) + . = ..() + default_unfasten_wrench(user, tool, time = 1 SECONDS) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/big_manipulator/wrench_act_secondary(mob/living/user, obj/item/tool) + . = ..() + if(on_work || on) + to_chat(user, span_warning("[src] is activated!")) + return ITEM_INTERACT_BLOCKING + rotate_big_hand() + playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/big_manipulator/can_be_unfasten_wrench(mob/user, silent) + if(on_work || on) + to_chat(user, span_warning("[src] is activated!")) + return FAILED_UNFASTEN + return ..() + +/obj/machinery/big_manipulator/default_unfasten_wrench(mob/user, obj/item/wrench, time) + . = ..() + if(. == SUCCESSFUL_UNFASTEN) + take_and_drop_turfs_check() + +/obj/machinery/big_manipulator/screwdriver_act(mob/living/user, obj/item/tool) + if(default_deconstruction_screwdriver(user, icon_state, icon_state, tool)) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING + +/obj/machinery/big_manipulator/crowbar_act(mob/living/user, obj/item/tool) + . = ..() + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING + +/obj/machinery/big_manipulator/RefreshParts() + . = ..() + + manipulator_lvl() + +/// Creat manipulator hand effect on manipulator core. +/obj/machinery/big_manipulator/proc/create_manipulator_hand() + manipulator_hand = new/obj/effect/big_manipulator_hand(src) + manipulator_hand.dir = take_here + vis_contents += manipulator_hand + +/// Check servo tier and change manipulator speed, power_use and colour. +/obj/machinery/big_manipulator/proc/manipulator_lvl() + var/datum/stock_part/servo/locate_servo = locate() in component_parts + if(!locate_servo) + return + switch(locate_servo.tier) + if(-INFINITY to 1) + working_speed = 2 SECONDS + power_use_lvl = 0.2 + set_greyscale(COLOR_YELLOW) + manipulator_hand?.set_greyscale(COLOR_YELLOW) + if(2) + working_speed = 1.4 SECONDS + power_use_lvl = 0.4 + set_greyscale(COLOR_ORANGE) + manipulator_hand?.set_greyscale(COLOR_ORANGE) + if(3) + working_speed = 0.8 SECONDS + power_use_lvl = 0.6 + set_greyscale(COLOR_RED) + manipulator_hand?.set_greyscale(COLOR_RED) + if(4 to INFINITY) + working_speed = 0.2 SECONDS + power_use_lvl = 0.8 + set_greyscale(COLOR_PURPLE) + manipulator_hand?.set_greyscale(COLOR_PURPLE) + + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * power_use_lvl + +/// Changing take and drop turf tiles when we anchore manipulator or if manipulator not in turf. +/obj/machinery/big_manipulator/proc/take_and_drop_turfs_check() + if(anchored && isturf(src.loc)) + take_turf = get_step(src, take_here) + drop_turf = get_step(src, drop_here) + else + take_turf = null + drop_turf = null + +/// Changing take and drop turf dirs and also changing manipulator hand sprite dir. +/obj/machinery/big_manipulator/proc/rotate_big_hand() + switch(take_here) + if(NORTH) + take_here = EAST + drop_here = WEST + if(EAST) + take_here = SOUTH + drop_here = NORTH + if(SOUTH) + take_here = WEST + drop_here = EAST + if(WEST) + take_here = NORTH + drop_here = SOUTH + manipulator_hand.dir = take_here + take_and_drop_turfs_check() + +/// Deliting hand will destroy our manipulator core. +/obj/machinery/big_manipulator/proc/on_hand_qdel() + SIGNAL_HANDLER + + deconstruct(TRUE) + +/// Pre take and drop proc from [take and drop procs loop]: +/// Check if we can start take and drop loop +/obj/machinery/big_manipulator/proc/is_work_check() + if(isclosedturf(drop_turf)) + on = !on + say("Output blocked") + return FALSE + for(var/obj/item/take_item in take_turf.contents) + try_take_thing(take_turf, take_item) + break + + return TRUE + +/// First take and drop proc from [take and drop procs loop]: +/// Check if we can take item from take_turf to work with him. This proc also calling from ATOM_ENTERED signal. +/obj/machinery/big_manipulator/proc/try_take_thing(datum/source, atom/movable/target) + SIGNAL_HANDLER + + if(!on) + return + if(!anchored) + return + if(QDELETED(source) || QDELETED(target)) + return + if(!isturf(target.loc)) + return + if(on_work) + return + if(!use_energy(active_power_usage, force = FALSE)) + on = FALSE + say("Not enough energy!") + return + if(isitem(target)) + start_work(target) + +/// Second take and drop proc from [take and drop procs loop]: +/// Taking our item and start manipulator hand rotate animation. +/obj/machinery/big_manipulator/proc/start_work(atom/movable/target) + target.forceMove(src) + containment_obj = WEAKREF(target) + on_work = TRUE + do_rotate_animation(1) + addtimer(CALLBACK(src, PROC_REF(drop_thing), target), working_speed) + +/// Third take and drop proc from [take and drop procs loop]: +/// Drop our item and start manipulator hand backward animation. +/obj/machinery/big_manipulator/proc/drop_thing(atom/movable/target) + target.forceMove(drop_turf) + do_rotate_animation(0) + addtimer(CALLBACK(src, PROC_REF(end_work)), working_speed) + +/// Fourth and last take and drop proc from [take and drop procs loop]: +/// Finishes work and begins to look for a new item for [take and drop procs loop]. +/obj/machinery/big_manipulator/proc/end_work() + on_work = FALSE + is_work_check() + +/// Rotates manipulator hand 90 degrees. +/obj/machinery/big_manipulator/proc/do_rotate_animation(backward) + animate(manipulator_hand, transform = matrix(90, MATRIX_ROTATE), working_speed*0.5) + addtimer(CALLBACK(src, PROC_REF(finish_rotate_animation), backward), working_speed*0.5) + +/// Rotates manipulator hand from 90 degrees to 180 or 0 if backward. +/obj/machinery/big_manipulator/proc/finish_rotate_animation(backward) + animate(manipulator_hand, transform = matrix(180 * backward, MATRIX_ROTATE), working_speed*0.5) + +/// Proc call when we press on/off button +/obj/machinery/big_manipulator/proc/press_on(pressed_by) + if(pressed_by) + on = !on + if(!is_work_check()) + return + if(on) + RegisterSignal(take_turf, COMSIG_ATOM_ENTERED, PROC_REF(try_take_thing)) + else + UnregisterSignal(take_turf, COMSIG_ATOM_ENTERED) + +/obj/machinery/big_manipulator/ui_interact(mob/user, datum/tgui/ui) + if(!anchored) + to_chat(user, span_warning("[src] isn't attached to the ground!")) + ui?.close() + return + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "BigManipulator") + ui.open() + +/obj/machinery/big_manipulator/ui_data(mob/user) + var/list/data = list() + data["active"] = on + return data + +/obj/machinery/big_manipulator/ui_act(action, params, datum/tgui/ui) + . = ..() + if(.) + return + switch(action) + if("on") + press_on(pressed_by = TRUE) + return TRUE + +/// Manipulator hand. Effect we animate to show that the manipulator is working and moving something. +/obj/effect/big_manipulator_hand + name = "Manipulator claw" + desc = "Take and drop objects. Innovation..." + icon = 'icons/obj/machines/big_manipulator_parts/big_manipulator_hand.dmi' + icon_state = "hand" + layer = LOW_ITEM_LAYER + anchored = TRUE + greyscale_config = /datum/greyscale_config/manipulator_hand + pixel_x = -32 + pixel_y = -32 diff --git a/code/game/machinery/civilian_bounties.dm b/code/game/machinery/civilian_bounties.dm index fa0d28c999c88..7760a646d9fae 100644 --- a/code/game/machinery/civilian_bounties.dm +++ b/code/game/machinery/civilian_bounties.dm @@ -151,7 +151,7 @@ say("Requesting ID card has no job assignment registered!") return FALSE var/list/datum/bounty/crumbs = list(random_bounty(pot_acc.account_job.bounty_types), // We want to offer 2 bounties from their appropriate job catagories - random_bounty(pot_acc.account_job.bounty_types), // and 1 guarenteed assistant bounty if the other 2 suck. + random_bounty(pot_acc.account_job.bounty_types), // and 1 guaranteed assistant bounty if the other 2 suck. random_bounty(CIV_JOB_BASIC)) COOLDOWN_START(pot_acc, bounty_timer, (5 MINUTES) - cooldown_reduction) pot_acc.bounties = crumbs @@ -203,7 +203,7 @@ return data -/obj/machinery/computer/piratepad_control/civilian/ui_act(action, params) +/obj/machinery/computer/piratepad_control/civilian/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index 3292cbf977b5f..6e1009def324f 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -135,6 +135,12 @@ . = ..() update_use_power(ACTIVE_POWER_USE) +/obj/machinery/computer/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + SHOULD_CALL_PARENT(TRUE) + . = ..() + if(!issilicon(ui.user)) + playsound(src, SFX_KEYBOARD_CLICKS, 10, TRUE, FALSE) + /obj/machinery/computer/ui_close(mob/user) SHOULD_CALL_PARENT(TRUE) . = ..() diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index ba3041cc4840c..e0a7f36460041 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -46,7 +46,7 @@ return data -/obj/machinery/computer/aifixer/ui_act(action, params) +/obj/machinery/computer/aifixer/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/computer/arcade/orion.dm b/code/game/machinery/computer/arcade/orion.dm index 85bebddd25c6d..3300370d18e49 100644 --- a/code/game/machinery/computer/arcade/orion.dm +++ b/code/game/machinery/computer/arcade/orion.dm @@ -181,7 +181,7 @@ return static_data -/obj/machinery/computer/arcade/orion_trail/ui_act(action, list/params) +/obj/machinery/computer/arcade/orion_trail/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index 5f3d7dd6e9e9d..3ed359a006296 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -28,7 +28,7 @@ return data -/obj/machinery/computer/atmos_alert/ui_act(action, params) +/obj/machinery/computer/atmos_alert/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/computer/atmos_computers/__identifiers.dm b/code/game/machinery/computer/atmos_computers/__identifiers.dm index 653f0fbaa3868..be1f01aecb549 100644 --- a/code/game/machinery/computer/atmos_computers/__identifiers.dm +++ b/code/game/machinery/computer/atmos_computers/__identifiers.dm @@ -1,7 +1,7 @@ // ATMOSIA GAS MONITOR SUITE TAGS // Things that use these include atmos control monitors, sensors, inputs, and outlets. // They last three adds _sensor, _in, and _out respectively to the id_tag variable. -// Dont put underscores here, we use them as delimiters. +// Don't put underscores here, we use them as delimiters. #define ATMOS_GAS_MONITOR_O2 GAS_O2 #define ATMOS_GAS_MONITOR_PLAS GAS_PLASMA diff --git a/code/game/machinery/computer/atmos_computers/_atmos_control.dm b/code/game/machinery/computer/atmos_computers/_atmos_control.dm index cdd0349ac85b9..25e51738611f1 100644 --- a/code/game/machinery/computer/atmos_computers/_atmos_control.dm +++ b/code/game/machinery/computer/atmos_computers/_atmos_control.dm @@ -152,7 +152,7 @@ data["chambers"] += list(chamber_info) return data -/obj/machinery/computer/atmos_control/ui_act(action, params) +/obj/machinery/computer/atmos_control/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(. || !(control || reconnecting)) return diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 5ee53dab7f47f..6c4d32658573a 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -116,7 +116,7 @@ // BANDASTATION EDIT END - Nanomap return data -/obj/machinery/computer/security/ui_act(action, params) +/obj/machinery/computer/security/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return @@ -124,7 +124,6 @@ if(action == "switch_camera") var/obj/machinery/camera/selected_camera = locate(params["camera"]) in GLOB.cameranet.cameras active_camera = selected_camera - playsound(src, SFX_TERMINAL_TYPE, 25, FALSE) if(isnull(active_camera)) return TRUE diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 45bfeb9fcef36..0e47a752b01d2 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -60,7 +60,7 @@ return ..() /obj/machinery/computer/camera_advanced/process() - if(!can_use(current_user) || (issilicon(current_user) && !current_user.has_unlimited_silicon_privilege)) + if(!can_use(current_user) || (issilicon(current_user) && !HAS_SILICON_ACCESS(current_user))) unset_machine() return PROCESS_KILL diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 8fb1e71f05ed7..d48b62977893c 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -142,7 +142,7 @@ playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE) return TRUE -/obj/machinery/computer/communications/ui_act(action, list/params) +/obj/machinery/computer/communications/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) var/static/list/approved_states = list(STATE_BUYING_SHUTTLE, STATE_CHANGING_STATUS, STATE_MAIN, STATE_MESSAGES) . = ..() @@ -152,11 +152,12 @@ if (!has_communication()) return + var/mob/user = ui.user . = TRUE switch (action) if ("answerMessage") - if (!authenticated(usr)) + if (!authenticated(user)) return var/answer_index = params["answer"] @@ -164,7 +165,7 @@ // If either of these aren't numbers, then bad voodoo. if(!isnum(answer_index) || !isnum(message_index)) - message_admins("[ADMIN_LOOKUPFLW(usr)] provided an invalid index type when replying to a message on [src] [ADMIN_JMP(src)]. This should not happen. Please check with a maintainer and/or consult tgui logs.") + message_admins("[ADMIN_LOOKUPFLW(user)] provided an invalid index type when replying to a message on [src] [ADMIN_JMP(src)]. This should not happen. Please check with a maintainer and/or consult tgui logs.") CRASH("Non-numeric index provided when answering comms console message.") if (!answer_index || !message_index || answer_index < 1 || message_index < 1) @@ -175,27 +176,27 @@ message.answered = answer_index message.answer_callback.InvokeAsync() if ("callShuttle") - if (!authenticated(usr) || syndicate) + if (!authenticated(user) || syndicate) return var/reason = trim(params["reason"], MAX_MESSAGE_LEN) if (length(reason) < CALL_SHUTTLE_REASON_LENGTH) return - SSshuttle.requestEvac(usr, reason) + SSshuttle.requestEvac(user, reason) post_status("shuttle") if ("changeSecurityLevel") - if (!authenticated_as_silicon_or_captain(usr)) + if (!authenticated_as_silicon_or_captain(user)) return // Check if they have - if (!HAS_SILICON_ACCESS(usr)) - var/obj/item/held_item = usr.get_active_held_item() + if (!HAS_SILICON_ACCESS(user)) + var/obj/item/held_item = user.get_active_held_item() var/obj/item/card/id/id_card = held_item?.GetID() if (!istype(id_card)) - to_chat(usr, span_warning("You need to swipe your ID!")) + to_chat(user, span_warning("You need to swipe your ID!")) playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) return if (!(ACCESS_CAPTAIN in id_card.access)) - to_chat(usr, span_warning("You are not authorized to do this!")) + to_chat(user, span_warning("You are not authorized to do this!")) playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) return @@ -207,28 +208,28 @@ SSsecurity_level.set_level(new_sec_level) - to_chat(usr, span_notice("Authorization confirmed. Modifying security level.")) + to_chat(user, span_notice("Authorization confirmed. Modifying security level.")) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) // Only notify people if an actual change happened - usr.log_message("changed the security level to [params["newSecurityLevel"]] with [src].", LOG_GAME) - message_admins("[ADMIN_LOOKUPFLW(usr)] has changed the security level to [params["newSecurityLevel"]] with [src] at [AREACOORD(usr)].") - deadchat_broadcast(" has changed the security level to [params["newSecurityLevel"]] with [src] at [span_name("[get_area_name(usr, TRUE)]")].", span_name("[usr.real_name]"), usr, message_type=DEADCHAT_ANNOUNCEMENT) + user.log_message("changed the security level to [params["newSecurityLevel"]] with [src].", LOG_GAME) + message_admins("[ADMIN_LOOKUPFLW(user)] has changed the security level to [params["newSecurityLevel"]] with [src] at [AREACOORD(user)].") + deadchat_broadcast(" has changed the security level to [params["newSecurityLevel"]] with [src] at [span_name("[get_area_name(user, TRUE)]")].", span_name("[user.real_name]"), user, message_type=DEADCHAT_ANNOUNCEMENT) alert_level_tick += 1 if ("deleteMessage") - if (!authenticated(usr)) + if (!authenticated(user)) return var/message_index = text2num(params["message"]) if (!message_index) return LAZYREMOVE(messages, LAZYACCESS(messages, message_index)) if ("makePriorityAnnouncement") - if (!authenticated_as_silicon_or_captain(usr) && !syndicate) + if (!authenticated_as_silicon_or_captain(user) && !syndicate) return - make_announcement(usr) + make_announcement(user) if ("messageAssociates") - if (!authenticated_as_non_silicon_captain(usr)) + if (!authenticated_as_non_silicon_captain(user)) return if (!COOLDOWN_FINISHED(src, important_action_cooldown)) return @@ -238,24 +239,24 @@ var/emagged = obj_flags & EMAGGED if (emagged) - message_syndicate(message, usr) - to_chat(usr, span_danger("SYSERR @l(19833)of(transmit.dm): !@$ MESSAGE TRANSMITTED TO SYNDICATE COMMAND.")) + message_syndicate(message, user) + to_chat(user, span_danger("SYSERR @l(19833)of(transmit.dm): !@$ MESSAGE TRANSMITTED TO SYNDICATE COMMAND.")) else if(syndicate) - message_syndicate(message, usr) - to_chat(usr, span_danger("Message transmitted to Syndicate Command.")) + message_syndicate(message, user) + to_chat(user, span_danger("Message transmitted to Syndicate Command.")) else - message_centcom(message, usr) - to_chat(usr, span_notice("Message transmitted to Central Command.")) + message_centcom(message, user) + to_chat(user, span_notice("Message transmitted to Central Command.")) var/associates = (emagged || syndicate) ? "the Syndicate": "CentCom" - usr.log_talk(message, LOG_SAY, tag = "message to [associates]") - deadchat_broadcast(" has messaged [associates], \"[message]\" at [span_name("[get_area_name(usr, TRUE)]")].", span_name("[usr.real_name]"), usr, message_type = DEADCHAT_ANNOUNCEMENT) + user.log_talk(message, LOG_SAY, tag = "message to [associates]") + deadchat_broadcast(" has messaged [associates], \"[message]\" at [span_name("[get_area_name(user, TRUE)]")].", span_name("[user.real_name]"), user, message_type = DEADCHAT_ANNOUNCEMENT) COOLDOWN_START(src, important_action_cooldown, IMPORTANT_ACTION_COOLDOWN) if ("purchaseShuttle") - var/can_buy_shuttles_or_fail_reason = can_buy_shuttles(usr) + var/can_buy_shuttles_or_fail_reason = can_buy_shuttles(user) if (can_buy_shuttles_or_fail_reason != TRUE) if (can_buy_shuttles_or_fail_reason != FALSE) - to_chat(usr, span_alert("[can_buy_shuttles_or_fail_reason]")) + to_chat(user, span_alert("[can_buy_shuttles_or_fail_reason]")) return var/list/shuttles = flatten_list(SSmapping.shuttle_templates) var/datum/map_template/shuttle/shuttle = locate(params["shuttle"]) in shuttles @@ -264,7 +265,7 @@ if (!can_purchase_this_shuttle(shuttle)) return if (!shuttle.prerequisites_met()) - to_chat(usr, span_alert("You have not met the requirements for purchasing this shuttle.")) + to_chat(user, span_alert("You have not met the requirements for purchasing this shuttle.")) return var/datum/bank_account/bank_account = SSeconomy.get_dep_account(ACCOUNT_CAR) if (bank_account.account_balance < shuttle.credit_cost) @@ -277,42 +278,42 @@ SSshuttle.action_load(shuttle, replace = TRUE) bank_account.adjust_money(-shuttle.credit_cost) - var/purchaser_name = (obj_flags & EMAGGED) ? scramble_message_replace_chars("AUTHENTICATION FAILURE: CVE-2018-17107", 60) : usr.real_name + var/purchaser_name = (obj_flags & EMAGGED) ? scramble_message_replace_chars("AUTHENTICATION FAILURE: CVE-2018-17107", 60) : user.real_name minor_announce("[purchaser_name] has purchased [shuttle.name] for [shuttle.credit_cost] credits.[shuttle.extra_desc ? " [shuttle.extra_desc]" : ""]" , "Shuttle Purchase") - message_admins("[ADMIN_LOOKUPFLW(usr)] purchased [shuttle.name].") - log_shuttle("[key_name(usr)] has purchased [shuttle.name].") + message_admins("[ADMIN_LOOKUPFLW(user)] purchased [shuttle.name].") + log_shuttle("[key_name(user)] has purchased [shuttle.name].") SSblackbox.record_feedback("text", "shuttle_purchase", 1, shuttle.name) state = STATE_MAIN if ("recallShuttle") // AIs cannot recall the shuttle - if (!authenticated(usr) || HAS_SILICON_ACCESS(usr) || syndicate) + if (!authenticated(user) || HAS_SILICON_ACCESS(user) || syndicate) return - SSshuttle.cancelEvac(usr) + SSshuttle.cancelEvac(user) if ("requestNukeCodes") - if (!authenticated_as_non_silicon_captain(usr)) + if (!authenticated_as_non_silicon_captain(user)) return if (!COOLDOWN_FINISHED(src, important_action_cooldown)) return var/reason = trim(html_encode(params["reason"]), MAX_MESSAGE_LEN) - nuke_request(reason, usr) - to_chat(usr, span_notice("Request sent.")) - usr.log_message("has requested the nuclear codes from CentCom with reason \"[reason]\"", LOG_SAY) - priority_announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self-Destruct Codes Requested", SSstation.announcer.get_rand_report_sound()) + nuke_request(reason, user) + to_chat(user, span_notice("Request sent.")) + user.log_message("has requested the nuclear codes from CentCom with reason \"[reason]\"", LOG_SAY) + priority_announce("The codes for the on-station nuclear self-destruct have been requested by [user]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self-Destruct Codes Requested", SSstation.announcer.get_rand_report_sound()) playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) COOLDOWN_START(src, important_action_cooldown, IMPORTANT_ACTION_COOLDOWN) if ("restoreBackupRoutingData") - if (!authenticated_as_non_silicon_captain(usr)) + if (!authenticated_as_non_silicon_captain(user)) return if (!(obj_flags & EMAGGED)) return - to_chat(usr, span_notice("Backup routing data restored.")) + to_chat(user, span_notice("Backup routing data restored.")) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) obj_flags &= ~EMAGGED if ("sendToOtherSector") - if (!authenticated_as_non_silicon_captain(usr)) + if (!authenticated_as_non_silicon_captain(user)) return - if (!can_send_messages_to_other_sectors(usr)) + if (!can_send_messages_to_other_sectors(user)) return if (!COOLDOWN_FINISHED(src, important_action_cooldown)) return @@ -324,54 +325,52 @@ GLOB.communications_controller.soft_filtering = FALSE var/list/hard_filter_result = is_ic_filtered(message) if(hard_filter_result) - tgui_alert(usr, "Your message contains: (\"[hard_filter_result[CHAT_FILTER_INDEX_WORD]]\"), which is not allowed on this server.") + tgui_alert(user, "Your message contains: (\"[hard_filter_result[CHAT_FILTER_INDEX_WORD]]\"), which is not allowed on this server.") return var/list/soft_filter_result = is_soft_ooc_filtered(message) if(soft_filter_result) - if(tgui_alert(usr,"Your message contains \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". \"[soft_filter_result[CHAT_FILTER_INDEX_REASON]]\", Are you sure you want to use it?", "Soft Blocked Word", list("Yes", "No")) != "Yes") + if(tgui_alert(user,"Your message contains \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". \"[soft_filter_result[CHAT_FILTER_INDEX_REASON]]\", Are you sure you want to use it?", "Soft Blocked Word", list("Yes", "No")) != "Yes") return - message_admins("[ADMIN_LOOKUPFLW(usr)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". They may be using a disallowed term for a cross-station message. Increasing delay time to reject.\n\n Message: \"[html_encode(message)]\"") - log_admin_private("[key_name(usr)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". They may be using a disallowed term for a cross-station message. Increasing delay time to reject.\n\n Message: \"[message]\"") + message_admins("[ADMIN_LOOKUPFLW(user)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". They may be using a disallowed term for a cross-station message. Increasing delay time to reject.\n\n Message: \"[html_encode(message)]\"") + log_admin_private("[key_name(user)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". They may be using a disallowed term for a cross-station message. Increasing delay time to reject.\n\n Message: \"[message]\"") GLOB.communications_controller.soft_filtering = TRUE playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) var/destination = params["destination"] - usr.log_message("is about to send the following message to [destination]: [message]", LOG_GAME) + user.log_message("is about to send the following message to [destination]: [message]", LOG_GAME) to_chat( GLOB.admins, span_adminnotice( \ - "CROSS-SECTOR MESSAGE (OUTGOING): [ADMIN_LOOKUPFLW(usr)] is about to send \ + "CROSS-SECTOR MESSAGE (OUTGOING): [ADMIN_LOOKUPFLW(user)] is about to send \ the following message to [destination] (will autoapprove in [GLOB.communications_controller.soft_filtering ? DisplayTimeText(EXTENDED_CROSS_SECTOR_CANCEL_TIME) : DisplayTimeText(CROSS_SECTOR_CANCEL_TIME)]): \ REJECT
\ [html_encode(message)]" \ ) ) - send_cross_comms_message_timer = addtimer(CALLBACK(src, PROC_REF(send_cross_comms_message), usr, destination, message), GLOB.communications_controller.soft_filtering ? EXTENDED_CROSS_SECTOR_CANCEL_TIME : CROSS_SECTOR_CANCEL_TIME, TIMER_STOPPABLE) + send_cross_comms_message_timer = addtimer(CALLBACK(src, PROC_REF(send_cross_comms_message), user, destination, message), GLOB.communications_controller.soft_filtering ? EXTENDED_CROSS_SECTOR_CANCEL_TIME : CROSS_SECTOR_CANCEL_TIME, TIMER_STOPPABLE) COOLDOWN_START(src, important_action_cooldown, IMPORTANT_ACTION_COOLDOWN) if ("setState") - if (!authenticated(usr)) + if (!authenticated(user)) return if (!(params["state"] in approved_states)) return - if (state == STATE_BUYING_SHUTTLE && can_buy_shuttles(usr) != TRUE) + if (state == STATE_BUYING_SHUTTLE && can_buy_shuttles(user) != TRUE) return set_state(usr, params["state"]) - playsound(src, SFX_TERMINAL_TYPE, 50, FALSE) if ("setStatusMessage") - if (!authenticated(usr)) + if (!authenticated(user)) return var/line_one = reject_bad_text(params["upperText"] || "", MAX_STATUS_LINE_LENGTH) var/line_two = reject_bad_text(params["lowerText"] || "", MAX_STATUS_LINE_LENGTH) post_status("message", line_one, line_two) last_status_display = list(line_one, line_two) - playsound(src, SFX_TERMINAL_TYPE, 50, FALSE) if ("setStatusPicture") - if (!authenticated(usr)) + if (!authenticated(user)) return var/picture = params["picture"] if (!(picture in GLOB.status_display_approved_pictures)) @@ -384,7 +383,6 @@ else post_status("alert", picture) - playsound(src, SFX_TERMINAL_TYPE, 50, FALSE) if ("toggleAuthentication") // Log out if we're logged in if (authorize_name) @@ -398,10 +396,10 @@ authenticated = TRUE authorize_access = SSid_access.get_region_access_list(list(REGION_ALL_STATION)) authorize_name = "Unknown" - to_chat(usr, span_warning("[src] lets out a quiet alarm as its login is overridden.")) + to_chat(user, span_warning("[src] lets out a quiet alarm as its login is overridden.")) playsound(src, 'sound/machines/terminal_alert.ogg', 25, FALSE) - else if(isliving(usr)) - var/mob/living/L = usr + else if(isliving(user)) + var/mob/living/L = user var/obj/item/card/id/id_card = L.get_idcard(hand_first = TRUE) if (check_access(id_card)) authenticated = TRUE @@ -413,36 +411,36 @@ imprint_gps(gps_tag = "Encrypted Communications Channel") if ("toggleEmergencyAccess") - if(emergency_access_cooldown(usr)) //if were in cooldown, dont allow the following code + if(emergency_access_cooldown(user)) //if were in cooldown, dont allow the following code return - if (!authenticated_as_silicon_or_captain(usr)) + if (!authenticated_as_silicon_or_captain(user)) return if (GLOB.emergency_access) revoke_maint_all_access() - usr.log_message("disabled emergency maintenance access.", LOG_GAME) - message_admins("[ADMIN_LOOKUPFLW(usr)] disabled emergency maintenance access.") - deadchat_broadcast(" disabled emergency maintenance access at [span_name("[get_area_name(usr, TRUE)]")].", span_name("[usr.real_name]"), usr, message_type = DEADCHAT_ANNOUNCEMENT) + user.log_message("disabled emergency maintenance access.", LOG_GAME) + message_admins("[ADMIN_LOOKUPFLW(user)] disabled emergency maintenance access.") + deadchat_broadcast(" disabled emergency maintenance access at [span_name("[get_area_name(user, TRUE)]")].", span_name("[user.real_name]"), user, message_type = DEADCHAT_ANNOUNCEMENT) else make_maint_all_access() - usr.log_message("enabled emergency maintenance access.", LOG_GAME) - message_admins("[ADMIN_LOOKUPFLW(usr)] enabled emergency maintenance access.") - deadchat_broadcast(" enabled emergency maintenance access at [span_name("[get_area_name(usr, TRUE)]")].", span_name("[usr.real_name]"), usr, message_type = DEADCHAT_ANNOUNCEMENT) + user.log_message("enabled emergency maintenance access.", LOG_GAME) + message_admins("[ADMIN_LOOKUPFLW(user)] enabled emergency maintenance access.") + deadchat_broadcast(" enabled emergency maintenance access at [span_name("[get_area_name(user, TRUE)]")].", span_name("[user.real_name]"), user, message_type = DEADCHAT_ANNOUNCEMENT) // Request codes for the Captain's Spare ID safe. if("requestSafeCodes") if(SSjob.assigned_captain) - to_chat(usr, span_warning("There is already an assigned Captain or Acting Captain on deck!")) + to_chat(user, span_warning("There is already an assigned Captain or Acting Captain on deck!")) return if(SSjob.safe_code_timer_id) - to_chat(usr, span_warning("The safe code has already been requested and is being delivered to your station!")) + to_chat(user, span_warning("The safe code has already been requested and is being delivered to your station!")) return if(SSjob.safe_code_requested) - to_chat(usr, span_warning("The safe code has already been requested and delivered to your station!")) + to_chat(user, span_warning("The safe code has already been requested and delivered to your station!")) return if(!SSid_access.spare_id_safe_code) - to_chat(usr, span_warning("There is no safe code to deliver to your station!")) + to_chat(user, span_warning("There is no safe code to deliver to your station!")) return var/turf/pod_location = get_turf(src) @@ -475,7 +473,7 @@ var/list/payload = list() - payload["sender_ckey"] = usr.ckey + payload["sender_ckey"] = user.ckey var/network_name = CONFIG_GET(string/cross_comms_network) if(network_name) payload["network"] = network_name @@ -484,9 +482,9 @@ send2otherserver(html_decode(station_name()), message, "Comms_Console", destination == "all" ? null : list(destination), additional_data = payload) minor_announce(message, title = "Outgoing message to allied station") - usr.log_talk(message, LOG_SAY, tag = "message to the other server") - message_admins("[ADMIN_LOOKUPFLW(usr)] has sent a message to the other server\[s].") - deadchat_broadcast(" has sent an outgoing message to the other station(s).", "[usr.real_name]", usr, message_type = DEADCHAT_ANNOUNCEMENT) + user.log_talk(message, LOG_SAY, tag = "message to the other server") + message_admins("[ADMIN_LOOKUPFLW(user)] has sent a message to the other server\[s].") + deadchat_broadcast(" has sent an outgoing message to the other station(s).", "[user.real_name]", user, message_type = DEADCHAT_ANNOUNCEMENT) GLOB.communications_controller.soft_filtering = FALSE // set it to false at the end of the proc to ensure that everything prior reads as intended /obj/machinery/computer/communications/ui_data(mob/user) @@ -742,7 +740,7 @@ var/list/players = get_communication_players() GLOB.communications_controller.make_announcement(user, is_ai, input, syndicate || (obj_flags & EMAGGED), players) - deadchat_broadcast(" made a priority announcement from [span_name("[get_area_name(usr, TRUE)]")].", span_name("[user.real_name]"), user, message_type=DEADCHAT_ANNOUNCEMENT) + deadchat_broadcast(" made a priority announcement from [span_name("[get_area_name(user, TRUE)]")].", span_name("[user.real_name]"), user, message_type=DEADCHAT_ANNOUNCEMENT) /obj/machinery/computer/communications/proc/get_communication_players() return GLOB.player_list diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 268b675871ab2..b5e5a915ce2bf 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -182,7 +182,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) z = T.z . = list( "sensors" = update_data(z), - "link_allowed" = HAS_AI_ACCESS(user) + "link_allowed" = HAS_AI_ACCESS(user), ) /datum/crewmonitor/proc/update_data(z) @@ -274,7 +274,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) return results -/datum/crewmonitor/ui_act(action, params) +/datum/crewmonitor/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 41c46c0cb205b..e1612ae7ef2e5 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -398,7 +398,7 @@ return data -/obj/machinery/computer/scan_consolenew/ui_act(action, list/params) +/obj/machinery/computer/scan_consolenew/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) var/static/list/gene_letters = list("A", "T", "C", "G"); var/static/gene_letter_count = length(gene_letters) diff --git a/code/game/machinery/computer/launchpad_control.dm b/code/game/machinery/computer/launchpad_control.dm index 7c6d1307b76b1..1502e5af50621 100644 --- a/code/game/machinery/computer/launchpad_control.dm +++ b/code/game/machinery/computer/launchpad_control.dm @@ -116,7 +116,7 @@ return data -/obj/machinery/computer/launchpad/ui_act(action, params) +/obj/machinery/computer/launchpad/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/computer/mechlaunchpad.dm b/code/game/machinery/computer/mechlaunchpad.dm index 46c0045fb3568..050f3447a8ce4 100644 --- a/code/game/machinery/computer/mechlaunchpad.dm +++ b/code/game/machinery/computer/mechlaunchpad.dm @@ -205,7 +205,7 @@ data["mechonly"] = current_pad.mech_only return data -/obj/machinery/computer/mechpad/ui_act(action, params) +/obj/machinery/computer/mechpad/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/computer/operating_computer.dm b/code/game/machinery/computer/operating_computer.dm index 43a18c7081f30..0354806d85ebd 100644 --- a/code/game/machinery/computer/operating_computer.dm +++ b/code/game/machinery/computer/operating_computer.dm @@ -163,7 +163,7 @@ )) return data -/obj/machinery/computer/operating/ui_act(action, params) +/obj/machinery/computer/operating/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/computer/orders/order_computer/mining_order.dm b/code/game/machinery/computer/orders/order_computer/mining_order.dm index 7e7eabcc1bfd5..94fda727d5f79 100644 --- a/code/game/machinery/computer/orders/order_computer/mining_order.dm +++ b/code/game/machinery/computer/orders/order_computer/mining_order.dm @@ -62,7 +62,7 @@ /obj/machinery/computer/order_console/mining/retrieve_points(obj/item/card/id/id_card) return round(id_card.registered_account.mining_points) -/obj/machinery/computer/order_console/mining/ui_act(action, params) +/obj/machinery/computer/order_console/mining/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(!.) flick("mining-deny", src) @@ -121,7 +121,7 @@ /obj/machinery/computer/order_console/mining/proc/check_menu(obj/item/mining_voucher/voucher, mob/living/redeemer) if(!istype(redeemer)) return FALSE - if(redeemer.incapacitated()) + if(redeemer.incapacitated) return FALSE if(QDELETED(voucher)) return FALSE diff --git a/code/game/machinery/computer/orders/order_computer/order_computer.dm b/code/game/machinery/computer/orders/order_computer/order_computer.dm index b3644efeeff68..1b20e876ce583 100644 --- a/code/game/machinery/computer/orders/order_computer/order_computer.dm +++ b/code/game/machinery/computer/orders/order_computer/order_computer.dm @@ -124,7 +124,7 @@ GLOBAL_LIST_EMPTY(order_console_products) )) return data -/obj/machinery/computer/order_console/ui_act(action, params) +/obj/machinery/computer/order_console/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 4cc32401704d2..798f20c21a8f0 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -78,7 +78,7 @@ break return data -/obj/machinery/computer/pod/ui_act(action, list/params) +/obj/machinery/computer/pod/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/computer/prisoner/gulag_teleporter.dm b/code/game/machinery/computer/prisoner/gulag_teleporter.dm index 4c2f4dacde3f2..f03c08a8d821b 100644 --- a/code/game/machinery/computer/prisoner/gulag_teleporter.dm +++ b/code/game/machinery/computer/prisoner/gulag_teleporter.dm @@ -67,7 +67,7 @@ return data -/obj/machinery/computer/prisoner/gulag_teleporter_computer/ui_act(action, list/params) +/obj/machinery/computer/prisoner/gulag_teleporter_computer/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/computer/prisoner/management.dm b/code/game/machinery/computer/prisoner/management.dm index ada71bad02304..32c2ddba984df 100644 --- a/code/game/machinery/computer/prisoner/management.dm +++ b/code/game/machinery/computer/prisoner/management.dm @@ -20,7 +20,7 @@ GLOBAL_LIST_EMPTY_TYPED(tracked_implants, /obj/item/implant) /obj/machinery/computer/prisoner/management/ui_data(mob/user) var/list/data = list() - data["authorized"] = (authenticated && isliving(user)) || isAdminGhostAI(user) || issilicon(user) + data["authorized"] = (authenticated && isliving(user)) || HAS_SILICON_ACCESS(user) data["inserted_id"] = null if(!isnull(contained_id)) data["inserted_id"] = list( @@ -43,7 +43,7 @@ GLOBAL_LIST_EMPTY_TYPED(tracked_implants, /obj/item/implant) return data -/obj/machinery/computer/prisoner/management/ui_act(action, list/params) +/obj/machinery/computer/prisoner/management/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/computer/records/records.dm b/code/game/machinery/computer/records/records.dm index e8d8beef854dd..d53895300438d 100644 --- a/code/game/machinery/computer/records/records.dm +++ b/code/game/machinery/computer/records/records.dm @@ -100,7 +100,6 @@ if(!target) return FALSE - playsound(src, SFX_TERMINAL_TYPE, 50, TRUE) update_preview(user, params["assigned_view"], target) return TRUE diff --git a/code/game/machinery/computer/records/security.dm b/code/game/machinery/computer/records/security.dm index dac62612a4c74..bdfa996dad68f 100644 --- a/code/game/machinery/computer/records/security.dm +++ b/code/game/machinery/computer/records/security.dm @@ -102,6 +102,7 @@ paid = warrant.paid, time = warrant.time, valid = warrant.valid, + voider = warrant.voider, )) var/list/crimes = list() @@ -113,6 +114,7 @@ name = crime.name, time = crime.time, valid = crime.valid, + voider = crime.voider, )) records += list(list( @@ -250,8 +252,8 @@ editing_crime.name = new_name return TRUE - if(params["details"] && length(params["description"]) > 2 && params["name"] != editing_crime.name) - var/new_details = strip_html_full(params["details"], MAX_MESSAGE_LEN) + if(params["description"] && length(params["description"]) > 2 && params["name"] != editing_crime.name) + var/new_details = strip_html_full(params["description"], MAX_MESSAGE_LEN) investigate_log("[user] edited crime \"[editing_crime.name]\" for target: \"[target.name]\", changing the details to: \"[new_details]\" from: \"[editing_crime.details]\".", INVESTIGATE_RECORDS) editing_crime.details = new_details return TRUE @@ -269,6 +271,9 @@ /// Only qualified personnel can edit records. /obj/machinery/computer/records/security/proc/has_armory_access(mob/user) + if (HAS_SILICON_ACCESS(user)) + return TRUE + if(!isliving(user)) return FALSE var/mob/living/player = user @@ -284,16 +289,22 @@ /// Voids crimes, or sets someone to discharged if they have none left. /obj/machinery/computer/records/security/proc/invalidate_crime(mob/user, datum/record/crew/target, list/params) - if(!has_armory_access(user)) - return FALSE var/datum/crime/to_void = locate(params["crime_ref"]) in target.crimes + var/acquitted = TRUE if(!to_void) + to_void = locate(params["crime_ref"]) in target.citations + // No need to change status after invalidatation of citation + acquitted = FALSE + if(!to_void) + return FALSE + + if(user != to_void.author && !has_armory_access(user)) return FALSE to_void.valid = FALSE + to_void.voider = user investigate_log("[key_name(user)] has invalidated [target.name]'s crime: [to_void.name]", INVESTIGATE_RECORDS) - var/acquitted = TRUE for(var/datum/crime/incident in target.crimes) if(!incident.valid) continue diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 0c8b6e58d6e7e..12aa1c3ce0362 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -81,7 +81,7 @@ return data -/obj/machinery/computer/robotics/ui_act(action, params) +/obj/machinery/computer/robotics/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index d00c5824d8bd3..8cd12610c748b 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -84,7 +84,7 @@ power_station.teleporter_hub.update_appearance() power_station.teleporter_hub.calibrated = FALSE -/obj/machinery/computer/teleporter/ui_act(action, params) +/obj/machinery/computer/teleporter/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/computer/telescreen.dm b/code/game/machinery/computer/telescreen.dm index deca4ec8245e1..6058d3bf131ab 100644 --- a/code/game/machinery/computer/telescreen.dm +++ b/code/game/machinery/computer/telescreen.dm @@ -40,6 +40,8 @@ circuit = null interaction_flags_atom = INTERACT_ATOM_UI_INTERACT | INTERACT_ATOM_NO_FINGERPRINT_INTERACT | INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND | INTERACT_MACHINE_REQUIRES_SIGHT frame_type = /obj/item/wallframe/telescreen/entertainment + /// Virtual radio inside of the entertainment monitor to broadcast audio + var/obj/item/radio/entertainment/speakers/speakers var/icon_state_off = "entertainment_blank" var/icon_state_on = "entertainment" @@ -55,8 +57,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai . = ..() RegisterSignal(src, COMSIG_CLICK, PROC_REF(BigClick)) find_and_hang_on_wall() + speakers = new(src) -// Bypass clickchain to allow humans to use the telescreen from a distance +/obj/machinery/computer/security/telescreen/entertainment/Destroy() + . = ..() + QDEL_NULL(speakers) + +/// Bypass clickchain to allow humans to use the telescreen from a distance /obj/machinery/computer/security/telescreen/entertainment/proc/BigClick() SIGNAL_HANDLER @@ -66,7 +73,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai INVOKE_ASYNC(src, TYPE_PROC_REF(/atom, interact), usr) -///Sets the monitor's icon to the selected state, and says an announcement +/// Sets the monitor's icon to the selected state, and says an announcement /obj/machinery/computer/security/telescreen/entertainment/proc/notify(on, announcement) if(on && icon_state == icon_state_off) icon_state = icon_state_on diff --git a/code/game/machinery/computer/warrant.dm b/code/game/machinery/computer/warrant.dm index 1e3557f76f046..3b73a8b75bfea 100644 --- a/code/game/machinery/computer/warrant.dm +++ b/code/game/machinery/computer/warrant.dm @@ -133,6 +133,7 @@ return TRUE warrant.alert_owner(user, src, target.name, "One of your outstanding warrants has been completely paid.") + warrant.valid = FALSE return TRUE /// Finishes printing, resets the printer. diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 45daa1966a635..d2e3c895ebd1d 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -67,7 +67,7 @@ /obj/machinery/jukebox/ui_data(mob/user) return music_player.get_ui_data() -/obj/machinery/jukebox/ui_act(action, list/params) +/obj/machinery/jukebox/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm index b386ebb376f57..74ca492657b6e 100644 --- a/code/game/machinery/dish_drive.dm +++ b/code/game/machinery/dish_drive.dm @@ -12,7 +12,6 @@ interaction_flags_click = ALLOW_SILICON_REACH /// List of dishes the drive can hold var/static/list/collectable_items = list( - /obj/item/trash/waffles, /obj/item/broken_bottle, /obj/item/kitchen/fork, /obj/item/plate, @@ -24,7 +23,6 @@ ) /// List of items the drive detects as trash var/static/list/disposable_items = list( - /obj/item/trash/waffles, /obj/item/broken_bottle, /obj/item/plate_shard, /obj/item/shard, diff --git a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm index d24a951d76b52..bd8734643f898 100644 --- a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm +++ b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm @@ -1,6 +1,6 @@ /* * Tier one entries are unlocked at the start, and are for dna mutants that are: - * - easy to aquire (rats) + * - easy to acquire (rats) * - have a bonus for getting past a threshold * - might serve a job purpose for others (goliath) and thus should be gainable early enough */ diff --git a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_two_entries.dm b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_two_entries.dm index 5eb13847bb5a0..1620607d5f09c 100644 --- a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_two_entries.dm +++ b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_two_entries.dm @@ -1,6 +1,6 @@ /* * Tier two entries are unlocked after infusing someone/being infused and achieving a bonus, and are for dna mutants that are: - * - harder to aquire (gondolas) but not *necessarily* requiring job help + * - harder to acquire (gondolas) but not *necessarily* requiring job help * - have a bonus for getting past a threshold * * todos for the future: diff --git a/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm b/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm index aa3e9441d84a0..10fcae90a9591 100644 --- a/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm @@ -58,11 +58,12 @@ var/datum/species/rec_species = human_receiver.dna.species rec_species.update_no_equip_flags(tongue_owner, rec_species.no_equip_flags | ITEM_SLOT_MASK) -/obj/item/organ/internal/tongue/carp/on_bodypart_insert(obj/item/bodypart/limb) +/obj/item/organ/internal/tongue/carp/on_bodypart_insert(obj/item/bodypart/head) . = ..() - limb.unarmed_damage_low = 10 - limb.unarmed_damage_high = 15 - limb.unarmed_effectiveness = 15 + head.unarmed_damage_low = 10 + head.unarmed_damage_high = 15 + head.unarmed_effectiveness = 15 + head.unarmed_attack_effect = ATTACK_EFFECT_BITE /obj/item/organ/internal/tongue/carp/on_mob_remove(mob/living/carbon/tongue_owner) . = ..() @@ -76,10 +77,10 @@ /obj/item/organ/internal/tongue/carp/on_bodypart_remove(obj/item/bodypart/head) . = ..() - head.unarmed_damage_low = initial(head.unarmed_damage_low) head.unarmed_damage_high = initial(head.unarmed_damage_high) head.unarmed_effectiveness = initial(head.unarmed_effectiveness) + head.unarmed_attack_effect = initial(head.unarmed_attack_effect) /obj/item/organ/internal/tongue/carp/on_life(seconds_per_tick, times_fired) . = ..() diff --git a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm index e3e7112b0fec9..4786bf5753c9f 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm @@ -125,7 +125,6 @@ //useless organs we throw in just to fuck with surgeons a bit more. they aren't part of a bonus, just the (absolute) state of flies /obj/item/organ/internal/fly desc = FLY_INFUSED_ORGAN_DESC - visual = FALSE /obj/item/organ/internal/fly/Initialize(mapload) . = ..() diff --git a/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm index ab33c1ad57ef3..3fecac3bb6dbf 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm @@ -6,17 +6,4 @@ visual = TRUE damage_multiplier = 2 -/obj/item/organ/internal/ears/fox/on_mob_insert(mob/living/carbon/human/ear_owner) - . = ..() - if(istype(ear_owner) && ear_owner.dna) - color = ear_owner.hair_color - ear_owner.dna.features["ears"] = ear_owner.dna.species.mutant_bodyparts["ears"] = "Fox" - ear_owner.dna.update_uf_block(DNA_EARS_BLOCK) - ear_owner.update_body() - -/obj/item/organ/internal/ears/fox/on_mob_remove(mob/living/carbon/human/ear_owner) - . = ..() - if(istype(ear_owner) && ear_owner.dna) - color = ear_owner.hair_color - ear_owner.dna.species.mutant_bodyparts -= "ears" - ear_owner.update_body() + sprite_accessory_override = /datum/sprite_accessory/ears/fox diff --git a/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm b/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm index 797c7839b2c29..9fcf7e483bba9 100644 --- a/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm @@ -34,7 +34,7 @@ Fluoride Stare: After someone says 5 words, blah blah blah... AddElement(/datum/element/noticable_organ, "%PRONOUN_They radiate%PRONOUN_s an aura of serenity.") AddElement(/datum/element/update_icon_blocker) -/obj/item/organ/internal/heart/gondola/Insert(mob/living/carbon/receiver, special, movement_flags) +/obj/item/organ/internal/heart/gondola/mob_insert(mob/living/carbon/receiver, special, movement_flags) . = ..() if(!(FACTION_HOSTILE in receiver.faction)) factions_to_remove += FACTION_HOSTILE @@ -42,7 +42,7 @@ Fluoride Stare: After someone says 5 words, blah blah blah... factions_to_remove += FACTION_MINING receiver.faction |= list(FACTION_HOSTILE, FACTION_MINING) -/obj/item/organ/internal/heart/gondola/Remove(mob/living/carbon/heartless, special, movement_flags) +/obj/item/organ/internal/heart/gondola/mob_remove(mob/living/carbon/heartless, special, movement_flags) . = ..() for(var/faction in factions_to_remove) heartless.faction -= faction @@ -64,11 +64,11 @@ Fluoride Stare: After someone says 5 words, blah blah blah... AddElement(/datum/element/noticable_organ, "%PRONOUN_Their mouth is permanently affixed into a relaxed smile.", BODY_ZONE_PRECISE_MOUTH) AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/gondola) -/obj/item/organ/internal/tongue/gondola/Insert(mob/living/carbon/tongue_owner, special, movement_flags) +/obj/item/organ/internal/tongue/gondola/mob_insert(mob/living/carbon/tongue_owner, special, movement_flags) . = ..() tongue_owner.add_mood_event("gondola_zen", /datum/mood_event/gondola_serenity) -/obj/item/organ/internal/tongue/gondola/Remove(mob/living/carbon/tongue_owner, special, movement_flags) +/obj/item/organ/internal/tongue/gondola/mob_remove(mob/living/carbon/tongue_owner, special, movement_flags) tongue_owner.clear_mood_event("gondola_zen") return ..() @@ -87,7 +87,7 @@ Fluoride Stare: After someone says 5 words, blah blah blah... AddElement(/datum/element/noticable_organ, "%PRONOUN_Their left arm has small needles breaching the skin all over it.", BODY_ZONE_L_ARM) AddElement(/datum/element/noticable_organ, "%PRONOUN_Their right arm has small needles breaching the skin all over it.", BODY_ZONE_R_ARM) -/obj/item/organ/internal/liver/gondola/Insert(mob/living/carbon/liver_owner, special, movement_flags) +/obj/item/organ/internal/liver/gondola/mob_insert(mob/living/carbon/liver_owner, special, movement_flags) . = ..() var/has_left = liver_owner.has_left_hand(check_disabled = FALSE) var/has_right = liver_owner.has_right_hand(check_disabled = FALSE) @@ -102,7 +102,7 @@ Fluoride Stare: After someone says 5 words, blah blah blah... RegisterSignal(liver_owner, COMSIG_LIVING_TRY_PULL, PROC_REF(on_owner_try_pull)) RegisterSignal(liver_owner, COMSIG_CARBON_HELPED, PROC_REF(on_hug)) -/obj/item/organ/internal/liver/gondola/Remove(mob/living/carbon/liver_owner, special, movement_flags) +/obj/item/organ/internal/liver/gondola/mob_remove(mob/living/carbon/liver_owner, special, movement_flags) . = ..() UnregisterSignal(liver_owner, list(COMSIG_HUMAN_EQUIPPING_ITEM, COMSIG_LIVING_TRY_PULL, COMSIG_CARBON_HELPED)) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 7188ba7c8353a..a33895e5569b7 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1660,7 +1660,7 @@ data["wires"] = wire return data -/obj/machinery/door/airlock/ui_act(action, params) +/obj/machinery/door/airlock/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 73ae0994eb517..2973579153a84 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -109,7 +109,7 @@ var/new_cycle_id = trim(params["passedCycleId"], 30) passed_cycle_id = new_cycle_id -/obj/item/electronics/airlock/ui_act(action, params) +/obj/item/electronics/airlock/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 26dc09204a70c..10aa52cfd7bed 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -214,7 +214,7 @@ break return data -/obj/machinery/status_display/door_timer/ui_act(action, params) +/obj/machinery/status_display/door_timer/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 601ad67a6e9a4..d75b5e17174c5 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -371,6 +371,12 @@ return TRUE return ..() +/obj/machinery/door/item_interaction_secondary(mob/living/user, obj/item/tool, list/modifiers) + // allows you to crowbar doors while in combat mode + if(user.combat_mode && tool.tool_behaviour == TOOL_CROWBAR) + return crowbar_act_secondary(user, tool) + return ..() + /obj/machinery/door/welder_act_secondary(mob/living/user, obj/item/tool) try_to_weld_secondary(tool, user) return ITEM_INTERACT_SUCCESS @@ -605,6 +611,10 @@ /obj/machinery/door/morgue icon = 'icons/obj/doors/doormorgue.dmi' +/obj/machinery/door/morgue/Initialize(mapload) + . = ..() + AddComponent(/datum/component/redirect_attack_hand_from_turf) + /obj/machinery/door/get_dumping_location() return null diff --git a/code/game/machinery/embedded_controller/airlock_controller.dm b/code/game/machinery/embedded_controller/airlock_controller.dm index a1cc608c2ec9d..18e880902963d 100644 --- a/code/game/machinery/embedded_controller/airlock_controller.dm +++ b/code/game/machinery/embedded_controller/airlock_controller.dm @@ -244,7 +244,7 @@ return data -/obj/machinery/airlock_controller/ui_act(action, params) +/obj/machinery/airlock_controller/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/flatpacker.dm b/code/game/machinery/flatpacker.dm index 182db1edc08d9..01224ad8b00fa 100644 --- a/code/game/machinery/flatpacker.dm +++ b/code/game/machinery/flatpacker.dm @@ -112,7 +112,7 @@ /obj/machinery/flatpacker/proc/AfterMaterialInsert(container, obj/item/item_inserted, last_inserted_id, mats_consumed, amount_inserted, atom/context) SIGNAL_HANDLER - //we use initial(active_power_usage) because higher tier parts will have higher active usage but we have no benifit from it + //we use initial(active_power_usage) because higher tier parts will have higher active usage but we have no benefit from it if(directly_use_energy(ROUND_UP((amount_inserted / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * 0.4 * initial(active_power_usage)))) flick_overlay_view(mutable_appearance('icons/obj/machines/lathes.dmi', "flatpacker_bar"), 1 SECONDS) @@ -292,7 +292,7 @@ if(isnull(amount)) return - //we use initial(active_power_usage) because higher tier parts will have higher active usage but we have no benifit from it + //we use initial(active_power_usage) because higher tier parts will have higher active usage but we have no benefit from it if(!directly_use_energy(ROUND_UP((amount / MAX_STACK_SIZE) * 0.4 * initial(active_power_usage)))) say("No power to dispense sheets") return diff --git a/code/game/machinery/gulag_item_reclaimer.dm b/code/game/machinery/gulag_item_reclaimer.dm index 72ac0e746f4b0..93f60beeb8a14 100644 --- a/code/game/machinery/gulag_item_reclaimer.dm +++ b/code/game/machinery/gulag_item_reclaimer.dm @@ -82,7 +82,7 @@ return data -/obj/machinery/gulag_item_reclaimer/ui_act(action, params) +/obj/machinery/gulag_item_reclaimer/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index cbb7eede250b9..bf3d97426fd24 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -168,7 +168,7 @@ Possible to do for anyone motivated enough: /obj/machinery/holopad/tutorial/attack_hand(mob/user, list/modifiers) if(!istype(user)) return - if(user.incapacitated() || !is_operational) + if(user.incapacitated || !is_operational) return if(replay_mode) replay_stop() @@ -308,7 +308,7 @@ Possible to do for anyone motivated enough: data["holo_calls"] += list(call_data) return data -/obj/machinery/holopad/ui_act(action, list/params) +/obj/machinery/holopad/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return @@ -675,7 +675,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ if(!isliving(owner)) return TRUE var/mob/living/user = owner - if(user.incapacitated() || !user.client) + if(user.incapacitated || !user.client) return FALSE return TRUE diff --git a/code/game/machinery/hypnochair.dm b/code/game/machinery/hypnochair.dm index f8f3ed49be598..b5ec2c58b3870 100644 --- a/code/game/machinery/hypnochair.dm +++ b/code/game/machinery/hypnochair.dm @@ -63,7 +63,7 @@ return data -/obj/machinery/hypnochair/ui_act(action, params) +/obj/machinery/hypnochair/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 4ac2a177e76bc..e1b10dae6e43e 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -106,7 +106,7 @@ .["containerMaxVolume"] = drip_reagents.maximum_volume .["containerReagentColor"] = mix_color_from_reagents(drip_reagents.reagent_list) -/obj/machinery/iv_drip/ui_act(action, params) +/obj/machinery/iv_drip/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return @@ -322,7 +322,7 @@ return if(!usr.can_perform_action(src)) return - if(usr.incapacitated()) + if(usr.incapacitated) return if(reagent_container) if(attached) @@ -340,7 +340,7 @@ if(!isliving(usr)) to_chat(usr, span_warning("You can't do that!")) return - if(!usr.can_perform_action(src) || usr.incapacitated()) + if(!usr.can_perform_action(src) || usr.incapacitated) return if(inject_only) mode = IV_INJECTING diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index 8733ca548632e..67ad91681506d 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -417,7 +417,7 @@ return pad.doteleport(user, sending) -/obj/item/launchpad_remote/ui_act(action, params) +/obj/item/launchpad_remote/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index b63d13648eb76..cd36dcce09ad0 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -149,7 +149,7 @@ if(user.combat_mode) //so we can hit the machine return ..() -/obj/machinery/limbgrower/ui_act(action, list/params) +/obj/machinery/limbgrower/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return @@ -233,7 +233,7 @@ */ /obj/machinery/limbgrower/proc/build_limb(buildpath) /// The limb we're making with our buildpath, so we can edit it. - //i need to create a body part manually using a set icon (otherwise it doesnt appear) + //i need to create a body part manually using a set icon (otherwise it doesn't appear) var/obj/item/bodypart/limb limb = new buildpath(loc) limb.name = "\improper synthetic [selected_category] [limb.plaintext_zone]" diff --git a/code/game/machinery/machine_frame.dm b/code/game/machinery/machine_frame.dm index ccdcddc87052d..d39d065232426 100644 --- a/code/game/machinery/machine_frame.dm +++ b/code/game/machinery/machine_frame.dm @@ -454,7 +454,7 @@ var/obj/item/circuitboard/machine/leaving_circuit = circuit circuit = null // Assign the circuit & parts & move them all at once into the machine - // no need to seperatly move circuit board as its already part of the components list + // no need to separately move circuit board as its already part of the components list new_machine.circuit = leaving_circuit new_machine.component_parts = components for (var/obj/new_part in components) diff --git a/code/game/machinery/modular_shield.dm b/code/game/machinery/modular_shield.dm index cac65a032dff4..b4fa6bed17bb0 100644 --- a/code/game/machinery/modular_shield.dm +++ b/code/game/machinery/modular_shield.dm @@ -1,22 +1,22 @@ /obj/machinery/modular_shield_generator name = "modular shield generator" - desc = "A forcefield generator, it seems more stationary than its cousins. It cant handle G-force and will require frequent reboots when built on mobile craft." + desc = "A forcefield generator, it seems more stationary than its cousins. It can't handle G-force and will require frequent reboots when built on mobile craft." icon = 'icons/obj/machines/modular_shield_generator.dmi' icon_state = "gen_recovering_closed" density = TRUE circuit = /obj/item/circuitboard/machine/modular_shield_generator processing_flags = START_PROCESSING_ON_INIT - ///Doesnt actually control it, just tells us if its running or not, you can control by calling procs activate_shields and deactivate_shields + ///Doesn't actually control it, just tells us if its running or not, you can control by calling procs activate_shields and deactivate_shields var/active = FALSE ///If the generator is currently spawning the forcefield in var/initiating = FALSE - ///Determins if we can turn it on or not, no longer recovering when back to max strength + ///Determines if we can turn it on or not, no longer recovering when back to max strength var/recovering = TRUE - ///Determins max health of the shield + ///Determines max health of the shield var/max_strength = 40 ///Current health of shield @@ -28,13 +28,13 @@ ///The regeneration that the shield can support var/current_regeneration - ///Determins the max radius the shield can support + ///Determines the max radius the shield can support var/max_radius = 3 ///Current radius the shield is set to, minimum 3 var/radius = 3 - ///Determins if we only generate a shield on space turfs or not + ///Determines if we only generate a shield on space turfs or not var/exterior_only = FALSE ///The lazy list of shields that are ours @@ -276,7 +276,7 @@ data["initiating_field"] = initiating return data -/obj/machinery/modular_shield_generator/ui_act(action, params) +/obj/machinery/modular_shield_generator/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return @@ -286,7 +286,7 @@ return var/change_radius = max(1,(text2num(params["new_radius"]))) if(change_radius >= 10) - radius = round(change_radius)//if its over 10 we dont allow decimals + radius = round(change_radius)//if its over 10 we don't allow decimals return radius = change_radius @@ -370,7 +370,7 @@ recovering = FALSE calculate_regeneration() update_icon_state() - end_processing() //we dont care about continuing to update the alpha, we want to show history of damage to show its unstable + end_processing() //we don't care about continuing to update the alpha, we want to show history of damage to show its unstable if (active) var/random_num = rand(1,deployed_shields.len) var/obj/structure/emergency_shield/modular/random_shield = deployed_shields[random_num] @@ -383,7 +383,7 @@ /obj/machinery/modular_shield/module name = "modular shield debugger" //Filler name and sprite for testing - desc = "This is filler for testing you shouldn`t see this." + desc = "This is filler for testing you shouldn't see this." icon = 'icons/obj/machines/mech_bay.dmi' icon_state = "recharge_port" density = TRUE @@ -677,7 +677,7 @@ color = "#00ffff" density = FALSE alpha = 100 - resistance_flags = INDESTRUCTIBLE //the shield itself is indestructible or atleast should be + resistance_flags = INDESTRUCTIBLE //the shield itself is indestructible or at least should be no_damage_feedback = "weakening the generator sustaining it" ///The shield generator sustaining us diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index c15421cbf5abb..f6f4270835ca0 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -181,16 +181,17 @@ data["static_controls"] = static_controls return data -/obj/machinery/navbeacon/ui_act(action, params) +/obj/machinery/navbeacon/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return + var/mob/user = ui.user - if(action == "lock" && allowed(usr)) + if(action == "lock" && allowed(user)) controls_locked = !controls_locked return TRUE - if(controls_locked && !HAS_SILICON_ACCESS(usr)) + if(controls_locked && !HAS_SILICON_ACCESS(user)) return switch(action) @@ -210,7 +211,7 @@ toggle_code(NAVBEACON_DELIVERY_MODE) return TRUE if("set_location") - var/input_text = tgui_input_text(usr, "Enter the beacon's location tag", "Beacon Location", location, 20) + var/input_text = tgui_input_text(user, "Enter the beacon's location tag", "Beacon Location", location, 20) if (!input_text || location == input_text) return glob_lists_deregister() @@ -219,7 +220,7 @@ return TRUE if("set_patrol_next") var/next_patrol = codes[NAVBEACON_PATROL_NEXT] - var/input_text = tgui_input_text(usr, "Enter the tag of the next patrol location", "Beacon Location", next_patrol, 20) + var/input_text = tgui_input_text(user, "Enter the tag of the next patrol location", "Beacon Location", next_patrol, 20) if (!input_text || location == input_text) return codes[NAVBEACON_PATROL_NEXT] = input_text diff --git a/code/game/machinery/newscaster/newscaster_data.dm b/code/game/machinery/newscaster/newscaster_data.dm index 94449808857e1..89e491532c458 100644 --- a/code/game/machinery/newscaster/newscaster_data.dm +++ b/code/game/machinery/newscaster/newscaster_data.dm @@ -107,17 +107,17 @@ GLOBAL_LIST_EMPTY(request_list) channel_ID = random_channel_id_setup() /** - * This proc assigns each feed_channel a random integer, from 1-999 as a unique identifer. + * This proc assigns each feed_channel a random integer, from 1-999 as a unique identifier. * Using this value, the TGUI window has a unique identifier to attach to messages that can be used to reattach them * to their parent channels back in dreammaker. - * Based on implementation, we're limiting outselves to only 998 player made channels maximum. How we'd use all of them, I don't know. + * Based on implementation, we're limiting ourselves to only 998 player made channels maximum. How we'd use all of them, I don't know. */ /datum/feed_channel/proc/random_channel_id_setup() if(!GLOB.news_network) return //Should only apply to channels made before setup is finished, use hardset_channel for these if(!GLOB.news_network.channel_IDs) GLOB.news_network.channel_IDs += rand(1,999) - return //This will almost always be the station annoucements channel here. + return //This will almost always be the station announcements channel here. var/channel_id for(var/i in 1 to 10000) channel_id = rand(1, 999) @@ -155,7 +155,7 @@ GLOBAL_LIST_EMPTY(request_list) var/active /// What is the criminal in question's name? Not a mob reference as this is a text field. var/criminal - /// Message body used to describe what crime has been comitted. + /// Message body used to describe what crime has been committed. var/body /// Who was it that created this wanted message? var/scanned_user @@ -181,7 +181,7 @@ GLOBAL_LIST_EMPTY(request_list) var/message_count = 0 /datum/feed_network/New() - create_feed_channel("Station Announcements", "SS13", "Company news, staff annoucements, and all the latest information. Have a secure shift!", locked = TRUE, hardset_channel = 1000) + create_feed_channel("Station Announcements", "SS13", "Company news, staff announcements, and all the latest information. Have a secure shift!", locked = TRUE, hardset_channel = 1000) wanted_issue = new /datum/wanted_message /datum/feed_network/proc/create_feed_channel(channel_name, author, desc, locked, adminChannel = FALSE, hardset_channel) diff --git a/code/game/machinery/newscaster/newscaster_machine.dm b/code/game/machinery/newscaster/newscaster_machine.dm index 7f3d8ea806f46..3186d2081e5a7 100644 --- a/code/game/machinery/newscaster/newscaster_machine.dm +++ b/code/game/machinery/newscaster/newscaster_machine.dm @@ -64,7 +64,7 @@ acid = 30 /obj/machinery/newscaster/pai/ui_state(mob/user) - return GLOB.reverse_contained_state + return GLOB.deep_inventory_state MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) @@ -264,7 +264,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) return data -/obj/machinery/newscaster/ui_act(action, params) +/obj/machinery/newscaster/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/newscaster/newspaper.dm b/code/game/machinery/newscaster/newspaper.dm index 2bd8187b9f8c0..c381f2f506304 100644 --- a/code/game/machinery/newscaster/newspaper.dm +++ b/code/game/machinery/newscaster/newspaper.dm @@ -132,6 +132,15 @@ /// Called when someone tries to figure out what our identity is, but they can't see it because of the newspaper /obj/item/newspaper/proc/holder_checked_name(mob/living/carbon/human/source, list/identity) SIGNAL_HANDLER + + var/newspaper_obscurity_priority = 100 // how powerful obscuring your appearance with a newspaper is + if(identity[VISIBLE_NAME_FORCED]) + if(identity[VISIBLE_NAME_FORCED] > newspaper_obscurity_priority) // the other set forced name is forcier than breaking news + return + else if(identity[VISIBLE_NAME_FORCED] == newspaper_obscurity_priority) + stack_trace("A name-setting signal operation ([identity[VISIBLE_NAME_FACE]]) has a priority collision with [src].") + else + identity[VISIBLE_NAME_FORCED] = newspaper_obscurity_priority identity[VISIBLE_NAME_FACE] = "" identity[VISIBLE_NAME_ID] = "" diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index ef18dc6b068ae..39d6fe7d2ea0c 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -175,7 +175,7 @@ Buildable meters set name = "Invert Pipe" set src in view(1) - if ( usr.incapacitated() ) + if ( usr.incapacitated ) return do_a_flip() diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index eb5b499bce79e..1e90b270c8c8d 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -62,7 +62,7 @@ data["init_directions"] = init_directions return data -/obj/machinery/pipedispenser/ui_act(action, params) +/obj/machinery/pipedispenser/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) if(..()) return switch(action) @@ -187,6 +187,9 @@ //Allow you to drag-drop disposal pipes and transit tubes into it /obj/machinery/pipedispenser/disposal/mouse_drop_receive(obj/structure/pipe, mob/user, params) + if(user.incapacitated) + return + if (!istype(pipe, /obj/structure/disposalconstruct) && !istype(pipe, /obj/structure/c_transit_tube) && !istype(pipe, /obj/structure/c_transit_tube_pod)) return diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index c9694730a3f8a..b1b5fc2b8f8d6 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -264,7 +264,7 @@ DEFINE_BITFIELD(turret_flags, list( data["allow_manual_control"] = TRUE return data -/obj/machinery/porta_turret/ui_act(action, list/params) +/obj/machinery/porta_turret/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return @@ -1025,34 +1025,36 @@ DEFINE_BITFIELD(turret_flags, list( /obj/machinery/turretid/ui_data(mob/user) var/list/data = list() data["locked"] = locked - data["siliconUser"] = user.has_unlimited_silicon_privilege + data["siliconUser"] = HAS_SILICON_ACCESS(user) data["enabled"] = enabled data["lethal"] = lethal data["shootCyborgs"] = shoot_cyborgs return data -/obj/machinery/turretid/ui_act(action, list/params) +/obj/machinery/turretid/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return + var/mob/user = ui.user + switch(action) if("lock") - if(!usr.has_unlimited_silicon_privilege) + if(!HAS_SILICON_ACCESS(user)) return if((obj_flags & EMAGGED) || (machine_stat & BROKEN)) - to_chat(usr, span_warning("The turret control is unresponsive!")) + to_chat(user, span_warning("The turret control is unresponsive!")) return locked = !locked return TRUE if("power") - toggle_on(usr) + toggle_on(user) return TRUE if("mode") - toggle_lethal(usr) + toggle_lethal(user) return TRUE if("shoot_silicons") - shoot_silicons(usr) + shoot_silicons(user) return TRUE /obj/machinery/turretid/proc/toggle_lethal(mob/user) diff --git a/code/game/machinery/portagrav.dm b/code/game/machinery/portagrav.dm new file mode 100644 index 0000000000000..c970fa5f8f1c6 --- /dev/null +++ b/code/game/machinery/portagrav.dm @@ -0,0 +1,268 @@ +/obj/machinery/power/portagrav + anchored = FALSE + density = TRUE + interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON + icon = 'icons/obj/machines/gravity_generator.dmi' + icon_state = "portagrav" + base_icon_state = "portagrav" + name = "Portable Gravity Unit" + desc = "Generates gravity around itself. Powered by wire or cell. Must be anchored before use." + max_integrity = 250 + circuit = /obj/item/circuitboard/machine/portagrav + armor_type = /datum/armor/portable_gravity + interaction_flags_click = ALLOW_SILICON_REACH + //We don't use area power + use_power = NO_POWER_USE + ///The cell we spawn with + var/obj/item/stock_parts/power_store/cell/cell = /obj/item/stock_parts/power_store/cell/high + ///Is the machine on? + var/on = FALSE + /// do we use power from wire instead + var/wire_mode = FALSE + /// our gravity field + var/datum/proximity_monitor/advanced/gravity/subtle_effect/gravity_field + /// strength of our gravity + var/grav_strength = STANDARD_GRAVITY + /// gravity range + var/range = 4 + /// max gravity range + var/max_range = 6 + /// draw per range + var/draw_per_range = BASE_MACHINE_ACTIVE_CONSUMPTION + +/datum/armor/portable_gravity + fire = 100 + melee = 10 + bomb = 40 + +/obj/machinery/power/portagrav/Initialize(mapload) + . = ..() + if(ispath(cell)) + cell = new cell(src) + if(anchored && wire_mode) + connect_to_network() + + AddElement( \ + /datum/element/contextual_screentip_bare_hands, \ + rmb_text = "Toggle power", \ + ) + + var/static/list/tool_behaviors = list( + TOOL_WRENCH = list( + SCREENTIP_CONTEXT_LMB = "Anchor", + ), + ) + AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) + +/obj/machinery/power/portagrav/Destroy() + . = ..() + cell = null + +/obj/machinery/power/portagrav/update_overlays() + . = ..() + if(anchored) + . += "portagrav_anchors" + if(on) + . += "portagrav_o" + . += "activated" + +/obj/machinery/power/portagrav/examine(mob/user) + . = ..() + . += "It is [on ? "on" : "off"]." + . += "The charge meter reads: [!isnull(cell) ? "[round(cell.percent(), 1)]%" : "NO CELL"]." + . += "It is[anchored ? "" : " not"] anchored." + if(in_range(user, src) || isobserver(user)) + . += span_notice("Right-click to toggle [on ? "off" : "on"].") + +/obj/machinery/power/portagrav/RefreshParts() + . = ..() + var/power_usage = initial(draw_per_range) + for(var/datum/stock_part/micro_laser/laser in component_parts) + power_usage -= BASE_MACHINE_ACTIVE_CONSUMPTION / 10 * (laser.tier - 1) + draw_per_range = power_usage + var/new_range = 4 + for(var/datum/stock_part/capacitor/capacitor in component_parts) + new_range += capacitor.tier + max_range = new_range + update_field() + +/obj/machinery/power/portagrav/screwdriver_act(mob/living/user, obj/item/tool) + . = NONE + if(default_deconstruction_screwdriver(user, "[base_icon_state]_o", base_icon_state, tool)) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/power/portagrav/crowbar_act(mob/living/user, obj/item/tool) + . = NONE + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/power/portagrav/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + . = NONE + if(!istype(tool, /obj/item/stock_parts/power_store/cell)) + return + if(!panel_open) + balloon_alert(user, "must open panel!") + return ITEM_INTERACT_BLOCKING + if(cell) + balloon_alert(user, "already has a cell!") + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_FAILURE + cell = tool + return ITEM_INTERACT_SUCCESS + +/obj/machinery/power/portagrav/should_have_node() + return anchored + +/obj/machinery/power/portagrav/connect_to_network() + if(!anchored) + return FALSE + . = ..() + +/obj/machinery/power/portagrav/wrench_act(mob/living/user, obj/item/tool) + . = ..() + if(on) + balloon_alert(user, "turn off first!") + return + default_unfasten_wrench(user, tool) + if(anchored && wire_mode) + connect_to_network() + else + disconnect_from_network() + update_appearance() + return ITEM_INTERACT_SUCCESS + +/obj/machinery/power/portagrav/get_cell() + return cell + +/obj/machinery/power/portagrav/attack_hand(mob/living/carbon/user, list/modifiers) + . = ..() + if(!panel_open || isnull(cell) || !istype(user) || user.combat_mode) + return + if(user.put_in_hands(cell)) + cell = null + +/obj/machinery/power/portagrav/attack_hand_secondary(mob/user, list/modifiers) + if(!can_interact(user)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + toggle_on(user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/machinery/power/portagrav/emag_act(mob/user, obj/item/card/emag/emag_card) + if(obj_flags & EMAGGED) + return FALSE + obj_flags |= EMAGGED + visible_message(span_warning("Sparks fly out of [src]!")) + if(user) + balloon_alert(user, "unsafe gravity unlocked") + user.log_message("emagged [src].", LOG_ATTACK) + playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + return TRUE + +/obj/machinery/power/portagrav/proc/toggle_on(mob/user) + if(on) + turn_off(user) + else + turn_on(user) + +/obj/machinery/power/portagrav/proc/turn_on(mob/user) + if(!anchored) + if(!isnull(user)) + balloon_alert(user, "not anchored!") + return FALSE + if((!wire_mode && cell?.charge < draw_per_range * range) || (wire_mode && surplus() < draw_per_range * range)) + if(!isnull(user)) + balloon_alert(user, "not enough power!") + return FALSE + if(!isnull(user)) + balloon_alert(user, "turned on") + on = TRUE + START_PROCESSING(SSmachines, src) + gravity_field = new(src, range = src.range, gravity = grav_strength) + update_appearance() + +/obj/machinery/power/portagrav/proc/turn_off(mob/user) + on = FALSE + if(!isnull(user)) + balloon_alert(user, "turned off") + STOP_PROCESSING(SSmachines, src) + QDEL_NULL(gravity_field) + update_appearance() + +/obj/machinery/power/portagrav/process(seconds_per_tick) + if(!on || !anchored) + return PROCESS_KILL + if(wire_mode) + if(powernet && surplus() >= draw_per_range * range) + add_load(draw_per_range * range) + else + turn_off() + else + if(!cell?.use(draw_per_range * range)) + turn_off() + +/obj/machinery/power/portagrav/proc/update_field() + if(isnull(gravity_field)) + return + gravity_field.set_range(range) + gravity_field.gravity_value = grav_strength + gravity_field.recalculate_field(full_recalc = TRUE) + +/obj/machinery/power/portagrav/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Portagrav", name) + ui.open() + +/obj/machinery/power/portagrav/ui_data(mob/user) + . = list() + if(!isnull(cell)) + .["percentage"] = (cell.charge / cell.maxcharge) * 100 + .["gravity"] = grav_strength + .["range"] = range + .["maxrange"] = max_range + .["on"] = on + .["wiremode"] = wire_mode + .["draw"] = display_power(draw_per_range * range) + +/obj/machinery/power/portagrav/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + playsound(src, 'sound/machines/terminal_button07.ogg', 45, TRUE) + switch(action) + if("adjust_grav") + var/adjustment = text2num(params["adjustment"]) + if(isnull(adjustment)) + return + var/bonus = (obj_flags & EMAGGED) ? 2 : 0 + // REPLACE 0 with NEGATIVE_GRAVITY ONCE NEGATIVE GRAVITY IS SOMETHING ACTUALLY FUNCTIONAL + var/result = clamp(grav_strength + adjustment, 0, GRAVITY_DAMAGE_THRESHOLD - 1 + bonus) + if(result == grav_strength) + return + grav_strength = result + update_field() + return TRUE + if("toggle_power") + toggle_on(usr) + return TRUE + if("toggle_wire") + wire_mode = !wire_mode + if(wire_mode && anchored) + connect_to_network() + else + disconnect_from_network() + return TRUE + if("adjust_range") + var/adjustment = text2num(params["adjustment"]) + if(isnull(adjustment)) + return + var/result = clamp(range + adjustment, 0, max_range) + if(result == range) + return + range = result + update_field() + return TRUE + +/obj/machinery/power/portagrav/anchored + anchored = TRUE diff --git a/code/game/machinery/roulette_machine.dm b/code/game/machinery/roulette_machine.dm index 2a8dc8bb49b22..bb43b7a46db9e 100644 --- a/code/game/machinery/roulette_machine.dm +++ b/code/game/machinery/roulette_machine.dm @@ -98,7 +98,7 @@ return data -/obj/machinery/roulette/ui_act(action, params) +/obj/machinery/roulette/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/satellite/satellite_control.dm b/code/game/machinery/satellite/satellite_control.dm index c0875d9e26a6b..9983cc439e366 100644 --- a/code/game/machinery/satellite/satellite_control.dm +++ b/code/game/machinery/satellite/satellite_control.dm @@ -11,7 +11,7 @@ ui = new(user, src, "SatelliteControl", name) ui.open() -/obj/machinery/computer/sat_control/ui_act(action, params) +/obj/machinery/computer/sat_control/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/scanner_gate.dm b/code/game/machinery/scanner_gate.dm index fd99f3ccfb8a3..85d816543926b 100644 --- a/code/game/machinery/scanner_gate.dm +++ b/code/game/machinery/scanner_gate.dm @@ -331,7 +331,7 @@ data["contraband_enabled"] = !!n_spect return data -/obj/machinery/scanner_gate/ui_act(action, params) +/obj/machinery/scanner_gate/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/sleepers.dm b/code/game/machinery/sleepers.dm index 63291035e784f..9b843cd550612 100644 --- a/code/game/machinery/sleepers.dm +++ b/code/game/machinery/sleepers.dm @@ -237,7 +237,7 @@ return data -/obj/machinery/sleeper/ui_act(action, params) +/obj/machinery/sleeper/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return @@ -300,17 +300,21 @@ * Can be controlled from the inside and can be deconstructed. */ /obj/machinery/sleeper/syndie + name = "syndicate sleeper" icon_state = "sleeper_s" base_icon_state = "sleeper_s" controls_inside = TRUE deconstructable = TRUE + circuit = /obj/item/circuitboard/machine/sleeper/syndie ///Fully upgraded variant, the circuit using tier 4 parts. /obj/machinery/sleeper/syndie/fullupgrade + name = "upgraded syndicate sleeper" circuit = /obj/item/circuitboard/machine/sleeper/fullupgrade ///Fully upgraded, not deconstructable, while using the normal sprite. /obj/machinery/sleeper/syndie/fullupgrade/nt + name = "\improper Nanotrasen sleeper" icon_state = "sleeper" base_icon_state = "sleeper" deconstructable = FALSE diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index bb93b7d00f5b6..41aa0876169ed 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -109,7 +109,7 @@ else if(!user.temporarilyRemoveItemFromInventory(inserted_coin)) return ITEM_INTERACT_BLOCKING - balloon_alert(user, "coin insterted") + balloon_alert(user, "coin inserted") balance += inserted_coin.value qdel(inserted_coin) return ITEM_INTERACT_SUCCESS diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index af6221d89219d..cbd5dbb84e37c 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -262,7 +262,7 @@ data["currentTemp"] = round(current_temperature - T0C, 1) return data -/obj/machinery/space_heater/ui_act(action, params) +/obj/machinery/space_heater/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return @@ -387,7 +387,7 @@ .["beaker"] = beaker .["currentTemp"] = beaker ? (round(beaker.reagents.chem_temp - T0C)) : "N/A" -/obj/machinery/space_heater/improvised_chem_heater/ui_act(action, params) +/obj/machinery/space_heater/improvised_chem_heater/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/stasis.dm b/code/game/machinery/stasis.dm index 9ef3d8e3a99a9..bf33530b93e3e 100644 --- a/code/game/machinery/stasis.dm +++ b/code/game/machinery/stasis.dm @@ -9,6 +9,7 @@ obj_flags = BLOCKS_CONSTRUCTION can_buckle = TRUE buckle_lying = 90 + buckle_dir = SOUTH circuit = /obj/item/circuitboard/machine/stasis fair_market_price = 10 payment_department = ACCOUNT_MED @@ -22,6 +23,7 @@ /obj/machinery/stasis/Initialize(mapload) . = ..() AddElement(/datum/element/elevation, pixel_shift = 6) + update_buckle_vars(dir) /obj/machinery/stasis/examine(mob/user) . = ..() @@ -57,6 +59,13 @@ thaw_them(L) return ..() +/obj/machinery/stasis/setDir(newdir) + . = ..() + update_buckle_vars(newdir) + +/obj/machinery/stasis/proc/update_buckle_vars(newdir) + buckle_lying = newdir & NORTHEAST ? 270 : 90 + /obj/machinery/stasis/proc/stasis_running() return stasis_enabled && is_operational diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 6b04b2c6f340d..3232dc524ab89 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -230,7 +230,7 @@ /obj/machinery/suit_storage_unit/update_overlays() . = ..() - //if things arent powered, these show anyways + //if things aren't powered, these show anyways if(panel_open) . += "[base_icon_state]_panel" if(state_open) @@ -793,7 +793,7 @@ */ /obj/machinery/suit_storage_unit/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) if(screwdriver.tool_behaviour == TOOL_SCREWDRIVER && (uv || locked)) - to_chat(user, span_warning("You cant open the panel while its [locked ? "locked" : "decontaminating"]")) + to_chat(user, span_warning("You can't open the panel while its [locked ? "locked" : "decontaminating"]")) return TRUE return ..() diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 3a7cc849acd30..0ac1f7ee44df8 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -621,7 +621,7 @@ balloon_alert(user, "set to [chosen_theme?.name || DIMENSION_CHOICE_RANDOM]") /obj/item/bombcore/dimensional/proc/check_menu(mob/user) - if(!user.is_holding(src) || user.incapacitated()) + if(!user.is_holding(src) || user.incapacitated) return FALSE return TRUE diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm index 2c31dcbd98955..06d390e5f2e27 100644 --- a/code/game/machinery/telecomms/broadcasting.dm +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -155,7 +155,7 @@ if (TRANSMISSION_SUPERSPACE) // Only radios which are independent for(var/obj/item/radio/independent_radio in GLOB.all_radios["[frequency]"]) - if(independent_radio.independent && independent_radio.can_receive(frequency, signal_reaches_every_z_level)) + if((independent_radio.special_channels & RADIO_SPECIAL_CENTCOM) && independent_radio.can_receive(frequency, signal_reaches_every_z_level)) radios += independent_radio for(var/obj/item/radio/called_radio as anything in radios) diff --git a/code/game/machinery/telecomms/computers/logbrowser.dm b/code/game/machinery/telecomms/computers/logbrowser.dm index 25b5ddd212710..22a41a6ada66b 100644 --- a/code/game/machinery/telecomms/computers/logbrowser.dm +++ b/code/game/machinery/telecomms/computers/logbrowser.dm @@ -95,7 +95,7 @@ return data -/obj/machinery/computer/telecomms/server/ui_act(action, params) +/obj/machinery/computer/telecomms/server/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm index a38f18231fb76..05186da8bc08c 100644 --- a/code/game/machinery/telecomms/computers/message.dm +++ b/code/game/machinery/telecomms/computers/message.dm @@ -117,7 +117,7 @@ data["requests"] = request_list return data -/obj/machinery/computer/message_monitor/ui_act(action, params) +/obj/machinery/computer/message_monitor/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return . diff --git a/code/game/machinery/telecomms/computers/telemonitor.dm b/code/game/machinery/telecomms/computers/telemonitor.dm index abc2b7dbdbff4..e70c7f7de172a 100644 --- a/code/game/machinery/telecomms/computers/telemonitor.dm +++ b/code/game/machinery/telecomms/computers/telemonitor.dm @@ -81,7 +81,7 @@ return data -/obj/machinery/computer/telecomms/monitor/ui_act(action, params) +/obj/machinery/computer/telecomms/monitor/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index fb68631b76676..c92384aa4b6c1 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -82,7 +82,7 @@ return data -/obj/machinery/telecomms/ui_act(action, params) +/obj/machinery/telecomms/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/machinery/telecomms/machines/bus.dm b/code/game/machinery/telecomms/machines/bus.dm index 15d20b3d1eb25..b56b4811083d3 100644 --- a/code/game/machinery/telecomms/machines/bus.dm +++ b/code/game/machinery/telecomms/machines/bus.dm @@ -60,8 +60,8 @@ /obj/machinery/telecomms/bus/preset_two id = "Bus 2" network = "tcommsat" - freq_listening = list(FREQ_SUPPLY, FREQ_SERVICE) - autolinkers = list("processor2", "supply", "service") + freq_listening = list(FREQ_SUPPLY, FREQ_SERVICE, FREQ_ENTERTAINMENT) + autolinkers = list("processor2", "supply", "service", "entertainment") /obj/machinery/telecomms/bus/preset_three id = "Bus 3" diff --git a/code/game/machinery/telecomms/machines/hub.dm b/code/game/machinery/telecomms/machines/hub.dm index 8136aed843514..6583cfe410577 100644 --- a/code/game/machinery/telecomms/machines/hub.dm +++ b/code/game/machinery/telecomms/machines/hub.dm @@ -70,6 +70,7 @@ "common", "command", "engineering", + "entertainment", "security", "receiverA", "receiverB", diff --git a/code/game/machinery/telecomms/machines/receiver.dm b/code/game/machinery/telecomms/machines/receiver.dm index 8d6f8c85f43a1..875398fb8f245 100644 --- a/code/game/machinery/telecomms/machines/receiver.dm +++ b/code/game/machinery/telecomms/machines/receiver.dm @@ -57,7 +57,7 @@ id = "Receiver A" network = "tcommsat" autolinkers = list("receiverA") // link to relay - freq_listening = list(FREQ_SCIENCE, FREQ_MEDICAL, FREQ_SUPPLY, FREQ_SERVICE) + freq_listening = list(FREQ_SCIENCE, FREQ_MEDICAL, FREQ_SUPPLY, FREQ_SERVICE, FREQ_ENTERTAINMENT) //--PRESET RIGHT--// diff --git a/code/game/machinery/telecomms/machines/server.dm b/code/game/machinery/telecomms/machines/server.dm index 0c87a6101d182..1c7557b79def8 100644 --- a/code/game/machinery/telecomms/machines/server.dm +++ b/code/game/machinery/telecomms/machines/server.dm @@ -100,9 +100,9 @@ autolinkers = list("supply") /obj/machinery/telecomms/server/presets/service - id = "Service Server" - freq_listening = list(FREQ_SERVICE) - autolinkers = list("service") + id = "Service & Entertainment Server" + freq_listening = list(FREQ_SERVICE, FREQ_ENTERTAINMENT) + autolinkers = list("service", "entertainment") /obj/machinery/telecomms/server/presets/common id = "Common Server" diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index fd57b24da099f..f06ac5d920916 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -3,6 +3,8 @@ var/can_buckle = FALSE /// Bed-like behaviour, forces mob.lying = buckle_lying if not set to [NO_BUCKLE_LYING]. var/buckle_lying = NO_BUCKLE_LYING + /// Bed-like behaviour, sets mob dir to buckle_dir if not set to [BUCKLE_MATCH_DIR]. If set to [BUCKLE_MATCH_DIR], makes mob dir match ours. + var/buckle_dir = BUCKLE_MATCH_DIR /// Require people to be handcuffed before being able to buckle. eg: pipes var/buckle_requires_restraints = FALSE /// The mobs currently buckled to this atom @@ -106,7 +108,10 @@ M.set_glide_size(glide_size) M.Move(loc) - M.setDir(dir) + if(buckle_dir == BUCKLE_MATCH_DIR) + M.setDir(dir) + else + M.setDir(buckle_dir) //Something has unbuckled us in reaction to the above movement if(!M.buckled) @@ -261,7 +266,7 @@ */ /atom/movable/proc/is_user_buckle_possible(mob/living/target, mob/user, check_loc = TRUE) // Standard adjacency and other checks. - if(!Adjacent(user) || !Adjacent(target) || !isturf(user.loc) || user.incapacitated() || target.anchored) + if(!Adjacent(user) || !Adjacent(target) || !isturf(user.loc) || user.incapacitated || target.anchored) return FALSE if(iscarbon(user)) diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm index ce9bab6a511cc..f249d22500c30 100644 --- a/code/game/objects/effects/anomalies/_anomalies.dm +++ b/code/game/objects/effects/anomalies/_anomalies.dm @@ -95,6 +95,15 @@ /obj/effect/anomaly/proc/anomalyNeutralize() new /obj/effect/particle_effect/fluid/smoke/bad(loc) + SSblackbox.record_feedback( + "nested tally", + "anomaly_defused", + 1, + list( + "[type]", + immortal ? "immortal" : "[round((death_time - world.time) / 10)]ds time left", + ) + ) if(drops_core) if(isnull(anomaly_core)) diff --git a/code/game/objects/effects/anomalies/anomalies_bluespace.dm b/code/game/objects/effects/anomalies/anomalies_bluespace.dm index 2ed19adb4f2c8..0a71427776eea 100644 --- a/code/game/objects/effects/anomalies/anomalies_bluespace.dm +++ b/code/game/objects/effects/anomalies/anomalies_bluespace.dm @@ -31,8 +31,16 @@ // Calculate new position (searches through beacons in world) var/obj/item/beacon/chosen var/list/possible = list() - for(var/obj/item/beacon/W in GLOB.teleportbeacons) - possible += W + for(var/obj/item/beacon/beacon in GLOB.teleportbeacons) + var/turf/turf = get_turf(beacon) + if(!turf) + continue + if(is_centcom_level(turf.z) || is_away_level(turf.z)) + continue + var/area/area = get_area(turf) + if(!area || (area.area_flags & NOTELEPORT)) + continue + possible += beacon if(possible.len > 0) chosen = pick(possible) diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index e42ee4d491fd2..eced2fb66f1ee 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -11,11 +11,14 @@ var/rotation = 0 var/paint_colour = COLOR_WHITE -/obj/effect/decal/cleanable/crayon/Initialize(mapload, main, type, e_name, graf_rot, alt_icon = null) +/obj/effect/decal/cleanable/crayon/Initialize(mapload, main, type, e_name, graf_rot, alt_icon = null, desc_override = null) . = ..() if(e_name) name = e_name - desc = "A [name] vandalizing the station." + if(desc_override) + desc = "[desc_override]" + else + desc = "A [name] vandalizing the station." if(alt_icon) icon = alt_icon if(type) diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm index 61f14f9d80ebb..55cd7cd98d089 100644 --- a/code/game/objects/effects/decals/remains.dm +++ b/code/game/objects/effects/decals/remains.dm @@ -18,18 +18,23 @@ return !istype(here_turf, /obj/structure/closet/crate/grave/filled) && ..() /obj/effect/decal/remains/human/smokey - desc = "They look like human remains. They have a strange, smokey aura about them..." + name = "remains of Charles Morlbaro" + desc = "I guess we figured out what happened to the guy who lives here. You'd best tread lightly around this..." ///Our proximity monitor, for detecting nearby looters. var/datum/proximity_monitor/proximity_monitor ///The reagent we will release when our remains are disturbed. var/datum/reagent/that_shit_that_killed_saddam + ///A cooldown for how frequently the gas is released when disturbed. COOLDOWN_DECLARE(gas_cooldown) + ///The length of the aforementioned cooldown. + var/gas_cooldown_length = (20 SECONDS) /obj/effect/decal/remains/human/smokey/Initialize(mapload) . = ..() - proximity_monitor = new(src, 0) - that_shit_that_killed_saddam = get_random_reagent_id() + proximity_monitor = new(src, 1) + var/list/blocked_reagents = subtypesof(/datum/reagent/medicine) + subtypesof(/datum/reagent/consumable) //Boooooriiiiing + that_shit_that_killed_saddam = get_random_reagent_id(blacklist = blocked_reagents) /obj/effect/decal/remains/human/smokey/HasProximity(atom/movable/tomb_raider) if(!COOLDOWN_FINISHED(src, gas_cooldown)) @@ -37,10 +42,11 @@ if(iscarbon(tomb_raider)) var/mob/living/carbon/nearby_carbon = tomb_raider - if (nearby_carbon.move_intent != MOVE_INTENT_WALK || prob(15)) + if(nearby_carbon.move_intent != MOVE_INTENT_WALK || prob(5)) release_smoke(nearby_carbon) - COOLDOWN_START(src, gas_cooldown, rand(20 SECONDS, 2 MINUTES)) + COOLDOWN_START(src, gas_cooldown, gas_cooldown_length) +///Releases a cloud of smoke based on the randomly generated reagent in Initialize(). /obj/effect/decal/remains/human/smokey/proc/release_smoke(mob/living/smoke_releaser) visible_message(span_warning("[smoke_releaser] disturbs the [src], which releases a huge cloud of gas!")) var/datum/effect_system/fluid_spread/smoke/chem/cigarette_puff = new() @@ -49,6 +55,15 @@ cigarette_puff.set_up(range = 2, amount = DIAMOND_AREA(2), holder = src, location = get_turf(src), silent = TRUE) cigarette_puff.start() +///Subtype of smokey remains used for rare maintenance spawns. +/obj/effect/decal/remains/human/smokey/maintenance + name = "smokey remains" + desc = "They look like human remains. They have a strange, smokey aura about them... You should tread lightly when walking near this." + +/obj/effect/decal/remains/human/smokey/maintenance/Initialize(mapload) + . = ..() + gas_cooldown_length = rand(4 MINUTES, 6 MINUTES) + /obj/effect/decal/remains/plasma icon_state = "remainsplasma" diff --git a/code/game/objects/effects/particles/fire.dm b/code/game/objects/effects/particles/fire.dm index 9d90d0d29c29a..9904685807364 100644 --- a/code/game/objects/effects/particles/fire.dm +++ b/code/game/objects/effects/particles/fire.dm @@ -33,3 +33,21 @@ drift = generator(GEN_VECTOR, list(-0.1,0), list(0.1,0.025), UNIFORM_RAND) spin = generator(GEN_NUM, list(-15,15), NORMAL_RAND) scale = generator(GEN_VECTOR, list(0.5,0.5), list(2,2), NORMAL_RAND) + +/particles/embers/spark + count = 3 + spawning = 2 + gradient = list("#FBAF4D", "#FCE6B6", "#FFFFFF") + lifespan = 1.5 SECONDS + fade = 1 SECONDS + fadein = 0.1 SECONDS + grow = -0.1 + velocity = generator(GEN_CIRCLE, 3, 3, SQUARE_RAND) + position = generator(GEN_SPHERE, 0, 0, LINEAR_RAND) + scale = generator(GEN_VECTOR, list(0.5, 0.5), list(1,1), NORMAL_RAND) + drift = list(0) + +/particles/embers/spark/severe + count = 10 + spawning = 5 + gradient = list("#FCE6B6", "#FFFFFF") diff --git a/code/game/objects/effects/particles/gravity.dm b/code/game/objects/effects/particles/gravity.dm new file mode 100644 index 0000000000000..0d74896e20a7b --- /dev/null +++ b/code/game/objects/effects/particles/gravity.dm @@ -0,0 +1,44 @@ +/particles/grav_field_down + icon = 'icons/effects/particles/generic.dmi' + icon_state = "cross" + width = 100 + height = 100 + count = 5 + spawning = 1 + lifespan = 0.6 SECONDS + fade = 0.5 SECONDS + fadein = 0.2 SECONDS + position = generator(GEN_CIRCLE, 0, 16, UNIFORM_RAND) + gravity = list(0, -0.75) + color = "#FF0000" + +/particles/grav_field_down/strong + gravity = list(0, -1.75) + +/particles/grav_field_up + icon = 'icons/effects/particles/generic.dmi' + icon_state = "cross" + width = 100 + height = 100 + count = 5 + spawning = 1 + lifespan = 0.6 SECONDS + fade = 0.5 SECONDS + fadein = 0.2 SECONDS + position = generator(GEN_CIRCLE, 0, 16, UNIFORM_RAND) + gravity = list(0, 0.75) + color = "#0077ff" + +/particles/grav_field_float + icon = 'icons/effects/particles/generic.dmi' + icon_state = "cross" + width = 100 + height = 100 + count = 5 + spawning = 1 + lifespan = 0.6 SECONDS + fade = 0.5 SECONDS + fadein = 0.2 SECONDS + position = generator(GEN_CIRCLE, 0, 16, UNIFORM_RAND) + velocity = generator(GEN_VECTOR, list(2,0), list(-2,0), UNIFORM_RAND) + color = "#FFFF00" diff --git a/code/game/objects/effects/particles/smoke.dm b/code/game/objects/effects/particles/smoke.dm index 27249c65a683e..776c90534a957 100644 --- a/code/game/objects/effects/particles/smoke.dm +++ b/code/game/objects/effects/particles/smoke.dm @@ -84,3 +84,16 @@ grow = 0.05 spin = 2 color = "#fcffff77" + +/particles/smoke/cyborg + count = 5 + spawning = 1 + lifespan = 1 SECONDS + fade = 1.8 SECONDS + position = list(0, 0, 0) + scale = list(0.5, 0.5) + grow = 0.1 + +/particles/smoke/cyborg/heavy_damage + lifespan = 0.8 SECONDS + fade = 0.8 SECONDS diff --git a/code/game/objects/effects/phased_mob.dm b/code/game/objects/effects/phased_mob.dm index b1df969b45c92..357e9683072c1 100644 --- a/code/game/objects/effects/phased_mob.dm +++ b/code/game/objects/effects/phased_mob.dm @@ -23,6 +23,7 @@ jaunter.forceMove(src) if(ismob(jaunter)) var/mob/mob_jaunter = jaunter + RegisterSignal(mob_jaunter, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_change)) mob_jaunter.reset_perspective(src) /obj/effect/dummy/phased_mob/Destroy() @@ -55,6 +56,7 @@ /obj/effect/dummy/phased_mob/Exited(atom/movable/gone, direction) . = ..() if(gone == jaunter) + UnregisterSignal(jaunter, COMSIG_MOB_STATCHANGE) SEND_SIGNAL(src, COMSIG_MOB_EJECTED_FROM_JAUNT, jaunter) jaunter = null @@ -98,3 +100,9 @@ newloc = can_z_move(direction, get_turf(src), newloc, ZMOVE_INCAPACITATED_CHECKS | ZMOVE_FEEDBACK | ZMOVE_ALLOW_ANCHORED, user) return newloc + +/// Signal proc for [COMSIG_MOB_STATCHANGE], to throw us out of the jaunt if we lose consciousness. +/obj/effect/dummy/phased_mob/proc/on_stat_change(mob/living/source, new_stat, old_stat) + SIGNAL_HANDLER + if(source == jaunter && source.stat != CONSCIOUS) + eject_jaunter() diff --git a/code/game/objects/effects/spawners/message_in_a_bottle.dm b/code/game/objects/effects/spawners/message_in_a_bottle.dm new file mode 100644 index 0000000000000..c4ac63ad0be22 --- /dev/null +++ b/code/game/objects/effects/spawners/message_in_a_bottle.dm @@ -0,0 +1,25 @@ +/obj/effect/spawner/message_in_a_bottle + name = "message in a bottle" + desc = "Sending out an SOS" + icon = 'icons/effects/random_spawners.dmi' + icon_state = "message_bottle" + var/probability = 100 + +/obj/effect/spawner/message_in_a_bottle/Initialize(mapload) + . = ..() + if(!prob(probability)) + return INITIALIZE_HINT_QDEL + if(!SSpersistence.initialized) + RegisterSignal(SSpersistence, COMSIG_SUBSYSTEM_POST_INITIALIZE, PROC_REF(on_persistence_init)) + else + SSpersistence.load_message_bottle(loc) + return INITIALIZE_HINT_QDEL + +/obj/effect/spawner/message_in_a_bottle/proc/on_persistence_init(datum/source) + SIGNAL_HANDLER + UnregisterSignal(SSpersistence, COMSIG_SUBSYSTEM_POST_INITIALIZE) + SSpersistence.load_message_bottle(loc) + qdel(src) + +/obj/effect/spawner/message_in_a_bottle/low_prob + probability = 1.5 diff --git a/code/game/objects/effects/spawners/random/decoration.dm b/code/game/objects/effects/spawners/random/decoration.dm index 6116d22873317..6d2cf3021ef38 100644 --- a/code/game/objects/effects/spawners/random/decoration.dm +++ b/code/game/objects/effects/spawners/random/decoration.dm @@ -114,6 +114,26 @@ /obj/item/flashlight/glowstick/pink, ) +/obj/effect/spawner/random/decoration/glowstick/on + name = "random colored glowstick (on)" + icon_state = "glowstick" + loot = list( + /obj/item/flashlight/glowstick, + /obj/item/flashlight/glowstick/red, + /obj/item/flashlight/glowstick/blue, + /obj/item/flashlight/glowstick/cyan, + /obj/item/flashlight/glowstick/orange, + /obj/item/flashlight/glowstick/yellow, + /obj/item/flashlight/glowstick/pink, + ) + +/obj/effect/spawner/random/decoration/glowstick/on/make_item(spawn_loc, type_path_to_make) + . = ..() + + var/obj/item/flashlight/glowstick = . + + glowstick.set_light_on(TRUE) + /obj/effect/spawner/random/decoration/paint name = "paint spawner" icon_state = "paint" diff --git a/code/game/objects/effects/spawners/random/exotic.dm b/code/game/objects/effects/spawners/random/exotic.dm index e802e30056f4f..cb43d6f06ae4f 100644 --- a/code/game/objects/effects/spawners/random/exotic.dm +++ b/code/game/objects/effects/spawners/random/exotic.dm @@ -16,8 +16,9 @@ name = "language book spawner" icon_state = "book" loot = list( // A single roundstart species language book. - /obj/item/language_manual/roundstart_species = 100, + /obj/item/language_manual/roundstart_species = 96, /obj/item/book/granter/sign_language = 10, + /obj/item/language_manual/piratespeak = 4, /obj/item/language_manual/roundstart_species/five = 3, /obj/item/language_manual/roundstart_species/unlimited = 1, ) diff --git a/code/game/objects/effects/spawners/random/food_or_drink.dm b/code/game/objects/effects/spawners/random/food_or_drink.dm index 192914b6e3db6..4ff47f08fe994 100644 --- a/code/game/objects/effects/spawners/random/food_or_drink.dm +++ b/code/game/objects/effects/spawners/random/food_or_drink.dm @@ -167,6 +167,7 @@ /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka = 1, /obj/item/reagent_containers/cup/glass/bottle/trappist = 1, + /obj/item/reagent_containers/cup/glass/bottle/rum/aged = 1, ) /obj/effect/spawner/random/food_or_drink/pizzaparty diff --git a/code/game/objects/effects/spawners/random/structure.dm b/code/game/objects/effects/spawners/random/structure.dm index 359c147eb4fb5..289a2aba27600 100644 --- a/code/game/objects/effects/spawners/random/structure.dm +++ b/code/game/objects/effects/spawners/random/structure.dm @@ -23,6 +23,7 @@ /obj/effect/spawner/random/trash/mess = 30, /obj/item/kirbyplants/fern = 20, /obj/structure/closet/crate/decorations = 15, + /obj/effect/decal/remains/human/smokey/maintenance = 7, /obj/structure/destructible/cult/pants_altar = 1, ) diff --git a/code/game/objects/effects/spawners/random/trash.dm b/code/game/objects/effects/spawners/random/trash.dm index dfac8e4c0c814..9cf00c20ee3ec 100644 --- a/code/game/objects/effects/spawners/random/trash.dm +++ b/code/game/objects/effects/spawners/random/trash.dm @@ -89,7 +89,6 @@ /obj/item/trash/cnds = 1, /obj/item/trash/syndi_cakes = 1, /obj/item/trash/shrimp_chips = 1, - /obj/item/trash/waffles = 1, /obj/item/trash/tray = 1, ) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 12adcf15c22f7..d8288801b90fb 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -39,6 +39,12 @@ ///The config type to use for greyscaled belt overlays. Both this and greyscale_colors must be assigned to work. var/greyscale_config_belt + /// Greyscale config used when generating digitigrade versions of the sprite. + var/digitigrade_greyscale_config_worn + /// Greyscale colors used when generating digitigrade versions of the sprite. + /// Optional - If not set it will default to normal greyscale colors, or approximate them if those are unset as well + var/digitigrade_greyscale_colors + /* !!!!!!!!!!!!!!! IMPORTANT !!!!!!!!!!!!!! IF YOU ADD MORE ICON CRAP TO THIS @@ -705,7 +711,7 @@ /obj/item/proc/on_equipped(mob/user, slot, initial = FALSE) SHOULD_NOT_OVERRIDE(TRUE) equipped(user, slot, initial) - if(SEND_SIGNAL(src, COMSIG_ITEM_POST_EQUIPPED, user, slot) && COMPONENT_EQUIPPED_FAILED) + if(SEND_SIGNAL(src, COMSIG_ITEM_POST_EQUIPPED, user, slot) & COMPONENT_EQUIPPED_FAILED) return FALSE return TRUE @@ -788,7 +794,7 @@ set category = "Object" set name = "Pick up" - if(usr.incapacitated() || !Adjacent(usr)) + if(usr.incapacitated || !Adjacent(usr)) return if(isliving(usr)) @@ -1075,7 +1081,7 @@ var/timedelay = usr.client.prefs.read_preference(/datum/preference/numeric/tooltip_delay) / 100 tip_timer = addtimer(CALLBACK(src, PROC_REF(openTip), location, control, params, usr), timedelay, TIMER_STOPPABLE)//timer takes delay in deciseconds, but the pref is in milliseconds. dividing by 100 converts it. if(usr.client.prefs.read_preference(/datum/preference/toggle/item_outlines)) - if(istype(L) && L.incapacitated()) + if(istype(L) && L.incapacitated) apply_outline(COLOR_RED_GRAY) //if they're dead or handcuffed, let's show the outline as red to indicate that they can't interact with that right now else apply_outline() //if the player's alive and well we send the command with no color set, so it uses the theme's color @@ -1312,7 +1318,7 @@ * Then, it checks tiny items. * After all that, it returns TRUE if the item is set to be discovered. Otherwise, it returns FALSE. * - * This works similarily to /suicide_act: if you want an item to have a unique interaction, go to that item + * This works similarly to /suicide_act: if you want an item to have a unique interaction, go to that item * and give it an /on_accidental_consumption proc override. For a simple example of this, check out the nuke disk. * * Arguments @@ -1337,7 +1343,7 @@ return source_item?.reagents?.add_reagent(/datum/reagent/blood, 2) - else if(custom_materials?.len) //if we've got materials, lets see whats in it + else if(custom_materials?.len) //if we've got materials, let's see what's in it // How many mats have we found? You can only be affected by two material datums by default var/found_mats = 0 // How much of each material is in it? Used to determine if the glass should break @@ -1456,8 +1462,8 @@ pickup_animation.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA var/direction = get_dir(source, target) - var/to_x = target.base_pixel_x - var/to_y = target.base_pixel_y + var/to_x = target.base_pixel_x + target.base_pixel_w + var/to_y = target.base_pixel_y + target.base_pixel_z if(direction & NORTH) to_y += 32 diff --git a/code/game/objects/items/AI_modules/hacked.dm b/code/game/objects/items/AI_modules/hacked.dm index 81100d0ed157b..fafde17acb5f3 100644 --- a/code/game/objects/items/AI_modules/hacked.dm +++ b/code/game/objects/items/AI_modules/hacked.dm @@ -55,7 +55,7 @@ to_chat(sender, span_warning("You should use [src] on an AI upload console or the AI core itself.")) return if(malf_candidate.mind?.has_antag_datum(/datum/antagonist/malf_ai)) //Already malf - to_chat(sender, span_warning("Unknown error occured. Upload process aborted.")) + to_chat(sender, span_warning("Unknown error occurred. Upload process aborted.")) return var/datum/antagonist/malf_ai/infected/malf_datum = new (give_objectives = TRUE, new_boss = sender.mind) diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index 3365a24650a5b..3124ba9c39196 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -229,7 +229,7 @@ * Actually add current decal to the floor. * * Responsible for actually adding the element to the turf for maximum flexibility.area - * Can be overriden for different decal behaviors. + * Can be overridden for different decal behaviors. * Arguments: * * target - The turf being painted to */ @@ -298,7 +298,7 @@ .["current_dir"] = stored_dir .["current_custom_color"] = stored_custom_color -/obj/item/airlock_painter/decal/ui_act(action, list/params) +/obj/item/airlock_painter/decal/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/objects/items/bear_armor.dm b/code/game/objects/items/bear_armor.dm index 8cfad42be15a6..140a3d295f11b 100644 --- a/code/game/objects/items/bear_armor.dm +++ b/code/game/objects/items/bear_armor.dm @@ -1,7 +1,7 @@ /obj/item/bear_armor name = "pile of bear armor" desc = "A scattered pile of various shaped armor pieces fitted for a bear, some duct tape, and a nail filer. Crude instructions \ - are written on the back of one of the plates in russian. This seems like an awful idea." + are written on the back of one of the plates in Russian. This seems like an awful idea." icon = 'icons/obj/tools.dmi' icon_state = "bear_armor_upgrade" diff --git a/code/game/objects/items/body_egg.dm b/code/game/objects/items/body_egg.dm index d244d8c55cc16..d8b48e0789b21 100644 --- a/code/game/objects/items/body_egg.dm +++ b/code/game/objects/items/body_egg.dm @@ -15,15 +15,14 @@ if(iscarbon(loc)) Insert(loc) -/obj/item/organ/internal/body_egg/Insert(mob/living/carbon/egg_owner, special = FALSE, movement_flags = DELETE_IF_REPLACED) +/obj/item/organ/internal/body_egg/mob_insert(mob/living/carbon/egg_owner, special = FALSE, movement_flags = DELETE_IF_REPLACED) . = ..() - if(!.) - return + egg_owner.add_traits(list(TRAIT_XENO_HOST, TRAIT_XENO_IMMUNE), ORGAN_TRAIT) egg_owner.med_hud_set_status() INVOKE_ASYNC(src, PROC_REF(AddInfectionImages), egg_owner) -/obj/item/organ/internal/body_egg/Remove(mob/living/carbon/egg_owner, special, movement_flags) +/obj/item/organ/internal/body_egg/mob_remove(mob/living/carbon/egg_owner, special, movement_flags) . = ..() egg_owner.remove_traits(list(TRAIT_XENO_HOST, TRAIT_XENO_IMMUNE), ORGAN_TRAIT) egg_owner.med_hud_set_status() diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index c949f977508f1..4adb8d28b8c8a 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -86,7 +86,7 @@ return item_bag /obj/item/bodybag/bluespace/container_resist_act(mob/living/user) - if(user.incapacitated()) + if(user.incapacitated) to_chat(user, span_warning("You can't get out while you're restrained like this!")) return user.changeNext_move(CLICK_CD_BREAKOUT) @@ -97,7 +97,7 @@ return // you are still in the bag? time to go unless you KO'd, honey! // if they escape during this time and you rebag them the timer is still clocking down and does NOT reset so they can very easily get out. - if(user.incapacitated()) + if(user.incapacitated) to_chat(loc, span_warning("The pressure subsides. It seems that they've stopped resisting...")) return loc.visible_message(span_warning("[user] suddenly appears in front of [loc]!"), span_userdanger("[user] breaks free of [src]!")) diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index d4508710a8547..b49991b132a4e 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -149,7 +149,7 @@ /obj/item/cardboard_cutout/proc/check_menu(mob/living/user, obj/item/toy/crayon/crayon) if(!istype(user)) return FALSE - if(user.incapacitated()) + if(user.incapacitated) return FALSE if(pushed_over) to_chat(user, span_warning("Right [src] first!")) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 41731cdf31d8f..8490f30f1bb75 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -104,6 +104,11 @@ /// Boolean value. If TRUE, the [Intern] tag gets prepended to this ID card when the label is updated. var/is_intern = FALSE + ///If true, the wearer will have bigger arrow when pointing at things. Passed down by trims. + var/big_pointer = FALSE + ///If set, the arrow will have a different color. + var/pointer_color + /datum/armor/card_id fire = 100 acid = 100 @@ -144,6 +149,29 @@ QDEL_NULL(my_store) return ..() +/obj/item/card/id/equipped(mob/user, slot) + . = ..() + if(slot == ITEM_SLOT_ID) + RegisterSignal(user, COMSIG_MOVABLE_POINTED, PROC_REF(on_pointed)) + +/obj/item/card/id/proc/on_pointed(mob/living/user, atom/pointed, obj/effect/temp_visual/point/point) + SIGNAL_HANDLER + if((!big_pointer && !pointer_color) || HAS_TRAIT(user, TRAIT_UNKNOWN)) + return + if(point.icon_state != /obj/effect/temp_visual/point::icon_state) //it differs from the original icon_state already. + return + if(big_pointer) + point.icon_state = "arrow_large" + if(pointer_color) + point.icon_state = "[point.icon_state]_white" + point.color = pointer_color + var/mutable_appearance/highlight = mutable_appearance(point.icon, "[point.icon_state]_highlights", appearance_flags = RESET_COLOR) + point.add_overlay(highlight) + +/obj/item/card/id/dropped(mob/user) + UnregisterSignal(user, COMSIG_MOVABLE_POINTED) + return ..() + /obj/item/card/id/get_id_examine_strings(mob/user) . = ..() . += list("[icon2html(get_cached_flat_icon(), user, extra_classes = "bigicon")]") @@ -1554,7 +1582,7 @@ return data -/obj/item/card/id/advanced/chameleon/ui_act(action, list/params) +/obj/item/card/id/advanced/chameleon/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return @@ -1859,7 +1887,7 @@ /obj/item/card/cardboard/proc/after_input_check(mob/living/user, obj/item/item, input, value) if(!input || (value && input == value)) return FALSE - if(QDELETED(user) || QDELETED(item) || QDELETED(src) || user.incapacitated() || !user.is_holding(item) || !user.CanReach(src) || !user.can_write(item)) + if(QDELETED(user) || QDELETED(item) || QDELETED(src) || user.incapacitated || !user.is_holding(item) || !user.CanReach(src) || !user.can_write(item)) return FALSE return TRUE diff --git a/code/game/objects/items/chainsaw.dm b/code/game/objects/items/chainsaw.dm index 68501057ebf42..5d5de16a4d12a 100644 --- a/code/game/objects/items/chainsaw.dm +++ b/code/game/objects/items/chainsaw.dm @@ -80,7 +80,7 @@ /** * Handles adding components to the chainsaw. Added in Initialize() * - * Applies components to the chainsaw. Added as a seperate proc to allow for + * Applies components to the chainsaw. Added as a separate proc to allow for * variance between subtypes */ /obj/item/chainsaw/proc/apply_components() diff --git a/code/game/objects/items/chromosome.dm b/code/game/objects/items/chromosome.dm index d7fd7b39544be..dcfc7930ebfe2 100644 --- a/code/game/objects/items/chromosome.dm +++ b/code/game/objects/items/chromosome.dm @@ -2,7 +2,7 @@ name = "blank chromosome" icon = 'icons/obj/science/chromosomes.dmi' icon_state = "" - desc = "A tube holding chromosomic data." + desc = "A tube holding chromosomal data." force = 0 w_class = WEIGHT_CLASS_SMALL @@ -16,7 +16,7 @@ /obj/item/chromosome/proc/can_apply(datum/mutation/human/HM) if(!HM || !(HM.can_chromosome == CHROMOSOME_NONE)) return FALSE - if((stabilizer_coeff != 1) && (HM.stabilizer_coeff != -1)) //if the chromosome is 1, we dont change anything. If the mutation is -1, we cant change it. sorry + if((stabilizer_coeff != 1) && (HM.stabilizer_coeff != -1)) //if the chromosome is 1, we don't change anything. If the mutation is -1, we can't change it. sorry return TRUE if((synchronizer_coeff != 1) && (HM.synchronizer_coeff != -1)) return TRUE diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index fe1f6b7495bda..35f14640278e4 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -129,9 +129,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM ////////////////// //FINE SMOKABLES// ////////////////// + /obj/item/cigarette name = "cigarette" - desc = "A roll of tobacco and nicotine." + desc = "A roll of tobacco and nicotine. It is not food." icon = 'icons/obj/cigarettes.dmi' icon_state = "cigoff" inhand_icon_state = "cigon" //gets overriden during intialize(), just have it for unit test sanity. @@ -180,6 +181,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM VAR_PRIVATE/obj/effect/abstract/particle_holder/mob_smoke /// How long the current mob has been smoking this cigarette VAR_FINAL/how_long_have_we_been_smokin = 0 SECONDS + /// Which people ate cigarettes and how many + var/static/list/cigarette_eaters = list() /obj/item/cigarette/Initialize(mapload) . = ..() @@ -194,12 +197,37 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon_state = icon_off inhand_icon_state = inhand_icon_off + // "It is called a cigarette" + AddComponent(/datum/component/edible,\ + initial_reagents = list_reagents,\ + food_flags = null,\ + foodtypes = JUNKFOOD,\ + volume = 50,\ + eat_time = 0 SECONDS,\ + tastes = list("a never before experienced flavour.", "finally sitting down after standing your entire life"),\ + eatverbs = list("taste"),\ + bite_consumption = 50,\ + junkiness = 0,\ + reagent_purity = null,\ + on_consume = CALLBACK(src, PROC_REF(on_consume)),\ + show_examine = FALSE, \ + ) + /obj/item/cigarette/Destroy() STOP_PROCESSING(SSobj, src) QDEL_NULL(mob_smoke) QDEL_NULL(cig_smoke) return ..() +/obj/item/cigarette/proc/on_consume(mob/living/eater, mob/living/feeder) + if(isnull(eater.client)) + return + var/ckey = eater.client.ckey + // We must have more! + cigarette_eaters[ckey]++ + if(cigarette_eaters[ckey] >= 500) + eater.client.give_award(/datum/award/achievement/misc/cigarettes) + /obj/item/cigarette/equipped(mob/equipee, slot) . = ..() if(!(slot & ITEM_SLOT_MASK)) @@ -216,7 +244,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(!QDELETED(src) && !QDELETED(dropee) && how_long_have_we_been_smokin >= 4 SECONDS && iscarbon(dropee) && iscarbon(loc)) var/mob/living/carbon/smoker = dropee // This relies on the fact that dropped is called before slot is nulled - if(src == smoker.wear_mask && !smoker.incapacitated()) + if(src == smoker.wear_mask && !smoker.incapacitated) long_exhale(smoker) UnregisterSignal(dropee, list(COMSIG_HUMAN_FORCESAY, COMSIG_ATOM_DIR_CHANGE)) diff --git a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm index 64f4ee35f6076..80c71e2b85983 100644 --- a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm @@ -631,6 +631,7 @@ /obj/machinery/vending/coffee = "Solar's Best Hot Drinks", /obj/machinery/vending/cola = "Robust Softdrinks", /obj/machinery/vending/custom = "Custom Vendor", + /obj/machinery/vending/cytopro = "CytoPro", /obj/machinery/vending/dinnerware = "Plasteel Chef's Dinnerware Vendor", /obj/machinery/vending/drugs = "NanoDrug Plus", /obj/machinery/vending/engineering = "Robco Tool Maker", @@ -922,6 +923,9 @@ /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/glass = 2) +/obj/item/circuitboard/machine/sleeper/syndie + build_path = /obj/machinery/sleeper/syndie + /obj/item/circuitboard/machine/sleeper/fullupgrade build_path = /obj/machinery/sleeper/syndie/fullupgrade req_components = list( @@ -1286,6 +1290,15 @@ /obj/item/stack/sheet/glass = 1) needs_anchored = FALSE +/obj/item/circuitboard/machine/hydroponics/fullupgrade + build_path = /obj/machinery/hydroponics/constructable/fullupgrade + specific_parts = TRUE + req_components = list( + /datum/stock_part/matter_bin/tier4 = 2, + /datum/stock_part/servo/tier4 = 1, + /obj/item/stack/sheet/glass = 1 + ) + /obj/item/circuitboard/machine/microwave name = "Microwave" greyscale_colors = CIRCUIT_COLOR_SERVICE @@ -1372,6 +1385,10 @@ /datum/stock_part/capacitor = 1) needs_anchored = FALSE +/obj/item/circuitboard/machine/fishing_portal_generator/emagged + name = "Emagged Fishing Portal Generator" + build_path = /obj/machinery/fishing_portal_generator + //Supply /obj/item/circuitboard/machine/ore_redemption name = "Ore Redemption" @@ -1681,3 +1698,20 @@ req_components = list( /obj/item/pipe/trinary/flippable/filter = 1, ) + +/obj/item/circuitboard/machine/portagrav + name = "Portable Gravity Unit" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING + build_path = /obj/machinery/power/portagrav + req_components = list( + /datum/stock_part/capacitor = 2, + /datum/stock_part/micro_laser = 2, + /obj/item/stack/sheet/glass = 1) + +/obj/item/circuitboard/machine/big_manipulator + name = "Big Manipulator" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING + build_path = /obj/machinery/big_manipulator + req_components = list( + /datum/stock_part/servo = 1, + ) diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index 32a81d1f75f9c..6565bcae44f5b 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -74,7 +74,7 @@ /obj/item/soap/nanotrasen/cyborg /obj/item/soap/deluxe - desc = "A deluxe Waffle Co. brand bar of soap. Smells of high-class luxury." + desc = "A deluxe Waffle Corporation brand bar of soap. Smells of high-class luxury." grind_results = list(/datum/reagent/consumable/aloejuice = 10, /datum/reagent/lye = 10) icon_state = "soapdeluxe" inhand_icon_state = "soapdeluxe" diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm index b16cf3a6ef61a..2aa0c927bedc0 100644 --- a/code/game/objects/items/cosmetics.dm +++ b/code/game/objects/items/cosmetics.dm @@ -8,6 +8,7 @@ desc = "A generic brand of lipstick." icon = 'icons/obj/cosmetic.dmi' icon_state = "lipstick" + base_icon_state = "lipstick" inhand_icon_state = "lipstick" w_class = WEIGHT_CLASS_TINY interaction_flags_click = NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING @@ -18,6 +19,8 @@ var/style = "lipstick" /// A trait that's applied while someone has this lipstick applied, and is removed when the lipstick is removed var/lipstick_trait + /// Can this lipstick spawn randomly + var/random_spawn = TRUE /obj/item/lipstick/Initialize(mapload) . = ..() @@ -34,8 +37,8 @@ . += "Alt-click to change the style." /obj/item/lipstick/update_icon_state() - icon_state = "lipstick[open ? "_uncap" : null]" - inhand_icon_state = "lipstick[open ? "open" : null]" + icon_state = "[base_icon_state][open ? "_uncap" : null]" + inhand_icon_state = "[base_icon_state][open ? "open" : null]" return ..() /obj/item/lipstick/update_overlays() @@ -72,7 +75,7 @@ /obj/item/lipstick/proc/check_menu(mob/living/user) if(!istype(user)) return FALSE - if(user.incapacitated() || !user.is_holding(src)) + if(user.incapacitated || !user.is_holding(src)) return FALSE return TRUE @@ -104,6 +107,16 @@ name = "\improper Kiss of Death" desc = "An incredibly potent tube of lipstick made from the venom of the dreaded Yellow Spotted Space Lizard, as deadly as it is chic. Try not to smear it!" lipstick_trait = TRAIT_KISS_OF_DEATH + random_spawn = FALSE + +/obj/item/lipstick/syndie + name = "syndie lipstick" + desc = "Syndicate branded lipstick with a killer dose of kisses. Observe safety regulations!" + icon_state = "slipstick" + base_icon_state = "slipstick" + lipstick_color = COLOR_SYNDIE_RED + lipstick_trait = TRAIT_SYNDIE_KISS + random_spawn = FALSE /obj/item/lipstick/random name = "lipstick" @@ -116,7 +129,7 @@ if(!possible_colors) possible_colors = list() for(var/obj/item/lipstick/lipstick_path as anything in (typesof(/obj/item/lipstick) - src.type)) - if(!initial(lipstick_path.lipstick_color)) + if(!initial(lipstick_path.lipstick_color) || !initial(lipstick_path.random_spawn)) continue possible_colors[initial(lipstick_path.lipstick_color)] = initial(lipstick_path.name) lipstick_color = pick(possible_colors) @@ -189,7 +202,7 @@ /obj/item/razor/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] begins shaving [user.p_them()]self without the razor guard! It looks like [user.p_theyre()] trying to commit suicide!")) shave(user, BODY_ZONE_PRECISE_MOUTH) - shave(user, BODY_ZONE_HEAD)//doesnt need to be BODY_ZONE_HEAD specifically, but whatever + shave(user, BODY_ZONE_HEAD)//doesn't need to be BODY_ZONE_HEAD specifically, but whatever return BRUTELOSS /obj/item/razor/proc/shave(mob/living/carbon/human/skinhead, location = BODY_ZONE_PRECISE_MOUTH) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index a879571e2b0aa..9b4d17bbb9d64 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -372,7 +372,7 @@ .["selected_color"] = GLOB.pipe_color_name[paint_color] || paint_color .["paint_colors"] = GLOB.pipe_paint_colors -/obj/item/toy/crayon/ui_act(action, list/params) +/obj/item/toy/crayon/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return @@ -458,6 +458,12 @@ if(RANDOM_ANY) drawing = pick(all_drawables) + if(drawing in graffiti_large_h) + paint_mode = PAINT_LARGE_HORIZONTAL + text_buffer = "" + else + paint_mode = PAINT_NORMAL + var/istagger = HAS_TRAIT(user, TRAIT_TAGGER) var/cost = all_drawables[drawing] || CRAYON_COST_DEFAULT if(istype(target, /obj/item/canvas)) @@ -645,13 +651,38 @@ dye_color = DYE_BLACK /obj/item/toy/crayon/white - name = "white crayon" + name = "stick of chalk" + desc = "A stark-white stick of chalk." icon_state = "crayonwhite" paint_color = COLOR_WHITE crayon_color = "white" reagent_contents = list(/datum/reagent/consumable/nutriment = 0.5, /datum/reagent/colorful_reagent/powder/white/crayon = 1.5) dye_color = DYE_WHITE +/obj/item/toy/crayon/white/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + /// Wherein, we draw a chalk body outline vaguely around the dead or "dead" mob + if(!ishuman(interacting_with) || user.combat_mode) + return ..() + + var/mob/living/carbon/human/pwned_human = interacting_with + + if(!(pwned_human.stat == DEAD || HAS_TRAIT(pwned_human, TRAIT_FAKEDEATH))) + balloon_alert_to_viewers("FEEDING TIME") + return ..() + + balloon_alert_to_viewers("drawing outline...") + if(!do_after(user, DRAW_TIME, target = pwned_human, max_interact_count = 4)) + return NONE + if(!use_charges(user, 1)) + return NONE + + var/decal_rotation = GET_LYING_ANGLE(pwned_human) - 90 + var/obj/effect/decal/cleanable/crayon/chalk_line = new(get_turf(pwned_human), paint_color, "body", "chalk outline", decal_rotation, null, "A vaguely [pwned_human] shaped outline of a body.") + to_chat(user, span_notice("You draw a chalk outline around [pwned_human].")) + chalk_line.pixel_y = (pwned_human.pixel_y + pwned_human.pixel_z) + rand(-2, 2) + chalk_line.pixel_x = (pwned_human.pixel_x + pwned_human.pixel_w) + rand(-1, 1) + return ITEM_INTERACT_SUCCESS + /obj/item/toy/crayon/mime name = "mime crayon" icon_state = "crayonmime" @@ -796,7 +827,6 @@ return (isfloorturf(surface) || iswallturf(surface)) /obj/item/toy/crayon/spraycan/suicide_act(mob/living/user) - var/mob/living/carbon/human/H = user var/used = min(charges_left, 10) if(is_capped || !actually_paints || !use_charges(user, 10, FALSE)) user.visible_message(span_suicide("[user] shakes up [src] with a rattle and lifts it to [user.p_their()] mouth, but nothing happens!")) @@ -811,7 +841,7 @@ set_painting_tool_color(COLOR_SILVER) update_appearance() if(actually_paints) - H.update_lips("spray_face", paint_color) + user.AddComponent(/datum/component/face_decal, "spray", EXTERNAL_ADJACENT, paint_color) reagents.trans_to(user, used, volume_multiplier, transferred_by = user, methods = VAPOR) return OXYLOSS @@ -866,7 +896,7 @@ flash_color(carbon_target, flash_color=paint_color, flash_time=40) if(ishuman(carbon_target) && actually_paints) var/mob/living/carbon/human/human_target = carbon_target - human_target.update_lips("spray_face", paint_color) + human_target.AddComponent(/datum/component/face_decal, "spray", EXTERNAL_ADJACENT, paint_color) use_charges(user, 10, FALSE) var/fraction = min(1, . / reagents.maximum_volume) reagents.expose(carbon_target, VAPOR, fraction * volume_multiplier) diff --git a/code/game/objects/items/debug_items.dm b/code/game/objects/items/debug_items.dm index 071561d57a095..24f350f37907a 100644 --- a/code/game/objects/items/debug_items.dm +++ b/code/game/objects/items/debug_items.dm @@ -46,7 +46,7 @@ /obj/item/debug/omnitool/proc/check_menu(mob/user) if(!istype(user)) return FALSE - if(user.incapacitated() || !user.Adjacent(src)) + if(user.incapacitated || !user.Adjacent(src)) return FALSE return TRUE diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 02934d1a03eaa..b1e01e5a6cebc 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -137,11 +137,12 @@ return ..() /obj/item/defibrillator/mouse_drop_dragged(atom/over_object, mob/user, src_location, over_location, params) - if(ismob(loc)) - var/mob/M = loc - if(istype(over_object, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/H = over_object - M.putItemFromInventoryInHandIfPossible(src, H.held_index) + if(!ismob(loc)) + return + var/mob/living_mob = loc + if(!living_mob.incapacitated && istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/hand = over_object + living_mob.putItemFromInventoryInHandIfPossible(src, hand.held_index) /obj/item/defibrillator/screwdriver_act(mob/living/user, obj/item/tool) if(!cell || !cell_removable) diff --git a/code/game/objects/items/devices/broadcast_camera.dm b/code/game/objects/items/devices/broadcast_camera.dm new file mode 100644 index 0000000000000..4f6e3f1f8f475 --- /dev/null +++ b/code/game/objects/items/devices/broadcast_camera.dm @@ -0,0 +1,90 @@ +// Unique broadcast camera given to the first Curator +// Only one should exist ideally, if other types are created they must have different camera_networks +// Broadcasts its surroundings to entertainment monitors and its audio to entertainment radio channel +/obj/item/broadcast_camera + name = "broadcast camera" + desc = "A large camera that streams its live feed and audio to entertainment monitors across the station, allowing everyone to watch the broadcast." + desc_controls = "Right-click to change the broadcast name. Alt-click to toggle microphone." + icon = 'icons/obj/service/broadcast.dmi' + icon_state = "broadcast_cam0" + base_icon_state = "broadcast_cam" + lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' + force = 8 + throwforce = 12 + w_class = WEIGHT_CLASS_NORMAL + obj_flags = INDESTRUCTIBLE | EMP_PROTECT_ALL // No fun police + slot_flags = NONE + light_system = OVERLAY_LIGHT + light_color = COLOR_SOFT_RED + light_range = 1 + light_power = 0.3 + light_on = FALSE + /// The name of the broadcast + var/broadcast_name = "Curator News" + /// The networks it broadcasts to, default is CAMERANET_NETWORK_CURATOR + var/list/camera_networks = list(CAMERANET_NETWORK_CURATOR) + /// The "virtual" security camera inside of the physical camera + var/obj/machinery/camera/internal_camera + /// The "virtual" radio inside of the the physical camera, a la microphone + var/obj/item/radio/entertainment/microphone/internal_radio + +/obj/item/broadcast_camera/Initialize(mapload) + . = ..() + AddComponent(/datum/component/two_handed, \ + force_unwielded = 8, \ + force_wielded = 12, \ + icon_wielded = "[base_icon_state]1", \ + wield_callback = CALLBACK(src, PROC_REF(on_wield)), \ + unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \ + ) + +/obj/item/broadcast_camera/Destroy(force) + QDEL_NULL(internal_radio) + QDEL_NULL(internal_camera) + + return ..() + +/obj/item/broadcast_camera/update_icon_state() + icon_state = "[base_icon_state]0" + return ..() + +/obj/item/broadcast_camera/attack_self_secondary(mob/user, modifiers) + . = ..() + broadcast_name = tgui_input_text(user = user, title = "Broadcast Name", message = "What will be the name of your broadcast?", default = "[broadcast_name]", max_length = MAX_CHARTER_LEN) + +/obj/item/broadcast_camera/examine(mob/user) + . = ..() + . += span_notice("Broadcast name is [broadcast_name]") + +/// When wielding the camera +/obj/item/broadcast_camera/proc/on_wield() + if(!iscarbon(loc)) + return + /// The carbon who wielded the camera, allegedly + var/mob/living/carbon/wielding_carbon = loc + + // INTERNAL CAMERA + internal_camera = new(wielding_carbon) // Cameras for some reason do not work inside of obj's + internal_camera.internal_light = FALSE + internal_camera.network = camera_networks + internal_camera.c_tag = "LIVE: [broadcast_name]" + start_broadcasting_network(camera_networks, "[broadcast_name] is now LIVE!") + + // INTERNAL RADIO + internal_radio = new(src) + + set_light_on(TRUE) + playsound(source = src, soundin = 'sound/machines/terminal_processing.ogg', vol = 20, vary = FALSE, ignore_walls = FALSE) + balloon_alert_to_viewers("live!") + +/// When unwielding the camera +/obj/item/broadcast_camera/proc/on_unwield() + QDEL_NULL(internal_camera) + QDEL_NULL(internal_radio) + + stop_broadcasting_network(camera_networks) + + set_light_on(FALSE) + playsound(source = src, soundin = 'sound/machines/terminal_prompt_deny.ogg', vol = 20, vary = FALSE, ignore_walls = FALSE) + balloon_alert_to_viewers("offline") diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 968a2f11f4d4c..8db7652d5a07e 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -694,6 +694,9 @@ color = LIGHT_COLOR_GREEN light_color = LIGHT_COLOR_GREEN +/obj/item/flashlight/lantern/jade/on + start_on = TRUE + /obj/item/flashlight/slime gender = PLURAL name = "glowing slime extract" diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 554db2beb5399..3fe16fdb3fd96 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -271,13 +271,13 @@ //catpeople: make any felinid near the target to face the target, chance for felinids to pounce at the light, stepping to the target for(var/mob/living/carbon/human/target_felinid in view(1, targloc)) - if(!isfelinid(target_felinid) || target_felinid.stat == DEAD || target_felinid.is_blind() || target_felinid.incapacitated()) + if(!isfelinid(target_felinid) || target_felinid.stat == DEAD || target_felinid.is_blind() || target_felinid.incapacitated) continue if(target_felinid.body_position == STANDING_UP) target_felinid.setDir(get_dir(target_felinid, targloc)) // kitty always looks at the light if(prob(effectchance * diode.rating)) target_felinid.visible_message(span_warning("[target_felinid] makes a grab for the light!"), span_userdanger("LIGHT!")) - target_felinid.Move(targloc) + target_felinid.Move(targloc, get_dir(target_felinid, targloc)) log_combat(user, target_felinid, "moved with a laser pointer", src) else target_felinid.visible_message(span_notice("[target_felinid] looks briefly distracted by the light."), span_warning("You're briefly tempted by the shiny light...")) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 4039b412ebe78..13821a42de40f 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -208,7 +208,7 @@ for(var/obj/machinery/light/target in user.loc) replace_light(target, user) on_a_light = TRUE - if(!on_a_light) //So we dont give a ballon alert when we just used replace_light + if(!on_a_light) //So we don't give a balloon alert when we just used replace_light user.balloon_alert(user, "[uses] lights, [bulb_shards]/[BULB_SHARDS_REQUIRED] fragments") /** diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index f6fb14c2f19ba..03ed7f927b0f7 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -59,7 +59,7 @@ /obj/item/multitool/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] puts the [src] to [user.p_their()] chest. It looks like [user.p_theyre()] trying to pulse [user.p_their()] heart off!")) - return OXYLOSS//theres a reason it wasn't recommended by doctors + return OXYLOSS//there's a reason it wasn't recommended by doctors /** * Sets the multitool internal object buffer @@ -142,7 +142,7 @@ if(distance < rangealert) //ai should be able to see us detect_state = PROXIMITY_ON_SCREEN break - if(distance < rangewarning) //ai cant see us but is close + if(distance < rangewarning) //ai can't see us but is close detect_state = PROXIMITY_NEAR /datum/action/item_action/toggle_multitool diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 1925737143e9d..364550f062aa7 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -2,9 +2,9 @@ #define CLAMPED_OFF 1 #define OPERATING 2 -#define FRACTION_TO_RELEASE 50 +#define FRACTION_TO_RELEASE 25 #define ALERT 90 -#define MINIMUM_HEAT 10000 +#define MINIMUM_HEAT 20000 // Powersink - used to drain station power @@ -23,7 +23,7 @@ throw_speed = 1 throw_range = 2 custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT* 7.5) - var/max_heat = 5e7 // Maximum contained heat before exploding. Not actual temperature. + var/max_heat = 100 * STANDARD_BATTERY_CHARGE // Maximum contained heat before exploding. Not actual temperature. var/internal_heat = 0 // Contained heat, goes down every tick. var/mode = DISCONNECTED // DISCONNECTED, CLAMPED_OFF, OPERATING var/warning_given = FALSE //! Stop warning spam, only warn the admins/deadchat once that we are about to boom. @@ -171,7 +171,7 @@ if(istype(terminal.master, /obj/machinery/power/apc)) var/obj/machinery/power/apc/apc = terminal.master if(apc.operating && apc.cell) - drained += 0.001 * apc.cell.use(0.05 * STANDARD_CELL_CHARGE, force = TRUE) + drained += 0.001 * apc.cell.use(0.1 * STANDARD_BATTERY_CHARGE, force = TRUE) internal_heat += drained /obj/item/powersink/process() diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index af19c6cd4f5da..b127a650e2d26 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -104,7 +104,7 @@ data["maxFrequency"] = MAX_FREE_FREQ return data -/obj/item/electropack/ui_act(action, params) +/obj/item/electropack/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index 88c9251d5b2bc..2eab06806dd09 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -4,26 +4,22 @@ icon = 'icons/obj/devices/circuitry_n_data.dmi' icon_state = "cypherkey_basic" w_class = WEIGHT_CLASS_TINY - /// Can this radio key access the binary radio channel? - var/translate_binary = FALSE - /// Decrypts Syndicate radio transmissions. - var/syndie = FALSE - /// If true, the radio can say/hear on the special CentCom channel. - var/independent = FALSE /// What channels does this encryption key grant to the parent headset. var/list/channels = list() + /// Flags for which "special" radio networks should be accessible + var/special_channels = NONE var/datum/language/translated_language greyscale_config = /datum/greyscale_config/encryptionkey_basic greyscale_colors = "#820a16#3758c4" /obj/item/encryptionkey/examine(mob/user) . = ..() - if(LAZYLEN(channels) || translate_binary) + if(LAZYLEN(channels) || special_channels & RADIO_SPECIAL_BINARY) var/list/examine_text_list = list() for(var/i in channels) examine_text_list += "[GLOB.channel_tokens[i]] - [LOWER_TEXT(i)]" - if(translate_binary) + if(special_channels & RADIO_SPECIAL_BINARY) examine_text_list += "[GLOB.channel_tokens[MODE_BINARY]] - [MODE_BINARY]" . += span_notice("It can access the following channels; [jointext(examine_text_list, ", ")].") @@ -34,14 +30,14 @@ name = "syndicate encryption key" icon_state = "cypherkey_syndicate" channels = list(RADIO_CHANNEL_SYNDICATE = 1) - syndie = TRUE + special_channels = RADIO_SPECIAL_SYNDIE greyscale_config = /datum/greyscale_config/encryptionkey_syndicate greyscale_colors = "#171717#990000" /obj/item/encryptionkey/binary name = "binary translator key" icon_state = "cypherkey_basic" - translate_binary = TRUE + special_channels = RADIO_SPECIAL_BINARY translated_language = /datum/language/machine greyscale_config = /datum/greyscale_config/encryptionkey_basic greyscale_colors = "#24a157#3758c4" @@ -102,6 +98,13 @@ greyscale_config = /datum/greyscale_config/encryptionkey_service greyscale_colors = "#ebebeb#3bca5a" +/obj/item/encryptionkey/headset_srvent + name = "press radio encryption key" + icon_state = "cypherkey_service" + channels = list(RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_ENTERTAINMENT = 0) + greyscale_config = /datum/greyscale_config/encryptionkey_service + greyscale_colors = "#83eb8f#3bca5a" + /obj/item/encryptionkey/headset_com name = "command radio encryption key" icon_state = "cypherkey_cube" @@ -182,7 +185,7 @@ /obj/item/encryptionkey/headset_cent name = "\improper CentCom radio encryption key" icon_state = "cypherkey_centcom" - independent = TRUE + special_channels = RADIO_SPECIAL_CENTCOM channels = list(RADIO_CHANNEL_CENTCOM = 1) greyscale_config = /datum/greyscale_config/encryptionkey_centcom greyscale_colors = "#24a157#dca01b" @@ -197,6 +200,7 @@ RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_AI_PRIVATE = 1, + RADIO_CHANNEL_ENTERTAINMENT = 1, ) /obj/item/encryptionkey/ai_with_binary @@ -210,15 +214,16 @@ RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_AI_PRIVATE = 1, + RADIO_CHANNEL_ENTERTAINMENT = 1, ) - translate_binary = TRUE + special_channels = RADIO_SPECIAL_BINARY translated_language = /datum/language/machine /obj/item/encryptionkey/ai/evil //ported from NT, this goes 'inside' the AI. name = "syndicate binary encryption key" icon_state = "cypherkey_syndicate" channels = list(RADIO_CHANNEL_SYNDICATE = 1) - syndie = TRUE + special_channels = RADIO_SPECIAL_SYNDIE greyscale_config = /datum/greyscale_config/encryptionkey_syndicate greyscale_colors = "#171717#990000" diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index edf24b0d942d4..5673afc678a41 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -11,7 +11,8 @@ GLOBAL_LIST_INIT(channel_tokens, list( RADIO_CHANNEL_SUPPLY = RADIO_TOKEN_SUPPLY, RADIO_CHANNEL_SERVICE = RADIO_TOKEN_SERVICE, MODE_BINARY = MODE_TOKEN_BINARY, - RADIO_CHANNEL_AI_PRIVATE = RADIO_TOKEN_AI_PRIVATE + RADIO_CHANNEL_AI_PRIVATE = RADIO_TOKEN_AI_PRIVATE, + RADIO_CHANNEL_ENTERTAINMENT = RADIO_TOKEN_ENTERTAINMENT, )) /obj/item/radio/headset @@ -49,7 +50,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( if(item_flags & IN_INVENTORY && loc == user) // construction of frequency description var/list/avail_chans = list("Use [RADIO_KEY_COMMON] for the currently tuned frequency") - if(translate_binary) + if(special_channels & RADIO_SPECIAL_BINARY) avail_chans += "use [MODE_TOKEN_BINARY] for [MODE_BINARY]" if(length(channels)) for(var/i in 1 to length(channels)) @@ -203,6 +204,13 @@ GLOBAL_LIST_INIT(channel_tokens, list( worn_icon_state = "srv_headset" keyslot = /obj/item/encryptionkey/headset_srvmed +/obj/item/radio/headset/headset_srvent + name = "press headset" + desc = "A headset allowing the wearer to communicate with service and broadcast to entertainment channel." + icon_state = "srvent_headset" + worn_icon_state = "srv_headset" + keyslot = /obj/item/encryptionkey/headset_srvent + /obj/item/radio/headset/headset_com name = "command radio headset" desc = "A headset with a commanding channel." @@ -430,12 +438,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( if(!(ch_name in src.channels)) LAZYSET(channels, ch_name, keyslot2.channels[ch_name]) - if(keyslot2.translate_binary) - translate_binary = TRUE - if(keyslot2.syndie) - syndie = TRUE - if(keyslot2.independent) - independent = TRUE + special_channels |= keyslot2.special_channels for(var/ch_name in channels) secure_radio_connections[ch_name] = add_radio(src, GLOB.radiochannels[ch_name]) @@ -459,6 +462,8 @@ GLOBAL_LIST_INIT(channel_tokens, list( grant_headset_languages(mob_loc) /obj/item/radio/headset/click_alt(mob/living/user) + if(!istype(user) || !Adjacent(user) || user.incapacitated) + return CLICK_ACTION_BLOCKING if (!command) return CLICK_ACTION_BLOCKING use_command = !use_command diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 504f547b5cb78..7a9a85cc66675 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -118,7 +118,7 @@ return FALSE if(freq == FREQ_SYNDICATE) - if(!(syndie)) + if(!(special_channels &= RADIO_SPECIAL_SYNDIE)) return FALSE//Prevents broadcast of messages over devices lacking the encryption return TRUE @@ -219,6 +219,19 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom, 27) command = TRUE icon_off = "intercom_command-p" +/obj/item/radio/intercom/syndicate + name = "syndicate intercom" + desc = "Talk smack through this." + command = TRUE + special_channels = RADIO_SPECIAL_SYNDIE + +/obj/item/radio/intercom/syndicate/freerange + name = "syndicate wide-band intercom" + desc = "A custom-made Syndicate-issue intercom used to transmit on all Nanotrasen frequencies. Particularly expensive." + freerange = TRUE + MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom/prison, 27) MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom/chapel, 27) MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom/command, 27) +MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom/syndicate, 27) +MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom/syndicate/freerange, 27) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 121f0bba965b3..2b7a9bad7602a 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -19,7 +19,7 @@ w_class = WEIGHT_CLASS_SMALL custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT * 0.75, /datum/material/glass=SMALL_MATERIAL_AMOUNT * 0.25) - ///if FALSE, broadcasting and listening dont matter and this radio shouldnt do anything + ///if FALSE, broadcasting and listening don't matter and this radio shouldn't do anything VAR_PRIVATE/on = TRUE ///the "default" radio frequency this radio is set to, listens and transmits to this frequency by default. wont work if the channel is encrypted VAR_PRIVATE/frequency = FREQ_COMMON @@ -57,18 +57,16 @@ var/use_command = FALSE /// If true, use_command can be toggled at will. var/command = FALSE + /// Does it play radio noise? + var/radio_noise = TRUE ///makes anyone who is talking through this anonymous. var/anonymize = FALSE /// Encryption key handling var/obj/item/encryptionkey/keyslot - /// If true, can hear the special binary channel. - var/translate_binary = FALSE - /// If true, can say/hear on the special CentCom channel. - var/independent = FALSE - /// If true, hears all well-known channels automatically, and can say/hear on the Syndicate channel. Also protects from radio jammers. - var/syndie = FALSE + /// Flags for which "special" radio networks should be accessible + var/special_channels = NONE /// associative list of the encrypted radio channels this radio is currently set to listen/broadcast to, of the form: list(channel name = TRUE or FALSE) var/list/channels /// associative list of the encrypted radio channels this radio can listen/broadcast to, of the form: list(channel name = channel frequency) @@ -81,7 +79,7 @@ /// overlay when mic is on var/overlay_mic_idle = "m_idle" - /// overlay when speaking a message (is displayed simultaniously with speaker_active) + /// overlay when speaking a message (is displayed simultaneously with speaker_active) var/overlay_mic_active = "m_active" /// When set to FALSE, will avoid calling update_icon() in set_broadcasting and co. @@ -91,6 +89,11 @@ /// If TRUE, will set the icon in initializations. VAR_PRIVATE/should_update_icon = FALSE + /// A very brief cooldown to prevent regular radio sounds from overlapping. + COOLDOWN_DECLARE(audio_cooldown) + /// A very brief cooldown to prevent "important" radio sounds from overlapping. + COOLDOWN_DECLARE(important_audio_cooldown) + /obj/item/radio/Initialize(mapload) set_wires(new /datum/wires/radio(src)) secure_radio_connections = list() @@ -104,7 +107,7 @@ perform_update_icon = FALSE set_listening(listening) set_broadcasting(broadcasting) - set_frequency(sanitize_frequency(frequency, freerange, syndie)) + set_frequency(sanitize_frequency(frequency, freerange, (special_channels & RADIO_SPECIAL_SYNDIE))) set_on(on) perform_update_icon = TRUE @@ -149,23 +152,19 @@ if(!(channel_name in channels)) channels[channel_name] = keyslot.channels[channel_name] - if(keyslot.translate_binary) - translate_binary = TRUE - if(keyslot.syndie) - syndie = TRUE - if(keyslot.independent) - independent = TRUE + special_channels = keyslot.special_channels for(var/channel_name in channels) secure_radio_connections[channel_name] = add_radio(src, GLOB.radiochannels[channel_name]) + if(!listening) + remove_radio_all(src) + // Used for cyborg override /obj/item/radio/proc/resetChannels() channels = list() secure_radio_connections = list() - translate_binary = FALSE - syndie = FALSE - independent = FALSE + special_channels = NONE ///goes through all radio channels we should be listening for and readds them to the global list /obj/item/radio/proc/readd_listening_radio_channels() @@ -177,7 +176,7 @@ /obj/item/radio/proc/make_syndie() // Turns normal radios into Syndicate radios! qdel(keyslot) keyslot = new /obj/item/encryptionkey/syndicate() - syndie = TRUE + special_channels |= RADIO_SPECIAL_SYNDIE recalculateChannels() /obj/item/radio/interact(mob/user) @@ -188,7 +187,7 @@ ..() //simple getters only because i NEED to enforce complex setter use for these vars for caching purposes but VAR_PROTECTED requires getter usage as well. -//if another decorator is made that doesnt require getters feel free to nuke these and change these vars over to that +//if another decorator is made that doesn't require getters feel free to nuke these and change these vars over to that ///simple getter for the on variable. necessary due to VAR_PROTECTED /obj/item/radio/proc/is_on() @@ -243,7 +242,7 @@ if(actual_setting) should_be_broadcasting = broadcasting - if(broadcasting && on) //we dont need hearing sensitivity if we arent broadcasting, because talk_into doesnt care about hearing + if(broadcasting && on) //we don't need hearing sensitivity if we aren't broadcasting, because talk_into doesn't care about hearing become_hearing_sensitive(INNATE_TRAIT) else if(!broadcasting) lose_hearing_sensitivity(INNATE_TRAIT) @@ -259,7 +258,7 @@ on = new_on if(on) - set_broadcasting(should_be_broadcasting)//set them to whatever theyre supposed to be + set_broadcasting(should_be_broadcasting)//set them to whatever they're supposed to be set_listening(should_be_listening) else set_broadcasting(FALSE, actual_setting = FALSE)//fake set them to off @@ -334,7 +333,7 @@ channel = null // Nearby active jammers prevent the message from transmitting - if(is_within_radio_jammer_range(src) && !syndie) + if(is_within_radio_jammer_range(src) && !(special_channels & RADIO_SPECIAL_SYNDIE)) return // Determine the identity information which will be attached to the signal. @@ -344,7 +343,7 @@ var/datum/signal/subspace/vocal/signal = new(src, freq, speaker, language, radio_message, spans, message_mods) // Independent radios, on the CentCom frequency, reach all independent radios - if (independent && (freq == FREQ_CENTCOM || freq == FREQ_CTF_RED || freq == FREQ_CTF_BLUE || freq == FREQ_CTF_GREEN || freq == FREQ_CTF_YELLOW)) + if (special_channels & RADIO_SPECIAL_CENTCOM && (freq == FREQ_CENTCOM || freq == FREQ_CTF_RED || freq == FREQ_CTF_BLUE || freq == FREQ_CTF_GREEN || freq == FREQ_CTF_YELLOW)) signal.data["compression"] = 0 signal.transmission_method = TRANSMISSION_SUPERSPACE signal.levels = list(0) @@ -354,7 +353,7 @@ if(isliving(talking_movable)) var/mob/living/talking_living = talking_movable - if(talking_living.client?.prefs.read_preference(/datum/preference/toggle/radio_noise)) + if(radio_noise && !HAS_TRAIT(talking_living, TRAIT_DEAF) && talking_living.client?.prefs.read_preference(/datum/preference/toggle/radio_noise)) SEND_SOUND(talking_living, 'sound/misc/radio_talk.ogg') // All radios make an attempt to use the subspace system first @@ -397,12 +396,12 @@ if(message_mods[RADIO_EXTENSION] == MODE_L_HAND || message_mods[RADIO_EXTENSION] == MODE_R_HAND) // try to avoid being heard double if (loc == speaker && ismob(speaker)) - var/mob/M = speaker - var/idx = M.get_held_index_of_item(src) + var/mob/mob_speaker = speaker + var/idx = mob_speaker.get_held_index_of_item(src) // left hands are odd slots if (idx && (idx % 2) == (message_mods[RADIO_EXTENSION] == MODE_L_HAND)) return - talk_into(speaker, raw_message, , spans, language=message_language, message_mods=filtered_mods) + talk_into(speaker, raw_message, spans=spans, language=message_language, message_mods=filtered_mods) /// Checks if this radio can receive on the given frequency. /obj/item/radio/proc/can_receive(input_frequency, list/levels) @@ -412,7 +411,7 @@ if(!position || !(position.z in levels)) return FALSE - if (input_frequency == FREQ_SYNDICATE && !syndie) + if (input_frequency == FREQ_SYNDICATE && !(special_channels & RADIO_SPECIAL_SYNDIE)) return FALSE // allow checks: are we listening on that frequency? @@ -420,7 +419,7 @@ return TRUE for(var/ch_name in channels) if(channels[ch_name] & FREQ_LISTENING) - if(GLOB.radiochannels[ch_name] == text2num(input_frequency) || syndie) + if(GLOB.radiochannels[ch_name] == text2num(input_frequency) || special_channels & RADIO_SPECIAL_SYNDIE) return TRUE return FALSE @@ -432,12 +431,15 @@ return var/mob/living/holder = loc - if(!holder.client?.prefs.read_preference(/datum/preference/toggle/radio_noise)) + if(!radio_noise || HAS_TRAIT(holder, TRAIT_DEAF) || !holder.client?.prefs.read_preference(/datum/preference/toggle/radio_noise)) return var/list/spans = data["spans"] - SEND_SOUND(holder, 'sound/misc/radio_receive.ogg') - if(SPAN_COMMAND in spans) + if(COOLDOWN_FINISHED(src, audio_cooldown)) + COOLDOWN_START(src, audio_cooldown, 0.5 SECONDS) + SEND_SOUND(holder, 'sound/misc/radio_receive.ogg') + if((SPAN_COMMAND in spans) && COOLDOWN_FINISHED(src, important_audio_cooldown)) + COOLDOWN_START(src, important_audio_cooldown, 0.5 SECONDS) SEND_SOUND(holder, 'sound/misc/radio_important.ogg') /obj/item/radio/ui_state(mob/user) @@ -488,7 +490,7 @@ tune = tune * 10 . = TRUE if(.) - set_frequency(sanitize_frequency(tune, freerange, syndie)) + set_frequency(sanitize_frequency(tune, freerange, (special_channels & RADIO_SPECIAL_SYNDIE))) if("listen") set_listening(!listening) . = TRUE @@ -516,10 +518,6 @@ recalculateChannels() . = TRUE -/obj/item/radio/suicide_act(mob/living/user) - user.visible_message(span_suicide("[user] starts bouncing [src] off [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!")) - return BRUTELOSS - /obj/item/radio/examine(mob/user) . = ..() if (frequency && in_range(src, user)) @@ -538,6 +536,11 @@ if(listening && overlay_speaker_idle) . += overlay_speaker_idle +/obj/item/radio/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(user.combat_mode && tool.tool_behaviour == TOOL_SCREWDRIVER) + return screwdriver_act(user, tool) + return ..() + /obj/item/radio/screwdriver_act(mob/living/user, obj/item/tool) add_fingerprint(user) unscrewed = !unscrewed @@ -591,7 +594,7 @@ channels[ch_name] = TRUE /obj/item/radio/borg/syndicate - syndie = TRUE + special_channels = RADIO_SPECIAL_SYNDIE keyslot = /obj/item/encryptionkey/syndicate /obj/item/radio/borg/syndicate/Initialize(mapload) @@ -639,4 +642,60 @@ . = ..() set_listening(FALSE) +// RADIOS USED BY BROADCASTING +/obj/item/radio/entertainment + desc = "You should not hold this." + canhear_range = 7 + freerange = TRUE + freqlock = RADIO_FREQENCY_LOCKED + radio_noise = FALSE + +/obj/item/radio/entertainment/Initialize(mapload) + . = ..() + set_frequency(FREQ_ENTERTAINMENT) + +/obj/item/radio/entertainment/speakers // Used inside of the entertainment monitors, not to be used as a actual item + should_be_listening = TRUE + should_be_broadcasting = FALSE + +/obj/item/radio/entertainment/speakers/Initialize(mapload) + . = ..() + set_broadcasting(FALSE) + set_listening(TRUE) + wires?.cut(WIRE_TX) + +/obj/item/radio/entertainment/speakers/on_receive_message(list/data) + playsound(source = src, soundin = SFX_MUFFLED_SPEECH, vol = 60, extrarange = -4, vary = TRUE, ignore_walls = FALSE) + + return ..() + +/obj/item/radio/entertainment/speakers/physical // Can be used as a physical item + name = "entertainment radio" + desc = "A portable one-way radio permamently tuned into entertainment frequency." + icon_state = "radio" + inhand_icon_state = "radio" + worn_icon_state = "radio" + overlay_speaker_idle = "radio_s_idle" + overlay_speaker_active = "radio_s_active" + overlay_mic_idle = "radio_m_idle" + overlay_mic_active = "radio_m_active" + +/obj/item/radio/entertainment/microphone // Used inside of a broadcast camera, not to be used as a actual item + should_be_listening = FALSE + should_be_broadcasting = TRUE + +/obj/item/radio/entertainment/microphone/Initialize(mapload) + . = ..() + set_broadcasting(TRUE) + set_listening(FALSE) + wires?.cut(WIRE_RX) + +/obj/item/radio/entertainment/microphone/physical // Can be used as a physical item + name = "microphone" + desc = "No comments." + icon = 'icons/obj/service/broadcast.dmi' + icon_state = "microphone" + inhand_icon_state = "microphone" + canhear_range = 3 + #undef FREQ_LISTENING diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index bebafbdab83b7..26df57683aa26 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -132,7 +132,7 @@ * tochat - Whether to immediately post the result into the chat of the user, otherwise it will return the results. */ /proc/healthscan(mob/user, mob/living/target, mode = SCANNER_VERBOSE, advanced = FALSE, tochat = TRUE) - if(user.incapacitated()) + if(user.incapacitated) return // the final list of strings to render @@ -409,7 +409,7 @@ return(jointext(render_list, "")) /proc/chemscan(mob/living/user, mob/living/target) - if(user.incapacitated()) + if(user.incapacitated) return if(istype(target) && target.reagents) @@ -495,7 +495,7 @@ /// Displays wounds with extended information on their status vs medscanners /proc/woundscan(mob/user, mob/living/carbon/patient, obj/item/healthanalyzer/scanner, simple_scan = FALSE) - if(!istype(patient) || user.incapacitated()) + if(!istype(patient) || user.incapacitated) return var/render_list = "" @@ -664,7 +664,7 @@ /// Checks the individual for any diseases that are visible to the scanner, and displays the diseases in the attacked to the attacker. /proc/diseasescan(mob/user, mob/living/carbon/patient, obj/item/healthanalyzer/simple/scanner) - if(!istype(patient) || user.incapacitated()) + if(!istype(patient) || user.incapacitated) return var/list/render = list() diff --git a/code/game/objects/items/devices/spyglasses.dm b/code/game/objects/items/devices/spyglasses.dm index 58c18f87427df..8d70f3de29215 100644 --- a/code/game/objects/items/devices/spyglasses.dm +++ b/code/game/objects/items/devices/spyglasses.dm @@ -20,7 +20,7 @@ /obj/item/clothing/glasses/sunglasses/spy/proc/on_screen_clear(client/source, window) SIGNAL_HANDLER - linked_bug.cam_screen.hide_from(source.mob) + linked_bug.cam_screen.hide_from_client(source) /obj/item/clothing/glasses/sunglasses/spy/equipped(mob/user, slot) . = ..() diff --git a/code/game/objects/items/devices/swapper.dm b/code/game/objects/items/devices/swapper.dm index dee9198c93296..fc5a9d39f9742 100644 --- a/code/game/objects/items/devices/swapper.dm +++ b/code/game/objects/items/devices/swapper.dm @@ -97,7 +97,7 @@ return teleportable /obj/item/swapper/proc/swap(mob/user) - if(QDELETED(linked_swapper) || world.time < linked_swapper.cooldown) + if(QDELETED(linked_swapper) || isnull(linked_swapper.loc) || world.time < linked_swapper.cooldown) return var/atom/movable/A = get_teleportable_container() diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index d30f379197eea..b86489fae9ea7 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -122,7 +122,7 @@ /obj/item/taperecorder/proc/can_use(mob/user) if(user && ismob(user)) - if(!user.incapacitated()) + if(!user.incapacitated) return TRUE return FALSE diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 0dc69cb9c8117..8327e185ea612 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -138,7 +138,7 @@ effective or pretty fucking useless. data["cooldown"] = DisplayTimeText(get_cooldown()) return data -/obj/item/healthanalyzer/rad_laser/ui_act(action, params) +/obj/item/healthanalyzer/rad_laser/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 598c16c9041a8..d17530c801085 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -291,7 +291,7 @@ data["valve"] = valve_open return data -/obj/item/transfer_valve/ui_act(action, params) +/obj/item/transfer_valve/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index f32b2ee30ec21..64ce9803657bb 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -181,7 +181,7 @@ name = "knucklebones rules" default_raw_text = "How to play knucklebones
\