diff --git a/.archive/.github/CODEOWNERS b/.archive/.github/CODEOWNERS index 74112cce847..52d7a1c6ec2 100644 --- a/.archive/.github/CODEOWNERS +++ b/.archive/.github/CODEOWNERS @@ -28,7 +28,11 @@ /code/modules/food_and_drinks/drinks/drinks/breakawayflask.dm @FalloutFalcon /code/modules/food_and_drinks/food/ration.dm @FalloutFalcon /code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @FalloutFalcon -/code/modules/projectiles/ @FalloutFalcon +/code/modules/projectiles/gun.dm @FalloutFalcon +/code/modules/projectiles/projectile.dm @FalloutFalcon +/code/modules/projectiles/guns/ballistic.dm @FalloutFalcon +/code/modules/projectiles/guns/energy.dm @FalloutFalcon +/code/modules/projectiles/guns/powered.dm @FalloutFalcon /code/modules/reagents/chemistry/reagents/trickwine_reagents.dm @FalloutFalcon /code/modules/unit_tests/icons/ @FalloutFalcon /code/modules/missions/ @FalloutFalcon diff --git a/.archive/.github/CONTRIBUTING.md b/.archive/.github/CONTRIBUTING.md index 4aca95a6fad..6eec8dbbca6 100644 --- a/.archive/.github/CONTRIBUTING.md +++ b/.archive/.github/CONTRIBUTING.md @@ -29,29 +29,65 @@ You can of course, as always, ask for help on the discord channels, or the forum ## Meet the Team -### Development Head +### Project Lead -The Head Developer is responsible for controlling, adding, and removing maintainers from the project. In addition to filling the role of a normal maintainer, they have sole authority on who becomes a maintainer, as well as who remains a maintainer and who does not. The Development Head also has the final say on what gameplay changes get into and out of the game. He or she has full veto power on any feature or balance additions, changes, or removals, and attempts to establish a universally accepted direction for the game. +The Project Lead is responsible for controlling, adding, and removing maintainers from the project. In addition to filling the role of a normal maintainer, they have sole authority on who becomes a maintainer, as well as who remains a maintainer and who does not. The Project Lead also has the final say on what gameplay changes are added to and removed from the game. He or she has full veto power on any feature or balance additions, changes, or removals, and attempts to establish a universally accepted direction for the game. -### Maintainers +### Head Coder/Codetainers -Maintainers are quality control. If a proposed pull request doesn't meet the following specifications, they can request you to change it, or simply just close the pull request. Maintainers can close a pull request for the following reasons: The pull request doesn't follow the guidelines, excessively undocumented changes, failure to comply with coding standards. Note that maintainers should generally help bring a pull request up to standard instead of outright closing the PR; however if the pull request author does not comply with the given guidelines or refuses to adhere to the required coding standards the pull request will be closed. **Maintainers must have a valid reason to close a pull request and state what the reason is when they close the pull request.** +The Head Coder controls the quality of code, maintainability of the project, CI, and unit tests. They have a say over features, but primarily based on the merit of the code, e.g., long-term maintenance for complex features. -Maintainers can revert your changes if they feel they are not worth maintaining or if they did not live up to the quality specifications. +### Lore Head/Loretainers + +Much of the lore team's work is done outside github itself, much of it in doucments or wiki pages; however, lore-maints can still be manually requested on a pr if it has a significant lore implication. -### Head Spriter +### Head Spriter/Spritetainers The Head Spriter controls sprites and aesthetic that get into the game. While sprites for brand-new additions are generally accepted regardless of quality, modified current art assets fall to the Head Spriter, who can decide whether or not a sprite tweak is both merited and a suitable replacement. They also control the general "perspective" of the game - how sprites should generally look, especially the angle from which they're viewed. An example of this is the 3/4 perspective, which is a bird's eye view from above the object being viewed. -### Head Mapper +### Head Mapper/Maptainers + +The Head Mapper controls ships, ruins, and other maps, including their balance and cost. Final decision on whether or not a map is added is at their discretion and cannot be vetoed by anyone other than the Project Lead. + +### Maintainers + +Maintainers are quality control. If a proposed pull request doesn't meet the following specifications, they can request you to change it, or simply just close the pull request. Singular Maintainers can close a pull request for the following reasons: The pull request doesn't follow the guidelines, has excessively undocumented changes, or fails to comply with coding standards. Note that maintainers should generally help bring a pull request up to standard instead of outright closing the PR; however, if the pull request author does not comply with the given guidelines or refuses to adhere to the required coding standards, the pull request will be closed. + +Internal discussions can be held to close given PRs based on merits like general team desires and overall direction. + +**Maintainers must have a valid reason to close a pull request and state what the reason is when they close the pull request.** -The Head Mapper controls ships and all variants of shuttles, including their balance and cost. Final decision on whether or not a shuttle is added is at their discretion and cannot be vetoed by anyone other than the Head Coder. +Maintainers can revert your changes if they feel they are not worth maintaining or if they did not live up to the quality specifications. + +Unlike most other servers, we have a more formal seperation between code-tainers, map-tainers, sprite-tainers, and even lore-tainers (lore curators). They operate semi-independently, and prs that makes meaningful changes to parts of the game requires approval from each relevent team. +Examples of changes that don't require approval +- A few fluff sprites for a map. +- Simple subtypes for a pr that adds clothing sprites. + +Game balance changes (map balance changes will still require maptainer approval), despite being a code change, can be reviewed by any maintainer or even admin. ### Maintainer Code of Conduct -Maintainers are expected to maintain the codebase in its entirety. This means that maintainers are in charge of pull requests, issues, and the Git discussion board. Maintainers have say on what will and will not be merged. Maintainers should assign themselves to pull requests that they are claiming and reviewing and should respect when others assign themselves to a pull request and not interfere except in situations where they believe a pull request to be heavily detrimental to the codebase or its playerbase. **Maintainers are not server admins and should not use their rank on the server to perform admin related tasks except where asked to by a Senior Admin or higher.** +Maintainers are expected to maintain the codebase in its entirety. This means that maintainers are in charge of pull requests, issues, and the Git discussion board. Maintainers have a say on what will and will not be merged. **Maintainers are not server admins and should not use their rank on the server to perform admin related tasks except where asked to by a Headmin or higher.** + +
+Maintainer Guidelines + +These are the few directives we have for project maintainers. + +- Do not merge PRs you create. +- Do not merge PRs until 24 hours have passed since they were opened. Exceptions include: + - Emergency fixes or CI fixes. + - Try to get secondary maintainer approval before merging if you can. + - PRs with empty commits that are intended to generate a changelog. +- Do not close PRs purely for breaking a template if the same information is contained without it. + +These are not steadfast rules, as maintainers are expected to use their best judgment when operating. + +
+ ## Specifications diff --git a/_maps/RandomRuins/BeachRuins/beach_gunsmith.dmm b/_maps/RandomRuins/BeachRuins/beach_gunsmith.dmm index 370b7aa2190..37b2375384e 100644 --- a/_maps/RandomRuins/BeachRuins/beach_gunsmith.dmm +++ b/_maps/RandomRuins/BeachRuins/beach_gunsmith.dmm @@ -3677,10 +3677,7 @@ /turf/open/floor/concrete/tiles, /area/ruin/beach/gunsmith) "Mb" = ( -/obj/item/gun/energy/plasmacutter{ - pixel_x = -16; - pixel_y = 11 - }, +/obj/item/plasmacutter, /obj/effect/decal/cleanable/oil/slippery, /mob/living/simple_animal/hostile/human/ramzi/civilian{ wander = 0 diff --git a/_maps/RandomRuins/IceRuins/icemoon_command_post.dmm b/_maps/RandomRuins/IceRuins/icemoon_command_post.dmm index 51a40fbb31a..794f94d39a1 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_command_post.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_command_post.dmm @@ -3586,13 +3586,8 @@ /turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/icemoon/command_post/crew_quarters) "Hg" = ( -/obj/structure/chair/office/dark{ - dir = 8 - }, -/mob/living/simple_animal/hostile/human/ramzi/ranged/space/stormtrooper/hydra/dmr{ - wander = 0 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/mob/living/simple_animal/hostile/human/ramzi/ranged/space/stormtrooper/hydra/dmr/sentry, /turf/open/floor/concrete/slab_4, /area/ruin/icemoon/command_post/armory) "Ho" = ( @@ -5127,6 +5122,9 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 }, +/obj/structure/chair/office/dark{ + dir = 8 + }, /turf/open/floor/concrete/slab_4, /area/ruin/icemoon/command_post/armory) "Wt" = ( diff --git a/_maps/RandomRuins/IceRuins/icemoon_training_center.dmm b/_maps/RandomRuins/IceRuins/icemoon_training_center.dmm index e89fef9cfec..15004401852 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_training_center.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_training_center.dmm @@ -2150,6 +2150,7 @@ pixel_x = 0; pixel_y = -5 }, +/obj/item/reagent_containers/food/drinks/mead, /turf/open/floor/wood, /area/ruin/icemoon/training_facility/office_2) "kA" = ( @@ -4342,7 +4343,7 @@ /turf/open/floor/plating, /area/ruin/icemoon/training_facility/classroom) "vC" = ( -/obj/machinery/computer/apc_control{ +/obj/machinery/computer/monitor{ dir = 1 }, /obj/effect/spawner/random/trash/crushed_can{ @@ -5369,11 +5370,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, /area/ruin/icemoon/training_facility/classroom) -"Ay" = ( -/obj/structure/table/greyscale, -/obj/item/attachment/gun/flamethrower, -/turf/open/floor/plating/asteroid/icerock/cracked, -/area/ruin/icemoon/training_facility) "AA" = ( /obj/effect/turf_decal/techfloor{ dir = 5 @@ -6371,6 +6367,10 @@ "Ff" = ( /turf/open/floor/plasteel/grimy, /area/ruin/icemoon/training_facility/dorms) +"Fi" = ( +/mob/living/simple_animal/hostile/human/ramzi/melee/sawbones, +/turf/open/floor/plating/rust, +/area/ruin/icemoon/training_facility/medbay) "Fj" = ( /obj/effect/turf_decal/techfloor{ dir = 8 @@ -7673,7 +7673,6 @@ /area/ruin/icemoon/training_facility/dorms) "Lz" = ( /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/human/ramzi/melee/sawbones, /turf/open/floor/plasteel/mono/white, /area/ruin/icemoon/training_facility/medbay) "LA" = ( @@ -8516,6 +8515,11 @@ }, /turf/open/floor/plating/rust, /area/ruin/icemoon/training_facility/classroom) +"PO" = ( +/obj/structure/table/greyscale, +/obj/item/attachment/gun/flamethrower, +/turf/open/floor/plating/asteroid/icerock/cracked, +/area/ruin/icemoon/training_facility) "PP" = ( /obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt, @@ -9244,7 +9248,6 @@ pixel_x = 0; pixel_y = 12 }, -/obj/item/reagent_containers/food/drinks/mead, /turf/open/floor/wood, /area/ruin/icemoon/training_facility/office_2) "SW" = ( @@ -13943,7 +13946,7 @@ qr tx Cd wr -ZU +Fi ZU rW qP @@ -14822,7 +14825,7 @@ kk wN Bv kk -Ay +PO xj xj tB diff --git a/_maps/RandomRuins/JungleRuins/jungle_bombed_starport.dmm b/_maps/RandomRuins/JungleRuins/jungle_bombed_starport.dmm index 9baa2c9081f..55633e43079 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_bombed_starport.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_bombed_starport.dmm @@ -3813,7 +3813,7 @@ req_access = list(150,10); populate = 0 }, -/obj/item/gun/energy/plasmacutter, +/obj/item/plasmacutter, /obj/item/clothing/gloves/color/yellow, /obj/item/storage/belt/utility/syndicate, /obj/item/clothing/under/syndicate/gec, diff --git a/_maps/RandomRuins/JungleRuins/jungle_interceptor.dmm b/_maps/RandomRuins/JungleRuins/jungle_interceptor.dmm index cd235131ec2..a86034f8709 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_interceptor.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_interceptor.dmm @@ -3607,7 +3607,7 @@ /turf/open/floor/plating/rust, /area/ruin/jungle/interceptor/forehall) "Fs" = ( -/obj/machinery/computer/apc_control{ +/obj/machinery/computer/monitor{ dir = 4 }, /turf/open/floor/plating/rust, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_buried_shrine.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_buried_shrine.dmm index 6d315bdb48d..dbd2a278e77 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_buried_shrine.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_buried_shrine.dmm @@ -1829,10 +1829,7 @@ pixel_x = 8; pixel_y = 21 }, -/obj/item/shield/riot/goliath{ - pixel_x = -12; - pixel_y = 16 - }, +/obj/item/shield/buckler, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/buried_shrine) "Vt" = ( diff --git a/_maps/RandomRuins/MoonRuins/moon_moonbase.dmm b/_maps/RandomRuins/MoonRuins/moon_moonbase.dmm index 8fec0ccbf39..7b44a882e64 100644 --- a/_maps/RandomRuins/MoonRuins/moon_moonbase.dmm +++ b/_maps/RandomRuins/MoonRuins/moon_moonbase.dmm @@ -351,7 +351,7 @@ /area/ruin/moon/moonbase/refinery) "cM" = ( /obj/structure/closet/toolcloset/empty, -/obj/item/gun/energy/plasmacutter, +/obj/item/plasmacutter, /obj/item/storage/toolbox/electrical, /obj/item/storage/toolbox/mechanical, /obj/item/clothing/glasses/welding, @@ -897,9 +897,6 @@ pixel_x = -10; pixel_y = 6 }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, /obj/effect/turf_decal/trimline/transparent/blue/filled/line{ dir = 4 }, @@ -945,9 +942,6 @@ /obj/structure/railing/thin/corner{ dir = 4 }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, /obj/effect/turf_decal/trimline/transparent/blue/filled/line{ dir = 1 }, @@ -1398,7 +1392,6 @@ /area/ruin/moon/moonbase/cargo) "kN" = ( /obj/structure/railing/thin/corner, -/obj/effect/turf_decal/siding/thinplating, /obj/effect/turf_decal/trimline/transparent/blue/filled/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 @@ -1406,7 +1399,6 @@ /turf/open/floor/plasteel/tech/grid, /area/ruin/moon/moonbase/dorms) "kU" = ( -/obj/effect/turf_decal/siding/thinplating/corner, /obj/effect/turf_decal/trimline/transparent/blue/filled/corner, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 5 @@ -1810,9 +1802,6 @@ /turf/open/floor/plasteel/tech, /area/ruin/moon/moonbase/refinery) "oO" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, /obj/effect/turf_decal/trimline/transparent/blue/filled/line{ dir = 4 }, @@ -2881,7 +2870,6 @@ /obj/structure/railing/thin/corner{ dir = 8 }, -/obj/effect/turf_decal/siding/thinplating, /obj/effect/turf_decal/trimline/transparent/blue/filled/line, /obj/machinery/light/directional/east, /obj/effect/decal/cleanable/dirt/dust, @@ -3051,9 +3039,6 @@ /obj/structure/railing/thin/corner{ dir = 1 }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, /obj/effect/turf_decal/trimline/transparent/blue/filled/line{ dir = 1 }, @@ -3087,9 +3072,6 @@ /turf/open/floor/plasteel/mono/dark, /area/ruin/moon/moonbase/engineering) "Bz" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 4 - }, /obj/effect/turf_decal/trimline/transparent/blue/filled/corner{ dir = 4 }, @@ -4494,9 +4476,6 @@ /obj/structure/railing/thin/corner{ dir = 1 }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, /obj/effect/turf_decal/trimline/transparent/blue/filled/line{ dir = 1 }, @@ -4668,7 +4647,6 @@ /obj/structure/railing/thin/corner{ dir = 8 }, -/obj/effect/turf_decal/siding/thinplating, /obj/effect/turf_decal/trimline/transparent/blue/filled/line, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/tech/grid, diff --git a/_maps/RandomRuins/RockRuins/rockplanet_rustbase.dmm b/_maps/RandomRuins/RockRuins/rockplanet_rustbase.dmm index 181cf6a2049..6f785dd6abd 100644 --- a/_maps/RandomRuins/RockRuins/rockplanet_rustbase.dmm +++ b/_maps/RandomRuins/RockRuins/rockplanet_rustbase.dmm @@ -1,2875 +1,3611 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ad" = ( -/obj/effect/turf_decal/industrial/warning{ +"ae" = ( +/obj/effect/turf_decal/trimline/opaque/syndiered/line{ dir = 1 }, -/obj/structure/platform/industrial_alt{ - dir = 8 - }, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/mechbay) +/obj/effect/turf_decal/corner/opaque/syndiered/border, +/obj/machinery/light/directional/south, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/bridge) +"af" = ( +/turf/closed/wall/r_wall/syndicate/nodiagonal, +/area/ruin/rockplanet/rust_base/engine_two) "ah" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/flora/stump{ + icon_state = "anchored_rod"; + pixel_y = -3; + name = "rod"; + desc = "A metal rod struck into the ground." }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/obj/item/clothing/head/helmet/ngr{ + pixel_x = 0; + pixel_y = 24 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"ai" = ( +/mob/living/simple_animal/hostile/human/ramzi/ranged/sniper/sentry, +/turf/open/floor/plating/asteroid/rockplanet/cracked/lit, +/area/ruin/rockplanet/rust_base) +"aj" = ( +/obj/structure/girder, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/dorms) +"ak" = ( +/obj/machinery/power/terminal{ dir = 4 }, -/obj/machinery/door/poddoor/preopen{ - dir = 4; - id = "rustmech" +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/structure/cable/yellow{ + icon_state = "0-8" }, /turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/engine_two) +"an" = ( +/obj/machinery/suit_storage_unit/inherit, +/obj/item/clothing/mask/gas/ramzi, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/turf/open/floor/plasteel/tech, /area/ruin/rockplanet/rust_base/mechbay) -"aq" = ( -/obj/structure/chair/plastic{ - dir = 8 +"as" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/trimline/opaque/red/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 }, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/slop) -"au" = ( -/obj/effect/turf_decal/spline/fancy/opaque/black/corner{ +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/closet/emcloset/wall/directional/north, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"av" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; dir = 8 }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 5 +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"aw" = ( +/obj/structure/chair/office{ + dir = 1 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/bridge) -"av" = ( -/obj/effect/turf_decal/spline/fancy/opaque/black{ +/area/ruin/rockplanet/rust_base/engine_two) +"ax" = ( +/obj/structure/platform/wood{ + dir = 6 + }, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"az" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 5 + }, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop2) +"aB" = ( +/turf/open/floor/concrete/slab_1, +/area/ruin/rockplanet/rust_base) +"aD" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/turf/open/floor/plasteel/mono, +/area/ruin/rockplanet/rust_base/armory) +"aG" = ( +/obj/machinery/porta_turret/ruin/ramzi{ dir = 8 }, -/obj/effect/turf_decal/siding/thinplating/dark/corner{ +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/overmap_encounter/planetoid/rockplanet/explored) +"aK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 4 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/bridge) -"aH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/turf/open/floor/concrete/slab_1, +/area/ruin/rockplanet/rust_base) +"aM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/barricade/sandbags, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"aN" = ( +/obj/machinery/door/poddoor{ + id = "frontbox2" + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/tanto2) +"aO" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/plating/rust, +/turf/open/floor/plasteel, /area/ruin/rockplanet/rust_base/hallway2) -"aJ" = ( -/obj/structure/closet/crate/bin, -/obj/machinery/button/door{ - pixel_y = 21; - id = "rustmech" +"aV" = ( +/obj/item/mine/pressure/explosive/rusty/live, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"aW" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 }, -/turf/open/floor/plasteel/tech, +/turf/open/floor/engine/hull/reinforced/interior, /area/ruin/rockplanet/rust_base/hallway) -"aK" = ( -/obj/effect/turf_decal/spline/fancy/opaque/black{ - dir = 8 +"bd" = ( +/obj/machinery/door/poddoor{ + dir = 4; + id = "rusteastsouth" }, -/obj/effect/turf_decal/siding/thinplating/dark/corner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/bridge) -"aL" = ( -/turf/closed/wall/r_wall/syndicate, -/area/ruin/rockplanet/rust_base/hallway) -"aN" = ( -/turf/open/floor/plating/asteroid/rockplanet/lit, -/area/ruin/rockplanet/rust_base) -"aV" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/table, -/obj/item/radio/weather_monitor, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway2) -"aZ" = ( -/obj/structure/table/chem, -/obj/machinery/microwave, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/slop) -"bf" = ( -/obj/machinery/button/door{ - pixel_y = 21; - id = "rustmech" +/obj/machinery/power/shieldwallgen/atmos/roundstart{ + id = "rusteastholo"; + dir = 1 }, -/turf/open/floor/plating/rust, +/obj/structure/catwalk/over, +/obj/structure/cable, +/turf/open/floor/engine/hull/rockplanet, /area/ruin/rockplanet/rust_base/mechbay) -"bh" = ( +"be" = ( +/obj/machinery/computer/helm{ + dir = 8; + layer = 3.3 + }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/light/directional/north, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/hallway) -"bj" = ( -/obj/machinery/porta_turret/ship/ramzi/heavy{ - id = "rustguns"; - lethal = 1; - dir = 5; - turret_respects_id = 0; - turret_flags = 62 +/obj/machinery/button/door{ + pixel_x = 0; + pixel_y = 24; + id = "frontiepod3" }, -/turf/closed/wall/r_wall/syndicate/nodiagonal, -/area/ruin/rockplanet/rust_base/bridge) -"bn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop3) +"bh" = ( +/obj/item/ammo_casing/spent/pistol_brass, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 5; + pixel_y = 11 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 4 +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"bi" = ( +/obj/structure/platform/wood{ + dir = 1 }, -/obj/effect/turf_decal/siding/thinplating/dark{ +/turf/open/floor/plasteel/stairs/wood/mid{ dir = 8 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"bo" = ( -/obj/machinery/vending/coffee, -/obj/machinery/light/directional/south, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"bw" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/area/ruin/rockplanet/rust_base) +"bj" = ( +/obj/machinery/door/poddoor/preopen{ + id = "rustsecure" }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 6 +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/mechbay) +"bm" = ( +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"bo" = ( +/obj/effect/spawner/random/garden/arid/fifty, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"bs" = ( +/obj/effect/decal/fakelattice, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/ruin/rockplanet/rust_base/dorms) +"bx" = ( +/obj/effect/turf_decal/siding/black{ + dir = 1 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/hallway) +/turf/open/floor/plasteel/dark, +/area/ruin/rockplanet/rust_base/mechbay) "bz" = ( -/obj/item/radio/intercom/directional/south, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"bA" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/industrial/warning{ + color = "#912a2a"; + dir = 4 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/armory) -"bC" = ( +/obj/item/ammo_casing/spent/pistol_steel, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway2) +/area/ruin/rockplanet/rust_base/armory) "bD" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"bE" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/structure/cable{ - icon_state = "2-8" + icon_state = "1-2" }, -/obj/effect/turf_decal/siding/thinplating/dark, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/mechbay) -"bI" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/machinery/airalarm/directional/east, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"bH" = ( +/obj/effect/turf_decal/siding/wood{ dir = 4 }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 +/obj/structure/barricade/sandbags, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"bJ" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/directional/north, +/obj/item/reagent_containers/glass/concrete_bag{ + pixel_x = 5 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"ca" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/item/reagent_containers/glass/concrete_bag{ + pixel_x = -5 }, -/obj/effect/decal/cleanable/blood/drip, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 9 +/obj/structure/railing/corner, +/obj/effect/turf_decal/siding/thinplating/dark, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/hallway2) +"bK" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 6 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/obj/structure/closet/crate/radiation, -/obj/item/stack/sheet/mineral/uranium/ten, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"cc" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 - }, -/turf/open/floor/plasteel/patterned, +/area/ruin/rockplanet/rust_base/armory) +"bM" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/effect/mob_spawn/human/corpse/ramzi/trooper, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plasteel, /area/ruin/rockplanet/rust_base/hallway) -"cl" = ( +"bP" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"bQ" = ( /obj/structure/window/plasma/reinforced/plastitanium, /obj/structure/grille, -/obj/machinery/door/poddoor{ - id = "rustenginetwo" +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 }, /turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"cs" = ( +/area/ruin/rockplanet/rust_base) +"bR" = ( /turf/closed/mineral/random/rockplanet, -/area/ruin/rockplanet/rust_base/tanto2) -"cB" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/overmap_encounter/planetoid/rockplanet/explored) +"bT" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/freezer, +/area/ruin/rockplanet/rust_base/hallway) +"bX" = ( +/obj/effect/turf_decal/siding/black{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden/layer2{ - dir = 4 +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/mechbay) +"bY" = ( +/obj/structure/marker_beacon{ + picked_color = "Lime" }, -/obj/machinery/atmospherics/pipe/manifold/brown/hidden/layer4{ +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/overmap_encounter/planetoid/rockplanet/explored) +"ce" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/layer2{ dir = 4 }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/siding/thinplating/dark{ +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"cg" = ( +/obj/machinery/door/airlock/hatch{ + name = "Engine"; dir = 8 }, -/turf/open/floor/plasteel/patterned, +/turf/open/floor/plasteel/tech/grid, /area/ruin/rockplanet/rust_base/hallway2) -"cF" = ( -/obj/structure/table/reinforced, -/obj/item/megaphone/sec, -/obj/effect/turf_decal/techfloor, -/turf/open/floor/plasteel/telecomms_floor, -/area/ruin/rockplanet/rust_base/bridge) -"cI" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/blood/footprints{ - dir = 8; - pixel_y = -8 +"ch" = ( +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/internals, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 6 +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/dorms) +"ci" = ( +/mob/living/simple_animal/hostile/human/ramzi/ranged/space/shotgun{ + minimum_distance = 0; + retreat_distance = 0 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_two) -"cN" = ( +/obj/effect/turf_decal/siding/black, +/turf/open/floor/plasteel/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"cj" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 10 +/obj/machinery/light/directional/east, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"cm" = ( +/obj/structure/closet/syndicate/personal{ + name = "captain's closet"; + populate = 0; + anchored = 1 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 10 +/obj/item/clothing/gloves/combat, +/obj/item/clothing/shoes/combat, +/obj/item/clothing/suit/armor/ramzi/captain, +/obj/item/clothing/under/syndicate/ramzi/officer, +/obj/item/clothing/head/ramzi/beret, +/obj/item/storage/guncase/pistol/a357, +/turf/open/floor/carpet/red, +/area/ruin/rockplanet/rust_base/dorms) +"cq" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 1 }, -/obj/effect/turf_decal/spline/fancy/opaque/black, -/obj/effect/turf_decal/siding/thinplating/dark{ +/obj/effect/turf_decal/siding/thinplating, +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/mechbay) +"cz" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop3) +"cG" = ( +/turf/open/floor/plasteel/stairs/left{ + dir = 4 + }, +/area/ruin/rockplanet/rust_base/hallway2) +"cL" = ( +/obj/effect/turf_decal/corner/transparent/syndiered/border{ dir = 1 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/bridge) -"dd" = ( -/obj/structure/bed/double/maint, -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_one) -"de" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/ruin/rockplanet/rust_base/hallway2) +"cM" = ( +/obj/effect/turf_decal/techfloor{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/obj/structure/chair/comfy/shuttle{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 4 +/obj/effect/mob_spawn/human/corpse/frontier, +/obj/effect/decal/cleanable/blood, +/obj/item/shard{ + pixel_x = 14; + pixel_y = -15 + }, +/obj/machinery/button/door{ + pixel_x = -20; + pixel_y = 7; + dir = 4; + id = "frontbox1" + }, +/obj/machinery/button/door{ + pixel_x = -20; + pixel_y = -5; + dir = 4; + id = "frontbox2" + }, +/turf/open/floor/pod, +/area/ruin/rockplanet/rust_base/tanto2) +"cN" = ( +/obj/machinery/power/smes/shuttle/precharged, +/obj/structure/window/reinforced{ + dir = 8 }, +/obj/effect/decal/cleanable/dirt/dust, /obj/machinery/door/poddoor{ - id = "rustarmory"; + id = "rustengine1"; dir = 4 }, /turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/armory) -"df" = ( -/obj/machinery/power/shuttle/engine/fire, -/turf/open/floor/engine/hull/rockplanet, /area/ruin/rockplanet/rust_base/engine_one) -"dh" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/mechbay) -"do" = ( -/obj/machinery/porta_turret/ship/ramzi/light{ - dir = 4; - id = "rustguns"; - turret_respects_id = 0; - turret_flags = 62; - lethal = 1 +"cQ" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 1 }, -/turf/closed/wall/r_wall/syndicate/nodiagonal, -/area/ruin/rockplanet/rust_base/engine_two) -"dt" = ( /obj/structure/flippedtable{ - dir = 8 - }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/hallway) -"dv" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "4-8" + dir = 4 }, -/obj/machinery/door/poddoor{ - dir = 4; - id = "rustarmor" +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"cW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 5 }, -/obj/structure/barricade/wooden/crude{ - layer = 3.5 +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/armory) -"dw" = ( -/obj/machinery/atmospherics/components/unary/shuttle/fire_heater, -/obj/machinery/door/poddoor{ - dir = 4; - id = "rustenginetwo" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_two) -"dD" = ( -/obj/structure/flora/tree/cactus, +/obj/structure/catwalk/over/plated_catwalk/dark, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/engine_one) +"db" = ( +/obj/effect/decal/cleanable/blood/squirt, /turf/open/floor/plating/asteroid/rockplanet/lit, /area/ruin/rockplanet/rust_base) -"dE" = ( -/obj/structure/cable{ - icon_state = "1-2" +"de" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck/syndicate{ + pixel_x = 4; + pixel_y = 8 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/hallway) -"dF" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/chair/bench/red/directional/west, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway2) -"dL" = ( -/obj/effect/decal/cleanable/blood/tracks, -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/concrete/slab_1, +/area/ruin/rockplanet/rust_base) +"dk" = ( +/obj/structure/platform/wood, +/turf/open/floor/plasteel/stairs/wood/mid{ + dir = 8 }, -/turf/open/floor/pod, -/area/ruin/rockplanet/rust_base/tanto2) -"dM" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/ruin/rockplanet/rust_base) +"do" = ( +/turf/closed/wall/concrete, +/area/overmap_encounter/planetoid/rockplanet/explored) +"ds" = ( +/obj/item/food/grown/ash_flora/cactus_fruit, +/obj/item/food/grown/ash_flora/cactus_fruit, +/obj/item/food/grown/ash_flora/cactus_fruit, +/obj/item/food/grown/ash_flora/cactus_fruit, +/obj/structure/crate_shelf, +/obj/structure/closet/crate, +/turf/open/floor/concrete/slab_3/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"dt" = ( +/obj/machinery/door/poddoor{ + id = "rustarmory"; + name = "Infantry Deployment"; + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/effect/turf_decal/spline/fancy/opaque/syndiered{ +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/hallway2) +"dC" = ( +/obj/item/stack/sheet/mineral/snow{ + pixel_x = -5; + pixel_y = 0 + }, +/turf/open/floor/plating/asteroid/snow/lit/rockplanet, +/area/ruin/rockplanet/rust_base) +"dF" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/techfloor{ dir = 1 }, -/turf/open/floor/plasteel/patterned/grid, -/area/ruin/rockplanet/rust_base/mechbay) -"dZ" = ( -/obj/structure/closet/crate/medical, -/obj/item/hatchet/wooden, -/obj/item/melee/knife/survival, -/obj/item/wirecutters, -/obj/item/stack/medical/splint/hunter, -/obj/item/screwdriver, -/obj/item/bodybag, -/obj/item/bodybag, -/obj/item/reagent_containers/glass/bottle/morphine, -/obj/structure/lattice/catwalk, -/obj/effect/decal/cleanable/greenglow, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/gloves/color/latex/nitrile/evil, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"eg" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/table/reinforced, +/obj/item/melee/energy/flyssa{ + pixel_x = -7; + pixel_y = 5 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"eh" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/item/clothing/head/HoS/cybersun{ + pixel_x = 7; + pixel_y = 7 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"el" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 +/obj/machinery/recharger{ + pixel_x = 0; + pixel_y = 3 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/turf/open/floor/plasteel/telecomms_floor, +/area/ruin/rockplanet/rust_base/bridge) +"dG" = ( +/obj/effect/turf_decal/borderfloor{ dir = 4 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_two) -"eq" = ( -/obj/effect/turf_decal/siding/thinplating/dark/corner{ - dir = 1 +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 8 }, -/turf/open/floor/plasteel/patterned, +/obj/structure/closet/emcloset/wall/directional/west, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/hallway) -"er" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/cryopod/retro/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/structure/chair/handrail{ +"dJ" = ( +/obj/effect/turf_decal/borderfloor{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ dir = 8 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/cryo) -"es" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"dK" = ( +/obj/effect/turf_decal/industrial/warning, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"dN" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/slop) +"dR" = ( +/turf/closed/wall/r_wall/syndicate/nodiagonal, +/area/ruin/rockplanet/rust_base/slop) +"dT" = ( +/obj/structure/closet/secure_closet/freezer/fridge{ + populate = 0 }, -/mob/living/simple_animal/hostile/human/ramzi/ranged/space/smg, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/mechbay) -"ev" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/mob/living/simple_animal/hostile/human/ramzi/ranged/space/smg, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/mechbay) -"ew" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/item/food/grown/potato, +/obj/item/food/grown/potato{ + pixel_x = 3; + pixel_y = -1 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 6 +/obj/item/food/grown/potato{ + pixel_x = 2; + pixel_y = -5 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 4 +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -6; + pixel_y = -5 }, -/obj/effect/turf_decal/corner/opaque/syndiered{ - dir = 9 +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -9; + pixel_y = -4 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/plastitanium, -/area/ruin/rockplanet/rust_base/armory) -"ey" = ( -/obj/machinery/button/door{ - pixel_y = -21; - dir = 1; - id = "rustengineone" +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -5; + pixel_y = 0 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_one) -"eA" = ( -/obj/structure/table/chem, -/obj/item/stock_parts/scanning_module{ - pixel_x = -10; - pixel_y = 11 +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -2; + pixel_y = 6 }, -/obj/item/stock_parts/scanning_module{ - pixel_x = -5 +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -7; + pixel_y = 1 }, -/obj/item/stock_parts/micro_laser{ - pixel_x = 1; - pixel_y = 8 +/obj/item/food/grown/potato, +/obj/item/food/grown/potato, +/obj/item/food/grown/potato, +/obj/item/food/grown/potato, +/obj/item/food/grown/potato{ + pixel_x = 4; + pixel_y = 0 }, -/obj/item/stock_parts/capacitor{ - pixel_x = 6; - pixel_y = 2 +/obj/item/food/grown/potato{ + pixel_x = 5; + pixel_y = -4 }, -/obj/item/reagent_containers/hypospray/medipen/stimpack/crisis{ - pixel_x = 10; - pixel_y = 7 +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -12; + pixel_y = -1 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_two) -"eD" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "0-4" +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "2-4" +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base) +"dW" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 9 }, -/obj/machinery/door/poddoor{ - dir = 4; - id = "rustwest" +/obj/machinery/atmospherics/pipe/layer_manifold/visible, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_one) +"dX" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/barricade/sandbags, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"dZ" = ( +/obj/effect/turf_decal/borderfloor{ + dir = 4 }, -/obj/machinery/power/shieldwallgen/atmos/roundstart{ - id = "rustwestholo" +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 8 }, -/turf/open/floor/engine/hull/rockplanet, +/obj/structure/closet/firecloset/wall/directional/west, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/hallway) -"eH" = ( -/obj/structure/cable{ - icon_state = "4-8" +"ea" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 }, -/turf/open/floor/plating/asteroid/dirt/rockplanet, -/area/ruin/rockplanet/rust_base) -"eM" = ( -/obj/machinery/computer/security/retro{ +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 4 + }, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 1 }, -/obj/effect/turf_decal/techfloor, -/turf/open/floor/plasteel/telecomms_floor, -/area/ruin/rockplanet/rust_base/bridge) -"eR" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/cable{ - icon_state = "0-2" + icon_state = "1-2" }, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/cryo) -"eZ" = ( -/obj/effect/turf_decal/industrial/loading{ +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"ef" = ( +/obj/structure/mecha_wreckage/gygax/dark, +/obj/effect/decal/cleanable/glass/plasma, +/obj/effect/decal/cleanable/plastic, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/mechbay) +"ek" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = 14; + pixel_y = 0 + }, +/obj/structure/mirror{ + pixel_x = 26; + pixel_y = 0 + }, +/obj/machinery/door/window{ dir = 1 }, /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 }, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/mechbay) -"fj" = ( -/turf/closed/wall/r_wall/syndicate, -/area/ruin/rockplanet/rust_base/engine_two) -"fp" = ( -/obj/effect/turf_decal/siding/thinplating/dark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned, +/area/ruin/rockplanet/rust_base/hallway) +"es" = ( +/obj/effect/turf_decal/industrial/warning{ + color = "#912a2a"; + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/tech, /area/ruin/rockplanet/rust_base/armory) -"fM" = ( -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +"eu" = ( +/obj/structure/chair/comfy/shuttle, +/obj/effect/decal/fakelattice, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/hallway2) +"ew" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/obj/structure/cable{ + icon_state = "0-4" }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway2) -"fU" = ( +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/engine_one) +"ez" = ( +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"eA" = ( +/obj/structure/flora/ash/garden/arid, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/ruin/rockplanet/rust_base) +"eG" = ( +/obj/machinery/suit_storage_unit/inherit, +/obj/item/tank/internals/oxygen/yellow, +/obj/item/clothing/suit/space/syndicate/ramzi, +/obj/item/clothing/head/helmet/space/syndicate/ramzi, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/engine_two) +"eM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/door/airlock/hatch{ + name = "Engine" + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/hallway) +"eP" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/tanto2) +"eQ" = ( +/obj/structure/table, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/ruin/rockplanet/rust_base) +"eW" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_two) +"eY" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ +/turf/open/floor/carpet/red, +/area/ruin/rockplanet/rust_base/dorms) +"eZ" = ( +/obj/machinery/door/airlock/external{ dir = 8 }, -/obj/effect/turf_decal/siding/thinplating{ +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/turf/open/floor/plasteel/patterned/ridged, -/area/ruin/rockplanet/rust_base/slop) -"ge" = ( +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base) +"fc" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 4 + }, +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/spitter/internals, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 8 + }, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden/layer2{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/manifold/brown/hidden/layer4{ - dir = 8 +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"fg" = ( +/obj/item/stack/ore/salvage/scrapmetal{ + pixel_x = -6; + pixel_y = 7 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_two) +"fh" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" }, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop3) +"fj" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/plating/asteroid/rockplanet/cracked/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"fl" = ( +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/structure/grille, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base) +"fp" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"gg" = ( -/obj/machinery/atmospherics/pipe/simple{ +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/slop) +"fs" = ( +/obj/structure/table/chem, +/obj/effect/turf_decal/corner/transparent/red/diagonal, +/turf/open/floor/hangar/plasteel/dark, +/area/ruin/rockplanet/rust_base/slop) +"fu" = ( +/obj/effect/turf_decal/borderfloor{ dir = 4 }, -/obj/structure/table/chem, -/obj/item/flamethrower/full{ - pixel_y = 4 +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 8 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"gh" = ( -/obj/structure/chair/handrail, -/turf/open/floor/plating/rust, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/hallway) -"go" = ( -/obj/structure/rack, -/obj/item/mecha_ammo/scattershot{ - pixel_y = 5 +"fB" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 }, -/obj/effect/turf_decal/siding/thinplating, -/obj/item/mecha_ammo/scattershot{ - pixel_y = 11 +/obj/effect/turf_decal/trimline/opaque/syndiered/warning{ + dir = 4 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"gu" = ( -/obj/effect/turf_decal/industrial/warning, -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/plasteel/mono, +/obj/item/ammo_casing/spent/slug/buck, +/turf/open/floor/plasteel/mono/dark, /area/ruin/rockplanet/rust_base/armory) -"gw" = ( -/obj/effect/decal/cleanable/glass, -/obj/item/shard{ - pixel_x = -7; - pixel_y = 6 - }, -/obj/machinery/power/smes/engineering, -/obj/structure/cable{ - icon_state = "0-8" +"fE" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/structure/chair{ + dir = 8 }, -/turf/open/floor/pod, -/area/ruin/rockplanet/rust_base/tanto2) -"gF" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/structure/flippedtable, -/obj/structure/fluff/paper/stack{ - dir = 6; - pixel_y = 24; - pixel_x = -3 +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway) +"fF" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway) +"fK" = ( +/obj/structure/dresser, +/turf/open/floor/carpet/red, +/area/ruin/rockplanet/rust_base/dorms) +"fO" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"gH" = ( -/turf/closed/wall/r_wall/syndicate, -/area/ruin/rockplanet/rust_base/cryo) -"gM" = ( +/obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-2" }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 10 +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/slop) +"fP" = ( +/obj/structure/platform/industrial_alt{ + dir = 8 }, -/obj/effect/turf_decal/spline/fancy/opaque/syndiered{ - dir = 5 +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 1 }, -/turf/open/floor/plasteel/patterned/grid, +/obj/effect/turf_decal/siding/thinplating, +/turf/open/floor/plasteel/tech/techmaint, /area/ruin/rockplanet/rust_base/mechbay) -"gQ" = ( +"fR" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"gT" = ( -/obj/effect/turf_decal/industrial/warning, -/turf/open/floor/plasteel/mono, /area/ruin/rockplanet/rust_base/mechbay) -"gW" = ( -/obj/machinery/door/airlock/hatch{ - dir = 4 +"fS" = ( +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"fT" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/turf/closed/wall/concrete, +/area/ruin/rockplanet/rust_base) +"fV" = ( +/obj/structure/platform/wood{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"fW" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/structure/closet/crate/bin, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway2) +"fY" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/closet/emcloset/wall/directional/south, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop4) +"gb" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"ge" = ( +/obj/effect/turf_decal/corner_steel_grid{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/hallway2) +"gf" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/corner_steel_grid{ dir = 4 }, +/obj/machinery/light/directional/north, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/hallway) -"hL" = ( +/area/ruin/rockplanet/rust_base/hallway2) +"gi" = ( /obj/effect/turf_decal/industrial/warning{ dir = 1 }, -/obj/structure/cable{ - icon_state = "1-4" - }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/mono, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/mechbay) -"hR" = ( -/obj/machinery/atmospherics/pipe/simple{ +"gj" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/concrete/slab_1/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"gk" = ( +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/slug/buck, +/obj/effect/decal/cleanable/blood{ + icon_state = "floor3" + }, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"gn" = ( +/obj/effect/turf_decal/borderfloor{ dir = 4 }, -/obj/structure/table/chem, -/obj/item/reagent_containers/glass/beaker/large/napalm{ - pixel_x = -6; - pixel_y = 5 - }, -/obj/item/reagent_containers/glass/beaker/large/napalm{ - pixel_x = 6; - pixel_y = 5 +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 8 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"hW" = ( -/obj/effect/decal/cleanable/glass, -/obj/item/broken_bottle{ - pixel_x = -10 +/obj/machinery/light/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"go" = ( +/obj/effect/decal/cleanable/blood{ + icon_state = "floor3" }, -/obj/item/broken_bottle{ - pixel_x = 2; - pixel_y = -7 +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"gq" = ( +/obj/effect/turf_decal/corner/transparent/syndiered/border, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/mechbay) +"gv" = ( +/obj/structure/toilet{ + dir = 8; + pixel_y = 2; + pixel_x = 6 }, -/obj/item/broken_bottle{ - pixel_x = 12; - pixel_y = -1 +/mob/living/simple_animal/hostile/human/ramzi/civilian{ + name = "Kaiser 'Shy' Dan" }, -/obj/machinery/power/terminal{ - dir = 1 +/obj/effect/decal/cleanable/food/salt, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned/brushed, +/area/ruin/rockplanet/rust_base/slop) +"gy" = ( +/obj/effect/turf_decal/borderfloor/corner{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "0-2" +/obj/effect/turf_decal/trimline/opaque/syndiered/warning{ + dir = 10 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/mono/dark, +/area/ruin/rockplanet/rust_base/armory) +"gE" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/internals, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8; + pixel_y = -8 }, -/turf/open/floor/pod, -/area/ruin/rockplanet/rust_base/tanto2) -"hX" = ( -/obj/effect/turf_decal/techfloor{ +/obj/effect/decal/cleanable/blood/squirt{ dir = 4 }, -/obj/structure/reagent_dispensers/beerkeg{ - pixel_x = 8; - pixel_y = -3 - }, -/obj/structure/reagent_dispensers/beerkeg{ - pixel_x = -10; - pixel_y = 1 - }, -/obj/structure/cable, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/pistol_brass, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway2) +"gF" = ( /obj/machinery/power/terminal{ dir = 4 }, -/obj/machinery/light/small/broken/directional/south, -/turf/open/floor/pod, -/area/ruin/rockplanet/rust_base/tanto2) -"hY" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_one) -"ib" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "0-8" }, -/obj/structure/closet/crate/radiation, -/obj/item/stack/sheet/mineral/plasma/ten, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_one) -"io" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/obj/structure/closet/emcloset/wall/directional/north, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop1) +"gG" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/effect/turf_decal/trimline/opaque/red/line{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/corner/opaque/syndiered{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/fluff/paper/stack{ - dir = 4; - pixel_y = -2; - pixel_x = -12 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/rockplanet/rust_base/armory) -"iq" = ( -/obj/structure/table, -/obj/item/toy/cards/deck/syndicate{ - pixel_y = 2; - pixel_x = 4 - }, -/obj/item/reagent_containers/food/drinks/mead, -/turf/open/floor/carpet/red, -/area/ruin/rockplanet/rust_base/dorms) -"ir" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/brown/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plasteel/patterned, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/hallway) -"iz" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable{ - icon_state = "0-2" +"gI" = ( +/obj/structure/table/reinforced, +/obj/item/radio/intercom/wideband/table{ + dir = 4; + pixel_y = -10 }, -/obj/effect/turf_decal/siding/thinplating{ +/obj/structure/railing{ + dir = 5 + }, +/obj/effect/turf_decal/siding/black{ dir = 1 }, -/turf/open/floor/plasteel/tech, +/turf/open/floor/plasteel/dark, /area/ruin/rockplanet/rust_base/mechbay) -"iD" = ( -/obj/effect/decal/cleanable/glass/plasma, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_one) -"iM" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "0-2" +"gJ" = ( +/obj/machinery/door/poddoor/preopen{ + id = "rustsecure2" }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/hallway2) +"gK" = ( /obj/machinery/door/poddoor{ - dir = 4; - id = "rusteastsouth" - }, -/obj/machinery/power/shieldwallgen/atmos/roundstart{ - id = "rusteastholo" + id = "rustmech"; + name = "Heavy Infantry Deployment" }, -/turf/open/floor/engine/hull/rockplanet, +/turf/open/floor/plasteel/tech/grid, /area/ruin/rockplanet/rust_base/mechbay) -"iQ" = ( -/turf/closed/wall/r_wall/syndicate/nodiagonal, -/area/ruin/rockplanet/rust_base/armory) -"jf" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +"gO" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/trimline/opaque/red/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 - }, -/obj/machinery/door/airlock/hatch{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/armory) -"jh" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "1-4" +/obj/effect/decal/cleanable/blood/splatter{ + icon_state = "armorblood" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/obj/effect/decal/cleanable/blood/splatter{ + icon_state = "floor4" }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 5 +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"gS" = ( +/obj/structure/crate_shelf, +/obj/effect/turf_decal/spline/fancy/opaque/black, +/obj/structure/closet/crate/rations, +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/mechbay) +"gT" = ( +/obj/item/melee/boarding_axe{ + pixel_x = 8; + pixel_y = -16 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_one) -"jj" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 4 +/obj/effect/decal/cleanable/blood{ + icon_state = "floor5" }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/hallway2) -"jp" = ( -/obj/structure/cable{ - icon_state = "1-8" +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"gX" = ( +/obj/effect/turf_decal/corner/transparent/red/diagonal, +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/flame, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/hangar/plasteel/dark, +/area/ruin/rockplanet/rust_base/slop) +"hd" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"he" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 }, -/obj/effect/turf_decal/arrows/white{ - dir = 4; - pixel_y = 7 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/mechbay) -"jq" = ( -/obj/item/radio/intercom/directional/north, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"jw" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/mechbay) +"hf" = ( +/obj/effect/decal/cleanable/oil/slippery, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_one) -"jy" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/effect/turf_decal/spline/fancy/opaque/syndiered, -/turf/open/floor/plasteel/patterned/grid, -/area/ruin/rockplanet/rust_base/armory) -"jD" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, +/obj/effect/decal/cleanable/dirt, /obj/structure/cable{ - icon_state = "1-4" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 5 +/turf/open/floor/plasteel/stairs/mid{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/brown/hidden/layer4, +/area/ruin/rockplanet/rust_base/mechbay) +"hh" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 8 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway2) -"jG" = ( -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/turf/open/floor/plating, +/turf/open/floor/plasteel/tech, /area/ruin/rockplanet/rust_base/dorms) -"jI" = ( -/obj/structure/cable{ - icon_state = "1-2" +"hk" = ( +/obj/machinery/door/poddoor{ + id = "rustmech"; + name = "Heavy Infantry Deployment"; + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"jJ" = ( -/obj/structure/cable{ - icon_state = "0-8" +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 }, -/obj/machinery/power/smes/engineering, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_one) -"jP" = ( -/obj/structure/platform/industrial_alt{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/mechbay) +"hq" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 }, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/mechbay) -"jQ" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden/layer2{ - dir = 8 +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 1; + layer = 2.040 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/mob/living/simple_animal/hostile/human/ramzi/melee/space/stormtrooper/sledge{ - name = "Captain Dwight" +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"hw" = ( +/obj/structure/chair/comfy/shuttle, +/obj/machinery/light/directional/north, +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop2) +"hA" = ( +/obj/structure/chair/stool, +/obj/structure/sign/poster/contraband/syndiemoth{ + pixel_x = 30; + pixel_y = 0 + }, +/turf/open/floor/concrete/slab_1, +/area/ruin/rockplanet/rust_base) +"hF" = ( +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/structure/grille, +/obj/machinery/door/poddoor{ + id = "rustbridge" }, -/turf/open/floor/plasteel/white, +/turf/open/floor/plating, /area/ruin/rockplanet/rust_base/bridge) -"ke" = ( -/obj/effect/turf_decal/spline/fancy/opaque/black/corner{ +"hI" = ( +/obj/effect/turf_decal/trimline/opaque/syndiered/line, +/obj/effect/turf_decal/corner/opaque/syndiered/border{ dir = 1 }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 6 - }, /turf/open/floor/plasteel/tech, /area/ruin/rockplanet/rust_base/bridge) -"ki" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/obj/structure/sign/poster/contraband/c20r{ - pixel_x = 31 +"hJ" = ( +/obj/structure/barricade/sandbags, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 }, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"kl" = ( -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 6 - }, -/obj/effect/turf_decal/spline/fancy/opaque/syndiered{ - dir = 4 - }, -/turf/open/floor/plasteel/patterned/grid, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"hS" = ( +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/spitter/internals, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet/red, +/area/ruin/rockplanet/rust_base/dorms) +"hW" = ( +/turf/closed/wall/r_wall/syndicate/nodiagonal, /area/ruin/rockplanet/rust_base/armory) -"kn" = ( -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 6 - }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 5 - }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"kt" = ( -/obj/effect/decal/cleanable/blood/tracks, -/obj/machinery/door/poddoor/preopen{ - id = "frontbox1" - }, -/obj/item/shard{ - pixel_y = -8 - }, -/obj/structure/cable{ - icon_state = "1-2" +"hY" = ( +/obj/effect/turf_decal/industrial/warning, +/obj/item/stack/ore/salvage/scrapmetal/five{ + pixel_x = -13; + pixel_y = 10 }, -/turf/open/floor/plasteel/tech/grid, -/area/ruin/rockplanet/rust_base/tanto2) -"ky" = ( -/obj/structure/lattice/catwalk, +/obj/effect/decal/fakelattice, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"ih" = ( /obj/machinery/door/poddoor{ dir = 4; - id = "rustarmor" - }, -/obj/structure/barricade/wooden/crude{ - layer = 3.5 - }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/armory) -"kz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/armory) -"kE" = ( -/obj/structure/window/plasma/reinforced/plastitanium, -/obj/structure/grille, -/obj/machinery/door/poddoor{ - id = "rustbridge" + id = "rusteastsouth" }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/bridge) -"kG" = ( -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/oil/slippery, -/turf/open/floor/plasteel/stairs/right{ - dir = 4 +/obj/machinery/power/shieldwallgen/atmos/roundstart{ + id = "rusteastholo" }, -/area/ruin/rockplanet/rust_base/mechbay) -"kH" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/rockplanet/rust_base/hallway2) -"kM" = ( -/obj/structure/flora/junglebush/c, -/turf/open/floor/plating/asteroid/dirt/rockplanet, -/area/ruin/rockplanet/rust_base) -"kO" = ( -/obj/machinery/porta_turret/ship/ramzi/light{ - dir = 4; - id = "rustguns"; - turret_respects_id = 0; - turret_flags = 62; - lethal = 1 +/obj/structure/catwalk/over, +/obj/structure/cable{ + icon_state = "0-2" }, /turf/open/floor/engine/hull/rockplanet, /area/ruin/rockplanet/rust_base/mechbay) -"kU" = ( -/obj/machinery/mech_bay_recharge_port{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating{ +"ij" = ( +/turf/closed/wall/r_wall, +/area/ruin/rockplanet/rust_base/hallway) +"im" = ( +/obj/effect/turf_decal/industrial/warning{ dir = 1 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"lg" = ( -/obj/structure/chair/office/dark{ - dir = 4 - }, -/obj/effect/turf_decal/spline/fancy/opaque/syndiered{ - dir = 6 - }, -/turf/open/floor/plasteel/patterned/grid, +/obj/structure/closet/crate/rations, +/obj/effect/mapping_helpers/crate_shelve, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/mechbay) -"lm" = ( -/obj/machinery/door/airlock/hatch, -/obj/structure/cable{ - icon_state = "1-2" +"ip" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/slop) -"lt" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_two) +"is" = ( +/obj/machinery/door/airlock/external{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/obj/machinery/door/airlock/hatch{ - dir = 4; - name = "Bridge" +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base) +"it" = ( +/obj/machinery/light/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner_techfloor_gray{ + dir = 6 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/bridge) -"lD" = ( +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/engine_two) +"iv" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/hallway2) +"iw" = ( /obj/structure/table/reinforced, -/obj/item/radio/intercom/wideband/table{ - dir = 4; - pixel_y = -10 +/obj/machinery/cell_charger{ + pixel_x = 0; + pixel_y = 1 }, -/obj/structure/railing{ - dir = 5 +/obj/effect/turf_decal/corner_techfloor_gray{ + dir = 10 + }, +/obj/machinery/button/door{ + pixel_y = 21; + id = "rustengine2"; + name = "cargo storage door button" + }, +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/engine_two) +"ix" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 }, +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop4) +"iz" = ( +/obj/effect/turf_decal/corner/transparent/syndiered/border, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 + dir = 1 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"lL" = ( -/obj/effect/turf_decal/siding/thinplating/dark/corner, -/obj/structure/closet/secure_closet/armorycage{ - anchored = 1; - name = "ammunition locker"; - locked = 0; - req_access = null +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/item/ammo_box/magazine/m45_cobra, -/obj/item/ammo_box/magazine/m45_cobra, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"lO" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/ruin/rockplanet/rust_base/mechbay) +"iA" = ( +/obj/machinery/button/door{ + pixel_x = 21; + pixel_y = 0; + dir = 8; + id = "rustbunk1" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/turf/open/floor/plating/asteroid/snow/lit/rockplanet, +/area/ruin/rockplanet/rust_base) +"iC" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/pistol_brass, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway2) +"iD" = ( +/obj/effect/turf_decal/trimline/opaque/syndiered/corner{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 4 +/obj/effect/turf_decal/corner/opaque/syndiered/border, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/obj/machinery/firealarm/directional/south{ + pixel_x = 8; + pixel_y = -32 + }, +/obj/structure/extinguisher_cabinet/directional/south{ + pixel_x = -5; + pixel_y = -28 }, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"lW" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/ruin/rockplanet/rust_base/bridge) +"iE" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"iK" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/obj/machinery/door/poddoor{ - id = "rustarmory" +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/mono/dark, +/area/ruin/rockplanet/rust_base/slop) +"iL" = ( +/obj/effect/turf_decal/industrial/warning, +/obj/structure/flippedtable{ + dir = 4 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/armory) -"md" = ( -/obj/structure/mecha_wreckage/touro, -/obj/effect/decal/cleanable/glass/plasma, -/obj/effect/decal/cleanable/plastic, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/mechbay) -"me" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +"iP" = ( +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop4) +"iQ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 9 +/obj/effect/abstract/turf_fire/small/magical, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/slop) +"iU" = ( +/obj/machinery/suit_storage_unit/inherit, +/obj/item/clothing/mask/gas/ramzi, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/dorms) +"iV" = ( +/obj/structure/reagent_dispensers, +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/hallway) +"iZ" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/trimline/opaque/red/line, +/obj/item/ammo_casing/spent/pistol_brass, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"jf" = ( +/obj/structure/catwalk/over, +/obj/machinery/door/poddoor{ + dir = 4 }, -/obj/structure/chair/handrail{ +/turf/open/floor/engine/hull/rockplanet, +/area/ruin/rockplanet/rust_base/hallway2) +"jj" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/trimline/opaque/red/line, +/obj/item/ammo_casing/spent/slug/buck, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"jl" = ( +/obj/machinery/porta_turret/ruin/ramzi/heavy{ dir = 8 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/cryo) -"mh" = ( -/obj/machinery/door/poddoor/preopen{ - id = "rustmech" +/turf/open/floor/concrete/slab_1/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"jn" = ( +/obj/structure/poddoor_assembly/shutters, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"jp" = ( +/obj/machinery/computer/helm/retro{ + dir = 8 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/mechbay) -"mp" = ( -/obj/structure/window/plasma/reinforced/plastitanium, -/obj/structure/grille, -/obj/machinery/door/poddoor{ - id = "rustbridge"; +/obj/effect/turf_decal/techfloor{ dir = 4 }, -/turf/open/floor/plating, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/plasteel/telecomms_floor, /area/ruin/rockplanet/rust_base/bridge) -"ms" = ( -/obj/structure/cable{ - icon_state = "1-2" +"jq" = ( +/obj/structure/frame/machine, +/turf/open/floor/engine/hull/reinforced, +/area/ruin/rockplanet/rust_base/engine_one) +"jt" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"mz" = ( -/obj/machinery/light/directional/west, -/obj/machinery/vending/cola/sodie, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"mA" = ( -/obj/structure/sign/poster/contraband/lusty_xenomorph{ - pixel_y = 32 +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 4 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/dorms) -"mB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 10 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 }, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 6 - }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/cryo) -"mE" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/obj/effect/turf_decal/siding/thinplating/dark{ +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"jv" = ( +/obj/effect/turf_decal/industrial/warning, +/obj/effect/turf_decal/corner_steel_grid{ dir = 4 }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 - }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"mF" = ( -/obj/machinery/porta_turret/ship/ramzi/light{ - dir = 8; - id = "rustguns"; - turret_respects_id = 0; - turret_flags = 62; - lethal = 1 - }, -/turf/closed/wall/r_wall/syndicate, -/area/ruin/rockplanet/rust_base/hallway) -"mG" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/hallway2) +"jC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/industrial/loading{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 +/obj/effect/turf_decal/corner_steel_grid{ + dir = 5 }, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/armory) -"mP" = ( /turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_one) -"mR" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/syndicate, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 +/area/ruin/rockplanet/rust_base/hallway2) +"jP" = ( +/obj/effect/decal/cleanable/blood/splatter/over_window{ + icon_state = "gib3"; + pixel_x = 5 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"mS" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/turf/closed/wall/r_wall/syndicate/nodiagonal, +/area/ruin/rockplanet/rust_base/hallway) +"jU" = ( +/obj/machinery/holopad/secure, +/mob/living/simple_animal/hostile/human/ramzi/melee/space/stormtrooper/sledge{ + name = "Captain Dwight" }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/machinery/door/airlock/hatch{ - dir = 4; - name = "Bridge" +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/tech, /area/ruin/rockplanet/rust_base/bridge) -"mV" = ( -/obj/structure/reagent_dispensers/beerkeg{ - pixel_x = -9; - pixel_y = -2 +"jV" = ( +/obj/item/shard/plastitanium{ + pixel_x = 10; + pixel_y = 4 }, -/obj/structure/reagent_dispensers/beerkeg{ - pixel_x = 8; - pixel_y = 3 +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"jW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/ammo_casing/spent/slug/buck, +/turf/open/floor/wood/ebony{ + icon_state = "wood-broken" }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/hallway) -"ne" = ( -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 5 +/area/ruin/rockplanet/rust_base/dorms) +"jX" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/obj/effect/decal/fakelattice, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"ka" = ( +/obj/item/ammo_casing/spent/big_brass, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"kb" = ( +/obj/structure/flora/rock/rockplanet, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"kf" = ( +/obj/effect/turf_decal/siding/thinplating/dark/corner, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 8 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/hallway2) -"nq" = ( -/obj/machinery/light/floor/hangar, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/mechbay) -"nu" = ( -/obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-4" }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/dorms) +"ki" = ( /obj/structure/cable{ icon_state = "1-8" }, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop4) +"kk" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable{ + icon_state = "0-2" + }, /obj/structure/cable{ icon_state = "2-8" }, -/obj/machinery/door/poddoor{ - dir = 4; - id = "rusteastsouth" +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/engine_two) +"kp" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/trimline/opaque/red/line, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "1-8" }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/mechbay) -"nx" = ( -/obj/structure/table/reinforced, -/obj/item/radio/intercom/table{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/structure/railing{ - dir = 4 +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"kr" = ( +/obj/structure/window/reinforced{ + dir = 8 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"nz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ +/obj/structure/salvageable/machine, +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "rustengine1" + }, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/engine_one) +"kt" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/salvageable/machine, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/hallway2) +"kv" = ( +/obj/structure/chair, +/turf/open/floor/carpet/green, +/area/ruin/rockplanet/rust_base/slop) +"kx" = ( +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/overmap_encounter/planetoid/rockplanet/explored) +"kA" = ( +/obj/effect/turf_decal/borderfloor/corner{ dir = 4 }, -/obj/effect/turf_decal/siding/thinplating/dark{ +/obj/effect/turf_decal/trimline/opaque/red/line{ dir = 10 }, -/turf/open/floor/plasteel/patterned, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/hallway) -"nG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/emcloset, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"nH" = ( +"kK" = ( +/obj/structure/table_frame, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/wood/ebony, +/area/ruin/rockplanet/rust_base/dorms) +"kO" = ( +/obj/item/stack/ore/salvage/scrapplasma{ + pixel_x = -13; + pixel_y = -27 + }, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"kQ" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"kT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/structure/cable{ - icon_state = "0-2" + icon_state = "1-2" }, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"nJ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/patterned/grid, +/obj/structure/door_assembly/door_assembly_hatch, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/armory) +"kU" = ( +/obj/structure/crate_shelf, +/obj/effect/turf_decal/spline/fancy/opaque/black, +/obj/structure/closet/crate/medical, +/obj/item/storage/firstaid/regular, +/obj/item/storage/firstaid/brute, +/turf/open/floor/plasteel/tech/techmaint, /area/ruin/rockplanet/rust_base/mechbay) -"nK" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/directional/north, -/obj/structure/railing{ +"la" = ( +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop2) +"lc" = ( +/obj/structure/chair/stool, +/mob/living/simple_animal/hostile/human/ramzi/melee, +/turf/open/floor/concrete/slab_1, +/area/ruin/rockplanet/rust_base) +"le" = ( +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop1) +"lh" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/trimline/opaque/red/line, +/obj/item/ammo_casing/spent/rifle_brass, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/obj/item/reagent_containers/glass/concrete_bag{ - pixel_x = 5 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 }, -/obj/item/reagent_containers/glass/concrete_bag{ - pixel_x = -5 +/obj/structure/cable{ + icon_state = "4-8" }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"li" = ( +/obj/item/gun/ballistic/automatic/assault/e40, /turf/open/floor/plasteel/tech, /area/ruin/rockplanet/rust_base/armory) -"nL" = ( -/obj/effect/turf_decal/industrial/warning{ - dir = 1 +"lm" = ( +/turf/closed/mineral/random/rockplanet, +/area/ruin/rockplanet/rust_base/tanto2) +"ls" = ( +/obj/effect/decal/cleanable/blood{ + icon_state = "floor3" + }, +/obj/effect/mob_spawn/human/corpse/frontier/ranged/internals, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"lw" = ( +/turf/closed/wall/r_wall, +/area/ruin/rockplanet/rust_base/dorms) +"lB" = ( +/obj/structure/chair/comfy/shuttle{ + name = "Helm"; + dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/corner/opaque/syndiered/bordercee{ + dir = 8 }, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/mechbay) -"nM" = ( -/obj/machinery/vending/cigarette/syndicate, +/obj/machinery/button/door{ + id = "rustbridge"; + dir = 1; + pixel_x = 0; + pixel_y = -21 + }, +/obj/effect/decal/cleanable/glass/plastitanium, /turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/bridge) +"lD" = ( +/obj/machinery/power/shuttle/engine/electric, +/turf/open/floor/engine/hull/reinforced, /area/ruin/rockplanet/rust_base/hallway) -"nO" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable{ - icon_state = "0-8" +"lE" = ( +/turf/closed/wall/r_wall/syndicate/nodiagonal, +/area/ruin/rockplanet/rust_base/hallway2) +"lG" = ( +/obj/machinery/button/shieldwallgen{ + pixel_x = 0; + pixel_y = -20; + id = "rusteastholo"; + dir = 1 }, -/obj/structure/cable{ - icon_state = "1-8" +/obj/machinery/button/door{ + id = "rusteastsouth"; + pixel_x = -10; + dir = 1; + pixel_y = -21 }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden/layer2{ +/obj/effect/turf_decal/industrial/warning/dust{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/brown/hidden/layer4{ +/turf/open/floor/engine/hull/rockplanet, +/area/ruin/rockplanet/rust_base/mechbay) +"lL" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"lP" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/corner_techfloor_gray{ + dir = 10 + }, +/obj/item/wrench{ + pixel_x = 11; + pixel_y = 0 + }, +/obj/item/stock_parts/manipulator{ + pixel_x = -8; + pixel_y = -5 + }, +/obj/item/stock_parts/micro_laser/high{ + pixel_x = -6; + pixel_y = 9 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/engine_two) +"lQ" = ( +/obj/effect/turf_decal/borderfloor{ dir = 4 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"nS" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/obj/item/radio/intercom/directional/east, -/obj/structure/chair{ +/obj/effect/turf_decal/trimline/opaque/red/line{ dir = 8 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"nW" = ( -/obj/machinery/suit_storage_unit/inherit, -/obj/item/clothing/suit/space/hardsuit/syndi/ramzi, -/obj/item/clothing/mask/gas/ramzi, -/obj/item/tank/internals/emergency_oxygen/engi, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"od" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen/edagger, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/white, -/area/ruin/rockplanet/rust_base/bridge) -"os" = ( -/obj/structure/chair/handrail{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 4 }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"lR" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ + dir = 8; + piping_layer = 4 + }, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"ou" = ( -/obj/effect/turf_decal/industrial/warning{ +/area/ruin/rockplanet/rust_base/engine_one) +"lT" = ( +/obj/machinery/button/door{ + pixel_y = -21; + id = "rustarmory"; dir = 1 }, -/obj/structure/rack, -/obj/effect/decal/cleanable/dirt, -/obj/item/gun/ballistic/automatic/pistol/rattlesnake/cottonmouth, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/armory) -"oC" = ( -/obj/effect/turf_decal/industrial/warning{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 }, -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/table{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 }, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/armory) -"oF" = ( -/obj/structure/cable, -/obj/machinery/porta_turret/ship/ramzi/heavy{ - id = "rustguns"; - lethal = 1; - dir = 8; - turret_respects_id = 0; - turret_flags = 62 +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/hallway2) +"lZ" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 5 + }, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop1) +"ma" = ( +/obj/structure/platform/wood{ + dir = 4 }, -/turf/open/floor/plating/asteroid/dirt/rockplanet, +/obj/item/ammo_casing/spent/pistol_steel, +/turf/open/floor/concrete/pavement/rockplanet/lit, /area/ruin/rockplanet/rust_base) -"oH" = ( -/obj/structure/rack, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 +"mb" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 }, -/obj/item/clothing/suit/armor/ramzi/bulletproof, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"oL" = ( -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/mechbay) -"oN" = ( +/obj/structure/barricade/sandbags, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"mk" = ( +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/structure/grille, /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/siding/thinplating, -/obj/structure/chair/handrail{ - dir = 1 +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base) +"ml" = ( +/obj/effect/turf_decal/borderfloor{ + dir = 4 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"oW" = ( -/obj/structure/cable{ - icon_state = "2-8" +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 10 +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"mv" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/light_switch{ + dir = 4; + pixel_x = -21; + pixel_y = 8 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 10 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/slop) +"mw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 }, -/turf/open/floor/plating/rust, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/tech, /area/ruin/rockplanet/rust_base/hallway2) -"oX" = ( -/obj/structure/closet/crate/medical, -/obj/machinery/airalarm/directional/north, -/obj/item/storage/firstaid/brute, -/obj/effect/turf_decal/siding/thinplating{ +"mA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/concrete/slab_1, +/area/ruin/rockplanet/rust_base) +"mF" = ( +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/obj/item/storage/firstaid/regular, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"oZ" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/barricade/sandbags, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"mI" = ( +/obj/item/stack/ore/salvage/scrapmetal/five{ + pixel_x = 6; + pixel_y = 6 }, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"mM" = ( +/obj/machinery/power/terminal{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 4 }, -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/plasteel/patterned, +/turf/open/floor/engine/hull/reinforced/interior, /area/ruin/rockplanet/rust_base/hallway) -"ph" = ( -/obj/effect/turf_decal/arrows/white{ - dir = 4; - pixel_y = 7 +"mN" = ( +/obj/structure/flora/rock/asteroid, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"mP" = ( +/turf/closed/wall/r_wall, +/area/ruin/rockplanet/rust_base/engine_two) +"mT" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/structure/chair/bench/grey/directional/west, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway2) +"nb" = ( +/obj/machinery/power/smes/shuttle/precharged, +/obj/structure/window/reinforced{ + dir = 8 }, -/obj/effect/turf_decal/arrows/white{ - dir = 4; - pixel_y = 7 +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/hallway) +"ni" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/armory) -"pi" = ( -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"nl" = ( +/obj/structure/platform/wood/corner{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 10 +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"np" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = 0; + pixel_y = 5 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway2) -"pn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base) +"nr" = ( +/obj/structure/platform/wood/corner{ dir = 8 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"pz" = ( -/obj/machinery/suit_storage_unit/inherit, -/obj/item/clothing/mask/gas/ramzi, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"pD" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"nw" = ( +/turf/closed/wall, +/area/ruin/rockplanet/rust_base/drop4) +"ny" = ( +/turf/open/floor/plating/asteroid/snow/lit/rockplanet, +/area/ruin/rockplanet/rust_base) +"nB" = ( +/obj/structure/flippedtable{ + dir = 8 }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 +/obj/effect/turf_decal/borderfloor{ + dir = 4 }, -/turf/open/floor/hangar/plasteel/dark, +/obj/effect/turf_decal/trimline/opaque/syndiered/warning{ + dir = 8 + }, +/turf/open/floor/plasteel/mono/dark, /area/ruin/rockplanet/rust_base/armory) -"pL" = ( -/obj/structure/flippedtable{ +"nD" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; dir = 8 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/hallway) -"pW" = ( +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/structure/cable{ - icon_state = "2-4" + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden/layer2{ - dir = 1 +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"nF" = ( +/obj/item/toy/snowball{ + pixel_x = -9; + pixel_y = 2 + }, +/turf/open/floor/plating/asteroid/snow/lit/rockplanet, +/area/ruin/rockplanet/rust_base) +"nH" = ( +/obj/structure/barricade/sandbags, +/turf/open/floor/plating/asteroid/rockplanet/cracked/lit, +/area/ruin/rockplanet/rust_base) +"nK" = ( +/obj/structure/closet, +/obj/machinery/light/directional/north, +/obj/item/clothing/head/hardhat/ramzi{ + pixel_x = 10; + pixel_y = 8 + }, +/obj/item/clothing/head/hardhat/ramzi{ + pixel_x = 10; + pixel_y = -1 + }, +/obj/item/clothing/suit/ramzi{ + pixel_x = -7; + pixel_y = 7 + }, +/obj/item/clothing/suit/ramzi{ + pixel_x = -7; + pixel_y = 0 + }, +/obj/item/clothing/under/syndicate/ramzi{ + pixel_x = -3; + pixel_y = -9 + }, +/obj/item/clothing/under/syndicate/ramzi/overalls{ + pixel_x = 6; + pixel_y = -9 + }, +/obj/item/clothing/neck/shemagh/ramzi{ + pixel_x = 0; + pixel_y = 12 + }, +/obj/item/clothing/neck/shemagh/ramzi{ + pixel_x = -1; + pixel_y = 4 + }, +/turf/open/floor/concrete/slab_1, +/area/ruin/rockplanet/rust_base) +"nM" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/spline/fancy/opaque/black, +/obj/item/stock_parts/cell/super/empty{ + pixel_x = -9; + pixel_y = 9 }, +/obj/item/stock_parts/cell/super/empty{ + pixel_x = -9; + pixel_y = -1 + }, +/obj/machinery/light/directional/north, +/obj/item/storage/box/stockparts/t3/capacitor{ + pixel_x = 8; + pixel_y = 7 + }, +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/mechbay) +"nQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "1-4" }, /turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"pX" = ( -/obj/machinery/power/shuttle/engine/electric{ +/area/ruin/rockplanet/rust_base) +"nR" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black/corner{ dir = 1 }, -/obj/structure/cable, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/tanto2) -"pY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 4 +/obj/effect/turf_decal/trimline/opaque/syndiered/corner{ + dir = 1 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_two) -"qa" = ( -/obj/machinery/suit_storage_unit/inherit, -/obj/item/clothing/mask/gas/ramzi, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/armory) -"qe" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ +/obj/effect/turf_decal/corner/opaque/syndiered/border{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable{ + icon_state = "0-1" + }, +/obj/machinery/airalarm/directional/south, /turf/open/floor/plasteel/tech, /area/ruin/rockplanet/rust_base/bridge) -"qj" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/rockplanet/rust_base/hallway) -"ql" = ( -/obj/machinery/computer/helm/retro{ - dir = 8 +"nU" = ( +/obj/effect/turf_decal/corner/transparent/syndiered/border, +/obj/structure/chair/comfy/shuttle{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/techfloor{ - dir = 4 +/turf/open/floor/plasteel/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"nX" = ( +/obj/effect/turf_decal/corner/transparent/syndiered/border, +/obj/effect/turf_decal/siding/black{ + dir = 8 }, -/turf/open/floor/plasteel/telecomms_floor, -/area/ruin/rockplanet/rust_base/bridge) -"qm" = ( +/obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable{ - icon_state = "2-8" + icon_state = "0-1" }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden/layer2{ - dir = 4 +/turf/open/floor/plasteel/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"nY" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/manifold/brown/hidden/layer4{ - dir = 4 +/obj/structure/fluff/broken_flooring{ + icon_state = "pile" }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"oa" = ( +/obj/item/emptysandbag{ + pixel_x = -4; + pixel_y = -8 + }, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"og" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 4 }, -/obj/effect/turf_decal/siding/thinplating/dark/corner{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable{ + icon_state = "0-1" }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"qq" = ( -/obj/structure/closet/crate/bin, -/turf/open/floor/plating, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/tech, /area/ruin/rockplanet/rust_base/dorms) -"qt" = ( -/obj/structure/cable{ - icon_state = "2-8" +"oh" = ( +/obj/effect/turf_decal/siding/black, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"oi" = ( +/obj/structure/crate_shelf, +/obj/effect/turf_decal/spline/fancy/opaque/black, +/obj/structure/closet/crate{ + name = "cold weather surplus crate" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 10 +/obj/item/clothing/suit/ramzi{ + pixel_x = 8; + pixel_y = -3 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 10 +/obj/item/clothing/suit/ramzi{ + pixel_x = 0; + pixel_y = -4 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_one) -"qu" = ( -/obj/structure/sign/poster/contraband/bulldog{ - pixel_y = 32 +/obj/item/clothing/suit/ramzi{ + pixel_x = -8; + pixel_y = -4 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/dorms) -"qx" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/rockplanet/rust_base/dorms) -"qA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/firecloset, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"qC" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/rockplanet/rust_base/mechbay) -"qI" = ( -/obj/machinery/light/directional/north, -/obj/machinery/suit_storage_unit/inherit, -/obj/item/clothing/suit/space/hardsuit/syndi/ramzi, -/obj/item/clothing/mask/gas/ramzi, -/obj/item/tank/internals/emergency_oxygen/engi, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/armory) -"qN" = ( -/obj/effect/turf_decal/arrows/white{ - dir = 4; - pixel_y = 7 +/obj/item/clothing/head/ramzi/flap{ + pixel_x = -14; + pixel_y = 3 }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/armory) -"qP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/platform/industrial_alt{ - dir = 8 +/obj/item/clothing/head/ramzi/flap{ + pixel_x = -5; + pixel_y = 2 }, -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/armory) -"qT" = ( -/obj/machinery/door/poddoor/preopen{ - id = "rustmech" +/obj/item/clothing/head/ramzi/flap{ + pixel_x = 5; + pixel_y = 1 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/mechbay) -"qW" = ( -/mob/living/simple_animal/hostile/human/ramzi/ranged, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/hallway) -"rc" = ( -/mob/living/simple_animal/hostile/human/ramzi/ranged/sniper, -/turf/open/floor/plating/asteroid/dirt/rockplanet, -/area/ruin/rockplanet/rust_base) -"rh" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/item/clothing/neck/shemagh/ramzi{ + pixel_x = -12; + pixel_y = -8 }, -/obj/machinery/atmospherics/components/unary/tank/air{ - piping_layer = 2; - dir = 1 +/obj/item/clothing/neck/shemagh/ramzi{ + pixel_x = -3; + pixel_y = -9 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_two) -"ri" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"rn" = ( -/turf/closed/wall/r_wall/syndicate, -/area/ruin/rockplanet/rust_base/armory) -"rq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/cryo) -"ru" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/hatch, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base) -"rx" = ( -/obj/structure/cable{ - icon_state = "2-4" +/obj/item/clothing/neck/shemagh/ramzi{ + pixel_x = 3; + pixel_y = -10 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 6 +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/mechbay) +"ol" = ( +/obj/machinery/cryopod/syndicate{ + dir = 8 }, -/obj/effect/turf_decal/siding/thinplating/dark{ +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/dorms) +"on" = ( +/turf/open/floor/plating/asteroid/rockplanet/cracked/lit, +/area/ruin/rockplanet/rust_base) +"os" = ( +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/siding/wood{ dir = 6 }, -/obj/structure/flippedtable, -/obj/effect/decal/cleanable/dirt, -/obj/structure/fluff/paper/stack{ - dir = 5; - pixel_y = 25; - layer = 2.89 +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"oA" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"rD" = ( -/obj/machinery/door/poddoor/preopen{ - id = "rustmech" +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/mechbay) -"rH" = ( -/obj/structure/flora/rock/pile/rockplanet, -/turf/open/floor/plating/asteroid/rockplanet/lit, -/area/ruin/rockplanet/rust_base) -"rJ" = ( +/obj/machinery/firealarm/directional/east, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"oB" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/mono, +/area/ruin/rockplanet/rust_base/armory) +"oC" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "frontiepod3" + }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/item/radio/intercom/directional/south{ - pixel_x = 4 +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/drop3) +"oK" = ( +/mob/living/simple_animal/hostile/human/ramzi/ranged/hydra/gunsmith, +/turf/open/floor/plating/asteroid/snow/lit/rockplanet, +/area/ruin/rockplanet/rust_base) +"oN" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 1; + layer = 2.040 }, -/turf/open/floor/engine/hull/rockplanet, +/obj/machinery/light/directional/south, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"oT" = ( +/obj/effect/decal/cleanable/blood/squirt, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"oV" = ( +/obj/machinery/porta_turret/ruin/ramzi/heavy{ + dir = 4 + }, +/turf/closed/wall/r_wall/syndicate/nodiagonal, +/area/ruin/rockplanet/rust_base/bridge) +"oW" = ( +/obj/structure/flora/rock/pile/rockplanet, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"pa" = ( +/obj/structure/table/wood/poker, +/obj/item/storage/cans/sixsoda{ + pixel_x = 3; + pixel_y = 8 + }, +/turf/open/floor/concrete/slab_1, /area/ruin/rockplanet/rust_base) -"rK" = ( -/obj/structure/toilet{ - dir = 4; - pixel_x = -4 +"pb" = ( +/obj/item/stack/ore/salvage/scrapgold{ + pixel_x = 9; + pixel_y = 12 }, -/turf/open/floor/plasteel/freezer, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"pe" = ( +/obj/effect/turf_decal/borderfloor/full, +/turf/open/floor/plasteel, /area/ruin/rockplanet/rust_base/hallway) -"rN" = ( -/obj/structure/cable{ - icon_state = "4-8" +"pf" = ( +/obj/structure/flippedtable{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/obj/effect/turf_decal/borderfloor/corner, +/obj/effect/turf_decal/trimline/opaque/syndiered/warning{ + dir = 9 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/item/ammo_casing/spent/pistol_steel, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/plasteel/mono/dark, +/area/ruin/rockplanet/rust_base/armory) +"ph" = ( +/obj/structure/chair, +/obj/item/ammo_casing/spent/pistol_steel, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/armory) +"pi" = ( +/obj/effect/turf_decal/borderfloor{ dir = 4 }, -/obj/effect/turf_decal/spline/fancy/opaque/black, -/obj/effect/turf_decal/siding/thinplating/dark{ +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"pj" = ( +/obj/effect/turf_decal/industrial/warning{ dir = 1 }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"pl" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"pm" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/bridge) -"rR" = ( +/area/ruin/rockplanet/rust_base/dorms) +"po" = ( /obj/effect/turf_decal/siding/thinplating/dark{ - dir = 10 + dir = 1 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"rY" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/door/poddoor{ - dir = 4; - id = "rustwest" +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 1; + layer = 2.040 }, -/obj/structure/cable{ - icon_state = "1-8" +/obj/item/ammo_casing/spent/slug/buck, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 }, -/obj/machinery/power/shieldwallgen/atmos/roundstart{ - id = "rustwestholo"; - dir = 1 +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"pp" = ( +/obj/item/stack/ore/salvage/scrapplasma{ + pixel_x = 9; + pixel_y = 19 }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/hallway) -"sb" = ( -/obj/effect/turf_decal/siding/thinplating/dark/corner{ +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"pr" = ( +/obj/structure/platform/wood{ dir = 8 }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, +/turf/open/floor/plasteel/stairs/wood/mid, +/area/ruin/rockplanet/rust_base) +"ps" = ( +/obj/effect/turf_decal/siding/black, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/rust, /area/ruin/rockplanet/rust_base/hallway2) -"sm" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/door/poddoor{ - dir = 4; - id = "rusteastsouth" +"pA" = ( +/obj/item/stack/ore/salvage/scrapmetal/five, +/obj/effect/decal/fakelattice, +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/hallway2) +"pC" = ( +/obj/effect/spawner/bunk_bed{ + dir = 4 }, -/obj/machinery/power/shieldwallgen/atmos/roundstart{ - id = "rusteastholo"; - dir = 1 +/obj/effect/turf_decal/borderfloorblack{ + dir = 4 }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/mechbay) -"sy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 8 + }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base) +"pE" = ( +/obj/effect/turf_decal/industrial/warning{ dir = 1 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/dorms) -"sC" = ( -/obj/machinery/mech_bay_recharge_port{ - dir = 8 +/obj/machinery/button/door{ + id = "rusteastsouth"; + pixel_x = -9; + pixel_y = 22 }, -/obj/effect/turf_decal/siding/thinplating, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"sG" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/hallway) -"sZ" = ( -/obj/effect/decal/cleanable/blood/footprints, -/obj/effect/mob_spawn/human/corpse/frontier, -/obj/effect/decal/cleanable/blood, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/button/shieldwallgen{ + pixel_x = 2; + pixel_y = 21; + id = "rusteastholo" }, -/turf/open/floor/plasteel/tech/grid, -/area/ruin/rockplanet/rust_base/tanto2) -"tb" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"pM" = ( +/obj/effect/turf_decal/siding/black{ + dir = 8 }, /turf/open/floor/plasteel/tech, /area/ruin/rockplanet/rust_base/armory) -"tc" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/hallway) -"tg" = ( -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 4 +"pO" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop1) +"pP" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/power/terminal{ + dir = 8 }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-1" }, -/obj/effect/turf_decal/siding/thinplating/dark{ +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"pU" = ( +/obj/structure/platform/wood, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"pY" = ( +/obj/effect/turf_decal/borderfloor, +/obj/effect/turf_decal/siding/black/corner{ dir = 1 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"tk" = ( -/turf/open/floor/plating/rust, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plasteel/tech, /area/ruin/rockplanet/rust_base/armory) -"tm" = ( +"qa" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_one) +"qb" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"qc" = ( /obj/structure/cable{ icon_state = "1-2" }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 - }, -/turf/open/floor/plasteel/patterned, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_two) +"qh" = ( +/obj/effect/mapping_helpers/airlock/welded, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/door/airlock/hatch{ + name = "Engine" + }, +/turf/open/floor/plasteel/tech/grid, /area/ruin/rockplanet/rust_base/hallway2) -"to" = ( -/obj/structure/closet, -/obj/item/clothing/under/syndicate/ramzi/overalls, -/obj/item/clothing/under/syndicate/ramzi/overalls, -/obj/item/clothing/under/syndicate/ramzi/overalls, -/obj/item/clothing/under/syndicate/ramzi/overalls, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/shoes/combat, -/obj/machinery/atmospherics/pipe/simple{ +"ql" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 1; + layer = 2.040 + }, +/obj/effect/decal/cleanable/blood/squirt{ dir = 4 }, -/obj/item/storage/fancy/cigarettes/cigpack_cannabis, -/obj/item/storage/fancy/cigarettes/cigpack_cannabis, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_one) -"tE" = ( -/turf/closed/wall/r_wall/syndicate, -/area/ruin/rockplanet/rust_base/engine_one) -"tG" = ( -/obj/structure/bed/roller, -/obj/effect/decal/cleanable/blood, -/obj/structure/lattice/catwalk, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"tI" = ( -/mob/living/simple_animal/hostile/human/ramzi/ranged/space/stormtrooper/shotgun{ - name = "'Armored' O. Ray" +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"tK" = ( -/obj/machinery/power/smes/shuttle/precharged{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 }, -/obj/structure/window/reinforced{ +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"qr" = ( +/obj/machinery/door/airlock/hatch{ + name = "Cryogenics" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/dorms) +"qv" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ + dir = 8; + piping_layer = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/obj/structure/cable{ - icon_state = "0-2" +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 6 }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/tanto2) -"tN" = ( -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/hallway) -"tO" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"tS" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_one) +"qy" = ( +/mob/living/simple_animal/hostile/human/ramzi/ranged/smg, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/stairs/mid{ dir = 4 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/hallway) -"us" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 +/area/ruin/rockplanet/rust_base/hallway2) +"qz" = ( +/obj/machinery/power/terminal{ + dir = 4 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"uB" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-8" }, -/turf/open/floor/engine/hull/rockplanet, +/obj/structure/closet/emcloset/wall/directional/north, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop2) +"qA" = ( +/obj/structure/table, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base) -"uO" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ +"qD" = ( +/obj/effect/spawner/bunk_bed{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/carpet/red, +/area/ruin/rockplanet/rust_base/dorms) +"qF" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 8 }, +/turf/open/floor/concrete/slab_1, +/area/ruin/rockplanet/rust_base) +"qH" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/item/ammo_casing/spent/slug/buck, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"uQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plasteel/tech, +/turf/open/floor/plasteel, /area/ruin/rockplanet/rust_base/hallway2) -"uU" = ( +"qI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/catwalk/over/plated_catwalk/dark, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 }, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"vd" = ( -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/machinery/button/door{ + pixel_y = 2; + id = "rustengine1"; + name = "cargo storage door button"; + pixel_x = 21; + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/engine_one) +"qK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway2) -"vg" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 9 +/obj/machinery/door/airlock/hatch{ + name = "Engine"; + dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"vz" = ( -/obj/machinery/door/poddoor{ - dir = 4; - id = "rustenginetwo" +/obj/machinery/door/firedoor/border_only{ + dir = 8 }, -/obj/machinery/atmospherics/components/unary/shuttle/fire_heater, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_two) -"vB" = ( -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_one) -"vD" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/door/firedoor/border_only{ + dir = 4 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"vH" = ( -/obj/effect/turf_decal/spline/fancy/opaque/syndiered, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/patterned/grid, -/area/ruin/rockplanet/rust_base/mechbay) -"vO" = ( -/obj/machinery/door/airlock/hatch, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/engine_one) +"qL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/cryo) -"vR" = ( -/obj/machinery/computer/crew/retro, -/obj/effect/turf_decal/techfloor{ +/obj/machinery/door/airlock/hatch{ + name = "Engine" + }, +/obj/machinery/door/firedoor/border_only{ dir = 1 }, -/turf/open/floor/plasteel/telecomms_floor, -/area/ruin/rockplanet/rust_base/bridge) -"vV" = ( -/obj/structure/chair/handrail, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"vW" = ( -/obj/effect/turf_decal/siding/thinplating/dark, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/engine_two) +"qX" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 }, -/turf/open/floor/plasteel/patterned/ridged, +/obj/effect/turf_decal/corner/opaque/grey, +/turf/open/floor/plating/rust, /area/ruin/rockplanet/rust_base/slop) -"vY" = ( -/obj/structure/cable{ - icon_state = "1-2" +"ra" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/corner_steel_grid{ + dir = 5 }, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/pistol_brass, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/hallway2) +"rc" = ( +/obj/machinery/power/smes/shuttle/precharged, +/obj/structure/window/reinforced{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 4 +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/hallway2) +"ro" = ( +/obj/structure/closet/secure_closet/freezer/fridge/open, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/effect/decal/cleanable/food/salt, +/obj/item/food/meat/slab/goliath, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/item/food/meat/slab/goliath, +/obj/item/food/meat/slab/goliath, +/obj/effect/turf_decal/corner/transparent/red/diagonal, +/turf/open/floor/hangar/plasteel/dark, +/area/ruin/rockplanet/rust_base/slop) +"rq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/door/airlock/hatch{ + name = "Captains Quarters" }, -/obj/machinery/atmospherics/components/binary/pump/on/layer2{ - dir = 1; - name = "air to distro" +/obj/machinery/door/firedoor/border_only{ + dir = 1 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"vZ" = ( -/obj/machinery/door/airlock/hatch{ - dir = 4; - name = "Bridge" +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/dorms) +"rr" = ( +/obj/effect/turf_decal/borderfloor/corner{ + dir = 8 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 5 + }, +/obj/machinery/button/door{ + pixel_y = 2; + id = "rustarmory"; + dir = 8; + pixel_x = 21 + }, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/hallway2) -"wb" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +"rv" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 1; + layer = 2.040 + }, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/slug/buck, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"rw" = ( +/obj/machinery/power/port_gen/pacman/super, +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/structure/cable/yellow{ + icon_state = "0-4" }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"wc" = ( -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/engine_two) +"rz" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 9 + }, +/obj/item/ammo_casing/spent/slug/buck, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop3) +"rA" = ( +/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/inverse{ + piping_layer = 2 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"wj" = ( -/obj/structure/flora/junglebush/b, -/turf/open/floor/plating/asteroid/rockplanet/lit, -/area/ruin/rockplanet/rust_base) -"wn" = ( -/obj/machinery/light/directional/north, -/obj/structure/table/chem, -/obj/structure/sink/chem, -/obj/item/weldingtool/largetank{ - pixel_x = -11 +/area/ruin/rockplanet/rust_base/engine_one) +"rB" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 1 }, +/obj/item/stack/ore/salvage/scraptitanium, /turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_two) -"ws" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/area/ruin/rockplanet/rust_base/hallway2) +"rC" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/effect/abstract/turf_fire/small/magical, +/obj/effect/mapping_helpers/turf/burnt, +/turf/open/floor/plasteel/mono/dark, +/area/ruin/rockplanet/rust_base/slop) +"rN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/hallway2) +"rO" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/armory) -"wu" = ( -/obj/machinery/button/door{ - pixel_y = 21; - id = "rustenginetwo" +/area/ruin/rockplanet/rust_base/dorms) +"rP" = ( +/obj/effect/spawner/bunk_bed{ + dir = 4 }, -/obj/structure/table/chem, -/obj/item/stack/rods/ten{ - pixel_x = 11 - }, -/obj/item/pipe{ - pixel_x = -2; - pixel_y = 1 - }, -/obj/item/wrench{ - pixel_x = -6; - pixel_y = -1 +/obj/machinery/light/directional/north, +/turf/open/floor/carpet/red, +/area/ruin/rockplanet/rust_base/dorms) +"rQ" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_two) -"wB" = ( +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/hallway2) +"rR" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-4" }, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"wF" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/fulltile, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/tanto2) -"wG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ +/area/ruin/rockplanet/rust_base/engine_two) +"rW" = ( +/obj/machinery/griddle, +/obj/effect/turf_decal/corner/transparent/red/diagonal, +/turf/open/floor/hangar/plasteel/dark, +/area/ruin/rockplanet/rust_base/slop) +"rX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/turf/open/floor/plasteel/patterned/grid, -/area/ruin/rockplanet/rust_base/mechbay) -"wS" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base) +"rY" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/dorms) -"wY" = ( -/obj/structure/table/chem, -/obj/item/cutting_board, -/turf/open/floor/plasteel/mono, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 1; + layer = 2.040 + }, +/mob/living/simple_animal/hostile/human/ramzi/ranged/shotgun{ + retreat_distance = 0; + minimum_distance = 0 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"rZ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/turf/open/floor/concrete/slab_1, +/area/ruin/rockplanet/rust_base) +"sa" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/plasteel/mono/dark, /area/ruin/rockplanet/rust_base/slop) -"wZ" = ( -/obj/machinery/door/airlock/hatch, -/obj/structure/cable{ - icon_state = "1-2" +"sf" = ( +/turf/closed/wall/r_wall, +/area/ruin/rockplanet/rust_base/engine_one) +"sh" = ( +/obj/machinery/power/smes/shuttle/precharged, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/door/poddoor{ + id = "rustengine2"; + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, /turf/open/floor/plating, /area/ruin/rockplanet/rust_base/engine_two) -"xc" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/obj/effect/turf_decal/siding/thinplating/dark{ +"sn" = ( +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop3) +"sB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 }, -/turf/open/floor/plasteel/patterned/ridged, -/area/ruin/rockplanet/rust_base/slop) -"xm" = ( -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/hallway2) -"xq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/turf/open/floor/concrete/slab_1, +/area/ruin/rockplanet/rust_base) +"sC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/effect/turf_decal/borderfloorblack, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 1; + layer = 2.040 + }, +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/wasp/internals, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base) +"sD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 10 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/dorms) -"xx" = ( /obj/structure/cable{ - icon_state = "0-2" + icon_state = "4-8" }, -/obj/machinery/porta_turret/ship/ramzi/heavy{ - id = "rustguns"; - lethal = 1; - dir = 8; - turret_respects_id = 0; - turret_flags = 62 +/obj/machinery/door/airlock/hatch{ + dir = 4; + name = "Mess" }, -/turf/open/floor/plating/asteroid/dirt/rockplanet, -/area/ruin/rockplanet/rust_base) -"xA" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/door/firedoor/border_only{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 6 +/obj/machinery/door/firedoor/border_only{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 6 +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/slop) +"sF" = ( +/turf/open/floor/engine/hull/reinforced, +/area/ruin/rockplanet/rust_base/dorms) +"sH" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/cable{ + icon_state = "0-8" }, -/obj/effect/turf_decal/siding/thinplating/dark{ +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"sK" = ( +/obj/machinery/power/smes/shuttle/precharged, +/obj/structure/window/reinforced{ dir = 8 }, -/turf/open/floor/plasteel/patterned, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "rustengine2" + }, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/engine_two) +"sO" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/turf/open/floor/plasteel, /area/ruin/rockplanet/rust_base/hallway2) -"xM" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, +"sQ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/hallway) +"sS" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"sV" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/barricade/sandbags, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"tf" = ( +/obj/item/melee/knife/kitchen{ + pixel_x = 0; + pixel_y = 14 + }, +/obj/effect/mapping_helpers/turf/burnt, +/turf/open/floor/plasteel/mono/dark, /area/ruin/rockplanet/rust_base/slop) -"xR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ +"tn" = ( +/obj/effect/turf_decal/techfloor{ + dir = 8 + }, +/obj/structure/chair/plastic{ dir = 4 }, -/turf/open/floor/plasteel/freezer, -/area/ruin/rockplanet/rust_base/hallway) -"yw" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/machinery/light/small/broken/directional/south, +/turf/open/floor/pod, +/area/ruin/rockplanet/rust_base/tanto2) +"tq" = ( +/obj/item/stack/ore/salvage/scraptitanium{ + pixel_x = 6; + pixel_y = -9 + }, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"tr" = ( +/obj/machinery/power/shuttle/engine/electric{ + dir = 8 + }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-8" + }, +/turf/open/floor/plating/airless, +/area/ruin/rockplanet/rust_base/drop2) +"ts" = ( +/obj/effect/turf_decal/borderfloor/corner, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 9 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/obj/item/ammo_casing/spent/pistol_brass, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"yz" = ( -/mob/living/simple_animal/hostile/human/ramzi/ranged/shotgun{ - retreat_distance = 0; - minimum_distance = 0 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plasteel/patterned, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/hallway) -"yG" = ( -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/siding/thinplating/dark{ +"tv" = ( +/obj/effect/turf_decal/borderfloor{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 6 - }, -/turf/open/floor/plasteel/patterned, +/turf/open/floor/plating/rust, /area/ruin/rockplanet/rust_base/hallway) -"yJ" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/emptysandbags{ - pixel_y = 5 +"ty" = ( +/turf/closed/wall/r_wall, +/area/ruin/rockplanet/rust_base/tanto2) +"tz" = ( +/obj/structure/closet/crate/radiation, +/obj/item/stack/sheet/mineral/uranium/ten, +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/item/storage/box/emptysandbags, -/obj/structure/railing{ - dir = 6 +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_two) +"tC" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/structure/cable{ + icon_state = "0-1" }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/engine_two) +"tD" = ( +/obj/effect/turf_decal/trimline/opaque/syndiered/line{ dir = 8 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"yK" = ( -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/dorms) -"yX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ +/obj/effect/turf_decal/corner/opaque/syndiered/bordercorner, +/obj/effect/turf_decal/corner/opaque/syndiered/bordercorner{ dir = 4 }, -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 }, -/turf/open/floor/plasteel/patterned/ridged, -/area/ruin/rockplanet/rust_base/slop) -"yY" = ( -/obj/structure/salvageable/computer{ - dir = 1 +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/techfloor, -/turf/open/floor/plasteel/telecomms_floor, +/turf/open/floor/plasteel/tech, /area/ruin/rockplanet/rust_base/bridge) -"zg" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"zm" = ( -/obj/effect/turf_decal/industrial/stand_clear{ +"tE" = ( +/obj/machinery/power/shuttle/engine/electric{ dir = 4 }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/armory) -"zn" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop4) +"tG" = ( +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/drop2) +"tI" = ( +/obj/effect/turf_decal/industrial/warning, +/obj/structure/fluff/broken_flooring{ + icon_state = "singular"; dir = 1 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/mechbay) -"zt" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 4 +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"tL" = ( +/obj/effect/turf_decal/borderfloor/corner{ + dir = 1 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"zF" = ( -/obj/structure/chair/plastic{ - dir = 8 +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 6 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/slop) -"zH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"tM" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/effect/turf_decal/trimline/opaque/red/line{ dir = 4 }, -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"zQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/structure/cable{ - icon_state = "1-4" + icon_state = "1-2" }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 5 +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"tP" = ( +/obj/machinery/power/terminal{ + dir = 8 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway2) -"zR" = ( -/obj/machinery/door/airlock/hatch{ - name = "Dormitories" +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/structure/cable{ + icon_state = "0-2" }, /turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/dorms) -"zX" = ( -/obj/machinery/atmospherics/pipe/simple{ - dir = 4 +/area/ruin/rockplanet/rust_base/engine_one) +"tR" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/effect/turf_decal/borderfloorblack, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 1; + layer = 2.040 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"Af" = ( -/obj/effect/turf_decal/techfloor{ +/obj/machinery/light/small/directional/north, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base) +"tS" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 }, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/armory) +"tT" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/rockplanet/rust_base/hallway2) +"tU" = ( +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop2) +"tW" = ( +/obj/item/mine/pressure/explosive/rusty/live, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"tY" = ( +/obj/structure/toilet{ + dir = 4; + pixel_x = -4 + }, +/turf/open/floor/plasteel/patterned, +/area/ruin/rockplanet/rust_base/hallway) +"ua" = ( +/obj/machinery/light/directional/south, /obj/structure/chair/comfy/shuttle{ dir = 1 }, -/obj/effect/mob_spawn/human/corpse/frontier, -/obj/effect/decal/cleanable/blood, -/obj/item/shard{ - pixel_x = 14; - pixel_y = -15 - }, -/obj/machinery/button/door{ - pixel_x = -20; - pixel_y = 7; - dir = 4; - id = "frontbox1" +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop3) +"uf" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_one) +"ur" = ( +/obj/effect/turf_decal/techfloor{ + dir = 4 }, -/obj/machinery/button/door{ - pixel_x = -20; - pixel_y = -5; - dir = 4; - id = "frontbox2" +/obj/structure/reagent_dispensers/beerkeg{ + pixel_x = 8; + pixel_y = -3 }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/reagent_dispensers/beerkeg{ + pixel_x = -10; + pixel_y = 1 }, -/obj/structure/cable{ - icon_state = "1-4" +/obj/machinery/power/terminal{ + dir = 4 }, +/obj/machinery/light/small/broken/directional/south, /turf/open/floor/pod, /area/ruin/rockplanet/rust_base/tanto2) -"Am" = ( -/obj/machinery/airalarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 4 +"uu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 }, /turf/open/floor/plating/rust, /area/ruin/rockplanet/rust_base/engine_one) -"Ax" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 +"uw" = ( +/obj/item/stack/ore/salvage/scrapgold{ + pixel_x = 0; + pixel_y = 4 }, -/turf/open/floor/plasteel/patterned/ridged, -/area/ruin/rockplanet/rust_base/slop) -"Az" = ( -/obj/structure/chair/office/dark{ - dir = 4 +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"uG" = ( +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"uH" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/spline/fancy/opaque/black, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/mechbay) +"uK" = ( +/obj/machinery/light/directional/south, +/obj/structure/chair/comfy/shuttle{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/white, -/area/ruin/rockplanet/rust_base/bridge) -"AE" = ( -/obj/item/radio/intercom/directional/west, -/turf/open/floor/plating/asteroid/dirt/rockplanet, +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop4) +"uN" = ( +/obj/structure/table, +/obj/item/cultivator/rake{ + pixel_x = -7; + pixel_y = 9 + }, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, /area/ruin/rockplanet/rust_base) -"AF" = ( -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/dorms) -"AM" = ( -/obj/structure/closet, -/obj/item/clothing/shoes/combat, -/obj/item/storage/fancy/cigarettes/cigpack_syndicate, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/under/syndicate/ramzi, -/obj/item/clothing/under/syndicate/ramzi, -/obj/item/clothing/under/syndicate/ramzi, -/obj/item/clothing/under/syndicate/ramzi, -/obj/item/clothing/neck/shemagh/ramzi, -/obj/item/clothing/neck/shemagh/ramzi, -/obj/item/clothing/neck/shemagh/ramzi, -/obj/item/clothing/neck/shemagh/ramzi, -/obj/item/clothing/head/ramzi, -/obj/item/clothing/head/ramzi, -/obj/item/clothing/head/ramzi, -/obj/item/clothing/head/ramzi, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/dorms) -"AS" = ( -/obj/structure/chair/handrail{ - dir = 8 +"uV" = ( +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/mechbay) +"uX" = ( +/obj/item/ammo_casing/spent/slug/buck, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "frontiepod4" + }, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/drop4) +"va" = ( +/obj/machinery/power/terminal{ + dir = 4 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway2) -"AZ" = ( -/obj/machinery/power/port_gen/pacman, /obj/structure/cable{ icon_state = "0-8" }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_one) -"Bd" = ( -/obj/machinery/power/smes/shuttle/precharged, -/obj/structure/window/reinforced{ +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop2) +"vc" = ( +/obj/machinery/power/terminal{ dir = 8 }, /obj/structure/cable{ - icon_state = "0-2" + icon_state = "0-4" + }, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop3) +"ve" = ( +/obj/item/stack/sheet/mineral/snow{ + pixel_x = -7; + pixel_y = -6 + }, +/turf/open/floor/plating/asteroid/snow/lit/rockplanet, +/area/ruin/rockplanet/rust_base) +"vh" = ( +/obj/effect/turf_decal/siding/black{ + dir = 9 }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/tanto2) -"Be" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/turf/open/floor/plasteel/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"vi" = ( +/obj/structure/frame/machine, +/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer4{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 4 +/turf/open/floor/engine/hull/reinforced, +/area/ruin/rockplanet/rust_base/engine_one) +"vl" = ( +/obj/item/stack/ore/salvage/scraptitanium{ + pixel_x = -25; + pixel_y = 6 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"Bg" = ( -/turf/closed/wall/r_wall/syndicate/nodiagonal, -/area/ruin/rockplanet/rust_base/hallway) -"Bh" = ( +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"vo" = ( +/turf/closed/wall/r_wall, +/area/ruin/rockplanet/rust_base/mechbay) +"vr" = ( +/obj/machinery/power/ship_gravity, /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 +/obj/structure/cable{ + icon_state = "0-2" }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway2) -"Bj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/industrial/loading, -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/armory) -"Bo" = ( -/obj/effect/turf_decal/industrial/warning{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_one) +"vt" = ( +/obj/structure/chair/comfy/shuttle, +/obj/machinery/light/directional/north, +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop1) +"vu" = ( +/obj/machinery/power/terminal{ + dir = 8 }, +/obj/structure/catwalk/over/plated_catwalk/dark, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-4" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/mechbay) -"Br" = ( -/obj/effect/decal/cleanable/glass/plasma, -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/rust, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/engine_two) +"vy" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/box/red, +/turf/open/floor/plasteel/tech, /area/ruin/rockplanet/rust_base/engine_one) -"Bs" = ( -/turf/closed/wall/r_wall/syndicate, -/area/ruin/rockplanet/rust_base/bridge) -"Bz" = ( +"vA" = ( +/obj/structure/crate_shelf, +/obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/plastitanium, +/turf/open/floor/plasteel/mono/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"vB" = ( +/obj/machinery/door/airlock/hatch{ + dir = 4; + name = "Washroom" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/slop) +"vF" = ( +/obj/effect/decal/cleanable/glass/plastitanium, +/obj/item/ammo_casing/spent/slug/buck, +/turf/open/floor/wood/ebony, +/area/ruin/rockplanet/rust_base/dorms) +"vI" = ( +/obj/structure/chair, +/obj/effect/turf_decal/industrial/warning{ + color = "#912a2a"; + dir = 4 + }, +/obj/item/ammo_casing/spent/pistol_steel, +/obj/effect/decal/cleanable/blood/squirt{ + dir = 5 + }, +/obj/effect/decal/cleanable/blood/splatter/over_window{ + icon_state = "gib3"; + pixel_x = 6; + dir = 8; + pixel_y = 31 + }, +/turf/open/floor/plasteel/tech, /area/ruin/rockplanet/rust_base/armory) -"BA" = ( -/obj/structure/barricade/sandbags, -/turf/open/floor/plating/asteroid/rockplanet/lit, +"vJ" = ( +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "rustbunk2" + }, +/turf/open/floor/concrete/pavement/rockplanet/lit, /area/ruin/rockplanet/rust_base) -"BC" = ( +"vL" = ( /obj/effect/spawner/bunk_bed{ dir = 4 }, -/obj/structure/sign/poster/contraband/syndiemoth{ - pixel_y = 32 - }, -/turf/open/floor/plating/rust, +/turf/open/floor/carpet/red, /area/ruin/rockplanet/rust_base/dorms) -"BE" = ( +"vU" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 1; + layer = 2.040 + }, +/obj/item/ammo_casing/spent/rifle_brass, +/obj/effect/decal/cleanable/blood/squirt{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/hallway) -"BL" = ( -/obj/item/radio/intercom/directional/west{ - pixel_y = 3 +"vW" = ( +/obj/structure/platform/wood{ + dir = 8 }, -/turf/open/floor/plating/asteroid/dirt/rockplanet, +/obj/item/ammo_casing/spent/pistol_steel, +/turf/open/floor/concrete/pavement/rockplanet/lit, /area/ruin/rockplanet/rust_base) -"BM" = ( -/obj/structure/chair/plastic{ +"vZ" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; dir = 8 }, -/mob/living/simple_animal/hostile/human/ramzi/melee, -/turf/open/floor/carpet/red, -/area/ruin/rockplanet/rust_base/dorms) -"BN" = ( -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/layer2{ - dir = 8 +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 4 }, -/obj/item/radio/intercom/wideband/table{ - dir = 4; - pixel_y = 5 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/item/radio/intercom/table{ - dir = 4; - pixel_y = -10 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"wh" = ( +/obj/machinery/power/smes/shuttle/precharged{ + dir = 8 }, -/turf/open/floor/plasteel/white, -/area/ruin/rockplanet/rust_base/bridge) -"BO" = ( -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_two) -"BX" = ( -/obj/machinery/door/poddoor{ - id = "rustarmory" +/obj/structure/window/reinforced{ + dir = 4 }, +/obj/structure/window/reinforced, /turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/armory) -"BZ" = ( -/obj/machinery/door/airlock/hatch{ - dir = 4 +/area/ruin/rockplanet/rust_base/tanto2) +"wo" = ( +/obj/machinery/suit_storage_unit/inherit, +/obj/effect/turf_decal/industrial/warning{ + color = "#912a2a"; + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/obj/item/clothing/suit/space/hardsuit/syndi/ramzi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/clothing/mask/gas/ramzi, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/armory) +"wp" = ( +/obj/machinery/button/door{ + pixel_y = 21; + id = "rustmech" }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/hallway) -"Cd" = ( -/turf/closed/wall/r_wall/syndicate/nodiagonal, -/area/ruin/rockplanet/rust_base/mechbay) -"Cf" = ( -/obj/item/reagent_containers/glass/bucket{ - pixel_y = 14; - pixel_x = 12 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 }, -/turf/open/floor/plating/asteroid/dirt/rockplanet, -/area/ruin/rockplanet/rust_base) -"Co" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "4-8" }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/armory) -"Ct" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/mechbay) +"wu" = ( +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/ruin/rockplanet/rust_base/dorms) +"wA" = ( +/obj/effect/turf_decal/borderfloor{ dir = 4 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"Cu" = ( -/obj/structure/window/plasma/reinforced/plastitanium, -/obj/structure/grille, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/obj/machinery/door/poddoor{ - id = "rustenginetwo" +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 8 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"Cz" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/hallway) -"CA" = ( +"wB" = ( +/obj/effect/turf_decal/corner_techfloor_gray{ + dir = 10 + }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/engine_two) +"wD" = ( +/obj/structure/flippedtable{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 5 +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"wF" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/bucket{ + pixel_y = 6; + pixel_x = -7 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"CF" = ( -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/ruin/rockplanet/rust_base) +"wJ" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/glass/concrete_bag{ + pixel_x = -5 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 6 +/obj/item/reagent_containers/glass/concrete_bag{ + pixel_x = 5 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 6 +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/machinery/firealarm/directional/north{ + pixel_x = -5; + pixel_y = 32 + }, +/obj/structure/extinguisher_cabinet/directional/north{ + pixel_x = 8; + pixel_y = 28 }, /turf/open/floor/plating/rust, /area/ruin/rockplanet/rust_base/hallway2) -"CI" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 9 - }, -/obj/effect/turf_decal/corner/opaque/syndiered{ - dir = 1 - }, +"wK" = ( +/obj/effect/turf_decal/borderfloor/corner, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/plastitanium, -/area/ruin/rockplanet/rust_base/armory) -"CJ" = ( -/obj/structure/guncloset, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"CK" = ( -/obj/machinery/button/shieldwallgen{ - pixel_x = 2; - pixel_y = -21; - id = "rusteastholo"; - dir = 1 - }, -/obj/machinery/button/door{ - id = "rusteastsouth"; - pixel_x = -7; - dir = 1; - pixel_y = -21 +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/hallway) +"wL" = ( +/obj/item/stack/ore/salvage/scrapsilver{ + pixel_x = 3; + pixel_y = 8 }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/mechbay) -"CM" = ( -/obj/structure/grille/broken, -/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"wP" = ( +/obj/item/ammo_casing/spent/pistol_brass, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"wW" = ( +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/drop1) +"wX" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, /turf/open/floor/plating, /area/ruin/rockplanet/rust_base/tanto2) -"CP" = ( -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/armory) -"CQ" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +"xc" = ( +/obj/structure/rack, +/obj/item/ammo_casing/spent/pistol_steel, +/obj/structure/sign/poster/contraband/bulldog{ + pixel_x = 0; + pixel_y = 30 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/armory) +"xd" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/machinery/vending/cola/starkist, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway) +"xf" = ( +/obj/effect/turf_decal/borderfloor{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/corner/opaque/syndiered{ - dir = 5 +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 8 }, -/obj/structure/fluff/paper/stack{ - dir = 6; - pixel_y = -13; - pixel_x = -2 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/rockplanet/rust_base/armory) -"CX" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/plating/rust, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/hallway) -"CY" = ( -/obj/structure/closet/syndicate/personal{ - name = "captain's closet"; - populate = 0; - anchored = 1 +"xg" = ( +/obj/item/stack/ore/salvage/scrapmetal/five{ + pixel_x = 6; + pixel_y = 6 }, -/obj/item/storage/guncase/pistol/asp, -/obj/item/clothing/gloves/combat, -/obj/item/clothing/shoes/combat, -/turf/open/floor/carpet/red, +/turf/open/floor/wood/ebony, +/area/ruin/rockplanet/rust_base/dorms) +"xi" = ( +/turf/closed/wall, +/area/ruin/rockplanet/rust_base/drop2) +"xj" = ( +/obj/structure/crate_shelf, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plasteel/mono/dark, /area/ruin/rockplanet/rust_base/hallway2) -"Da" = ( -/obj/machinery/door/poddoor{ - id = "rustarmory"; - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/armory) -"De" = ( -/obj/machinery/vending/cola/black, +"xx" = ( +/obj/effect/turf_decal/corner/transparent/syndiered/bordercorner, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"Df" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/rockplanet/rust_base/engine_one) -"Dm" = ( +/area/ruin/rockplanet/rust_base/mechbay) +"xz" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4; + layer = 3.3 + }, +/obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-4" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 10 +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop3) +"xB" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop2) +"xH" = ( +/obj/structure/flora/rock/pile/rockplanet, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"xI" = ( +/obj/effect/turf_decal/borderfloor{ dir = 4 }, -/obj/effect/turf_decal/spline/fancy/opaque/syndiered{ - dir = 1 +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 8 }, -/turf/open/floor/plasteel/patterned/grid, -/area/ruin/rockplanet/rust_base/mechbay) -"Dr" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 }, -/obj/structure/chair/handrail{ +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"xL" = ( +/obj/effect/decal/cleanable/blood/splatter/over_window{ + icon_state = "gib3"; + pixel_x = 5; dir = 1 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/armory) -"Dz" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, +/turf/closed/wall/r_wall/syndicate/nodiagonal, +/area/ruin/rockplanet/rust_base/hallway) +"xM" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/trimline/opaque/red/line, /obj/machinery/button/door{ pixel_y = 21; - id = "rustwest" - }, -/obj/machinery/button/shieldwallgen{ - pixel_x = 10; - pixel_y = 21; - id = "rustwestholo" + id = "rustmech" }, -/mob/living/simple_animal/hostile/human/ramzi/ranged/smg, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"DA" = ( -/obj/machinery/door/poddoor{ - id = "frontbox2" +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 }, -/turf/open/floor/plasteel/tech/grid, -/area/ruin/rockplanet/rust_base/tanto2) -"DB" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "4-8" }, -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"xQ" = ( +/obj/effect/turf_decal/corner/transparent/syndiered/border{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"DF" = ( -/obj/structure/flippedtable{ +/area/ruin/rockplanet/rust_base/hallway2) +"xU" = ( +/obj/effect/turf_decal/siding/black, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/hallway2) +"xZ" = ( +/obj/structure/flora/grass/rockplanet/dead, +/turf/open/floor/plating/asteroid/rockplanet/cracked/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"ya" = ( +/obj/machinery/door/poddoor{ + id = "rustarmory"; + name = "Infantry Deployment"; dir = 4 }, -/obj/effect/turf_decal/industrial/warning{ +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/hallway2) +"yb" = ( +/obj/effect/turf_decal/borderfloor/corner{ dir = 1 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/trimline/opaque/syndiered/warning{ + dir = 6 }, +/obj/item/ammo_casing/spent/slug/buck, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/mechbay) -"DI" = ( +/turf/open/floor/plasteel/mono/dark, +/area/ruin/rockplanet/rust_base/armory) +"yd" = ( /obj/structure/closet/secure_closet/armorycage{ anchored = 1; name = "ammunition locker"; @@ -2877,4758 +3613,10000 @@ req_access = null }, /obj/item/storage/box/ammo/c45, -/obj/item/storage/box/ammo/c57x39, +/obj/item/storage/box/ammo/c10mm, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, /turf/open/floor/plasteel/tech, /area/ruin/rockplanet/rust_base/mechbay) -"DO" = ( -/obj/structure/chair/bench/red/directional/west, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway2) -"DV" = ( -/obj/machinery/hydroponics/soil, -/obj/item/food/grown/ash_flora/cactus_fruit, -/turf/open/floor/plating/asteroid/dirt/rockplanet, -/area/ruin/rockplanet/rust_base) -"DZ" = ( -/obj/structure/flippedtable{ +"ye" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 5 + }, +/obj/effect/turf_decal/spline/fancy/opaque/black{ dir = 4 }, -/obj/effect/turf_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/mechbay) -"Ed" = ( -/obj/effect/turf_decal/siding/thinplating, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"Ei" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/ruin/rockplanet/rust_base/engine_one) +"yg" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "frontiepod2" }, -/obj/machinery/light/directional/south, -/turf/open/floor/plasteel/stairs/left{ - dir = 4 +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/drop2) +"yh" = ( +/obj/item/stack/ore/salvage/scrapgold{ + pixel_x = 4; + pixel_y = -9 }, -/area/ruin/rockplanet/rust_base/armory) -"Ek" = ( -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"Eo" = ( -/obj/structure/chair/plastic, -/obj/structure/sign/poster/contraband/twelve_gauge{ - pixel_y = 32 +/obj/item/stack/ore/salvage/scrapsilver{ + pixel_x = -11; + pixel_y = 6 }, -/turf/open/floor/carpet/red, -/area/ruin/rockplanet/rust_base/dorms) -"Et" = ( -/obj/machinery/light/floor/hangar, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/armory) -"Ey" = ( -/obj/effect/turf_decal/industrial/warning, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/armory) -"EA" = ( +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"yl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/obj/structure/catwalk/over/plated_catwalk/dark, /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/oil, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"EU" = ( -/obj/effect/turf_decal/industrial/warning, -/obj/structure/platform/industrial_alt{ - dir = 8 - }, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/armory) -"EV" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/poddoor{ - dir = 4; - id = "rusteastsouth" +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/engine_one) +"ym" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/effect/decal/cleanable/blood/squirt{ + dir = 4 }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/mechbay) -"Fc" = ( +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/pistol_brass, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway2) +"yp" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/rockplanet/rust_base/engine_two) -"Ff" = ( -/obj/structure/bed, -/obj/item/bedsheet/syndie, -/obj/machinery/light/small/directional/east, -/turf/open/floor/carpet/red, -/area/ruin/rockplanet/rust_base/hallway2) -"Fk" = ( -/obj/effect/turf_decal/techfloor{ - dir = 8 - }, -/obj/effect/decal/cleanable/glass, -/obj/structure/salvageable/computer, -/obj/item/radio/intercom/wideband/directional/west, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/pod, -/area/ruin/rockplanet/rust_base/tanto2) -"Fn" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating/asteroid/rockplanet/lit, -/area/ruin/rockplanet/rust_base) -"Fv" = ( -/obj/structure/cable{ - icon_state = "4-8" +"yB" = ( +/obj/effect/turf_decal/corner/transparent/syndiered/border{ + dir = 4 }, +/obj/machinery/light/directional/north, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/hallway) -"FA" = ( -/obj/machinery/light/directional/west, -/obj/structure/closet/emcloset, /turf/open/floor/plasteel/tech, /area/ruin/rockplanet/rust_base/hallway2) -"FE" = ( -/mob/living/simple_animal/hostile/human/ramzi/ranged/smg, -/turf/open/floor/plating/asteroid/dirt/rockplanet, -/area/ruin/rockplanet/rust_base) -"FM" = ( -/obj/machinery/light/directional/north, +"yC" = ( +/obj/effect/decal/cleanable/blood/footprints, +/obj/effect/mob_spawn/human/corpse/frontier, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/tanto2) +"yK" = ( +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4, +/obj/structure/catwalk/over/plated_catwalk/dark, /turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"FO" = ( -/obj/structure/table, -/obj/structure/reagent_dispensers/servingdish, -/obj/effect/decal/cleanable/food/salt, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/slop) -"FX" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/ruin/rockplanet/rust_base) +"yN" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/dorms) +"yU" = ( +/turf/open/floor/plating/asteroid/snow/lit/rockplanet, +/area/overmap_encounter/planetoid/rockplanet/explored) +"za" = ( /obj/structure/cable{ icon_state = "2-4" }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden/layer2{ +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop1) +"zd" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 10 + }, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop3) +"zf" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/effect/mob_spawn/human/corpse/ramzi, +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/cleanable/blood, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway2) +"zi" = ( +/turf/closed/wall/r_wall/syndicate/nodiagonal, +/area/ruin/rockplanet/rust_base/dorms) +"zl" = ( +/turf/closed/wall/r_wall/syndicate/nodiagonal, +/area/ruin/rockplanet/rust_base/bridge) +"zn" = ( +/obj/structure/platform/wood{ + dir = 4 + }, +/obj/item/ammo_casing/spent/pistol_steel, +/obj/item/ammo_casing/spent/pistol_steel, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"zs" = ( +/obj/machinery/power/shuttle/engine/electric{ dir = 1 }, -/obj/machinery/atmospherics/pipe/manifold/brown/hidden/layer4{ +/turf/open/floor/engine/hull/rockplanet, +/area/ruin/rockplanet/rust_base/tanto2) +"zt" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 }, -/obj/effect/turf_decal/siding/thinplating/dark/corner{ - dir = 8 +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 1; + layer = 2.040 }, -/obj/effect/turf_decal/siding/thinplating/dark/corner, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"FY" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/structure/flippedtable, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/armory) -"FZ" = ( -/obj/effect/turf_decal/corner/opaque/syndiered{ - dir = 5 +/obj/effect/decal/cleanable/blood/splatter, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 }, -/obj/effect/turf_decal/corner/opaque/syndiered{ +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"zv" = ( +/obj/machinery/power/terminal{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/plastitanium, -/area/ruin/rockplanet/rust_base/armory) -"Ga" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/dorms) -"Gb" = ( /obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/spline/fancy/opaque/black, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 + icon_state = "0-4" }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/bridge) -"Ge" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/obj/structure/closet/emcloset/wall/directional/south, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop3) +"zw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"Gg" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/platform/industrial_alt/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/hangar/plasteel/dark, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/mechbay) -"Gm" = ( -/obj/effect/spawner/bunk_bed{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/dorms) -"Gn" = ( -/obj/effect/turf_decal/spline/fancy/opaque/syndiered{ +"zx" = ( +/obj/machinery/suit_storage_unit/inherit, +/obj/item/clothing/mask/gas/ramzi, +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/siding/thinplating/dark, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/hallway2) +"zA" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/components/unary/portables_connector/layer2, +/obj/effect/turf_decal/corner_techfloor_gray{ dir = 10 }, -/turf/open/floor/plasteel/patterned/grid, -/area/ruin/rockplanet/rust_base/mechbay) -"Gz" = ( -/obj/item/mine/pressure/explosive/fire/live, -/turf/open/floor/plating/asteroid/rockplanet/lit, -/area/ruin/rockplanet/rust_base) -"GE" = ( -/obj/effect/decal/cleanable/garbage, -/obj/machinery/power/terminal{ +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/engine_one) +"zC" = ( +/obj/effect/turf_decal/borderfloor/corner{ dir = 1 }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/structure/cable{ - icon_state = "0-4" + icon_state = "1-2" }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_one) -"GF" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/obj/machinery/button/door{ + pixel_y = 2; + id = "rustmech"; + pixel_x = 21; + dir = 8 + }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"zF" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/salvageable/machine, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 9 +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "rustengine1" }, -/obj/structure/cable{ - icon_state = "1-8" +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/engine_one) +"zJ" = ( +/obj/structure/platform/wood{ + dir = 1 }, -/obj/effect/turf_decal/corner/opaque/syndiered{ - dir = 5 +/turf/open/floor/plasteel/stairs/wood/mid{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/plastitanium, -/area/ruin/rockplanet/rust_base/armory) -"GG" = ( -/obj/machinery/hydroponics/soil, -/obj/item/food/grown/sweet_potato, -/turf/open/floor/plating/asteroid/dirt/rockplanet, /area/ruin/rockplanet/rust_base) -"GP" = ( -/obj/machinery/porta_turret/ship/ramzi/heavy{ - id = "rustguns"; - lethal = 1; - dir = 6; - turret_respects_id = 0; - turret_flags = 62 +"zK" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable{ + icon_state = "0-2" }, -/turf/closed/wall/r_wall/syndicate/nodiagonal, -/area/ruin/rockplanet/rust_base/bridge) -"GQ" = ( -/obj/structure/closet/firecloset, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"GY" = ( -/obj/structure/rack, -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot{ - pixel_y = 5 +/area/ruin/rockplanet/rust_base/engine_one) +"zM" = ( +/obj/structure/platform/wood{ + dir = 10 }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/siding/thinplating, -/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser{ - pixel_y = -2 +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"zP" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 6 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"Hc" = ( -/turf/open/floor/plasteel/patterned, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop1) +"zS" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/mob_spawn/human/corpse/frontier/ranged/internals, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"zT" = ( +/turf/closed/wall/r_wall, /area/ruin/rockplanet/rust_base/hallway2) -"Hg" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 5 +"zV" = ( +/obj/structure/table/reinforced, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/hallway2) +"zW" = ( +/turf/open/floor/wood/ebony{ + icon_state = "wood-broken5" + }, +/area/ruin/rockplanet/rust_base/dorms) +"zZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/borderfloorblack, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 1; + layer = 2.040 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/structure/cable{ - icon_state = "0-4" + icon_state = "1-2" }, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/carpet/red, -/area/ruin/rockplanet/rust_base/hallway2) -"Hh" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base) +"Af" = ( +/obj/structure/table/reinforced, +/obj/item/radio/intercom/table{ dir = 4 }, -/obj/structure/cable{ - icon_state = "0-4" +/obj/structure/railing{ + dir = 4 }, -/obj/machinery/power/terminal, -/turf/open/floor/plating/rust, +/obj/effect/turf_decal/corner/transparent/syndiered/border, +/turf/open/floor/plasteel/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"Ag" = ( +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"Ak" = ( +/turf/open/floor/engine/hull/reinforced/rockplanet, /area/ruin/rockplanet/rust_base/engine_two) -"Hk" = ( -/obj/structure/table/reinforced, -/obj/machinery/turretid/lethal{ - id = "rustguns" +"Al" = ( +/obj/item/ammo_casing/spent/pistol_brass, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"An" = ( +/obj/item/ammo_casing/spent/rifle_brass, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"As" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned, +/area/ruin/rockplanet/rust_base/hallway) +"Aw" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 }, -/obj/effect/turf_decal/techfloor{ - dir = 5 +/turf/open/floor/plasteel/mono/dark, +/area/ruin/rockplanet/rust_base/slop) +"AB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 }, -/turf/open/floor/plasteel/telecomms_floor, -/area/ruin/rockplanet/rust_base/bridge) -"Hm" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -18; - pixel_y = 4 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/structure/mirror{ - pixel_y = 5; - pixel_x = -29 +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/open/floor/plasteel/freezer, -/area/ruin/rockplanet/rust_base/hallway) -"Hp" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/ruin/rockplanet/rust_base/armory) -"Hu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door{ - pixel_y = 22; - id = "rustarmory" +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_one) +"AC" = ( +/obj/item/stack/sheet/mineral/snow{ + pixel_x = 4; + pixel_y = 6 }, -/obj/structure/chair/handrail{ - dir = 4 +/obj/item/toy/snowball{ + pixel_x = 5; + pixel_y = 5 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway2) -"Hv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 +/turf/open/floor/plating/asteroid/snow/lit/rockplanet, +/area/ruin/rockplanet/rust_base) +"AE" = ( +/obj/effect/turf_decal/corner/transparent/syndiered/border{ + dir = 1 }, -/obj/structure/chair/handrail{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, -/turf/open/floor/plasteel/tech, +/turf/open/floor/plasteel/dark, /area/ruin/rockplanet/rust_base/hallway2) -"HB" = ( -/obj/machinery/porta_turret/ship/ramzi/light{ - dir = 5; - id = "rustguns"; - turret_respects_id = 0; - turret_flags = 62; - lethal = 1 +"AF" = ( +/obj/structure/flora/rock/asteroid, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"AG" = ( +/obj/machinery/power/terminal{ + dir = 4 }, -/turf/closed/wall/r_wall/syndicate/nodiagonal, -/area/ruin/rockplanet/rust_base/engine_one) -"HH" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "0-8" }, -/obj/structure/cable{ - icon_state = "1-8" +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop1) +"AH" = ( +/obj/structure/marker_beacon{ + picked_color = "Lime" }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/hallway) -"HU" = ( -/obj/machinery/light/directional/south, -/obj/structure/rack, -/obj/effect/turf_decal/siding/thinplating, -/obj/item/storage/box/ammo/c10mm, -/obj/item/storage/box/ammo/c10mm{ - pixel_x = 0; - pixel_y = 8 +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/hallway2) +"AN" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"HX" = ( +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"AT" = ( /obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/platform/industrial_alt, -/turf/open/floor/plasteel/stairs/left{ - dir = 4 + icon_state = "2-4" }, -/area/ruin/rockplanet/rust_base/mechbay) -"Id" = ( -/obj/machinery/door/airlock/hatch, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_one) -"Ii" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"Ij" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/west, -/obj/structure/chair/bench/red/directional/east, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"Im" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway2) -"Iz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/obj/effect/turf_decal/siding/thinplating/dark{ +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop1) +"AU" = ( +/obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 4 }, -/obj/structure/barricade/sandbags, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"IA" = ( -/obj/machinery/suit_storage_unit/inherit, -/obj/item/clothing/mask/gas/ramzi, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"IF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 + }, /obj/effect/decal/cleanable/dirt, -/obj/structure/salvageable/computer{ +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/slop) +"AZ" = ( +/obj/structure/platform/industrial_alt{ dir = 8 }, -/obj/effect/turf_decal/techfloor{ +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/hallway2) +"Be" = ( +/obj/effect/turf_decal/industrial/warning, +/mob/living/simple_animal/hostile/human/ramzi/ranged/space/smg, +/obj/effect/turf_decal/corner_steel_grid{ dir = 4 }, -/turf/open/floor/plasteel/telecomms_floor, -/area/ruin/rockplanet/rust_base/bridge) -"II" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 }, -/obj/structure/chair/handrail, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/mechbay) +"Bf" = ( +/obj/structure/flora/grass/rockplanet/dead, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Bh" = ( +/obj/structure/girder/reinforced, +/turf/open/floor/engine/hull/reinforced/rockplanet, /area/ruin/rockplanet/rust_base/hallway) -"IO" = ( -/obj/structure/cable{ - icon_state = "1-2" +"Bl" = ( +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "rustbunk1" }, -/turf/open/floor/plating/asteroid/dirt/rockplanet, +/turf/open/floor/concrete/pavement/rockplanet/lit, /area/ruin/rockplanet/rust_base) -"IR" = ( -/obj/machinery/button/door{ - pixel_y = -21; - id = "rustmech"; - dir = 1 +"Bo" = ( +/obj/structure/table/reinforced, +/obj/item/binoculars{ + pixel_y = 10 }, -/obj/structure/closet/firecloset, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway2) -"IU" = ( -/obj/structure/chair/plastic{ +/obj/effect/turf_decal/techfloor{ dir = 1 }, -/turf/open/floor/carpet/red, -/area/ruin/rockplanet/rust_base/dorms) -"Jd" = ( -/obj/structure/guncloset, -/obj/item/gun/ballistic/automatic/smg/cobra, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"Jl" = ( -/obj/structure/chair/office/dark{ +/obj/machinery/turretid/lethal{ + id = "rustguns"; + pixel_x = 0; + pixel_y = 25 + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ruin/rockplanet/rust_base/bridge) +"Br" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 + }, +/obj/effect/turf_decal/trimline/opaque/syndiered/warning{ dir = 4 }, -/obj/effect/turf_decal/spline/fancy/opaque/syndiered{ - dir = 5 +/mob/living/simple_animal/hostile/human/ramzi/ranged/space/stormtrooper/shotgun{ + name = "'Armored' O. Ray"; + weapon_drop_chance = 100 }, -/turf/open/floor/plasteel/patterned/grid, +/turf/open/floor/plasteel/mono/dark, /area/ruin/rockplanet/rust_base/armory) -"Jq" = ( -/obj/structure/mecha_wreckage/gygax/dark, -/obj/effect/decal/cleanable/glass/plasma, -/obj/effect/decal/cleanable/plastic, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, +"Bu" = ( +/obj/structure/crate_shelf, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plasteel/mono/dark, /area/ruin/rockplanet/rust_base/mechbay) -"Jw" = ( -/obj/machinery/button/door{ - pixel_y = 7; - id = "rustwest"; - dir = 8; - pixel_x = 21 - }, -/obj/machinery/button/shieldwallgen{ - pixel_x = 20; - pixel_y = -2; - id = "rustwestholo"; +"BF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 }, -/turf/open/floor/plating/asteroid/rockplanet/lit, +/obj/machinery/light/small/directional/south, +/turf/open/floor/concrete/slab_1, /area/ruin/rockplanet/rust_base) -"Jx" = ( -/obj/effect/turf_decal/industrial/warning, -/obj/structure/platform/industrial_alt{ - dir = 8 +"BG" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/trimline/opaque/red/line, +/obj/effect/decal/cleanable/blood/squirt{ + dir = 9 }, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/mechbay) -"JD" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/directional/south, -/obj/item/paper_bin, -/obj/item/pen/red, -/obj/structure/railing{ - dir = 4 +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/pistol_brass, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"BH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"JF" = ( -/turf/closed/wall/r_wall/syndicate/nodiagonal, -/area/ruin/rockplanet/rust_base/bridge) -"JG" = ( -/obj/structure/rack, -/obj/item/storage/box/ammo/a12g_buckshot, -/obj/item/storage/box/ammo/a12g_buckshot{ - pixel_y = 7 +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"BJ" = ( +/obj/structure/window/reinforced{ + dir = 8 }, -/obj/effect/turf_decal/siding/thinplating, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"JI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"JL" = ( -/obj/effect/turf_decal/arrows/white{ +/obj/structure/salvageable/machine, +/obj/machinery/door/poddoor/shutters{ dir = 4; - pixel_y = -9 + id = "rustengine2" }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/armory) -"JV" = ( +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/engine_two) +"BK" = ( /obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway2) -"JZ" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 4 + icon_state = "1-4" }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"Kc" = ( -/obj/machinery/door/poddoor{ - dir = 4; - id = "rustengineone" - }, -/obj/machinery/atmospherics/components/unary/shuttle/fire_heater, +/obj/effect/turf_decal/corner_techfloor_gray, /turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/engine_two) +"BL" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/hallway2) +"BM" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 10 + }, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop4) +"BO" = ( +/obj/effect/decal/fakelattice, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"BP" = ( +/turf/closed/wall/r_wall/syndicate/nodiagonal, /area/ruin/rockplanet/rust_base/engine_one) -"Kf" = ( -/obj/effect/turf_decal/industrial/warning, -/obj/structure/rack, -/obj/effect/decal/cleanable/dirt, -/obj/item/ammo_box/magazine/m10mm_cottonmouth, -/obj/item/ammo_box/magazine/m10mm_cottonmouth{ - pixel_x = -10; - pixel_y = 0 +"BQ" = ( +/obj/effect/turf_decal/borderfloor/corner{ + dir = 8 }, -/turf/open/floor/plasteel/mono, +/obj/effect/turf_decal/trimline/opaque/syndiered/warning{ + dir = 5 + }, +/obj/item/ammo_casing/spent/slug/buck, +/obj/item/ammo_casing/spent/pistol_steel, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/plasteel/mono/dark, /area/ruin/rockplanet/rust_base/armory) -"Kr" = ( +"BS" = ( +/obj/effect/turf_decal/corner/transparent/red/diagonal, +/turf/open/floor/hangar/plasteel/dark, +/area/ruin/rockplanet/rust_base/slop) +"BZ" = ( +/obj/item/ammo_casing/spent/big_brass, +/turf/open/floor/plating/asteroid/snow/lit/rockplanet, +/area/ruin/rockplanet/rust_base) +"Cg" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "4-8" + }, +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop4) +"Ci" = ( +/obj/structure/chair/stool{ + dir = 1 }, /obj/structure/cable{ - icon_state = "1-8" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/manifold/brown/hidden/layer4, -/obj/effect/turf_decal/spline/fancy/opaque/syndiered{ - dir = 9 +/turf/open/floor/concrete/slab_1, +/area/ruin/rockplanet/rust_base) +"Cj" = ( +/obj/effect/turf_decal/borderfloor{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/patterned/grid, -/area/ruin/rockplanet/rust_base/mechbay) -"KL" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/turf/open/floor/plasteel/patterned, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/hallway) -"KP" = ( -/obj/machinery/light/floor/hangar, -/obj/structure/cable{ - icon_state = "4-8" +"Ck" = ( +/obj/item/stack/ore/salvage/scrapmetal/five, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Cn" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/armory) -"KS" = ( +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-2" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"Cp" = ( +/obj/effect/turf_decal/siding/black, +/turf/open/floor/plasteel/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"Cs" = ( +/obj/effect/turf_decal/borderfloor/corner, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 9 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 4 +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"Cx" = ( +/obj/item/stack/ore/salvage/scrapgold{ + pixel_x = -9; + pixel_y = -15 }, -/obj/machinery/door/airlock/hatch{ +/obj/item/stack/ore/salvage/scrapplasma{ + pixel_x = 6; + pixel_y = 8 + }, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Cz" = ( +/obj/structure/chair/comfy/shuttle{ dir = 4; - name = "Dormitories" + layer = 3.3 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/dorms) -"KU" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/glass/concrete_bag{ - pixel_x = -5 +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/item/reagent_containers/glass/concrete_bag{ - pixel_x = 5 +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop4) +"CB" = ( +/obj/structure/railing{ + dir = 10 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/armory) -"KX" = ( -/obj/item/storage/bottles/moonshine/sealed{ - pixel_y = -8 +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"CC" = ( +/obj/effect/turf_decal/corner/transparent/syndiered/bordercorner{ + dir = 4 }, -/obj/item/storage/bottles/moonshine/sealed{ - pixel_y = 3 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/hallway2) +"CG" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 }, -/obj/effect/turf_decal/techfloor{ +/obj/effect/turf_decal/trimline/opaque/red/line{ dir = 4 }, -/obj/effect/decal/cleanable/blood/splatter/over_window{ - pixel_x = 28; - pixel_y = -1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 4 }, -/obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable{ - icon_state = "0-8" + icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "2-8" +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"CH" = ( +/obj/effect/decal/cleanable/glass, +/obj/item/broken_bottle{ + pixel_x = -10 + }, +/obj/item/broken_bottle{ + pixel_x = 2; + pixel_y = -7 + }, +/obj/item/broken_bottle{ + pixel_x = 12; + pixel_y = -1 + }, +/obj/machinery/power/terminal{ + dir = 1 }, /turf/open/floor/pod, /area/ruin/rockplanet/rust_base/tanto2) -"Lf" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 +"CJ" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 9 }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/manifold/brown/hidden/layer4, -/obj/structure/cable{ - icon_state = "1-2" +/obj/item/ammo_casing/spent/slug/buck, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop4) +"CY" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway) +"Da" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "2-4" +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Di" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 5 }, -/mob/living/simple_animal/hostile/human/ramzi/ranged/smg, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"Li" = ( -/obj/machinery/light/directional/east, -/obj/structure/barricade/sandbags, +/obj/machinery/atmospherics/pipe/layer_manifold/visible, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"Lj" = ( -/obj/structure/chair/handrail{ - dir = 1 +/area/ruin/rockplanet/rust_base/engine_one) +"Dj" = ( +/obj/effect/turf_decal/borderfloor{ + dir = 4 }, -/turf/open/floor/plating/rust, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 8 + }, +/obj/item/ammo_casing/spent/pistol_brass, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/hallway) -"Lp" = ( +"Do" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 5; + pixel_y = 11 + }, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Dr" = ( +/turf/open/floor/engine/hull/reinforced, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Ds" = ( +/obj/item/ammo_casing/spent/rifle_brass, +/obj/structure/flora/grass/rockplanet/dead, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Dw" = ( +/obj/machinery/computer/helm{ + dir = 8; + layer = 3.3 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, /obj/machinery/button/door{ - pixel_y = -21; - id = "rustarmory"; + pixel_x = 0; + pixel_y = 24; + id = "frontiepod4" + }, +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop4) +"DB" = ( +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/dorms) +"DE" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/slug/buck, +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway2) +"DM" = ( +/obj/structure/salvageable/computer, +/obj/effect/turf_decal/techfloor{ dir = 1 }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/rockplanet/rust_base/armory) -"LA" = ( -/obj/effect/turf_decal/spline/fancy/opaque/syndiered{ - dir = 9 +/turf/open/floor/plasteel/telecomms_floor, +/area/ruin/rockplanet/rust_base/bridge) +"DT" = ( +/obj/structure/table, +/obj/item/gun/ballistic/automatic/pistol/rattlesnake/cottonmouth{ + pixel_x = 5; + pixel_y = -7 }, -/turf/open/floor/plasteel/patterned/grid, -/area/ruin/rockplanet/rust_base/armory) -"LH" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/layer4{ +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"DY" = ( +/obj/effect/turf_decal/industrial/warning, +/obj/structure/platform/industrial_alt/corner{ dir = 1 }, -/turf/open/floor/engine/hull/rockplanet, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"Ea" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/mob/living/simple_animal/hostile/human/frontier/axe/internals, +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, /area/ruin/rockplanet/rust_base) -"LJ" = ( -/obj/machinery/cryopod/syndicate{ +"Eb" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/airalarm/directional/east, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/cryo) -"LO" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/area/ruin/rockplanet/rust_base/dorms) +"Ee" = ( +/obj/machinery/computer/crew/retro, +/obj/effect/turf_decal/techfloor{ + dir = 1 + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ruin/rockplanet/rust_base/bridge) +"Ef" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/concrete/slab_1/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Ej" = ( +/obj/machinery/computer/mech_bay_power_console{ + dir = 1 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/mechbay) +"Eo" = ( +/obj/structure/flora/tree/cactus, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Eq" = ( +/obj/structure/rack, +/obj/item/hatchet/wooden{ + pixel_x = 7; + pixel_y = 2 + }, +/obj/item/shovel/spade{ + pixel_x = -4; + pixel_y = -5 + }, +/turf/open/floor/concrete/slab_3/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"Ev" = ( +/obj/machinery/computer/helm{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 9 +/obj/machinery/button/door{ + dir = 1; + pixel_x = 0; + pixel_y = -20; + id = "frontiepod2" }, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/dorms) -"LT" = ( -/turf/closed/wall/r_wall/syndicate/nodiagonal, -/area/ruin/rockplanet/rust_base/engine_two) -"LY" = ( -/turf/closed/wall/r_wall/syndicate, -/area/ruin/rockplanet/rust_base/dorms) -"LZ" = ( /obj/structure/cable{ - icon_state = "1-8" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop2) +"Ew" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_one) +"Ey" = ( +/turf/closed/wall, +/area/ruin/rockplanet/rust_base/drop1) +"ED" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ dir = 4 }, -/turf/open/floor/plating/rust, +/obj/machinery/light_switch{ + dir = 8; + pixel_x = 20; + pixel_y = -7 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/corpse/ramzi, +/obj/effect/decal/cleanable/blood/splatter/over_window{ + icon_state = "gib3"; + pixel_x = 20; + pixel_y = 14 + }, +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/cleanable/blood/splatter{ + icon_state = "floor4" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/layer4, +/turf/open/floor/plasteel/tech, /area/ruin/rockplanet/rust_base/dorms) -"Mq" = ( -/obj/structure/chair/plastic{ - dir = 1 +"EF" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/engine/hull/reinforced/interior, +/area/ruin/rockplanet/rust_base/hallway) +"EM" = ( +/obj/effect/turf_decal/corner_techfloor_gray{ + dir = 10 }, +/obj/machinery/autolathe, /turf/open/floor/plating/rust, /area/ruin/rockplanet/rust_base/engine_two) -"Mr" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/carpet/red, -/area/ruin/rockplanet/rust_base/dorms) -"Mu" = ( -/obj/structure/toilet, -/obj/item/clothing/head/papersack/smiley{ - pixel_y = 12 +"EN" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 }, -/obj/effect/decal/remains/human{ - pixel_y = -6 +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop3) +"EP" = ( +/obj/effect/decal/fakelattice, +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/hallway2) +"Fb" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 }, -/turf/open/floor/plating/rust/rockplanet/lit, -/area/ruin/rockplanet/rust_base) -"Mw" = ( -/obj/effect/decal/cleanable/blood/tracks{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/brown/hidden/layer4, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_two) -"MB" = ( -/obj/effect/turf_decal/spline/fancy/opaque/syndiered{ +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway) +"Fc" = ( +/obj/machinery/power/smes/shuttle/precharged, +/obj/structure/window/reinforced{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/human/ramzi/ranged/space/shotgun{ - minimum_distance = 0; - retreat_distance = 0 +/obj/structure/cable{ + icon_state = "0-8" }, -/turf/open/floor/plasteel/patterned/grid, -/area/ruin/rockplanet/rust_base/mechbay) -"MD" = ( -/obj/effect/turf_decal/corner/opaque/syndiered{ - dir = 5 +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop4) +"Ff" = ( +/obj/machinery/button/door{ + pixel_y = 21; + id = "rustsecure"; + name = "cargo storage door button" }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/plastitanium, -/area/ruin/rockplanet/rust_base/armory) -"MG" = ( -/obj/effect/turf_decal/arrows/white{ - dir = 4; - pixel_y = -9 +/obj/effect/turf_decal/siding/black/corner{ + dir = 1 }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/mechbay) -"ML" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"MN" = ( -/turf/open/floor/plating/asteroid/dirt/rockplanet, -/area/ruin/rockplanet/rust_base) -"MP" = ( -/turf/closed/wall/r_wall/syndicate, /area/ruin/rockplanet/rust_base/mechbay) -"MW" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 5 - }, -/obj/effect/turf_decal/siding/thinplating/dark/corner{ - dir = 4 +"Fj" = ( +/obj/effect/decal/cleanable/blood/squirt{ + dir = 9 }, -/obj/effect/turf_decal/siding/thinplating/dark{ +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Fk" = ( +/obj/structure/window/reinforced{ dir = 8 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"Nb" = ( +/obj/structure/salvageable/machine, /turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"Nl" = ( -/obj/machinery/atmospherics/components/unary/shuttle/fire_heater, -/obj/machinery/door/poddoor{ - dir = 4; - id = "rustengineone" - }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_one) -"Nn" = ( -/obj/structure/reagent_dispensers, -/turf/open/floor/plating/rust, /area/ruin/rockplanet/rust_base/hallway) -"Nr" = ( -/obj/structure/closet, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/under/syndicate/ramzi/overalls, -/obj/item/clothing/under/syndicate/ramzi/overalls, -/obj/item/clothing/under/syndicate/ramzi/overalls, -/obj/item/clothing/under/syndicate/ramzi/overalls, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/neck/shemagh/ramzi, -/obj/item/clothing/neck/shemagh/ramzi, -/obj/item/clothing/neck/shemagh/ramzi, -/obj/item/clothing/neck/shemagh/ramzi, -/obj/item/clothing/head/ramzi, -/obj/item/clothing/head/ramzi, -/obj/item/clothing/head/ramzi, -/obj/item/clothing/head/ramzi, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/dorms) -"Nw" = ( -/obj/machinery/mech_bay_recharge_port, -/obj/structure/platform/industrial_alt/corner{ - dir = 1 +"Fm" = ( +/obj/effect/turf_decal/industrial/warning/dust{ + dir = 4 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/armory) -"Nx" = ( -/obj/machinery/porta_turret/ship/ramzi/light{ - dir = 8; - id = "rustguns"; - turret_respects_id = 0; - turret_flags = 62; - lethal = 1 +/turf/open/floor/engine/hull/rockplanet, +/area/ruin/rockplanet/rust_base/hallway2) +"Fo" = ( +/obj/item/stack/sheet/mineral/snow{ + pixel_x = 7; + pixel_y = 3 }, -/turf/closed/wall/r_wall/syndicate/nodiagonal, -/area/ruin/rockplanet/rust_base/armory) -"ND" = ( -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"NF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/guncloset, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"NK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 8 +/turf/open/floor/plating/asteroid/snow/lit/rockplanet, +/area/ruin/rockplanet/rust_base) +"Fp" = ( +/obj/effect/decal/cleanable/blood/squirt{ + icon_state = "trails_1" }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/dorms) -"NP" = ( -/obj/structure/rack, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 +/obj/effect/decal/cleanable/blood, +/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy{ + mob_name = "'Charred' Mandibles"; + mob_species = /datum/species/moth }, -/obj/item/storage/box/stockparts/t2{ - pixel_x = -8 +/turf/open/floor/plasteel/mono, +/area/ruin/rockplanet/rust_base/armory) +"Fq" = ( +/obj/machinery/atmospherics/components/unary/tank/nitrogen, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/corner_techfloor_gray{ + dir = 10 }, -/obj/item/stock_parts/cell/super/empty{ - pixel_x = 7; - pixel_y = 7 +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/engine_one) +"Fv" = ( +/obj/machinery/atmospherics/components/unary/tank/air{ + piping_layer = 2 }, -/obj/item/stock_parts/cell/super/empty{ - pixel_x = 7; - pixel_y = -3 +/obj/effect/turf_decal/corner_techfloor_gray{ + dir = 10 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"NQ" = ( -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/engine_one) +"Fz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden/layer2{ - dir = 4 +/turf/open/floor/concrete/slab_1, +/area/ruin/rockplanet/rust_base) +"FA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"FC" = ( /obj/effect/turf_decal/siding/thinplating/dark{ - dir = 6 + dir = 4 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"NV" = ( -/obj/effect/turf_decal/industrial/loading{ - dir = 1 +/obj/effect/mob_spawn/human/corpse/ramzi, +/obj/effect/abstract/turf_fire/magical, +/turf/open/floor/plasteel/mono/dark, +/area/ruin/rockplanet/rust_base/slop) +"FD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/mechbay) -"NY" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/structure/cable{ - icon_state = "1-4" +/obj/machinery/door/airlock/hatch{ + dir = 4; + name = "Bridge" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"Oi" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"Ok" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ +/obj/machinery/door/firedoor/border_only{ dir = 4 }, -/obj/effect/turf_decal/siding/thinplating/dark{ +/obj/machinery/door/firedoor/border_only{ dir = 8 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"Or" = ( -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"Ov" = ( -/obj/machinery/suit_storage_unit/inherit, -/obj/item/clothing/mask/gas/ramzi, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"Ox" = ( -/obj/effect/decal/cleanable/garbage, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_one) -"OE" = ( -/obj/effect/turf_decal/spline/fancy/opaque/syndiered{ - dir = 1 - }, -/turf/open/floor/plasteel/patterned/grid, -/area/ruin/rockplanet/rust_base/armory) -"OF" = ( -/obj/item/pen, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/plastitanium, -/area/ruin/rockplanet/rust_base/armory) -"OG" = ( -/obj/effect/spawner/bunk_bed, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/dorms) -"OJ" = ( -/obj/machinery/button/door{ - pixel_y = 21; - id = "rusteastsouth" - }, -/obj/machinery/button/shieldwallgen{ - pixel_x = 10; - pixel_y = 21; - id = "rusteastholo" - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"ON" = ( -/obj/effect/turf_decal/industrial/loading, -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/armory) -"OP" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable{ - icon_state = "0-2" +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/bridge) +"FE" = ( +/obj/machinery/power/smes/shuttle/precharged, +/obj/structure/window/reinforced{ + dir = 8 }, -/obj/effect/spawner/bunk_bed{ +/obj/machinery/door/poddoor{ + id = "rustengine2"; dir = 4 }, /turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/dorms) -"OQ" = ( +/area/ruin/rockplanet/rust_base/engine_two) +"FL" = ( +/obj/machinery/power/smes/shuttle/precharged, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/tanto2) +"FQ" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "frontiepod4" + }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/button/door{ - pixel_y = -21; - id = "rustarmory"; - dir = 1 +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/drop4) +"FU" = ( +/obj/structure/platform/wood, +/obj/item/ammo_casing/spent/pistol_steel, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"FZ" = ( +/obj/machinery/door/airlock/external{ + dir = 8 }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"OT" = ( -/obj/structure/bed/double/maint{ - dir = 4 +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 }, -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_one) -"OX" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base) +"Gb" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; dir = 8 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"Pe" = ( -/obj/structure/table/reinforced, -/obj/item/spacecash/bundle/c1000, -/obj/item/spacecash/bundle/c1000{ - pixel_x = -7; - pixel_y = 8 +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 4 }, -/obj/item/spacecash/bundle/c500{ - pixel_x = 7; - pixel_y = 5 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/techfloor{ +/obj/structure/sign/poster/contraband/cybersun{ + pixel_x = 28; + pixel_y = 0 + }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"Gh" = ( +/obj/effect/turf_decal/corner/transparent/red/diagonal, +/obj/effect/abstract/turf_fire/small/magical, +/obj/effect/mapping_helpers/turf/burnt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/hangar/plasteel/dark, +/area/ruin/rockplanet/rust_base/slop) +"Gj" = ( +/obj/effect/turf_decal/siding/thinplating{ dir = 6 }, -/turf/open/floor/plasteel/telecomms_floor, -/area/ruin/rockplanet/rust_base/bridge) -"Pg" = ( -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 5 +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop2) +"Gk" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 }, -/obj/effect/turf_decal/spline/fancy/opaque/syndiered{ - dir = 4 +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Go" = ( +/obj/machinery/power/smes/shuttle/precharged, +/obj/structure/window/reinforced{ + dir = 8 }, -/turf/open/floor/plasteel/patterned/grid, -/area/ruin/rockplanet/rust_base/mechbay) -"Pl" = ( -/obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable{ icon_state = "0-8" }, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop3) +"Gp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, /obj/structure/cable{ - icon_state = "1-8" + icon_state = "4-8" }, -/obj/effect/turf_decal/siding/thinplating, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"Pm" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/armory) -"Pt" = ( -/obj/effect/turf_decal/techfloor{ +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"Gq" = ( +/obj/machinery/power/smes/shuttle/precharged{ dir = 8 }, -/obj/structure/chair/plastic{ +/obj/structure/window/reinforced{ dir = 4 }, -/obj/structure/cable, -/obj/machinery/power/terminal{ +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop2) +"Gs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/hatch{ + dir = 4; + name = "Dormitories" + }, +/obj/machinery/door/firedoor/border_only{ dir = 8 }, -/obj/machinery/light/small/broken/directional/south, -/turf/open/floor/pod, -/area/ruin/rockplanet/rust_base/tanto2) -"Pv" = ( -/obj/machinery/porta_turret/ship/ramzi/light{ - dir = 8; - id = "rustguns"; - turret_respects_id = 0; - turret_flags = 62; - lethal = 1 +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/dorms) +"Gx" = ( +/obj/structure/platform/industrial_alt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/stairs/left{ + dir = 4 }, -/turf/closed/wall/r_wall/syndicate/nodiagonal, /area/ruin/rockplanet/rust_base/mechbay) -"PH" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 +"GJ" = ( +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/hallway) +"GT" = ( +/obj/machinery/power/terminal{ + dir = 8 }, -/obj/structure/chair/handrail{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 4 }, -/turf/open/floor/plasteel/patterned/ridged, -/area/ruin/rockplanet/rust_base/slop) -"PM" = ( -/obj/structure/closet/secure_closet/freezer/fridge/open, -/obj/item/reagent_containers/condiment/saltshaker, -/obj/item/reagent_containers/condiment/saltshaker, -/obj/item/reagent_containers/condiment/saltshaker, -/obj/item/reagent_containers/condiment/saltshaker, -/obj/item/reagent_containers/condiment/saltshaker, -/obj/item/reagent_containers/condiment/saltshaker, -/obj/item/reagent_containers/condiment/saltshaker, -/obj/item/reagent_containers/condiment/saltshaker, -/obj/item/reagent_containers/condiment/saltshaker, -/obj/item/reagent_containers/condiment/saltshaker, -/obj/item/reagent_containers/condiment/saltshaker, -/obj/item/reagent_containers/condiment/saltshaker, -/obj/item/reagent_containers/condiment/saltshaker, -/obj/item/reagent_containers/condiment/saltshaker, -/obj/item/reagent_containers/condiment/saltshaker, -/obj/effect/decal/cleanable/food/salt, -/obj/item/food/meat/slab/goliath, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/item/food/meat/slab/goliath, -/obj/item/food/meat/slab/goliath, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/slop) -"PQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/hallway2) +"GW" = ( +/obj/effect/turf_decal/borderfloor{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ dir = 8 }, -/mob/living/simple_animal/hostile/human/ramzi/ranged/smg, -/turf/open/floor/plasteel/tech, +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle/internals, +/obj/machinery/light/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/hallway) -"PR" = ( -/obj/structure/flora/junglebush, -/turf/open/floor/plating/asteroid/dirt/rockplanet, -/area/ruin/rockplanet/rust_base) -"PV" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 6 +"GY" = ( +/obj/structure/table, +/obj/item/ammo_box/magazine/m10mm_cottonmouth{ + pixel_x = -2; + pixel_y = -7 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"Qc" = ( -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/mechbay) -"Qe" = ( -/obj/machinery/suit_storage_unit/inherit, -/obj/item/clothing/mask/gas/ramzi, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/armory) -"Qg" = ( -/turf/open/floor/engine/hull/rockplanet, +/turf/open/floor/plating/asteroid/rockplanet/lit, /area/ruin/rockplanet/rust_base) -"Qh" = ( +"Ha" = ( /obj/structure/window/plasma/reinforced/plastitanium, /obj/structure/grille, -/obj/machinery/door/poddoor{ - id = "rustengineone" +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "rustbridge" }, /turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_one) -"Qq" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/mead, -/obj/item/reagent_containers/food/drinks/mead, -/turf/open/floor/carpet/red, -/area/ruin/rockplanet/rust_base/dorms) -"Qx" = ( -/obj/structure/table/reinforced, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"Qy" = ( -/turf/template_noop, -/area/template_noop) -"QE" = ( -/turf/closed/mineral/random/rockplanet, -/area/ruin/rockplanet/rust_base) -"QJ" = ( -/obj/effect/turf_decal/industrial/loading, -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/mechbay) -"QS" = ( -/obj/machinery/mech_bay_recharge_port, -/obj/structure/platform/industrial_alt/corner{ +/area/ruin/rockplanet/rust_base/bridge) +"Hb" = ( +/obj/effect/turf_decal/corner/transparent/syndiered/border{ dir = 4 }, -/obj/effect/turf_decal/siding/thinplating, +/obj/machinery/light/directional/south, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/tech, /area/ruin/rockplanet/rust_base/mechbay) -"Ri" = ( -/obj/structure/chair/plastic{ - dir = 4 - }, -/mob/living/simple_animal/hostile/human/ramzi/melee, -/turf/open/floor/carpet/red, -/area/ruin/rockplanet/rust_base/dorms) -"Rk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 4 +"Hc" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "frontiepod1" }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/cryo) -"Rp" = ( /obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/brown/hidden/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/spline/fancy/opaque/syndiered{ - dir = 10 + icon_state = "4-8" }, -/mob/living/simple_animal/hostile/human/ramzi/ranged/smg, -/turf/open/floor/plasteel/patterned/grid, -/area/ruin/rockplanet/rust_base/armory) -"Rr" = ( -/obj/structure/flora/rock/rockplanet, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/drop1) +"Hd" = ( +/obj/structure/flora/grass/rockplanet/dead, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Hg" = ( +/obj/effect/spawner/random/garden/arid/fifty, /turf/open/floor/plating/asteroid/rockplanet/lit, /area/ruin/rockplanet/rust_base) -"Rs" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 5 - }, -/obj/effect/turf_decal/siding/thinplating/dark/corner{ - dir = 8 +"Hh" = ( +/obj/machinery/porta_turret/ruin/ramzi{ + dir = 4 }, -/obj/effect/turf_decal/siding/thinplating/dark/corner{ - dir = 1 +/turf/closed/wall/r_wall, +/area/ruin/rockplanet/rust_base/bridge) +"Hk" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plasteel/patterned/ridged, -/area/ruin/rockplanet/rust_base/slop) -"Ru" = ( -/obj/machinery/suit_storage_unit/inherit, -/obj/item/tank/internals/oxygen/yellow, -/obj/item/clothing/suit/space/syndicate/ramzi, -/obj/item/clothing/head/helmet/space/syndicate/ramzi, -/turf/open/floor/plating, +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop3) +"Ho" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"Hx" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/turf/open/floor/plating/rust, /area/ruin/rockplanet/rust_base/engine_two) -"Rv" = ( +"HI" = ( +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4, +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden/layer2{ - dir = 4 +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base) +"HJ" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 8 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/hallway2) -"Rw" = ( -/obj/effect/spawner/bunk_bed, -/obj/machinery/light/directional/north, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/dorms) -"RA" = ( /obj/structure/cable{ - icon_state = "1-8" + icon_state = "0-8" }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/light/small/directional/south, +/turf/open/floor/concrete/slab_1, +/area/ruin/rockplanet/rust_base) +"HL" = ( +/mob/living/simple_animal/hostile/human/ramzi/ranged/cottonmouth{ + health = 70; + desc = "A deserter from the Gorlex Marauders turned pirate. They warily glance around, a modified machinepistol pointing forward with another hand on a bullet wound." }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/armory) +"HM" = ( +/obj/item/wrench/crescent{ + pixel_x = -6; + pixel_y = 7 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway2) -"RC" = ( -/obj/structure/table/reinforced, -/obj/structure/closet/wall/red/directional/west, -/obj/item/gun/ballistic/shotgun/automatic/bulldog/no_mag, -/obj/item/ammo_box/magazine/m12g_bulldog/empty, -/obj/item/ammo_box/magazine/m12g_bulldog/empty, -/obj/item/ammo_box/magazine/m12g_bulldog/empty, -/turf/open/floor/plasteel/white, -/area/ruin/rockplanet/rust_base/bridge) -"RD" = ( -/obj/machinery/porta_turret/ship/ramzi/light{ +/obj/structure/chair/stool{ dir = 4; - id = "rustguns"; - turret_respects_id = 0; - turret_flags = 62; - lethal = 1 + pixel_x = -11; + pixel_y = 0 }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/armory) -"RN" = ( -/obj/structure/rack, -/obj/effect/turf_decal/siding/thinplating{ +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"HO" = ( +/obj/structure/frame/machine, +/turf/open/floor/engine/hull/reinforced, +/area/ruin/rockplanet/rust_base/engine_two) +"HP" = ( +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/obj/item/clothing/head/helmet/bulletproof/x11/ramzi{ - pixel_x = -5; - pixel_y = 5 +/obj/effect/turf_decal/trimline/opaque/syndiered/corner, +/obj/effect/turf_decal/corner/opaque/syndiered/border{ + dir = 1 }, -/obj/item/clothing/glasses/hud/security/sunglasses/ramzi{ - pixel_x = 2; - pixel_y = -1 +/obj/machinery/light_switch{ + dir = 4; + pixel_x = -21; + pixel_y = -7 }, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"RR" = ( +/area/ruin/rockplanet/rust_base/bridge) +"HR" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"Sf" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/mechbay) -"Sg" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/brown/hidden/layer4{ - dir = 8 - }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"Sp" = ( -/obj/effect/decal/cleanable/vomit/old, -/obj/structure/lattice/catwalk, -/obj/structure/sign/poster/contraband/engis_unite{ - pixel_y = 32 +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop4) +"HS" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"HV" = ( +/obj/item/ammo_casing/spent/pistol_brass, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Ib" = ( +/turf/template_noop, +/area/template_noop) +"Im" = ( +/obj/structure/table, +/turf/open/floor/carpet/green, +/area/ruin/rockplanet/rust_base/slop) +"Iu" = ( +/obj/machinery/door/poddoor{ + id = "rustmech"; + name = "Heavy Infantry Deployment" }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_one) -"Ss" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/armory) -"St" = ( -/obj/structure/crate_shelf, -/obj/effect/turf_decal/road/line/edge/transparent/syndiered{ - dir = 8 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"Sw" = ( -/obj/effect/decal/cleanable/garbage, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"Sy" = ( -/obj/effect/turf_decal/industrial/warning, -/obj/effect/decal/cleanable/oil/slippery, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/mechbay) -"SA" = ( -/obj/effect/turf_decal/industrial/stand_clear{ - dir = 4 + icon_state = "1-2" }, -/turf/open/floor/engine/hull/rockplanet, +/turf/open/floor/plasteel/tech/grid, /area/ruin/rockplanet/rust_base/mechbay) -"SB" = ( -/obj/machinery/door/airlock/hatch, -/turf/open/floor/plating/rust/rockplanet/lit, -/area/ruin/rockplanet/rust_base) -"SL" = ( -/obj/structure/window/plasma/reinforced/plastitanium, -/obj/structure/grille, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/dorms) -"SM" = ( -/obj/structure/platform/industrial_alt{ +"Iv" = ( +/obj/structure/barricade/sandbags, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Iw" = ( +/obj/effect/turf_decal/industrial/warning{ dir = 1 }, -/turf/open/floor/plasteel/stairs/right{ +/mob/living/simple_animal/hostile/human/ramzi/ranged/space/smg, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"Iz" = ( +/obj/machinery/computer/helm{ dir = 4 }, -/area/ruin/rockplanet/rust_base/armory) -"ST" = ( -/obj/structure/flora/junglebush/b, -/turf/open/floor/plating/asteroid/dirt/rockplanet, -/area/ruin/rockplanet/rust_base) -"SV" = ( -/obj/effect/turf_decal/industrial/warning{ - dir = 1 +/obj/machinery/button/door{ + dir = 1; + pixel_x = 0; + pixel_y = -20; + id = "frontiepod1" }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/mechbay) -"SW" = ( -/obj/structure/rack, -/obj/machinery/airalarm/directional/south, -/obj/item/melee/sledgehammer/gorlex, -/obj/effect/turf_decal/siding/thinplating, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"Tc" = ( -/obj/structure/salvageable/server, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable{ - icon_state = "0-2" +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop1) +"IG" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 }, -/obj/effect/turf_decal/techfloor{ - dir = 1 +/obj/effect/turf_decal/borderfloorblack{ + dir = 4 }, -/turf/open/floor/plasteel/telecomms_floor, -/area/ruin/rockplanet/rust_base/bridge) -"Tn" = ( -/obj/effect/turf_decal/siding/thinplating/dark/corner{ +/obj/effect/turf_decal/trimline/opaque/red/line{ dir = 8 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"Tr" = ( -/turf/open/floor/carpet/red, -/area/ruin/rockplanet/rust_base/dorms) -"Tv" = ( -/turf/closed/wall/r_wall/syndicate, -/area/ruin/rockplanet/rust_base/slop) -"TJ" = ( -/obj/structure/dresser, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/hallway2) -"TL" = ( -/obj/structure/salvageable/computer, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/techfloor{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 }, -/turf/open/floor/plasteel/telecomms_floor, -/area/ruin/rockplanet/rust_base/bridge) -"TN" = ( -/obj/effect/turf_decal/industrial/warning{ +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base) +"IM" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 }, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/armory) -"TP" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"TX" = ( -/turf/closed/wall/r_wall, -/area/ruin/rockplanet/rust_base/tanto2) -"TZ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 1; + layer = 2.040 }, -/obj/machinery/door/poddoor{ - dir = 4; - id = "rustwest" +/obj/item/ammo_box/magazine/e40{ + start_empty = 1 }, -/turf/open/floor/engine/hull/rockplanet, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/hallway) -"Uo" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-4" +"IP" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/rockplanet/rust_base/dorms) +"IR" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/trimline/opaque/red/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden/layer2{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold4w/brown/hidden/layer4, -/obj/effect/turf_decal/siding/thinplating/dark/corner, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"Uq" = ( -/obj/structure/chair/bench/red/directional/east, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/hallway) -"Uu" = ( -/turf/closed/wall/concrete, -/area/ruin/rockplanet/rust_base) -"Ux" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/turf/open/floor/plasteel/patterned/grid, -/area/ruin/rockplanet/rust_base/armory) -"UE" = ( -/obj/effect/turf_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/mechbay) -"UG" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/arrows/white{ - dir = 4; - pixel_y = 7 +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"IU" = ( +/obj/machinery/atmospherics/components/unary/tank/oxygen, +/obj/effect/turf_decal/corner_techfloor_gray{ + dir = 10 }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/mechbay) -"UH" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/rockplanet/rust_base/bridge) -"UJ" = ( -/obj/structure/crate_shelf, -/obj/effect/turf_decal/siding/thinplating{ +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/engine_one) +"IV" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 1 }, +/obj/machinery/light/small/directional/west, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"UR" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/thinplating/dark{ +/area/ruin/rockplanet/rust_base/engine_two) +"IW" = ( +/obj/effect/turf_decal/borderfloor/corner{ dir = 8 }, -/turf/open/floor/plasteel/patterned/ridged, -/area/ruin/rockplanet/rust_base/slop) -"US" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/armory) +"IX" = ( +/obj/machinery/hydroponics/soil, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/ruin/rockplanet/rust_base) +"Ja" = ( +/obj/machinery/door/poddoor{ + id = "rustarmory"; + name = "Infantry Deployment" + }, +/turf/open/floor/plasteel/tech/grid, /area/ruin/rockplanet/rust_base/hallway2) -"Vc" = ( -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 9 +"Jd" = ( +/obj/structure/girder/reinforced, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/dorms) +"Jf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/door/airlock/hatch{ + name = "Dormitories" }, -/obj/machinery/power/port_gen/pacman/super, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/structure/cable{ - icon_state = "0-8" + icon_state = "1-2" }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"Vg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/thinplating, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"Vh" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base) +"Jh" = ( +/obj/structure/platform/wood{ + dir = 1 }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 5 +/obj/item/ammo_casing/spent/pistol_steel, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"Jj" = ( +/obj/effect/turf_decal/trimline/opaque/syndiered/line{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/bridge) -"Vq" = ( -/obj/structure/salvageable/server, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/techfloor, -/turf/open/floor/plasteel/telecomms_floor, -/area/ruin/rockplanet/rust_base/bridge) -"Vv" = ( -/obj/machinery/computer/mech_bay_power_console{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 }, -/obj/effect/turf_decal/siding/thinplating, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"Vw" = ( -/obj/effect/turf_decal/siding/thinplating{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/turf/open/floor/plasteel/patterned/ridged, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/bridge) +"Jl" = ( +/obj/effect/mapping_helpers/turf/burnt, +/obj/item/mine/pressure/explosive/fire/live, +/turf/open/floor/plasteel, /area/ruin/rockplanet/rust_base/slop) -"Vx" = ( -/obj/effect/turf_decal/industrial/warning{ +"Jn" = ( +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/obj/structure/chair/office/dark{ +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Ju" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/hallway2) +"Jw" = ( +/obj/structure/flora/grass/rockplanet/dead, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"Jz" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/human/ramzi/ranged/space/shotgun{ - minimum_distance = 0; - retreat_distance = 0 +/obj/machinery/door/airlock/external{ + dir = 8 }, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/armory) -"VK" = ( -/obj/structure/flora/ash/garden/arid, -/turf/open/floor/plating/asteroid/rockplanet/lit, +/turf/open/floor/plasteel/tech/grid, /area/ruin/rockplanet/rust_base) -"VM" = ( -/obj/structure/cable{ - icon_state = "0-2" +"JA" = ( +/obj/effect/decal/cleanable/blood/tracks, +/obj/machinery/door/poddoor/preopen{ + id = "frontbox1" }, -/obj/machinery/porta_turret/ship/ramzi/heavy{ - id = "rustguns"; - lethal = 1; - dir = 4; - turret_respects_id = 0; - turret_flags = 62 +/obj/item/shard{ + pixel_y = -8 }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/mechbay) -"VN" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/tanto2) +"JC" = ( +/obj/structure/fluff/broken_flooring{ + icon_state = "plating"; + dir = 8 }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/dorms) +"JE" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/chair/handrail{ +/obj/structure/sign/warning/nosmoking/burnt{ + pixel_x = 5; + pixel_y = 28 + }, +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/hallway2) +"JJ" = ( +/obj/structure/chair/stool{ dir = 1 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"VX" = ( -/obj/structure/girder/reinforced, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/tanto2) -"VZ" = ( -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 9 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/armory) -"Wa" = ( /obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/porta_turret/ship/ramzi/heavy{ - id = "rustguns"; - lethal = 1; - dir = 4; - turret_respects_id = 0; - turret_flags = 62 + icon_state = "4-8" }, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/armory) -"Wc" = ( -/obj/structure/barricade/sandbags, -/turf/open/floor/plating/asteroid/dirt/rockplanet, +/turf/open/floor/concrete/slab_1, /area/ruin/rockplanet/rust_base) -"We" = ( -/obj/structure/cable{ - icon_state = "2-4" +"JM" = ( +/obj/item/storage/bottles/moonshine/sealed{ + pixel_y = -8 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/obj/item/storage/bottles/moonshine/sealed{ + pixel_y = 3 + }, +/obj/effect/turf_decal/techfloor{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/effect/decal/cleanable/blood/splatter/over_window{ + pixel_x = 28; + pixel_y = -1 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/pod, +/area/ruin/rockplanet/rust_base/tanto2) +"JN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, +/mob/living/simple_animal/hostile/human/ramzi/ranged/sniper/sentry, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"JO" = ( +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop1) +"JQ" = ( +/obj/machinery/washing_machine{ + pixel_x = -7; + pixel_y = 0 + }, +/obj/structure/window{ + dir = 1 + }, /obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 + dir = 1 }, /turf/open/floor/plasteel/patterned, /area/ruin/rockplanet/rust_base/hallway) -"Wj" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/manifold/brown/hidden/layer4, -/obj/effect/turf_decal/spline/fancy/opaque/black{ +"JW" = ( +/obj/structure/chair/comfy/shuttle{ dir = 1 }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop1) +"JX" = ( +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Kk" = ( +/obj/machinery/porta_turret/ruin/ramzi{ + dir = 4 + }, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/mechbay) +"Kl" = ( +/obj/item/shard/plastitanium{ + pixel_x = -11; + pixel_y = -1 + }, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Kw" = ( /obj/effect/turf_decal/siding/thinplating/dark, +/mob/living/simple_animal/hostile/human/ramzi/ranged/smg, +/obj/effect/turf_decal/trimline/opaque/red/line, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/bridge) -"Wl" = ( -/obj/effect/turf_decal/industrial/warning{ - dir = 1 +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"Kz" = ( +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 5; + pixel_y = 3 }, -/obj/structure/platform/industrial_alt{ +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"KA" = ( +/obj/effect/turf_decal/borderfloor/corner{ dir = 8 }, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/armory) -"Wn" = ( -/obj/structure/cable{ - icon_state = "2-4" +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 5 }, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4, /obj/structure/cable{ - icon_state = "1-4" + icon_state = "2-8" + }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"KC" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 }, -/turf/open/floor/plating/asteroid/dirt/rockplanet, -/area/ruin/rockplanet/rust_base) -"Wt" = ( -/obj/item/mine/pressure/explosive/rusty/live, /turf/open/floor/plating/asteroid/rockplanet/lit, -/area/ruin/rockplanet/rust_base) -"Ww" = ( -/obj/structure/closet/secure_closet/armorycage{ - anchored = 1; - name = "ammunition locker"; - locked = 0; - req_access = null +/area/overmap_encounter/planetoid/rockplanet/explored) +"KD" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/item/storage/box/ammo/c45, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"WB" = ( -/obj/structure/chair/plastic{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/slop) -"WK" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 4 +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/mechbay) +"KI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/door/airlock/hatch{ + name = "Washroom" }, -/obj/effect/turf_decal/spline/fancy/opaque/black{ +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ dir = 1 }, -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/bridge) -"WL" = ( -/obj/effect/turf_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/mechbay) -"WS" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/rockplanet/rust_base/armory) -"WV" = ( -/turf/closed/wall/r_wall/syndicate/nodiagonal, -/area/ruin/rockplanet/rust_base/engine_one) -"WW" = ( -/obj/structure/rack, -/obj/item/mine/pressure/explosive/rusty{ - pixel_y = 8 +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/hallway) +"KJ" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 }, -/obj/item/mine/pressure/explosive/rusty, -/obj/effect/turf_decal/siding/thinplating, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"Xa" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/armory) +"KT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/armory) -"Xb" = ( -/obj/machinery/power/shuttle/engine/fire, -/turf/open/floor/engine/hull/rockplanet, -/area/ruin/rockplanet/rust_base/engine_two) -"Xc" = ( -/obj/effect/turf_decal/industrial/warning{ +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/slop) +"KV" = ( +/obj/effect/decal/fakelattice, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"KX" = ( +/obj/structure/chair, +/obj/structure/sign/poster/contraband/punch_shit{ + pixel_x = 0; + pixel_y = 30 + }, +/turf/open/floor/carpet/green, +/area/ruin/rockplanet/rust_base/slop) +"KZ" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/box/red, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_one) +"Ld" = ( +/obj/structure/platform/wood{ dir = 1 }, +/obj/structure/platform/wood, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"Le" = ( +/obj/machinery/power/shuttle/engine/electric, +/turf/open/floor/engine/hull/reinforced, +/area/ruin/rockplanet/rust_base/engine_two) +"Lf" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plasteel/mono, -/area/ruin/rockplanet/rust_base/mechbay) -"Xh" = ( -/obj/machinery/door/poddoor/preopen{ - dir = 4; - id = "rustmech" - }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/mechbay) -"Xm" = ( -/obj/structure/closet, -/obj/item/clothing/under/syndicate/ramzi/overalls, -/obj/item/clothing/under/syndicate/ramzi/overalls, -/obj/item/clothing/under/syndicate/ramzi/overalls, -/obj/item/clothing/under/syndicate/ramzi/overalls, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/shoes/combat, -/obj/machinery/atmospherics/pipe/simple{ - dir = 4 +"Lk" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/closed/wall/concrete, +/area/ruin/rockplanet/rust_base) +"Ll" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 }, -/obj/item/storage/fancy/cigarettes/cigpack_cannabis, -/obj/item/storage/fancy/cigarettes/cigpack_cannabis, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_one) -"Xn" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4, -/obj/effect/turf_decal/siding/thinplating/dark{ +/obj/effect/turf_decal/trimline/opaque/red/line{ dir = 4 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"Xq" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"Lm" = ( +/obj/effect/turf_decal/industrial/warning/dust{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/ruin/rockplanet/rust_base/hallway2) +"Lq" = ( +/obj/effect/turf_decal/corner_steel_grid{ + dir = 5 + }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/mechbay) -"Xs" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/dorms) -"Xu" = ( -/obj/structure/table, -/obj/structure/reagent_dispensers/servingdish, -/obj/effect/decal/cleanable/food/salt, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/hangar/plasteel/dark, -/area/ruin/rockplanet/rust_base/slop) -"Xy" = ( -/obj/structure/toilet, -/obj/item/reagent_containers/condiment/saltshaker, -/obj/effect/decal/cleanable/food/salt, -/mob/living/simple_animal/hostile/human/ramzi/civilian{ - name = "Kaiser 'Shy' Dan" +/area/ruin/rockplanet/rust_base/hallway2) +"Lu" = ( +/obj/structure/table/rolling, +/obj/item/storage/box/stockparts{ + pixel_x = 7; + pixel_y = 8 }, -/turf/open/floor/plating/rust, +/obj/item/screwdriver{ + pixel_x = -5; + pixel_y = 4 + }, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Lw" = ( +/obj/machinery/hydroponics/soil, +/obj/item/food/grown/ash_flora/cactus_fruit, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, /area/ruin/rockplanet/rust_base) -"XA" = ( +"LA" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/trimline/opaque/red/line, +/obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/north, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_two) -"XF" = ( -/obj/structure/bed/double/maint, -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple{ - dir = 4 +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"LD" = ( +/obj/machinery/door/poddoor{ + dir = 4; + id = "rusteastsouth" }, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_one) -"XG" = ( +/obj/structure/catwalk/over, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-8" }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_one) -"XH" = ( -/obj/machinery/light/dim/directional/west, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"XJ" = ( -/obj/machinery/suit_storage_unit/inherit, -/obj/item/clothing/mask/gas/ramzi, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/hallway2) -"Ya" = ( /obj/structure/cable{ - icon_state = "0-8" + icon_state = "1-8" }, -/obj/machinery/power/smes/engineering, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/engine_two) -"Ye" = ( -/obj/structure/cable{ - icon_state = "2-4" +/turf/open/floor/engine/hull/rockplanet, +/area/ruin/rockplanet/rust_base/mechbay) +"LF" = ( +/obj/machinery/power/shuttle/engine/electric{ + dir = 8 }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/airless, +/area/ruin/rockplanet/rust_base/drop1) +"LH" = ( +/obj/structure/girder, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/hallway2) +"LI" = ( +/obj/structure/girder/reinforced, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/tanto2) +"LM" = ( +/obj/machinery/light/small/directional/north, /obj/structure/cable{ icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden/layer2{ +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"LO" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"LQ" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/airalarm/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet/green, +/area/ruin/rockplanet/rust_base/slop) +"Mf" = ( +/obj/effect/turf_decal/industrial/warning, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"Mi" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/slop) +"Ml" = ( +/obj/structure/reagent_dispensers, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/hallway2) +"Ms" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/techfloor{ + dir = 5 + }, +/obj/item/radio/intercom/wideband/table{ + dir = 1; + pixel_y = 0; + pixel_x = -13 + }, +/obj/item/radio/intercom/table{ + dir = 1; + pixel_y = 0; + pixel_x = 5 + }, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/plasteel/telecomms_floor, +/area/ruin/rockplanet/rust_base/bridge) +"My" = ( +/obj/structure/girder, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"Mz" = ( +/obj/machinery/oven, +/obj/effect/turf_decal/corner/transparent/red/diagonal, +/turf/open/floor/hangar/plasteel/dark, +/area/ruin/rockplanet/rust_base/slop) +"MD" = ( +/obj/machinery/cryopod/syndicate{ dir = 8 }, -/obj/machinery/atmospherics/pipe/manifold/brown/hidden/layer4{ +/obj/effect/turf_decal/corner_steel_grid{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/dorms) +"MH" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; dir = 8 }, -/turf/open/floor/plasteel/patterned, -/area/ruin/rockplanet/rust_base/hallway) -"Yh" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/rockplanet/rust_base/cryo) -"Ys" = ( -/obj/machinery/door/airlock/hatch{ - dir = 4; - name = "Dormitories" +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/machinery/airalarm/directional/east, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"MJ" = ( +/obj/structure/closet/secure_closet/armorycage{ + anchored = 1; + name = "ammunition locker"; + locked = 0; + req_access = null + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/item/ammo_box/magazine/m12g_bulldog/drum, +/obj/item/storage/box/ammo/a12g_buckshot, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/armory) +"ML" = ( +/obj/effect/turf_decal/siding/black{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"MO" = ( +/obj/structure/fluff/broken_flooring{ + icon_state = "plating"; dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/dorms) -"Yw" = ( -/obj/machinery/light/dim/directional/west, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/mechbay) -"YA" = ( -/turf/closed/wall/r_wall/syndicate, /area/ruin/rockplanet/rust_base/hallway2) -"YJ" = ( -/obj/machinery/door/airlock/hatch{ - dir = 4; - name = "Captains Quarters" +"MR" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/item/ammo_casing/spent/slug/buck, +/obj/item/mine/pressure/explosive/rusty{ + pixel_x = 8; + pixel_y = -6 + }, +/obj/item/mine/pressure/explosive/rusty{ + pixel_y = 2; + pixel_x = -9 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/obj/item/radio/intercom/directional/east, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/armory) +"MX" = ( +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/hallway2) +"MY" = ( +/obj/structure/table, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"Nc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/hallway2) -"YK" = ( -/obj/structure/table/reinforced, -/obj/item/binoculars{ - pixel_y = 10 +/obj/machinery/door/airlock/hatch{ + name = "Engine"; + dir = 4 }, -/obj/machinery/button/door{ - id = "rustbridge" +/obj/machinery/door/firedoor/border_only{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/techfloor{ +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/engine_two) +"Ne" = ( +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/obj/effect/turf_decal/techfloor{ +/obj/structure/sign/poster/contraband/cybersun_med{ + pixel_x = 0; + pixel_y = -30 + }, +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/hallway2) +"Nh" = ( +/obj/effect/turf_decal/borderfloor, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/armory) +"Nl" = ( +/obj/machinery/button/door{ + pixel_y = -21; + id = "rustsecure2"; dir = 1 }, -/turf/open/floor/plasteel/telecomms_floor, -/area/ruin/rockplanet/rust_base/bridge) -"YL" = ( -/mob/living/simple_animal/hostile/asteroid/goliath/beast/rockplanet, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/machinery/shower{ - pixel_y = 19 +/obj/effect/turf_decal/siding/black/corner{ + dir = 8 }, -/obj/structure/curtain, -/turf/open/floor/plasteel/freezer, -/area/ruin/rockplanet/rust_base/hallway) -"YY" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/hallway2) +"Nm" = ( +/obj/machinery/computer/cryopod/retro/directional/north, +/obj/structure/fluff/broken_flooring{ + icon_state = "plating"; + dir = 4 + }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/dorms) +"Np" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; dir = 8 }, -/obj/effect/turf_decal/spline/fancy/opaque/black{ - dir = 1 +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 4 }, -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/bridge) -"Ze" = ( -/obj/structure/salvageable/computer, -/turf/open/floor/plating/rust, -/area/ruin/rockplanet/rust_base/armory) -"Zm" = ( -/obj/structure/table/reinforced, -/obj/machinery/fax/ruin, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plasteel/white, -/area/ruin/rockplanet/rust_base/bridge) -"ZC" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 5 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 4 }, -/turf/open/floor/plasteel/freezer, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/patterned/grid/dark, /area/ruin/rockplanet/rust_base/hallway) -"ZL" = ( -/obj/structure/platform/industrial_alt/corner{ - dir = 4 +"Nr" = ( +/obj/structure/girder, +/obj/effect/decal/cleanable/blood/squirt{ + icon_state = "trails_2" }, -/turf/open/floor/plating/rust, +/turf/open/floor/plating, /area/ruin/rockplanet/rust_base/armory) -"ZO" = ( -/obj/structure/salvageable/computer, -/obj/effect/turf_decal/siding/thinplating{ +"Ns" = ( +/obj/effect/turf_decal/corner/transparent/syndiered/border{ dir = 1 }, /turf/open/floor/plasteel/tech, -/area/ruin/rockplanet/rust_base/armory) -"ZP" = ( -/obj/structure/lattice/catwalk, -/turf/open/floor/plating, -/area/ruin/rockplanet/rust_base/engine_one) -"ZX" = ( +/area/ruin/rockplanet/rust_base/hallway2) +"Nt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer2{ - dir = 9 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/brown/hidden/layer4{ - dir = 9 +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"NB" = ( +/obj/structure/crate_shelf, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plasteel/mono/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"NC" = ( +/obj/structure/mecha_wreckage/touro, +/obj/effect/decal/cleanable/glass/plasma, +/obj/effect/decal/cleanable/plastic, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/south, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/mechbay) +"ND" = ( +/turf/open/floor/plating/asteroid/rockplanet/cracked/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"NF" = ( +/turf/closed/wall/r_wall/syndicate/nodiagonal, +/area/ruin/rockplanet/rust_base/mechbay) +"NG" = ( +/obj/effect/turf_decal/industrial/warning, +/obj/item/stack/ore/salvage/scrapmetal/five{ + pixel_x = 6; + pixel_y = 6 + }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"NH" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway2) +"NI" = ( +/obj/structure/barricade/sandbags, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"NL" = ( +/obj/structure/platform/industrial_alt{ + dir = 1 + }, +/turf/open/floor/plasteel/stairs/right{ + dir = 4 + }, +/area/ruin/rockplanet/rust_base/hallway2) +"NM" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/emptysandbags{ + pixel_y = 5 + }, +/obj/item/storage/box/emptysandbags, +/obj/structure/railing{ + dir = 6 + }, +/obj/effect/turf_decal/siding/black, +/turf/open/floor/plasteel/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"NN" = ( +/obj/structure/girder/reinforced, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/hallway2) +"NT" = ( +/obj/effect/turf_decal/industrial/warning, +/obj/effect/turf_decal/corner_steel_grid{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/mechbay) +"NU" = ( +/obj/effect/turf_decal/corner/transparent/syndiered/border, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/mechbay) +"NX" = ( +/obj/machinery/door/poddoor/preopen{ + id = "rustsecure2" + }, +/turf/open/floor/plasteel/tech/grid, /area/ruin/rockplanet/rust_base/hallway2) - -(1,1,1) = {" -QE -QE -QE -QE -QE -QE -QE -MN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -QE -QE -QE -QE -QE -QE -QE -QE -QE -QE -QE -QE -QE -Qy -Qy -"} -(2,1,1) = {" -QE -VX -TX -TX -Bd -pX -MN -MN -MN -aN -aN -aN -VK -aN -aN -aN -aN -aN -aN -aN -Rr -aN -aN -QE -QE -QE -QE -QE -QE -QE -QE -QE -QE -QE -QE -QE -QE -QE -Qy -Qy +"NY" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"NZ" = ( +/obj/structure/table, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = -31; + pixel_y = -7 + }, +/obj/item/radio/intercom/directional/west{ + pixel_x = -31; + pixel_y = 12 + }, +/turf/open/floor/carpet/green, +/area/ruin/rockplanet/rust_base/slop) +"Oc" = ( +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/structure/grille, +/obj/machinery/door/poddoor/shutters{ + id = "rustbridge" + }, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/bridge) +"Od" = ( +/turf/open/floor/plasteel/stairs/right{ + dir = 4 + }, +/area/ruin/rockplanet/rust_base/mechbay) +"Oe" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/trimline/opaque/red/line, +/obj/item/ammo_casing/spent/rifle_brass, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"Oh" = ( +/turf/closed/wall/concrete, +/area/ruin/rockplanet/rust_base) +"Oi" = ( +/obj/effect/turf_decal/corner/transparent/syndiered/border{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/hallway2) +"Ok" = ( +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"On" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + dir = 8 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base) +"Or" = ( +/obj/machinery/power/shuttle/engine/electric, +/turf/open/floor/engine/hull/reinforced, +/area/ruin/rockplanet/rust_base/engine_one) +"Ov" = ( +/obj/effect/turf_decal/industrial/warning, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/hallway2) +"Ow" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/item/ammo_casing/spent/rifle_brass, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway) +"OI" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop4) +"ON" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_two) +"OT" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"OU" = ( +/obj/machinery/hydroponics/soil, +/obj/item/food/grown/sweet_potato, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/ruin/rockplanet/rust_base) +"Pa" = ( +/obj/structure/closet/secure_closet/armorycage{ + anchored = 1; + name = "ammunition locker"; + locked = 0; + req_access = null + }, +/obj/item/storage/box/ammo/c45, +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/item/storage/box/ammo/a357, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/hallway2) +"Pc" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"Pd" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/dorms) +"Pf" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/effect/turf_decal/borderfloorblack, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 1; + layer = 2.040 + }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base) +"Pi" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/effect/decal/cleanable/blood/squirt{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway2) +"Pk" = ( +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/drop4) +"Pr" = ( +/obj/effect/decal/cleanable/glass, +/obj/item/shard{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/machinery/power/smes/engineering, +/turf/open/floor/pod, +/area/ruin/rockplanet/rust_base/tanto2) +"Ps" = ( +/obj/effect/turf_decal/borderfloor{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 8 + }, +/obj/structure/closet/firecloset/wall/directional/west, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"PD" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 1 + }, +/obj/item/gun_maint_kit{ + pixel_x = 0; + pixel_y = 8 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/armory) +"PE" = ( +/obj/machinery/door/poddoor{ + id = "rustmech"; + name = "Heavy Infantry Deployment"; + dir = 4 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/mechbay) +"PG" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/item/ammo_casing/spent/rifle_brass, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway) +"PH" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/dorms) +"PJ" = ( +/obj/effect/turf_decal/industrial/warning{ + color = "#912a2a"; + dir = 4 + }, +/obj/item/ammo_casing/spent/slug/buck, +/obj/machinery/airalarm/directional/south, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/armory) +"PM" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway) +"PO" = ( +/turf/closed/mineral/random/rockplanet, +/area/overmap_encounter/planetoid/rockplanet) +"Qc" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/structure/barricade/sandbags, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Qd" = ( +/obj/machinery/mech_bay_recharge_port, +/obj/structure/platform/industrial_alt{ + dir = 8 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/mechbay) +"Qe" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"Qi" = ( +/obj/item/ammo_casing/spent/slug/buck, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Qk" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 1; + layer = 2.040 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"Qq" = ( +/obj/machinery/light/directional/south, +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_one) +"Qx" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/mechbay) +"QA" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/rockplanet/rust_base/engine_one) +"QH" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 5; + pixel_y = 11 + }, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"QI" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/rockplanet/rust_base/bridge) +"QN" = ( +/obj/structure/sink/kitchen{ + dir = 1; + pixel_x = 0; + pixel_y = 0; + name = "sink" + }, +/obj/structure/mirror{ + pixel_x = 0; + pixel_y = -25 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned/brushed, +/area/ruin/rockplanet/rust_base/slop) +"QS" = ( +/obj/effect/decal/cleanable/blood/squirt{ + dir = 9 + }, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"QV" = ( +/obj/machinery/porta_turret/ruin/ramzi/light{ + dir = 5 + }, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/hallway2) +"QX" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/directional/south, +/obj/item/paper_bin, +/obj/item/pen/red, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/mechbay) +"QZ" = ( +/obj/structure/platform/industrial_alt{ + dir = 8 + }, +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/hallway2) +"Rf" = ( +/turf/closed/wall/r_wall, +/area/ruin/rockplanet/rust_base/bridge) +"Rl" = ( +/obj/machinery/power/shuttle/engine/electric{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop3) +"Rm" = ( +/obj/effect/turf_decal/industrial/warning/dust{ + dir = 4 + }, +/turf/open/floor/engine/hull/rockplanet, +/area/ruin/rockplanet/rust_base/mechbay) +"Ro" = ( +/obj/item/stack/ore/salvage/scraptitanium, +/obj/effect/turf_decal/corner_steel_grid{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/hallway2) +"Rw" = ( +/obj/machinery/porta_turret/ruin/ramzi{ + dir = 8 + }, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/engine_two) +"Rx" = ( +/obj/structure/platform/wood{ + dir = 4 + }, +/turf/open/floor/plasteel/stairs/wood/mid, +/area/ruin/rockplanet/rust_base) +"Ry" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/turf/open/floor/concrete/slab_1, +/area/ruin/rockplanet/rust_base) +"RA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/closed/wall/concrete, +/area/overmap_encounter/planetoid/rockplanet/explored) +"RD" = ( +/obj/item/stack/ore/salvage/scrapmetal/five, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"RG" = ( +/obj/structure/bed, +/obj/machinery/light/small/directional/east, +/obj/item/bedsheet/black, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet/red, +/area/ruin/rockplanet/rust_base/dorms) +"RP" = ( +/obj/structure/marker_beacon{ + icon_state = "markerburgundy-on" + }, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/engine_two) +"RR" = ( +/obj/structure/flora/rock/asteroid, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"RS" = ( +/obj/item/stack/ore/salvage/scrapgold{ + pixel_x = 4; + pixel_y = -9 + }, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"RU" = ( +/obj/structure/guncloset, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/armory) +"RV" = ( +/obj/effect/decal/fakelattice, +/turf/open/floor/plating/asteroid/rockplanet/cracked/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"RW" = ( +/obj/structure/platform/wood{ + dir = 1 + }, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"RZ" = ( +/obj/machinery/porta_turret/ruin/ramzi/light{ + dir = 6 + }, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/mechbay) +"Sb" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 1; + layer = 2.040 + }, +/obj/item/ammo_casing/spent/rifle_brass, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"Sg" = ( +/obj/machinery/suit_storage_unit/inherit, +/obj/item/clothing/mask/gas/ramzi, +/obj/effect/turf_decal/siding/thinplating/dark, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/hallway2) +"Sl" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/flame, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 1; + layer = 2.040 + }, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/effect/decal/cleanable/blood/splatter, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/structure/closet/emcloset/wall/directional/south, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"Sp" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/patterned/rockplanet, +/area/ruin/rockplanet/rust_base/drop2) +"Sq" = ( +/mob/living/simple_animal/hostile/human/ramzi/ranged, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"St" = ( +/obj/effect/decal/cleanable/blood{ + icon_state = "floor3" + }, +/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/internals, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Sv" = ( +/obj/effect/turf_decal/siding/black{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"Sw" = ( +/obj/structure/platform/wood, +/turf/open/floor/plasteel/stairs/wood/mid{ + dir = 4 + }, +/area/ruin/rockplanet/rust_base) +"SB" = ( +/obj/effect/turf_decal/industrial/warning/dust{ + dir = 4 + }, +/turf/open/floor/engine/hull/rockplanet, +/area/ruin/rockplanet/rust_base/bridge) +"SC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/guncloset, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/mechbay) +"SF" = ( +/obj/structure/frame/machine, +/turf/open/floor/engine/hull/rockplanet, +/area/ruin/rockplanet/rust_base/tanto2) +"SH" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/syndiered/border{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"SQ" = ( +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/hallway2) +"SW" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/corner/transparent/red/diagonal, +/obj/structure/reagent_dispensers/servingdish, +/obj/structure/extinguisher_cabinet/directional/north{ + pixel_x = -6; + pixel_y = 28 + }, +/obj/machinery/firealarm/directional/north{ + pixel_x = 6; + pixel_y = 32 + }, +/turf/open/floor/hangar/plasteel/dark, +/area/ruin/rockplanet/rust_base/slop) +"SZ" = ( +/obj/structure/platform/wood{ + dir = 8 + }, +/mob/living/simple_animal/hostile/human/ramzi/ranged/cottonmouth, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"Th" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/catwalk/over/plated_catwalk/dark, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base) +"Ti" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/extinguisher_cabinet/directional/north{ + pixel_x = -6; + pixel_y = 28 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_two) +"Tj" = ( +/obj/item/stack/ore/salvage/scraptitanium, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Tl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/door/airlock/hatch{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/hallway) +"Tm" = ( +/obj/item/shovel{ + pixel_x = 8; + pixel_y = 10 + }, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"To" = ( +/obj/machinery/mech_bay_recharge_port{ + dir = 8 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/mechbay) +"Tp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Ts" = ( +/obj/effect/turf_decal/techfloor{ + dir = 8 + }, +/obj/effect/decal/cleanable/glass, +/obj/structure/salvageable/computer, +/obj/item/radio/intercom/wideband/directional/west, +/turf/open/floor/pod, +/area/ruin/rockplanet/rust_base/tanto2) +"Tt" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/cleanable/blood, +/obj/effect/mob_spawn/human/corpse/frontier/internals, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"Tv" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/armory) +"Tx" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/power/smes/shuttle/precharged, +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "rustengine1" + }, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/engine_one) +"TE" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet/green, +/area/ruin/rockplanet/rust_base/slop) +"TF" = ( +/obj/structure/table/reinforced, +/turf/open/floor/wood/ebony, +/area/ruin/rockplanet/rust_base/dorms) +"TH" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/concrete/slab_1, +/area/ruin/rockplanet/rust_base) +"TI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/ebony{ + icon_state = "wood-broken4" + }, +/area/ruin/rockplanet/rust_base/dorms) +"TJ" = ( +/obj/machinery/atmospherics/components/binary/pump/on/layer2, +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/engine_one) +"TK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"TO" = ( +/obj/item/food/grown/sweet_potato, +/obj/item/food/grown/sweet_potato, +/obj/item/food/grown/sweet_potato, +/obj/item/food/grown/sweet_potato, +/obj/item/food/grown/potato, +/obj/item/food/grown/potato, +/obj/item/food/grown/potato, +/obj/item/food/grown/potato, +/obj/structure/crate_shelf, +/obj/structure/closet/crate, +/turf/open/floor/concrete/slab_3/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"TQ" = ( +/obj/effect/turf_decal/borderfloor/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 10 + }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"TR" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/closed/wall/concrete, +/area/ruin/rockplanet/rust_base) +"TT" = ( +/obj/structure/rack, +/obj/item/mecha_ammo/scattershot{ + pixel_y = 5 + }, +/obj/item/mecha_ammo/scattershot{ + pixel_y = 11 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/mechbay) +"TV" = ( +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/hallway2) +"Uq" = ( +/obj/effect/turf_decal/industrial/warning, +/obj/effect/turf_decal/corner_steel_grid{ + dir = 5 + }, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/mechbay) +"Uv" = ( +/obj/structure/marker_beacon{ + icon_state = "markerburgundy-on" + }, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/mechbay) +"Uw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/squirt{ + icon_state = "trails_2" + }, +/turf/open/floor/plasteel/mono, +/area/ruin/rockplanet/rust_base/armory) +"Ux" = ( +/obj/structure/flora/rock/asteroid, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"UB" = ( +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"UD" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/engine_one) +"UE" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/shower{ + pixel_y = 19 + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/rockplanet/rust_base/hallway) +"Vg" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"Vh" = ( +/obj/machinery/power/port_gen/pacman{ + anchored = 1 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"Vi" = ( +/obj/structure/platform/wood/corner{ + dir = 4 + }, +/obj/structure/platform/wood/corner{ + dir = 1 + }, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"Vj" = ( +/obj/effect/mapping_helpers/airlock/welded, +/obj/machinery/door/airlock/hatch{ + name = "Engine"; + dir = 4 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/hallway) +"Vl" = ( +/obj/item/shard/plastitanium{ + pixel_x = 5; + pixel_y = -9 + }, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/wood/ebony, +/area/ruin/rockplanet/rust_base/dorms) +"Vo" = ( +/turf/closed/wall/r_wall/syndicate/nodiagonal, +/area/ruin/rockplanet/rust_base/hallway) +"Vp" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/turf/closed/mineral/random/rockplanet, +/area/overmap_encounter/planetoid/rockplanet) +"Vq" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base) +"Vu" = ( +/obj/effect/turf_decal/corner/transparent/syndiered/border{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"Vw" = ( +/obj/machinery/atmospherics/components/unary/passive_vent/layer4{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Vz" = ( +/obj/structure/grille/broken, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"VA" = ( +/obj/item/stack/ore/salvage/scraptitanium{ + pixel_x = 10; + pixel_y = -15 + }, +/obj/effect/decal/cleanable/blood/squirt, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"VB" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop2) +"VC" = ( +/obj/effect/turf_decal/stairs_wood{ + color = "#55391A"; + dir = 5 + }, +/obj/structure/platform/wood{ + dir = 1 + }, +/obj/structure/platform/wood, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"VH" = ( +/obj/effect/turf_decal/borderfloor, +/obj/effect/turf_decal/siding/black{ + dir = 1 + }, +/obj/structure/closet/secure_closet/armorycage{ + req_access = null + }, +/obj/item/storage/belt/security/webbing/ramzi/alt{ + pixel_x = 5; + pixel_y = -7 + }, +/obj/item/storage/belt/security/webbing/ramzi/alt{ + pixel_x = -6; + pixel_y = -7 + }, +/obj/item/flashlight/seclite{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/item/flashlight/seclite{ + pixel_x = -5; + pixel_y = -1 + }, +/obj/item/storage/pouch/ammo{ + pixel_x = 8; + pixel_y = 5 + }, +/obj/item/storage/pouch/ammo{ + pixel_x = 8; + pixel_y = 0 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/armory) +"VJ" = ( +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/drop3) +"VL" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "frontiepod1" + }, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/drop1) +"VM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/hatch{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/hallway) +"VS" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/cybersun_borg{ + pixel_x = 28; + pixel_y = 0 + }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"VV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_two) +"VW" = ( +/obj/effect/turf_decal/borderfloor{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"VX" = ( +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/ruin/rockplanet/rust_base) +"VY" = ( +/obj/effect/turf_decal/corner/transparent/red/diagonal, +/obj/structure/sink/kitchen{ + dir = 8 + }, +/turf/open/floor/hangar/plasteel/dark, +/area/ruin/rockplanet/rust_base/slop) +"VZ" = ( +/obj/effect/turf_decal/industrial/warning, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"Wa" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/cleanable/blood, +/obj/effect/mob_spawn/human/corpse/frontier/internals, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Wc" = ( +/obj/effect/turf_decal/corner/transparent/syndiered/border{ + dir = 1 + }, +/obj/effect/turf_decal/siding/black{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"Wd" = ( +/obj/structure/platform/wood{ + dir = 8 + }, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"We" = ( +/obj/effect/turf_decal/industrial/warning, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/mechbay) +"Wh" = ( +/obj/machinery/button/door{ + pixel_x = -21; + pixel_y = 0; + dir = 4; + id = "rustbunk2" + }, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"Wl" = ( +/obj/structure/guncloset, +/obj/effect/turf_decal/siding/thinplating/dark, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/hallway2) +"Wq" = ( +/obj/structure/dresser{ + dir = 1 + }, +/turf/open/floor/carpet/red, +/area/ruin/rockplanet/rust_base/dorms) +"Ww" = ( +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Wx" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/machinery/vending/cigarette/syndicate, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway) +"Wy" = ( +/obj/structure/platform/wood/corner{ + dir = 8 + }, +/obj/item/ammo_casing/spent/pistol_steel, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"WG" = ( +/obj/structure/platform/wood{ + dir = 8 + }, +/mob/living/simple_animal/hostile/human/ramzi/ranged, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"WH" = ( +/obj/effect/turf_decal/industrial/warning, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"WI" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway) +"WJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/item/stack/ore/salvage/scrapbluespace{ + pixel_x = 3; + pixel_y = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_two) +"WK" = ( +/obj/machinery/suit_storage_unit/inherit, +/obj/item/clothing/mask/gas/ramzi, +/obj/machinery/light/small/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/mechbay) +"WL" = ( +/obj/effect/turf_decal/borderfloor{ + layer = 2.030; + dir = 8 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"WO" = ( +/obj/effect/turf_decal/arrows/white{ + dir = 4; + pixel_y = -9 + }, +/obj/effect/turf_decal/industrial/warning/dust{ + dir = 4 + }, +/turf/open/floor/engine/hull/rockplanet, +/area/ruin/rockplanet/rust_base/mechbay) +"WR" = ( +/obj/item/stack/ore/salvage/scrapgold{ + pixel_x = -3; + pixel_y = -11 + }, +/turf/open/floor/plating/asteroid/rockplanet/wet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Xa" = ( +/obj/structure/flora/ash/garden/arid, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Xc" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/pod, +/area/ruin/rockplanet/rust_base/tanto2) +"Xd" = ( +/obj/effect/turf_decal/corner/transparent/syndiered/border, +/turf/open/floor/plasteel/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"Xe" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 1; + layer = 2.040 + }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"Xf" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/machinery/photocopier, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/armory) +"Xi" = ( +/obj/item/stack/ore/salvage/scrapmetal/five{ + pixel_x = -13; + pixel_y = 10 + }, +/turf/open/floor/concrete/pavement/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"Xk" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plating/rust, +/area/ruin/rockplanet/rust_base/dorms) +"Xl" = ( +/obj/effect/turf_decal/borderfloor/full, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/rockplanet/rust_base/hallway) +"Xn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/engine_two) +"Xp" = ( +/obj/item/ammo_casing/spent/pistol_brass, +/obj/item/ammo_casing/spent/slug/buck, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"Xq" = ( +/obj/structure/frame/machine, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/hallway2) +"XD" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"XF" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/glass/plastitanium, +/obj/item/shard/plastitanium{ + pixel_x = 13; + pixel_y = 7 + }, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/dorms) +"XJ" = ( +/obj/structure/reagent_dispensers/beerkeg{ + pixel_x = -9; + pixel_y = -2 + }, +/obj/structure/reagent_dispensers/beerkeg{ + pixel_x = 8; + pixel_y = 3 + }, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/hallway) +"XK" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/trimline/opaque/red/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"XL" = ( +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 5; + pixel_y = 11 + }, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"XM" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/machinery/firealarm/directional/south{ + pixel_x = -7; + pixel_y = -32 + }, +/obj/structure/extinguisher_cabinet/directional/south{ + pixel_x = 6; + pixel_y = -28 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/mechbay) +"XO" = ( +/obj/item/emptysandbag{ + pixel_x = 3; + pixel_y = 2 + }, +/turf/open/floor/concrete/slab_1/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"XT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/hallway2) +"Yf" = ( +/obj/structure/window/fulltile, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base) +"Yk" = ( +/obj/structure/flora/stump{ + icon_state = "anchored_rod"; + pixel_y = -3; + name = "rod"; + desc = "A metal rod struck into the ground." + }, +/obj/item/clothing/head/helmet/frontier{ + pixel_x = 0; + pixel_y = 25; + name = "dented frontiersmen reinforced helmet"; + desc = "A reinforced Frontiersmen X-11. The front plate has a small window to let the user see. It also has a noticeable bullet-dent on the forehead." + }, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"Yt" = ( +/obj/effect/turf_decal/corner/transparent/syndiered/border, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"YD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, +/turf/open/floor/concrete/slab_1, +/area/ruin/rockplanet/rust_base) +"YE" = ( +/obj/structure/barricade/sandbags, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/ruin/rockplanet/rust_base) +"YI" = ( +/obj/effect/turf_decal/borderfloorblack{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 8 + }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base) +"YL" = ( +/obj/effect/turf_decal/borderfloor{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"YM" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/directional/south, +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/rockplanet/rust_base/hallway2) +"YP" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/obj/structure/platform/industrial_alt/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"YU" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/machinery/firealarm/directional/north, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/dorms) +"YV" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 1; + layer = 2.040 + }, +/obj/machinery/button/door{ + pixel_y = -21; + id = "rustarmory"; + dir = 1 + }, +/obj/item/ammo_casing/spent/pistol_brass, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway2) +"YX" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/rockplanet/rust_base/engine_two) +"Zd" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/corner/transparent/red/diagonal, +/obj/machinery/reagentgrinder{ + pixel_x = -6; + pixel_y = 14 + }, +/turf/open/floor/hangar/plasteel/dark, +/area/ruin/rockplanet/rust_base/slop) +"Ze" = ( +/obj/machinery/power/smes/shuttle/precharged{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop1) +"Zh" = ( +/mob/living/simple_animal/hostile/human/frontier/ranged/officer/internals, +/obj/machinery/airalarm/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/concrete/slab_1, +/area/ruin/rockplanet/rust_base) +"Zj" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/rockplanet/rust_base/mechbay) +"Zm" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/rockplanet, +/area/ruin/rockplanet/rust_base/drop2) +"Zo" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "frontiepod2" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/drop2) +"Zp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base) +"Zw" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/mono/dark, +/area/ruin/rockplanet/rust_base/slop) +"Zy" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/opaque/syndiered/corner{ + dir = 8 + }, +/obj/effect/turf_decal/corner/opaque/syndiered/border{ + dir = 5 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/rockplanet/rust_base/bridge) +"Zz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/turf/open/floor/engine/hull/reinforced/interior, +/area/ruin/rockplanet/rust_base/hallway) +"ZA" = ( +/obj/machinery/atmospherics/components/unary/passive_vent/layer4{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"ZG" = ( +/obj/effect/decal/cleanable/blood{ + icon_state = "floor5" + }, +/turf/open/floor/plating/asteroid/rockplanet/lit, +/area/overmap_encounter/planetoid/rockplanet/explored) +"ZJ" = ( +/obj/effect/turf_decal/borderfloor{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/opaque/red/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/patterned/grid/dark, +/area/ruin/rockplanet/rust_base/hallway) +"ZM" = ( +/mob/living/simple_animal/hostile/human/ramzi/ranged/space/shotgun{ + minimum_distance = 0; + retreat_distance = 0 + }, +/obj/effect/turf_decal/siding/black{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/rockplanet/rust_base/mechbay) +"ZS" = ( +/obj/item/ammo_casing/spent/slug/buck, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "frontiepod3" + }, +/turf/open/floor/engine/hull/reinforced/rockplanet, +/area/ruin/rockplanet/rust_base/drop3) +"ZX" = ( +/turf/closed/wall, +/area/ruin/rockplanet/rust_base/drop3) +"ZZ" = ( +/obj/machinery/suit_storage_unit/inherit, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/rockplanet/rust_base/armory) + +(1,1,1) = {" +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +ez +ez +ez +ez +ez +bo +ez +ez +ez +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib "} -(3,1,1) = {" -QE -cs -Fk -Af -Pt -TX -TX -TX -MN -MN -MN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -QE -QE -QE -QE -aN -aN -aN -aN -QE -QE -QE -QE -QE -QE -QE -QE -QE -Qy +(2,1,1) = {" +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +ND +ND +Ib +Ib +Ib +Ib +Ib +Ib +Ib +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +"} +(3,1,1) = {" +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +ND +ND +ND +ND +Ib +Ib +Ib +Ib +Ib +Ib +ez +ez +ez +ez +ez +Hd +ez +yU +yU +yU +yU +yU +yU +ez +ez +ez +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib "} (4,1,1) = {" -QE -CM -gw -hW -dL -kt -sZ -DA -MN -MN -MN -aN -aN -aN -aN -aN -aN -aN -VK -aN -aN -aN -aN -aN -aN -aN -aN -aN -Wt -aN -aN -aN -QE -QE -QE -QE -QE -QE -QE -QE +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +ez +ez +ND +ND +ND +ND +ND +Ib +Ib +Ib +Ib +Ib +ez +ez +bo +ez +ez +ez +yU +yU +yU +yU +yU +yU +yU +yU +ez +ez +ez +Ib +Ib +Ib +Ib +Ib +Ib +Ib "} (5,1,1) = {" -QE -VX -TX -KX -hX -TX -TX -TX -MN -MN -aN -BA -BA -aN -BA -BA -aN -aN -BA -BA -aN -BA -BA -aN -aN -Rr -aN -aN -aN -aN -aN -aN -aN -aN -QE -QE -QE -QE -QE -QE +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +ez +ez +ND +ND +ND +ND +ND +Ib +Ib +Ib +Ib +ez +ez +ez +ez +ez +ez +ez +yU +yU +yU +yU +yU +yU +yU +yU +yU +ez +ez +ez +Ib +Ib +Ib +Ib +Ib +Ib "} (6,1,1) = {" -QE -cs -TX -wF -tK -pX -MN -MN -MN -aN -aN -BA -xx -IO -IO -IO -IO -IO -IO -Wn -IO -oF -BA -aN -aN -aN -aN -aN -aN -aN -aN -dD -aN -aN -aN -QE -QE -QE -QE -QE +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +yU +yU +yU +yU +ez +ez +ez +ND +ND +ND +ND +ND +ND +Ib +Ib +Ib +Ib +ez +ez +ez +ez +ez +ez +yU +yU +yU +yU +yU +yU +yU +yU +yU +yU +yU +ez +ez +ez +Ib +Ib +Ib +Ib +Ib "} (7,1,1) = {" -QE -QE -QE -aN -aN -aN -aN -aN -aN -aN -aN -MN -MN -Wc -MN -Wc -MN -MN -Wc -eH -Wc -MN -MN -aN -aN -aN -aN -aN -aN -aN -aN -VK -aN -aN -aN -aN -QE -QE -QE -QE +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +yU +yU +yU +yU +yU +yU +yU +yU +ez +ND +ND +ND +ND +ND +ez +ez +Ib +Ib +Ib +ez +ez +ez +Hd +ez +ez +yU +yU +yU +yU +yU +yU +yU +yU +yU +yU +yU +ez +ez +ez +Ib +Ib +Ib +Ib +Ib "} (8,1,1) = {" -QE -QE -aN -aN -aN -aN -aN -aN -aN -aN -aN -MN -MN -Wc -MN -Wc -MN -MN -Wc -eH -Wc -MN -MN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -Wt -aN -aN -QE -QE -QE +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +yU +yU +yU +yU +yU +yU +yU +yU +yU +ez +ND +ND +ND +ND +ND +ez +ez +ez +Ib +Ib +ez +ez +ez +ez +ez +ez +yU +yU +yU +yU +yU +yU +yU +yU +yU +yU +yU +yU +ez +ez +ez +Ib +Ib +Ib +Ib "} (9,1,1) = {" -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -BA -MN -MN -MN -MN -MN -MN -MN -eH -MN -MN -BA -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -QE -QE +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +yU +yU +yU +yU +yU +yU +yU +yU +yU +ez +ez +ND +ND +ND +ND +ND +ND +ez +ez +ez +Ib +ez +ez +nw +Pk +Pk +nw +ez +yU +yU +yU +yU +yU +yU +yU +yU +yU +yU +yU +yU +ez +ez +ez +ez +Ib +Ib +Ib "} (10,1,1) = {" -aN -aN -aN -aN -aN -MN -Qg -Qg -Qg -Qg -Qg -BA -BA -aN -aN -aN -aN -aN -aN -Fn -aN -BA -BA -aN -aN -Qg -Qg -Qg -Qg -Qg -MN -aN -aN -aN -aN -aN -aN -aN -QE -QE -"} -(11,1,1) = {" -aN -aN -wj -aN -aN -WV +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +yU +yU +yU +yU +yU +yU +yU +yU +yU +ez +ez +ez +ez +ND +ND +ND +ND +ND +ez +ez +ez +ez +ez +ez +ez +nw tE -df -df -df tE -aN -aN -aN -aN -aN -Qg -Qg -Qg -uB -Jw -aN -aN -dD -aN -fj -Xb -Xb -Xb -fj -LT -aN -aN -aN -aN -aN -aN -aN -QE -QE +nw +ez +ez +yU +yU +yU +yU +yU +yU +yU +yU +yU +yU +yU +ez +ez +ez +ez +Ib +Ib +Ib "} -(12,1,1) = {" -aN -aN -aN -aN -aN -Df -Df -Nl -Nl -Kc -tE -aN -aN -aN -aN -mF -Qg -Qg -Qg -rJ -aL -aN -aN -aN -aN -fj -vz -dw -dw +(11,1,1) = {" +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +ez +yU +yU +yU +yU +yU +yU +ez +ez +ez +ez +ez +ez +ez +ND +ND +ND +ND +ND +ez +Eo +ez +Hd +ez +ez +ez +nw Fc Fc -aN -aN -aN -aN -Rr -aN -aN -QE -QE +nw +ez +ez +yU +yU +yU +yU +yU +yU +yU +yU +yU +yU +yU +ez +ez +ez +ez +Ib +Ib +Ib +"} +(12,1,1) = {" +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +ez +ez +yU +yU +yU +yU +ez +ez +ez +ez +Eo +ez +ez +ez +ND +ND +ez +ez +Hd +ez +ez +ez +ez +ez +ez +nw +nw +OI +fY +nw +nw +ez +ez +yU +yU +yU +yU +yU +yU +yU +yU +yU +yU +yU +ez +kb +ez +Ib +Ib +Ib "} (13,1,1) = {" -aN -aN -aN -aN -Qg -tE -dd -XF -Xm -to -tE -aN -aN -aL -aL -aL -eD -TZ -TZ -rY -aL -aL -aL -aN -aN -fj -gg -hR -zX -Ru -fj -Qg -aN -aN -aN -aN -aN -aN -QE -QE +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +ez +ez +ez +yU +yU +yU +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +nw +Cz +HR +ki +ix +nw +ez +ez +yU +yU +ez +ez +ez +ez +ez +ez +yU +yU +yU +ez +ez +ez +Ib +Ib +Ib "} (14,1,1) = {" -aN -aN -aN -Qg -Qg -tE -Sp -ZP -hY -ey -tE -aN -Bg -qj -Hm -qj -II -pL -dt -Lj -qj -tc -qj -Bg -aN -fj -wu -Mq -Nb -BO -fj -Qg -Qg -aN -aN -aN -aN -aN -QE -QE +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +Hd +ez +ez +ez +bm +ez +ez +ez +nw +Dw +iP +iP +uK +nw +ez +ez +ez +ez +ez +ZX +VJ +VJ +ZX +ez +ez +yU +yU +bo +ez +ez +Ib +Ib +Ib "} (15,1,1) = {" -aN -aN -aN -Qg -Qg -Qh -ZP -Br -Ox -vB -tE -aN -aL -rK -xR -qj -bh -sG -qW -CX -qj -tS -Nn -aL -aN -fj -wn -Sw -cI -dZ -Cu -LH -Qg -aN -aN -aN -aN -aN -aN -QE +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +ez +ez +ez +ez +ez +ez +ez +ez +ez +bm +ez +ez +ez +ez +ez +ez +Hd +ez +ez +ez +ez +ez +bm +bm +ez +ez +ez +nw +Cg +CJ +BM +ix +nw +ez +ez +ez +ez +ez +ZX +Rl +Rl +ZX +ez +ez +ez +ez +ez +ez +ez +Ib +Ib +Ib "} (16,1,1) = {" -aN -aN -aN -Qg -Qg -Qh -OT -iD -mP -vB -tE -aN -aL -YL -ZC -qj -Dz -bD -BE -bz -qj -bw -mV -aL -aN -fj -eA -zg -Mw -tG -cl -Qg -Qg -aN -aN -aN -aN -aN -aN -QE +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +bR +ez +ez +ez +ez +ez +ez +ez +ez +bm +ez +Hd +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +bm +bm +ez +ez +ez +nw +FQ +uX +uX +uX +nw +ez +ez +ez +ez +ez +ZX +Go +Go +ZX +ez +ez +ez +ez +ez +ez +ez +ez +Ib +Ib "} (17,1,1) = {" -aN -aN -aN -Qg -Qg -tE -Df -mP -Am -tE -tE -aL -aL -qj -gW -qj -vD -bD -JI -ND -qj -BZ -qj -aL -aL -fj -XA -pY -el -Fc -fj -Qg -Qg -aN -aN -aN -aN -Wt -aN -aN +Ib +Ib +Ib +Ib +Ib +Ib +Ib +bR +bR +ez +ez +ez +ez +ez +ez +ez +bm +bm +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +bm +bm +ez +ez +bm +bP +Al +wP +Xp +gk +Xp +ez +ez +HV +ez +ZX +ZX +vc +zv +ZX +ZX +ez +ez +ez +ez +ez +ez +ez +Ib +Ib "} (18,1,1) = {" -aN -aN -aN -Qg -Qg -tE -ib -XG -jh -Df -qA -nG -os -Ij -Ge +Ib +Ib +Ib +Ib +Ib +Ib +Ib +bR +bR +ez +ez +ez +ez +ez +ez +bm +bm +bm +ez +ez +ez +ez +ez +ez +bm +KV +ez +ez +ez +bm +bm +bm +ez +ez +bm +bm +QS +Do +ez +HV +HV +bh +HV +HV +ez +ZX +xz +fh +cz +EN +ZX +ez +ez +ez +ez +ez +ez +ez +ez +Ib +"} +(19,1,1) = {" +Ib +Ib +Ib +Ib +Ib +Ib +bR +bR +bR +bR +ez +ez +ez +ez +ez +bm +bm +bm +ez +ez +ez +ez +ez +bm +bm +KV +ez +ez +ez +bm +bm +bm +ez +ez +bm +bm +bm +ls +ez +HV +ez +HV +HV +ez +ez +ZX +be +sn +sn +ua +ZX +Eo +ez +Hd +Hd +ez +ez +ez +ez +Ib +"} +(20,1,1) = {" +Ib +Ib +Ib +Ib +Ib +ez +bR +bR +bR +bR +ez +ez +ez +ez +ez +KV +bm +bm +ez ND -vD -bD -Ii -BE +ez +ez +ez +bm +bm +bm +ez +ez +bm +bm +bm +bm +ez +ez +KV +KV +bm +bm +ez +ez +HV +HV +bh +An +ez +ZX +Hk +rz +zd +EN +ZX +ez +ez +ez +ez +ez +Hd +ez +ez +Ib +"} +(21,1,1) = {" +Ib +Ib +Ib +Ib +Ib +ez +bR +bR +bR +bR +ez +ez +ez +ez +bm +bm +Ux +bm +ez +xZ +ez +ez +bm +bm +bm +bm +ez +ez +bm +bm +bm +ez +ez +bm +bm +KV +KV +ez +ez +ez +ez +QH +XL +An +ez +ZX +oC +ZS +ZS +ZS +ZX +ez +ez +ez +ez +ez +ez +ez +ez +Ib +"} +(22,1,1) = {" +Ib +Ib +Ib +Ib +ez +ez +bR +bR +bR +ez +ez +ez +ez +ez +bm +bm +bm +bm +ez ND -zt -Uq -os -GQ -Fc -nH -pW -vY -rh -fj -Qg -Qg -aN -aN -aN -aN -aN -aN -aN +ez +bm +bm +bm +bm +bm +bm +ez +bm +bm +bm +ez +ez +bm +bm +bm +bm +ez +ez +ez +gT +St +Kz +ZG +An +ez +ez +Qi +Qi +Qi +ez +ez +ez +ez +ez +ez +ez +ez +ez +Ib "} -(19,1,1) = {" -aN -aN -aN -aN -Qg -tE -jJ -GE -jw -Df -ri -vg -uO -OX -We -Cz -HH -eq -Tn -us -us -bn -OX +(23,1,1) = {" +Ib +Ib +Ib +Ib +ND +ez +ez +bR +bR +ez +ez +ez +ez +ez +bm +bm +KV +ez +ez +ND +bm +bm +bm +bm +bm +bm +bm +ez +bm +KV +bm +ez +bm +bm +bm +bm +ez +ez +ez +Iv +XO +oa +ez +ez +An +An +ez +go +oT +HS +ez +ez +ez +ez +Xa +ez +ez +ez +ez +ez +"} +(24,1,1) = {" +Ib +Ib +Ib +Ib +ND +ez +ez +bR +ez +ez +Hd +ez +ez +ez +Bf +oW +bm +ND +ND +ND +bm +bm +bm +bm +bm +bm +bm +ND +bm +KV +bm +aV +bm +bm +Tj +bm +ez +ez +ez +Qc +jl +mb +ez +ez +ez +An +An +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +"} +(25,1,1) = {" +Ib +Ib +Ib +ez +ND +ND +ND +ND +ez +ez +ez +ez +ez +ez +bm +bm +bm +ND +ND +ez +bm +bm +bm +KV +bm +bm +bm +ND +bm +KV +KV +bm +bm +bm +bm +bm +ez +ez +ez +dX +VC +mF +ez +zS +ez +Ds +An +ez +ez +ez +bo +ez +Hd +ez +ez +ez +ez +ez +ez +ez +"} +(26,1,1) = {" +Ib +Ib +Ib +ez +ez +ND +ND +ND +ND +ez +kb +ez +ez +ez +bm +bm +bm +RV +RV +Ck +bm +bm +bm +KV +bm +bm +bm +ND +bm +bm +KV +bm +bm +Bf +bm +bm +ez +ez +ez +hd +Ld +FA +ez +ez +Fj +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +Hd +ez +ez +"} +(27,1,1) = {" +Ib +Ib +ez +ez +ez +ND +ND +ND +ND +ez +ez +ez +ez +ez +bm +bm +bm +RV +ND +bm +bm +bm +KV +KV +bm +bm +bm +ND +bm +bm +bm +Bf +bm +bm +oW +bm +ez +ez +ez +hd +Ld +FA +ez +ez +ez +HS +aV +kb +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +"} +(28,1,1) = {" +Ib +Ib +ez +ez +ez +ez +ND +ND +ND +ez +ez +ez +ez +ez +bm +bm +bm +RV +ez +bm +bm +bm +KV +bm +oW +bm +bm +ez +bm +bm +bm +bm +Ux +bm +bm +bm +ez +ez +ez Ok -nz -Fc -FM -EA -Hh -Ya -fj -Qg -aN -aN -aN -aN -aN -aN -dD -aN +Ld +Jn +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +Eo +ez +ez +ez "} -(20,1,1) = {" -aN -aN -dD -aN -Qg -tE -Df -AZ -qt -Id -wc -ge -NY -jI -nO -nS -Ye -KL -Sg -ki -tO -ir -dE -Uo -NQ -wZ +(29,1,1) = {" +Ib +Ib +ez +ez +ez +ez +ez +ND +ND +Hd +ez +ez +ez +ez +bm +bm +bm +RV +ez +bm +bm +bm +bm +bm +bm +bm +ez RR -ca -Vc -Fc +Tp +Tp +Tp +Tp +sV +sV +sV +Tp +Da +Da +bH +os +Ld +JX +bH +Da +bH +Ww +ez +Hd +ez +ez +Eo +ez +Hd +Xa +ez +ez +ez +ez +ez +ez +"} +(30,1,1) = {" +Ib +Ib +Ib +ez +ez +ez +ez +ez +ND +ND +ez +ez +ez +ez +bm +bm +ez +ez +ez +bm +bm +bm +bm +bm +bm +bm +ez fj -Qg -aN -aN -aN -aN -aN -aN -aN -aN +pr +Wd +Wd +Wd +Wd +Wd +Wd +Wd +vW +Wd +WG +Wd +Vi +vW +Wd +SZ +zM +mF +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez "} -(21,1,1) = {" -aN -Wt -aN -aN -Qg -HB -tE -gH -Yh -Yh -Yh -cc -Fv -qx -qx -qx -KS -qx -Ys -qx -qx -qx -tN -yw -xM -xM -xM -xM -Tv -Tv +(31,1,1) = {" +Ib +Ib +Ib +ez +ez +ez +bo +ez +ez +ez +ez +bo +ez +bm +Ck +bm +ez +ez +ez +bm +bm +bm +bm +bm +bm +bm +ND +fj +Rx +fV +fV +fV +fV +fV +fV +fV +fV +ma +ma +ma +fV +ma +zn +Wy +pU +FA +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +"} +(32,1,1) = {" +Ib +Ib +Ib +Ib +ez +ez +ez +ez +ez +ez +ez +ez +ez +bm +bm +bm +ez +ez +bm +bm +Tj +Bf +Ux +bm +bm +bm +ND +Gk do -Qg -aN -aN -aN -aN -aN -aN -aN -VK +Ef +Ef +RA +do +do +Ef +Ef +do +do +do +Ef +Ef +do +do +Jh +FU +FA +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +bo +ez +ez +Ib "} -(22,1,1) = {" -aN -aN -aN -aN -Qg -Qg -Qg -gH -LJ -LJ -Yh -bI -eg -qx -BC -OP -LZ -qx -xq -sy -AF -qx -vV -oZ -xM -WB -PH -WB -Tv -Qg -Qg -Qg -aN -aN -aN -aN -aN -aN -aN -aN +(33,1,1) = {" +Ib +Ib +Ib +Ib +ez +ez +ez +ez +ez +ez +ez +ez +ez +KV +KV +bm +ez +ez +bm +bm +bm +bm +bm +bm +bm +bm +ND +bm +bm +bm +bm +bm +bm +bm +bm +ez +ez +ez +ez +ez +ez +ez +do +RW +pU +mF +ez +ez +bo +ez +Hd +ez +ez +ez +ez +ez +ez +ez +ez +Ib "} -(23,1,1) = {" -aN -aN -aN -aN -aN -Qg -Qg -gH -rq -Rk -Yh -wb -VN -qx -Xs -jG -LO -qx -wS -Ri -yK -SL -yz -uU -xM -FO -vW -Xu -Tv -Qg -Qg -aN -aN -aN -aN -Wt -aN -aN -aN -aN +(34,1,1) = {" +Ib +Ib +ez +ez +ez +kb +ez +ez +ez +Eo +ez +ez +ez +KV +bm +ez +ez +ez +bm +bm +bm +bm +bm +bm +bm +bm +tW +bm +bm +Bf +KV +KV +bm +bm +bm +ez +ez +yU +yU +ez +ez +ez +gj +RW +pU +mF +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +Ib +Ib "} -(24,1,1) = {" -aN -aN -aN -aN -Rr -Qg -Qg -gH -eR -mB -vO -Lf -eh -qx -Rw -OG -NK -qx -Mr -iq -IU -SL -Or -yw -xM -zF -yX -aq -Tv -Qg -Qg -aN -aN -aN -aN -aN -aN -aN -aN -QE +(35,1,1) = {" +Ib +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +bm +KV +bm +ez +ez +xH +bm +bm +bm +bm +bm +Bf +KV +bm +bm +bm +bm +KV +KV +bm +tW +Ck +bm +ez +ez +yU +yU +yU +ez +ez +gj +RW +pU +mF +ez +ez +ez +ez +ez +ez +ez +ez +ez +kb +ez +ez +Ib +Ib "} -(25,1,1) = {" -aN -aN -aN -aN -aN -Qg -Qg -gH -er -me -Yh -tg -Or -qx -Gm -Gm -Ga -LY -Eo -Qq -Tr -SL -tN -FX -lm -xc -Rs -UR -Tv -Qg -Qg -aN -aN -aN -MN -PR -aN -aN -aN -QE +(36,1,1) = {" +Ib +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +vl +bm +bm +bm +ez +ez +ez +bm +bm +bm +oW +bm +bm +KV +Ux +bm +bm +bm +KV +bm +bm +bm +bm +bm +ez +ez +ez +yU +yU +yU +ez +do +RW +pU +FA +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +Ib +Ib "} -(26,1,1) = {" -QE -QE -QE -Wt -aN -aN -Qg -rn -WS -WS -WS -jf -WS -qx -mA -AF -AF -zR -AF -BM -AF -qx -gh -yw -xM -Ax -fU -Vw -Tv -Qg -aN -Rr -aN -aN -MN -aN -aN -aN -QE -QE +(37,1,1) = {" +Ib +ez +ez +ez +ez +ez +ez +ez +Hd +ez +ez +bm +bm +bm +uw +Cx +ez +ez +bm +Ck +bm +bm +bm +bm +KV +Tj +bm +bm +bm +bm +bm +pb +pp +wL +kO +ez +ez +ez +yU +yU +yU +do +do +RW +pU +FA +ez +ez +Xa +ez +ez +Eo +ez +ez +ez +ez +ez +Ib +Ib +Ib "} -(27,1,1) = {" -QE -QE -QE -QE -aN -aN -Qg -rn -Jd -Oi -gF -CQ -Bz -qx -Nr -AM -qq -LY -qu -yK -AF -qx +(38,1,1) = {" +ez +ez +ez +ez +aV +ez +ez +ez +ez +ez +ez +WR +yh +BP jq -zH -xM -PM -wY -aZ -Tv -Qg -aN -aN -aN -aN -aN -aN -aN -aN -QE -QE +jq +BP +KV +bm +bm +bm +bm +bm +bm +bm +Kl +bm +bm +bm +mP +Le +HO +mP +HM +RS +Lu +ez +ez +yU +yU +ny +ny +pr +nl +pU +mF +ez +ez +ez +ez +ez +ez +ez +ez +ez +Ib +Ib +Ib +Ib +Ib "} -(28,1,1) = {" -QE -QE -QE -QE -aN -aN -rn -rn -pz -tI -FY -io -OF -kH -kH -kH -kH -kH -qx -SL -qx -qx +(39,1,1) = {" +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +BP Or -yw -xM -xM -xM -xM -Tv -Tv -aN -aN -aN -aN -aN -aN -dD -aN -QE -QE +vi +BP +kr +Tx +BP +KV +KV +KV +bm +jV +bm +uG +bm +bm +bm +bm +bm +mP +sK +BJ +mP +Le +HO +af +ez +ez +ez +iA +ny +Ag +Rx +nr +pU +mF +ez +ez +ez +ez +ez +aV +ez +ez +ez +Ib +Ib +Ib +Ib +Ib "} -(29,1,1) = {" -QE -QE -QE -aN -aN -aN -rn -WS -lL -JZ -rx -GF -Hp -kH -TJ -Hg -CY -kH -mz -kn -yG -Iz -Xn -qm -mE -MW -OX -rR -qj -aL -aN -aN -aN -aN -aN -aN -aN -aN -QE -QE +(40,1,1) = {" +ez +bo +ez +ez +ez +aV +ez +ez +ez +ez +QA +cN +zF +BP +ew +UD +sf +KV +KV +Dr +zi +DB +aj +Jd +XF +lw +sF +bm +bm +af +vu +Hx +mP +sh +FE +yp +ez +ez +ez +Oh +Bl +Bl +Oh +bi +dk +aM +ez +ez +kb +ez +ez +ez +ez +ez +Ib +Ib +Ib +Ib +Ib +Ib +"} +(41,1,1) = {" +ez +ez +ez +ez +ez +ez +bR +ez +ez +aG +BP +tP +uu +vr +AB +KZ +lw +bs +lw +lw +zi +Vl +TF +kK +xg +lw +zi +zi +wu +zi +kk +BK +it +YX +vu +af +Rw +ez +ez +Oh +NY +Ho +Oh +eZ +eZ +fT +ez +ez +ez +ez +ez +ez +ez +ez +Ib +Ib +Ib +Ib +Ib +Ib "} -(30,1,1) = {" -QE -aN -aN -aN -aN -rn -rn -qI -ML -FZ -ew -CI -tk -kH -XJ -ne -Ff -kH -nM -pn -PQ -Li -ND -ND +(42,1,1) = {" +ez +ez +ez +ez +bR +bR +bR +ez +ez +kx +BP +IU +dW +Ew +lR +uf +lw +sF +sF +lw +fK +hS +TI +jW +eY +Wq +zi +sF +sF +zi +eG +wB +qc +rR +tz +af +Ak +ez +ez +Oh +iE +ce +Oh +Pf +Fz +Oh ND -CA -Ct -PV -bo -aL -aL -aN -aN -aN -aN -aN -aN -QE -QE -QE +ez +ez +ez +ez +ez +ez +ez +ez +Ib +Ib +Ib +Ib +Ib "} -(31,1,1) = {" -aN -aN -VK -aN -aN -rn -rn -nW -fp +(43,1,1) = {" +ez +ez +ez +bR +bR +bR +bR +bR +ez +kx +BP +Fq +Di +ye +qv +Qq +lw +lw +lw +lw +rP +vL +vF +zW +vL +qD +zi +IP +zi +zi +zi +iw +fg +ip +rw +af +Ak +ez +Oh +Oh +fl +bQ +Oh +tR +Ry +Oh +ez +ez +ez +ez +ZA +ez +ez +ez +PO +PO +Ib +Ib +Ib +Ib +"} +(44,1,1) = {" +ez +ez +ez +bR +bR +bR +ez +ez +ez +kx +BP +zA +qa +rA +yl +vy +zi +Nm +JC +qr +hh +yN +Pd +hh +ch +PH +zi +iU +eY +cm +zi +lP +aw +Xn +ak +af +Ak +Oh +Oh +np +qA +dT +Oh +FZ +is +Oh +Oh +fl +fl +Oh +hJ +NI +Oh +PO +PO +PO +PO +Ib +Ib +Ib +"} +(45,1,1) = {" +ez +ez +ez +ez +ez +ez +ez +ez +ez +kx +BP +Fv +zK +TJ +qI +cW +zi MD -Xa -Lp -WS -kH -kH -YJ -kH -kH -kH -vZ -kH -kH -kH -sb -aJ -wB -ri -ND -De -aL -aL -aN -aN -aN -aN -aN -QE -QE -QE -QE +ol +zi +YU +ED +kf +og +Eb +pm +rq +rO +Xk +RG +zi +EM +eW +WJ +tC +af +Ak +Oh +pC +YI +YI +IG +Oh +tR +Vq +Zh +Oh +aK +mA +Oh +JN +Ho +Oh +PO +PO +PO +PO +PO +Ib +Ib "} -(32,1,1) = {" -aN -aN -aN -aN -aN -rn -rn -rn -Da -Da +(46,1,1) = {" +ez +ez +bo +ez +ez +ez +ez +ez +ez +bY +Vo +Vo +Vo +Vo +Vo +qK +zi +zi +zi +zi +zi +zi +Gs +zi +zi +zi +zi +zi +zi +zi +zi +af +af +Nc +af +af +RP +Oh +nK +aB +rZ +Ea +Jf +zZ +HI +nQ +Zp +yK +yK +rX +gb +Ag +Oh +PO +PO +PO +PO +PO +Ib +Ib +"} +(47,1,1) = {" +Ib +ez +ez +ez +ez +ez +ez +ez +ez +ez +Vo +UE +JQ +tY +Vo +ts +Dj +Dj +YL +dZ +xf +Cj +ZJ +tv +sQ +wK +dG +fu +GW +wA +xI +kA +af +Ti +IV +af +bm +Oh +TH +lc de -WS -WS -Hu -jj -aH -Hv -uQ -JV -xm +JJ +Oh +tR +Th +HJ +Oh +sB +BF +Oh +ni +Ho +Oh +PO +PO +PO +PO +PO +Ib +Ib +"} +(48,1,1) = {" +Ib +ez +ez +ez +ez aV -FA +ez +ez +ez +ez +Vo +bT +ek +As +KI +KA +ea +Ll +Ll +WL +av +fc +Np +cj +OT +oA +gG +tM +gG +CG +Pc +tL +qL +ON +VV +af +bm +Oh +Oh +hA +pa +Ci +Oh +eZ +On +Oh +Oh +fl +fl +Oh +hJ +NI +Oh +PO +PO +PO +PO +Ib +Ib +Ib +"} +(49,1,1) = {" +Ib +Ib +ez +ez +ez +ez +ez +ez +ez +ez +Vo +Vo +Vo +Vo +jP +Tl +Vo +Wx +xd +WI +fF +Fb +fE +hW +hW +hW +hW +hW +hW +hW +VM +Vo +af +mP +mP +af +bm +ez +Oh +Oh +fl +mk +Oh +tR +qF +Oh +ez +xH +ez +ez +Vw +ez +PO +PO +PO +PO +PO +Ib +Ib +Ib +"} +(50,1,1) = {" +Ib +Ib +Ib +ez +ez +ez +ez +Hd +ez +ez +ez +bm +lE +BG +ym +zt +dR +dR +dR +dR +dR +sD +dR +dR +wo +wo +VH +oB +aD +hW IR -qC -qC -ah -Xh -Xh -MP -MP -MP -aN -aN -aN -Wt -aN -QE -QE -QE -QE +CY +Xe +ij +bm +bm +ez +ez +ez +Oh +Vh +sH +Oh +sC +YD +Oh +ez +ez +ez +Xa +ez +ez +ez +ez +PO +PO +Ib +Ib +Ib +Ib "} -(33,1,1) = {" -aN -aN -aN -aN -aN -rn -rn -qa -gQ -gQ -Be -XH -BX -CF -Rv -cB -jD -Bh -RA -xA -tm -pi -zQ -qT -Yw -lO -Ek -Ek -Ov -MP -MP -aN -aN -aN -aN -aN -aN -aN -QE -QE +(51,1,1) = {" +Ib +Ib +Ib +Ib +ez +ez +ez +Hd +ez +ez +bm +bm +lE +ra +gE +ql +dR +kv +NZ +LQ +fO +KT +mv +dR +pM +pM +pY +Uw +Fp +Nr +gO +CY +IM +Vo +bm +bm +ez +ez +ez +Oh +LM +pP +Lk +FZ +Jz +TR +ez +ez +ez +ez +ez +ez +ez +ez +PO +PO +Ib +Ib +Ib +Ib "} -(34,1,1) = {" -aN -aN -aN -Wt -aN -rn -rn -Qe -LA -tk -Rp -DB -lW -ZX -Hc -AS -vd -DO -dF -fM -AS +(52,1,1) = {" +Ib +Ib +ez +ez +ez +ez +ez +ez +ez +MX +MX +Xq +lE +iv +iC +ql +dR +KX Im -oW -rD -ms -Kr -MB -Gn -IA -MP -MP -aN -aN -aN -aN -aN -aN -aN -QE -QE +TE +Mi +AU +iQ +dR +ph +li +Nh +bK +Tv +kT +kp +Xl +hq +Vo +lD +lD +Vo +ez +qb +Oh +vJ +vJ +Oh +zJ +Sw +UB +ez +ez +ez +ez +ez +ez +ez +ez +PO +Ib +Ib +Ib +Ib +Ib "} -(35,1,1) = {" -aN -Wt -aN -aN -aN -aN -rn -CJ -OE -tk -ws -tb -BX -bC -Hc -UH -lt -Bs -Bs -mS -UH -Im -US -mh -Qc -dM -nJ -vH -NF -MP -aN -aN -aN -aN -aN -Rr -aN -aN -QE -QE +(53,1,1) = {" +Ib +Ib +ez +ez +bo +ez +ez +ez +ez +LH +kt +rc +lE +gf +sO +Sl +dR +sa +tf +Zw +Zw +fp +dN +dR +xc +HL +IW +tS +KJ +hW +as +PM +oN +Vo +nb +Fk +Vo +ez +hd +Wh +Ag +Ag +pr +nl +pU +mF +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +Ib +Ib +Ib +Ib "} -(36,1,1) = {" -aN -aN -aN -Rr -aN -aN -rn -Ww -OE -Ux -jy -OQ -WS -YA -UH -UH -rN -RC -Zm -WK -UH -UH -YA -qC -bf -Dm -wG -vH -DI -MP -aN -aN -aN -aN -aN -aN -aN -Wt -aN -QE +(54,1,1) = {" +Ib +ez +ez +ez +ez +ez +ez +RD +ez +LH +TV +GT +lE +LA +zf +po +dR +FC +Aw +rC +iK +qX +Jl +dR +vI +bz +es +es +PJ +hW +XK +bM +Qk +Vo +mM +EF +Vo +ez +KC +BH +Ag +Ag +Rx +nr +pU +mF +ez +ez +ez +ez +ez +bR +bR +ez +ez +ez +ez +Ib +Ib +Ib +"} +(55,1,1) = {" +ez +ez +ez +ez +ez +ez +ez +ez +ez +NN +TV +Ju +qh +jj +Pi +rY +dR +SW +Zd +BS +fs +dR +vB +dR +pf +nB +nB +gy +hW +hW +Oe +PG +vU +eM +Zz +aW +Vo +ez +ez +KC +AN +do +do +RW +pU +FA +ez +ez +ez +bR +bR +bR +bR +bR +ez +ez +Ib +Ib +Ib +Ib +"} +(56,1,1) = {" +ez +ez +ez +ez +ez +ez +ez +ez +ez +lE +lE +cg +lE +Kw +DE +rv +dR +BS +Gh +gX +fs +dR +QN +dR +BQ +Br +fB +yb +Xf +hW +lh +Ow +Sb +xL +Vj +Vo +Vo +ez +ez +yU +ez +ez +do +RW +pU +FA +ez +bR +bR +bR +bR +bR +ez +ez +ez +ez +Ib +Ib +Ib +Ib +"} +(57,1,1) = {" +ez +ez +ez +ez +aV +ez +ez +ez +ez +lE +MX +MX +lE +iZ +qH +YV +dR +Mz +rW +VY +ro +dR +gv +dR +MJ +RU +ZZ +MR +PD +hW +xM +pe +Xe +Vo +GJ +GJ +Bh +ez +ez +yU +yU +yU +do +RW +pU +FA +ez +ez +ez +bR +ez +ez +ez +ez +ez +ez +Ib +Ib +Ib +Ib +"} +(58,1,1) = {" +ez +bo +ez +ez +ez +ez +ez +ez +ez +lE +Ml +BL +lE +ya +ya +dt +dR +dR +dR +dR +dR +dR +dR +dR +lE +lE +lE +lE +lE +NF +hk +PE +PE +Vo +iV +XJ +Vo +ez +yU +yU +yU +yU +gj +RW +pU +mF +ez +ez +aV +ez +ez +ez +ez +ez +ez +ez +Ib +Ib +Ib +Ib "} -(37,1,1) = {" -aN -aN -aN -aN -aN -Nx -rn -KU -Jl -kl -VZ -Dr -rn -aN -Bs -TL -cN -jQ -Az -Wj -yY -Bs -aN -MP -Ek -gM -Pg -lg -Qx -MP -Pv -aN -aN -aN -aN -aN -aN -aN -aN -QE +(59,1,1) = {" +ez +ez +ez +ez +ez +ez +ez +ez +ez +lE +lE +lE +lE +yB +CC +MO +Ja +Cs +ml +gn +ml +ml +pi +lQ +Ps +dJ +VW +dJ +TQ +gK +he +xx +Hb +NF +NF +NF +NF +ez +yU +yU +yU +yU +gj +RW +pU +mF +ez +ez +ez +ez +ez +ez +ez +kb +ez +ez +ez +Ib +Ib +Ib "} -(38,1,1) = {" -aN -aN -QE -QE -aN -rn -WS -nK -TP -yJ -SM -Ei -rn -aN -Bs -Tc +(60,1,1) = {" +ez +ez +ez +bR +bR +ez +aV +ez +RD +lE +lE +zx +Wc +ML +Ns +rN +Ja +rr +VS +Cn +MH +Vg +Vg +jt +vZ +bD +nD Gb -BN -od -YY -Vq -Bs -aN -MP -kG -HX -lD -nx -JD -qC -MP -aN -aN -aN -aN -aN -aN -aN -aN -aN +zC +Iu +KD +iz +vh +nX +WK +NF +NF +ez +yU +yU +yU +yU +do +RW +pU +mF +ez +ez +ez +ez +ez +ez +Hd +ez +ez +ez +ez +Ib +Ib +Ib "} -(39,1,1) = {" -QE -QE -QE -QE -aN -rn -Nw -qP +(61,1,1) = {" +ez +ez +bR +bR +bR +bR +bR +ez +ez +ez +lE +Sg +Vu +oh +Oi +lT +lE +tT +tT +tT +tT +mT +NH +aO +fW +Zj +Zj +Zj +Zj +NF +wp +gq +ZM +Xd +an +NF +ez +ez +yU +yU +yU +yU +do +RW +pU +FA +ez +bo +ez +ez +ez +ez +ez +ez +ez +ez +ez +Ib +Ib +Ib +"} +(62,1,1) = {" +ez +ez +bR +bR +bR +bR +bR +ez +ez +ez +zT Wl -EU -ZL -oN -rn -aN -kE -vR -au -av -aK -ke -eM -kE -aN -MP -OJ -Gg -ad -Jx -jP -QS -MP -aN -aN -aN -aN -aN -aN -aN -aN -aN +Vu +oh +cL +jC +xU +NX +Vu +NB +QI +QI +QI +FD +QI +Zj +vA +Yt +bj +bX +he +gq +Sv +Yt +SC +NF +ez +yU +yU +yU +yU +ez +do +RW +pU +FA +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +Ib +Ib +Ib "} -(40,1,1) = {" -QE -QE -QE -aN -aN -rn -tk -Bj -TN +(63,1,1) = {" +Ib +bR +bR +bR +bR +bR +bR +ez +ez +ez +zT +Pa +Vu +ci +cL +mw +ps +gJ +Vu +xj +zl +DM +HP +Jj +iD +NF +Bu +Xd +bj +bX +fR +NU +Sv +Yt +yd +NF +ez +yU +yU +yU +yU +ez +gj +RW +pU +FA +ez +ez +ez Ey -Co -Pl -rn -aN -Bs -JF -YK -Vh -qe -cF -JF -Bs -aN -MP -iz -bE -hL -gT -eZ -Jq -MP -aN -aN -aN -Wt -aN -aN -aN -aN -aN +VL +VL +VL +Hc +Ey +ez +ez +Ib +Ib +Ib "} -(41,1,1) = {" -aN -aN -aN -aN -aN -rn -Ze -kz -oC -gu -pD -SW -rn -aN -aN -kE -Hk -ql -IF -Pe -kE -aN -aN -MP -oX -Sf -Bo -UE -zn -Vv -MP -aN -aN -aN -aN -aN -aN -aN -aN -aN +(64,1,1) = {" +Ib +bR +bR +bR +bR +ez +ez +ez +ez +kb +zT +wJ +AE +Cp +xQ +XT +Nl +zT +zT +zT +zl +dF +hI +jU +ae +NF +NF +Zj +Zj +Ff +he +gq +bx +nU +XM +NF +ez +yU +yU +yU +ez +ez +gj +RW +pU +mF +bo +ez +ez +Ey +JO +lZ +zP +JW +Ey +ez +bo +Ib +Ib +Ib "} -(42,1,1) = {" -aN -Wt -aN -aN -aN -rn -RN -Pm -Vx -tk -pD -WW -rn -aN -aN -Bs -mp -mp -mp -mp -Bs -aN -aN -MP -NP -dh -SV -Sy -es -go -MP -aN -aN -aN -aN -aN -aN -aN -aN -aN +(65,1,1) = {" +Ib +bR +bR +ez +ez +ez +aV +ez +ez +ez +lE +bJ +SH +NM +NL +qy +cG +zT +zT +VX +Rf +Ee +Zy +tD +nR +zl +VX +NF +Zj +Od +hf +Gx +gI +Af +QX +NF +ez +yU +yU +yU +yU +ez +do +RW +pU +mF +ez +ez +ez +Ey +vt +le +le +Iz +Ey +ez +ez +ez +Ib +Ib "} -(43,1,1) = {" -aN -aN -aN -aN -aN -rn -oH -Pm -tk -tk -pD -HU -rn -aN -aN -bj -aN -aN -aN -aN -GP -aN -aN -MP -mR -ev -nL -UE -zn -GY -MP -aN -aN -aN -aN -aN -aN -aN -aN -aN +(66,1,1) = {" +Ib +Ib +ez +ez +ez +ez +ez +ez +Hd +ez +lE +lE +AZ +QZ +YP +lL +Mf +rQ +zT +VX +Rf +Rf +Bo +lB +Rf +Rf +VX +NF +oi +pj +Gp +DY +fP +Qd +NF +NF +ez +ez +yU +yU +yU +ez +do +RW +pU +mF +ez +ez +ez +Ey +JO +za +AT +pO +Ey +ez +ez +ez +Ib +Ib "} -(44,1,1) = {" -aN -aN -aN -Rr -aN -rn -ZO -Pm -tk +(67,1,1) = {" +Ib +Ib +Ib +ez +ez +ez +ez +ez +ez +ez +QV +lE +JE +SQ +rB +ge +Mf +rQ +zT +VX +VX +Oc +Ms +jp +hF +VX +VX +NF +kU +pj +zw +NT +cq +ef +NF +RZ +ez +ez +yU +yU +yU +yU +do +RW +pU +FA +ez +ez +ez +Ey +Ey +gF +AG Ey -mG -JG -rn -aN -rH -aN -aN -aN -aN -aN -aN -aN -aN -MP -UJ -QJ -SV -WL -Xq -Vv -MP -aN -aN -aN -aN -aN -aN -Wt -aN -aN +Ey +ez +ez +ez +Ib +Ib "} -(45,1,1) = {" -aN -aN -aN -aN -aN -rn -tk -ON -ou -Kf -mG -Vg -rn -aN -aN -aN -aN -aN -aN -Rr -aN -aN -aN -MP -UJ -QJ -DF -DZ -NV -md -MP -aN -aN -aN -aN -aN -aN -aN -aN -aN +(68,1,1) = {" +Ib +Ib +Ib +Ib +Ib +ez +ez +ez +ez +ez +MX +lE +eu +EP +nY +mI +jv +zV +lE +VX +VX +Rf +Ha +Ha +zl +VX +fS +NF +uH +pj +zw +We +cq +Ej +NF +uV +ez +ez +ez +yU +yU +yU +gj +RW +pU +FA +ez +ez +ez +ez +Ey +Ze +Ze +Ey +ez +ez +ez +ez +ez +Ib "} -(46,1,1) = {" -aN -VK -aN -aN -aN -rn -kU -Pm -TN +(69,1,1) = {" +Ib +Ib +Ib +Ib +ez +ez +xH +ez +ez +ez +AH +lE +PO +pA +jX +Lq +Ov +YM +lE +VX +fS +Hh +SB +SB +oV +VX +fS +NF +nM +pj +TK +Be +cq +TT +NF +Uv +ez +ez +ez +yU +yU +ez +gj +RW +pU +FA +ez +bo +ez +ez Ey -bA -Ed -rn -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -MP -St -QJ -Xc -WL -Xq -sC -MP -aN -aN -aN -aN -aN -aN -aN -aN -aN +LF +LF +Ey +ez +Hd +ez +ez +ez +Ib "} -(47,1,1) = {" -aN -aN -aN -aN -aN -rn -WS -ky -ky -ky -dv -WS -rn -aN -aN -dD -aN -DV -MN -GG -aN -aN -aN -MP -qC -iM -nu -EV -sm -qC -MP -aN -aN -aN -aN -VK -aN -aN -aN -aN +(70,1,1) = {" +Ib +Ib +Ib +Ib +ez +ez +ez +bo +ez +ez +PO +lE +PO +PO +Vp +Ro +dK +Ne +lE +VX +fS +fS +fS +fS +fS +VX +fS +NF +gS +im +Nt +Uq +cq +TT +NF +ez +ez +ez +ez +yU +ez +ez +do +RW +pU +mF +ez +ez +ez +ez +Ey +wW +wW +Ey +ez +ez +ez +ez +ez +Ib "} -(48,1,1) = {" -aN -aN -aN -aN -ST -RD -iQ -CP -qN -JL -Ss -iQ -RD -aN -aN -aN -aN -GG -Cf -GG -aN -aN -MN -kO -Cd -oL -UG -MG -CK -Cd -kO -MN -aN -aN -aN -aN -aN -aN -aN -aN +(71,1,1) = {" +Ib +Ib +ez +aV +ez +ez +ez +ez +ez +PO +PO +lE +PO +PO +Vp +PO +tI +rQ +lE +VX +fS +fS +fS +fS +fS +fS +fS +NF +gS +Iw +Lf +VZ +Qx +Ej +vo +ez +ez +ez +ez +ez +qb +do +do +RW +pU +mF +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez "} -(49,1,1) = {" -aN -dD -aN -aN -MN -MN -MN -Et -qN -JL -KP -AE -MN -aN -aN -aN -aN -DV -MN -GG -aN -aN -MN -MN -MN -nq -UG -MG -nq -BL -MN -MN -aN -aN -aN -aN -aN -aN -VK -aN +(72,1,1) = {" +Ib +ez +ez +yU +yU +ez +ez +ez +PO +PO +PO +PO +PO +PO +Vp +PO +NG +zT +lE +fS +fS +fS +fS +Jw +fS +fS +fS +NF +NF +cQ +wD +iL +Qx +NC +vo +ez +ez +ez +ez +ez +XD +pr +Wd +nl +pU +mF +ez +ez +ez +ez +ez +ND +ND +ND +ND +aV +ez +ez +ez +ez "} -(50,1,1) = {" -aN -aN -aN -aN -aN -MN -Wc -CP -ph -JL -Wa -Wc -MN -aN -aN -aN -aN -GG -MN -GG -aN -dD -aN -MN -Wc -VM -jp -MG -oL -Wc -MN -aN -aN -aN -aN -aN -aN -aN -aN -aN +(73,1,1) = {" +ez +ez +yU +yU +yU +ez +ez +PO +PO +PO +PO +PO +PO +PO +Vp +PO +Mf +zT +zT +fS +fS +fS +fS +fS +fS +fS +fS +NF +NF +pE +Qe +VZ +Qx +To +vo +ez +ez +ez +ez +Jw +XD +Rx +fV +fV +ax +FA +ez +ez +bo +ez +ez +ND +ND +ND +ND +ez +ez +kb +ez +ez +"} +(74,1,1) = {" +ez +ez +yU +yU +yU +yU +PO +PO +PO +PO +PO +PO +PO +PO +PO +BO +hY +zT +zT +fS +fS +fS +Hg +fS +fS +fS +fS +NF +NF +gi +Qe +WH +cq +NF +NF +fS +fS +fS +fS +fS +pl +Oh +Oh +Oh +Oh +kQ +ez +ez +ez +ez +ez +ND +ND +ND +ez +ez +ez +ez +ez +ez +"} +(75,1,1) = {" +ez +ez +yU +yU +yU +yU +PO +PO +PO +PO +PO +PO +PO +PO +PO +jf +jf +zT +zT +fS +fS +fS +fS +fS +fS +fS +fS +NF +Zj +ih +LD +bd +Zj +NF +fS +fS +fS +fS +fS +fS +fS +fS +fS +Oh +Oh +Oh +ez +ez +ez +ND +ND +ND +ND +ez +bo +ez +ez +ez +ez +ez "} -(51,1,1) = {" -aN -aN -aN -aN -aN -aN -Wc -Wc -zm -zm -Wc -Wc -aN -aN -aN -aN -aN -GG -MN -GG -aN -aN -aN -aN -Wc -Wc -SA -SA -Wc -Wc -aN -aN -aN -aN -aN -aN -BA -BA -aN -aN +(76,1,1) = {" +ez +ez +yU +yU +yU +yU +yU +PO +PO +PO +PO +PO +PO +PO +PO +PO +Fm +Lm +AH +fS +fS +fS +fS +fS +fS +fS +fS +Uv +Zj +Rm +WO +lG +NF +Kk +fS +fS +fS +fS +fS +fS +fS +fS +fS +Oh +Oh +My +ez +ez +ez +ND +ND +ND +ez +ez +ez +ez +ez +ez +ez +ez "} -(52,1,1) = {" -aN -Uu -Uu -Uu -aN -VK -aN -MN -MN -MN -MN -aN -aN -aN -aN -aN -aN -GG -MN -GG -aN -aN -aN -aN -aN -MN -MN -MN -MN -aN -aN -aN -aN -Uu -Uu -Uu -aN -BA -aN -aN +(77,1,1) = {" +ez +yU +yU +yU +yU +yU +yU +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +fS +fS +Jw +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +Oh +My +Vz +ez +ez +ez +ND +ND +ND +ez +bo +ez +ez +Hd +ez +ez +ez "} -(53,1,1) = {" -aN -Uu -Mu -SB -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -VK -aN -rH -aN -aN -aN -aN -aN -aN -aN -aN -aN -Uu -Xy -ru -Gz -aN -aN -aN +(78,1,1) = {" +ez +yU +yU +yU +yU +yU +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +on +on +on +on +fS +fS +fS +fS +fS +fS +fS +fS +fS +Jw +fS +fS +ny +fS +fS +nH +nH +fS +fS +fS +fS +fS +fS +My +fS +ez +ez +ez +ND +ez +ND +ez +ez +ez +ez +ez +ez +ez +ez "} -(54,1,1) = {" -aN -Uu -Uu -Uu -aN -BA -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -MN -MN -MN -aN -aN -aN -BA -aN -Uu -Uu -Uu -aN -BA -aN -aN +(79,1,1) = {" +ez +ez +yU +yU +yU +yU +ez +PO +PO +PO +PO +PO +PO +PO +PO +PO +fS +fS +on +on +on +on +fS +fS +on +on +on +fS +fS +fS +fS +fS +ny +ny +ny +on +on +nH +on +fS +Jw +fS +Tt +db +VA +db +HS +ez +ez +ND +ez +ez +ez +ez +ez +ez +ez +ez +ez +Ib "} -(55,1,1) = {" -aN -aN -aN -aN -BA -BA -aN -aN -aN -aN -aN -BA -BA -aN -aN -aN -aN -aN -aN -aN -aN -BA -BA -aN -MN -PR -MN -aN -Rr -aN -aN -BA -BA -aN -aN -aN -BA -BA -aN -aN +(80,1,1) = {" +ez +ez +yU +yU +yU +yU +yU +PO +PO +PO +PO +PO +PO +PO +PO +PO +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +on +on +on +fS +fS +ny +ny +ny +fS +on +on +nH +on +fS +fS +fS +fS +tq +Xi +fS +ez +ez +ez +ez +ez +xi +yg +yg +yg +Zo +xi +ez +ez +Ib "} -(56,1,1) = {" -aN -wj -aN -aN -aN -aN -aN -aN -VK -aN -aN -BA -MN -MN -kM -MN -MN -MN -MN -MN -MN -MN -BA -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +(81,1,1) = {" +ez +ez +ez +yU +yU +yU +yU +PO +PO +PO +on +PO +PO +fS +PO +fS +Jw +fS +fS +Ag +Ag +Ag +Sq +Ag +fS +fS +fS +on +on +on +on +ny +ny +ny +ka +fS +fS +on +on +fS +fS +fS +fS +fS +jn +fS +Wa +oT +oT +HS +ez +xi +la +az +Gj +Sp +xi +ez +ez +Ib "} -(57,1,1) = {" -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -MN -MN -Wc -MN -Wc -MN -MN -Wc -MN -Wc -MN -MN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -QE +(82,1,1) = {" +ez +bo +ez +yU +yU +yU +PO +PO +PO +PO +on +on +PO +fS +fS +ny +fS +fS +Oh +Oh +Ag +Ag +Ag +Oh +Oh +fS +fS +fS +fS +fS +fS +fS +ny +ny +ny +fS +fS +nH +on +fS +fS +fS +fS +fS +My +fS +ez +ez +ez +ez +ez +xi +hw +tU +tU +Ev +xi +ez +Ib +Ib +"} +(83,1,1) = {" +ez +ez +ez +yU +yU +yU +yU +PO +PO +fS +on +on +fS +fS +ny +ny +ny +fS +Yf +IX +VX +VX +VX +OU +Yf +fS +fS +fS +fS +fS +fS +fS +ny +ny +ny +fS +ai +nH +fS +fS +fS +fS +fS +fS +Oh +fS +ez +ez +ez +aV +ez +xi +la +Zm +VB +xB +xi +ez +Ib +Ib +"} +(84,1,1) = {" +ez +ez +ez +ez +yU +yU +yU +ez +PO +fS +nH +on +ny +ny +ny +ny +ny +fS +Yf +IX +VX +VX +VX +OU +Yf +fS +fS +fS +fS +fS +fS +Hg +ny +ny +BZ +fS +nH +nH +fS +fS +Jw +fS +fS +Oh +Oh +Oh +ez +ez +ez +ez +ez +xi +xi +qz +va +xi +xi +ez +Ib +Ib +"} +(85,1,1) = {" +ez +ez +ez +ez +yU +yU +ez +ez +fS +fS +nH +on +ny +ny +ny +ny +fS +fS +Yf +eA +VX +eQ +VX +eA +Yf +fS +fS +fS +fS +fS +fS +fS +fS +ny +ny +ka +fS +fS +fS +fS +fS +fS +fS +Oh +Oh +Oh +ez +ez +ez +ez +ez +ez +xi +Gq +Gq +xi +ez +ez +Ib +Ib +"} +(86,1,1) = {" +ez +ez +ez +ez +ez +ez +ez +ez +fS +fS +YE +nH +ny +ny +ny +ny +fS +fS +Yf +eA +VX +uN +VX +eA +Yf +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +PO +PO +PO +PO +fS +Oh +Oh +Oh +ez +ez +ez +ez +ez +ez +xi +tr +tr +xi +ez +ez +Ib +Ib +"} +(87,1,1) = {" +ez +ez +Hd +ez +ez +ez +ez +ez +fS +fS +fS +fS +fS +ny +ny +ny +fS +fS +Yf +Lw +VX +wF +VX +OU +Yf +fS +fS +fS +fS +Hg +fS +fS +fS +fS +fS +fS +fS +PO +PO +PO +PO +PO +PO +PO +Oh +ez +ez +ez +bo +ez +ez +ez +xi +tG +tG +xi +ez +ez +Ib +Ib "} -(58,1,1) = {" -aN -aN -aN -aN -aN -aN -aN -QE -aN -aN -aN -MN -MN -Wc -FE -Wc -MN -MN -Wc -rc -Wc -MN -MN -aN -aN -aN -aN -aN -aN -aN -aN -aN -QE -QE -QE -QE -aN -aN -QE -QE +(88,1,1) = {" +ez +ez +ez +ez +ez +ez +ez +ez +My +fS +fS +fS +fS +oK +ny +fS +fS +fS +Yf +IX +VX +VX +VX +IX +Yf +fS +fS +fS +fS +fS +fS +fS +fS +fS +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +My +ez +ez +ez +ez +ez +Hd +ez +ez +ez +ez +ez +ez +ez +Ib +Ib "} -(59,1,1) = {" -aN -aN -aN -aN -aN -aN -QE -QE -QE -QE -aN -BA -MN -MN -MN -MN -MN -MN -MN -MN -MN -MN -BA -aN -aN -aN -aN -aN -aN -QE -QE -QE -QE -QE -QE -QE -aN -QE -QE -QE +(89,1,1) = {" +Ib +ez +ez +bo +ez +Hd +ez +ez +My +fS +fS +fS +MY +GY +DT +MY +fS +fS +Oh +Oh +TO +Eq +ds +Oh +Oh +fS +fS +fS +fS +fS +fS +fS +fS +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +mN +My +bm +Ck +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +Ib "} -(60,1,1) = {" -aN -aN -Wt -aN -aN -aN -aN -aN -QE -QE -aN -BA -BA -aN -BA -BA -aN -aN -BA -BA -aN -BA -BA -aN -aN -aN -aN -aN -aN -aN -QE -QE -aN -aN -aN -aN -aN -QE -QE -Qy +(90,1,1) = {" +Ib +ez +ez +ez +ez +ez +ez +ez +My +fS +fS +YE +sS +LO +LO +CB +YE +fS +fS +Oh +Oh +Oh +Oh +Oh +fS +fS +fS +fS +fS +fS +fS +fS +PO +PO +PO +PO +PO +PO +PO +LI +ty +ty +FL +SF +Ck +bm +bm +bm +bm +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +Ib "} -(61,1,1) = {" -Qy -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -Wt -aN -QE -QE -QE -QE -aN -dD -aN -aN -aN -QE -Qy -Qy +(91,1,1) = {" +Ib +Ib +ez +ez +ez +ez +ez +ez +My +fS +fS +YE +fS +on +fS +on +YE +fS +fS +fS +fS +fS +fS +fS +fS +fS +Hg +fS +fS +fS +PO +PO +PO +PO +PO +PO +PO +PO +PO +lm +Ts +cM +tn +ty +ty +ty +bm +bm +bm +Ck +bm +bm +ez +ez +ez +ez +bo +ez +ez +ez "} -(62,1,1) = {" -Qy -Qy -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -QE -QE -QE -QE -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -QE -QE -aN -aN -aN -aN -aN -aN -aN -Qy -Qy -Qy +(92,1,1) = {" +Ib +Ib +ez +ez +ez +ez +ez +ez +My +Oh +fS +YE +on +on +on +on +nH +fS +fS +Hg +fS +fS +fS +Tm +fS +fS +fS +fS +fS +fS +PO +PO +PO +PO +PO +PO +PO +PO +PO +eP +Pr +CH +Xc +JA +yC +aN +bm +bm +bm +bm +bm +bm +bm +bm +bm +ez +ez +ez +ez +ez "} -(63,1,1) = {" -Qy -Qy -Qy -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -QE -QE -aN -aN -aN -aN -aN -aN -aN -dD -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -Wt -aN -aN -Qy -Qy -Qy -Qy +(93,1,1) = {" +Ib +Ib +ez +ez +ez +ez +ez +ez +My +Oh +fS +fS +fS +on +on +on +on +on +fS +fS +fS +ny +ny +Fo +ny +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +LI +ty +JM +ur +ty +ty +ty +bm +Ux +bm +bm +bm +bm +bm +bm +ez +ez +ez +ez +ez +Ib "} -(64,1,1) = {" -Qy -Qy -Qy -Qy -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -Qy -Qy -Qy -Qy -Qy +(94,1,1) = {" +Ib +Ib +ez +ez +ez +ez +ez +ez +Oh +Oh +fS +YE +fS +fS +fS +fS +YE +fS +fS +fS +ny +nF +AC +dC +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +lm +ty +wX +wh +zs +bm +bm +bm +bm +bm +bm +bm +bm +bm +ez +ez +ez +ez +ez +Ib +Ib "} -(65,1,1) = {" -Qy -Qy -Qy -Qy -Qy -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -Qy -Qy -Qy -Qy -Qy -Qy +(95,1,1) = {" +Ib +Ib +Ib +ez +ez +Hd +bo +ez +Oh +Oh +fS +YE +fS +fS +fS +ah +YE +fS +fS +ny +ve +ny +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +Ux +bm +ez +ez +ez +RD +bm +bm +bm +ez +ez +ez +ez +ez +ez +Ib +Ib +Ib +Ib +"} +(96,1,1) = {" +Ib +Ib +Ib +ez +ez +ez +ez +ez +Oh +Oh +Oh +YE +fS +Yk +fS +fS +YE +Oh +Oh +Oh +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +AF +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +Ib +Ib +Ib +Ib +Ib +"} +(97,1,1) = {" +Ib +Ib +Ib +ez +ez +ez +ez +ez +Oh +Oh +Oh +Oh +Oh +Oh +Oh +Oh +Oh +Oh +Oh +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +ez +Ib +Ib +Ib +Ib +Ib +Ib +"} +(98,1,1) = {" +Ib +Ib +Ib +Ib +ez +ez +bo +ez +ez +Oh +Oh +Oh +Oh +Oh +Oh +Oh +Oh +Oh +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +Ib +Ib +PO +PO +PO +PO +PO +PO +PO +PO +PO +Ib +Ib +ez +ez +bo +ez +ez +ez +Hd +ez +ez +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +"} +(99,1,1) = {" +Ib +Ib +Ib +Ib +Ib +ez +ez +ez +Hd +ez +ez +ez +ez +ez +ez +ez +ez +PO +PO +PO +Ib +Ib +PO +PO +PO +PO +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +PO +PO +PO +Ib +Ib +Ib +Ib +ez +ez +ez +ez +ez +ez +ez +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +"} +(100,1,1) = {" +Ib +Ib +Ib +Ib +Ib +Ib +Ib +ez +ez +ez +ez +bo +ez +ez +ez +ez +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +ez +ez +ez +ez +ez +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib +Ib "} diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_saloon.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_saloon.dmm index 095b961ace0..848707c4b49 100644 --- a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_saloon.dmm +++ b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_saloon.dmm @@ -1026,13 +1026,7 @@ /obj/structure/closet/cabinet, /obj/effect/spawner/random/maintenance/two, /obj/effect/decal/cleanable/dirt, -/obj/item/gun/energy/plasmacutter{ - icon_state = "pulse_carbine"; - name = "pulse rifle"; - desc = "A supposedly heavy-duty, multifaceted energy rifle. The barrel looks off and the casing seems to be made of plastic"; - item_state = "pulse"; - icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi' - }, +/obj/item/plasmacutter, /turf/open/floor/wood, /area/ruin/whitesands/saloon) "EY" = ( diff --git a/_maps/RandomRuins/SpaceRuins/spacemall.dmm b/_maps/RandomRuins/SpaceRuins/spacemall.dmm index f2582aea147..65f58a95514 100644 --- a/_maps/RandomRuins/SpaceRuins/spacemall.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacemall.dmm @@ -10039,7 +10039,7 @@ /turf/open/floor/plasteel/white, /area/ruin/space/has_grav/spacemall/dorms) "Me" = ( -/obj/machinery/computer/apc_control, +/obj/machinery/computer/monitor, /obj/structure/spider/stickyweb, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/spacemall/maint) diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_recyclebay.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_recyclebay.dmm index 7efd708ff0d..03340e36a53 100644 --- a/_maps/RandomRuins/WasteRuins/wasteplanet_recyclebay.dmm +++ b/_maps/RandomRuins/WasteRuins/wasteplanet_recyclebay.dmm @@ -4026,8 +4026,8 @@ "Bw" = ( /obj/structure/closet/toolcloset/empty, /obj/effect/turf_decal/industrial/outline/yellow, -/obj/item/gun/energy/plasmacutter, -/obj/item/gun/energy/plasmacutter, +/obj/item/plasmacutter, +/obj/item/plasmacutter, /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/gloves/color/yellow, diff --git a/_maps/configs/minutemen_lyra.json b/_maps/configs/minutemen_lyra.json index 927b6983275..3b57bfc0927 100644 --- a/_maps/configs/minutemen_lyra.json +++ b/_maps/configs/minutemen_lyra.json @@ -2,6 +2,7 @@ "$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json", "map_name": "Lyra-class Relief Cruiser", "prefix": "CLSV", + "manufacturer": "Lanchester Shipyards", "namelists": ["GENERAL", "CLIP MINUTEMEN", "BEASTS"], "description": "The Lyra-class traces its origins back to the first frontiersmen war, where civilian hulls were taken by Minutemen forces and converted into relief vessels. These various ships were kept in service with dubious performance and inconsistent upkeep up until FS-472, when the Lyra-class was officially proposed and set into production to fufill the roles of these ships. Initially unpopular and almost decommissioned due to lack of use in a calmer frontier, these vessels found a major resurgence after the ICW, with humanitarian issues becoming a much larger concern to the Colonial League. Lyra-class vessels often find themselves assisting in rebuilding efforts of affected planets, or helping the occasional frontier vessel.", "tags": ["Medical", "Generalist", "Engineering", "RP Focus"], diff --git a/_maps/configs/minutemen_typhon.json b/_maps/configs/minutemen_typhon.json index fd1c1e51340..11075b6d129 100644 --- a/_maps/configs/minutemen_typhon.json +++ b/_maps/configs/minutemen_typhon.json @@ -44,5 +44,5 @@ "slots": 1 } }, - "enabled": true + "enabled": false } diff --git a/_maps/configs/srm_sojourner.json b/_maps/configs/srm_sojourner.json index 5af9d96a319..a548b004ae4 100644 --- a/_maps/configs/srm_sojourner.json +++ b/_maps/configs/srm_sojourner.json @@ -3,6 +3,7 @@ "map_name": "Sojourner-class Homesteader", "faction": "/datum/faction/srm", "prefix": "SRSV", + "manufacturer": "Ihejirika Civ. Manufacturing", "namelists": [ "SAINT-ROUMAIN", "BEASTS" diff --git a/_maps/shuttles/independent/independent_mudskipper.dmm b/_maps/shuttles/independent/independent_mudskipper.dmm index f2b643f05ef..10d2a53d6a5 100644 --- a/_maps/shuttles/independent/independent_mudskipper.dmm +++ b/_maps/shuttles/independent/independent_mudskipper.dmm @@ -386,7 +386,7 @@ /obj/item/multitool, /obj/item/stack/marker_beacon/thirty, /obj/item/gear_pack/anglegrinder, -/obj/item/gun/energy/plasmacutter, +/obj/item/plasmacutter, /obj/item/flashlight/seclite, /obj/item/flashlight/seclite, /obj/item/melee/knife/survival, diff --git a/_maps/shuttles/independent/independent_sunskipper.dmm b/_maps/shuttles/independent/independent_sunskipper.dmm index 91ed2e0792e..323f50eadc0 100644 --- a/_maps/shuttles/independent/independent_sunskipper.dmm +++ b/_maps/shuttles/independent/independent_sunskipper.dmm @@ -2759,7 +2759,7 @@ /turf/open/floor/wood/walnut, /area/ship/crew/canteen) "FK" = ( -/obj/structure/sign/poster/official/work_for_a_future{ +/obj/structure/sign/poster/contraband/diet_guide{ pixel_y = 30 }, /turf/open/floor/plasteel/mono/white, diff --git a/_maps/shuttles/inteq/inteq_vaquero.dmm b/_maps/shuttles/inteq/inteq_vaquero.dmm index 9fcf51ef956..0102c26ea41 100644 --- a/_maps/shuttles/inteq/inteq_vaquero.dmm +++ b/_maps/shuttles/inteq/inteq_vaquero.dmm @@ -1902,6 +1902,20 @@ "qe" = ( /turf/open/floor/carpet/black, /area/ship/hallway/starboard) +"qt" = ( +/obj/structure/table, +/obj/item/plate, +/obj/item/reagent_containers/food/drinks/sillycup{ + pixel_y = 10; + pixel_x = -8 + }, +/obj/item/food/ration/pack/grape_beverage{ + pixel_y = 10; + pixel_x = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) "qy" = ( /obj/effect/turf_decal/trimline/opaque/yellow/filled/warning{ dir = 1 @@ -2695,6 +2709,72 @@ }, /turf/open/floor/plasteel/patterned, /area/ship/cargo) +"wQ" = ( +/obj/structure/closet/secure_closet/armorycage{ + anchored = 1; + can_be_unanchored = 1; + name = "equipment locker"; + req_access = null; + req_access_txt = "1" + }, +/obj/effect/turf_decal/trimline/opaque/yellow/line, +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/item/storage/box/teargas{ + pixel_y = -4; + pixel_x = 8 + }, +/obj/item/storage/box/zipties{ + pixel_y = -4; + pixel_x = -7 + }, +/obj/item/reagent_containers/spray/pepper{ + pixel_y = 10; + pixel_x = -11 + }, +/obj/item/reagent_containers/spray/pepper{ + pixel_y = 10; + pixel_x = -3 + }, +/obj/item/storage/pouch/ammo{ + pixel_y = -10 + }, +/obj/item/storage/pouch/ammo{ + pixel_y = -10 + }, +/obj/item/melee/knife/survival{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/melee/knife/survival{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/melee/knife/survival{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/attachment/rail_light{ + pixel_x = 6; + pixel_y = -4 + }, +/obj/item/attachment/rail_light{ + pixel_x = 6; + pixel_y = -4 + }, +/obj/item/attachment/rail_light{ + pixel_x = 6; + pixel_y = -4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/shield/heavy, +/turf/open/floor/plasteel/tech/grid, +/area/ship/security) "wU" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -3488,72 +3568,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/tech/grid, /area/ship/security) -"Db" = ( -/obj/structure/closet/secure_closet/armorycage{ - anchored = 1; - can_be_unanchored = 1; - name = "equipment locker"; - req_access = null; - req_access_txt = "1" - }, -/obj/effect/turf_decal/trimline/opaque/yellow/line, -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/item/storage/box/teargas{ - pixel_y = -4; - pixel_x = 8 - }, -/obj/item/storage/box/zipties{ - pixel_y = -4; - pixel_x = -7 - }, -/obj/item/reagent_containers/spray/pepper{ - pixel_y = 10; - pixel_x = -11 - }, -/obj/item/reagent_containers/spray/pepper{ - pixel_y = 10; - pixel_x = -3 - }, -/obj/item/storage/pouch/ammo{ - pixel_y = -10 - }, -/obj/item/storage/pouch/ammo{ - pixel_y = -10 - }, -/obj/item/melee/knife/survival{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/item/melee/knife/survival{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/item/melee/knife/survival{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/item/attachment/rail_light{ - pixel_x = 6; - pixel_y = -4 - }, -/obj/item/attachment/rail_light{ - pixel_x = 6; - pixel_y = -4 - }, -/obj/item/attachment/rail_light{ - pixel_x = 6; - pixel_y = -4 - }, -/obj/item/shield/riot, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/tech/grid, -/area/ship/security) "Dh" = ( /obj/effect/turf_decal/techfloor, /obj/structure/table/reinforced, @@ -5773,20 +5787,6 @@ }, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) -"Xv" = ( -/obj/structure/table, -/obj/item/plate, -/obj/item/reagent_containers/food/drinks/sillycup{ - pixel_y = 10; - pixel_x = -8 - }, -/obj/item/food/ration/pack/grape_beverage{ - pixel_y = 10; - pixel_x = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/ship/crew/canteen) "XA" = ( /obj/structure/closet/secure_closet/armorycage{ anchored = 1; @@ -6656,7 +6656,7 @@ LQ mg GI Fm -Xv +qt XW EB aw @@ -6860,7 +6860,7 @@ vT Xi gO eL -Db +wQ DP ww ww diff --git a/_maps/shuttles/minutemen/minutemen_arke.dmm b/_maps/shuttles/minutemen/minutemen_arke.dmm index 49744a16d43..0c2b044d60e 100644 --- a/_maps/shuttles/minutemen/minutemen_arke.dmm +++ b/_maps/shuttles/minutemen/minutemen_arke.dmm @@ -1306,7 +1306,7 @@ pixel_y = 4; pixel_x = 5 }, -/obj/item/gun/energy/plasmacutter, +/obj/item/plasmacutter, /obj/item/t_scanner/adv_mining_scanner{ pixel_y = 4; pixel_x = 5 diff --git a/_maps/shuttles/nanotrasen/nanotrasen_harrier.dmm b/_maps/shuttles/nanotrasen/nanotrasen_harrier.dmm index 840d768fc7c..49b15aa029a 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_harrier.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_harrier.dmm @@ -5978,6 +5978,9 @@ dir = 8 }, /obj/machinery/oven, +/obj/structure/sign/poster/contraband/diet_guide{ + pixel_y = 30 + }, /turf/open/floor/plasteel, /area/ship/crew/canteen) "GY" = ( diff --git a/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm b/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm index 0a63fbe0f19..68efacfb22e 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm @@ -1746,7 +1746,7 @@ /turf/open/floor/plasteel/dark, /area/ship/hallway/port) "lD" = ( -/obj/machinery/computer/apc_control{ +/obj/machinery/computer/monitor{ dir = 4; icon_state = "computer-left" }, diff --git a/_maps/shuttles/pirate/pirate_tortuga.dmm b/_maps/shuttles/pirate/pirate_tortuga.dmm index c4f42e99749..cc09b6c14a3 100644 --- a/_maps/shuttles/pirate/pirate_tortuga.dmm +++ b/_maps/shuttles/pirate/pirate_tortuga.dmm @@ -583,6 +583,25 @@ "fv" = ( /turf/closed/wall/r_wall/rust, /area/ship/cargo) +"fx" = ( +/obj/effect/turf_decal/corner/opaque/blue{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/blue{ + dir = 8 + }, +/obj/structure/table/glass, +/obj/item/storage/case/surgery{ + pixel_y = 3 + }, +/obj/item/clothing/suit/apron/surgical{ + pixel_x = -7; + pixel_y = 10 + }, +/turf/open/floor/plating{ + icon_state = "plating_rust" + }, +/area/ship/medical) "fA" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 @@ -671,6 +690,19 @@ }, /turf/open/floor/plating, /area/ship/maintenance/port) +"gz" = ( +/obj/machinery/door/window/brigdoor/eastleft, +/obj/machinery/shower{ + pixel_y = 17 + }, +/obj/effect/turf_decal/techfloor/hole/right{ + dir = 1 + }, +/obj/effect/turf_decal/techfloor/hole{ + dir = 1 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/ship/crew/toilet) "gB" = ( /obj/effect/turf_decal/spline/fancy/opaque/black{ dir = 1 @@ -712,20 +744,6 @@ }, /turf/open/floor/pod/dark, /area/ship/maintenance/starboard) -"gK" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/toilet{ - pixel_y = 10 - }, -/obj/machinery/button/door{ - dir = 4; - pixel_x = -24; - id = "toilet1"; - name = "privacy lock"; - normaldoorcontrol = 1 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/ship/crew/toilet) "gM" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -734,27 +752,6 @@ /obj/structure/chair/comfy/grey/old/directional/south, /turf/open/floor/carpet/nanoweave, /area/ship/crew/crewtwo) -"gO" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/ammo/c9mm{ - pixel_x = -10; - pixel_y = 10 - }, -/obj/item/storage/toolbox/ammo/a308{ - pixel_x = -10 - }, -/obj/item/storage/toolbox/ammo/c9mm{ - pixel_x = 10; - pixel_y = 10 - }, -/obj/item/storage/toolbox/ammo/a308{ - pixel_x = 10 - }, -/obj/item/storage/toolbox/ammo/shotgun{ - pixel_y = 9 - }, -/turf/open/floor/mineral/plastitanium, -/area/ship/security/armory) "gQ" = ( /obj/machinery/firealarm/directional/east, /obj/structure/table, @@ -1226,20 +1223,6 @@ }, /turf/open/floor/plasteel/telecomms_floor, /area/ship/bridge) -"la" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/power/smes/shuttle/precharged, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "sboard_engine" - }, -/turf/open/floor/plasteel/tech, -/area/ship/maintenance/starboard) "ld" = ( /obj/structure/catwalk/over/plated_catwalk, /obj/structure/railing{ @@ -1299,6 +1282,25 @@ "lJ" = ( /turf/closed/mineral/ship, /area/ship/maintenance) +"lK" = ( +/obj/machinery/griddle, +/obj/machinery/light/directional/east, +/obj/effect/decal/cleanable/wrapping, +/turf/open/floor/plasteel/mono, +/area/ship/cargo) +"lO" = ( +/obj/machinery/door/window/brigdoor/eastright, +/obj/machinery/shower{ + dir = 1 + }, +/obj/effect/turf_decal/techfloor/hole, +/obj/effect/turf_decal/techfloor/hole/right, +/obj/item/bikehorn/rubberducky/plasticducky{ + pixel_y = 7; + pixel_x = -6 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/ship/crew/toilet) "lQ" = ( /obj/machinery/telecomms/hub{ autolinkers = list("hub","bus","relay","messaging","pirate","broadcasterB","receiverB"); @@ -1440,81 +1442,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/ship/maintenance/port) -"mG" = ( -/obj/structure/closet/secure_closet{ - icon_state = "sec"; - name = "equipment locker"; - req_access_txt = "3" - }, -/obj/effect/turf_decal/box, -/obj/item/clothing/head/helmet/bulletproof/x11/frontier{ - pixel_y = 6; - pixel_x = 7 - }, -/obj/machinery/light/directional/north, -/obj/item/clothing/head/helmet/bulletproof/x11/frontier{ - pixel_y = 6; - pixel_x = 7 - }, -/obj/item/clothing/head/helmet/bulletproof/x11/frontier{ - pixel_y = 6; - pixel_x = 7 - }, -/obj/item/clothing/head/helmet/bulletproof/x11/frontier{ - pixel_y = 6; - pixel_x = 7 - }, -/obj/item/melee/knife/survival, -/obj/item/melee/knife/survival, -/obj/item/melee/knife/survival, -/obj/item/melee/knife/survival, -/obj/item/storage/belt/security/military/frontiersmen{ - pixel_x = -4; - pixel_y = -10 - }, -/obj/item/storage/belt/security/military/frontiersmen{ - pixel_x = -4; - pixel_y = -10 - }, -/obj/item/storage/belt/security/military/frontiersmen{ - pixel_x = -4; - pixel_y = -10 - }, -/obj/item/storage/belt/security/military/frontiersmen{ - pixel_x = -4; - pixel_y = -10 - }, -/obj/item/clothing/suit/armor/vest/bulletproof/frontier{ - pixel_x = 8; - pixel_y = -4 - }, -/obj/item/clothing/suit/armor/vest/bulletproof/frontier{ - pixel_x = 8; - pixel_y = -4 - }, -/obj/item/clothing/suit/armor/vest/bulletproof/frontier{ - pixel_x = 8; - pixel_y = -4 - }, -/obj/item/clothing/suit/armor/vest/bulletproof/frontier{ - pixel_x = 8; - pixel_y = -4 - }, -/obj/item/flashlight/seclite, -/obj/item/flashlight/seclite, -/obj/item/flashlight/seclite, -/obj/item/flashlight/seclite, -/obj/item/clothing/head/helmet/bulletproof/x11/frontier{ - pixel_y = 6; - pixel_x = 7 - }, -/obj/item/melee/boarding_axe, -/obj/item/melee/boarding_axe, -/obj/item/melee/boarding_axe, -/obj/item/melee/boarding_axe, -/obj/item/melee/boarding_axe, -/turf/open/floor/mineral/plastitanium, -/area/ship/security/armory) "mZ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 10 @@ -1597,6 +1524,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/nanoweave, /area/ship/crew/crewtwo) +"nH" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/power/smes/shuttle/precharged, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "sboard_engine" + }, +/turf/open/floor/plasteel/tech, +/area/ship/maintenance/starboard) "nT" = ( /obj/effect/turf_decal/box/corners{ dir = 4 @@ -1619,6 +1560,20 @@ }, /turf/open/floor/plasteel/tech/techmaint, /area/ship/cargo) +"nW" = ( +/obj/machinery/power/smes/shuttle/precharged, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "port_engine" + }, +/turf/open/floor/plasteel/tech, +/area/ship/maintenance/port) "oe" = ( /obj/effect/turf_decal/borderfloor{ dir = 1 @@ -2015,20 +1970,6 @@ "so" = ( /turf/closed/wall/rust, /area/ship/crew) -"sr" = ( -/obj/machinery/power/smes/shuttle/precharged, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "sboard_engine" - }, -/turf/open/floor/plasteel/tech, -/area/ship/maintenance/starboard) "ss" = ( /obj/machinery/button/door{ dir = 1; @@ -2611,29 +2552,6 @@ icon_state = "plating_rust" }, /area/ship/maintenance) -"xB" = ( -/obj/structure/closet/secure_closet{ - icon_door = "tac"; - icon_state = "tac"; - name = "boarding tools locker"; - req_access_txt = "3" - }, -/obj/effect/turf_decal/box, -/obj/item/storage/backpack/duffelbag/syndie/c4{ - pixel_y = 8 - }, -/obj/item/door_seal{ - pixel_y = -7 - }, -/obj/item/door_seal{ - pixel_y = -7 - }, -/obj/item/shield/riot/spike, -/obj/item/storage/box/smokebombs, -/obj/item/storage/toolbox/ammo/frag, -/obj/item/crowbar/power, -/turf/open/floor/mineral/plastitanium, -/area/ship/security/armory) "xV" = ( /obj/effect/turf_decal/borderfloor, /obj/effect/turf_decal/siding/thinplating/dark{ @@ -2738,6 +2656,20 @@ }, /turf/open/floor/plasteel/mono, /area/ship/cargo) +"yF" = ( +/obj/machinery/power/smes/shuttle/precharged, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "sboard_engine" + }, +/turf/open/floor/plasteel/tech, +/area/ship/maintenance/starboard) "yH" = ( /obj/effect/turf_decal/techfloor, /turf/open/floor/plasteel/tech/grid, @@ -2822,6 +2754,21 @@ "zJ" = ( /turf/closed/wall/r_wall/rust, /area/ship/maintenance/starboard) +"zV" = ( +/obj/effect/decal/cleanable/glass, +/obj/machinery/light/small/directional/north, +/obj/structure/toilet{ + pixel_y = 10 + }, +/obj/machinery/button/door{ + dir = 4; + pixel_x = -24; + id = "toilet2"; + name = "privacy lock"; + normaldoorcontrol = 1 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/ship/crew/toilet) "zZ" = ( /obj/effect/turf_decal/corner/opaque/black{ dir = 9 @@ -2920,6 +2867,28 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/plasteel/tech, /area/ship/bridge) +"AX" = ( +/obj/structure/closet/secure_closet{ + icon_door = "tac"; + icon_state = "tac"; + name = "boarding tools locker"; + req_access_txt = "3" + }, +/obj/effect/turf_decal/box, +/obj/item/storage/backpack/duffelbag/syndie/c4{ + pixel_y = 8 + }, +/obj/item/door_seal{ + pixel_y = -7 + }, +/obj/item/door_seal{ + pixel_y = -7 + }, +/obj/item/storage/box/smokebombs, +/obj/item/storage/toolbox/ammo/frag, +/obj/item/crowbar/power, +/turf/open/floor/mineral/plastitanium, +/area/ship/security/armory) "AZ" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -2932,8 +2901,7 @@ }, /turf/open/floor/pod/dark, /area/ship/maintenance/starboard) -"Be" = ( -/obj/effect/decal/cleanable/glass, +"Bb" = ( /obj/machinery/light/small/directional/north, /obj/structure/toilet{ pixel_y = 10 @@ -2941,7 +2909,7 @@ /obj/machinery/button/door{ dir = 4; pixel_x = -24; - id = "toilet2"; + id = "toilet1"; name = "privacy lock"; normaldoorcontrol = 1 }, @@ -3112,6 +3080,29 @@ icon_state = "plating_rust" }, /area/ship/maintenance) +"Dw" = ( +/obj/machinery/light/directional/north, +/obj/item/storage/pouch/squad, +/obj/item/clothing/suit/armor/vest/marine/frontier, +/obj/item/clothing/head/helmet/frontier, +/obj/item/megaphone, +/obj/item/clothing/under/frontiersmen/officer{ + pixel_x = -5 + }, +/obj/item/clothing/shoes/jackboots{ + pixel_y = -13 + }, +/obj/item/clothing/head/beret/sec/frontier/officer, +/obj/item/radio/headset/pirate/alt, +/obj/item/binoculars, +/obj/structure/closet/secure_closet{ + icon_state = "hos"; + name = "Deck Boss' Locker"; + req_access_txt = "3" + }, +/obj/item/storage/guncase/slammer, +/turf/open/floor/plasteel/tech, +/area/ship/bridge) "DF" = ( /obj/structure/cable/yellow{ icon_state = "6-8" @@ -3259,20 +3250,6 @@ }, /turf/open/floor/plating, /area/ship/maintenance) -"EI" = ( -/obj/machinery/power/smes/shuttle/precharged, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "port_engine" - }, -/turf/open/floor/plasteel/tech, -/area/ship/maintenance/port) "EL" = ( /obj/effect/decal/cleanable/glass, /obj/item/broken_bottle, @@ -3499,6 +3476,20 @@ /obj/structure/curtain/cloth, /turf/open/floor/plating/catwalk_floor, /area/ship/security/armory) +"Gv" = ( +/obj/machinery/shower{ + pixel_y = 17 + }, +/obj/effect/turf_decal/techfloor/hole{ + dir = 1 + }, +/obj/effect/turf_decal/techfloor/hole/right{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/obj/item/soap/homemade, +/turf/open/floor/plasteel/showroomfloor, +/area/ship/crew/toilet) "Gx" = ( /obj/effect/turf_decal/techfloor{ dir = 1 @@ -3537,6 +3528,81 @@ }, /turf/open/floor/pod/dark, /area/ship/maintenance/starboard) +"GJ" = ( +/obj/structure/closet/secure_closet{ + icon_state = "sec"; + name = "equipment locker"; + req_access_txt = "3" + }, +/obj/effect/turf_decal/box, +/obj/item/clothing/head/helmet/bulletproof/x11/frontier{ + pixel_y = 6; + pixel_x = 7 + }, +/obj/machinery/light/directional/north, +/obj/item/clothing/head/helmet/bulletproof/x11/frontier{ + pixel_y = 6; + pixel_x = 7 + }, +/obj/item/clothing/head/helmet/bulletproof/x11/frontier{ + pixel_y = 6; + pixel_x = 7 + }, +/obj/item/clothing/head/helmet/bulletproof/x11/frontier{ + pixel_y = 6; + pixel_x = 7 + }, +/obj/item/melee/knife/survival, +/obj/item/melee/knife/survival, +/obj/item/melee/knife/survival, +/obj/item/melee/knife/survival, +/obj/item/storage/belt/security/military/frontiersmen{ + pixel_x = -4; + pixel_y = -10 + }, +/obj/item/storage/belt/security/military/frontiersmen{ + pixel_x = -4; + pixel_y = -10 + }, +/obj/item/storage/belt/security/military/frontiersmen{ + pixel_x = -4; + pixel_y = -10 + }, +/obj/item/storage/belt/security/military/frontiersmen{ + pixel_x = -4; + pixel_y = -10 + }, +/obj/item/clothing/suit/armor/vest/bulletproof/frontier{ + pixel_x = 8; + pixel_y = -4 + }, +/obj/item/clothing/suit/armor/vest/bulletproof/frontier{ + pixel_x = 8; + pixel_y = -4 + }, +/obj/item/clothing/suit/armor/vest/bulletproof/frontier{ + pixel_x = 8; + pixel_y = -4 + }, +/obj/item/clothing/suit/armor/vest/bulletproof/frontier{ + pixel_x = 8; + pixel_y = -4 + }, +/obj/item/flashlight/seclite, +/obj/item/flashlight/seclite, +/obj/item/flashlight/seclite, +/obj/item/flashlight/seclite, +/obj/item/clothing/head/helmet/bulletproof/x11/frontier{ + pixel_y = 6; + pixel_x = 7 + }, +/obj/item/melee/boarding_axe, +/obj/item/melee/boarding_axe, +/obj/item/melee/boarding_axe, +/obj/item/melee/boarding_axe, +/obj/item/melee/boarding_axe, +/turf/open/floor/mineral/plastitanium, +/area/ship/security/armory) "GM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 9 @@ -3708,20 +3774,6 @@ icon_state = "wood-broken5" }, /area/ship/crew/crewtwo) -"Iu" = ( -/obj/machinery/shower{ - pixel_y = 17 - }, -/obj/effect/turf_decal/techfloor/hole{ - dir = 1 - }, -/obj/effect/turf_decal/techfloor/hole/right{ - dir = 1 - }, -/obj/machinery/light/small/directional/west, -/obj/item/soap/homemade, -/turf/open/floor/plasteel/showroomfloor, -/area/ship/crew/toilet) "Iw" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -3782,29 +3834,6 @@ }, /turf/open/floor/plating, /area/ship/cargo) -"IF" = ( -/obj/machinery/light/directional/north, -/obj/item/storage/pouch/squad, -/obj/item/clothing/suit/armor/vest/marine/frontier, -/obj/item/clothing/head/helmet/frontier, -/obj/item/megaphone, -/obj/item/clothing/under/frontiersmen/officer{ - pixel_x = -5 - }, -/obj/item/clothing/shoes/jackboots{ - pixel_y = -13 - }, -/obj/item/clothing/head/beret/sec/frontier/officer, -/obj/item/radio/headset/pirate/alt, -/obj/item/binoculars, -/obj/structure/closet/secure_closet{ - icon_state = "hos"; - name = "Deck Boss' Locker"; - req_access_txt = "3" - }, -/obj/item/storage/guncase/slammer, -/turf/open/floor/plasteel/tech, -/area/ship/bridge) "II" = ( /obj/machinery/door/airlock/hatch, /obj/structure/cable/yellow{ @@ -4013,12 +4042,6 @@ }, /turf/open/floor/plating, /area/ship/cargo) -"KE" = ( -/obj/machinery/griddle, -/obj/machinery/light/directional/east, -/obj/effect/decal/cleanable/wrapping, -/turf/open/floor/plasteel/mono, -/area/ship/cargo) "KM" = ( /obj/structure/railing{ dir = 1 @@ -4077,19 +4100,6 @@ /obj/structure/catwalk/over/plated_catwalk, /turf/open/floor/plating, /area/ship/crew/toilet) -"KZ" = ( -/obj/machinery/door/window/brigdoor/eastright, -/obj/machinery/shower{ - dir = 1 - }, -/obj/effect/turf_decal/techfloor/hole, -/obj/effect/turf_decal/techfloor/hole/right, -/obj/item/bikehorn/rubberducky/plasticducky{ - pixel_y = 7; - pixel_x = -6 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/ship/crew/toilet) "Lb" = ( /obj/structure/table, /obj/item/reagent_containers/glass/bowl{ @@ -4632,39 +4642,6 @@ }, /turf/open/floor/plating, /area/ship/cargo) -"Po" = ( -/obj/effect/turf_decal/corner/opaque/blue{ - dir = 4 - }, -/obj/effect/turf_decal/corner/opaque/blue{ - dir = 8 - }, -/obj/structure/table/glass, -/obj/item/storage/case/surgery{ - pixel_y = 3 - }, -/obj/item/clothing/suit/apron/surgical{ - pixel_x = -7; - pixel_y = 10 - }, -/turf/open/floor/plating{ - icon_state = "plating_rust" - }, -/area/ship/medical) -"Pu" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/power/smes/shuttle/precharged, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "port_engine" - }, -/turf/open/floor/plasteel/tech, -/area/ship/maintenance/port) "Pw" = ( /obj/structure/cable{ icon_state = "4-9" @@ -5099,6 +5076,27 @@ /obj/effect/turf_decal/borderfloor, /turf/open/floor/plasteel/mono/dark, /area/ship/crew/canteen) +"Tg" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/ammo/c9mm{ + pixel_x = -10; + pixel_y = 10 + }, +/obj/item/storage/toolbox/ammo/a308{ + pixel_x = -10 + }, +/obj/item/storage/toolbox/ammo/c9mm{ + pixel_x = 10; + pixel_y = 10 + }, +/obj/item/storage/toolbox/ammo/a308{ + pixel_x = 10 + }, +/obj/item/storage/toolbox/ammo/shotgun{ + pixel_y = 9 + }, +/turf/open/floor/mineral/plastitanium, +/area/ship/security/armory) "Tk" = ( /obj/effect/turf_decal/techfloor{ dir = 1 @@ -5559,6 +5557,20 @@ }, /turf/open/floor/carpet/nanoweave, /area/ship/crew/crewtwo) +"Xv" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/power/smes/shuttle/precharged, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "port_engine" + }, +/turf/open/floor/plasteel/tech, +/area/ship/maintenance/port) "XC" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -5821,19 +5833,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel/white, /area/ship/medical) -"ZV" = ( -/obj/machinery/door/window/brigdoor/eastleft, -/obj/machinery/shower{ - pixel_y = 17 - }, -/obj/effect/turf_decal/techfloor/hole/right{ - dir = 1 - }, -/obj/effect/turf_decal/techfloor/hole{ - dir = 1 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/ship/crew/toilet) "ZY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/red{ @@ -6093,8 +6092,8 @@ Ek Ek Ek jA -Pu -EI +Xv +nW TR Ek rd @@ -6112,8 +6111,8 @@ xV fv Ek wK -sr -la +yF +nH zJ Ek Ek @@ -6585,7 +6584,7 @@ Xs fj aT bx -KE +lK wQ fU hC @@ -6646,7 +6645,7 @@ lJ Px Px pF -Iu +Gv bI pF td @@ -6686,8 +6685,8 @@ Ek Px Px pF -ZV -KZ +gz +lO pF DU KU @@ -6867,7 +6866,7 @@ VO VO VO Vt -xB +AX RH hP FP @@ -6887,7 +6886,7 @@ Px Px Px pF -gK +Bb Ez jp gG @@ -6905,9 +6904,9 @@ nv VO yj iW -Po +fx Vt -gO +Tg gD yH FP @@ -6947,7 +6946,7 @@ BB UJ fC Vt -mG +GJ Kr FB SD @@ -6967,7 +6966,7 @@ Px Px Px pF -Be +zV ao Cx XC @@ -7097,7 +7096,7 @@ fE YE ah ah -IF +Dw VH qT gB diff --git a/_maps/shuttles/roumain/srm_elder.dmm b/_maps/shuttles/roumain/srm_elder.dmm index 777fb22f8b7..20f1a4855d4 100644 --- a/_maps/shuttles/roumain/srm_elder.dmm +++ b/_maps/shuttles/roumain/srm_elder.dmm @@ -363,6 +363,30 @@ pixel_x = 8; pixel_y = -6 }, +/obj/item/storage/box/ammo/a4570{ + pixel_x = -6; + pixel_y = 3 + }, +/obj/item/storage/box/ammo/a4570{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/storage/box/ammo/a4570{ + pixel_x = -6; + pixel_y = 9 + }, +/obj/item/ammo_box/a4570{ + pixel_x = -3; + pixel_y = -6 + }, +/obj/item/ammo_box/a4570{ + pixel_x = -8; + pixel_y = -6 + }, +/obj/item/ammo_box/a4570{ + pixel_x = -12; + pixel_y = -6 + }, /turf/open/floor/wood/ebony, /area/ship/storage) "de" = ( @@ -2229,10 +2253,6 @@ /obj/machinery/door/window{ dir = 8 }, -/obj/item/gun/ballistic/rifle/illestren/factory{ - pixel_y = 3; - pixel_x = -4 - }, /obj/item/gun/ballistic/rifle/illestren/factory{ pixel_x = -4; pixel_y = -5 @@ -2241,6 +2261,10 @@ pixel_x = -4; pixel_y = -1 }, +/obj/item/gun/ballistic/shotgun/flamingarrow/pyre/factory{ + pixel_x = -6; + pixel_y = 3 + }, /turf/open/floor/wood/ebony, /area/ship/storage) "Bq" = ( diff --git a/_maps/shuttles/roumain/srm_sojourner.dmm b/_maps/shuttles/roumain/srm_sojourner.dmm index d12e60a0d36..2de4d20e274 100644 --- a/_maps/shuttles/roumain/srm_sojourner.dmm +++ b/_maps/shuttles/roumain/srm_sojourner.dmm @@ -2402,14 +2402,8 @@ /obj/effect/turf_decal/box/red/corners{ dir = 8 }, -/obj/item/shield/riot/buckler{ - pixel_x = 5; - pixel_y = 8 - }, -/obj/item/shield/riot/buckler{ - pixel_x = 5; - pixel_y = 8 - }, +/obj/item/shield/buckler, +/obj/item/shield/buckler, /obj/item/storage/belt/security/military/frontiersmen{ pixel_y = -1; pixel_x = 4 diff --git a/_maps/shuttles/subshuttles/ngr_karst.dmm b/_maps/shuttles/subshuttles/ngr_karst.dmm index 3e1ed41e942..b0a2b1e5a26 100644 --- a/_maps/shuttles/subshuttles/ngr_karst.dmm +++ b/_maps/shuttles/subshuttles/ngr_karst.dmm @@ -219,7 +219,6 @@ }, /obj/item/clothing/under/syndicate/ngr/fatigues, /obj/item/clothing/head/helmet/ngr/swat, -/obj/item/radio/headset/syndicate/alt, /obj/item/clothing/shoes/combat, /obj/item/clothing/gloves/fingerless{ desc = "These make you feel like a better pilot than you are."; @@ -229,6 +228,7 @@ name = "Pilot's Locker"; req_access = list(1) }, +/obj/item/radio/headset/syndicate/alt/ngr, /turf/open/floor/plasteel/dark, /area/ship/bridge) "q" = ( diff --git a/_maps/shuttles/syndicate/syndicate_hardliners_leyak.dmm b/_maps/shuttles/syndicate/syndicate_hardliners_leyak.dmm index 197d4679436..bbbc39ced5a 100644 --- a/_maps/shuttles/syndicate/syndicate_hardliners_leyak.dmm +++ b/_maps/shuttles/syndicate/syndicate_hardliners_leyak.dmm @@ -191,6 +191,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 8 }, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/plating, /area/ship/engineering/engines) "bD" = ( @@ -1427,7 +1430,10 @@ dir = 9 }, /obj/machinery/firealarm/directional/south, -/obj/machinery/portable_atmospherics/pump, +/obj/machinery/power/cloak, +/obj/structure/cable{ + icon_state = "0-8" + }, /turf/open/floor/plasteel/tech, /area/ship/engineering/engines) "qa" = ( @@ -3213,14 +3219,16 @@ /turf/open/floor/plasteel/tech/grid, /area/ship/engineering/engines) "Oa" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 9 - }, /obj/structure/cable{ icon_state = "0-2" }, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/industrial/hatch/yellow, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 9 + }, +/obj/machinery/portable_atmospherics/pump, /turf/open/floor/plasteel/tech, /area/ship/engineering/engines) "Oi" = ( @@ -3500,15 +3508,15 @@ /area/ship/bridge) "QE" = ( /obj/structure/catwalk/over/plated_catwalk/dark, -/obj/structure/cable{ - icon_state = "4-10" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 8 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plating, /area/ship/engineering/engines) "QF" = ( @@ -3827,10 +3835,10 @@ dir = 1 }, /obj/structure/cable{ - icon_state = "2-5" + icon_state = "1-2" }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-4" }, /turf/open/floor/plating, /area/ship/engineering/engines) diff --git a/_maps/shuttles/syndicate/syndicate_ngr_derecho.dmm b/_maps/shuttles/syndicate/syndicate_ngr_derecho.dmm index 1ace49e9efa..2e99509affe 100644 --- a/_maps/shuttles/syndicate/syndicate_ngr_derecho.dmm +++ b/_maps/shuttles/syndicate/syndicate_ngr_derecho.dmm @@ -806,9 +806,7 @@ /area/ship/crew/canteen) "gW" = ( /obj/structure/rack, -/obj/item/gun/energy/plasmacutter{ - pixel_y = 15 - }, +/obj/item/plasmacutter, /obj/machinery/airalarm/directional/south, /obj/effect/decal/cleanable/dirt/dust, /obj/item/gear_pack/anglegrinder{ diff --git a/_maps/shuttles/syndicate/syndicate_ngr_kaliandhi.dmm b/_maps/shuttles/syndicate/syndicate_ngr_kaliandhi.dmm index c67f1ef720c..cb9547b6ff2 100644 --- a/_maps/shuttles/syndicate/syndicate_ngr_kaliandhi.dmm +++ b/_maps/shuttles/syndicate/syndicate_ngr_kaliandhi.dmm @@ -3117,7 +3117,7 @@ /turf/open/floor/plasteel/tech, /area/ship/security/armory) "qy" = ( -/obj/machinery/computer/apc_control{ +/obj/machinery/computer/monitor{ icon_state = "computer-right" }, /obj/effect/turf_decal/techfloor{ @@ -7927,6 +7927,10 @@ /obj/structure/cable{ icon_state = "0-4" }, +/obj/machinery/light_switch{ + pixel_x = -14; + pixel_y = 22 + }, /turf/open/floor/plasteel/patterned/grid/dark, /area/ship/maintenance/starboard) "PM" = ( diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 344b903488e..6773b2cb122 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -132,11 +132,6 @@ #define MUTCOLORS_SECONDARY 25 ///Human skintones #define SKINCOLORS 26 -///Used for determining which wounds are applicable to this species. -///if we have flesh (can suffer slash/piercing/burn wounds, requires they don't have NOBLOOD) -#define HAS_FLESH 27 -///if we have bones (can suffer bone wounds) -#define HAS_BONE 28 //organ slots #define ORGAN_SLOT_BRAIN "brain" diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index d9229b0814f..e151089f286 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -221,6 +221,11 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(/obj/item/gun))) //We will round to this value in damage calculations. #define DAMAGE_PRECISION 0.1 +/// Calls the effects of flashes. Screen overlays and such. +#define FLASH_EFFECT (1<<0) +/// Whether the flash should cause eye damage. +#define FLASH_DAMAGE (1<<1) + /// Alternate attack defines. Return these at the end of procs like afterattack_secondary. /// Calls the normal attack proc. For example, if returned in afterattack_secondary, will call afterattack. /// Will continue the chain depending on the return value of the non-alternate proc, like with normal attacks. diff --git a/code/__DEFINES/dcs/signals/signals.dm b/code/__DEFINES/dcs/signals/signals.dm index 86efbaee066..4075bb2733f 100644 --- a/code/__DEFINES/dcs/signals/signals.dm +++ b/code/__DEFINES/dcs/signals/signals.dm @@ -450,8 +450,10 @@ #define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" ///from base of obj/item/attack_qdeleted(): (atom/target, mob/user, proxiumity_flag, click_parameters) #define COMSIG_MOB_ITEM_ATTACK_QDELETED "mob_item_attack_qdeleted" -///from base of mob/RangedAttack(): (atom/A, params) +///from base of mob/RangedAttack(): (atom/A, modifiers) #define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" +///from base of mob/RangedAttack(): (atom/target, modifiers) +#define COMSIG_MOB_ATTACK_RANGED_SECONDARY "mob_attack_ranged_secondary" ///From base of mob/update_movespeed():area #define COMSIG_MOB_MOVESPEED_UPDATED "mob_update_movespeed" ///from base of /mob/throw_item(): (atom/target) 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 e3d88ac3d6b..8968a85c372 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm @@ -18,6 +18,8 @@ // /mob/living/carbon physiology signals #define COMSIG_CARBON_GAIN_WOUND "carbon_gain_wound" //from /datum/wound/proc/apply_wound() (/mob/living/carbon/C, /datum/wound/W, /obj/item/bodypart/L) #define COMSIG_CARBON_LOSE_WOUND "carbon_lose_wound" //from /datum/wound/proc/remove_wound() (/mob/living/carbon/C, /datum/wound/W, /obj/item/bodypart/L) +/// Called after limb AND victim has been unset +#define COMSIG_CARBON_POST_LOSE_WOUND "carbon_post_lose_wound" //from /datum/wound/proc/remove_wound() (/datum/wound/lost_wound, /obj/item/bodypart/part, ignore_limb, replaced) ///from base of /obj/item/bodypart/proc/attach_limb(): (new_limb, special) allows you to fail limb attachment #define COMSIG_CARBON_ATTACH_LIMB "carbon_attach_limb" #define COMPONENT_NO_ATTACH (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_reagent.dm b/code/__DEFINES/dcs/signals/signals_reagent.dm index 2f9688aab62..d7cc4b336ca 100644 --- a/code/__DEFINES/dcs/signals/signals_reagent.dm +++ b/code/__DEFINES/dcs/signals/signals_reagent.dm @@ -9,7 +9,7 @@ /// Prevents the atom from being exposed to reagents if returned on [COMSIG_ATOM_EXPOSE_REAGENTS] #define COMPONENT_NO_EXPOSE_REAGENTS (1<<0) ///from base of atom/expose_reagents(): (/list, /datum/reagents, methods, volume_modifier, show_message) -//#define COMSIG_ATOM_AFTER_EXPOSE_REAGENTS "atom_after_expose_reagents" +#define COMSIG_ATOM_AFTER_EXPOSE_REAGENTS "atom_after_expose_reagents" ///from base of [/datum/reagent/proc/expose_atom]: (/datum/reagent, reac_volume) #define COMSIG_ATOM_EXPOSE_REAGENT "atom_expose_reagent" ///from base of [/datum/reagent/proc/expose_atom]: (/atom, reac_volume) diff --git a/code/__DEFINES/factions.dm b/code/__DEFINES/factions.dm index 171b8a49f80..439dcb6d1f0 100644 --- a/code/__DEFINES/factions.dm +++ b/code/__DEFINES/factions.dm @@ -12,6 +12,7 @@ #define FACTION_VIGILITAS "Vigilitas Interstellar" #define FACTION_FRONTIERSMEN "Frontiersmen Fleet" #define FACTION_PGF "Pan-Gezena Federation" +#define FACTION_ZOHIL "Zohil Explorat" #define FACTION_INDEPENDENT "Independent" #define FACTION_RAMZI "Ramzi Clique" #define FACTION_UNKNOWN "Unknown" @@ -30,6 +31,7 @@ #define PREFIX_VIGILITAS list("VISV") #define PREFIX_FRONTIERSMEN list("FFV") #define PREFIX_PGF list("PGF", "PGFMC", "PGFN", "PGFS") +#define PREFIX_ZOHIL list("ZESV") #define PREFIX_INDEPENDENT list("SV", "IMV", "ISV", "MSV") #define PREFIX_RAMZI list("RCSV") #define PREFIX_NONE list() diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index baf12f09514..3b69bb4595c 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -208,7 +208,7 @@ #define TRAUMA_RESILIENCE_BASIC 1 //Curable with chems #define TRAUMA_RESILIENCE_SURGERY 2 //Curable with brain surgery #define TRAUMA_RESILIENCE_LOBOTOMY 3 //Curable with lobotomy -#define TRAUMA_RESILIENCE_WOUND 4 //Curable by healing the head wound +#define TRAUMA_RESILIENCE_WOUND 4 //Curable by healing the relevant wound #define TRAUMA_RESILIENCE_MAGIC 5 //Curable only with magic #define TRAUMA_RESILIENCE_ABSOLUTE 6 //This is here to stay @@ -380,7 +380,7 @@ //MINOR TWEAKS/MISC #define AGE_MIN 18 //youngest a character can be #define AGE_MAX 85 //oldest a character can be -#define AGE_MINOR 20 //legal age of space drinking and smoking +#define AGE_DRINKING 20 //legal age of space drinking and smoking #define WIZARD_AGE_MIN 30 //youngest a wizard can be #define APPRENTICE_AGE_MIN 29 //youngest an apprentice can be #define SHOES_SLOWDOWN 0 //How much shoes slow you down by default. Negative values speed you up @@ -403,7 +403,7 @@ #define FLASH_PROTECTION_SENSITIVE -1 #define FLASH_PROTECTION_NONE 0 #define FLASH_PROTECTION_FLASH 1 -#define FLASH_PROTECTION_WELDER 2 +#define FLASH_PROTECTION_WELDER 3 // Roundstart trait system diff --git a/code/__DEFINES/overmap.dm b/code/__DEFINES/overmap.dm index 5b4f790089d..ea1365bc23d 100644 --- a/code/__DEFINES/overmap.dm +++ b/code/__DEFINES/overmap.dm @@ -113,4 +113,4 @@ #define SHIPMODULE_BSDRIVE "bluespace_drive" #define SHIPMODULE_HELMCONSOLE "helm_console" #define SHIPMODULE_TRANSPONDER "transponder" - +#define SHIPMODULE_CLOAKING "cloaking" diff --git a/code/__DEFINES/paper.dm b/code/__DEFINES/paper.dm index cccb3f7b871..29909abcaea 100644 --- a/code/__DEFINES/paper.dm +++ b/code/__DEFINES/paper.dm @@ -1,9 +1,9 @@ /// Maximimum number of characters that we allow on paper. #define MAX_PAPER_LENGTH 5000 /// Max number of stamps that can be applied to the paper in tgui. -#define MAX_PAPER_STAMPS 30 +#define MAX_PAPER_GRAPHICS 30 /// Max number of stamp overlays that we'll add to a piece of paper's icon. -#define MAX_PAPER_STAMPS_OVERLAYS 4 +#define MAX_PAPER_GRAPHIC_OVERLAYS 4 /// Maximum length of input fields. Input fields greater than this length are clamped tgui-side. Input field text input greater than this length is rejected tgui-side, discarded + logged if it reaches DM-side. #define MAX_PAPER_INPUT_FIELD_LENGTH MAX_NAME_LEN diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index c5b37e2694d..8f5bc3ed498 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -123,7 +123,7 @@ #define RANDOM_HAIR_GRADIENT_STYLE "random_grad_style" #define RANDOM_HAIR_GRADIENT_COLOR "random_grad_color" -//prosthetics stuff +//Limbs stuff #define PROSTHETIC_NORMAL "normal" #define PROSTHETIC_AMPUTATED "amputated" #define PROSTHETIC_ROBOTIC "prosthetic" diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 4a139c2e562..609a65e52dd 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -115,6 +115,7 @@ #define INIT_ORDER_SOUND_CACHE 84 #define INIT_ORDER_SOUNDS 83 #define INIT_ORDER_INSTRUMENTS 82 +#define INIT_ORDER_WOUNDS 81 #define INIT_ORDER_VIS 80 #define INIT_ORDER_ACHIEVEMENTS 77 #define INIT_ORDER_RESEARCH 75 diff --git a/code/__DEFINES/traits/traits.dm b/code/__DEFINES/traits/traits.dm index 1ac5ddf4205..dd87cb2b8aa 100644 --- a/code/__DEFINES/traits/traits.dm +++ b/code/__DEFINES/traits/traits.dm @@ -216,6 +216,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NOMETABOLISM "no_metabolism" #define TRAIT_NOCLONELOSS "no_cloneloss" #define TRAIT_TOXIMMUNE "toxin_immune" +#define TRAIT_NOBLOOD "noblood" #define TRAIT_EASYDISMEMBER "easy_dismember" #define TRAIT_LIMBATTACHMENT "limb_attach" #define TRAIT_NOLIMBDISABLE "no_limb_disable" @@ -436,6 +437,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define MAPPING_HELPER_TRAIT "mapping-helper" //obtained from mapping helper /// Trait associated to wearing a suit #define SUIT_TRAIT "suit" +/// Trait associated with being EMPed +#define EMP_TRAIT "emp" +/// Trait associated with damage, whatever that means in the datum's context +#define DAMAGE_TRAIT "damage" /// Trait associated to lying down (having a [lying_angle] of a different value than zero). #define LYING_DOWN_TRAIT "lying-down" /// Trait associated to lacking electrical power. @@ -488,6 +493,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define LACKING_MANIPULATION_APPENDAGES_TRAIT "lacking-manipulation-appengades" //trait associated to not having fine manipulation appendages such as hands #define HANDCUFFED_TRAIT "handcuffed" #define ORBITED_TRAIT "orbited" +/// Trait applied to organs when they are unable to function. +#define TRAIT_ORGAN_FAILING "organ_failing" /// Trait granted by [/obj/item/warpwhistle] #define WARPWHISTLE_TRAIT "warpwhistle" ///Turf trait for when a turf is transparent @@ -531,6 +538,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Disables the floating animation. See above. #define TRAIT_NO_FLOATING_ANIM "no-floating-animation" +// Traits for ships and other overmap objects +///This ship is cloaked or hidden and cannot be detected on long-range scanners +#define TRAIT_CLOAKED "cloaked" +///Currently only adds a blue-shifting during the cloak animation, will add functionality later when I add anti-ship weapons +#define TRAIT_BLUESPACE_SHIFT "bluespace_shift" + /// Trait granted by [mob/living/silicon/ai] /// Applied when the ai anchors itself #define AI_ANCHOR_TRAIT "ai_anchor" diff --git a/code/__DEFINES/wounds.dm b/code/__DEFINES/wounds.dm index 8ed9aee0876..0832fc160f2 100644 --- a/code/__DEFINES/wounds.dm +++ b/code/__DEFINES/wounds.dm @@ -13,6 +13,12 @@ /// set wound_bonus on an item or attack to this to disable checking wounding for the attack #define CANT_WOUND -100 +/// If there are multiple possible and valid wounds for the same type and severity, weight will be used to pick among them. See _wound_pregen_data.dm for more details +/// This is used in pick_weight, so use integers +#define WOUND_DEFAULT_WEIGHT 50 +/// Chance to roll a muscle wound from brute damage +#define WOUND_MUSCLE_WEIGHT 15 + // ~wound severities #define WOUND_SEVERITY_TRIVIAL 0 #define WOUND_SEVERITY_MODERATE 1 @@ -22,18 +28,18 @@ #define WOUND_SEVERITY_LOSS 4 -// ~wound categories -/// any brute weapon/attack that doesn't have sharpness. rolls for blunt bone wounds -#define WOUND_BLUNT "blunt" +// ~wound categories: wounding_types +/// any brute weapon/attack that doesn't have sharpness. rolls for blunt bone and metal buckling wounds +#define WOUND_BLUNT "wound_blunt" /// any brute weapon/attack with sharpness = SHARP_EDGED. rolls for slash wounds -#define WOUND_SLASH "slash" -/// any brute weapon/attack with sharpness = SHARP_POINTY. rolls for piercing wounds -#define WOUND_PIERCE "pierce" -/// any concentrated burn attack (lasers really). rolls for burning wounds -#define WOUND_BURN "burn" -/// any brute attacks, rolled on a chance -#define WOUND_MUSCLE "muscle" +#define WOUND_SLASH "wound_slash" +/// any brute weapon/attack with sharpness = SHARP_POINTY. rolls for piercing and electrical wounds +#define WOUND_PIERCE "wound_pierce" +/// any concentrated burn attack (lasers really). rolls for burning, heat-warping, and electrical wounds +#define WOUND_BURN "wound_burn" +/// Mainly a define used for wound_pregen_data, if a pregen data instance expects this, it will accept any and all wound types, even none at all +#define WOUND_ALL "wound_all" // ~determination second wind defines // How much determination reagent to add each time someone gains a new wound in [/datum/wound/proc/second_wind] @@ -47,22 +53,10 @@ /// While someone has determination in their system, their bleed rate is slightly reduced #define WOUND_DETERMINATION_BLEED_MOD 0.85 -// ~wound global lists -// list in order of highest severity to lowest -GLOBAL_LIST_INIT(global_wound_types, list(WOUND_BLUNT = list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate), - WOUND_SLASH = list(/datum/wound/slash/critical, /datum/wound/slash/critical, /datum/wound/slash/moderate), - WOUND_PIERCE = list(/datum/wound/pierce/critical, /datum/wound/pierce/severe, /datum/wound/pierce/moderate), - WOUND_BURN = list(/datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate), - WOUND_MUSCLE = list(/datum/wound/muscle/severe, /datum/wound/muscle/moderate) - )) - -// every single type of wound that can be rolled naturally, in case you need to pull a random one -GLOBAL_LIST_INIT(global_all_wound_types, list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate, - /datum/wound/slash/critical, /datum/wound/slash/critical, /datum/wound/slash/moderate, - /datum/wound/pierce/critical, /datum/wound/pierce/severe, /datum/wound/pierce/moderate, - /datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate, - /datum/wound/muscle/severe, /datum/wound/muscle/moderate)) - +/// Wounds using this competition mode will remove any wounds of a greater severity than itself in a random wound roll. In most cases, you dont want to use this. +#define WOUND_COMPETITION_OVERPOWER_GREATERS "wound_submit" +/// Wounds using this competition mode will remove any wounds of a lower severity than itself in a random wound roll. Used for ensuring the worse case scenario of a given injury_roll. +#define WOUND_COMPETITION_OVERPOWER_LESSERS "wound_dominate" // ~burn wound infection defines // Thresholds for infection for burn wounds, once infestation hits each threshold, things get steadily worse @@ -86,52 +80,108 @@ GLOBAL_LIST_INIT(global_all_wound_types, list(/datum/wound/blunt/critical, /datu #define WOUND_SLASH_DEAD_CLOT_MIN 0.05 /// if we suffer a bone wound to the head that creates brain traumas, the timer for the trauma cycle is +/- by this percent (0-100) #define WOUND_BONE_HEAD_TIME_VARIANCE 20 -/// Chance to roll a muscle wound from brute damage -#define MUSCLE_WOUND_CHANCE 20 - - -// ~mangling defines -// With the wounds pt. 2 update, general dismemberment now requires 2 things for a limb to be dismemberable (bone only creatures just need the second): -// 1. Skin is mangled: A critical slash or pierce wound on that limb -// 2. Bone is mangled: At least a severe bone wound on that limb -// see [/obj/item/bodypart/proc/get_mangled_state] for more information -#define BODYPART_MANGLED_NONE 0 -#define BODYPART_MANGLED_BONE 1 -#define BODYPART_MANGLED_FLESH 2 -#define BODYPART_MANGLED_BOTH 3 - +/// charge drain per severity level +#define WOUND_ELECTRIC_POWER_DRAIN 0.05 // ~biology defines -// What kind of biology we have, and what wounds we can suffer, mostly relies on the HAS_FLESH and HAS_BONE species traits on human species -/// golems and androids, cannot suffer any wounds -#define BIO_INORGANIC 0 -/// skeletons and plasmemes, can only suffer bone wounds, only needs mangled bone to be able to dismember -#define BIO_JUST_BONE 1 -/// nothing right now, maybe slimepeople in the future, can only suffer slashing, piercing, and burn wounds -#define BIO_JUST_FLESH 2 -/// standard humanoids, can suffer all wounds, needs mangled bone and flesh to dismember. conveniently, what you get when you combine BIO_JUST_BONE and BIO_JUST_FLESH -#define BIO_FLESH_BONE 3 - +// What kind of biology we have, and what wounds we can suffer, relies on the biological_state var on bodyparts. +/// Has absolutely fucking nothing, no wounds +#define BIO_INORGANIC NONE +/// Has bone - allows the victim to suffer T2-T3 bone blunt wounds +#define BIO_BONE (1<<0) +/// Has flesh - allows the victim to suffer fleshy slash pierce and burn wounds +#define BIO_FLESH (1<<1) +/// Has metal - allows the victim to suffer buckling and heat-warping wounds +#define BIO_METAL (1<<2) +/// Is wired internally - allows the victim to suffer electrical wounds (robotic T1-T3 slash/pierce) +#define BIO_WIRED (1<<3) +/// Has bloodflow - can suffer bleeding wounds and can bleed +#define BIO_BLOODED (1<<4) +/// Is connected by a joint - can suffer T1 bone blunt wounds (dislocation) +#define BIO_JOINTED (1<<5) + +/// Robotic - can suffer all metal/wired wounds, such as: UNIMPLEMENTED PLEASE UPDATE ONCE SYNTH WOUNDS 9/5/2023 ~Niko +#define BIO_ROBOTIC (BIO_METAL|BIO_WIRED) +/// Has flesh and bone - See BIO_BONE and BIO_FLESH +#define BIO_FLESH_BONE (BIO_BONE|BIO_FLESH) +/// Standard humanoid - can bleed and suffer all flesh/bone wounds, such as: T1-3 slash/pierce/burn/blunt, except dislocations. Think human heads/chests +#define BIO_STANDARD_UNJOINTED (BIO_FLESH_BONE|BIO_BLOODED) +/// Standard humanoid limbs - can bleed and suffer all flesh/bone wounds, such as: T1-3 slash/pierce/burn/blunt. Can also bleed, and be dislocated. Think human arms and legs +#define BIO_STANDARD_JOINTED (BIO_STANDARD_UNJOINTED|BIO_JOINTED) + +// "Where" a specific biostate is within a given limb +// Interior is hard shit, the last line, shit like bones +// Exterior is soft shit, targetted by slashes and pierces (usually), protects exterior +// A limb needs both mangled interior and exterior to be dismembered, but slash/pierce must mangle exterior to attack the interior +// Not having exterior/interior counts as mangled exterior/interior for the purposes of dismemberment +/// The given biostate is on the "interior" of the limb - hard shit, protected by exterior +#define ANATOMY_INTERIOR (1<<0) +/// The given biostate is on the "exterior" of the limb - soft shit, protects interior +#define ANATOMY_EXTERIOR (1<<1) +#define ANATOMY_EXTERIOR_AND_INTERIOR (ANATOMY_EXTERIOR|ANATOMY_INTERIOR) + +// Wound series +// A "wound series" is just a family of wounds that logically follow eachother +// Multiple wounds in a single series cannot be on a limb - the highest severity will always be prioritized, and lower ones will be skipped + +/// T1-T3 Bleeding slash wounds. Requires flesh. Can cause bleeding, but doesn't require it. From: slash.dm +#define WOUND_SERIES_FLESH_SLASH_BLEED "wound_series_flesh_slash_bled" +/// T1-T3 Basic blunt wounds. T1 requires jointed, but 2-3 require bone. From: bone.dm +#define WOUND_SERIES_BONE_BLUNT_BASIC "wound_series_bone_blunt_basic" +/// T1-T3 Basic burn wounds. Requires flesh. From: burns.dm +#define WOUND_SERIES_FLESH_BURN_BASIC "wound_series_flesh_burn_basic" +/// T1-3 Bleeding puncture wounds. Requires flesh. Can cause bleeding, but doesn't require it. From: pierce.dm +#define WOUND_SERIES_FLESH_PUNCTURE_BLEED "wound_series_flesh_puncture_bleed" +/// T1-3 Buckling wounds. Requires metal. From: buckling.dm +#define WOUND_SERIES_METAL_BUCKLING "wound_series_metal_buckling" +/// T1-3 Heat-warping wounds. Requires metal. From: heat_warping.dm +#define WOUND_SERIES_METAL_HEAT_WARPING "wound_series_metal_heat_warping" +/// T1-3 Electrical wounds. Requires wired. From: electrical.dm +#define WOUND_SERIES_WIRED_ELECTRICAL "wound_series_wired_electrical" +/// T1-3 Muscle wounds. Requires flesh. From: muscle.dm +#define WOUND_SERIES_FLESH_MUSCLE "wound_series_flesh_muscle" +/// Generic loss wounds. See loss.dm +#define WOUND_SERIES_LOSS_BASIC "wound_series_loss_basic" + +/// Used in get_corresponding_wound_type(): Will pick the highest severity wound out of severity_min and severity_max +#define WOUND_PICK_HIGHEST_SEVERITY 1 +/// Used in get_corresponding_wound_type(): Will pick the lowest severity wound out of severity_min and severity_max +#define WOUND_PICK_LOWEST_SEVERITY 2 + +// With the wounds pt. 2 update, general dismemberment now requires 2 things for a limb to be dismemberable (exterior/bone only creatures just need the second): +// 1. Exterior is mangled: A critical slash or pierce wound on that limb +// 2. Interior is mangled: At least a severe bone wound on that limb +// Lack of exterior or interior count as mangled exterior/interior respectively +// see [/obj/item/bodypart/proc/get_mangled_state] for more information, as well as GLOB.bio_state_anatomy +#define BODYPART_MANGLED_NONE NONE +#define BODYPART_MANGLED_INTERIOR (1<<0) +#define BODYPART_MANGLED_EXTERIOR (1<<1) +#define BODYPART_MANGLED_BOTH (BODYPART_MANGLED_INTERIOR | BODYPART_MANGLED_EXTERIOR) // ~wound flag defines -/// If this wound requires having the HAS_FLESH flag for humanoids -#define FLESH_WOUND (1<<0) -/// If this wound requires having the HAS_BONE flag for humanaoids -#define BONE_WOUND (1<<1) -/// If having this wound counts as mangled flesh for dismemberment -#define MANGLES_FLESH (1<<2) -/// If having this wound counts as mangled bone for dismemberment -#define MANGLES_BONE (1<<3) +/// If having this wound counts as mangled exterior for dismemberment +#define MANGLES_EXTERIOR (1<<0) +/// If having this wound counts as mangled interior for dismemberment +#define MANGLES_INTERIOR (1<<1) /// If this wound marks the limb as being allowed to have gauze applied -#define ACCEPTS_GAUZE (1<<4) +#define ACCEPTS_GAUZE (1<<2) /// If this wound marks the limb as being allowed to have splints applied -#define ACCEPTS_SPLINT (1<<5) +#define ACCEPTS_SPLINT (1<<3) +/// Whether this wound is fixed when replacing the external plating +#define PLATING_DAMAGE (1<<4) +/// If this wound allows the victim to grasp it +#define CAN_BE_GRASPED (1<<5) +/// This causes the wound to numb the affected limb +#define NUMBS_BODYPART (1<<6) /// When a wound is staining the gauze with blood #define GAUZE_STAIN_BLOOD 1 /// When a wound is staining the gauze with pus #define GAUZE_STAIN_PUS 2 +/// Limb integrity is reduced to this before being used to calculate how much integrity loss it should have. +#define WOUND_MAX_INTEGRITY_CONSIDERED 50 + // ~blood_flow rates of change, these are used by [/datum/wound/proc/get_bleed_rate_of_change] from [/mob/living/carbon/proc/bleed_warn] to let the player know if their bleeding is getting better/worse/the same /// Our wound is clotting and will eventually stop bleeding if this continues #define BLOOD_FLOW_DECREASING -1 diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 72236dc21a0..7ebb379a4f3 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -70,6 +70,7 @@ #define LAZYACCESSASSOC(L, I, K) L ? L[I] ? L[I][K] ? L[I][K] : null : null : null #define LAZYNULL(L) L = null #define QDEL_LAZYLIST(L) for(var/I in L) qdel(I); L = null; +#define QDEL_LAZYASSOCLIST(L) for(var/K in L) qdel(L[K]); L = null; /// ORs two lazylists together without inserting errant nulls, returning a new list and not modifying the existing lists. #define LAZY_LISTS_OR(left_list, right_list)\ (length(left_list)\ diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 05041cfbb0b..8807bfea192 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -35,7 +35,8 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/ipc_screens, GLOB.ipc_screens_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/ipc_antennas, GLOB.ipc_antennas_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/ipc_tail, GLOB.ipc_tail_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/ipc_chassis, GLOB.ipc_chassis_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/body, GLOB.alternative_body_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/body/ipc_chassis, GLOB.ipc_chassis_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, GLOB.moth_markings_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/spider_legs, GLOB.spider_legs_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/spider_spinneret, GLOB.spider_spinneret_list) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 047dc2d98d1..70c8e42e9b8 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -73,7 +73,7 @@ if(!GLOB.ipc_tail_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/ipc_antennas, GLOB.ipc_tail_list) if(!GLOB.ipc_chassis_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/ipc_chassis, GLOB.ipc_chassis_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/body/ipc_chassis, GLOB.ipc_chassis_list) if(!GLOB.spider_legs_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/spider_legs, GLOB.spider_legs_list) if(!GLOB.spider_spinneret_list.len) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 43b9f09b9dd..58a08930bc3 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1097,14 +1097,14 @@ GLOBAL_REAL_VAR(list/stack_trace_storage) str = "0" + str . = str -/atom/proc/Shake(pixelshiftx = 15, pixelshifty = 15, duration = 250) +/// Perform a shake on an atom, resets its position afterwards +/atom/proc/Shake(pixelshiftx = 2, pixelshifty = 2, duration = 2.5 SECONDS, shake_interval = 0.02 SECONDS) var/initialpixelx = pixel_x var/initialpixely = pixel_y - var/shiftx = rand(-pixelshiftx,pixelshiftx) - var/shifty = rand(-pixelshifty,pixelshifty) - animate(src, pixel_x = pixel_x + shiftx, pixel_y = pixel_y + shifty, time = 0.2, loop = duration) - pixel_x = initialpixelx - pixel_y = initialpixely + animate(src, pixel_x = initialpixelx + rand(-pixelshiftx,pixelshiftx), pixel_y = initialpixelx + rand(-pixelshifty,pixelshifty), time = shake_interval, flags = ANIMATION_PARALLEL) + for (var/i in 3 to ((duration / shake_interval))) // Start at 3 because we already applied one, and need another to reset + animate(pixel_x = initialpixelx + rand(-pixelshiftx,pixelshiftx), pixel_y = initialpixely + rand(-pixelshifty,pixelshifty), time = shake_interval) + animate(pixel_x = initialpixelx, pixel_y = initialpixely, time = shake_interval) /proc/weightclass2text(w_class) switch(w_class) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 8ff187f8819..bda6c75f4c6 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -39,6 +39,7 @@ GLOBAL_LIST_EMPTY(squid_face_list) GLOBAL_LIST_EMPTY(ipc_screens_list) GLOBAL_LIST_EMPTY(ipc_antennas_list) GLOBAL_LIST_EMPTY(ipc_tail_list) +GLOBAL_LIST_EMPTY(alternative_body_list) GLOBAL_LIST_EMPTY(ipc_chassis_list) GLOBAL_LIST_INIT(ipc_brain_list, list("Posibrain", "Man-Machine Interface")) GLOBAL_LIST_EMPTY(spider_legs_list) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 3678bb492b4..b2a089374e3 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -164,7 +164,7 @@ GLOBAL_LIST_INIT(uncommon_loot, list(//uncommon: useful items /obj/item/restraints/legcuffs/bola = 1, /obj/item/restraints/handcuffs/cable = 1, /obj/item/melee/spear = 1, - /obj/item/shield/riot/buckler = 1, + /obj/item/shield/buckler = 1, /obj/item/grenade/iedcasing/spawned = 1, /obj/item/melee/baton/cattleprod = 1, /obj/item/throwing_star = 1, diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 326464a8ccb..a72b16ed538 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -302,7 +302,15 @@ * Useful for mobs that have their abilities mapped to right click. */ /mob/proc/ranged_secondary_attack(atom/target, modifiers) + var/signal_result = SEND_SIGNAL(src, COMSIG_MOB_ATTACK_RANGED_SECONDARY, target, modifiers) + if(signal_result & COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + if(signal_result & COMPONENT_SECONDARY_CONTINUE_ATTACK_CHAIN) + return SECONDARY_ATTACK_CONTINUE_CHAIN + + return SECONDARY_ATTACK_CALL_NORMAL /** * Middle click diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 55e823bb6ff..275ed0aa9d7 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -137,23 +137,32 @@ /obj/attackby(obj/item/I, mob/living/user, params) return ..() || ((obj_flags & CAN_BE_HIT) && I.attack_obj(src, user)) -/mob/living/attackby(obj/item/I, mob/living/user, params) +/mob/living/attackby(obj/item/weapon, mob/living/user, params) if(..()) return TRUE - if(user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM) - for(var/datum/surgery/S in surgeries) - if(body_position != LYING_DOWN && S.lying_required) + + if(handle_tool_treatment(weapon, user, params2list(params))) + return TRUE + + // MUST be done AFTER wound treatment + if((weapon.item_flags & SURGICAL_TOOL) && user.a_intent == INTENT_HELP && attempt_initiate_surgery(weapon, src, user)) + return TRUE + + //This should really be in attack but 2 much logic doesnt call parent + user.changeNext_move(weapon.attack_cooldown) + return weapon.attack(src, user, params) + +/// This handles treating wounds and performing surgeries with items. It is also a hack to avoid refactoring the entire attack chain (for now) +/mob/living/proc/handle_tool_treatment(obj/item/tool, mob/living/user, list/modifiers) + if(user.a_intent == INTENT_HELP) + for(var/datum/surgery/active_surgery in surgeries) + if(body_position != LYING_DOWN && active_surgery.lying_required) continue - if(!S.self_operable && user == src) + if(!active_surgery.self_operable && user == src) continue - if(S.next_step(user, params2list(params))) + if(active_surgery.next_step(user, modifiers)) return TRUE - if((I.item_flags & SURGICAL_TOOL) && user.a_intent == INTENT_HELP) - if(attempt_initiate_surgery(I, src, user)) - return TRUE - //This should really be in attack but 2 much logic doesnt call parent - user.changeNext_move(I.attack_cooldown) - return I.attack(src, user, params) + return FALSE /mob/living/attack_hand(mob/living/user, list/modifiers) if(..()) @@ -175,9 +184,12 @@ * * params - Click params of this attack */ /obj/item/proc/attack(mob/living/target_mob, mob/living/user, params) - if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, target_mob, user, params) & COMPONENT_ITEM_NO_ATTACK) - return - SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK, target_mob, user, params) + var/signal_return = SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, target_mob, user, params) | SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK, target_mob, user, params) + if(signal_return & COMPONENT_CANCEL_ATTACK_CHAIN) + return TRUE + if(signal_return & COMPONENT_SKIP_ATTACK) + return FALSE + if(item_flags & NOBLUDGEON) return diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 074ee37614d..26e732ab5f0 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -34,7 +34,7 @@ A.attack_hand(src, modifiers) /// Return TRUE to cancel other attack hand effects that respect it. -/atom/proc/attack_hand(mob/user) +/atom/proc/attack_hand(mob/user, list/modifiers) . = FALSE if(!(interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND)) add_fingerprint(user) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index c5f5407f442..4ac4b8c6b80 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -205,6 +205,7 @@ SUBSYSTEM_DEF(mapping) CHECK_LIST_EXISTS("job_slots") var/datum/map_template/shuttle/S = new(data["map_path"], data["map_name"], TRUE) S.file_name = data["map_path"] + S.ship_class = data["map_name"] if(istext(data["map_short_name"])) S.short_name = data["map_short_name"] diff --git a/code/controllers/subsystem/wounds.dm b/code/controllers/subsystem/wounds.dm new file mode 100644 index 00000000000..dfe8e43832a --- /dev/null +++ b/code/controllers/subsystem/wounds.dm @@ -0,0 +1,167 @@ +SUBSYSTEM_DEF(wounds) + name = "Wounds" + init_order = INIT_ORDER_WOUNDS + flags = SS_NO_FIRE + + /// A "chronological" list of wound severities, starting at the least severe. + var/static/list/severities_chronological = list( + "[WOUND_SEVERITY_TRIVIAL]", + "[WOUND_SEVERITY_MODERATE]", + "[WOUND_SEVERITY_SEVERE]", + "[WOUND_SEVERITY_CRITICAL]" + ) + + /// A assoc list of BIO_ define to EXTERIOR/INTERIOR defines. + /// This is where the interior/exterior state of a given biostate is set. + /// Note that not all biostates are guaranteed to be one of these - and in fact, many are not + /// IMPORTANT NOTE: All keys are stored as text and must be converted via text2num + var/static/list/bio_state_anatomy = list( + "[BIO_WIRED]" = ANATOMY_EXTERIOR, + "[BIO_METAL]" = ANATOMY_INTERIOR, + "[BIO_FLESH]" = ANATOMY_EXTERIOR, + "[BIO_BONE]" = ANATOMY_INTERIOR, + ) + + /// Associated list of wound types and their pregen data. + var/list/datum/wound_pregen_data/pregen_data + + // A wound series "collection" is merely a way for us to track what is in what series, and what their types are. + // Without this, we have no centralized way to determine what type is in what series outside of iterating over every pregen data. + + /// A branching assoc list of (series -> list(severity -> list(typepath -> weight))). Allows you to say "I want a generic slash wound", + /// then "Of severity 2", and get a wound of that description - via get_corresponding_wound_type() + /// Series: A generic wound_series, such as WOUND_SERIES_BONE_BLUNT_BASIC + /// Severity: Any wounds held within this will be of this severity. + /// Typepath, Weight: Merely a pairing of a given typepath to its weight, held for convenience in pickweight. + var/list/series_collection + + /// A branching assoc list of (wounding_type -> list(wound_series)). + /// Allows for determining of which wound series are caused by what. + var/static/list/types_to_series = list( + WOUND_BLUNT = list( + WOUND_SERIES_BONE_BLUNT_BASIC, + WOUND_SERIES_METAL_BUCKLING, + WOUND_SERIES_FLESH_MUSCLE, + ), + WOUND_SLASH = list( + WOUND_SERIES_FLESH_SLASH_BLEED, + WOUND_SERIES_WIRED_ELECTRICAL, + ), + WOUND_BURN = list( + WOUND_SERIES_FLESH_BURN_BASIC, + WOUND_SERIES_METAL_HEAT_WARPING, + WOUND_SERIES_WIRED_ELECTRICAL, + ), + WOUND_PIERCE = list( + WOUND_SERIES_FLESH_PUNCTURE_BLEED, + WOUND_SERIES_WIRED_ELECTRICAL, + ), + ) + +/datum/controller/subsystem/wounds/Initialize(timeofday) + generate_wound_static_data() + generate_wound_series_collection() + return ..() + +/// Constructs [all_wound_pregen_data] by iterating through a typecache of pregen data, ignoring abstract types, and instantiating the rest. +/datum/controller/subsystem/wounds/proc/generate_wound_static_data() + var/list/datum/wound_pregen_data/all_pregen_data = list() + + for (var/datum/wound_pregen_data/iterated_path as anything in typecacheof(path = /datum/wound_pregen_data, ignore_root_path = TRUE)) + if (initial(iterated_path.abstract)) + continue + + if (!isnull(all_pregen_data[initial(iterated_path.wound_path_to_generate)])) + stack_trace("pre-existing pregen data for [initial(iterated_path.wound_path_to_generate)] when [iterated_path] was being considered: [all_pregen_data[initial(iterated_path.wound_path_to_generate)]]. \ + this is definitely a bug, and is probably because one of the two pregen data have the wrong wound typepath defined. [iterated_path] will not be instantiated") + + continue + + var/datum/wound_pregen_data/new_data = new iterated_path + LAZYSET(pregen_data, new_data.wound_path_to_generate, new_data) + +// Series -> severity -> type -> weight +/// Generates [wound_series_collections] by iterating through all pregen_data. Refer to the mentioned list for documentation +/datum/controller/subsystem/wounds/proc/generate_wound_series_collection() + for (var/datum/wound/wound_typepath as anything in typecacheof(/datum/wound, FALSE, TRUE)) + var/datum/wound_pregen_data/data = pregen_data[wound_typepath] + if (!data) + continue + + if (data.abstract) + stack_trace("somehow, a abstract wound_pregen_data instance ([data.type]) was instantiated and made it to generate_wound_series_collection()! \ + i literally have no idea how! please fix this!") + continue + + var/series = data.wound_series + var/list/datum/wound/series_list = series_collection[series] + if (isnull(series_list)) + series_collection[series] = list() + series_list = series_collection[series] + + var/severity = "[(initial(wound_typepath.severity))]" + var/list/datum/wound/severity_list = series_list[severity] + if (isnull(severity_list)) + series_list[severity] = list() + severity_list = series_list[severity] + + severity_list[wound_typepath] = data.weight + +/** + * Searches through all wounds for any of proper type, series, and biostate, and then returns a single one via pickweight. + * Is able to discern between, say, a flesh slash wound, and a metallic slash wound, and will return the respective one for the provided limb. + * + * The severity_max and severity_pick_mode args mostly exist in case you want a wound in a series that may not have your ideal severity wound, as it lets you + * essentially set a "fallback", where if your ideal wound doesnt exist, it'll still return something, trying to get closest to your ideal severity. + * + * Generally speaking, if you want a critical/severe/moderate wound, you should set severity_min to WOUND_SEVERITY_MODERATE, severity_max to your ideal wound, + * and severity_pick_mode to WOUND_PICK_HIGHEST_SEVERITY - UNLESS you for some reason want the LOWEST severity, in which case you should set + * severity_max to the highest wound you're willing to tolerate, and severity_pick_mode to WOUND_PICK_LOWEST_SEVERITY. + * + * Args: + * * list/wounding_types: A list of wounding_types. Only wounds that accept these wound types will be considered. + * * obj/item/bodypart/part: The limb we are considering. Extremely important for biostates. + * * severity_min: The minimum wound severity we will search for. + * * severity_max = severity_min: The maximum wound severity we will search for. + * * severity_pick_mode = WOUND_PICK_HIGHEST_SEVERITY: The "pick mode" we will use when considering multiple wounds of acceptable severity. See the above defines. + * * random_roll = TRUE: If this is considered a "random" consideration. If true, only wounds that can be randomly generated will be considered. + * * duplicates_allowed = FALSE: If exact duplicates of a given wound on part are tolerated. Useful for simply getting a path and not instantiating. + * * care_about_existing_wounds = TRUE: If we iterate over wounds to see if any are above or at a given wounds severity, and disregard it if any are. Useful for simply getting a path and not instantiating. + * + * Returns: + * A randomly picked wound typepath meeting all the above criteria and being applicable to the part's biotype - or null if there were none. + */ +/datum/controller/subsystem/wounds/proc/get_corresponding_wound_type(list/wounding_types, obj/item/bodypart/part, severity_min, severity_max = severity_min, severity_pick_mode = WOUND_PICK_HIGHEST_SEVERITY, random_roll = TRUE, duplicates_allowed = FALSE, care_about_existing_wounds = TRUE) + RETURN_TYPE(/datum/wound) // note that just because its set to return this doesnt mean its non-nullable + + var/list/wounding_type_list = list() + for (var/wounding_type as anything in wounding_types) + wounding_type_list |= SSwounds.types_to_series[wounding_type] + if (!length(wounding_type_list)) + return null + + var/list/datum/wound/paths_to_pick_from = list() + for (var/series as anything in shuffle(wounding_type_list)) + var/list/severity_list = series_collection[series] + if (!length(severity_list)) + continue + + var/picked_severity + for (var/severity_text as anything in shuffle(severities_chronological)) + var/severity = text2num(severity_text) + if (severity > severity_min || severity < severity_max) + continue + + if (isnull(picked_severity) || ((severity_pick_mode == WOUND_PICK_HIGHEST_SEVERITY && severity > picked_severity) || (severity_pick_mode == WOUND_PICK_LOWEST_SEVERITY && severity < picked_severity))) + picked_severity = severity + + var/list/wound_typepaths = severity_list["[picked_severity]"] + if (!length(wound_typepaths)) + continue + + for (var/datum/wound/iterated_path as anything in wound_typepaths) + var/datum/wound_pregen_data/pregen_data = SSwounds.pregen_data[iterated_path] + if (pregen_data.can_be_applied_to(part, wounding_types, random_roll = random_roll, duplicates_allowed = duplicates_allowed, care_about_existing_wounds = care_about_existing_wounds)) + paths_to_pick_from[iterated_path] = wound_typepaths[iterated_path] + + return pick_weight(paths_to_pick_from) // we found our winners! diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm index f0686579e4d..ec0c0f958ba 100644 --- a/code/datums/components/butchering.dm +++ b/code/datums/components/butchering.dm @@ -97,10 +97,8 @@ H.apply_damage(source.force, BRUTE, BODY_ZONE_HEAD, wound_bonus = CANT_WOUND) var/obj/item/bodypart/slit_throat = H.get_bodypart(BODY_ZONE_HEAD) - if(slit_throat) - var/datum/wound/slash/critical/screaming_through_a_slit_throat = new - screaming_through_a_slit_throat.apply_wound(slit_throat) - H.apply_status_effect(/datum/status_effect/neck_slice) + if (H.cause_wound_of_type_and_severity(WOUND_SLASH, slit_throat, WOUND_SEVERITY_CRITICAL)) + H.apply_status_effect(/datum/status_effect/neck_slice) /datum/component/butchering/proc/Butcher(mob/living/butcher, mob/living/meat) var/turf/T = meat.drop_location() diff --git a/code/datums/components/crafting/recipes/weapon.dm b/code/datums/components/crafting/recipes/weapon.dm index 1f0151054e0..fdf0d3a9598 100644 --- a/code/datums/components/crafting/recipes/weapon.dm +++ b/code/datums/components/crafting/recipes/weapon.dm @@ -10,20 +10,6 @@ category = CAT_WEAPONRY subcategory = CAT_WEAPON -/datum/crafting_recipe/strobeshield - name = "Strobe Shield" - result = /obj/item/shield/riot/flash - reqs = list(/obj/item/stack/cable_coil = 1, - /obj/item/assembly/flash/handheld = 1, - /obj/item/shield/riot = 1) - time = 40 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/strobeshield/New() - ..() - blacklist |= subtypesof(/obj/item/shield/riot/) - /datum/crafting_recipe/molotov name = "Molotov" result = /obj/item/reagent_containers/food/drinks/molotov diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm index 70fc4308f4b..ecda3afc45f 100644 --- a/code/datums/components/embedded.dm +++ b/code/datums/components/embedded.dm @@ -97,7 +97,8 @@ if(harmful) victim.throw_alert("embeddedobject", /atom/movable/screen/alert/embeddedobject) playsound(victim,'sound/weapons/bladeslice.ogg', 40) - weapon.add_mob_blood(victim)//it embedded itself in you, of course it's bloody! + if(limb.can_bleed()) + weapon.add_mob_blood(victim)//it embedded itself in you, of course it's bloody! damage += weapon.w_class * impact_pain_mult SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded) diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm index 5ceffc3cb75..feedd27667e 100644 --- a/code/datums/components/pellet_cloud.dm +++ b/code/datums/components/pellet_cloud.dm @@ -298,13 +298,13 @@ if(isbodypart(target)) hit_part = target target = hit_part.owner - if(wound_info_by_part[hit_part] && (initial(P.damage_type) == BRUTE || initial(P.damage_type) == BURN)) // so a cloud of disablers that deal stamina don't inadvertently end up causing burn wounds) + var/damage_type = initial(P.damage_type) + if(wound_info_by_part[hit_part] && (damage_type == BRUTE || damage_type == BURN)) // so a cloud of disablers that deal stamina don't inadvertently end up causing burn wounds) var/damage_dealt = wound_info_by_part[hit_part][CLOUD_POSITION_DAMAGE] var/w_bonus = wound_info_by_part[hit_part][CLOUD_POSITION_W_BONUS] var/bw_bonus = wound_info_by_part[hit_part][CLOUD_POSITION_BW_BONUS] - var/wound_type = (initial(P.damage_type) == BRUTE) ? WOUND_BLUNT : WOUND_BURN // sharpness is handled in the wound rolling - wound_info_by_part[hit_part] = null - hit_part.painless_wound_roll(wound_type, damage_dealt, w_bonus, bw_bonus, initial(P.sharpness)) + wound_info_by_part -= hit_part + hit_part.wound_roll((damage_type == BRUTE) ? damage_dealt : 0, (damage_type == BURN) ? damage_dealt : 0, w_bonus, bw_bonus, initial(P.sharpness)) if(num_hits > 1) target.visible_message(span_danger("[target] is hit by [num_hits] [proj_name]s[hit_part ? " in the [hit_part.name]" : ""]!"), null, null, COMBAT_MESSAGE_RANGE, target) diff --git a/code/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm index 4b0f8f4a051..b8c66c1c657 100644 --- a/code/datums/components/storage/concrete/pockets.dm +++ b/code/datums/components/storage/concrete/pockets.dm @@ -2,6 +2,7 @@ max_items = 2 max_w_class = WEIGHT_CLASS_SMALL max_combined_w_class = 50 + alt_click_open = FALSE // alt-click has special interactions on a lot of clothing items and shouldn't be canceled by opening storage instead use_sound = null /datum/component/storage/concrete/pockets/handle_item_insertion(obj/item/I, prevent_warning, mob/user) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index e2adb916295..097a0871da6 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -62,8 +62,12 @@ var/allow_big_nesting = FALSE //allow storage objects of the same or greater size. - var/attack_hand_interact = TRUE //interact on attack hand. - var/quickdraw = FALSE //altclick interact + /// Should left-click open this storage item while equipped? + var/attack_hand_interact = TRUE + /// Should alt-click open this storage item? + var/alt_click_open = TRUE + /// Should alt or right click quickly draw the first available item? + var/quickdraw = FALSE ///can we quickopen storage when it's in a pocket var/pocket_openable = FALSE @@ -122,10 +126,12 @@ RegisterSignal(parent, COMSIG_MOVABLE_POST_THROW, PROC_REF(close_all)) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) - RegisterSignals(parent, list(COMSIG_CLICK_ALT, COMSIG_ATOM_ATTACK_HAND_SECONDARY, COMSIG_ITEM_ATTACK_SELF_SECONDARY), PROC_REF(on_open_storage_click)) + RegisterSignals(parent, list(COMSIG_ATOM_ATTACK_HAND_SECONDARY, COMSIG_ITEM_ATTACK_SELF_SECONDARY), PROC_REF(on_open_storage_click)) RegisterSignal(parent, COMSIG_ATOM_ATTACKBY_SECONDARY, PROC_REF(on_open_storage_attackby)) RegisterSignal(parent, COMSIG_MOUSEDROP_ONTO, PROC_REF(mousedrop_onto)) RegisterSignal(parent, COMSIG_MOUSEDROPPED_ONTO, PROC_REF(mousedrop_receive)) + if(alt_click_open) + RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(on_open_storage_click)) update_actions() diff --git a/code/datums/components/writing.dm b/code/datums/components/writing.dm new file mode 100644 index 00000000000..9be545c09c4 --- /dev/null +++ b/code/datums/components/writing.dm @@ -0,0 +1,631 @@ +/datum/component/writing + /// Lazylist of raw, unsanitised, unparsed text inputs that have been made to the paper. + var/list/datum/paper_input/raw_text_inputs + /// Lazylist of all raw stamp data to be sent to tgui. + var/list/datum/paper_graphic/raw_graphic_data + /// Lazylist of all fields that have had some input added to them. + var/list/datum/paper_field/raw_field_input_data + + /// Helper cache that contains a list of all icon_states that are currently stamped on the paper. + var/list/graphic_cache + /// The number of input fields + var/input_field_count = 0 + /// Readable by blind people + var/braille + + /// Width of the TGUI window + var/window_width + /// Height of the TGUI window + var/window_height + /// Whether the TGUI window is resizable + var/resizable + /// List of asset datum typepaths used + var/list/asset_list + + /// Positioning for applied graphics (stamps, icons, etc) in tgui + var/list/graphics + +/datum/component/writing/Initialize( + raw_text, + braille = FALSE, + window_width = 420, + window_height = 500, + resizable = TRUE, + asset_list = list(/datum/asset/spritesheet/simple/paper), + ... +) + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + if(raw_text) + add_raw_text(raw_text) + src.window_width = window_width + src.window_height = window_height + src.asset_list = asset_list + src.resizable = resizable + src.braille = braille + + var/atom/parent_atom = parent + parent_atom.update_appearance() + return ..() + +/datum/component/writing/Destroy(force) + LAZYNULL(raw_text_inputs) + LAZYNULL(raw_graphic_data) + LAZYNULL(raw_field_input_data) + LAZYNULL(graphic_cache) + return ..() + +/datum/component/writing/RegisterWithParent() + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(handle_overlays)) + if(isitem(parent)) + RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_self)) + +/datum/component/writing/UnregisterFromParent() + if(isitem(parent)) + UnregisterSignal(parent, COMSIG_ITEM_ATTACK_SELF) + UnregisterSignal(parent, list(COMSIG_ATOM_EXAMINE, COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_UPDATE_OVERLAYS)) + +/datum/component/writing/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + if(!in_range(user, parent) && !isobserver(user)) + examine_list += span_warning("You're too far away to read it!") + return + + if(!braille && user.is_blind()) + to_chat(user, span_warning("You are blind and can't read anything!")) + return + + if(user.can_read(parent)) + INVOKE_ASYNC(src, PROC_REF(ui_interact), user) + return + examine_list += span_warning("You cannot read it!") + +/// Handles attackby interaction +/datum/component/writing/proc/on_attackby(datum/source, obj/item/attacking_item, mob/user, params) + SIGNAL_HANDLER + + var/atom/parent_atom = parent + + // Handle writing items. + var/writing_stats = istype(attacking_item) ? attacking_item.get_writing_implement_details() : null + + if(writing_stats?["interaction_mode"] == MODE_WRITING) + if(!user.can_write(attacking_item)) + return COMPONENT_NO_AFTERATTACK + if(get_total_length() >= MAX_PAPER_LENGTH) + to_chat(user, span_warning("This sheet of paper is full!")) + return COMPONENT_NO_AFTERATTACK + + INVOKE_ASYNC(src, PROC_REF(ui_interact), user) + return COMPONENT_NO_AFTERATTACK + + // Handle stamping items. + if(writing_stats?["interaction_mode"] == MODE_STAMPING) + if(!user.can_read(parent_atom) || user.is_blind()) + //The paper's stampable window area is assumed approx 400x500 + add_graphic(writing_stats["stamp_class"], rand(0, 400), rand(0, 500), rand(0, 360), writing_stats["stamp_icon_state"]) + user.visible_message(span_notice("[user] blindly stamps [parent_atom] with \the [attacking_item]!")) + to_chat(user, span_notice("You stamp [parent_atom] with \the [attacking_item] the best you can!")) + playsound(parent_atom, 'sound/items/handling/standard_stamp.ogg', 50, vary = TRUE) + else + to_chat(user, span_notice("You ready your stamp over [parent_atom]! ")) + INVOKE_ASYNC(src, PROC_REF(ui_interact), user) + return COMPONENT_NO_AFTERATTACK + + INVOKE_ASYNC(src, PROC_REF(ui_interact), user) + return NONE + +/// Handles attack self interaction +/datum/component/writing/proc/on_attack_self(datum/source, mob/user, list/modifiers) + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(ui_interact), user) + +/// Handles updating overlays +/datum/component/writing/proc/handle_overlays(obj/item/parent, list/overlays) + SIGNAL_HANDLER + + var/mutable_appearance/graphic_overlay + for(var/graphic_icon_state in graphic_cache) + graphic_overlay = mutable_appearance('icons/obj/bureaucracy.dmi', "paper_[graphic_icon_state]") + graphic_overlay.pixel_x = rand(-2, 2) + graphic_overlay.pixel_y = rand(-3, 2) + overlays += graphic_overlay + +/// Returns a deep copy list of raw_text_inputs, or null if the list is empty or doesn't exist. +/datum/component/writing/proc/copy_raw_text() + if(!LAZYLEN(raw_text_inputs)) + return null + + var/list/datum/paper_input/copy_text = list() + + for(var/datum/paper_input/existing_input as anything in raw_text_inputs) + copy_text += existing_input.make_copy() + + return copy_text + +/// Returns a deep copy list of raw_field_input_data, or null if the list is empty or doesn't exist. +/datum/component/writing/proc/copy_field_text() + if(!LAZYLEN(raw_field_input_data)) + return null + + var/list/datum/paper_field/copy_text = list() + + for(var/datum/paper_field/existing_input as anything in raw_field_input_data) + copy_text += existing_input.make_copy() + + return copy_text + +/// Returns a deep copy list of raw_stamp_data, or null if the list is empty or doesn't exist. Does not copy overlays or stamp_cache, only the tgui rendered stamps. +/datum/component/writing/proc/copy_raw_graphics() + if(!LAZYLEN(raw_graphic_data)) + return null + + var/list/datum/paper_field/copy_graphics = list() + + for(var/datum/paper_graphic/existing_input as anything in raw_graphic_data) + copy_graphics += existing_input.make_copy() + + return copy_graphics + +/** + * This proc duplicates all content to another component. + * + * Arguments + * * other_text - The other component to copy to. + * * colored - If true, the copied paper will be coloured and will inherit all colours. + * * greyscale_override - If set to a colour string and coloured is false, it will override the default of COLOR_WEBSAFE_DARK_GRAY when copying. + */ + +/datum/component/writing/proc/copy_to(datum/component/writing/other_text, colored = TRUE, greyscale_override = null) + other_text.raw_text_inputs = copy_raw_text() + other_text.raw_field_input_data = copy_field_text() + + if(!colored) + var/new_color = greyscale_override || COLOR_WEBSAFE_DARK_GRAY + for(var/datum/paper_input/text as anything in other_text.raw_text_inputs) + text.colour = new_color + + for(var/datum/paper_field/text as anything in other_text.raw_field_input_data) + text.field_data.colour = new_color + + other_text.input_field_count = input_field_count + other_text.raw_graphic_data = copy_raw_graphics() + other_text.graphic_cache = graphic_cache?.Copy() + +/* This simple helper adds the supplied raw text to the paper, appending to the end of any existing contents. + * + * This a God proc that does not care about paper max length and expects sanity checking beforehand if you want to respect it. + * + * The caller is expected to handle updating icons and appearance after adding text, to allow for more efficient batch adding loops. + * * Arguments: + * * text - The text to append to the component. + * * font - The font to use. + * * color - The font color to use. + * * bold - Whether this text should be rendered completely bold. + */ +/datum/component/writing/proc/add_raw_text(text, font, color, bold, advanced_html) + var/new_input_datum = new /datum/paper_input( + text, + font, + color, + bold, + advanced_html, + ) + + input_field_count += get_input_field_count(text) + + LAZYADD(raw_text_inputs, new_input_datum) + +/** + * This simple helper adds the supplied input field data to the paper. + * + * It will not overwrite any existing input field data by default and will early return FALSE if this scenario happens unless overwrite is + * set properly. + * + * Other than that, this is a God proc that does not care about max length or out-of-range IDs and expects sanity checking beforehand if + * you want to respect it. + * + * * Arguments: + * * field_id - The ID number of the field to which this data applies. + * * text - The text to append to the paper. + * * font - The font to use. + * * color - The font color to use. + * * bold - Whether this text should be rendered completely bold. + * * overwrite - If TRUE, will overwrite existing field ID's data if it exists. + */ +/datum/component/writing/proc/add_field_input(field_id, text, font, color, bold, signature_name, overwrite = FALSE) + var/datum/paper_field/field_data_datum = null + + var/is_signature = ((text == "%sign") || (text == "%s")) + + var/field_text = is_signature ? signature_name : text + var/field_font = is_signature ? SIGNATURE_FONT : font + + for(var/datum/paper_field/field_input in raw_field_input_data) + if(field_input.field_index == field_id) + if(!overwrite) + return FALSE + field_data_datum = field_input + break + + if(!field_data_datum) + var/new_field_input_datum = new /datum/paper_field( + field_id, + field_text, + field_font, + color, + bold, + is_signature, + ) + LAZYADD(raw_field_input_data, new_field_input_datum) + return TRUE + + var/new_input_datum = new /datum/paper_input( + field_text, + field_font, + color, + bold, + ) + + field_data_datum.field_data = new_input_datum; + field_data_datum.is_signature = is_signature; + + return TRUE + +/datum/component/writing/proc/get_input_field_count(raw_text) + var/static/regex/field_regex = new(@"\[_+\]","g") + + var/counter = 0 + while(field_regex.Find(raw_text)) + counter++ + + return counter + +/** + * This simple helper adds the supplied graphic to the paper, appending to the end of any existing graphics. + * + * This a God proc that does not care about graphic max count and expects sanity checking beforehand if you want to respect it. + * + * It does however respect the overlay limit and will not apply any overlays past the cap. + * + * The caller is expected to handle updating icons and appearance after adding text, to allow for more efficient batch adding loops. + * * Arguments: + * * graphic_class - Div class for the graphic. + * * graphic_x - X coordinate to render the graphic in tgui. + * * graphic_y - Y coordinate to render the graphic in tgui. + * * rotation - Degrees of rotation for the graphic to be rendered with in tgui. + * * graphic_icon_state - Icon state for the graphic as part of overlay rendering. + */ +/datum/component/writing/proc/add_graphic(graphic_class, graphic_x, graphic_y, rotation, graphic_icon_state) + var/new_graphic_datum = new /datum/paper_graphic(graphic_class, graphic_x, graphic_y, rotation) + LAZYADD(raw_graphic_data, new_graphic_datum); + + if(LAZYLEN(graphic_cache) > MAX_PAPER_GRAPHIC_OVERLAYS) + return + var/atom/parent_atom = parent + LAZYADD(graphic_cache, graphic_icon_state) + parent_atom.update_overlays() + +/datum/component/writing/proc/get_total_length() + var/total_length = 0 + for(var/datum/paper_input/entry as anything in raw_text_inputs) + total_length += length(entry.raw_text) + + return total_length + +/// Get a single string representing the text on a page +/datum/component/writing/proc/get_raw_text() + var/paper_contents = "" + for(var/datum/paper_input/line as anything in raw_text_inputs) + paper_contents += line.raw_text + "/" + return paper_contents + +// TGUI stuff - allows actually seeing the paper interface + +/datum/component/writing/ui_state(mob/user) + return parent.ui_state(user) + +/datum/component/writing/ui_status(mob/user, datum/ui_state/state) + if(!in_range(user, parent) && !isobserver(user)) + return UI_CLOSE + if(user.incapacitated(TRUE, TRUE) || (isobserver(user) && !check_rights_for(user.client, R_ADMIN))) + return UI_UPDATE + // Even harder to read if you're blind... unless it has braille! + // .. or if you cannot read + if(!braille && user.is_blind()) + to_chat(user, span_warning("You are blind and can't read anything!")) + return UI_CLOSE + if(!user.can_read(parent)) + return UI_CLOSE + // Get the parent atom's UI status + var/parent_status = parent.ui_status(user, state) + var/atom/parent_atom = parent + // If the paper is on an unwritable noticeboard + if(istype(parent_atom.loc, /obj/structure/noticeboard)) + var/obj/structure/noticeboard/noticeboard = parent_atom.loc + if(!noticeboard.allowed(user)) + parent_status = min(parent_status, UI_UPDATE) + return parent_status + +/datum/component/writing/ui_host() + return parent.ui_host() + +/datum/component/writing/ui_assets(mob/user) + var/list/ui_asset_list = list() + for(var/asset_type in asset_list) + ui_asset_list += get_asset_datum(asset_type) + return ui_asset_list + +/datum/component/writing/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + var/atom/parent_atom = parent + ui = new(user, src, "PaperSheet", parent_atom.name) + ui.open() + +/datum/component/writing/ui_static_data(mob/user) + var/list/static_data = list() + + var/atom/parent_atom = parent + + static_data["user_name"] = user.real_name + + static_data["raw_text_input"] = list() + for(var/datum/paper_input/text_input as anything in raw_text_inputs) + static_data["raw_text_input"] += list(text_input.to_list()) + + static_data["raw_field_input"] = list() + for(var/datum/paper_field/field_input as anything in raw_field_input_data) + static_data["raw_field_input"] += list(field_input.to_list()) + + static_data["raw_graphic_input"] = list() + for(var/datum/paper_graphic/graphic_input as anything in raw_graphic_data) + static_data["raw_graphic_input"] += list(graphic_input.to_list()) + + static_data["max_length"] = MAX_PAPER_LENGTH + static_data["max_input_field_length"] = MAX_PAPER_INPUT_FIELD_LENGTH + static_data["paper_color"] = parent_atom.color ? parent_atom.color : COLOR_WHITE + static_data["paper_name"] = parent_atom + static_data["paper_width"] = window_width + static_data["paper_height"] = window_height + static_data["paper_resizable"] = resizable + + static_data["default_pen_font"] = PEN_FONT + static_data["default_pen_color"] = COLOR_BLACK + static_data["signature_font"] = FOUNTAIN_PEN_FONT + + return static_data + +/datum/component/writing/ui_data(mob/user) + var/list/data = list() + if(!isliving(user)) + return data + + var/atom/parent_atom = parent + var/obj/item/holding = user.get_active_held_item() + // Use a clipboard's pen, if applicable + if(istype(parent_atom.loc, /obj/item/clipboard)) + var/obj/item/clipboard/clipboard = parent_atom.loc + // This is just so you can still use a stamp if you're holding one. Otherwise, it'll + // use the clipboard's pen, if applicable. + if(!istype(holding, /obj/item/stamp) && clipboard.pen) + holding = clipboard.pen + data["held_item_details"] = istype(holding) ? holding.get_writing_implement_details() : null + + return data + +/datum/component/writing/ui_act(action, params, datum/tgui/ui) + . = ..() + if(.) + return + + var/mob/user = ui.user + + var/atom/parent_atom = parent + + switch(action) + if("add_stamp") + var/obj/item/holding = user.get_active_held_item() + var/stamp_info = holding?.get_writing_implement_details() + if(!stamp_info || (stamp_info["interaction_mode"] != MODE_STAMPING)) + return TRUE + + var/stamp_class = stamp_info["stamp_class"]; + + // If the paper is on an unwritable noticeboard, this usually shouldn't be possible. + if(istype(parent_atom.loc, /obj/structure/noticeboard)) + var/obj/structure/noticeboard/noticeboard = parent_atom.loc + if(!noticeboard.allowed(user)) + log_paper("[key_name(user)] tried to add stamp to [parent_atom] when it was on an unwritable noticeboard: \"[stamp_class]\"") + return TRUE + + var/stamp_x = text2num(params["x"]) + var/stamp_y = text2num(params["y"]) + var/stamp_rotation = text2num(params["rotation"]) + var/stamp_icon_state = stamp_info["stamp_icon_state"] + + if (LAZYLEN(raw_graphic_data) >= MAX_PAPER_GRAPHICS) + to_chat(usr, pick("You try to stamp but you miss!", "There is no where else you can stamp!")) + return TRUE + + add_graphic(stamp_class, stamp_x, stamp_y, stamp_rotation, stamp_icon_state) + user.visible_message(span_notice("[user] stamps [parent_atom] with \the [holding.name]!"), span_notice("You stamp [parent_atom] with \the [holding.name]!")) + playsound(parent_atom, 'sound/items/handling/standard_stamp.ogg', 50, vary = TRUE) + parent_atom.update_appearance() + update_static_data_for_all_viewers() + return TRUE + if("add_text") + var/paper_input = params["text"] + var/this_input_length = length(paper_input) + + if(this_input_length == 0) + to_chat(user, pick("Writing block strikes again!", "You forgot to write anything!")) + return TRUE + + // If the paper is on an unwritable noticeboard, this usually shouldn't be possible. + if(istype(parent_atom.loc, /obj/structure/noticeboard)) + var/obj/structure/noticeboard/noticeboard = parent_atom.loc + if(!noticeboard.allowed(user)) + log_paper("[key_name(user)] tried to write to [parent_atom] when it was on an unwritable noticeboard: \"[paper_input]\"") + return TRUE + + var/obj/item/holding = user.get_active_held_item() + // Use a clipboard's pen, if applicable + if(istype(parent_atom.loc, /obj/item/clipboard)) + var/obj/item/clipboard/clipboard = parent_atom.loc + // This is just so you can still use a stamp if you're holding one. Otherwise, it'll + // use the clipboard's pen, if applicable. + if(!istype(holding, /obj/item/stamp) && clipboard.pen) + holding = clipboard.pen + + // As of the time of writing, can_write outputs a message to the user so we don't have to. + if(!user.can_write(holding)) + return TRUE + + var/current_length = get_total_length() + var/new_length = current_length + this_input_length + + // tgui should prevent this outcome. + if(new_length > MAX_PAPER_LENGTH) + log_paper("[key_name(user)] tried to write to [parent_atom] when it would exceed the length limit by [new_length - MAX_PAPER_LENGTH] characters: \"[paper_input]\"") + return TRUE + + // Safe to assume there are writing implement details as user.can_write(...) fails with an invalid writing implement. + var/writing_implement_data = holding.get_writing_implement_details() + + add_raw_text(paper_input, writing_implement_data["font"], writing_implement_data["color"], writing_implement_data["use_bold"], check_rights_for(user?.client, R_FUN)) + + log_paper("[key_name(user)] wrote to [parent_atom]: \"[paper_input]\"") + to_chat(user, "You have added to your paper masterpiece!"); + + update_static_data_for_all_viewers() + parent_atom.update_appearance() + return TRUE + if("fill_input_field") + // If the paper is on an unwritable noticeboard, this usually shouldn't be possible. + if(istype(parent_atom.loc, /obj/structure/noticeboard)) + var/obj/structure/noticeboard/noticeboard = parent_atom.loc + if(!noticeboard.allowed(user)) + log_paper("[key_name(user)] tried to write to the input fields of [parent_atom] when it was on an unwritable noticeboard!") + return TRUE + + var/obj/item/holding = user.get_active_held_item() + // Use a clipboard's pen, if applicable + if(istype(parent_atom.loc, /obj/item/clipboard)) + var/obj/item/clipboard/clipboard = parent_atom.loc + // This is just so you can still use a stamp if you're holding one. Otherwise, it'll + // use the clipboard's pen, if applicable. + if(!istype(holding, /obj/item/stamp) && clipboard.pen) + holding = clipboard.pen + + // As of the time of writing, can_write outputs a message to the user so we don't have to. + if(!user.can_write(holding)) + return TRUE + + // Safe to assume there are writing implement details as user.can_write(...) fails with an invalid writing implement. + var/writing_implement_data = holding.get_writing_implement_details() + var/list/field_data = params["field_data"] + + for(var/field_key in field_data) + var/field_text = field_data[field_key] + var/text_length = length(field_text) + if(text_length > MAX_PAPER_INPUT_FIELD_LENGTH) + log_paper("[key_name(user)] tried to write to field [field_key] with text over the max limit ([text_length] out of [MAX_PAPER_INPUT_FIELD_LENGTH]) with the following text: [field_text]") + return TRUE + if(text2num(field_key) >= input_field_count) + log_paper("[key_name(user)] tried to write to invalid field [field_key] (when the paper only has [input_field_count] fields) with the following text: [field_text]") + return TRUE + + if(!add_field_input(field_key, field_text, writing_implement_data["font"], writing_implement_data["color"], writing_implement_data["use_bold"], user.real_name)) + log_paper("[key_name(user)] tried to write to field [field_key] when it already has data, with the following text: [field_text]") + + update_static_data_for_all_viewers() + return TRUE + +/// A single instance of a saved raw input onto paper. +/datum/paper_input + /// Raw, unsanitised, unparsed text for an input. + var/raw_text = "" + /// Font to draw the input with. + var/font = "" + /// Colour to draw the input with. + var/colour = "" + /// Whether to render the font bold or not. + var/bold = FALSE + /// Whether the creator of this input field has the R_FUN permission, thus allowing less sanitization + var/advanced_html = FALSE + +/datum/paper_input/New(_raw_text, _font, _colour, _bold, _advanced_html) + raw_text = _raw_text + font = _font + colour = _colour + bold = _bold + advanced_html = _advanced_html + +/datum/paper_input/proc/make_copy() + return new /datum/paper_input(raw_text, font, colour, bold, advanced_html); + +/datum/paper_input/proc/to_list() + return list( + raw_text = raw_text, + font = font, + color = colour, + bold = bold, + advanced_html = advanced_html, + ) + +/// A single instance of a saved graphic on paper. +/datum/paper_graphic + /// Asset class of the for rendering in tgui + var/class = "" + /// X position of graphic. + var/graphic_x = 0 + /// Y position of stamp. + var/graphic_y = 0 + /// Rotation of stamp in degrees. 0 to 359. + var/rotation = 0 + +/datum/paper_graphic/New(_class, _graphic_x, _graphic_y, _rotation) + class = _class + graphic_x = _graphic_x + graphic_y = _graphic_y + rotation = _rotation + +/datum/paper_graphic/proc/make_copy() + return new /datum/paper_graphic(class, graphic_x, graphic_y, rotation) + +/datum/paper_graphic/proc/to_list() + return list( + class = class, + x = graphic_x, + y = graphic_y, + rotation = rotation, + ) + +/// A reference to some data that replaces a modifiable input field at some given index in paper raw input parsing. +/datum/paper_field + /// When tgui parses the raw input, if it encounters a field_index matching the nth user input field, it will disable it and replace it with the field_data. + var/field_index = -1 + /// The data that tgui should substitute in-place of the input field when parsing. + var/datum/paper_input/field_data = null + /// If TRUE, requests tgui to render this field input in a more signature-y style. + var/is_signature = FALSE + +/datum/paper_field/New(_field_index, raw_text, font, colour, bold, _is_signature) + field_index = _field_index + field_data = new /datum/paper_input(raw_text, font, colour, bold) + is_signature = _is_signature + +/datum/paper_field/proc/make_copy() + return new /datum/paper_field(field_index, field_data.raw_text, field_data.font, field_data.colour, field_data.bold, is_signature) + +/datum/paper_field/proc/to_list() + return list( + field_index = field_index, + field_data = field_data.to_list(), + is_signature = is_signature, + ) diff --git a/code/datums/elements/kneecapping.dm b/code/datums/elements/kneecapping.dm index 9df4782a0f5..975161c0d64 100644 --- a/code/datums/elements/kneecapping.dm +++ b/code/datums/elements/kneecapping.dm @@ -90,9 +90,10 @@ span_danger("You swing \the [weapon] at [target]'s kneecaps!"), ) - var/datum/wound/blunt/severe/severe_wound_type = /datum/wound/blunt/severe - var/datum/wound/blunt/critical/critical_wound_type = /datum/wound/blunt/critical - leg.receive_damage(brute = weapon.force, wound_bonus = rand(initial(severe_wound_type.threshold_minimum), initial(critical_wound_type.threshold_minimum) + 10)) + var/min_wound = leg.get_wound_threshold_of_wound_type(WOUND_BLUNT, WOUND_SEVERITY_SEVERE, return_value_if_no_wound = 30, wound_source = weapon) + var/max_wound = leg.get_wound_threshold_of_wound_type(WOUND_BLUNT, WOUND_SEVERITY_CRITICAL, return_value_if_no_wound = 50, wound_source = weapon) + + leg.receive_damage(brute = weapon.force, wound_bonus = rand(min_wound, max_wound + 10)) log_combat(attacker, target, "broke the kneecaps of", weapon) target.update_damage_overlays() attacker.do_attack_animation(target, used_item = weapon) diff --git a/code/datums/elements/robotic_heal.dm b/code/datums/elements/robotic_heal.dm new file mode 100644 index 00000000000..978efd5220d --- /dev/null +++ b/code/datums/elements/robotic_heal.dm @@ -0,0 +1,93 @@ +/datum/element/robotic_heal + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + /// Brute damage healed by the attached item. + var/brute_heal + /// Burn damage healed by the attached item. + var/burn_heal + /// Delay when self-repairing with this item. + var/self_delay + /// Delay when repairing others with this item. + var/other_delay + /// The message when using this item to heal. + var/heal_message + +/datum/element/robotic_heal/Attach(datum/target, brute_heal = 0, burn_heal = 0, self_delay = 3 SECONDS, other_delay = 1 SECONDS) + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + src.brute_heal = brute_heal + src.burn_heal = burn_heal + src.self_delay = self_delay + src.other_delay = other_delay + if(!heal_message) // This only needs to be set once for its first attached item + if(brute_heal && burn_heal) + heal_message = "dents and burnt wires in" + else if(brute_heal) + heal_message = "dents on" + else + heal_message = "burnt wires in" + RegisterSignal(target, COMSIG_ITEM_ATTACK, PROC_REF(on_item_attack)) + return ..() + +/datum/element/robotic_heal/Detach(datum/source, ...) + UnregisterSignal(source, COMSIG_ITEM_ATTACK) + return ..() + +/// Intercepts [mob/living/attack()] and tries to heal a robotic limb if possible. +/datum/element/robotic_heal/proc/on_item_attack(obj/item/tool, mob/living/patient, mob/user, params) + SIGNAL_HANDLER + + if(user.a_intent != INTENT_HELP) + return NONE + + if(!iscarbon(patient)) + return NONE + + var/obj/item/bodypart/part_to_repair = patient.get_bodypart(user.zone_selected) + if(!part_to_repair) + to_chat(user, span_warning("[patient]'s [parse_zone(user.zone_selected)] is missing!")) + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(!IS_ROBOTIC_LIMB(part_to_repair)) + to_chat(user, span_warning("[tool] can't repair this!")) + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(!(brute_heal && part_to_repair.brute_dam > 0) && !(burn_heal && part_to_repair.burn_dam > 0)) + to_chat(user, span_warning("[patient]'s [part_to_repair.plaintext_zone] is already in good condition!")) + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(part_to_repair.get_damage() <= part_to_repair.wound_integrity_loss) + to_chat(user, span_warning("[patient]'s [part_to_repair.plaintext_zone] cannot be repaired any further!")) + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(!patient.is_exposed(user)) + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(!tool.tool_start_check(user, patient, amount = 1)) + return COMPONENT_CANCEL_ATTACK_CHAIN + + user.visible_message( + span_notice("[user] starts to fix some of the [heal_message] [patient]'s [part_to_repair.plaintext_zone]"), + span_notice("You start to fix some of the [heal_message] [patient]'s [part_to_repair.plaintext_zone]."), + ) + + INVOKE_ASYNC(src, PROC_REF(item_heal_robotic), tool, patient, user, part_to_repair, patient == user ? self_delay : other_delay) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/** + * Heal a robotic body part on a mob + */ +/datum/element/robotic_heal/proc/item_heal_robotic(obj/item/tool, mob/living/carbon/patient, mob/user, obj/item/bodypart/part_to_repair, delay) + if(!tool.use_tool(patient, user, delay, amount = 1, volume = 50, extra_checks = CALLBACK(patient, TYPE_PROC_REF(/mob/living, is_exposed), user, user.zone_selected))) + return + + if(QDELETED(part_to_repair)) + to_chat(user, span_warning("[patient]'s [part_to_repair.plaintext_zone] is gone!")) + return + + part_to_repair.heal_damage(brute_heal, burn_heal, FALSE, BODYTYPE_ROBOTIC) + patient.update_damage_overlays() + user.visible_message( + span_notice("[user] fixes some of the [heal_message] [patient]'s [part_to_repair.plaintext_zone]."), + span_notice("You fix some of the [heal_message] [patient]'s [part_to_repair.plaintext_zone]"), + ) diff --git a/code/datums/elements/tool_flash.dm b/code/datums/elements/tool_flash.dm index 9912e072fe1..903127ddeeb 100644 --- a/code/datums/elements/tool_flash.dm +++ b/code/datums/elements/tool_flash.dm @@ -34,4 +34,4 @@ SIGNAL_HANDLER if(user && get_dist(get_turf(source), get_turf(user)) <= 1) - user.flash_act(min(flash_strength,1)) + user.flash_act(max(flash_strength, 1)) diff --git a/code/datums/mood_events/drug_events.dm b/code/datums/mood_events/drug_events.dm index fbff7d70b01..e504845ba4f 100644 --- a/code/datums/mood_events/drug_events.dm +++ b/code/datums/mood_events/drug_events.dm @@ -74,6 +74,11 @@ mood_change = 9 timeout = 3 MINUTES +/datum/mood_event/stimulant_light + description = span_nicegreen("I feel so light. So productive!") + mood_change = 2 + timeout = 3 MINUTES + /datum/mood_event/stimulant_medium description = span_nicegreen("I have so much energy! I feel like I could do anything!") mood_change = 4 @@ -84,6 +89,11 @@ mood_change = 6 timeout = 3 MINUTES +/datum/mood_event/stimulant_bad + description = span_boldwarning("Fuck. Need to move. Need to do something. I'm not doing enough. I'm not DOING ENOUGH!!") + mood_change = -10 + timeout = 6 MINUTES + /datum/mood_event/legion_good mood_change = 5 description = span_nicegreen("Everything feels so light! I'm strong! Unstoppable!") diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 0c016e7fc92..e8968170091 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -284,6 +284,11 @@ mood_change = -18 timeout = 3 MINUTES +/datum/mood_event/headache + description = span_warning("My head hurts....") + mood_change = -3 + timeout = 5 MINUTES + /datum/mood_event/bad_touch_bear_hug description = span_warning("I just got squeezed way too hard.") mood_change = -3 diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index dbc9578cfc1..c476b982091 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -63,7 +63,7 @@ if(!(timed_action_flags & IGNORE_USER_LOC_CHANGE)) RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) var/obj/mecha/mech = user.loc - if(ismecha(user.loc) && user == mech.occupant) + if(ismecha(user.loc) && user == mech.occupant && mech != target) RegisterSignal(mech, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) if(!(timed_action_flags & IGNORE_TARGET_LOC_CHANGE)) if(user != target) diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index f39fbc02c3f..e6565ecd923 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -26,6 +26,8 @@ var/token_icon_state = "ship_generic" /// The prefix of the ship's name. var/prefix = "ISV" + /// The class of this ship. + var/ship_class = "Ship" /// The name of the ship's manufacturer. var/manufacturer = "Unknown" /// The faction this ship belongs to. diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index f8fdf900459..f0455e32ee7 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -318,24 +318,34 @@ id = "neck_slice" status_type = STATUS_EFFECT_UNIQUE alert_type = null - duration = -1 + duration = STATUS_EFFECT_PERMANENT -/datum/status_effect/neck_slice/tick() - var/mob/living/carbon/human/H = owner - var/obj/item/bodypart/throat = H.get_bodypart(BODY_ZONE_HEAD) - if(H.stat == DEAD || !throat) - H.remove_status_effect(/datum/status_effect/neck_slice) +/datum/status_effect/neck_slice/on_apply() + if(!ishuman(owner)) + return FALSE + if(!owner.get_bodypart(BODY_ZONE_HEAD)) + return FALSE + return TRUE + +/datum/status_effect/neck_slice/tick(seconds_between_ticks) + var/obj/item/bodypart/throat = owner.get_bodypart(BODY_ZONE_HEAD) + if(owner.stat == DEAD || !throat) // they can lose their head while it's going. + qdel(src) + return var/still_bleeding = FALSE - for(var/datum/wound/W as anything in throat.wounds) - if(W.wound_type == WOUND_SLASH && W.severity > WOUND_SEVERITY_MODERATE) + for(var/datum/wound/bleeding_thing as anything in throat.wounds) + var/datum/wound_pregen_data/pregen_data = SSwounds.pregen_data[bleeding_thing.type] + + if(pregen_data.wounding_types_valid(throat, list(WOUND_SLASH)) && bleeding_thing.severity > WOUND_SEVERITY_MODERATE && bleeding_thing.blood_flow > 0) still_bleeding = TRUE break if(!still_bleeding) - H.remove_status_effect(/datum/status_effect/neck_slice) + qdel(src) + return if(prob(10)) - H.emote(pick("gasp", "gag", "choke")) + owner.emote(pick("gasp", "gag", "choke")) /mob/living/proc/apply_necropolis_curse(set_curse) var/datum/status_effect/necropolis_curse/C = has_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE) diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index b7aee1f2c51..f2e34a986a5 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -180,28 +180,20 @@ if(!no_protection) if(thermal_protection >= FIRE_IMMUNITY_MAX_TEMP_PROTECT) + SEND_SIGNAL(victim, COMSIG_CLEAR_MOOD_EVENT, "on_fire") return if(thermal_protection >= FIRE_SUIT_MAX_TEMP_PROTECT) + SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire) victim.adjust_bodytemperature(5.5 * seconds_between_ticks) return victim.adjust_bodytemperature((victim.dna.species.bodytemp_heating_rate_max + (stacks * 12)) * 0.5 * seconds_between_ticks) - victim.apply_damage((stacks * 0.5), FIRE, blocked = victim.run_armor_check(null, "fire", armour_penetration=stacks*5, silent=TRUE), spread_damage = TRUE) - if(SPT_PROB(20, seconds_between_ticks)) - var/obj/item/bodypart/it_burns = victim.get_bodypart(pick(BODY_ZONE_L_ARM,BODY_ZONE_L_LEG, BODY_ZONE_R_ARM, BODY_ZONE_R_LEG, BODY_ZONE_CHEST, BODY_ZONE_HEAD)) - if(it_burns) - var/datum/wound/burn_injury - switch(stacks) - if(1 to 3) - EMPTY_BLOCK_GUARD - if(3 to 7) - burn_injury = new /datum/wound/burn/moderate - if(7 to 14) - burn_injury = new /datum/wound/burn/severe - if(14 to 20) - burn_injury = new /datum/wound/burn/critical - if(burn_injury) - burn_injury.apply_wound(it_burns) + if(!victim.apply_damage((stacks * 0.5), BURN, blocked = victim.run_armor_check(null, FIRE, armour_penetration=stacks*5, silent=TRUE), spread_damage = TRUE)) + return + if(SPT_PROB(50, seconds_between_ticks)) + var/obj/item/bodypart/it_burns = victim.get_random_bodypart() + if(it_burns) // apply_damage doesn't cause wounds without a selected bodypart, so we do this manually here + it_burns.wound_roll(0, stacks * min(victim.bodytemperature / FIRE_MINIMUM_TEMPERATURE_TO_EXIST, 2), no_dismember = TRUE) SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire) /** diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm index 47e43ffc235..4455424202d 100644 --- a/code/datums/status_effects/wound_effects.dm +++ b/code/datums/status_effects/wound_effects.dm @@ -11,21 +11,39 @@ /datum/status_effect/determined/on_apply() . = ..() - owner.visible_message( - span_danger("[owner]'s body tenses up noticeably, gritting against [owner.p_their()] pain!"), - span_notice("Your senses sharpen as your body tenses up from the wounds you've sustained!"), - vision_distance = COMBAT_MESSAGE_RANGE, - ) + if(owner.mob_biotypes & MOB_ROBOTIC) + owner.visible_message( + span_danger("[owner]'s cooling fans spin up far louder than usual."), + span_notice("Acceptable damage threshold exceeded. Emergency self-preservation protocol initiated."), + vision_distance = COMBAT_MESSAGE_RANGE, + ) + else + owner.visible_message( + span_danger("[owner]'s body tenses up noticeably, gritting against [owner.p_their()] pain!"), + span_notice("Your senses sharpen as your body tenses up from the wounds you've sustained!"), + vision_distance = COMBAT_MESSAGE_RANGE, + ) if(ishuman(owner)) var/mob/living/carbon/human/human_owner = owner human_owner.physiology.bleed_mod *= WOUND_DETERMINATION_BLEED_MOD /datum/status_effect/determined/on_remove() - owner.visible_message( - span_danger("[owner]'s body slackens noticeably!"), - span_warning("Your adrenaline rush dies off, and the pain from your wounds come aching back in..."), - vision_distance = COMBAT_MESSAGE_RANGE, - ) + if(owner.mob_biotypes & MOB_ROBOTIC) + var/mob/living/carbon/carbon_owner = owner + if(!iscarbon(owner)) + stack_trace("Determination status effect applied to non-carbon [owner] of type [owner.type]") + carbon_owner = null + owner.visible_message( + span_danger("[owner]'s cooling fans suddenly quiet down."), + span_notice("Emergency self-preservation protocol concluded. [rand(2, 100 * LAZYLEN(carbon_owner?.all_wounds))] new errors to report."), + vision_distance = COMBAT_MESSAGE_RANGE, + ) + else + owner.visible_message( + span_danger("[owner]'s body slackens noticeably!"), + span_warning("Your adrenaline rush dies off, and the pain from your wounds come aching back in..."), + vision_distance = COMBAT_MESSAGE_RANGE, + ) if(ishuman(owner)) var/mob/living/carbon/human/human_owner = owner human_owner.physiology.bleed_mod /= WOUND_DETERMINATION_BLEED_MOD @@ -144,9 +162,9 @@ alert_type = NONE /datum/status_effect/wound/on_creation(mob/living/new_owner, incoming_wound) - . = ..() linked_wound = incoming_wound linked_limb = linked_wound.limb + return ..() /datum/status_effect/wound/on_remove() linked_wound = null @@ -166,67 +184,68 @@ if(W == linked_wound) qdel(src) -// bones -/datum/status_effect/wound/blunt +/datum/status_effect/wound/nextmove_modifier() + var/mob/living/carbon/status_owner = owner + + if(status_owner.get_active_hand() == linked_limb) + return linked_wound.get_action_delay_mult() + + return ..() -/datum/status_effect/wound/blunt/on_apply() +// bones +/datum/status_effect/wound/blunt/bone +/* +/datum/status_effect/wound/blunt/bone/on_apply() . = ..() - RegisterSignal(owner, COMSIG_MOB_SWAP_HANDS, PROC_REF(on_swap_hands)) - on_swap_hands() + if(.) + RegisterSignal(owner, COMSIG_MOB_SWAP_HANDS, PROC_REF(on_swap_hands)) + on_swap_hands() -/datum/status_effect/wound/blunt/on_remove() +/datum/status_effect/wound/blunt/bone/on_remove() . = ..() UnregisterSignal(owner, COMSIG_MOB_SWAP_HANDS) var/mob/living/carbon/wound_owner = owner - wound_owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/blunt_wound) + wound_owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/status_effect/blunt_wound) -/datum/status_effect/wound/blunt/proc/on_swap_hands() +/datum/status_effect/wound/blunt/bone/proc/on_swap_hands() SIGNAL_HANDLER var/mob/living/carbon/wound_owner = owner if(wound_owner.get_active_hand() == linked_limb) - wound_owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/blunt_wound, (linked_wound.interaction_efficiency_penalty - 1)) + wound_owner.add_actionspeed_modifier(/datum/actionspeed_modifier/status_effect/blunt_wound, (linked_wound.interaction_efficiency_penalty - 1)) else - wound_owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/blunt_wound) - -/datum/status_effect/wound/blunt/nextmove_modifier() - var/mob/living/carbon/C = owner - - if(C.get_active_hand() == linked_limb) - return linked_wound.interaction_efficiency_penalty - - return 1 - + wound_owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/status_effect/blunt_wound) +*/ // blunt -/datum/status_effect/wound/blunt/moderate +/datum/status_effect/wound/blunt/bone/moderate id = "disjoint" -/datum/status_effect/wound/blunt/severe +/datum/status_effect/wound/blunt/bone/severe id = "hairline" -/datum/status_effect/wound/blunt/critical +/datum/status_effect/wound/blunt/bone/critical id = "compound" // slash -/datum/status_effect/wound/slash/moderate +/datum/status_effect/wound/slash/flesh/moderate id = "abrasion" -/datum/status_effect/wound/slash/severe +/datum/status_effect/wound/slash/flesh/severe id = "laceration" -/datum/status_effect/wound/slash/critical +/datum/status_effect/wound/slash/flesh/critical id = "avulsion" // pierce -/datum/status_effect/wound/pierce/moderate +/datum/status_effect/wound/pierce/bleed/moderate id = "breakage" -/datum/status_effect/wound/pierce/severe +/datum/status_effect/wound/pierce/bleed/severe id = "puncture" -/datum/status_effect/wound/pierce/critical +/datum/status_effect/wound/pierce/bleed/critical id = "rupture" // burns -/datum/status_effect/wound/burn/moderate +/datum/status_effect/wound/burn/flesh/moderate id = "seconddeg" -/datum/status_effect/wound/burn/severe +/datum/status_effect/wound/burn/flesh/severe id = "thirddeg" -/datum/status_effect/wound/burn/critical +/datum/status_effect/wound/burn/flesh/critical id = "fourthdeg" // muscle diff --git a/code/datums/wounds/_wound_static_data.dm b/code/datums/wounds/_wound_static_data.dm new file mode 100644 index 00000000000..df5a146d162 --- /dev/null +++ b/code/datums/wounds/_wound_static_data.dm @@ -0,0 +1,188 @@ +/// 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 + /// The typepath of the wound we will be handling and storing data of. NECESSARY IF THIS IS A NON-ABSTRACT TYPE! + var/datum/wound/wound_path_to_generate + + /// Will this be instantiated? + var/abstract = FALSE + + /// If true, our wound can be selected in ordinary wound rolling. If this is set to false, our wound can only be directly instantiated by use of specific typepath. + var/can_be_randomly_generated = TRUE + + /// A list of biostates a limb must have to receive our wound, in wounds.dm. + var/required_limb_biostate + /// If false, we will check if the limb has all of our required biostates instead of just any. + var/require_any_biostate = FALSE + + /// If false, we will iterate through wounds on a given limb, and if any match our type, we wont add our wound. + var/duplicates_allowed = FALSE + + /// If we require BIO_BLOODED, we will not add our wound if this is true and the limb cannot bleed. + var/ignore_cannot_bleed = TRUE // a lot of bleed wounds should still be applied for purposes of mangling flesh + + /// A list of bodyzones this is incompatible with. + var/list/excluded_zones = list() + + /// The types of attack that can generate this wound. E.g. WOUND_SLASH = A sharp attack can cause this, WOUND_BLUNT = an attack with no sharpness/an attack with sharpness against a limb with mangled exterior can cause this. + var/list/required_wounding_types + /// [required_wounding_types] but requires the associated anatomy to be mangled first. + var/list/mangled_wounding_types + /// If true, this wound can only be generated by all [required_wounding_types] at once, not just any. + var/match_all_wounding_types = FALSE + + /// The weight that will be used if, by the end of wound selection, there are multiple valid wounds. This will be inserted into pick_weight, so use integers. + var/weight = WOUND_DEFAULT_WEIGHT + + /// The minimum injury roll a attack must get to generate us. Affected by our wound's threshold_penalty and series_threshold_penalty, as well as the attack's wound_bonus. See check_wounding_mods(). + var/threshold_minimum + + /// The series of wounds this is in. See wounds.dm (the defines file) for a more detailed explanation - but tldr is that no 2 wounds of the same series can be on a limb. + var/wound_series + + /// If true, we will attempt to, during a random wound roll, overpower and remove other wound typepaths from the possible wounds list using [competition_mode] and [overpower_wounds_of_even_severity]. + var/compete_for_wounding = TRUE + /// The competition mode with which we will remove other wounds from a possible wound roll assuming [compete_for_wounding] is TRUE. See wounds.dm, the defines file, for more information on what these do. + var/competition_mode = WOUND_COMPETITION_OVERPOWER_LESSERS + /// If this and [compete_for_wounding] is true, we will remove wounds of an even severity to us during a random wound roll. + var/overpower_wounds_of_even_severity = FALSE + + +/datum/wound_pregen_data/New() + . = ..() + + if (!abstract) + if (required_limb_biostate == null) + stack_trace("required_limb_biostate null - please set it! occured on: [src.type]") + if (wound_path_to_generate == null) + stack_trace("wound_path_to_generate null - please set it! occured on: [src.type]") + +// this proc is the primary reason this datum exists - a singleton instance so we can always run this proc even without the wound existing +/** + * Args: + * * obj/item/bodypart/limb: The limb we are considering. + * * wound_type: The type of the "wound acquisition attempt". Example: A slashing attack cannot proc a blunt wound, so wound_type = WOUND_SLASH would + * fail if we expect WOUND_BLUNT. Defaults to the wound type we expect. + * * datum/wound/old_wound: If we would replace a wound, this would be said wound. Nullable. + * * 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 wound_type is not ours, 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. + * 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) + SHOULD_BE_PURE(TRUE) + + if(!istype(limb) || !limb.owner) + return FALSE + + if(random_roll && !can_be_randomly_generated) + return FALSE + + if(HAS_TRAIT(limb.owner, TRAIT_NEVER_WOUNDED) || (limb.owner.status_flags & GODMODE)) + return FALSE + + if(!wounding_types_valid(limb, suggested_wounding_types)) + return FALSE + + if(care_about_existing_wounds) + for(var/datum/wound/preexisting_wound as anything in limb.wounds) + var/datum/wound_pregen_data/pregen_data = SSwounds.pregen_data[preexisting_wound.type] + if(pregen_data.wound_series == wound_series) + if(preexisting_wound.severity >= wound_path_to_generate::severity) + return FALSE + + if(!ignore_cannot_bleed && ((required_limb_biostate & BIO_BLOODED) && !limb.can_bleed())) + return FALSE + + if(!biostate_valid(limb.biological_state)) + return FALSE + + if(limb.body_zone in excluded_zones) + return FALSE + + // we accept promotions and demotions, but no point in redundancy. This should have already been checked wherever the wound was rolled and applied for (see: bodypart damage code), but we do an extra check + // in case we ever directly add wounds + if(!duplicates_allowed) + for (var/datum/wound/preexisting_wound as anything in limb.wounds) + if (preexisting_wound.type == wound_path_to_generate && (preexisting_wound != old_wound)) + return FALSE + return TRUE + +/// Returns true if we have the given biostates, or any biostate in it if check_for_any is true. False otherwise. +/datum/wound_pregen_data/proc/biostate_valid(biostate) + if (require_any_biostate) + if (!(biostate & required_limb_biostate)) + return FALSE + else if (!((biostate & required_limb_biostate) == required_limb_biostate)) // check for all + return FALSE + + return TRUE + +/** + * A simple getter for [weight], with arguments supplied to allow custom behavior. + * + * Args: + * * obj/item/bodypart/limb: The limb we are contemplating being added to. Nullable. + * * list/wounding_types: The amount of damage for each wounding type. Nullable. + * * attack_direction: The direction of the attack that'd cause us. Nullable. + * * damage_source: The entity that would cause us. Nullable. + * + * Returns: + * Our weight. + */ +/datum/wound_pregen_data/proc/get_weight(obj/item/bodypart/limb, list/wounding_types, attack_direction, damage_source) + return weight + +/// Returns TRUE if we use WOUND_ALL, or we require all types and have all/if we require any and have any, FALSE otherwise. +/datum/wound_pregen_data/proc/wounding_types_valid(obj/item/bodypart/limb, list/suggested_wounding_types) + if (WOUND_ALL in required_wounding_types) + return TRUE + if (!length(suggested_wounding_types)) + return FALSE + + for(var/iter_wounding_type as anything in suggested_wounding_types) + if(!(iter_wounding_type in required_wounding_types)) + if(match_all_wounding_types) + return FALSE + else + if(!match_all_wounding_types) + return TRUE + + if(LAZYLEN(mangled_wounding_types)) + var/mangled_state = limb.get_mangled_state() + for(var/iter_mangled_type as anything in mangled_wounding_types) + if(mangled_state & mangled_wounding_types[iter_mangled_type]) + return TRUE + + return match_all_wounding_types // if we get here, we've matched everything + +/** + * A simple getter for [threshold_minimum], with arguments supplied to allow custom behavior. + * + * Args: + * * obj/item/bodypart/part: The limb we are contemplating being added to. + * * attack_direction: The direction of the attack that'd generate us. Nullable. + * * damage_source: The source of the damage that'd cause us. Nullable. + */ +/datum/wound_pregen_data/proc/get_threshold_for(obj/item/bodypart/part, attack_direction, damage_source) + return threshold_minimum + +/// Returns a new instance of our wound datum. +/datum/wound_pregen_data/proc/generate_instance(obj/item/bodypart/limb, ...) + RETURN_TYPE(/datum/wound) + + return new wound_path_to_generate + +/datum/wound_pregen_data/Destroy(force, ...) + var/error_message = "[src], a singleton wound pregen data instance, was destroyed! This should not happen!" + if (force) + error_message += " NOTE: This Destroy() was called with force == TRUE. This instance will be deleted and replaced with a new one." + stack_trace(error_message) + + if (!force) + return QDEL_HINT_LETMELIVE + + . = ..() + + SSwounds.pregen_data[wound_path_to_generate] = new src.type //recover diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index 88480101f5c..5e35e6aab11 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -13,6 +13,13 @@ deciding what specific wound will be applied. I'd like to have a few different types of wounds for at least some of the choices, but I'm just doing rough generals for now. Expect polishing */ +#define WOUND_CRITICAL_BLUNT_DISMEMBER_BONUS 15 + +// Applied into wounds when they're scanned with the wound analyzer, halves time to treat them manually. +#define TRAIT_WOUND_SCANNED "wound_scanned" +// I dunno lol +#define ANALYZER_TRAIT "analyzer_trait" + /datum/wound /// What it's named var/name = "Wound" @@ -29,25 +36,25 @@ var/occur_text = "" /// This sound will be played upon the wound being applied var/sound_effect + /// The volume of [sound_effect] + var/sound_volume = 70 - /// Either WOUND_SEVERITY_TRIVIAL, WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_SEVERE, WOUND_SEVERITY_CRITICAL, WOUND_SEVERITY_LOSS - var/severity = WOUND_SEVERITY_MODERATE - /// The list of wounds it belongs in, WOUND_BLUNT, WOUND_SLASH, WOUND_BURN, WOUND_MUSCLE - var/wound_type + /// Either WOUND_SEVERITY_TRIVIAL, WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_SEVERE, WOUND_SEVERITY_CRITICAL, WOUND_SEVERITY_LOSS. FALSE prevents it from rolling. + var/severity = FALSE - /// What body zones can we affect - var/list/viable_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + /// What body zones can we NOT affect + var/list/excluded_zones = list() /// Who owns the body part that we're wounding var/mob/living/carbon/victim = null - /// The bodypart we're parented to + /// The bodypart we're parented to. Not guaranteed to be non-null, especially after/during removal or if we haven't been applied var/obj/item/bodypart/limb = null /// Specific items such as bandages or sutures that can try directly treating this wound var/list/treatable_by /// Specific items such as bandages or sutures that can try directly treating this wound only if the user has the victim in an aggressive grab or higher var/list/treatable_by_grabbed - /// Tools with the specified tool flag will also be able to try directly treating this wound - var/treatable_tool + /// Any tools with any of the flags in this list will be usable to try directly treating this wound + var/list/treatable_tools /// How long it will take to treat this wound with a standard effective tool, assuming it doesn't need surgery var/base_treat_time = 3 SECONDS @@ -55,6 +62,8 @@ var/interaction_efficiency_penalty = 1 /// Incoming damage on this limb will be multiplied by this, to simulate tenderness and vulnerability (mostly burns). var/damage_mulitplier_penalty = 1 + /// The proportion of damage on this limb that cannot be healed until this wound is removed (0-1). + var/limb_integrity_penalty = 0 /// If set and this wound is applied to a leg, we take this many deciseconds extra per step on this leg var/limp_slowdown /// If this wound has a limp_slowdown and is applied to a leg, it has this chance to limp each step @@ -62,10 +71,10 @@ /// How much we're contributing to this limb's bleed_rate var/blood_flow - /// The minimum we need to roll on [/obj/item/bodypart/proc/check_wounding] to begin suffering this wound, see check_wounding_mods() for more - var/threshold_minimum /// How much having this wound will add to all future check_wounding() rolls on this limb, to allow progression to worse injuries with repeated damage var/threshold_penalty + /// How much having this wound will add to all future check_wounding() rolls on this limb, but only for wounds of its own series + var/series_threshold_penalty = 0 /// If we need to process each life tick var/processes = FALSE @@ -78,23 +87,25 @@ var/datum/status_effect/linked_status_effect /// If we're operating on this wound and it gets healed, we'll nix the surgery too var/datum/surgery/attached_surgery - /// if you're a lazy git and just throw them in cryo, the wound will go away after accumulating severity * 25 power - var/cryo_progress + /// if you're a lazy git and just throw them in cryo, the wound will go away after accumulating severity * [base_regen_progress_to_qdel] power + var/regen_progress + + /// The base amount of [regen_progress] required to have ourselves fully healed by cryo. Multiplied against severity. + var/base_regen_progress_to_qdel = 33 /// If we forced this wound through badmin smite, we won't count it towards the round totals var/from_smite + /// The biological state required for this wound to be applied + var/bio_state_required = BIO_BONE | BIO_FLESH /// What flags apply to this wound - var/wound_flags = (FLESH_WOUND | BONE_WOUND | ACCEPTS_GAUZE) + var/wound_flags = ACCEPTS_GAUZE /datum/wound/Destroy() - if(attached_surgery) - QDEL_NULL(attached_surgery) + QDEL_NULL(attached_surgery) // destroy can call remove_wound() and remove_wound() calls qdel, so we check to make sure there's anything to remove first - if(limb?.wounds && (src in limb.wounds)) + if(limb) remove_wound() - set_limb(null) - victim = null return ..() /** @@ -109,25 +120,11 @@ * * attack_direction: For bloodsplatters, if relevant */ /datum/wound/proc/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE, attack_direction = null) - if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || !IS_ORGANIC_LIMB(L) || HAS_TRAIT(L.owner, TRAIT_NEVER_WOUNDED)) + if(!can_be_applied_to(L, old_wound)) qdel(src) - return + return FALSE - if(ishuman(L.owner)) - var/mob/living/carbon/human/H = L.owner - if(((wound_flags & BONE_WOUND) && !(HAS_BONE in H.dna.species.species_traits)) || ((wound_flags & FLESH_WOUND) && !(HAS_FLESH in H.dna.species.species_traits))) - qdel(src) - return - - // we accept promotions and demotions, but no point in redundancy. This should have already been checked wherever the wound was rolled and applied for (see: bodypart damage code), but we do an extra check - // in case we ever directly add wounds - for(var/i in L.wounds) - var/datum/wound/preexisting_wound = i - if((preexisting_wound.type == type) && (preexisting_wound != old_wound)) - qdel(src) - return - - victim = L.owner + set_victim(L.owner) set_limb(L) LAZYADD(victim.all_wounds, src) LAZYADD(limb.wounds, src) @@ -152,7 +149,7 @@ var/msg = span_danger("[victim]'s [limb.name] [occur_text]!") var/vis_dist = COMBAT_MESSAGE_RANGE - if(severity != WOUND_SEVERITY_MODERATE) + if(severity > WOUND_SEVERITY_MODERATE) msg = "[msg]" vis_dist = DEFAULT_MESSAGE_RANGE @@ -162,27 +159,119 @@ vision_distance = vis_dist, ) if(sound_effect) - playsound(L.owner, sound_effect, 70 + 20 * severity, TRUE) + playsound(L.owner, sound_effect, sound_volume + (20 * severity), TRUE) wound_injury(old_wound, attack_direction = attack_direction) if(!demoted) second_wind() + return TRUE + +/// Returns TRUE if we can be applied to the limb. +/datum/wound/proc/can_be_applied_to(obj/item/bodypart/limb, datum/wound/old_wound) + var/datum/wound_pregen_data/pregen_data = SSwounds.pregen_data[type] + + // We assume we aren't being randomly applied - we have no reason to believe we are + // And, besides, if we were, you could just as easily check our pregen data rather than run this proc + // Generally speaking this proc is called in apply_wound, which is called when the caller is already confidant in its ability to be applied + return pregen_data.can_be_applied_to(limb, old_wound = old_wound) + +/// Returns the zones we can be applied to. +/datum/wound/proc/get_excluded_zones() + var/datum/wound_pregen_data/pregen_data = SSwounds.pregen_data[type] + + return pregen_data.excluded_zones + +/// Returns the biostate we require to be applied. +/datum/wound/proc/get_required_biostate() + var/datum/wound_pregen_data/pregen_data = SSwounds.pregen_data[type] + + return pregen_data.required_limb_biostate + +/datum/wound/proc/null_victim() + SIGNAL_HANDLER + set_victim(null) + +/// Setter for [victim]. Should completely transfer signals, attributes, etc. To the new victim - if there is any, as it can be null. +/datum/wound/proc/set_victim(new_victim) + if(victim) + UnregisterSignal(victim, COMSIG_QDELETING) + + remove_wound_from_victim() + victim = new_victim + if(victim) + RegisterSignal(victim, COMSIG_QDELETING, PROC_REF(null_victim)) + +/// Proc called to change the variable `limb` and react to the event. +/datum/wound/proc/set_limb(obj/item/bodypart/new_value, replaced = FALSE) + if(limb == new_value) + return FALSE //Limb can either be a reference to something or `null`. Returning the number variable makes it clear no change was made. + . = limb + if(limb) // if we're nulling limb, we're basically detaching from it, so we should remove ourselves in that case + UnregisterSignal(limb, COMSIG_QDELETING) + if(wound_flags & ACCEPTS_GAUZE) + UnregisterSignal(limb, list(COMSIG_BODYPART_GAUZED, COMSIG_BODYPART_GAUZE_DESTROYED)) + if(wound_flags & ACCEPTS_SPLINT) + UnregisterSignal(limb, list(COMSIG_BODYPART_SPLINTED, COMSIG_BODYPART_SPLINT_DESTROYED)) + LAZYREMOVE(limb.wounds, src) + limb.update_wounds(replaced) + if (disabling) + limb.remove_traits(list(TRAIT_PARALYSIS, TRAIT_DISABLED_BY_WOUND), REF(src)) + + limb = new_value + + // POST-CHANGE + + if (limb) + RegisterSignal(limb, COMSIG_QDELETING, PROC_REF(source_died)) + if(wound_flags & ACCEPTS_GAUZE) + RegisterSignals(limb, list(COMSIG_BODYPART_GAUZED, COMSIG_BODYPART_GAUZE_DESTROYED), PROC_REF(gauze_state_changed)) + if(wound_flags & ACCEPTS_SPLINT) + RegisterSignals(limb, list(COMSIG_BODYPART_SPLINTED, COMSIG_BODYPART_SPLINT_DESTROYED), PROC_REF(splint_state_changed)) + if (disabling) + limb.add_traits(list(TRAIT_PARALYSIS, TRAIT_DISABLED_BY_WOUND), REF(src)) + + if (victim) + start_limping_if_we_should() // the status effect already handles removing itself + + update_inefficiencies() + +/datum/wound/proc/start_limping_if_we_should() + if ((limb.body_zone == BODY_ZONE_L_LEG || limb.body_zone == BODY_ZONE_R_LEG) && limp_slowdown > 0 && limp_chance > 0) + victim.apply_status_effect(/datum/status_effect/limp) + +/// Deletes the wound if its attached limb is deleted. +/datum/wound/proc/source_died() + 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 /datum/wound/proc/remove_wound(ignore_limb, replaced = FALSE) //TODO: have better way to tell if we're getting removed without replacement (full heal) + var/old_victim = victim + var/old_limb = limb + set_disabling(FALSE) if(victim) - LAZYREMOVE(victim.all_wounds, src) - if(!victim.all_wounds) - victim.clear_alert("wound") - SEND_SIGNAL(victim, COMSIG_CARBON_LOSE_WOUND, src, limb) + remove_wound_from_victim() if(limb && !ignore_limb) - LAZYREMOVE(limb.wounds, src) - limb.update_wounds(replaced) + 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 (ismob(old_victim)) + var/mob/mob_victim = old_victim + SEND_SIGNAL(mob_victim, COMSIG_CARBON_POST_LOSE_WOUND, src, old_limb, ignore_limb, replaced) + +/datum/wound/proc/remove_wound_from_victim() + if(!victim) + return + LAZYREMOVE(victim.all_wounds, src) + if(!victim.all_wounds) + victim.clear_alert("wound") + SEND_SIGNAL(victim, COMSIG_CARBON_LOSE_WOUND, src, limb) /** * replace_wound() is used when you want to replace the current wound with a new wound, presumably of the same category, just of a different severity (either up or down counts) @@ -190,13 +279,13 @@ * This proc actually instantiates the new wound based off the specific type path passed, then returns the new instantiated wound datum. * * Arguments: - * * new_type - The TYPE PATH of the wound you want to replace this, like /datum/wound/slash/severe + * * new_wound - The wound instance you want to replace this * * smited - If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented) */ -/datum/wound/proc/replace_wound(new_type, smited = FALSE, attack_direction = attack_direction) - var/datum/wound/new_wound = new new_type - remove_wound(replaced=TRUE) - new_wound.apply_wound(limb, old_wound = src, smited = smited, attack_direction = attack_direction) +/datum/wound/proc/replace_wound(datum/wound/new_wound, smited = FALSE, attack_direction = attack_direction) + var/obj/item/bodypart/cached_limb = limb // remove_wound() nulls limb so we have to track it locally + remove_wound(replaced = new_wound) + new_wound.apply_wound(cached_limb, old_wound = src, smited = smited, attack_direction = attack_direction) . = new_wound qdel(src) @@ -204,21 +293,6 @@ /datum/wound/proc/wound_injury(datum/wound/old_wound = null, attack_direction = null) return -/// Proc called to change the variable `limb` and react to the event. -/datum/wound/proc/set_limb(new_value) - if(limb == new_value) - return FALSE //Limb can either be a reference to something or `null`. Returning the number variable makes it clear no change was made. - . = limb - limb = new_value - if(. && disabling) - var/obj/item/bodypart/old_limb = . - REMOVE_TRAIT(old_limb, TRAIT_PARALYSIS, REF(src)) - REMOVE_TRAIT(old_limb, TRAIT_DISABLED_BY_WOUND, REF(src)) - if(limb) - if(disabling) - ADD_TRAIT(limb, TRAIT_PARALYSIS, REF(src)) - ADD_TRAIT(limb, TRAIT_DISABLED_BY_WOUND, REF(src)) - /// Proc called to change the variable `disabling` and react to the event. /datum/wound/proc/set_disabling(new_value) if(disabling == new_value) @@ -235,6 +309,65 @@ if(limb?.can_be_disabled) limb.update_disabled() +/// Setter for [interaction_efficiency_penalty]. Updates the actionspeed of our actionspeed mod. +/datum/wound/proc/set_interaction_efficiency_penalty(new_value) + //var/should_update = (new_value != interaction_efficiency_penalty) + + interaction_efficiency_penalty = new_value + + /*if (should_update) + update_actionspeed_modifier()*/ + +/// Returns a "adjusted" interaction_efficiency_penalty that will be used for the actionspeed mod. +/datum/wound/proc/get_effective_actionspeed_modifier() + return interaction_efficiency_penalty - 1 + +/// Returns the decisecond multiplier of any click interactions, assuming our limb is being used. +/datum/wound/proc/get_action_delay_mult() + SHOULD_BE_PURE(TRUE) + + return interaction_efficiency_penalty + +/// Returns the decisecond increment of any click interactions, assuming our limb is being used. +/datum/wound/proc/get_action_delay_increment() + SHOULD_BE_PURE(TRUE) + + return 0 + +/// Signal proc for if gauze has been applied or removed from our limb. +/datum/wound/proc/gauze_state_changed() + SIGNAL_HANDLER + +/// Signal proc for if a splint has been applied or removed from our limb. +/datum/wound/proc/splint_state_changed() + SIGNAL_HANDLER + + if (wound_flags & ACCEPTS_SPLINT) + update_inefficiencies() + +/// Updates our limping and interaction penalties in accordance with our gauze. +/datum/wound/proc/update_inefficiencies() + if (wound_flags & ACCEPTS_SPLINT) + if(limb.body_zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) + if(limb.current_splint?.splint_factor) + limp_slowdown = initial(limp_slowdown) * limb.current_splint.splint_factor + limp_chance = initial(limp_chance) * limb.current_splint.splint_factor + else + limp_slowdown = initial(limp_slowdown) + limp_chance = initial(limp_chance) + else if(limb.body_zone in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + if(limb.current_splint?.splint_factor) + set_interaction_efficiency_penalty(1 + ((get_effective_actionspeed_modifier()) * limb.current_splint.splint_factor)) + else + set_interaction_efficiency_penalty(initial(interaction_efficiency_penalty)) + + if(initial(disabling)) + set_disabling(!limb.current_splint) + + limb.update_wounds() + + start_limping_if_we_should() + /// Additional beneficial effects when the wound is gained, in case you want to give a temporary boost to allow the victim to try an escape or last stand /datum/wound/proc/second_wind() switch(severity) @@ -268,37 +401,39 @@ if(QDELETED(I) || limb.body_zone != user.zone_selected || (I.force && user.a_intent != INTENT_HELP)) return FALSE - var/allowed = FALSE - - // check if we have a valid treatable tool - if(I.tool_behaviour == treatable_tool) - allowed = TRUE - else if(treatable_tool == TOOL_CAUTERY && I.get_temperature() && user == victim) // allow improvised cauterization on yourself without an aggro grab - allowed = TRUE - // failing that, see if we're aggro grabbing them and if we have an item that works for aggro grabs only - else if(user.pulling == victim && user.grab_state >= GRAB_AGGRESSIVE && check_grab_treatments(I, user)) - allowed = TRUE - // failing THAT, we check if we have a generally allowed item - else - for(var/allowed_type in treatable_by) - if(istype(I, allowed_type)) - allowed = TRUE - break - - // if none of those apply, we return false to avoid interrupting - if(!allowed) + if(!item_can_treat(I, user)) return FALSE + // now that we've determined we have a valid attempt at treating, we can stomp on their dreams if we're already interacting with the patient or if their part is obscured + if(DOING_INTERACTION_WITH_TARGET(user, victim)) + to_chat(user, span_warning("You're already interacting with [victim]!")) + return TRUE + // next we check if the bodypart in actually accessible (not under thick clothing). We skip the species trait check since skellies // & such may need to use bone gel but may be wearing a space suit for..... whatever reason a skeleton would wear a space suit for if(ishuman(victim)) var/mob/living/carbon/human/victim_human = victim - if(!victim_human.can_inject(user, injection_flags = INJECT_CHECK_IGNORE_SPECIES)) + if(!victim_human.try_inject(user, injection_flags = INJECT_CHECK_IGNORE_SPECIES | INJECT_TRY_SHOW_ERROR_MESSAGE)) return TRUE // lastly, treat them - treat(I, user) - return TRUE + return treat(I, user) // we allow treat to return a value so it can control if the item does its normal interaction or not + +/// Returns TRUE if the item can be used to treat our wounds. Hooks into treat() - only things that return TRUE here may be used there. +/datum/wound/proc/item_can_treat(obj/item/potential_treater, mob/user) + // check if we have a valid treatable tool + if(potential_treater.tool_behaviour in treatable_tools) + return TRUE + if((TOOL_CAUTERY in treatable_tools) && potential_treater.get_temperature() && user == victim) // allow improvised cauterization on yourself without an aggro grab + return TRUE + // failing that, see if we're aggro grabbing them and if we have an item that works for aggro grabs only + if(user.pulling == victim && user.grab_state >= GRAB_AGGRESSIVE && check_grab_treatments(potential_treater, user)) + return TRUE + // failing THAT, we check if we have a generally allowed item + for(var/allowed_type in treatable_by) + if(istype(potential_treater, allowed_type)) + return TRUE + return FALSE /// Return TRUE if we have an item that can only be used while aggro grabbed (unhanded aggro grab treatments go in [/datum/wound/proc/try_handling]). Treatment is still is handled in [/datum/wound/proc/treat] /datum/wound/proc/check_grab_treatments(obj/item/I, mob/user) @@ -321,15 +456,25 @@ return (!QDELETED(src) && limb) /// When our parent bodypart is hurt -/datum/wound/proc/receive_damage(wounding_type, wounding_dmg, wound_bonus, attack_direction) +/datum/wound/proc/receive_damage(list/wounding_types, total_wound_dmg, wound_bonus, attack_direction, damage_source) return /// Called from cryoxadone and pyroxadone when they're proc'ing. Wounds will slowly be fixed separately from other methods when these are in effect. crappy name but eh /datum/wound/proc/on_xadone(power) - cryo_progress += power - if(cryo_progress > 33 * severity) + regen_progress += power + return handle_regen_progress() + +/// Does various actions based on [regen_progress]. By default, qdeletes the wound past a certain threshold. +/datum/wound/proc/handle_regen_progress() + if(regen_progress > get_regen_progress_to_qdel()) qdel(src) +/// Returns the amount of [regen_progress] we need to be qdeleted. +/datum/wound/proc/get_regen_progress_to_qdel() + SHOULD_BE_PURE(TRUE) + + return base_regen_progress_to_qdel * severity + /// When synthflesh is applied to the victim, we call this. No sense in setting up an entire chem reaction system for wounds when we only care for a few chems. Probably will change in the future /datum/wound/proc/on_synthflesh(power) return @@ -377,8 +522,59 @@ * * mob/user: The user examining the wound's owner, if that matters */ /datum/wound/proc/get_examine_description(mob/user) - . = "[victim.p_their(TRUE)] [limb.name] [examine_desc]" - . = severity <= WOUND_SEVERITY_MODERATE ? "[.]." : "[.]!" + var/desc + + if((wound_flags & ACCEPTS_SPLINT) && limb.current_splint) + desc = "[victim.p_their()] [limb.name] is [get_sling_condition()] fastened with a [limb.current_splint.name]" + else if ((wound_flags & ACCEPTS_GAUZE) && limb.current_gauze) + desc = "[victim.p_their()] [limb.name] is [get_gauze_condition()] fastened in a sling of [limb.current_gauze.name]" + else + desc = "[victim.p_their()] [limb.name] [examine_desc]" + + desc = modify_desc_before_span(desc, user) + + return get_desc_intensity(desc) + +/// A hook proc used to modify desc before it is spanned via [get_desc_intensity]. Useful for inserting spans yourself. +/datum/wound/proc/modify_desc_before_span(desc, mob/user) + return desc + +/datum/wound/proc/get_gauze_condition() + SHOULD_BE_PURE(TRUE) + if (!limb.current_gauze) + return null + + switch(limb.current_gauze.absorption_capacity) + if(0 to 1.25) + return "just barely" + if(1.25 to 2.75) + return "loosely" + if(2.75 to 4) + return "mostly" + if(4 to INFINITY) + return "tightly" + +/datum/wound/proc/get_sling_condition() + SHOULD_BE_PURE(TRUE) + if (!limb.current_splint) + return null + + switch(limb.current_splint.sling_condition) + if(0 to 1.25) + return "just barely" + if(1.25 to 2.75) + return "loosely" + if(2.75 to 4) + return "mostly" + if(4 to INFINITY) + return "tightly" + +/// Spans [desc] based on our severity. +/datum/wound/proc/get_desc_intensity(desc) + SHOULD_BE_PURE(TRUE) + if (severity > WOUND_SEVERITY_MODERATE) + return span_bold("[desc]!") + return "[desc]." /datum/wound/proc/get_scanner_description(mob/user) return "Type: [name]\nSeverity: [severity_text()]\nDescription: [desc]\nRecommended Treatment: [treat_text]" @@ -394,6 +590,14 @@ if(WOUND_SEVERITY_CRITICAL) return "Critical" +/// Returns TRUE if our limb is the head or chest, FALSE otherwise. +/// Essential in the sense of "we cannot live without it". +/datum/wound/proc/limb_essential() + var/obj/item/organ/brain/victim_brain = victim?.getorganslot(ORGAN_SLOT_BRAIN) + if(victim_brain && limb.body_zone == victim_brain.zone) // IPCs don't need their head to live + return TRUE + return (limb.body_zone == BODY_ZONE_CHEST) + /// Whether we should show an interactable topic in examines of the wound. href_list["wound_topic"] /datum/wound/proc/show_wound_topic(mob/user) return FALSE @@ -401,3 +605,21 @@ /// Gets the name of the wound with any interactable topic if possible /datum/wound/proc/get_topic_name(mob/user) return show_wound_topic(user) ? "[lowertext(name)]" : lowertext(name) + +/// Gets the flat percentage chance increment of a dismember occuring, 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) + + var/datum/wound_pregen_data/pregen_data = get_pregen_data() + if((WOUND_BLUNT in pregen_data.required_wounding_types) && severity >= WOUND_SEVERITY_CRITICAL) + return WOUND_CRITICAL_BLUNT_DISMEMBER_BONUS // we only require mangled bone (T2 blunt), but if there's a critical blunt, we'll add 15% more + +/// Returns our pregen data, which is practically guaranteed to exist, so this proc can safely be used raw. +/// In fact, since it's RETURN_TYPEd to wound_pregen_data, you can even directly access the variables without having to store the value of this proc in a typed variable. +/// Ex. get_pregen_data().wound_series +/datum/wound/proc/get_pregen_data() + RETURN_TYPE(/datum/wound_pregen_data) + + return SSwounds.pregen_data[type] + +#undef WOUND_CRITICAL_BLUNT_DISMEMBER_BONUS diff --git a/code/datums/wounds/blunt.dm b/code/datums/wounds/blunt.dm new file mode 100644 index 00000000000..219b7dd8805 --- /dev/null +++ b/code/datums/wounds/blunt.dm @@ -0,0 +1,3 @@ +/datum/wound/blunt + name = "Blunt Wound" + sound_effect = 'sound/effects/wounds/crack1.ogg' diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm index 14b3ac2ffdb..efcc402ac2d 100644 --- a/code/datums/wounds/bones.dm +++ b/code/datums/wounds/bones.dm @@ -2,11 +2,17 @@ Blunt/Bone wounds */ -/datum/wound/blunt +/datum/wound_pregen_data/bone + abstract = TRUE + required_limb_biostate = BIO_BONE + + required_wounding_types = list(WOUND_BLUNT) + + wound_series = WOUND_SERIES_BONE_BLUNT_BASIC + +/datum/wound/blunt/bone name = "Blunt (Bone) Wound" - sound_effect = 'sound/effects/wounds/crack1.ogg' - wound_type = WOUND_BLUNT - wound_flags = (BONE_WOUND | ACCEPTS_SPLINT) + wound_flags = ACCEPTS_SPLINT ///Have we been bone gel'd? var/gelled @@ -30,16 +36,12 @@ /* Overwriting of base procs */ -/datum/wound/blunt/wound_injury(datum/wound/old_wound = null, attack_direction = null) - // hook into gaining/losing gauze so crit bone wounds can re-enable/disable depending if they're slung or not - RegisterSignals(limb, list(COMSIG_BODYPART_SPLINTED, COMSIG_BODYPART_SPLINT_DESTROYED), PROC_REF(update_inefficiencies)) - +/datum/wound/blunt/bone/wound_injury(datum/wound/old_wound = null, attack_direction = null) if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group) processes = TRUE active_trauma = victim.gain_trauma_type(brain_trauma_group, TRAUMA_RESILIENCE_WOUND) next_trauma_cycle = world.time + (rand(100 - WOUND_BONE_HEAD_TIME_VARIANCE, 100 + WOUND_BONE_HEAD_TIME_VARIANCE) * 0.01 * trauma_cycle_cooldown) - RegisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(attack_with_hurt_hand)) if(limb.held_index && victim.get_item_for_held_index(limb.held_index) && (disabling || prob(30 * severity))) var/obj/item/I = victim.get_item_for_held_index(limb.held_index) if(istype(I, /obj/item/offhand)) @@ -53,19 +55,27 @@ ) update_inefficiencies() + return ..() + +/datum/wound/blunt/bone/set_victim(new_victim) + if(victim) + UnregisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK) + if(new_victim) + RegisterSignal(new_victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(attack_with_hurt_hand)) + return ..() -/datum/wound/blunt/remove_wound(ignore_limb, replaced) +/datum/wound/blunt/bone/remove_wound(ignore_limb, replaced) limp_slowdown = 0 limp_chance = 0 QDEL_NULL(active_trauma) - if(limb) - UnregisterSignal(limb, list(COMSIG_BODYPART_GAUZED, COMSIG_BODYPART_GAUZE_DESTROYED)) - if(victim) - UnregisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK) return ..() -/datum/wound/blunt/handle_process(delta_time, times_fired) +/datum/wound/blunt/bone/handle_process(delta_time, times_fired) . = ..() + + if(!victim || IS_IN_STASIS(victim)) + return + if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group && world.time > next_trauma_cycle) if(active_trauma) QDEL_NULL(active_trauma) @@ -73,8 +83,7 @@ active_trauma = victim.gain_trauma_type(brain_trauma_group, TRAUMA_RESILIENCE_WOUND) next_trauma_cycle = world.time + (rand(100-WOUND_BONE_HEAD_TIME_VARIANCE, 100+WOUND_BONE_HEAD_TIME_VARIANCE) * 0.01 * trauma_cycle_cooldown) - var/is_bone_creature = victim.get_biological_state() == BIO_JUST_BONE - if(!gelled || (!taped && !is_bone_creature)) + if(!gelled || (!taped && limb.biological_state != BIO_BONE)) return regen_ticks_current++ @@ -92,7 +101,7 @@ remove_wound() /// If we're a human who's punching something with a broken arm, we might hurt ourselves doing so -/datum/wound/blunt/proc/attack_with_hurt_hand(mob/M, atom/target, proximity) +/datum/wound/blunt/bone/proc/attack_with_hurt_hand(mob/M, atom/target, proximity) SIGNAL_HANDLER if(victim.get_active_hand() != limb || victim.a_intent == INTENT_HELP || !ismob(target) || severity <= WOUND_SEVERITY_MODERATE) @@ -117,16 +126,16 @@ return COMPONENT_NO_ATTACK_HAND -/datum/wound/blunt/receive_damage(wounding_type, wounding_dmg, wound_bonus) - if(!victim || wounding_dmg < WOUND_MINIMUM_DAMAGE) +/datum/wound/blunt/bone/receive_damage(list/wounding_types, total_wound_dmg, wound_bonus) + if(!victim || total_wound_dmg < WOUND_MINIMUM_DAMAGE) return if(ishuman(victim)) var/mob/living/carbon/human/human_victim = victim if(NOBLOOD in human_victim.dna?.species.species_traits) return - if(limb.body_zone == BODY_ZONE_CHEST && victim.blood_volume && prob(internal_bleeding_chance + wounding_dmg)) - var/blood_bled = rand(1, wounding_dmg * (severity == WOUND_SEVERITY_CRITICAL ? 2 : 1.5)) // 12 brute toolbox can cause up to 18/24 bleeding with a severe/critical chest wound + if(limb.body_zone == BODY_ZONE_CHEST && victim.blood_volume && prob(internal_bleeding_chance + total_wound_dmg)) + var/blood_bled = rand(1, total_wound_dmg * (severity == WOUND_SEVERITY_CRITICAL ? 2 : 1.5)) // 12 brute toolbox can cause up to 18/24 bleeding with a severe/critical chest wound switch(blood_bled) if(1 to 6) victim.bleed(blood_bled, TRUE) @@ -155,97 +164,65 @@ new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) victim.add_splatter_floor(get_step(victim.loc, victim.dir)) - -/datum/wound/blunt/get_examine_description(mob/user) - if(!limb.current_splint && !gelled && !taped) - return ..() - - var/list/msg = list() - if(!limb.current_splint) - msg += "[victim.p_their(TRUE)] [limb.name] [examine_desc]" - else - var/sling_condition = "" - // how much life we have left in these bandages - switch(limb.current_splint.sling_condition) - if(0 to 1.25) - sling_condition = "just barely" - if(1.25 to 2.75) - sling_condition = "loosely" - if(2.75 to 4) - sling_condition = "mostly" - if(4 to INFINITY) - sling_condition = "tightly" - - msg += "[victim.p_their(TRUE)] [limb.name] is [sling_condition] fastened with a [limb.current_splint.name]" +/datum/wound/blunt/bone/modify_desc_before_span(desc) + . = ..() if(taped) - msg += ", and appears to be reforming itself under some surgical tape!" + . += ", [span_notice("and appears to be reforming itself under some surgical tape!")]" else if(gelled) - msg += ", with fizzing flecks of blue bone gel sparking off the bone!" - else - msg += "!" - return "[msg.Join()]" + . += ", [span_notice("with fizzing flecks of blue bone gel sparking off the bone!")]" /* - New common procs for /datum/wound/blunt/ + New common procs for /datum/wound/blunt/bone/ */ -/datum/wound/blunt/proc/update_inefficiencies() - SIGNAL_HANDLER - - if(limb.body_zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) - if(limb.current_splint?.splint_factor) - limp_slowdown = initial(limp_slowdown) * limb.current_splint.splint_factor - limp_chance = initial(limp_chance) * limb.current_splint.splint_factor - else - limp_slowdown = initial(limp_slowdown) - limp_chance = initial(limp_chance) - victim.apply_status_effect(STATUS_EFFECT_LIMP) - - else if(limb.body_zone in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) - if(limb.current_splint?.splint_factor) - interaction_efficiency_penalty = 1 + ((interaction_efficiency_penalty - 1) * limb.current_splint.splint_factor) - else - interaction_efficiency_penalty = interaction_efficiency_penalty - interaction_efficiency_penalty = initial(interaction_efficiency_penalty) - - if(initial(disabling)) - if(limb.current_splint && limb.current_splint.helps_disabled) - set_disabling(FALSE) - else - set_disabling(TRUE) - - limb.update_wounds() - /// Joint Dislocation (Moderate Blunt) -/datum/wound/blunt/moderate +/datum/wound/blunt/bone/moderate name = "Joint Dislocation" - desc = "Patient's bone has been unset from socket, causing pain and reduced motor function." - treat_text = "Recommended application of bonesetter to affected limb, though manual relocation by applying an aggressive grab to the patient and helpfully interacting with afflicted limb may suffice." + desc = "Patient's limb has been unset from socket, causing pain and reduced motor function." + treat_text = "Recommended application of bonesetter or wrench to affected limb, though manual relocation by applying an aggressive grab to the patient and helpfully interacting with afflicted limb may suffice." examine_desc = "is awkwardly janked out of place" occur_text = "janks violently and becomes unseated" severity = WOUND_SEVERITY_MODERATE - viable_zones = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + wound_flags = ACCEPTS_SPLINT | PLATING_DAMAGE + excluded_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST) interaction_efficiency_penalty = 1.2 limp_slowdown = 2.25 limp_chance = 50 - threshold_minimum = 35 threshold_penalty = 15 - treatable_tool = TOOL_BONESET - wound_flags = (BONE_WOUND) - status_effect_type = /datum/status_effect/wound/blunt/moderate + treatable_tools = list(TOOL_BONESET, TOOL_WRENCH) + wound_flags = NONE + status_effect_type = /datum/status_effect/wound/blunt/bone/moderate + +/datum/wound_pregen_data/bone/dislocate + abstract = FALSE + + wound_path_to_generate = /datum/wound/blunt/bone/moderate + + required_limb_biostate = BIO_JOINTED + + threshold_minimum = 35 + +/datum/wound_pregen_data/bone/dislocate/get_threshold_for(obj/item/bodypart/part, attack_direction, damage_source) + if(part.biological_state & BIO_METAL) + return threshold_minimum * 2 + return ..() -/datum/wound/blunt/moderate/Destroy() +/datum/wound/blunt/bone/moderate/Destroy() if(victim) UnregisterSignal(victim, COMSIG_LIVING_DOORCRUSHED) return ..() -/datum/wound/blunt/moderate/wound_injury(datum/wound/old_wound, attack_direction = null) - . = ..() - RegisterSignal(victim, COMSIG_LIVING_DOORCRUSHED, PROC_REF(door_crush)) +/datum/wound/blunt/bone/moderate/set_victim(new_victim) + if(victim) + UnregisterSignal(victim, COMSIG_LIVING_DOORCRUSHED) + if(new_victim) + RegisterSignal(new_victim, COMSIG_LIVING_DOORCRUSHED, PROC_REF(door_crush)) + + return ..() /// Getting smushed in an airlock/firelock is a last-ditch attempt to try relocating your limb -/datum/wound/blunt/moderate/proc/door_crush() +/datum/wound/blunt/bone/moderate/proc/door_crush() if(prob(40)) victim.visible_message( span_danger("[victim]'s dislocated [limb.name] pops back into place!"), @@ -253,7 +230,13 @@ ) remove_wound() -/datum/wound/blunt/moderate/try_handling(mob/living/carbon/human/user, modifiers) +/datum/wound/blunt/bone/moderate/treat(obj/item/treatment, mob/user) + if((limb.biological_state & BIO_BONE) && treatment.tool_behaviour == TOOL_BONESET) + return boneset_limb(treatment, user) + if((limb.biological_state & BIO_METAL) && treatment.tool_behaviour == TOOL_WRENCH) + return wrench_limb(treatment, user) + +/datum/wound/blunt/bone/moderate/try_handling(mob/living/carbon/human/user, modifiers) if(user.pulling != victim || user.zone_selected != limb.body_zone || user.a_intent == INTENT_GRAB) return FALSE @@ -276,7 +259,7 @@ return TRUE /// If someone is snapping our dislocated joint back into place by hand with an aggro grab and help intent -/datum/wound/blunt/moderate/proc/chiropractice(mob/living/carbon/human/user) +/datum/wound/blunt/bone/moderate/proc/chiropractice(mob/living/carbon/human/user) var/time = base_treat_time if(!do_after(user, time, target=victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) return @@ -302,7 +285,7 @@ chiropractice(user) /// If someone is snapping our dislocated joint into a fracture by hand with an aggro grab and harm or disarm intent -/datum/wound/blunt/moderate/proc/malpractice(mob/living/carbon/human/user) +/datum/wound/blunt/bone/moderate/proc/malpractice(mob/living/carbon/human/user) var/time = base_treat_time if(!do_after(user, time, target=victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) @@ -327,20 +310,20 @@ limb.receive_damage(brute = 10, wound_bonus = 10) malpractice(user) -/datum/wound/blunt/moderate/treat(obj/item/I, mob/user) +/datum/wound/blunt/bone/moderate/proc/boneset_limb(obj/item/treatment, mob/user) if(victim == user) victim.visible_message( - span_danger("[user] begins resetting [victim.p_their()] [limb.name] with [I]."), - span_warning("You begin resetting your [limb.name] with [I]..."), + span_danger("[user] begins resetting [victim.p_their()] [limb.name] with [treatment]."), + span_warning("You begin resetting your [limb.name] with [treatment]..."), ) else user.visible_message( - span_danger("[user] begins resetting [victim]'s [limb.name] with [I]."), - span_notice("You begin resetting [victim]'s [limb.name] with [I]..."), + span_danger("[user] begins resetting [victim]'s [limb.name] with [treatment]."), + span_notice("You begin resetting [victim]'s [limb.name] with [treatment]..."), ) if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) - return + return TRUE if(victim == user) limb.receive_damage(brute = 5, wound_bonus = CANT_WOUND) @@ -358,11 +341,28 @@ to_chat(victim, span_userdanger("[user] resets your [limb.name]!")) qdel(src) + return TRUE + +/datum/wound/blunt/bone/moderate/proc/wrench_limb(obj/item/wrench, mob/user) + if(!victim) + return FALSE + victim.visible_message( + span_notice("[user] starts tightening the bolts on [victim]'s [limb.name]..."), + span_notice("[user] starts tightening the bolts on your [limb.name].") + ) + if(!wrench.use_tool(victim, user, 3 SECONDS, volume = 50)) + return TRUE + victim.visible_message( + span_notice("[user] wrenches [victim]'s [limb.name] back into place."), + span_notice("[user] wrenches your [limb.name] back into place.") + ) + qdel(src) + return TRUE /* Severe (Hairline Fracture) */ -/datum/wound/blunt/severe +/datum/wound/blunt/bone/severe name = "Hairline Fracture" desc = "Patient's bone has suffered a crack in the foundation, causing serious pain and reduced limb functionality." treat_text = "Recommended light surgical application of bone gel, though a sling of medical gauze will prevent worsening situation." @@ -373,18 +373,24 @@ interaction_efficiency_penalty = 2 limp_slowdown = 6 limp_chance = 60 - threshold_minimum = 70 threshold_penalty = 30 treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/bone_gel) - status_effect_type = /datum/status_effect/wound/blunt/severe + status_effect_type = /datum/status_effect/wound/blunt/bone/severe brain_trauma_group = BRAIN_TRAUMA_MILD trauma_cycle_cooldown = 5 MINUTES internal_bleeding_chance = 40 - wound_flags = (BONE_WOUND | ACCEPTS_SPLINT | MANGLES_BONE) + wound_flags = ACCEPTS_SPLINT | MANGLES_INTERIOR regen_ticks_needed = 120 // ticks every 2 seconds, 240 seconds, so roughly 4 minutes default +/datum/wound_pregen_data/bone/hairline + abstract = FALSE + + wound_path_to_generate = /datum/wound/blunt/bone/severe + + threshold_minimum = 70 + /// Compound Fracture (Critical Blunt) -/datum/wound/blunt/critical +/datum/wound/blunt/bone/critical name = "Compound Fracture" desc = "Patient's bones have suffered multiple gruesome fractures, causing significant pain and near uselessness of limb." treat_text = "Immediate binding of affected limb, followed by surgical intervention ASAP." @@ -397,31 +403,37 @@ limp_chance = 70 limp_slowdown = 9 sound_effect = 'sound/effects/wounds/crack2.ogg' - threshold_minimum = 115 threshold_penalty = 50 disabling = TRUE treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/bone_gel) - status_effect_type = /datum/status_effect/wound/blunt/critical + status_effect_type = /datum/status_effect/wound/blunt/bone/critical brain_trauma_group = BRAIN_TRAUMA_SEVERE trauma_cycle_cooldown = 5 MINUTES internal_bleeding_chance = 60 - wound_flags = (BONE_WOUND | ACCEPTS_SPLINT | MANGLES_BONE) + wound_flags = ACCEPTS_SPLINT | MANGLES_INTERIOR regen_ticks_needed = 240 // ticks every 2 seconds, 480 seconds, so roughly 8 minutes default +/datum/wound_pregen_data/bone/compound + abstract = FALSE + + wound_path_to_generate = /datum/wound/blunt/bone/critical + + threshold_minimum = 115 + // doesn't make much sense for "a" bone to stick out of your head -/datum/wound/blunt/critical/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE, attack_direction = null) +/datum/wound/blunt/bone/critical/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE, attack_direction = null) if(L.body_zone == BODY_ZONE_HEAD) occur_text = "splits open, exposing a bare, cracked skull through the flesh and blood" examine_desc = "has an unsettling indent, with bits of skull poking out" . = ..() /// if someone is using bone gel on our wound -/datum/wound/blunt/proc/gel(obj/item/stack/medical/bone_gel/I, mob/user) +/datum/wound/blunt/bone/proc/gel(obj/item/stack/medical/bone_gel/I, mob/user) // skellies get treated nicer with bone gel since their "reattach dismembered limbs by hand" ability sucks when it's still critically wounded // i hate you if(gelled) to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [limb.name] is already coated with bone gel!")) - return + return TRUE user.visible_message( span_danger("[user] begins hastily applying [I] to [victim]'s' [limb.name]..."), @@ -429,7 +441,7 @@ ) if(!do_after(user, base_treat_time * 1.5 * (user == victim ? 1.5 : 1), target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) - return + return TRUE I.use(1) victim.force_pain_noise(60) @@ -460,7 +472,7 @@ span_notice("You pass out from the pain of applying [I] to your [limb.name] before you can finish!"), ) victim.AdjustUnconscious(5 SECONDS) - return + return TRUE victim.visible_message( span_notice("[victim] finishes applying [I] to [victim.p_their()] [limb.name], grimacing from the pain!"), span_notice("You finish applying [I] to your [limb.name], and your bones explode in pain!"), @@ -469,15 +481,16 @@ limb.receive_damage(25, stamina = 100, wound_bonus = CANT_WOUND) gelled = TRUE processes = TRUE + return TRUE /// if someone is using surgical tape on our wound -/datum/wound/blunt/proc/tape(obj/item/stack/sticky_tape/surgical/I, mob/user) +/datum/wound/blunt/bone/proc/tape(obj/item/stack/sticky_tape/surgical/I, mob/user) if(!gelled) to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [limb.name] must be coated with bone gel to perform this emergency operation!")) - return + return TRUE if(taped) to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [limb.name] is already wrapped in [I.name].")) - return + return TRUE user.visible_message( span_danger("[user] begins applying [I] to [victim]'s' [limb.name]..."), @@ -485,7 +498,7 @@ ) if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) - return + return TRUE if(victim == user) regen_ticks_needed *= 1.5 @@ -506,20 +519,21 @@ taped = TRUE processes = TRUE + return TRUE -/datum/wound/blunt/treat(obj/item/I, mob/user) +/datum/wound/blunt/bone/treat(obj/item/I, mob/user) if(istype(I, /obj/item/stack/medical/bone_gel)) - gel(I, user) + return gel(I, user) else if(istype(I, /obj/item/stack/sticky_tape/surgical)) - tape(I, user) + return tape(I, user) -/datum/wound/blunt/get_scanner_description(mob/user) +/datum/wound/blunt/bone/get_scanner_description(mob/user) . = ..() . += "
" if(severity > WOUND_SEVERITY_MODERATE) - if(victim.get_biological_state() == BIO_JUST_BONE) + if((limb.biological_state & BIO_BONE) && !(limb.biological_state & BIO_FLESH)) if(!gelled) . += "Recommended Treatment: Apply bone gel directly to injured limb. Creatures of pure bone don't seem to mind bone gel application nearly as much as fleshed individuals. Surgical tape will also be unnecessary.\n" else diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm index 56d4d421578..e56691f17d0 100644 --- a/code/datums/wounds/burns.dm +++ b/code/datums/wounds/burns.dm @@ -6,10 +6,12 @@ /datum/wound/burn name = "Burn Wound" a_or_from = "from" - wound_type = WOUND_BURN - processes = TRUE sound_effect = 'sound/effects/wounds/sizzle1.ogg' - wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE) + +/datum/wound/burn/flesh + name = "Burn (Flesh) Wound" + a_or_from = "from" + processes = TRUE treatable_by = list(/obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) // sterilizer and alcohol will require reagent treatments, coming soon @@ -30,8 +32,18 @@ /// Once we reach infestation beyond WOUND_INFESTATION_SEPSIS, we get this many warnings before the limb is completely paralyzed (you'd have to ignore a really bad burn for a really long time for this to happen) var/strikes_to_lose_limb = 3 +/datum/wound_pregen_data/flesh_burn + abstract = TRUE + + required_wounding_types = list(WOUND_BURN) + required_limb_biostate = BIO_FLESH + + wound_series = WOUND_SERIES_FLESH_BURN_BASIC + +/datum/wound/burn/flesh/handle_process(seconds_per_tick, times_fired) + if (!victim || IS_IN_STASIS(victim)) + return -/datum/wound/burn/handle_process() . = ..() if(strikes_to_lose_limb == 0) // we've already hit sepsis, nothing more to do victim.adjustToxLoss(0.5) @@ -124,7 +136,7 @@ set_disabling(TRUE) strikes_to_lose_limb-- -/datum/wound/burn/get_examine_description(mob/user) +/datum/wound/burn/flesh/get_examine_description(mob/user) if(strikes_to_lose_limb <= 0) return span_deadsay("[victim.p_their(TRUE)] [limb.name] has locked up completely and is non-functional.") @@ -157,7 +169,7 @@ return "[condition.Join()]" -/datum/wound/burn/get_scanner_description(mob/user) +/datum/wound/burn/flesh/get_scanner_description(mob/user) if(strikes_to_lose_limb == 0) var/oopsie = "Type: [name]\nSeverity: [severity_text()]" oopsie += "
Infection Level: The bodypart has suffered complete sepsis and must be removed. Amputate or augment limb immediately.
" @@ -190,15 +202,15 @@ */ /// if someone is using ointment or mesh on our burns -/datum/wound/burn/proc/ointmentmesh(obj/item/stack/medical/I, mob/user) +/datum/wound/burn/flesh/proc/ointmentmesh(obj/item/stack/medical/I, mob/user) user.visible_message( span_notice("[user] begins applying [I] to [victim]'s [limb.name]..."), span_notice("You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.name]..."), ) if (I.amount <= 0) - return + return TRUE if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), extra_checks = CALLBACK(src, PROC_REF(still_exists)))) - return + return TRUE limb.heal_damage(I.heal_brute, I.heal_burn) user.visible_message( @@ -213,25 +225,26 @@ // in this fashion rather than have the cut immediately clear up. maybe bleed wounds could downgrade into muscle wounds...? if((infestation <= 0 || sanitization >= infestation) && (flesh_damage <= 0 || flesh_healing > flesh_damage)) to_chat(user, span_notice("You've done all you can with [I], [victim]'s [limb.name] can't be treated further.")) + return TRUE else - try_treating(I, user) + return try_treating(I, user) -/datum/wound/burn/treat(obj/item/I, mob/user) +/datum/wound/burn/flesh/treat(obj/item/I, mob/user) if(istype(I, /obj/item/stack/medical/ointment)) - ointmentmesh(I, user) + return ointmentmesh(I, user) else if(istype(I, /obj/item/stack/medical/mesh)) var/obj/item/stack/medical/mesh/mesh_check = I if(!mesh_check.is_open) to_chat(user, span_warning("You need to open [mesh_check] first.")) return - ointmentmesh(mesh_check, user) + return ointmentmesh(mesh_check, user) -/datum/wound/burn/on_synthflesh(amount) +/datum/wound/burn/flesh/on_synthflesh(amount) flesh_healing += amount * 0.5 // 20u patch will heal 10 flesh standard /// When a -tane chem is applied to the victim, we call this. -/datum/wound/burn/on_tane(amount) +/datum/wound/burn/flesh/on_tane(amount) if(amount > 10 && severity <= WOUND_SEVERITY_SEVERE) qdel(src) return @@ -241,7 +254,7 @@ return //crystal reagent lets you fully clear burns because they're rare chemicals and burns suck ass with no cryo -/datum/wound/burn/on_crystal(power) +/datum/wound/burn/flesh/on_crystal(power) if(power>=5) to_chat(victim, span_green("The burns on your [limb.name] have been regenerated, leaving only minor necrosis.")) victim.adjustCloneLoss(5) @@ -249,7 +262,7 @@ return //So does rezadone -/datum/wound/burn/on_rezadone(power) +/datum/wound/burn/flesh/on_rezadone(power) if(power>=10) // Rapidly regenerating burns isn't so clean, especially when there's an infection to purge to_chat(victim, span_green("The burns on your [limb.name] clear up, leaving you with an ill feeling.")) @@ -268,7 +281,7 @@ return // we don't even care about first degree burns, straight to second -/datum/wound/burn/moderate +/datum/wound/burn/flesh/moderate name = "Second Degree Burns" desc = "Patient is suffering considerable burns with mild skin penetration, weakening limb integrity and increased burning sensations." treat_text = "Recommended application of topical ointment or regenerative mesh to affected region." @@ -276,27 +289,38 @@ occur_text = "breaks out with violent red burns" severity = WOUND_SEVERITY_MODERATE damage_mulitplier_penalty = 1.05 - threshold_minimum = 40 threshold_penalty = 20 - status_effect_type = /datum/status_effect/wound/burn/moderate + status_effect_type = /datum/status_effect/wound/burn/flesh/moderate flesh_damage = 5 -/datum/wound/burn/severe +/datum/wound_pregen_data/flesh_burn/second_degree + abstract = FALSE + + wound_path_to_generate = /datum/wound/burn/flesh/moderate + threshold_minimum = 40 + +/datum/wound/burn/flesh/severe name = "Third Degree Burns" desc = "Patient is suffering extreme burns with full skin penetration, creating serious risk of infection and greatly reduced limb integrity." treat_text = "Recommended immediate disinfection and excision of any infected skin, followed by bandaging and ointment." examine_desc = "appears seriously charred, with aggressive red splotches" occur_text = "chars rapidly, spreading angry red burns" severity = WOUND_SEVERITY_SEVERE + wound_flags = ACCEPTS_GAUZE | NUMBS_BODYPART damage_mulitplier_penalty = 1.1 - threshold_minimum = 80 threshold_penalty = 30 - status_effect_type = /datum/status_effect/wound/burn/severe + status_effect_type = /datum/status_effect/wound/burn/flesh/severe treatable_by = list(/obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) infestation_rate = 0.03 flesh_damage = 12.5 -/datum/wound/burn/critical +/datum/wound_pregen_data/flesh_burn/third_degree + abstract = FALSE + + wound_path_to_generate = /datum/wound/burn/flesh/severe + threshold_minimum = 80 + +/datum/wound/burn/flesh/critical name = "Catastrophic Burns" desc = "Patient is suffering near complete loss of tissue and significantly charred muscle and bone, creating life-threatening risk of infection and negligible limb integrity." treat_text = "Immediate surgical debriding of any infected skin, followed by potent tissue regeneration formula and bandaging." @@ -305,9 +329,15 @@ severity = WOUND_SEVERITY_CRITICAL damage_mulitplier_penalty = 1.15 sound_effect = 'sound/effects/wounds/sizzle2.ogg' - threshold_minimum = 140 threshold_penalty = 80 - status_effect_type = /datum/status_effect/wound/burn/critical + status_effect_type = /datum/status_effect/wound/burn/flesh/critical treatable_by = list(/obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) infestation_rate = 0.07 flesh_damage = 20 + wound_flags = ACCEPTS_GAUZE | MANGLES_EXTERIOR | NUMBS_BODYPART + +/datum/wound_pregen_data/flesh_burn/fourth_degree + abstract = FALSE + + wound_path_to_generate = /datum/wound/burn/flesh/critical + threshold_minimum = 140 diff --git a/code/datums/wounds/dismember.dm b/code/datums/wounds/dismember.dm index df516429c49..faf3a8115b9 100644 --- a/code/datums/wounds/dismember.dm +++ b/code/datums/wounds/dismember.dm @@ -1,16 +1,31 @@ +/datum/wound_pregen_data/loss + abstract = FALSE + + wound_path_to_generate = /datum/wound/loss + required_limb_biostate = NONE + require_any_biostate = TRUE + + required_wounding_types = list(WOUND_ALL) + + wound_series = WOUND_SERIES_LOSS_BASIC + + threshold_minimum = WOUND_DISMEMBER_OUTRIGHT_THRESH // not actually used since dismembering is handled differently, but may as well assign it since we got it + /datum/wound/loss name = "Dismemberment Wound" desc = "Tis but a flesh wound." sound_effect = 'sound/effects/wounds/dismember.ogg' severity = WOUND_SEVERITY_LOSS - threshold_minimum = WOUND_DISMEMBER_OUTRIGHT_THRESH // not actually used since dismembering is handled differently, but may as well assign it since we got it status_effect_type = null wound_flags = null + /// The wounding_type of the attack that caused us. Used to generate the description of our scar. Currently unused, but primarily exists in case non-biological wounds are added. + var/loss_wounding_type + /// Our special proc for our special dismembering, the wounding type only matters for what text we have /datum/wound/loss/proc/apply_dismember(obj/item/bodypart/dismembered_part, wounding_type = WOUND_SLASH, outright = FALSE, attack_direction) - if(!istype(dismembered_part) || !dismembered_part.owner || !(dismembered_part.body_zone in viable_zones) || isalien(dismembered_part.owner) || !dismembered_part.can_dismember()) + if(!istype(dismembered_part) || !dismembered_part.owner || (dismembered_part.body_zone in get_excluded_zones()) || isalien(dismembered_part.owner) || !dismembered_part.can_dismember()) qdel(src) return @@ -18,10 +33,31 @@ if(dismembered_part.body_zone == BODY_ZONE_CHEST) occur_text = "is split open, causing [victim.p_their()] internals organs to spill out!" - else if(outright) + else + occur_text = dismembered_part.get_dismember_message(wounding_type, outright) + + var/msg = span_bolddanger("[victim]'s [dismembered_part.name] [occur_text]!") + + victim.visible_message(msg, span_userdanger("Your [dismembered_part.name] [occur_text]!")) + + loss_wounding_type = wounding_type + + set_limb(dismembered_part) + second_wind() + log_wound(victim, src) + if(dismembered_part.can_bleed() && wounding_type != WOUND_BURN && victim.blood_volume) + victim.spray_blood(attack_direction, severity) + dismembered_part.dismember(dam_type = (wounding_type == WOUND_BURN ? BURN : BRUTE)) + qdel(src) + return TRUE + +/obj/item/bodypart/proc/get_dismember_message(wounding_type, outright) + var/occur_text + + if(outright) switch(wounding_type) if(WOUND_BLUNT) - occur_text = "is outright smashed to a gross pulp, severing it completely!" + occur_text = "is outright smashed to [(biological_state & BIO_METAL) ? "pieces" : "a gross pulp"], severing it completely!" if(WOUND_SLASH) occur_text = "is outright slashed off, severing it completely!" if(WOUND_PIERCE) @@ -29,25 +65,17 @@ if(WOUND_BURN) occur_text = "is outright incinerated, falling to dust!" else + var/bone_text = get_internal_description() + var/tissue_text = get_external_description() + switch(wounding_type) if(WOUND_BLUNT) - occur_text = "is shattered through the last bone holding it together, severing it completely!" + occur_text = "is shattered through the last [bone_text] holding it together, severing it completely!" if(WOUND_SLASH) - occur_text = "is slashed through the last tissue holding it together, severing it completely!" + occur_text = "is slashed through the last [tissue_text] holding it together, severing it completely!" if(WOUND_PIERCE) - occur_text = "is pierced through the last tissue holding it together, severing it completely!" + occur_text = "is pierced through the last [tissue_text] holding it together, severing it completely!" if(WOUND_BURN) - occur_text = "is completely incinerated, falling to dust!" - - var/msg = span_bolddanger("[victim]'s [dismembered_part.name] [occur_text]!") + occur_text = "is completely incinerated, [(biological_state & BIO_METAL) ? "melting to slag" : "falling to dust"]!" - victim.visible_message(msg, span_userdanger("Your [dismembered_part.name] [occur_text]!")) - - set_limb(dismembered_part) - second_wind() - log_wound(victim, src) - if(wounding_type != WOUND_BURN && victim.blood_volume) - victim.spray_blood(attack_direction, severity) - dismembered_part.dismember(wounding_type == WOUND_BURN ? BURN : BRUTE) - qdel(src) - return TRUE + return occur_text diff --git a/code/datums/wounds/muscle.dm b/code/datums/wounds/muscle.dm index 88b7093ab69..30dcbfe4236 100644 --- a/code/datums/wounds/muscle.dm +++ b/code/datums/wounds/muscle.dm @@ -3,21 +3,27 @@ */ /datum/wound/muscle name = "Muscle Wound" - wound_type = WOUND_MUSCLE - wound_flags = (FLESH_WOUND | ACCEPTS_SPLINT) - viable_zones = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + wound_flags = ACCEPTS_SPLINT + bio_state_required = BIO_FLESH + excluded_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST) processes = TRUE ///How much do we need to regen. Will regen faster if we're splinted and or laying down var/regen_ticks_needed ///Our current counter for healing var/regen_ticks_current = 0 +/datum/wound_pregen_data/muscle + abstract = TRUE + required_limb_biostate = BIO_FLESH + + required_wounding_types = list(WOUND_BLUNT) + wound_series = WOUND_SERIES_FLESH_MUSCLE + weight = WOUND_MUSCLE_WEIGHT + /* Overwriting of base procs */ /datum/wound/muscle/wound_injury(datum/wound/old_wound = null, attack_direction = null) - //hook into gaining/losing gauze so crit muscle wounds can re-enable/disable depending if they're slung or not - RegisterSignals(limb, list(COMSIG_BODYPART_SPLINTED, COMSIG_BODYPART_SPLINT_DESTROYED), PROC_REF(update_inefficiencies)) RegisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(attack_with_hurt_hand)) if(limb.held_index && victim.get_item_for_held_index(limb.held_index) && (disabling || prob(10 * severity))) @@ -111,31 +117,6 @@ return "[msg.Join()]" -/* - Common procs mostly copied from bone wounds, as their behaviour is very similar -*/ -/datum/wound/muscle/proc/update_inefficiencies() - if(limb.body_zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) - if(limb.current_splint) - limp_slowdown = initial(limp_slowdown) * limb.current_splint.splint_factor - else - limp_slowdown = initial(limp_slowdown) - victim.apply_status_effect(STATUS_EFFECT_LIMP) - - else if(limb.body_zone in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) - if(limb.current_splint) - interaction_efficiency_penalty = 1 + ((interaction_efficiency_penalty - 1) * limb.current_splint.splint_factor) - else - interaction_efficiency_penalty = interaction_efficiency_penalty - - if(initial(disabling)) - if(limb.current_splint && limb.current_splint.helps_disabled) - set_disabling(FALSE) - else - set_disabling(TRUE) - - limb.update_wounds() - //Moderate (Muscle Tear) /datum/wound/muscle/moderate name = "Muscle Tear" @@ -146,11 +127,16 @@ severity = WOUND_SEVERITY_MODERATE interaction_efficiency_penalty = 1.15 limp_slowdown = 1 - threshold_minimum = 40 threshold_penalty = 10 status_effect_type = /datum/status_effect/wound/muscle/moderate regen_ticks_needed = 500 +/datum/wound_pregen_data/muscle/tear + abstract = FALSE + + wound_path_to_generate = /datum/wound/muscle/moderate + threshold_minimum = 40 + //Severe (Ruptured Tendon) /datum/wound/muscle/severe name = "Ruptured Tendon" @@ -162,12 +148,17 @@ severity = WOUND_SEVERITY_SEVERE interaction_efficiency_penalty = 1.25 limp_slowdown = 5 - threshold_minimum = 90 threshold_penalty = 35 disabling = TRUE status_effect_type = /datum/status_effect/wound/muscle/severe regen_ticks_needed = 1500 //takes a while +/datum/wound_pregen_data/muscle/rupture + abstract = FALSE + + wound_path_to_generate = /datum/wound/muscle/severe + threshold_minimum = 90 + /datum/status_effect/wound/muscle /datum/status_effect/wound/muscle/on_apply() diff --git a/code/datums/wounds/pierce.dm b/code/datums/wounds/pierce.dm index a7ddf660d0b..acc9b97ae1e 100644 --- a/code/datums/wounds/pierce.dm +++ b/code/datums/wounds/pierce.dm @@ -3,14 +3,15 @@ */ /datum/wound/pierce + +/datum/wound/pierce/bleed name = "Piercing Wound" sound_effect = 'sound/weapons/slice.ogg' processes = TRUE - wound_type = WOUND_PIERCE treatable_by = list(/obj/item/stack/medical/suture) - treatable_tool = TOOL_CAUTERY + treatable_tools = list(TOOL_CAUTERY) base_treat_time = 3 SECONDS - wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE | ACCEPTS_SPLINT) + wound_flags = ACCEPTS_GAUZE | CAN_BE_GRASPED /// How much blood we start losing when this wound is first applied var/initial_flow @@ -22,30 +23,38 @@ /// If we let off blood when hit, the max blood lost is this * the incoming damage var/internal_bleeding_coefficient -/datum/wound/pierce/show_wound_topic(mob/user) +/datum/wound_pregen_data/flesh_pierce + abstract = TRUE + + required_limb_biostate = (BIO_FLESH) + required_wounding_types = list(WOUND_PIERCE) + + wound_series = WOUND_SERIES_FLESH_PUNCTURE_BLEED + +/datum/wound/pierce/bleed/show_wound_topic(mob/user) return (user == victim && blood_flow) -/datum/wound/pierce/Topic(href, href_list) +/datum/wound/pierce/bleed/Topic(href, href_list) . = ..() if(href_list["wound_topic"]) if(!usr == victim) return victim.self_grasp_bleeding_limb(limb) -/datum/wound/pierce/wound_injury(datum/wound/old_wound = null, attack_direction = null) +/datum/wound/pierce/bleed/wound_injury(datum/wound/old_wound = null, attack_direction = null) blood_flow = initial_flow - if(attack_direction && victim.blood_volume > BLOOD_VOLUME_BAD) + if(limb.can_bleed() && attack_direction && victim.blood_volume > BLOOD_VOLUME_BAD) victim.spray_blood(attack_direction, severity) -/datum/wound/pierce/receive_damage(wounding_type, wounding_dmg, wound_bonus) - if(isnull(victim) || victim.stat == DEAD || wounding_dmg < WOUND_MINIMUM_DAMAGE) +/datum/wound/pierce/bleed/receive_damage(list/wounding_types, total_wound_dmg, wound_bonus) + if(isnull(victim) || victim.stat == DEAD || total_wound_dmg < WOUND_MINIMUM_DAMAGE) return - if(victim.blood_volume && prob(internal_bleeding_chance + wounding_dmg)) + if(victim.blood_volume && limb.can_bleed() && prob(internal_bleeding_chance + total_wound_dmg)) if(limb.current_splint?.splint_factor) - wounding_dmg *= (1 - limb.current_splint.splint_factor) + total_wound_dmg *= (1 - limb.current_splint.splint_factor) - var/blood_bled = rand(1, wounding_dmg * internal_bleeding_coefficient) + var/blood_bled = rand(1, total_wound_dmg * internal_bleeding_coefficient) switch(blood_bled) if(1 to 6) victim.bleed(blood_bled, TRUE) @@ -74,14 +83,16 @@ new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) victim.add_splatter_floor(get_step(victim.loc, victim.dir)) -/datum/wound/pierce/get_bleed_rate_of_change() +/datum/wound/pierce/bleed/get_bleed_rate_of_change() + if(!limb.can_bleed()) + return BLOOD_FLOW_STEADY if(HAS_TRAIT(victim, TRAIT_BLOODY_MESS)) return BLOOD_FLOW_INCREASING if(limb.current_gauze && limb.current_gauze.seep_gauze(limb.current_gauze.absorption_rate, GAUZE_STAIN_BLOOD)) return BLOOD_FLOW_DECREASING return BLOOD_FLOW_STEADY -/datum/wound/pierce/handle_process() +/datum/wound/pierce/bleed/handle_process() blood_flow = min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW) if(HAS_TRAIT(victim, TRAIT_BLOODY_MESS)) @@ -93,30 +104,30 @@ if(blood_flow <= 0) qdel(src) -/datum/wound/pierce/on_stasis() +/datum/wound/pierce/bleed/on_stasis() . = ..() if(blood_flow <= 0) qdel(src) -/datum/wound/pierce/check_grab_treatments(obj/item/I, mob/user) +/datum/wound/pierce/bleed/check_grab_treatments(obj/item/I, mob/user) if(I.get_temperature()) // if we're using something hot but not a cautery, we need to be aggro grabbing them first, so we don't try treating someone we're eswording return TRUE -/datum/wound/pierce/treat(obj/item/I, mob/user) +/datum/wound/pierce/bleed/treat(obj/item/I, mob/user) if(istype(I, /obj/item/stack/medical/suture)) - suture(I, user) + return suture(I, user) else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature()) - tool_cauterize(I, user) + return tool_cauterize(I, user) -/datum/wound/pierce/on_xadone(power) +/datum/wound/pierce/bleed/on_xadone(power) . = ..() blood_flow -= 0.03 * power // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort -/datum/wound/pierce/on_synthflesh(power) +/datum/wound/pierce/bleed/on_synthflesh(power) . = ..() blood_flow -= 0.05 * power // 20u * 0.05 = -1 blood flow, less than with slashes but still good considering smaller bleed rates -/datum/wound/pierce/on_silfrine(power) +/datum/wound/pierce/bleed/on_silfrine(power) switch(power) if(0 to 3) EMPTY_BLOCK_GUARD @@ -129,14 +140,14 @@ blood_flow -= 0.05 * power /// If someone is using a suture to close this puncture -/datum/wound/pierce/proc/suture(obj/item/stack/medical/suture/I, mob/user) +/datum/wound/pierce/bleed/proc/suture(obj/item/stack/medical/suture/I, mob/user) var/self_penalty_mult = (user == victim ? 1 : 1) user.visible_message( span_notice("[user] begins stitching [victim]'s [limb.name] with [I]..."), span_notice("You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]..."), ) if(!do_after(user, base_treat_time * self_penalty_mult, target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) - return + return TRUE user.visible_message( span_green("[user] stitches up some of the bleeding on [victim]."), span_green("You stitch up some of the bleeding on [user == victim ? "yourself" : "[victim]"]."), @@ -147,12 +158,13 @@ I.use(1) if(blood_flow > 0) - try_treating(I, user) + return try_treating(I, user) else to_chat(user, span_green("You successfully close the hole in [user == victim ? "your" : "[victim]'s"] [limb.name].")) + return TRUE /// If someone is using either a cautery tool or something with heat to cauterize this pierce -/datum/wound/pierce/proc/tool_cauterize(obj/item/I, mob/user) +/datum/wound/pierce/bleed/proc/tool_cauterize(obj/item/I, mob/user) var/improv_penalty_mult = (I.tool_behaviour == TOOL_CAUTERY ? 1 : 1.25) // 25% longer and less effective if you don't use a real cautery var/self_penalty_mult = (user == victim ? 1.1 : 1) @@ -161,7 +173,7 @@ span_warning("You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]..."), ) if(!do_after(user, base_treat_time * self_penalty_mult * improv_penalty_mult, target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) - return + return TRUE playsound(user, 'sound/surgery/cautery2.ogg', 20) user.visible_message( @@ -175,9 +187,10 @@ blood_flow -= blood_cauterized if(blood_flow > 0) - try_treating(I, user) + return try_treating(I, user) + return TRUE -/datum/wound/pierce/moderate +/datum/wound/pierce/bleed/moderate name = "Minor Breakage" desc = "Patient's skin has been broken open, causing severe bruising and minor internal bleeding in affected area." treat_text = "Application of clean bandages and sutures or cauterization." @@ -189,11 +202,16 @@ gauzed_clot_rate = 0.8 internal_bleeding_chance = 30 internal_bleeding_coefficient = 1.25 - threshold_minimum = 40 threshold_penalty = 20 - status_effect_type = /datum/status_effect/wound/pierce/moderate + status_effect_type = /datum/status_effect/wound/pierce/bleed/moderate + +/datum/wound_pregen_data/flesh_pierce/breakage + abstract = FALSE -/datum/wound/pierce/severe + wound_path_to_generate = /datum/wound/pierce/bleed/moderate + threshold_minimum = 40 + +/datum/wound/pierce/bleed/severe name = "Open Puncture" desc = "Patient's internal tissue is penetrated, causing sizeable internal bleeding and reduced limb stability." treat_text = "Application of clean bandages and sutures or cauterization." @@ -205,11 +223,16 @@ gauzed_clot_rate = 0.6 internal_bleeding_chance = 60 internal_bleeding_coefficient = 1.5 - threshold_minimum = 60 threshold_penalty = 35 - status_effect_type = /datum/status_effect/wound/pierce/severe + status_effect_type = /datum/status_effect/wound/pierce/bleed/severe + +/datum/wound_pregen_data/flesh_pierce/open_puncture + abstract = FALSE + + wound_path_to_generate = /datum/wound/pierce/bleed/severe + threshold_minimum = 60 -/datum/wound/pierce/critical +/datum/wound/pierce/bleed/critical name = "Ruptured Cavity" desc = "Patient's internal tissue and circulatory system is shredded, causing significant internal bleeding and damage to internal organs." treat_text = "Bandaging, cauterization, or surgical repair followed by potential transfusion." @@ -221,7 +244,12 @@ gauzed_clot_rate = 0.5 internal_bleeding_chance = 80 internal_bleeding_coefficient = 1.75 - threshold_minimum = 115 threshold_penalty = 50 - status_effect_type = /datum/status_effect/wound/pierce/critical - wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE | ACCEPTS_SPLINT | MANGLES_FLESH) + status_effect_type = /datum/status_effect/wound/pierce/bleed/critical + wound_flags = ACCEPTS_GAUZE | MANGLES_EXTERIOR | CAN_BE_GRASPED + +/datum/wound_pregen_data/flesh_pierce/cavity + abstract = FALSE + + wound_path_to_generate = /datum/wound/pierce/bleed/critical + threshold_minimum = 115 diff --git a/code/datums/wounds/robotic/buckling.dm b/code/datums/wounds/robotic/buckling.dm new file mode 100644 index 00000000000..87aa3b1d748 --- /dev/null +++ b/code/datums/wounds/robotic/buckling.dm @@ -0,0 +1,213 @@ +#define MAX_TAPE_STACKS 5 +#define DAMAGE_PER_STACK 10 +#define TAPE_SCALE 50 + +#define TAPE_FACTOR_CALC(amount, strength) (TAPE_SCALE / (TAPE_SCALE + (amount * strength)**2)) + +/datum/wound/blunt/buckling + name = "Blunt (Metal) Wound" + sound_effect = 'sound/machines/clockcult/integration_cog_install.ogg' + wound_flags = PLATING_DAMAGE + bio_state_required = BIO_METAL + + /// The tape applied to this wound. + var/obj/item/stack/tape/applied_tape + +/datum/wound_pregen_data/buckling + abstract = TRUE + required_limb_biostate = BIO_METAL + + required_wounding_types = list(WOUND_BLUNT) + + wound_series = WOUND_SERIES_METAL_BUCKLING + +/datum/wound/blunt/buckling/moderate + name = "Bent Plating" + desc = "Patient's external plating is bent out of shape." + treat_text = "Recommend prying the external plate back into place." + examine_desc = "is bent out of shape" + occur_text = "suddenly bends out of shape" + sound_effect = 'sound/effects/bin_open.ogg' + treatable_tools = list(TOOL_CROWBAR, TOOL_WIRECUTTER) + treatable_by = list(/obj/item/stack/tape) + severity = WOUND_SEVERITY_MODERATE + interaction_efficiency_penalty = 1.2 + threshold_penalty = 20 + limp_slowdown = 2.25 + limp_chance = 50 + +/datum/wound_pregen_data/buckling/dented + abstract = FALSE + + wound_path_to_generate = /datum/wound/blunt/buckling/moderate + threshold_minimum = 35 + +/datum/wound/blunt/buckling/severe + name = "Buckled Chassis" + desc = "Patient's chassis is buckled inwards, causing disruption to mobility. Applying duct tape can temporarily secure the limb until proper repairs." + treat_text = "Recommend replacement of external plating." + examine_desc = "is buckled inwards" + occur_text = "creaks and buckles inwards" + severity = WOUND_SEVERITY_SEVERE + wound_flags = MANGLES_INTERIOR | PLATING_DAMAGE + treatable_tools = list(TOOL_WIRECUTTER) // for tape removal + treatable_by = list(/obj/item/stack/tape) + interaction_efficiency_penalty = 2 + threshold_penalty = 40 + limp_slowdown = 6 + limp_chance = 60 + +/datum/wound_pregen_data/buckling/buckled + abstract = FALSE + + wound_path_to_generate = /datum/wound/blunt/buckling/severe + threshold_minimum = 70 + +/datum/wound/blunt/buckling/critical + name = "Sheared Frame" + desc = "Patient's limb is sheared, rendering it inoperable." + treat_text = "Recommend replacement of internal frame and external plating. Applying duct tape can temporarily secure the limb until proper repairs." + examine_desc = "is sheared off, barely hanging on by the wires" + occur_text = "violently snaps as its frame shears apart" + wound_flags = MANGLES_INTERIOR | PLATING_DAMAGE + severity = WOUND_SEVERITY_CRITICAL + treatable_tools = list(TOOL_WIRECUTTER) // for tape removal + treatable_by = list(/obj/item/stack/tape) // duct tape will fix anything + disabling = TRUE + interaction_efficiency_penalty = 2.5 + threshold_penalty = 50 + limp_slowdown = 9 + limp_chance = 70 + +/datum/wound_pregen_data/buckling/sheared + abstract = FALSE + + wound_path_to_generate = /datum/wound/blunt/buckling/critical + threshold_minimum = 125 + +/datum/wound/blunt/buckling/remove_wound(ignore_limb, replaced) + limp_slowdown = 0 + limp_chance = 0 + if(applied_tape) + QDEL_NULL(applied_tape) + return ..() + +/datum/wound/blunt/buckling/treat(obj/item/treatment, mob/user) + if(istype(treatment, /obj/item/stack/tape)) + return apply_tape(treatment, user) + if(treatment.tool_behaviour == TOOL_WIRECUTTER) + return remove_tape(treatment, user) + if(treatment.tool_behaviour == TOOL_CROWBAR) + return pry_chassis(treatment, user) + +/// Applies tape to the wound. +/datum/wound/blunt/buckling/proc/apply_tape(obj/item/stack/tape/new_tape, mob/user) + if(applied_tape?.amount >= MAX_TAPE_STACKS) + to_chat(user, span_notice("[limb] has too much tape on it already!")) + return TRUE + if(new_tape.amount < 1) + to_chat(user, span_notice("[new_tape] does not contain enough tape!")) + return TRUE + victim.visible_message( + span_notice("[user] starts applying [new_tape.name] to [victim]'s [limb]."), + span_notice("[user] starts applying [new_tape.name] to your [limb]."), + ) + while(applied_tape?.amount < MAX_TAPE_STACKS && new_tape.use_tool(victim, user, 2 SECONDS, amount = 1, volume = 50)) + if(!applied_tape) + applied_tape = new new_tape.type(null, 1) + else + applied_tape.add(1) + update_inefficiencies() + if(applied_tape.amount >= MAX_TAPE_STACKS) + victim.visible_message( + span_notice("[user] finishes applying [applied_tape.name] to [victim]'s [limb]."), + span_notice("[user] finishes applying [applied_tape.name] to your [limb]."), + ) + return TRUE + victim.visible_message( + span_notice("[user] applies some [applied_tape.name] to [victim]'s [limb]."), + span_notice("[user] applies some [applied_tape.name] to your [limb]."), + ) + return TRUE + +/// Removes tape from the round. +/datum/wound/blunt/buckling/proc/remove_tape(obj/item/tool, mob/user) + victim.visible_message( + span_notice("[user] tries to remove the [applied_tape] from [victim]'s [limb.name]."), + span_danger("[user] tries to remove the [applied_tape] from your [limb.name]!"), + ) + if(!tool.use_tool(victim, user, 3 SECONDS, volume = 50)) + return TRUE + victim.visible_message( + span_notice("[user] removes the [applied_tape.name] from [victim]'s [limb.name]."), + span_danger("[user] removes the [applied_tape.name] from your [limb]."), + ) + QDEL_NULL(applied_tape) + return TRUE + +/// Pries moderately buckled limbs back into shape +/datum/wound/blunt/buckling/proc/pry_chassis(obj/item/tool, mob/user) + victim.visible_message( + span_notice("[user] starts prying the plating on [victim]'s [limb.name] back into place."), + span_notice("[user] starts prying the plating on your [limb.name] back into place."), + ) + if(!tool.use_tool(victim, user, 5 SECONDS, volume = 50)) + return TRUE + victim.visible_message( + span_notice("[user] pries the plating on [victim]'s [limb.name] back into place."), + span_notice("[user] pries the plating on your [limb.name] back into place."), + ) + qdel(src) + return TRUE + +/datum/wound/blunt/buckling/receive_damage(list/wounding_types, total_wound_dmg, wound_bonus, attack_direction) + if(!applied_tape) + return + applied_tape.use(round(total_wound_dmg / DAMAGE_PER_STACK)) + if(QDELETED(applied_tape)) + if(victim) + victim.visible_message( + span_warning("The [applied_tape.name] on [victim]'s [limb.name] falls apart!"), + span_danger("The [applied_tape.name] on your [limb.name] falls apart!") + ) + applied_tape = null + update_inefficiencies() + +/datum/wound/blunt/buckling/update_inefficiencies() + if(applied_tape) + var/tape_factor = TAPE_FACTOR_CALC(applied_tape.amount, applied_tape.nonorganic_heal) + interaction_efficiency_penalty = src::interaction_efficiency_penalty * tape_factor + limp_slowdown = src::limp_slowdown * tape_factor + if(applied_tape.amount >= MAX_TAPE_STACKS) + set_disabling(FALSE) + else if(applied_tape.amount < CEILING(MAX_TAPE_STACKS / 2, 1)) + set_disabling(src::disabling) + else + interaction_efficiency_penalty = src::interaction_efficiency_penalty + limp_slowdown = src::limp_slowdown + set_disabling(src::disabling) + + limb.update_wounds() + start_limping_if_we_should() + +/datum/wound/blunt/buckling/modify_desc_before_span(desc, mob/user) + if(!applied_tape) + return desc + var/tape_msg + var/tape_strength = 1 - TAPE_FACTOR_CALC(applied_tape.amount, applied_tape.nonorganic_heal) + switch(tape_strength) + if(0.75 to INFINITY) + tape_msg = "tightly" + if(0.5 to 0.75) + tape_msg = "somewhat" + if(0.25 to 0.5) + tape_msg = "loosely" + else + tape_msg = "just barely" + return "[victim.p_their(TRUE)] [limb.name] is [tape_msg] held together with [applied_tape.name]" + +#undef TAPE_FACTOR_CALC + +#undef TAPE_SCALE +#undef DAMAGE_PER_STACK +#undef MAX_TAPE_STACKS diff --git a/code/datums/wounds/robotic/electrical.dm b/code/datums/wounds/robotic/electrical.dm new file mode 100644 index 00000000000..8fa71647e6e --- /dev/null +++ b/code/datums/wounds/robotic/electrical.dm @@ -0,0 +1,130 @@ +// Electrical wounds are special and can be applied from any physical damage type, they get to be their own thing + +/datum/wound/electric + name = "Electrical Wound" + sound_effect = 'sound/effects/light_flicker.ogg' + wound_flags = NUMBS_BODYPART + bio_state_required = BIO_METAL + + /// The organ currently being affected by this wound. + var/obj/item/organ/affected_organ + /// The brain trauma linked to this wound, if on the brain's body part. + var/datum/brain_trauma/linked_trauma + /// The group of brain traumas that can be inflicted. + var/trauma_group = BRAIN_TRAUMA_MILD + +/datum/wound_pregen_data/electric + abstract = TRUE + required_limb_biostate = BIO_WIRED + + required_wounding_types = list(WOUND_PIERCE, WOUND_BURN) + mangled_wounding_types = list(WOUND_SLASH = ANATOMY_INTERIOR) + + wound_series = WOUND_SERIES_WIRED_ELECTRICAL + +/datum/wound/electric/severe + name = "Damaged Electronics" + desc = "Patient's electronics are damaged, preventing movement and damaging internal components." + treat_text = "Recommend replacement of internal wiring." + examine_desc = "occasionally sparks" + occur_text = "emits a shower of sparks" + threshold_penalty = 20 + severity = WOUND_SEVERITY_SEVERE + disabling = TRUE + +/datum/wound_pregen_data/electric/damaged + abstract = FALSE + + wound_path_to_generate = /datum/wound/electric/severe + threshold_minimum = 70 + +/datum/wound/electric/critical + name = "Short Circuit" + desc = "Patient's internal circuitry is shorted, causing significant power drain and loss of function." + treat_text = "Recommend replacement of internal electronics and wiring." + examine_desc = "is twitching and emitting electrical arcs" + occur_text = "arcs as its electronics short out" + threshold_penalty = 40 + sound_effect = 'sound/machines/defib_zap.ogg' + disabling = TRUE + processes = TRUE + wound_flags = MANGLES_EXTERIOR | NUMBS_BODYPART + severity = WOUND_SEVERITY_CRITICAL + trauma_group = BRAIN_TRAUMA_SEVERE + +/datum/wound_pregen_data/electric/shorted + abstract = FALSE + + wound_path_to_generate = /datum/wound/electric/critical + threshold_minimum = 110 + +/datum/wound/electric/wound_injury(datum/wound/old_wound, attack_direction) + if(!affected_organ) + affect_organ() + + +/datum/wound/electric/replace_wound(datum/wound/electric/new_wound, smited, attack_direction) + if(istype(new_wound, /datum/wound/electric)) + new_wound.affected_organ = affected_organ + return ..() + +/datum/wound/electric/remove_wound(ignore_limb, replaced) + if(!replaced) + restore_organ() + else + QDEL_NULL(linked_trauma) + return ..() + +/datum/wound/electric/set_victim(new_victim) + if(victim) + UnregisterSignal(victim, list(COMSIG_CARBON_LOSE_ORGAN, COMSIG_CARBON_GAIN_ORGAN)) + if(!new_victim) + restore_organ() + if(new_victim) + RegisterSignal(victim, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_organ_loss)) + RegisterSignal(victim, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_organ_gain)) + return ..() + +/datum/wound/electric/proc/affect_organ() + if(!affected_organ) + var/obj/item/organ/brain/victim_brain = victim.getorganslot(ORGAN_SLOT_BRAIN) + if(victim_brain && limb.body_zone == victim_brain.zone && victim_brain.status == ORGAN_ROBOTIC) + affected_organ = victim_brain + else + affected_organ = pick(limb.get_organs(ORGAN_ROBOTIC)) + if(!affected_organ) + return + if(affected_organ.slot == ORGAN_SLOT_BRAIN) + if(linked_trauma) + QDEL_NULL(linked_trauma) + to_chat(victim, span_userdanger(Gibberish("Warning: Power loss to central processing core detected!", TRUE, 40))) + linked_trauma = victim.gain_trauma_type(trauma_group, TRAUMA_RESILIENCE_WOUND) + else + to_chat(victim, span_userdanger("Your [affected_organ.name] suddenly shuts down as it loses power!")) + ADD_TRAIT(affected_organ, TRAIT_ORGAN_FAILING, POWER_LACK_TRAIT) // power is not reaching this organ + +/datum/wound/electric/proc/restore_organ() + SIGNAL_HANDLER + if(!affected_organ) + return + if(linked_trauma) + QDEL_NULL(linked_trauma) + else + REMOVE_TRAIT(affected_organ, TRAIT_ORGAN_FAILING, POWER_LACK_TRAIT) + +/datum/wound/electric/proc/on_organ_loss(datum/source, obj/item/organ/lost_organ) + SIGNAL_HANDLER + if(lost_organ == affected_organ) + restore_organ() + affect_organ() + +/datum/wound/electric/proc/on_organ_gain(datum/source, obj/item/organ/new_organ) + SIGNAL_HANDLER + if(!affected_organ && new_organ.zone == limb.body_zone) + affect_organ() + +/datum/wound/electric/handle_process(seconds_per_tick, times_fired) + if(!victim) + return + if(victim.mob_biotypes & MOB_ROBOTIC) + victim.adjust_nutrition(severity * -WOUND_ELECTRIC_POWER_DRAIN) diff --git a/code/datums/wounds/robotic/heat_warping.dm b/code/datums/wounds/robotic/heat_warping.dm new file mode 100644 index 00000000000..f0d716cea6d --- /dev/null +++ b/code/datums/wounds/robotic/heat_warping.dm @@ -0,0 +1,180 @@ +/// The flame temperature required to re-heat the chassis. +#define CHASSIS_MELTING_POINT 1900 + +/datum/wound/burn/heat_warping + name = "Heat-Warping Wound" + sound_effect = 'sound/machines/clockcult/steam_whoosh.ogg' + + wound_flags = PLATING_DAMAGE + bio_state_required = BIO_METAL + + /// Whether the limb has been re-heated, allowing it to be bent back into shape + var/re_heated = FALSE + +/datum/wound_pregen_data/heat_warping + abstract = TRUE + required_limb_biostate = BIO_METAL + + required_wounding_types = list(WOUND_BURN) + + wound_series = WOUND_SERIES_METAL_HEAT_WARPING + +/datum/wound/burn/heat_warping/set_limb(obj/item/bodypart/new_value, replaced) + var/obj/item/bodypart/old_limb = ..() + if(old_limb && !replaced && !QDELETED(old_limb)) + old_limb.heal_damage(burn = min(old_limb.max_damage, WOUND_MAX_INTEGRITY_CONSIDERED) * limb_integrity_penalty) + if(new_value) + var/limb_damage = limb.get_damage() + if(limb_damage < limb.wound_integrity_loss) + limb.set_burn_dam(CEILING(limb.burn_dam + limb.wound_integrity_loss - limb_damage, DAMAGE_PRECISION)) + return old_limb + +/datum/wound/burn/heat_warping/treat(obj/item/tool, mob/user) + if(tool.tool_behaviour == TOOL_WELDER) + return heat_chassis(tool, user) + if(tool.tool_behaviour == TOOL_CROWBAR) + return bend_chassis(tool, user) + return ..() + +/datum/wound/burn/heat_warping/check_grab_treatments(obj/item/tool, mob/user) + if(tool.get_temperature() > CHASSIS_MELTING_POINT) + INVOKE_ASYNC(src, PROC_REF(heat_chassis), tool, user) + return TRUE + return FALSE + +/datum/wound/burn/heat_warping/get_examine_description(mob/user) + . = ..() + if(re_heated) + . += span_notice(" It has been re-heated and can be bent back into shape.") + +/datum/wound/burn/heat_warping/proc/heat_chassis(obj/item/tool, mob/user) + if(re_heated) + to_chat(user, span_warning("[victim]'s [limb.name] is already hot!")) + return TRUE + victim.visible_message( + span_notice("[user] begins re-heating [victim]'s [limb.name]..."), + span_notice("[user] begins re-heating your [limb.name]..."), + ) + if(!tool.use_tool(victim, user, 5 SECONDS, volume = 50)) + return TRUE + victim.visible_message( + span_notice("[victim]'s [limb.name] glows red-hot, ready to be reformed."), + span_notice("Your [limb.name] glows red-hot, ready to be reformed."), + ) + re_heated = TRUE + addtimer(CALLBACK(src, PROC_REF(cool_down)), 1 MINUTES, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_DELETE_ME) + return TRUE + +/datum/wound/burn/heat_warping/proc/bend_chassis(obj/item/tool, mob/user) + if(!re_heated) + return FALSE + victim.visible_message( + span_notice("[user] starts to bend [victim]'s [limb.name] back into shape..."), + span_notice("[user] starts to bend your [limb.name] back into shape..."), + ) + if(!tool.use_tool(victim, user, 4 SECONDS, volume = 50)) + return TRUE + victim.visible_message( + span_notice("[user] starts to bend [victim]'s [limb.name] back into shape..."), + span_notice("[user] starts to bend your [limb.name] back into shape..."), + ) + qdel(src) + return TRUE + +/datum/wound/burn/heat_warping/proc/cool_down() + victim.visible_message( + span_warning("[victim]'s [limb.name] cools back down."), + span_warning("Your [limb.name] cools back down."), + ) + re_heated = FALSE + +/datum/wound/burn/heat_warping/moderate + name = "Surface Oxidization" + desc = "Patient's external plating has been oxidized by high temperature." + treat_text = "Recommend applying a cleaning agent to remove the oxidized layer, or burning it off with a welding tool." + examine_desc = "is oxidized across much of its surface" + occur_text = "starts to become discolored" + severity = WOUND_SEVERITY_MODERATE + treatable_tools = list(TOOL_WELDER) + threshold_penalty = 20 + limb_integrity_penalty = 0.1 + +/datum/wound_pregen_data/heat_warping/oxidation + abstract = FALSE + + wound_path_to_generate = /datum/wound/burn/heat_warping/moderate + threshold_minimum = 30 + +/datum/wound/burn/heat_warping/oxidation/moderate/set_victim(new_victim) + if(victim) + UnregisterSignal(victim, COMSIG_ATOM_EXPOSE_REAGENTS) + if(new_victim) + RegisterSignal(victim, COMSIG_ATOM_EXPOSE_REAGENTS, PROC_REF(on_expose)) + return ..() + +/datum/wound/burn/heat_warping/moderate/heat_chassis(obj/item/tool, mob/user) + victim.visible_message( + span_notice("[user] starts to burn the oxidized layer off of [victim]'s [limb.name]..."), + span_notice("[user] starts to burn the oxidized layer off of your [limb.name]..."), + ) + if(!tool.use_tool(victim, user, 4 SECONDS, volume = 50)) + return TRUE + victim.visible_message( + span_notice("[user] burns the oxidized layer off of [victim]'s [limb.name]."), + span_notice("[user] burns the oxidized layer off of your [limb.name]."), + ) + qdel(src) + return TRUE + +/datum/wound/burn/heat_warping/oxidation/moderate/proc/on_expose(atom/source, list/reagents, datum/reagents/source_reagents, methods, volume_modifier, show_message) + SIGNAL_HANDLER + + if(!(methods & (TOUCH|VAPOR|PATCH))) + return + var/total_clean_power = 0 + for(var/datum/reagent/space_cleaner/cleaner in reagents) + total_clean_power += cleaner.volume * cleaner.robot_clean_power * volume_modifier + if (total_clean_power) + source.visible_message( + span_notice("The surface of [victim]'s [limb.name] begins to bubble."), + span_notice("The surface of your [limb.name] begins to bubble."), + ) + playsound(victim, 'sound/effects/bubbles.ogg', 25 + total_clean_power * 2) + handle_regen_progress() + +/datum/wound/burn/heat_warping/severe + name = "Warped Plating" + desc = "Patient's external plating has been warped by thermal stress, threatening its structural integrity." + treat_text = "Recommend re-heating the external plating and bending it back into shape." + examine_desc = "is heat-warped and charred" + occur_text = "warps from the high temperature" + severity = WOUND_SEVERITY_SEVERE + treatable_tools = list(TOOL_WELDER, TOOL_CROWBAR) + threshold_penalty = 30 + limb_integrity_penalty = 0.2 + +/datum/wound_pregen_data/heat_warping/thermal_stress + abstract = FALSE + + wound_path_to_generate = /datum/wound/burn/heat_warping/severe + threshold_minimum = 75 + +/datum/wound/burn/heat_warping/critical + name = "Deformed Chassis" + desc = "Patient's chassis has been severely deformed from temperatures close to its melting point and can no longer function." + treat_text = "Recommend replacement of the warped external plating." + examine_desc = "is a deformed mass of metal and slag" + occur_text = "glows red-hot and begins to deform" + severity = WOUND_SEVERITY_CRITICAL + wound_flags = PLATING_DAMAGE | MANGLES_INTERIOR + disabling = TRUE + threshold_penalty = 40 + limb_integrity_penalty = 0.3 + +/datum/wound_pregen_data/heat_warping/deformed_slag + abstract = FALSE + + wound_path_to_generate = /datum/wound/burn/heat_warping/critical + threshold_minimum = 130 + +#undef CHASSIS_MELTING_POINT diff --git a/code/datums/wounds/slash.dm b/code/datums/wounds/slash.dm index a3003c22a6c..b982ab2adce 100644 --- a/code/datums/wounds/slash.dm +++ b/code/datums/wounds/slash.dm @@ -3,15 +3,26 @@ */ /datum/wound/slash - name = "Slashing Wound" + name = "Slashing (Cut) Wound" + sound_effect = 'sound/weapons/slice.ogg' + +/datum/wound_pregen_data/flesh_slash + abstract = TRUE + + required_wounding_types = list(WOUND_SLASH) + required_limb_biostate = BIO_FLESH + + wound_series = WOUND_SERIES_FLESH_SLASH_BLEED + +/datum/wound/slash/flesh + name = "Slashing (Cut) Flesh Wound" sound_effect = 'sound/weapons/slice.ogg' processes = TRUE - wound_type = WOUND_SLASH treatable_by = list(/obj/item/stack/medical/suture) treatable_by_grabbed = list(/obj/item/gun/energy/laser) - treatable_tool = TOOL_CAUTERY + treatable_tools = list(TOOL_CAUTERY) base_treat_time = 3 SECONDS - wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE) + wound_flags = ACCEPTS_GAUZE | CAN_BE_GRASPED /// How much blood we start losing when this wound is first applied var/initial_flow @@ -24,26 +35,26 @@ /// The maximum flow we've had so far var/highest_flow -/datum/wound/slash/show_wound_topic(mob/user) +/datum/wound/slash/flesh/show_wound_topic(mob/user) return (user == victim && blood_flow) -/datum/wound/slash/Topic(href, href_list) +/datum/wound/slash/flesh/Topic(href, href_list) . = ..() if(href_list["wound_topic"]) if(!usr == victim) return victim.self_grasp_bleeding_limb(limb) -/datum/wound/slash/wound_injury(datum/wound/slash/old_wound = null, attack_direction = null) +/datum/wound/slash/flesh/wound_injury(datum/wound/slash/flesh/old_wound = null, attack_direction = null) blood_flow = initial_flow if(old_wound) blood_flow = max(old_wound.blood_flow, initial_flow) - else if(attack_direction && victim.blood_volume > BLOOD_VOLUME_OKAY) + else if(limb.can_bleed() && attack_direction && victim.blood_volume > BLOOD_VOLUME_OKAY) victim.spray_blood(attack_direction, severity) -/datum/wound/slash/get_examine_description(mob/user) +/datum/wound/slash/flesh/get_examine_description(mob/user) if(!limb.current_gauze) return ..() @@ -62,11 +73,14 @@ return "[msg.Join()]" -/datum/wound/slash/receive_damage(wounding_type, wounding_dmg, wound_bonus) - if(victim.stat != DEAD && wound_bonus != CANT_WOUND && wounding_type == WOUND_SLASH) // can't stab dead bodies to make it bleed faster this way - blood_flow += 0.05 * wounding_dmg +/datum/wound/slash/flesh/receive_damage(list/wounding_types, total_wound_dmg, wound_bonus) + if(!victim) // if we are dismembered, we can still take damage, its fine to check here + return + + if(victim.stat != DEAD && wound_bonus != CANT_WOUND && wounding_types[WOUND_SLASH] < WOUND_MINIMUM_DAMAGE) // can't stab dead bodies to make it bleed faster this way + blood_flow += 0.05 * wounding_types[WOUND_SLASH] -/datum/wound/slash/drag_bleed_amount() +/datum/wound/slash/flesh/drag_bleed_amount() // say we have 3 severe cuts with 3 blood flow each, pretty reasonable // compare with being at 100 brute damage before, where you bled (brute/100 * 2), = 2 blood per tile // 3 * 3 * 0.1 = 0.9 blood total, less than before! the share here is .3 blood of course. @@ -78,15 +92,21 @@ return bleed_amt -/datum/wound/slash/get_bleed_rate_of_change() +/datum/wound/slash/flesh/get_bleed_rate_of_change() + if(!limb.can_bleed()) + return BLOOD_FLOW_STEADY if(HAS_TRAIT(victim, TRAIT_BLOODY_MESS)) return BLOOD_FLOW_INCREASING if(limb.current_gauze || clot_rate > 0) return BLOOD_FLOW_DECREASING if(clot_rate < 0) return BLOOD_FLOW_INCREASING + return BLOOD_FLOW_STEADY + +/datum/wound/slash/flesh/handle_process() + if(!victim || IS_IN_STASIS(victim)) + return -/datum/wound/slash/handle_process() if(victim.stat == DEAD) blood_flow -= max(clot_rate, WOUND_SLASH_DEAD_CLOT_MIN) if(blood_flow < minimum_flow) @@ -114,12 +134,12 @@ if(blood_flow < minimum_flow) if(demotes_to) - replace_wound(demotes_to) + replace_wound(new demotes_to) else to_chat(victim, span_green("The cut on your [limb.name] has stopped bleeding!")) qdel(src) -/datum/wound/slash/on_stasis() +/datum/wound/slash/flesh/on_stasis() if(blood_flow >= minimum_flow) return if(demotes_to) @@ -129,29 +149,29 @@ /* BEWARE, THE BELOW NONSENSE IS MADNESS. bones.dm looks more like what I have in mind and is sufficiently clean, don't pay attention to this messiness */ // what do you mean dont pay attention. what?? -/datum/wound/slash/check_grab_treatments(obj/item/I, mob/user) +/datum/wound/slash/flesh/check_grab_treatments(obj/item/I, mob/user) if(istype(I, /obj/item/gun/energy/laser)) return TRUE if(I.get_temperature()) // if we're using something hot but not a cautery, we need to be aggro grabbing them first, so we don't try treating someone we're eswording return TRUE -/datum/wound/slash/treat(obj/item/I, mob/user) +/datum/wound/slash/flesh/treat(obj/item/I, mob/user) if(istype(I, /obj/item/gun/energy/laser)) - las_cauterize(I, user) + return las_cauterize(I, user) else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature()) - tool_cauterize(I, user) + return tool_cauterize(I, user) else if(istype(I, /obj/item/stack/medical/suture)) - suture(I, user) + return suture(I, user) -/datum/wound/slash/on_xadone(power) //this is for cryo, check and maybe remove later +/datum/wound/slash/flesh/on_xadone(power) //this is for cryo, check and maybe remove later . = ..() blood_flow -= 0.03 * power // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick -/datum/wound/slash/on_synthflesh(power) +/datum/wound/slash/flesh/on_synthflesh(power) . = ..() blood_flow -= 0.075 * power // 20u * 0.075 = -1.5 blood flow -/datum/wound/slash/on_silfrine(power) +/datum/wound/slash/flesh/on_silfrine(power) switch(power) if(0 to 5) EMPTY_BLOCK_GUARD @@ -164,7 +184,7 @@ blood_flow -= 0.05 * power /// If someone's putting a laser gun up to our cut to cauterize it -/datum/wound/slash/proc/las_cauterize(obj/item/gun/energy/laser/lasgun, mob/user) +/datum/wound/slash/flesh/proc/las_cauterize(obj/item/gun/energy/laser/lasgun, mob/user) var/self_penalty_mult = (user == victim ? 1.25 : 1) user.visible_message( span_warning("[user] begins aiming [lasgun] directly at [victim]'s [limb.name]..."), @@ -172,20 +192,21 @@ ) if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) - return + return TRUE var/damage = lasgun.chambered.BB.damage lasgun.chambered.BB.wound_bonus -= 30 lasgun.chambered.BB.damage *= self_penalty_mult if(!lasgun.process_fire(victim, victim, TRUE, null, limb.body_zone)) - return + return TRUE victim.force_scream() blood_flow -= damage / (5 * self_penalty_mult) // 20 / 5 = 4 bloodflow removed, p good victim.visible_message(span_warning("The cuts on [victim]'s [limb.name] scar over!")) + return TRUE /// If someone is using either a cautery tool or something with heat to cauterize this cut -/datum/wound/slash/proc/tool_cauterize(obj/item/I, mob/user) +/datum/wound/slash/flesh/proc/tool_cauterize(obj/item/I, mob/user) var/improv_penalty_mult = (I.tool_behaviour == TOOL_CAUTERY ? 1 : 1.25) // 25% longer and less effective if you don't use a real cautery var/self_penalty_mult = (user == victim ? 1.2 : 1) user.visible_message( @@ -193,7 +214,7 @@ span_warning("You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]..."), ) if(!do_after(user, base_treat_time * self_penalty_mult * improv_penalty_mult, target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) - return + return TRUE playsound(user, 'sound/surgery/cautery2.ogg', 20) user.visible_message( @@ -206,12 +227,13 @@ blood_flow -= blood_cauterized if(blood_flow > minimum_flow) - try_treating(I, user) + return try_treating(I, user) else if(demotes_to) to_chat(user, span_green("You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.")) + return TRUE /// If someone is using a suture to close this cut -/datum/wound/slash/proc/suture(obj/item/stack/medical/suture/I, mob/user) +/datum/wound/slash/flesh/proc/suture(obj/item/stack/medical/suture/I, mob/user) var/self_penalty_mult = (user == victim ? 1 : 1) user.visible_message( span_notice("[user] begins stitching [victim]'s [limb.name] with [I]..."), @@ -219,7 +241,7 @@ ) if(!do_after(user, base_treat_time * self_penalty_mult, target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) - return + return TRUE user.visible_message( span_green("[user] stitches up some of the bleeding on [victim]."), span_green("You stitch up some of the bleeding on [user == victim ? "yourself" : "[victim]"]."), @@ -230,11 +252,13 @@ I.use(1) if(blood_flow > minimum_flow) - try_treating(I, user) + return try_treating(I, user) else if(demotes_to) to_chat(user, span_green("You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.")) + return TRUE + return FALSE -/datum/wound/slash/moderate +/datum/wound/slash/flesh/moderate name = "Rough Abrasion" desc = "Patient's flesh has been badly scraped, generating moderate blood loss." treat_text = "Application of clean bandages and sutures." @@ -245,11 +269,16 @@ initial_flow = 1.5 minimum_flow = 0.1 clot_rate = 0.015 - threshold_minimum = 30 threshold_penalty = 10 - status_effect_type = /datum/status_effect/wound/slash/moderate + status_effect_type = /datum/status_effect/wound/slash/flesh/moderate + +/datum/wound_pregen_data/flesh_slash/abrasion + abstract = FALSE -/datum/wound/slash/severe + wound_path_to_generate = /datum/wound/slash/flesh/moderate + threshold_minimum = 30 + +/datum/wound/slash/flesh/severe name = "Open Laceration" desc = "Patient's flesh is ripped clean open, allowing significant blood loss." treat_text = "Application of clean bandages and sutures or cauterization." @@ -260,12 +289,17 @@ initial_flow = 2 minimum_flow = 1.5 clot_rate = 0.025 - threshold_minimum = 50 threshold_penalty = 20 - demotes_to = /datum/wound/slash/moderate - status_effect_type = /datum/status_effect/wound/slash/severe + demotes_to = /datum/wound/slash/flesh/moderate + status_effect_type = /datum/status_effect/wound/slash/flesh/severe + +/datum/wound_pregen_data/flesh_slash/laceration + abstract = FALSE -/datum/wound/slash/critical + wound_path_to_generate = /datum/wound/slash/flesh/severe + threshold_minimum = 50 + +/datum/wound/slash/flesh/critical name = "Weeping Avulsion" desc = "Patient's flesh is completely torn open, along with significant loss of tissue. Extreme blood loss will lead to quick death without intervention." treat_text = "Bandage immediately and apply pressure, then apply sutures or cauterization." @@ -276,8 +310,18 @@ initial_flow = 3 minimum_flow = 2 clot_rate = -0.005 // critical cuts actively get worse instead of better - threshold_minimum = 100 threshold_penalty = 50 - demotes_to = /datum/wound/slash/severe - status_effect_type = /datum/status_effect/wound/slash/critical - wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE | MANGLES_FLESH) + demotes_to = /datum/wound/slash/flesh/severe + status_effect_type = /datum/status_effect/wound/slash/flesh/critical + wound_flags = ACCEPTS_GAUZE | MANGLES_EXTERIOR | CAN_BE_GRASPED + +/datum/wound_pregen_data/flesh_slash/avulsion + abstract = FALSE + + wound_path_to_generate = /datum/wound/slash/flesh/critical + threshold_minimum = 100 + +/datum/wound/slash/flesh/critical/receive_damage(list/wounding_types, total_wound_dmg, wound_bonus) + . = ..() + if(victim && wounding_types[WOUND_BLUNT]) + playsound(victim, "sound/effects/wounds/crackandbleed.ogg", 100) diff --git a/code/game/area/areas/ruins/rockplanet.dm b/code/game/area/areas/ruins/rockplanet.dm index 071aa030bb2..332d5abfbf8 100644 --- a/code/game/area/areas/ruins/rockplanet.dm +++ b/code/game/area/areas/ruins/rockplanet.dm @@ -142,6 +142,22 @@ name = "Crashed Moonshiner" icon_state = "green" +/area/ruin/rockplanet/rust_base/drop1 + name = "Dropship" + icon_state = "green" + +/area/ruin/rockplanet/rust_base/drop2 + name = "Dropship" + icon_state = "green" + +/area/ruin/rockplanet/rust_base/drop3 + name = "Dropship" + icon_state = "green" + +/area/ruin/rockplanet/rust_base/drop4 + name = "Dropship" + icon_state = "green" + //River Valley Stash /area/ruin/rockplanet/river_valley_stash/shuttle diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d99f2ecb099..bdc24d3d4d8 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -506,12 +506,14 @@ * - show_message: Whether to display anything to mobs when they are exposed. */ /atom/proc/expose_reagents(list/reagents, datum/reagents/source, method=TOUCH, volume_modifier=1, show_message=TRUE) - if((. = SEND_SIGNAL(src, COMSIG_ATOM_EXPOSE_REAGENTS, reagents, source, method, volume_modifier, show_message)) & COMPONENT_NO_EXPOSE_REAGENTS) + . = SEND_SIGNAL(src, COMSIG_ATOM_EXPOSE_REAGENTS, reagents, source, method, volume_modifier, show_message) + if(. & COMPONENT_NO_EXPOSE_REAGENTS) return for(var/reagent in reagents) var/datum/reagent/R = reagent . |= R.expose_atom(src, reagents[R]) + SEND_SIGNAL(src, COMSIG_ATOM_AFTER_EXPOSE_REAGENTS, reagents, source, method, volume_modifier, show_message) /// Are you allowed to drop this atom /atom/proc/AllowDrop() @@ -1737,16 +1739,22 @@ * * dealt_bare_wound_bonus- The bare_wound_bonus, if one was specified *and applied*, of the wounding attack. Not shown if armor was present * * base_roll- Base wounding ability of an attack is a random number from 1 to (dealt_damage ** WOUND_DAMAGE_EXPONENT). This is the number that was rolled in there, before mods */ -/proc/log_wound(atom/victim, datum/wound/suffered_wound, dealt_damage, dealt_wound_bonus, dealt_bare_wound_bonus, base_roll) - if(QDELETED(victim) || !suffered_wound) +/proc/log_wound(atom/victim, obj/item/bodypart/limb, list/datum/wound/suffered_wounds, list/wounding_types, dealt_wound_bonus, dealt_bare_wound_bonus, list/base_rolls) + if(QDELETED(victim) || !LAZYLEN(suffered_wounds)) return - var/message = "has suffered: [suffered_wound][suffered_wound.limb ? " to [suffered_wound.limb.name]" : null]"// maybe indicate if it's a promote/demote? - - if(dealt_damage) - message += " | Damage: [dealt_damage]" - // The base roll is useful since it can show how lucky someone got with the given attack. For example, dealing a cut - if(base_roll) - message += " (rolled [base_roll]/[dealt_damage ** WOUND_DAMAGE_EXPONENT])" + var/message = "has suffered: [english_list(suffered_wounds)][limb ? " to [limb.name]" : null]"// maybe indicate if it's a promote/demote? + + if(wounding_types) + var/damage_text + for(var/wounding_type in wounding_types) + if(damage_text) + damage_text += ", " + var/damage_dealt = wounding_types[wounding_type] + damage_text = "[damage_dealt] [wounding_type]" + // The base roll is useful since it can show how lucky someone got with the given attack. For example, dealing a cut + if(base_rolls) + damage_text += "(rolled [base_rolls[wounding_type]]/[damage_dealt ** WOUND_DAMAGE_EXPONENT])" + message += " | Damage: [damage_text]" if(dealt_wound_bonus) message += " | WB: [dealt_wound_bonus]" diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 32fa59ae76c..b5291587406 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -119,7 +119,7 @@ if (get_dist(src, L) > range) continue - if(L.flash_act(affect_silicon = 1)) + if(L.flash_act(affect_silicon = 1) & FLASH_EFFECT) L.Paralyze(strength) flashed = TRUE diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index da32e0b5692..e887acbf348 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -35,11 +35,11 @@ /// Stun mode projectile type var/stun_projectile = /obj/projectile/beam/disabler /// Sound of stun projectile - var/stun_projectile_sound = 'sound/weapons/plasma_cutter.ogg' + var/stun_projectile_sound = 'sound/weapons/melee/plasmacutter/plasma_cutter.ogg' /// Lethal mode projectile type var/lethal_projectile = /obj/projectile/beam/laser /// Sound of lethal projectile - var/lethal_projectile_sound = 'sound/weapons/plasma_cutter.ogg' + var/lethal_projectile_sound = 'sound/weapons/melee/plasmacutter/plasma_cutter.ogg' /// Power needed per shot var/reqpower = 500 diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 8127293fd3e..67c99bab399 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -176,7 +176,7 @@ righthand_file = GUN_RIGHTHAND_ICON energy_drain = 30 projectile = /obj/projectile/plasma/adv/mech - fire_sound = 'sound/weapons/plasma_cutter.ogg' + fire_sound = 'sound/weapons/melee/plasmacutter/plasma_cutter.ogg' harmful = TRUE /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/can_attach(obj/mecha/working/M) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index df106084a0c..a2270fe702e 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -700,7 +700,7 @@ if(isobj(obstacle)) var/obj/object = obstacle obstacle.mech_melee_attack(src) - if(!(object.resistance_flags & INDESTRUCTIBLE) && charge_toss_structures) + if(!(object.resistance_flags & INDESTRUCTIBLE) && charge_toss_structures && !QDELETED(object)) object.throw_at(throw_target, 4, 3) visible_message(span_danger("[src] crashes into [obstacle]!")) playsound(src, 'sound/effects/bang.ogg', 50, TRUE) @@ -1355,4 +1355,5 @@ GLOBAL_VAR_INIT(year_integer, text2num(year)) // = 2013??? /// Sets the direction of the mecha and all of its occcupents, required for FOV. Alternatively one could make a recursive contents registration and register topmost direction changes in the fov component /obj/mecha/proc/set_dir_mecha(new_dir) setDir(new_dir) - occupant.setDir(new_dir) + if(occupant) + occupant.setDir(new_dir) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 5b13ef40eb8..34e85b9b903 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -8,7 +8,7 @@ var/buckle_prevents_pull = FALSE //Interaction -/atom/movable/attack_hand(mob/living/user) +/atom/movable/attack_hand(mob/living/user, list/modifiers) . = ..() if(.) return diff --git a/code/game/objects/effects/anomalies/anomalies_bluespace.dm b/code/game/objects/effects/anomalies/anomalies_bluespace.dm index 19d163f131e..2f68eab9d48 100644 --- a/code/game/objects/effects/anomalies/anomalies_bluespace.dm +++ b/code/game/objects/effects/anomalies/anomalies_bluespace.dm @@ -54,7 +54,7 @@ var/list/flashers = list() for(var/mob/living/carbon/C in viewers(TO, null)) - if(C.flash_act()) + if(C.flash_act() & FLASH_EFFECT) flashers += C var/y_distance = TO.y - FROM.y diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 82b447ab8fe..f57c0096471 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -552,6 +552,92 @@ desc = "This poster depicts a trio of PGF sailors. The elzuose's horns are sticking up through the text block. \"Get your bigass horns out of the caption!\"" icon_state = "poster-pgf_bigass-horns" +/obj/structure/sign/poster/contraband/diet_guide + name = "Dietary Guide" + desc = "It's a food safety infographic outlining the types of food that different species can and cannot eat." + icon_state = "poster-diet-guide" + /// Static string containing the pre-generated diet guide. + var/static/diet_guide_text + /// Static list with positioning of the food icons. + var/static/list/icon_positions = list() + var/base_text = {" +

Species Dietary Guide

+ + DIET_DATA_HERE +
+
+ + + + + + + + + + + + + +
✓
Safe to eat
✗
Cannot be digested
✗
Toxic if ingested
+"} + +/obj/structure/sign/poster/contraband/diet_guide/ComponentInitialize() + . = ..() + if(!diet_guide_text || !LAZYLEN(icon_positions)) + var/static/list/food_images = list( + "Meat, Eggs" = "food-cooked_meat", + "Raw Meat" = "food-raw_meat", + "Grains" = "food-bread", + "Fruits" = "food-fruit", + "Veggies" = "food-vegetable", + "Dairy" = "food-dairy", + "Cloth" = "food-cloth", + "Fried Foods" = "food-fried", + ) + var/diet_text_data = "" + var/stamp_x_pos = 81 + for(var/food_name in food_images) //
+ diet_text_data += "


[food_name]
" + icon_positions[food_images[food_name]] = stamp_x_pos + stamp_x_pos += 62 + diet_text_data += "" + var/species_count = 0 + var/static/list/food_groups = list(MEAT, RAW, GRAIN, FRUIT, VEGETABLES, DAIRY, CLOTH, FRIED) + for(var/species_id in GLOB.roundstart_races) + var/datum/species/species = GLOB.species_list[species_id] + species = new species() + if(species.reagent_tag == PROCESS_SYNTHETIC) + continue // you don't need a poster to tell you that robots don't eat food + if(TRAIT_NOHUNGER in species.inherent_traits) + continue // duh + species_count++ + diet_text_data += "
[replacetext(species.name, "\improper ", "")]
" + var/background_color = (species_count % 2) ? "d9f5e1" : "ffffff" + for(var/food_group in food_groups) + diet_text_data += "" + if(species.toxic_food & food_group) + diet_text_data += "
✗
" + continue + if(species.disliked_food & food_group) + diet_text_data += "
✗
" + continue + diet_text_data += "
✓
" + diet_text_data += "" + qdel(species) + diet_guide_text = replacetext(base_text, "DIET_DATA_HERE", diet_text_data) + + var/datum/component/writing/diet_guide = AddComponent(/datum/component/writing, \ + raw_text = diet_guide_text, \ + window_width = 600, \ + window_height = 640, \ + resizable = FALSE, \ + ) + + var/datum/asset/spritesheet/simple/paper_assets = get_asset_datum(/datum/asset/spritesheet/simple/paper) + for(var/food_name in icon_positions) + diet_guide.add_graphic(paper_assets.icon_class_name(food_name), icon_positions[food_name], 44, 0, food_name) + //beginning of Nanotrasen approved posters. Expect corprate propaganda and motavation. You will usually only see this on Nanotrasen ships and stations /obj/structure/sign/poster/official poster_item_name = "motivational poster" diff --git a/code/game/objects/effects/spawners/random/random.dm b/code/game/objects/effects/spawners/random/random.dm index 4d9b93068e1..510537ec621 100644 --- a/code/game/objects/effects/spawners/random/random.dm +++ b/code/game/objects/effects/spawners/random/random.dm @@ -179,3 +179,18 @@ stat_table += spawned_table for(var/item in stat_table) stat_table[item] /= loot_count + +/obj/effect/spawner/random/garden + name = "garden or nothing spawner" + desc = "cloudy with a chance of gardens" + icon_state = "seed" + +/obj/effect/spawner/random/garden/arid + loot = list( + /obj/structure/flora/ash/garden/arid + ) + +/obj/effect/spawner/random/garden/arid/fifty/Initialize(mapload) + if(prob(50)) + return ..() + return INITIALIZE_HINT_QDEL diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 9a7bb8047c8..ee552ff05a8 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -433,7 +433,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb add_fingerprint(usr) return ..() -/obj/item/attack_hand(mob/user) +/obj/item/attack_hand(mob/user, list/modifiers) . = ..() if(.) return @@ -442,11 +442,15 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb if(anchored) return + // Right-click is now the standard for opening storage items, and shouldn't try to pickup/unequip items without storage. + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + return + //check if the item is inside another item's storage - if(istype(loc, /obj/item/storage)) + if(isitem(loc)) //if so, can we actually access it? var/datum/component/storage/ourstorage = loc.GetComponent(/datum/component/storage) - if(!ourstorage.access_check()) + if(ourstorage && !ourstorage.access_check()) SEND_SIGNAL(loc, COMSIG_TRY_STORAGE_HIDE_FROM, user)//you're not supposed to be in here right now, punk! return diff --git a/code/game/objects/items/attachments/short_scope.dm b/code/game/objects/items/attachments/short_scope.dm index 3a6d02f1f40..98eae1e0408 100644 --- a/code/game/objects/items/attachments/short_scope.dm +++ b/code/game/objects/items/attachments/short_scope.dm @@ -7,11 +7,18 @@ pixel_shift_x = 1 pixel_shift_y = 2 size_mod = 0 + unique_reskin = list( + "Scope" = "small_scope", + "Classic" = "small_scope_old", + ) + unique_reskin_changes_inhand = TRUE var/zoom_mod = 4 var/zoom_out_mod = 0 var/min_recoil_mod = 0.1 var/aim_slowdown_mod = 0.2 +/obj/item/attachment/scope/old + icon_state = "small_scope_old" /obj/item/attachment/scope/apply_attachment(obj/item/gun/gun, mob/user) . = ..() diff --git a/code/game/objects/items/bank_card.dm b/code/game/objects/items/bank_card.dm index 7afe048b16b..079bb44a070 100644 --- a/code/game/objects/items/bank_card.dm +++ b/code/game/objects/items/bank_card.dm @@ -147,7 +147,7 @@ . = ..() if(registered_account) . += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr." - . += "The card indicates that the holder is [registered_account.holder_age] years old. [(registered_account.holder_age < AGE_MINOR) ? "There's a holographic stripe that reads [span_danger("'MINOR: DO NOT SERVE ALCOHOL OR TOBACCO'")] along the bottom of the card." : ""]" + . += "The card indicates that the holder is [registered_account.holder_age] years old. [(registered_account.holder_age < AGE_DRINKING) ? "There's a holographic stripe that reads [span_danger("'DO NOT SERVE ALCOHOL OR TOBACCO'")] along the bottom of the card." : ""]" . += span_info("Alt-Click the ID to pull money from the linked account in the form of holochips.") . += span_info("You can insert credits into the linked account by pressing holochips, cash, or coins against the ID.") . += span_boldnotice("If you lose this ID card, you can reclaim your account by Alt-Clicking a blank ID card while holding it and entering your account ID number.") diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index b734c473cf3..82891a9ecbd 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -202,7 +202,7 @@ . += "[registered_name]" if(registered_age) . += "AGE:" - . += "[registered_age] years old [(registered_age < AGE_MINOR) ? "There's a holographic stripe that reads [span_danger("'MINOR: DO NOT SERVE ALCOHOL OR TOBACCO'")] along the bottom of the card." : ""]" + . += "[registered_age] years old [(registered_age < AGE_DRINKING) ? "There's a holographic stripe that reads [span_danger("'DO NOT SERVE ALCOHOL OR TOBACCO'")] along the bottom of the card." : ""]" if(length(ship_access)) var/list/ship_factions = list() var/list/ship_names = list() diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index ea15c3c53d4..3e491d4ee98 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -239,6 +239,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM M.update_inv_hands() /obj/item/clothing/mask/cigarette/proc/handle_reagents() + var/enclosed = FALSE if(reagents.total_volume) var/to_smoke = REAGENTS_METABOLISM if(iscarbon(loc)) @@ -257,8 +258,14 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS) if(L && !(L.organ_flags & ORGAN_SYNTHETIC)) C.adjustOrganLoss(ORGAN_SLOT_LUNGS, lung_harm) - secondhand_smoke.set_up(3, src) - secondhand_smoke.start() + + var/obj/item/clothing/headwear = C.get_item_by_slot(ITEM_SLOT_HEAD) + if(headwear?.clothing_flags & STOPSPRESSUREDAMAGE) + enclosed = TRUE + + if(!enclosed) + secondhand_smoke.set_up(3, src) + secondhand_smoke.start() reagents.remove_any(to_smoke) /obj/item/clothing/mask/cigarette/process(seconds_per_tick) diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index e7a94b91591..31f257b332a 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -338,6 +338,28 @@ /obj/item/stock_parts/capacitor = 1) def_components = list(/obj/item/stock_parts/cell = /obj/item/stock_parts/cell/high/empty) +/obj/item/circuitboard/machine/cloak + name = "Ship Cloaking Device (Machine Board)" + icon_state = "engineering" + build_path = /obj/machinery/power/cloak + req_components = list( + /obj/item/stock_parts/cell = 1, + /obj/item/stock_parts/capacitor = 1) + def_components = list(/obj/item/stock_parts/cell = /obj/item/stock_parts/cell/high/empty) + +/obj/item/circuitboard/machine/advanced_cloak + name = "Advanced Ship Cloaking Device (Machine Board)" + icon_state = "engineering" + build_path = /obj/machinery/power/cloak/advanced + req_components = list( + /obj/item/stock_parts/cell = 1, + /obj/item/stock_parts/capacitor = 1, + /obj/item/stack/ore/bluespace_crystal = 1) + def_components = list( + /obj/item/stock_parts/cell = /obj/item/stock_parts/cell/high/empty, + /obj/item/stock_parts/capacitor = /obj/item/stock_parts/capacitor/adv, + ) + /obj/item/circuitboard/machine/techfab/department/engineering name = "\improper Departmental Techfab (Machine Board) - Engineering" build_path = /obj/machinery/rnd/production/techfab/department/engineering diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index c5a8fd4d9e0..f8624487184 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -308,7 +308,6 @@ AddElement(/datum/element/update_icon_updates_onmob) AddComponent(/datum/component/two_handed, force_unwielded=8, force_wielded=12) - /obj/item/shockpaddles/Destroy() defib = null return ..() @@ -323,7 +322,6 @@ . = ..() check_range() - /obj/item/shockpaddles/fire_act(exposed_temperature, exposed_volume) . = ..() if((req_defib && defib) && loc != defib) @@ -392,6 +390,9 @@ /obj/item/shockpaddles/attack(mob/M, mob/user) if(busy) return + if(!M.mind) //Stops from reviving DNR player corpses. Maybe expand this to still defib, but have a body thump and fail message then for drama or whatever + to_chat(user, span_warning("It's too late for [M.p_them()]. Revival is impossible.")) + return if(req_defib && !defib.powered) user.visible_message(span_notice("[defib] beeps: Unit is unpowered.")) playsound(src, 'sound/machines/defib_failed.ogg', 50, FALSE) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index cb152b13f06..05b245eb75b 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -45,6 +45,10 @@ A.UpdateButtonIcon() return 1 +/obj/item/flashlight/attack_hand_secondary(mob/user, modifiers) + attack_self(user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + /obj/item/flashlight/attack(mob/living/carbon/M, mob/living/carbon/human/user) add_fingerprint(user) if(istype(M) && on && (user.zone_selected in list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH))) @@ -76,7 +80,7 @@ return if(M == user) //they're using it on themselves - if(M.flash_act(visual = 1)) + if(M.flash_act(visual = 1) & FLASH_EFFECT) M.visible_message(span_notice("[M] directs [src] to [M.p_their()] eyes."), span_notice("You wave the light in front of your eyes! Trippy!")) else M.visible_message(span_notice("[M] directs [src] to [M.p_their()] eyes."), span_notice("You wave the light in front of your eyes.")) @@ -85,7 +89,7 @@ span_warning("[user] directs [src] to [M]'s eyes."), span_danger("You direct [src] to [M]'s eyes.") ) - if(M.stat == DEAD || (M.is_blind()) || !M.flash_act(visual = 1)) //mob is dead or fully blind + if(M.stat == DEAD || (M.is_blind()) || !(M.flash_act(visual = 1) & FLASH_EFFECT)) //mob is dead or fully blind to_chat(user, span_warning("[M]'s pupils don't react to the light!")) else if(M.dna && M.dna.check_mutation(XRAY)) //mob has X-ray vision to_chat(user, span_danger("[M]'s pupils give an eerie glow!")) @@ -186,7 +190,7 @@ holo_cooldown = world.time + 10 SECONDS return -// see: [/datum/wound/burn/proc/uv()] +// see: [/datum/wound/burn/flesh/proc/uv()] /obj/item/flashlight/pen/paramedic name = "paramedic penlight" desc = "A high-powered UV penlight intended to help stave off infection in the field on serious burned patients. Probably really bad to look into." @@ -398,7 +402,7 @@ var/distance = max(0, get_dist(get_turf(src), M.loc)) if(distance == 0) //We won't affect ourselves continue - if(M.flash_act(affect_silicon = 1)) + if(M.flash_act(affect_silicon = 1) & FLASH_EFFECT) M.Knockdown(10/(max(1, distance))) M.confused += 15 cooldown = TRUE diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index ac036d48b87..704fb1dddcc 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -102,7 +102,7 @@ severity = 0 //chance to actually hit the eyes depends on internal component - if(prob(effectchance * diode.rating) && C.flash_act(severity)) + if(prob(effectchance * diode.rating) && (C.flash_act(severity) & FLASH_EFFECT)) outmsg = span_notice("You blind [C] by shining [src] in [C.p_their()] eyes.") log_combat(user, C, "blinded with a laser pointer",src) else diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 793f69cfdd2..896a4eae3f0 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -34,7 +34,14 @@ /obj/item/multitool/examine(mob/user) . = ..() - . += span_notice("Its buffer [buffer ? "contains [buffer]." : "is empty."]") + if(!buffer) + . += span_notice("Its buffer is empty.") + return + var/buffer_text = "[buffer]" + if(isweakref(buffer)) + var/datum/weakref/buffer_ref = buffer + buffer_text = "[buffer_ref.resolve()]" + . += span_notice("Its buffer contains [buffer_text].") // Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby. diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm index a3b7af1d01c..b60b74025e0 100644 --- a/code/game/objects/items/grenades/flashbang.dm +++ b/code/game/objects/items/grenades/flashbang.dm @@ -26,7 +26,7 @@ var/distance = max(0,get_dist(get_turf(src),T)) //Flash - if(M.flash_act(affect_silicon = 1)) + if(M.flash_act(affect_silicon = 1) & FLASH_EFFECT) M.Paralyze(max(20/max(1,distance), 5)) M.Knockdown(max(200/max(1,distance), 60)) @@ -83,7 +83,7 @@ M.show_message(span_warning("POP"), MSG_AUDIBLE) var/distance = max(0,get_dist(get_turf(src),T)) //Flash - if(M.flash_act(affect_silicon = 1)) + if(M.flash_act(affect_silicon = 1) & FLASH_EFFECT) M.Paralyze(max(10/max(1,distance), 5)) M.Knockdown(max(100/max(1,distance), 60)) diff --git a/code/game/objects/items/grenades/hypno.dm b/code/game/objects/items/grenades/hypno.dm index 2598cd0360a..8fb60354f48 100644 --- a/code/game/objects/items/grenades/hypno.dm +++ b/code/game/objects/items/grenades/hypno.dm @@ -53,7 +53,7 @@ M.hallucination += 50 //Flash - if(M.flash_act(affect_silicon = 1)) + if(M.flash_act(affect_silicon = 1) & FLASH_EFFECT) M.Paralyze(max(10/max(1,distance), 5)) M.Knockdown(max(100/max(1,distance), 40)) if(iscarbon(M)) diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index b018f265343..1e25f0bd9b3 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -14,6 +14,8 @@ var/sword_color /// The heat given off when active. var/active_heat = 3500 + /// Damage type used while active. + var/active_damtype = BURN /// Force while active. var/active_force = 30 @@ -56,11 +58,13 @@ if(active) heat = active_heat + damtype = active_damtype START_PROCESSING(SSobj, src) if(sword_color) icon_state = "[base_icon_state][sword_color]" else heat = initial(heat) + damtype = initial(damtype) STOP_PROCESSING(SSobj, src) tool_behaviour = (active ? TOOL_SAW : NONE) //Lets energy weapons cut trees. Also lets them do bonecutting surgery, which is kinda metal! @@ -386,11 +390,9 @@ if(active) icon_state = "[base_icon_state]-on" item_state = "[base_icon_state]-on" - damtype = FIRE armour_penetration = 60 else icon_state = base_icon_state item_state = base_icon_state - damtype = BRUTE armour_penetration = -20 . = ..() diff --git a/code/game/objects/items/melee/plasma_cutter.dm b/code/game/objects/items/melee/plasma_cutter.dm new file mode 100644 index 00000000000..2c93e38b7a2 --- /dev/null +++ b/code/game/objects/items/melee/plasma_cutter.dm @@ -0,0 +1,189 @@ + +/obj/item/plasmacutter + name = "plasma cutter" + desc = "A high powered engineering tool used for everything from hull slicing to industrial revolts. This particular model has an adjustable lens capable of welding, cutting, and firing energetic bursts." + icon = 'icons/obj/weapon/plasmacutter.dmi' + base_icon_state = "cutter" + icon_state = "cutter" + item_state = "cutter" + + lefthand_file = 'icons/mob/inhands/weapons/plasmacutter_left.dmi' + righthand_file = 'icons/mob/inhands/weapons/plasmacutter_right.dmi' + + flags_1 = CONDUCT_1 + attack_verb = list("attacked", "slashed", "cut", "sliced") + + sharpness = SHARP_NONE + + force = 10 + demolition_mod = 2 + armour_penetration = 0 + + heat = 3800 + usesound = list('sound/weapons/melee/plasmacutter/plasma_cutter_melee.ogg') + + power_use_amount = POWER_CELL_USE_VERY_LOW + + tool_behaviour = TOOL_DECONSTRUCT + wall_decon_damage = 200 + toolspeed = 0.75 + + light_system = MOVABLE_LIGHT + light_range = 2 + light_power = 0.75 + light_color = LIGHT_COLOR_PURPLE + light_on = FALSE + + ///is the cutter currently powered? + var/powered = FALSE + + var/obj/projectile/shot_type = /obj/projectile/plasma + var/fire_delay = 3 SECONDS + var/charged = TRUE + + var/cell_override = /obj/item/stock_parts/cell/high + +/obj/item/plasmacutter/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, force_unwielded = force, force_wielded = force+5, icon_wielded="[base_icon_state]_w") + AddComponent(/datum/component/cell, cell_override, CALLBACK(src, PROC_REF(switched_off))) + AddElement(/datum/element/tool_flash, 1) + +/obj/item/plasmacutter/examine(mob/user) + . = ..() + . += span_notice("You can Control+Click the plasmacutter to change its mode. It is currently on [tool_behaviour]") + +/obj/item/plasmacutter/CtrlClick(mob/user) + . = ..() + toggle_tool_mode(user) + +/obj/item/plasmacutter/afterattack(atom/target, mob/living/user, proximity_flag, clickparams) + . = ..() + var/modifiers = params2list(clickparams) + if(!HAS_TRAIT(src, TRAIT_WIELDED)) + return + if(!(item_use_power(power_use_amount*30) & COMPONENT_POWER_SUCCESS)) + return + if(!proximity_flag && charged && powered) + var/turf/proj_turf = user.loc + if(!isturf(proj_turf)) + return + var/obj/projectile/plasma_burst = new shot_type(proj_turf) + plasma_burst.preparePixelProjectile(target, user, modifiers) + plasma_burst.firer = user + playsound(user, 'sound/weapons/melee/plasmacutter/plasma_cutter.ogg', 100, TRUE) + plasma_burst.fire() + charged = FALSE + update_appearance() + addtimer(CALLBACK(src, GLOBAL_PROC_REF(playsound), src, 'sound/weapons/melee/plasmacutter/cutter_recharge.ogg', 60, TRUE), fire_delay-8) + addtimer(CALLBACK(src, PROC_REF(recharge)), fire_delay) + return + +/obj/item/plasmacutter/proc/recharge() + if(!charged) + charged = TRUE + update_appearance() + +/obj/item/plasmacutter/update_appearance(updates) + . = ..() + icon_state = "[base_icon_state][powered ? "_on" : ""]" + if(HAS_TRAIT(src, TRAIT_WIELDED)) + item_state = "[base_icon_state]_wielded[powered ? "_on" : ""]" + else + item_state = "[base_icon_state]" + + +/obj/item/plasmacutter/proc/toggle_tool_mode(mob/user) + if(tool_behaviour == TOOL_DECONSTRUCT) + tool_behaviour = TOOL_WELDER + else + tool_behaviour = TOOL_DECONSTRUCT + playsound(src, 'sound/weapons/gun/general/selector.ogg', 50, TRUE) + to_chat(user, "You adjust [src]'s lens to [tool_behaviour]") + +/obj/item/plasmacutter/unique_action(mob/user, modifiers) + . = ..() + if(!HAS_TRAIT(src, TRAIT_WIELDED)) + to_chat(user, span_warning("[src] needs to beheld in both hands to activate!")) + return FALSE + if(!powered) + if(!(item_use_power(power_use_amount, user, TRUE) & COMPONENT_POWER_SUCCESS)) + return + powered = !powered + + if(powered) + to_chat(user, span_notice("You ignite [src]'s blade.")) + playsound(user, 'sound/weapons/saberon.ogg', 20, TRUE) + switched_on() + return + + to_chat(user, span_notice("You disable [src]'s blade.")) + playsound(user, 'sound/weapons/saberoff.ogg', 20, TRUE) + switched_off() + +/obj/item/plasmacutter/proc/switched_on(mob/user) + powered = TRUE + force += 15 + damtype = BURN + sharpness = SHARP_EDGED + hitsound = 'sound/weapons/melee/plasmacutter/plasma_cutter_melee.ogg' + tool_behaviour = TOOL_DECONSTRUCT + set_light_on(powered) + update_appearance() + START_PROCESSING(SSobj, src) + +/obj/item/plasmacutter/proc/switched_off(mob/user) + powered = FALSE + force -= 15 + damtype = BRUTE + sharpness = SHARP_NONE + hitsound = 'sound/weapons/melee/baton_hit.ogg' + set_light_on(powered) + tool_behaviour = NONE + update_appearance() + STOP_PROCESSING(SSobj, src) + +/obj/item/plasmacutter/process(seconds_per_tick) + if(!HAS_TRAIT(src, TRAIT_WIELDED)) + playsound(src, 'sound/weapons/saberoff.ogg', 20, TRUE) + switched_off() + return + + if(!powered) + playsound(src, 'sound/weapons/saberoff.ogg', 20, TRUE) + switched_off() + return + + if(!(item_use_power(power_use_amount) & COMPONENT_POWER_SUCCESS)) + playsound(src, 'sound/weapons/saberoff.ogg', 20, TRUE) + switched_off() + return + +/obj/item/plasmacutter/use_tool(atom/target, mob/living/user, delay, amount=1, volume=0, datum/callback/extra_checks) + if(amount) + if(tool_behaviour==TOOL_DECONSTRUCT) + target.add_overlay(GLOB.advanced_cutting_effect) + . = ..() + target.cut_overlay(GLOB.advanced_cutting_effect) + + + else + target.add_overlay(GLOB.welding_sparks) + . = ..() + target.cut_overlay(GLOB.welding_sparks) + else + . = ..(amount=1) + +/obj/item/plasmacutter/use() + return (item_use_power(power_use_amount) & COMPONENT_POWER_SUCCESS) + +/obj/item/plasmacutter/tool_use_check(mob/living/user, atom/target, amount) + if(!powered) + to_chat(user, span_warning("[src] has to be on to complete this task!")) + return FALSE + + if((item_use_power(power_use_amount) & COMPONENT_POWER_SUCCESS)) + return TRUE + else + to_chat(user, span_warning("You need more charge to complete this task!")) + return FALSE diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 6dd1506b15a..7493e6376ae 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -11,6 +11,7 @@ item_flags = SLOWS_WHILE_IN_HAND slowdown = 1.25 drag_slowdown = 1.25 + integrity_failure = 0.1 block_chance = 50 throwforce = 5 throw_speed = 2 @@ -18,6 +19,7 @@ w_class = WEIGHT_CLASS_BULKY attack_verb = list("shoved", "bashed") armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70) + uses_integrity = TRUE /// makes beam projectiles pass through the shield var/transparent = FALSE /// threshold where armor piercing works @@ -32,6 +34,10 @@ var/shield_bash_sound = 'sound/effects/shieldbash.ogg' var/recoil_bonus = -2 var/broken = FALSE + /// material used to repair + var/obj/item/stack/sheet/repair_material = /obj/item/stack/sheet/plasteel + /// whether or not it is repairable + var/is_repairable = TRUE /obj/item/shield/proc/on_block(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) take_damage(damage) @@ -77,70 +83,45 @@ to_chat(owner, span_boldwarning("Your shield is penetrated by [hitby]!")) return FALSE . = ..() - if(.) + if(. && !broken) on_block(owner, hitby, attack_text, damage, attack_type, damage_type) -/obj/item/shield/riot - name = "ballistic shield" - desc = "A shield adept at blocking blunt objects and bullets from connecting with the torso of the shield wielder. Use 10 plasteel to repair." - icon_state = "ballistic" - custom_materials = list(/datum/material/iron=8500) - - force = 15 - max_integrity = 600 - block_chance = 60 - integrity_failure = 0.1 - material_flags = MATERIAL_NO_EFFECTS +/obj/item/shield/proc/repair(attacking_item, obj/item/stack/sheet, user) + if (istype(attacking_item, repair_material)) + if (atom_integrity >= max_integrity) + to_chat(user, span_warning("[src] is already in perfect condition.")) + else + while(atom_integrity < max_integrity) + var/obj/item/stack/sheet/material_used = attacking_item + if(material_used.get_amount() < 10) + to_chat(user, span_notice("You do not have enough [material_used] to repair!")) + return + if(!do_after(user, 30, target= src)) + return + material_used.use(10) + update_integrity(max_integrity) + to_chat(user, span_notice("You repair [src] with [material_used].")) + name = src::name + broken = FALSE + block_chance = initial(block_chance) + slowdown = initial(slowdown) + drag_slowdown = initial(drag_slowdown) + else + to_chat(user, span_warning("[src] isn't made of this material!")) -/obj/item/shield/riot/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/melee)) +/obj/item/shield/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/melee)) if(COOLDOWN_FINISHED(src, baton_bash)) - user.visible_message(span_warning("[user] bashes [src] with [W]!")) + user.visible_message(span_warning("[user] bashes [src] with [attacking_item]!")) playsound(src, shield_bash_sound, 50, TRUE) COOLDOWN_START(src, baton_bash, BATON_BASH_COOLDOWN) - else if(istype(W, /obj/item/stack/sheet/plasteel)) - if (atom_integrity >= max_integrity) - to_chat(user, span_warning("[src] is already in perfect condition.")) - while(atom_integrity < max_integrity) - if(!do_after(user, 30, target= src)) - return - var/obj/item/stack/sheet/plasteel/T = W - T.use(10) - atom_integrity = max_integrity - to_chat(user, span_notice("You repair [src] with [T].")) - name = src::name - broken = FALSE - block_chance = 60 - slowdown = 1.25 - drag_slowdown = 1.25 - -/obj/item/shield/riot/spike - name = "spike shield" - desc = "A ballistic shield adept at blocking blunt objects and bullets, adorned with a vicious spike. Use 10 plasteel to repair" - icon_state = "spike" - force = 24 - attack_verb = list("stabbed", "gashed") - hitsound = 'sound/weapons/bladeslice.ogg' - -/obj/item/shield/riot/roman - name = "\improper Roman shield" - desc = "Bears an inscription on the inside: \"Romanes venio domus\"." - icon_state = "roman_shield" - item_state = "roman_shield" - lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' - transparent = FALSE - custom_materials = list(/datum/material/iron=8500) - max_integrity = 65 - -/obj/item/shield/riot/roman/fake - desc = "Bears an inscription on the inside: \"Romanes venio domus\". It appears to be a bit flimsy." - block_chance = 0 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) - max_integrity = 30 - recoil_bonus = 0 //it's PLASTIC + else if(istype(attacking_item, /obj/item/stack/sheet)) + if(is_repairable == TRUE) + repair(attacking_item, /obj/item/stack/sheet, user) + else + to_chat(user, span_warning("[src] cannot be repaired!")) -/obj/item/shield/riot/buckler +/obj/item/shield/buckler name = "wooden buckler" desc = "A medieval wooden buckler." icon_state = "buckler" @@ -156,83 +137,17 @@ max_integrity = 55 integrity_failure = 0.2 w_class = WEIGHT_CLASS_NORMAL + repair_material = /obj/item/stack/sheet/mineral/wood var/shield_break_leftover = /obj/item/stack/sheet/mineral/wood var/shield_break_sound = 'sound/effects/bang.ogg' -/obj/item/shield/riot/buckler/atom_destruction(damage_flag) +/obj/item/shield/buckler/atom_destruction(damage_flag) playsound(src, shield_break_sound, 50) new shield_break_leftover(get_turf(src)) if(isliving(loc)) loc.balloon_alert(loc, "shield broken!") return ..() -/obj/item/shield/riot/flash - name = "strobe shield" - desc = "A shield with a built in, high intensity light capable of blinding and disorienting suspects. Takes regular handheld flashes as bulbs. Use 10 plasteel to repair." - icon_state = "flashshield" - item_state = "flashshield" - var/obj/item/assembly/flash/handheld/embedded_flash - -/obj/item/shield/riot/flash/Initialize() - . = ..() - embedded_flash = new(src) - -/obj/item/shield/riot/flash/ComponentInitialize() - . = .. () - AddElement(/datum/element/update_icon_updates_onmob) - -/obj/item/shield/riot/flash/attack(mob/living/M, mob/user) - . = embedded_flash.attack(M, user) - update_appearance() - -/obj/item/shield/riot/flash/attack_self(mob/living/carbon/user) - . = embedded_flash.attack_self(user) - update_appearance() - -/obj/item/shield/riot/flash/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - . = ..() - if (. && !embedded_flash.burnt_out) - embedded_flash.activate() - update_appearance() - -/obj/item/shield/riot/flash/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/assembly/flash/handheld)) - var/obj/item/assembly/flash/handheld/flash = W - if(flash.burnt_out) - to_chat(user, span_warning("No sense replacing it with a broken bulb!")) - return - else - to_chat(user, span_notice("You begin to replace the bulb...")) - if(do_after(user, 20, target = user)) - if(flash.burnt_out || !flash || QDELETED(flash)) - return - playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) - qdel(embedded_flash) - embedded_flash = flash - flash.forceMove(src) - update_appearance() - return - ..() - -/obj/item/shield/riot/flash/emp_act(severity) - . = ..() - embedded_flash.emp_act(severity) - update_appearance() - -/obj/item/shield/riot/flash/update_icon_state() - if(!embedded_flash || embedded_flash.burnt_out) - icon_state = "ballistic" - item_state = "ballistic" - else - icon_state = "flashshield" - item_state = "flashshield" - return ..() - -/obj/item/shield/riot/flash/examine(mob/user) - . = ..() - if (embedded_flash?.burnt_out) - . += span_info("The mounted bulb has burnt out. You can try replacing it with a new one.") - /obj/item/shield/energy name = "energy combat shield" desc = "A shield that reflects almost all energy projectiles, but is useless against physical attacks. It can be retracted, expanded, and stored anywhere." @@ -246,6 +161,7 @@ throw_speed = 3 base_icon_state = "eshield" // [base_icon_state]1 for expanded, [base_icon_state]0 for contracted breakable_by_damage = FALSE + is_repairable = FALSE var/on_force = 10 var/on_throwforce = 8 var/on_throw_speed = 2 @@ -285,7 +201,7 @@ to_chat(user, span_notice("[src] can now be concealed.")) add_fingerprint(user) -/obj/item/shield/riot/tele +/obj/item/shield/tele name = "telescopic shield" desc = "An advanced riot shield made of lightweight materials that collapses for easy storage." icon_state = "teleriot0" @@ -297,15 +213,20 @@ throwforce = 3 throw_speed = 3 throw_range = 4 + max_integrity = 300 + block_chance = 50 + slowdown = 1 + drag_slowdown = 1 + repair_material = /obj/item/stack/sheet/rglass w_class = WEIGHT_CLASS_NORMAL var/active = 0 -/obj/item/shield/riot/tele/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/shield/tele/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) if(active) return ..() return 0 -/obj/item/shield/riot/tele/attack_self(mob/living/user) +/obj/item/shield/tele/attack_self(mob/living/user) active = !active icon_state = "teleriot[active]" playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, TRUE) @@ -326,18 +247,54 @@ to_chat(user, span_notice("[src] can now be concealed.")) add_fingerprint(user) -/obj/item/shield/riot/goliath - name = "Goliath shield" - desc = "A shield made from interwoven plates of goliath hide." - icon_state = "goliath_shield" - icon = 'icons/obj/shields.dmi' - lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' +/obj/item/shield/heavy + name = "heavy ballistic shield" + desc = "A heavy shield designed to keep everything behind it safe from any due harm. Use 10 plasteel to repair." + icon_state = "heavy" mob_overlay_icon = 'icons/mob/clothing/back.dmi' - custom_materials = list() - transparent = FALSE - block_chance = 25 - max_integrity = 70 - w_class = WEIGHT_CLASS_BULKY + + // It's a heavy shield. So it'll obviously weigh more, but it can certainly take more of a beating; as well as dish out some + slowdown = 1.50 + drag_slowdown = 1.50 + throwforce = 10 + throw_range = 2 + max_integrity = 800 + force = 10 + block_chance = 60 + ap_threshold = 30 + armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) + var/wielded = FALSE + +/obj/item/shield/heavy/Initialize() + . = ..() + RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) + RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield)) + +/obj/item/shield/heavy/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, force_unwielded = 10, force_wielded = 20) + +/// triggered on wield of two handed item +/obj/item/shield/heavy/proc/on_wield(obj/item/source, mob/user) + slowdown = 3.50 + wielded = TRUE + INVOKE_ASYNC(src, PROC_REF(do_wield), user) + +/obj/item/shield/heavy/proc/do_wield(mob/user) + if(!broken) + if(do_after(user, 3 SECONDS, user, IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE, TRUE, + CALLBACK(src, PROC_REF(is_wielded)))) + block_chance = 85 + +/// triggered on unwield of two handed item +/obj/item/shield/heavy/proc/on_unwield(obj/item/source, mob/user) + SIGNAL_HANDLER + wielded = FALSE + if(!broken) + block_chance = initial(block_chance) + slowdown = initial(slowdown) + +/obj/item/shield/heavy/proc/is_wielded() + return wielded #undef BATON_BASH_COOLDOWN diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 7f2b2068794..e3b9b1d3799 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -132,7 +132,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ new/datum/stack_recipe("painting frame", /obj/item/wallframe/painting, 1, time = 10),\ new/datum/stack_recipe("easel", /obj/structure/easel, 4, time = 10),\ new/datum/stack_recipe("display case chassis", /obj/structure/displaycase_chassis, 5, one_per_turf = TRUE, on_floor = TRUE), \ - new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \ + new/datum/stack_recipe("wooden buckler", /obj/item/shield/buckler, 20, time = 40), \ new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\ new/datum/stack_recipe("tiki mask", /obj/item/clothing/mask/gas/tiki_mask, 2), \ new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\ diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index cac867cab9a..ef7dbd2cf3e 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -12,6 +12,7 @@ /obj/item/stack icon = 'icons/obj/stack_objects.dmi' gender = PLURAL + item_flags = NOBLUDGEON material_modifier = 0.01 max_integrity = 100 var/list/datum/stack_recipe/recipes diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm index f7fb72bb1a7..68d5efcc3ed 100644 --- a/code/game/objects/items/stacks/tape.dm +++ b/code/game/objects/items/stacks/tape.dm @@ -92,12 +92,16 @@ var/lifespan = 300 var/nonorganic_heal = 5 - var/self_delay = 30 //! Also used for the tapecuff delay - var/other_delay = 10 + var/self_delay = 3 SECONDS //! Also used for the tapecuff delay + var/other_delay = 1 SECONDS var/prefix = "sticky" var/list/conferred_embed = EMBED_HARMLESS var/overwrite_existing = FALSE +/obj/item/stack/tape/Initialize(mapload, new_amount, merge) + . = ..() + AddElement(/datum/element/robotic_heal, brute_heal = nonorganic_heal, self_delay = self_delay, other_delay = other_delay) + /obj/item/stack/tape/merge(obj/item/stack/S) //Because we have unique children, we need to add an additional fail case if(src.type != S.type) return @@ -107,10 +111,6 @@ if(!istype(C)) return - //Bootleg bandage - if(user.a_intent == INTENT_HELP) - try_heal(C, user) - //Relatable suffering if((HAS_TRAIT(user, TRAIT_CLUMSY) && prob(25))) to_chat(user, span_warning("Uh... where did the tape edge go?!")) @@ -157,39 +157,7 @@ to_chat(user, span_warning("There isn't enough tape left!")) else to_chat(user, span_warning("[C] doesn't have two hands...")) - -/obj/item/stack/tape/proc/try_heal(mob/living/carbon/C, mob/user) - if(C == user) - playsound(loc, usesound, 30, TRUE, -2) - user.visible_message(span_notice("[user] starts to apply \the [src] on [user.p_them()]self..."), span_notice("You begin applying \the [src] on yourself...")) - if(!do_after(user, self_delay, C, extra_checks=CALLBACK(C, TYPE_PROC_REF(/mob/living, can_inject), user))) - return - else if(other_delay) - user.visible_message(span_notice("[user] starts to apply \the [src] on [C]."), span_notice("You begin applying \the [src] on [C]...")) - if(!do_after(user, other_delay, C, extra_checks=CALLBACK(C, TYPE_PROC_REF(/mob/living, can_inject), user))) - return - - if(heal(C, user)) - log_combat(user, C, "tape bandaged", src.name) - use(1) - -/obj/item/stack/tape/proc/heal(mob/living/carbon/C, mob/user) - if(C.stat == DEAD) - to_chat(user, span_notice("There isn't enough [src] in the universe to fix that...")) - return - if(!iscarbon(C)) - return - var/obj/item/bodypart/affecting = C.get_bodypart(check_zone(user.zone_selected)) - if(!affecting) //Missing limb? - to_chat(user, span_warning("[C] doesn't have \a [parse_zone(user.zone_selected)]!")) - return - if(IS_ROBOTIC_LIMB(affecting)) //Robotic patch-up - if(affecting.brute_dam) - user.visible_message(span_notice("[user] applies \the [src] on [C]'s [affecting.name]."), span_green("You apply \the [src] on [C]'s [affecting.name].")) - if(affecting.heal_damage(nonorganic_heal)) - C.update_damage_overlays() - return TRUE - to_chat(user, span_warning("[src] can't patch what [C] has...")) + return ..() /obj/item/stack/tape/proc/apply_gag(mob/living/carbon/target, mob/user) if(target.is_muzzled() || target.is_mouth_covered()) @@ -306,6 +274,7 @@ nonorganic_heal = 10 prefix = "insulated sticky" siemens_coefficient = 0 + w_class = WEIGHT_CLASS_SMALL /obj/item/stack/tape/industrial/electrical/wrap_item(obj/item/I, mob/living/user) if(istype(I, /obj/item/clothing/gloves/color)) diff --git a/code/game/objects/items/storage/ammo_can.dm b/code/game/objects/items/storage/ammo_can.dm index f482c525fa0..2a80cea2684 100644 --- a/code/game/objects/items/storage/ammo_can.dm +++ b/code/game/objects/items/storage/ammo_can.dm @@ -59,6 +59,9 @@ STR.max_combined_w_class = 400 STR.set_holdable(holdable_items) +/obj/item/storage/toolbox/ammo/reskin_obj(mob/user) + . = ..() + name = "ammo can ([current_skin])" /obj/item/storage/toolbox/ammo/a850r/PopulateContents() name = "ammo can (8x50mmR)" diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 8b44b3552d3..c32a290eda2 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -82,7 +82,7 @@ /obj/item/clothing/glasses/welding, //WS edit: ok mald sure I'll add the welding stuff to the. ok. /obj/item/clothing/mask/gas/welding, /obj/item/clothing/head/welding, //WS end - /obj/item/gun/energy/plasmacutter, + /obj/item/plasmacutter, /obj/item/bodycamera, /obj/item/stack/tape/industrial, /obj/item/trench_tool, @@ -312,6 +312,7 @@ /obj/item/ammo_box/vickland_a8_50r, /obj/item/ammo_box/a300, /obj/item/ammo_box/a762_stripper, + /obj/item/ammo_box/a4570, /obj/item/ammo_box/amagpellet_claris, //that's the last of the clips /obj/item/food/donut, /obj/item/melee/knife/combat, diff --git a/code/game/objects/items/storage/filled_guncases.dm b/code/game/objects/items/storage/filled_guncases.dm index b5d96d34630..479d56635c9 100644 --- a/code/game/objects/items/storage/filled_guncases.dm +++ b/code/game/objects/items/storage/filled_guncases.dm @@ -55,6 +55,10 @@ /obj/item/storage/guncase/absolution gun_type = /obj/item/gun/ballistic/shotgun/flamingarrow/absolution +/obj/item/storage/guncase/pyre + gun_type = /obj/item/gun/ballistic/shotgun/flamingarrow/pyre + mag_type = /obj/item/ammo_box/a4570/empty + /obj/item/storage/guncase/firestorm gun_type = /obj/item/gun/ballistic/automatic/smg/firestorm mag_type = /obj/item/ammo_box/magazine/c44_firestorm_mag diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 4eeb595fac6..49e4b5a2c7a 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -598,8 +598,16 @@ /obj/item/storage/pill_bottle/alvitane name = "bottle of alvitane patches" - desc = "Contains alvitane pills, for treating burn injuries." + desc = "Contains alvitane patches, for treating burn injuries." /obj/item/storage/pill_bottle/alvitane/PopulateContents() for(var/i in 1 to 5) - new /obj/item/reagent_containers/pill/patch/alvitane + new /obj/item/reagent_containers/pill/patch/alvitane(src) + +/obj/item/storage/pill_bottle/rcyte + name = "bottle of Reflex-Cytodron" + desc = "Contains Reflex-Cytodron tablets, a common over-the-counter stimulant." + +/obj/item/storage/pill_bottle/rcyte/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/rcyte(src) diff --git a/code/game/objects/items/storage/pouches.dm b/code/game/objects/items/storage/pouches.dm index a0e84806a20..2657193f4f8 100644 --- a/code/game/objects/items/storage/pouches.dm +++ b/code/game/objects/items/storage/pouches.dm @@ -85,6 +85,7 @@ /obj/item/ammo_box/a858, /obj/item/ammo_box/vickland_a8_50r, /obj/item/ammo_box/a300, + /obj/item/ammo_box/a4570, /obj/item/ammo_box/a762_stripper, /obj/item/ammo_box/amagpellet_claris, /obj/item/stock_parts/cell/gun diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 21724a9c5a9..49793e20f9f 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -19,12 +19,7 @@ var/distribute_pressure = ONE_ATMOSPHERE var/integrity = 3 var/volume = 70 - - //Alert variables - var/warning_alert = FALSE - var/critical_warning_alert = FALSE - var/empty_alert = FALSE - + var/alert_level = 0 //1 = nominal, 2 = warning, 3 = critical warning, 4 = empty supports_variations = VOX_VARIATION /obj/item/tank/ui_action_click(mob/user) @@ -78,7 +73,6 @@ START_PROCESSING(SSobj, src) - addtimer(CALLBACK(src, PROC_REF(pressure_alerts)), 5 SECONDS, TIMER_STOPPABLE|TIMER_LOOP|TIMER_DELETE_ME) /obj/item/tank/proc/populate_gas() return @@ -228,6 +222,7 @@ //Allow for reactions air_contents.react() check_status() + pressure_alerts() /obj/item/tank/update_overlays() . = ..() @@ -235,8 +230,9 @@ var/pressure = air_contents.return_pressure() // Switches the pressure status overlay depending on which range the tank pressure lies in + // The extra icon state check prevents the icon state from being changed if it's already set to it switch(pressure) - if((5 * ONE_ATMOSPHERE) to (20 * ONE_ATMOSPHERE)) + if((5 * ONE_ATMOSPHERE) to (29 * ONE_ATMOSPHERE)) status_overlay_icon_state = "status_nominal" if((2 * ONE_ATMOSPHERE) to (5 * ONE_ATMOSPHERE)) status_overlay_icon_state = "status_warning" @@ -319,33 +315,26 @@ if(istype(src, /obj/item/tank/jetpack)) return 0 - // Prevents newly printed tanks from beeping out an alert - if(!air_contents || pressure == 0) - warning_alert = TRUE - critical_warning_alert = TRUE - empty_alert = TRUE - return 0 - // Checks the pressure of the tank while it's in use and sends an alert out when the pressure reaches a specific range. - // Binary variables are used here to prevent an alert from repeating more than once switch(pressure) if((5 * ONE_ATMOSPHERE) to (29 * ONE_ATMOSPHERE)) - warning_alert = FALSE - critical_warning_alert = FALSE - empty_alert = FALSE + if(alert_level != 1) + alert_level = 1 + update_overlays() if((2 * ONE_ATMOSPHERE) to (5 * ONE_ATMOSPHERE)) - if(!warning_alert) - warning_alert = TRUE + if(alert_level != 2) + alert_level = 2 + update_overlays() if((0.75 * ONE_ATMOSPHERE) to (2 * ONE_ATMOSPHERE)) - if(!critical_warning_alert) - critical_warning_alert = TRUE + if(alert_level != 3) + alert_level = 3 + update_overlays() playsound(src, 'sound/machines/twobeep_high.ogg', 30, FALSE) say("Tank pressure low -- Estimated time until depletion: [(src.volume/2) * 5] minutes.") - if((0 * ONE_ATMOSPHERE) to (0.75 * ONE_ATMOSPHERE)) - if(!empty_alert) - empty_alert = TRUE + if((0.01 * ONE_ATMOSPHERE) to (0.75 * ONE_ATMOSPHERE)) + if(alert_level != 4) + alert_level = 4 + update_overlays() playsound(src, 'sound/machines/twobeep_high.ogg', 30, FALSE) playsound(src, 'sound/machines/beep.ogg', 30, FALSE) say("Tank is nearly empty! Replacement recommended!") - - update_overlays() diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 686fb6092e2..4becbd057e9 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -58,7 +58,9 @@ /obj/item/weldingtool/ComponentInitialize() . = ..() AddElement(/datum/element/update_icon_updates_onmob) - AddElement(/datum/element/tool_flash, light_range) + if(light_range > 0) + AddElement(/datum/element/tool_flash, light_range) + AddElement(/datum/element/robotic_heal, brute_heal = 15, self_delay = 5 SECONDS) /obj/item/weldingtool/update_icon_state() if(welding) @@ -116,23 +118,6 @@ . = ..() target.cut_overlay(GLOB.welding_sparks) -/obj/item/weldingtool/attack(mob/living/carbon/human/target, mob/user) - if(!istype(target)) - return ..() - var/obj/item/bodypart/attackedLimb = target.get_bodypart(check_zone(user.zone_selected)) - if(!attackedLimb || IS_ORGANIC_LIMB(attackedLimb) || (user.a_intent == INTENT_HARM)) - return ..() - if(!target.is_exposed(user, TRUE, user.zone_selected)) - return TRUE - if(!tool_start_check(user, amount = 1)) - return TRUE - user.visible_message(span_notice("[user] starts to fix some of the dents on [target]'s [parse_zone(attackedLimb.body_zone)]."), - span_notice("You start fixing some of the dents on [target == user ? "your" : "[target]'s"] [parse_zone(attackedLimb.body_zone)].")) - if(!use_tool(target, user, delay = (target == user ? 5 SECONDS : 0.5 SECONDS), amount = 1, volume = 25)) - return TRUE - item_heal_robotic(target, user, brute_heal = 15, burn_heal = 0) - return TRUE - /obj/item/weldingtool/afterattack(atom/O, mob/user, proximity) . = ..() if(!proximity) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm index 27909ed24b9..61ec4821518 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm @@ -31,7 +31,7 @@ new /obj/item/storage/box/teargas(src) new /obj/item/storage/box/flashes(src) new /obj/item/storage/box/handcuffs(src) - new /obj/item/shield/riot/tele(src) + new /obj/item/shield/tele(src) /obj/structure/closet/secure_closet/ertMed name = "emergency response team medical locker" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 9d47beb582d..f734724db28 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -95,7 +95,7 @@ new /obj/item/storage/lockbox/loyalty(src) new /obj/item/clothing/mask/gas/sechailer/swat(src) new /obj/item/storage/box/flashbangs(src) - new /obj/item/shield/riot/tele(src) + new /obj/item/shield/tele(src) new /obj/item/storage/belt/security/full(src) new /obj/item/gun/energy/sharplite/x01(src) new /obj/item/gun/ballistic/automatic/pistol/commissar(src) //WS edit - free lethals @@ -284,7 +284,7 @@ for(var/i in 1 to 3) new /obj/item/clothing/head/helmet/riot(src) for(var/i in 1 to 3) - new /obj/item/shield/riot(src) + new /obj/item/shield/tele(src) /obj/structure/closet/secure_closet/armory2 name = "armory ballistics locker" diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 0f214cb5463..f3cda6efbb6 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -20,7 +20,7 @@ //half as much as a closet drag_slowdown = 0.75 pass_flags_self = LETPASSCLICKS - var/obj/item/paper/manifest/manifest + var/manifest_id = null var/shelve = FALSE var/shelve_range = 0 @@ -46,14 +46,15 @@ /obj/structure/closet/crate/closet_update_overlays(list/new_overlays) . = new_overlays - if(manifest) + if(GetComponent(/datum/component/writing)) . += "manifest" /obj/structure/closet/crate/attack_hand(mob/user) if(istype(src.loc, /obj/structure/crate_shelf)) return FALSE // No opening crates in shelves!! + var/datum/component/writing/manifest = GetComponent(/datum/component/writing) if(manifest) - tear_manifest(user) + tear_manifest(user, manifest) return ..() /obj/structure/closet/crate/MouseDrop(atom/drop_atom, src_location, over_location) @@ -77,22 +78,35 @@ /obj/structure/closet/crate/open(mob/living/user, force = FALSE) . = ..() - if(. && manifest) - to_chat(user, span_notice("The manifest is torn off [src].")) - playsound(src, 'sound/items/poster_ripped.ogg', 75, TRUE) - manifest.forceMove(get_turf(src)) - manifest = null - update_appearance() - -/obj/structure/closet/crate/proc/tear_manifest(mob/user) + if(!.) + return + var/datum/component/writing/manifest = GetComponent(/datum/component/writing) + if(!manifest) + return + to_chat(user, span_notice("The manifest is torn off [src].")) + playsound(src, 'sound/items/poster_ripped.ogg', 75, TRUE) + paperize_manifest(get_turf(src), manifest) + +/obj/structure/closet/crate/proc/tear_manifest(mob/user, datum/component/writing/manifest) to_chat(user, span_notice("You tear the manifest off of [src].")) playsound(src, 'sound/items/poster_ripped.ogg', 75, TRUE) - manifest.forceMove(loc) + var/obj/item/paper/manifest_paper = paperize_manifest(loc, manifest) if(ishuman(user)) - user.put_in_hands(manifest) - manifest = null + user.put_in_hands(manifest_paper) + +/// Turns a writing component into a paper and returns the paper. Warning: this also destroys the component datum! +/obj/structure/closet/crate/proc/paperize_manifest(atom/paper_location, datum/component/writing/manifest) + var/obj/item/paper/manifest/manifest_paper = new(paper_location, manifest_id, 0) + var/datum/component/writing/paper_text = manifest_paper.GetComponent(/datum/component/writing) + if(!paper_text) + CRASH("[manifest_paper.type] somehow had no writing component!") + manifest_paper.name = "shipping manifest - #[manifest_id]" + manifest.copy_to(paper_text) + manifest_paper.update_appearance() + qdel(manifest) update_appearance() + return manifest_paper /obj/structure/closet/crate/coffin name = "coffin" diff --git a/code/game/objects/structures/crates_lockers/crates/critter.dm b/code/game/objects/structures/crates_lockers/crates/critter.dm index 8ca58d9e20a..f66d133eec0 100644 --- a/code/game/objects/structures/crates_lockers/crates/critter.dm +++ b/code/game/objects/structures/crates_lockers/crates/critter.dm @@ -37,7 +37,7 @@ return . += "crittercrate_door" - if(manifest) + if(GetComponent(/datum/component/writing)) . += "manifest" /obj/structure/closet/crate/critter/return_air() diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm index 18bb7d3e756..e9d023814c9 100644 --- a/code/game/objects/structures/crates_lockers/crates/large.dm +++ b/code/game/objects/structures/crates_lockers/crates/large.dm @@ -14,15 +14,17 @@ /obj/structure/closet/crate/large/attack_hand(mob/user) add_fingerprint(user) + var/datum/component/writing/manifest = GetComponent(/datum/component/writing) if(manifest) - tear_manifest(user) + tear_manifest(user, manifest) else to_chat(user, span_warning("You need a crowbar to pry this open!")) /obj/structure/closet/crate/large/attackby(obj/item/W, mob/user, params) if(W.tool_behaviour == TOOL_CROWBAR) + var/datum/component/writing/manifest = GetComponent(/datum/component/writing) if(manifest) - tear_manifest(user) + tear_manifest(user, manifest) user.visible_message( span_notice("[user] pries \the [src] open."), \ diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 6184f637a2d..71697a34d85 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -564,23 +564,24 @@ else return span_notice("The top cover is firmly welded on.") -/obj/structure/table/reinforced/attackby(obj/item/W, mob/user, params) - if(W.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HELP) - if(!W.tool_start_check(user, src, amount=0)) - return - +/obj/structure/table/reinforced/welder_act(mob/living/user, obj/item/tool, list/modifiers) + . = ..() + if(. & COMPONENT_BLOCK_TOOL_ATTACK) + return + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + if(!tool.tool_start_check(user, src, amount = 0)) + return COMPONENT_BLOCK_TOOL_ATTACK if(deconstruction_ready) to_chat(user, span_notice("You start strengthening the reinforced table...")) - if (W.use_tool(src, user, 50, volume=50)) + if(tool.use_tool(src, user, 5 SECONDS, volume = 50)) to_chat(user, span_notice("You strengthen the table.")) deconstruction_ready = 0 else to_chat(user, span_notice("You start weakening the reinforced table...")) - if (W.use_tool(src, user, 50, volume=50)) + if(tool.use_tool(src, user, 5 SECONDS, volume = 50)) to_chat(user, span_notice("You weaken the table.")) deconstruction_ready = 1 - else - . = ..() + return COMPONENT_BLOCK_TOOL_ATTACK /obj/structure/table/bronze name = "bronze table" @@ -698,15 +699,18 @@ if(O.loc != src.loc) step(O, get_dir(O, src)) -/obj/structure/rack/attackby(obj/item/W, mob/user, params) - var/list/modifiers = params2list(params) - if (W.tool_behaviour == TOOL_WRENCH && !(flags_1&NODECONSTRUCT_1) && user.a_intent != INTENT_HELP) - W.play_tool_sound(src) - deconstruct(TRUE) +/obj/structure/rack/wrench_act(mob/living/user, obj/item/tool, list/modifiers) + . = ..() + if(. & COMPONENT_BLOCK_TOOL_ATTACK) return - if(user.a_intent == INTENT_HARM) - return ..() - if(user.transferItemToLoc(W, drop_location(), silent = FALSE)) + if(!(flags_1 & NODECONSTRUCT_1) && LAZYACCESS(modifiers, RIGHT_CLICK)) + tool.play_tool_sound(src) + deconstruct(TRUE) + return COMPONENT_BLOCK_TOOL_ATTACK + +/obj/structure/rack/attackby(obj/item/W, mob/user, params) + if(user.a_intent != INTENT_HARM && user.transferItemToLoc(W, drop_location(), silent = FALSE)) + var/list/modifiers = params2list(params) //Center the icon where the user clicked. if(!LAZYACCESS(modifiers, ICON_X) || !LAZYACCESS(modifiers, ICON_Y)) return @@ -714,6 +718,7 @@ W.pixel_x = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(world.icon_size/2), world.icon_size/2) W.pixel_y = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(world.icon_size/2), world.icon_size/2) return TRUE + return ..() /obj/structure/rack/attack_paw(mob/living/user) attack_hand(user) diff --git a/code/game/objects/structures/votingbox.dm b/code/game/objects/structures/votingbox.dm index 5fa66398721..82cb8d3bfc1 100644 --- a/code/game/objects/structures/votingbox.dm +++ b/code/game/objects/structures/votingbox.dm @@ -116,7 +116,9 @@ voted += voter_card to_chat(user,span_notice("You cast your vote.")) -/obj/structure/votebox/proc/valid_vote(obj/item/paper/voting_slip) +/obj/structure/votebox/proc/valid_vote(datum/component/writing/voting_slip) + if(!voting_slip) + return FALSE if(voting_slip.get_total_length() > VOTE_TEXT_LIMIT) return FALSE for(var/datum/paper_input/text as anything in voting_slip.raw_text_inputs) @@ -169,10 +171,11 @@ for(var/obj/item/paper/paper_content in contents) if(i++ > MAX_VOTES) break - if(!valid_vote(paper_content)) + var/datum/component/writing/vote = GetComponent(paper_content) + if(!valid_vote(vote)) continue var/full_vote_text = "" - for(var/datum/paper_input/text as anything in paper_content.raw_text_inputs) + for(var/datum/paper_input/text as anything in vote.raw_text_inputs) full_vote_text += "[text.raw_text]
" if(!results[full_vote_text]) diff --git a/code/game/turfs/closed/wall/reinf_walls.dm b/code/game/turfs/closed/wall/reinf_walls.dm index 3be98ae0edf..3ea3737cdb4 100644 --- a/code/game/turfs/closed/wall/reinf_walls.dm +++ b/code/game/turfs/closed/wall/reinf_walls.dm @@ -73,15 +73,6 @@ return max_integrity - ((max_integrity/7) * state) /turf/closed/wall/r_wall/try_decon(obj/item/W, mob/user, turf/T) - //DECONSTRUCTION - if(istype(W,/obj/item/gun/energy/plasmacutter)) - to_chat(user, span_notice("You begin slicing through the [src].")) - while(W.use_tool(src,user,30,volume = 100)) - to_chat(user, span_notice("You slice through some of the outer plating...")) - if(!alter_integrity(-(W.wall_decon_damage))) - return TRUE - return 1 - switch(d_state) if(INTACT) if(W.tool_behaviour == TOOL_WIRECUTTER) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index cd45856e9d3..240dc276384 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1172,8 +1172,14 @@ squish_part = C.bodyparts[zone] if(!squish_part) continue - var/type_wound = pick(list(/datum/wound/blunt/severe, /datum/wound/blunt/severe, /datum/wound/blunt/moderate)) - squish_part.force_wound_upwards(type_wound, smited=TRUE) + var/severity = pick(list( + "[WOUND_SEVERITY_MODERATE]", + "[WOUND_SEVERITY_SEVERE]", + "[WOUND_SEVERITY_SEVERE]", + "[WOUND_SEVERITY_CRITICAL]", + "[WOUND_SEVERITY_CRITICAL]", + )) + C.cause_wound_of_type_and_severity(WOUND_BLUNT, squish_part, severity) if(ADMIN_PUNISHMENT_BLEED) if(!iscarbon(target)) @@ -1185,11 +1191,11 @@ slice_part = C.bodyparts[zone] if(!slice_part) continue - var/type_wound = pick(list(/datum/wound/slash/critical, /datum/wound/slash/moderate)) + var/type_wound = pick(list(/datum/wound/slash/flesh/critical, /datum/wound/slash/flesh/moderate)) slice_part.force_wound_upwards(type_wound, smited=TRUE) - type_wound = pick(list(/datum/wound/slash/critical, /datum/wound/slash/moderate)) + type_wound = pick(list(/datum/wound/slash/flesh/critical, /datum/wound/slash/flesh/moderate)) slice_part.force_wound_upwards(type_wound, smited=TRUE) - type_wound = pick(list(/datum/wound/slash/critical, /datum/wound/slash/moderate)) + type_wound = pick(list(/datum/wound/slash/flesh/critical, /datum/wound/slash/flesh/moderate)) slice_part.force_wound_upwards(type_wound, smited=TRUE) if(ADMIN_PUNISHMENT_PERFORATE) diff --git a/code/modules/antagonists/gang/outfits.dm b/code/modules/antagonists/gang/outfits.dm index 3a3d8a7fd58..2fdf34f416d 100644 --- a/code/modules/antagonists/gang/outfits.dm +++ b/code/modules/antagonists/gang/outfits.dm @@ -30,7 +30,7 @@ backpack_contents = list(/obj/item/storage/box/handcuffs = 1, /obj/item/storage/box/teargas = 1, /obj/item/storage/box/flashbangs = 1, - /obj/item/shield/riot/tele = 1) + /obj/item/shield/tele = 1) /datum/outfit/families_police/beatcop/armored name = "Families: Armored Beat Cop" @@ -39,7 +39,7 @@ backpack_contents = list(/obj/item/storage/box/handcuffs = 1, /obj/item/storage/box/teargas = 1, /obj/item/storage/box/flashbangs = 1, - /obj/item/shield/riot/tele = 1, + /obj/item/shield/tele = 1, /obj/item/storage/box/lethalshot = 2) /datum/outfit/families_police/beatcop/swat @@ -50,7 +50,7 @@ backpack_contents = list(/obj/item/storage/box/handcuffs = 1, /obj/item/storage/box/teargas = 1, /obj/item/storage/box/flashbangs = 1, - /obj/item/shield/riot/tele = 1) + /obj/item/shield/tele = 1) /datum/outfit/families_police/beatcop/fbi name = "Families: Space FBI Officer" @@ -60,7 +60,7 @@ backpack_contents = list(/obj/item/storage/box/handcuffs = 1, /obj/item/storage/box/teargas = 1, /obj/item/storage/box/flashbangs = 1, - /obj/item/shield/riot/tele = 1, + /obj/item/shield/tele = 1, /obj/item/ammo_box/magazine/m9mm_expedition = 3) /datum/outfit/families_police/beatcop/military @@ -73,4 +73,4 @@ backpack_contents = list(/obj/item/storage/box/handcuffs = 1, /obj/item/storage/box/teargas = 1, /obj/item/storage/box/flashbangs = 1, - /obj/item/shield/riot/tele = 1) + /obj/item/shield/tele = 1) diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 4ef8880179e..31c7e751f9b 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -239,7 +239,6 @@ var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionnaire) H.equip_to_slot_or_del(new hat(H), ITEM_SLOT_HEAD) H.equip_to_slot_or_del(new /obj/item/clothing/under/costume/roman(H), ITEM_SLOT_ICLOTHING) - H.put_in_hands(new /obj/item/shield/riot/roman(H), TRUE) H.put_in_hands(new /obj/item/melee/sword/claymore(H), TRUE) H.equip_to_slot_or_del(new /obj/item/melee/spear(H), ITEM_SLOT_BACK) diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 84e3c6272c0..670be723ca3 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -114,7 +114,7 @@ if(generic_message && M != user) to_chat(M, span_danger("[src] emits a blinding light!")) if(targeted) - if(M.flash_act(1, 1)) + if(M.flash_act(1, 1) & FLASH_EFFECT) if(M.confused < power) var/diff = power * CONFUSION_STACK_MAX_MULTIPLIER - M.confused M.confused += min(power, diff) @@ -131,7 +131,7 @@ else to_chat(M, span_danger("[src] fails to blind you!")) else - if(M.flash_act()) + if(M.flash_act() & FLASH_EFFECT) var/diff = power * CONFUSION_STACK_MAX_MULTIPLIER - M.confused M.confused += min(power, diff) @@ -250,7 +250,7 @@ if(generic_message && M != user) to_chat(M, span_notice("[src] emits a soothing light...")) if(targeted) - if(M.flash_act(1, 1)) + if(M.flash_act(1, 1) & FLASH_EFFECT) var/hypnosis = FALSE if(M.hypnosis_vulnerable()) hypnosis = TRUE @@ -271,7 +271,7 @@ else to_chat(M, span_danger("[src] fails to blind you!")) - else if(M.flash_act()) + else if(M.flash_act() & FLASH_EFFECT) to_chat(M, span_notice("Such a pretty light...")) M.confused += min(M.confused + 4, 20) M.adjust_timed_status_effect(8 SECONDS, /datum/status_effect/dizziness, max_duration = 40 SECONDS) diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index e3c1a9c0760..e2012cbe2de 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -96,55 +96,63 @@ /datum/asset/spritesheet/simple/paper name = "paper" assets = list( - "stamp-deny" = 'icons/stamp_icons/large_stamp-deny.png', - "stamp-ok" = 'icons/stamp_icons/large_stamp-ok.png', - "stamp-void" = 'icons/stamp_icons/large_stamp-void.png', - "stamp-fo" = 'icons/stamp_icons/large_stamp-fo.png', - "stamp-cmo" = 'icons/stamp_icons/large_stamp-cmo.png', - "stamp-ce" = 'icons/stamp_icons/large_stamp-ce.png', - "stamp-hos" = 'icons/stamp_icons/large_stamp-hos.png', - "stamp-rd" = 'icons/stamp_icons/large_stamp-rd.png', - "stamp-cap" = 'icons/stamp_icons/large_stamp-cap.png', - "stamp-qm" = 'icons/stamp_icons/large_stamp-qm.png', - "stamp-chap" = 'icons/stamp_icons/large_stamp-chap.png', - "stamp-syndicate" = 'icons/stamp_icons/large_stamp-syndicate.png', - "stamp-solgov" = 'icons/stamp_icons/large_stamp-solgov.png', - "stamp-inteq" = 'icons/stamp_icons/large_stamp-inteq.png', - "stamp-inteq_vanguard" = 'icons/stamp_icons/large_stamp-inteq_vanguard.png', - "stamp-inteq_maa" = 'icons/stamp_icons/large_stamp-inteq_maa.png', - "stamp-inteq_artificer" = 'icons/stamp_icons/large_stamp-inteq_artificer.png', - "stamp-inteq_corpsman" = 'icons/stamp_icons/large_stamp-inteq_corpsman.png', - "stamp-clip" = 'icons/stamp_icons/large_stamp-clip.png', - "stamp-clip_cmm" = 'icons/stamp_icons/large_stamp-clip_cmm.png', - "stamp-clip_gold" = 'icons/stamp_icons/large_stamp-clip_gold.png', - "stamp-clip_bard" = 'icons/stamp_icons/large_stamp-clip_bard.png', - "stamp-clip_lord" = 'icons/stamp_icons/large_stamp-clip_lord.png', - "stamp-clip_land" = 'icons/stamp_icons/large_stamp-clip_land.png', - "stamp-clip_meld" = 'icons/stamp_icons/large_stamp-clip_meld.png', - "stamp-clip_deed" = 'icons/stamp_icons/large_stamp-clip_deed.png', - "stamp-cybersun" = 'icons/stamp_icons/large_stamp-cybersun.png', - "stamp-biodynamics" = 'icons/stamp_icons/large_stamp-biodynamics.png', - "stamp-donk" = 'icons/stamp_icons/large_stamp-donk.png', - "stamp-ngr" = 'icons/stamp_icons/large_stamp-ngr.png', - "stamp-ngr_cap" = 'icons/stamp_icons/large_stamp-ngr_captain.png', - "stamp-ngr_fore" = 'icons/stamp_icons/large_stamp-ngr_foreman.png', - "stamp-ngr_lieu" = 'icons/stamp_icons/large_stamp-ngr_lieutenant.png', - "stamp-ngr_ensign" = 'icons/stamp_icons/large_stamp-ngr_ensign.png', - "stamp-hardliners" = 'icons/stamp_icons/large_stamp-hardliners.png', - "stamp-nt" = 'icons/stamp_icons/large_stamp-nt_generic.png', - "stamp-nt_cap" = 'icons/stamp_icons/large_stamp-nt_captain.png', - "stamp-nt_fo" = 'icons/stamp_icons/large_stamp-nt_officer.png', - "stamp-nt_engdir" = 'icons/stamp_icons/large_stamp-nt_eng_dir.png', - "stamp-nt_meddir" = 'icons/stamp_icons/large_stamp-nt_med_dir.png', - "stamp-nt_scidir" = 'icons/stamp_icons/large_stamp-nt_sci_dir.png', - "stamp-ns" = 'icons/stamp_icons/large_stamp-ns_generic.png', - "stamp-ns_cap" = 'icons/stamp_icons/large_stamp-ns_captain.png', - "stamp-ns_supdir" = 'icons/stamp_icons/large_stamp-ns_sup_dir.png', - "stamp-vi" = 'icons/stamp_icons/large_stamp-vi_generic.png', - "stamp-vi_cap" = 'icons/stamp_icons/large_stamp-vi_captain.png', - "stamp-vi_secdir" = 'icons/stamp_icons/large_stamp-vi_sec_dir.png', - "stamp-vi_lp" = 'icons/stamp_icons/large_stamp-vi_loss_prevention.png', - "stamp-nt_central" = 'icons/stamp_icons/large_stamp-nt_central.png' + "stamp-deny" = 'icons/paper_graphics/stamps/large_stamp-deny.png', + "stamp-ok" = 'icons/paper_graphics/stamps/large_stamp-ok.png', + "stamp-void" = 'icons/paper_graphics/stamps/large_stamp-void.png', + "stamp-fo" = 'icons/paper_graphics/stamps/large_stamp-fo.png', + "stamp-cmo" = 'icons/paper_graphics/stamps/large_stamp-cmo.png', + "stamp-ce" = 'icons/paper_graphics/stamps/large_stamp-ce.png', + "stamp-hos" = 'icons/paper_graphics/stamps/large_stamp-hos.png', + "stamp-rd" = 'icons/paper_graphics/stamps/large_stamp-rd.png', + "stamp-cap" = 'icons/paper_graphics/stamps/large_stamp-cap.png', + "stamp-qm" = 'icons/paper_graphics/stamps/large_stamp-qm.png', + "stamp-chap" = 'icons/paper_graphics/stamps/large_stamp-chap.png', + "stamp-syndicate" = 'icons/paper_graphics/stamps/large_stamp-syndicate.png', + "stamp-solgov" = 'icons/paper_graphics/stamps/large_stamp-solgov.png', + "stamp-inteq" = 'icons/paper_graphics/stamps/large_stamp-inteq.png', + "stamp-inteq_vanguard" = 'icons/paper_graphics/stamps/large_stamp-inteq_vanguard.png', + "stamp-inteq_maa" = 'icons/paper_graphics/stamps/large_stamp-inteq_maa.png', + "stamp-inteq_artificer" = 'icons/paper_graphics/stamps/large_stamp-inteq_artificer.png', + "stamp-inteq_corpsman" = 'icons/paper_graphics/stamps/large_stamp-inteq_corpsman.png', + "stamp-clip" = 'icons/paper_graphics/stamps/large_stamp-clip.png', + "stamp-clip_cmm" = 'icons/paper_graphics/stamps/large_stamp-clip_cmm.png', + "stamp-clip_gold" = 'icons/paper_graphics/stamps/large_stamp-clip_gold.png', + "stamp-clip_bard" = 'icons/paper_graphics/stamps/large_stamp-clip_bard.png', + "stamp-clip_lord" = 'icons/paper_graphics/stamps/large_stamp-clip_lord.png', + "stamp-clip_land" = 'icons/paper_graphics/stamps/large_stamp-clip_land.png', + "stamp-clip_meld" = 'icons/paper_graphics/stamps/large_stamp-clip_meld.png', + "stamp-clip_deed" = 'icons/paper_graphics/stamps/large_stamp-clip_deed.png', + "stamp-cybersun" = 'icons/paper_graphics/stamps/large_stamp-cybersun.png', + "stamp-biodynamics" = 'icons/paper_graphics/stamps/large_stamp-biodynamics.png', + "stamp-donk" = 'icons/paper_graphics/stamps/large_stamp-donk.png', + "stamp-ngr" = 'icons/paper_graphics/stamps/large_stamp-ngr.png', + "stamp-ngr_cap" = 'icons/paper_graphics/stamps/large_stamp-ngr_captain.png', + "stamp-ngr_fore" = 'icons/paper_graphics/stamps/large_stamp-ngr_foreman.png', + "stamp-ngr_lieu" = 'icons/paper_graphics/stamps/large_stamp-ngr_lieutenant.png', + "stamp-ngr_ensign" = 'icons/paper_graphics/stamps/large_stamp-ngr_ensign.png', + "stamp-hardliners" = 'icons/paper_graphics/stamps/large_stamp-hardliners.png', + "stamp-nt" = 'icons/paper_graphics/stamps/large_stamp-nt_generic.png', + "stamp-nt_cap" = 'icons/paper_graphics/stamps/large_stamp-nt_captain.png', + "stamp-nt_fo" = 'icons/paper_graphics/stamps/large_stamp-nt_officer.png', + "stamp-nt_engdir" = 'icons/paper_graphics/stamps/large_stamp-nt_eng_dir.png', + "stamp-nt_meddir" = 'icons/paper_graphics/stamps/large_stamp-nt_med_dir.png', + "stamp-nt_scidir" = 'icons/paper_graphics/stamps/large_stamp-nt_sci_dir.png', + "stamp-ns" = 'icons/paper_graphics/stamps/large_stamp-ns_generic.png', + "stamp-ns_cap" = 'icons/paper_graphics/stamps/large_stamp-ns_captain.png', + "stamp-ns_supdir" = 'icons/paper_graphics/stamps/large_stamp-ns_sup_dir.png', + "stamp-vi" = 'icons/paper_graphics/stamps/large_stamp-vi_generic.png', + "stamp-vi_cap" = 'icons/paper_graphics/stamps/large_stamp-vi_captain.png', + "stamp-vi_secdir" = 'icons/paper_graphics/stamps/large_stamp-vi_sec_dir.png', + "stamp-vi_lp" = 'icons/paper_graphics/stamps/large_stamp-vi_loss_prevention.png', + "stamp-nt_central" = 'icons/paper_graphics/stamps/large_stamp-nt_central.png', + "food-bread" = 'icons/paper_graphics/food/bread.png', + "food-cloth" = 'icons/paper_graphics/food/cloth.png', + "food-cooked_meat" = 'icons/paper_graphics/food/cooked_meat.png', + "food-dairy" = 'icons/paper_graphics/food/dairy.png', + "food-fried" = 'icons/paper_graphics/food/fried.png', + "food-fruit" = 'icons/paper_graphics/food/fruit.png', + "food-raw_meat" = 'icons/paper_graphics/food/raw_meat.png', + "food-vegetable" = 'icons/paper_graphics/food/vegetable.png', ) /datum/asset/simple/fuckywucky diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 807630115f3..c333ab4e223 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -446,9 +446,9 @@ . = ..() var/obj/item/card/id/W = H.get_idcard() - if(H.age < AGE_MINOR) - W.registered_age = AGE_MINOR - to_chat(H, span_notice("You're not technically old enough to access or serve alcohol, but your ID has been discreetly modified to display your age as [AGE_MINOR]. Try to keep that a secret!")) + if(H.age < AGE_DRINKING) + W.registered_age = AGE_DRINKING + to_chat(H, span_notice("You're not technically old enough to access or serve alcohol, but your ID has been discreetly modified to display your age as [AGE_DRINKING]. Try to keep that a secret!")) /obj/effect/mob_spawn/human/beach outfit = /datum/outfit/beachbum diff --git a/code/modules/cargo/blackmarket/packs/clothing.dm b/code/modules/cargo/blackmarket/packs/clothing.dm index fe11f2041aa..40690774f6f 100644 --- a/code/modules/cargo/blackmarket/packs/clothing.dm +++ b/code/modules/cargo/blackmarket/packs/clothing.dm @@ -358,6 +358,16 @@ stock_max = 1 availability_prob = 40 +/datum/blackmarket_item/clothing/stealth_hardsuit + name = "INF-95 Tactical Hardsuit" + desc = "My friend recently died, bummer right? Well not actually, because I went through his garage and looted tons'a shit! Turns out, he's had this ANTIQUE ICW HARDSUIT sitting about! I dont even know jack about it, but it weighs like nothing and has night vision to boot." + item = /obj/item/clothing/suit/space/hardsuit/stealth + + cost_min = 4000 + cost_max = 5500 + stock_max = 1 + availability_prob = 20 + /datum/blackmarket_item/clothing/thermal_eyepatch name = "Thermal Eyepatch" desc = "A thermal eyepatch, capable of tracking the heat signatures of living beings through solid objects." diff --git a/code/modules/cargo/blackmarket/packs/consumables.dm b/code/modules/cargo/blackmarket/packs/consumables.dm index 646a91216dd..0f2a8b1a44f 100644 --- a/code/modules/cargo/blackmarket/packs/consumables.dm +++ b/code/modules/cargo/blackmarket/packs/consumables.dm @@ -324,6 +324,26 @@ availability_prob = 10 spawn_weighting = FALSE +/datum/blackmarket_item/consumable/combat_inhaler + name = "Pressurized Shoalmix" + desc = "No-oh-oh-oh fucking idea how we swung this one my guys, but we got it. The ditz in back managed to pressurize a stable mixture of shoalmix and panacea, and we managed to fab some custom inhalers to let you hit on the go. Lemme tell you. I'm gonna be hittin somethin for this innovation." + item = /obj/item/inhaler/cocktail + cost_min = 1000 + cost_max = 1500 + stock_max = 3 + availability_prob = 30 + pair_item = /datum/blackmarket_item/consumable/combat_inhaler_cartridge + spawn_weighting = FALSE + +/datum/blackmarket_item/consumable/combat_inhaler_cartridge + name = "Pressurized Shoalmix Vial" + desc = "Oh? These? Just vials of shoalmix and panacea. It's supposed to fit into an inhaler. Buy em. Buy em now." + item = /obj/item/reagent_containers/inhaler_canister/combat_drug + cost_min = 500 + cost_max = 1000 + stock_max = 12 + availability_prob = 20 + /datum/blackmarket_item/consumable/horse_pills name = "Strider patches" desc = "Fun lil story, yeah? We were screwin off in a backcounty race, watchin some horse girls run it out. One of em popped some patches beforehand. Managed to easily outrun the rest. We managed to find em and get in with the supplier. Supposed to help ya move fast. Keep your muscles workin when they might burst." diff --git a/code/modules/cargo/blackmarket/packs/tools.dm b/code/modules/cargo/blackmarket/packs/tools.dm index 1386dcac520..2721e6cf0c8 100644 --- a/code/modules/cargo/blackmarket/packs/tools.dm +++ b/code/modules/cargo/blackmarket/packs/tools.dm @@ -76,16 +76,6 @@ stock_max = 4 availability_prob = 80 -/datum/blackmarket_item/tool/riot_shield - name = "Riot Shield" - desc = "Protect yourself from an unexpected Riot at your local Police department!" - item = /obj/item/shield/riot - - cost_min = 300 - cost_max = 800 - stock_max = 3 - availability_prob = 50 - /datum/blackmarket_item/tool/thermite_bottle name = "Thermite Bottle" desc = "30u of Thermite to assist in creating a quick access point or get away!" @@ -147,16 +137,6 @@ stock_max = 3 availability_prob = 40 -/datum/blackmarket_item/tool/adv_cutter - name = "Advanced Plasmacutter" - desc = "These technically aren't meant to be released to the public yet, but let's just say we managed to get our hands on an advance sample." - item = /obj/item/gun/energy/plasmacutter/adv - - cost_min = 2750 - cost_max = 3750 - stock_max = 3 - availability_prob = 40 - /datum/blackmarket_item/tool/impro_jetpack name = "Improvised Jetpack" desc = "A lovingly handcrafted jetpack built by our salvage techs. For the frugal space explorer." diff --git a/code/modules/cargo/blackmarket/packs/weapons.dm b/code/modules/cargo/blackmarket/packs/weapons.dm index 3afe93aae09..62578709b76 100644 --- a/code/modules/cargo/blackmarket/packs/weapons.dm +++ b/code/modules/cargo/blackmarket/packs/weapons.dm @@ -68,16 +68,6 @@ new /obj/item/gun/ballistic/shotgun/blasting_hammer(B) new /obj/item/storage/box/ammo/a12g_blank(B) return B -/datum/blackmarket_item/weapon/spikeshield - name = "Spiked Ballistic Shield" - desc = "Be the ancient warrior you always wanted to be. Block bullets and impale your enemies." - item = /obj/item/shield/riot/spike - - cost_min = 1000 - cost_max = 1500 - stock_max = 2 - availability_prob = 50 - /datum/blackmarket_item/weapon/powerfist name = "Powerfist" desc = "Lookin to give a fisting someone'll remember? This electrically assisted powerfist'll slam em in the face hard enough they won't ever forget. Unless they black out an' forget it." diff --git a/code/modules/cargo/order.dm b/code/modules/cargo/order.dm index 0e9c17c0c10..2cd522614e7 100644 --- a/code/modules/cargo/order.dm +++ b/code/modules/cargo/order.dm @@ -56,34 +56,25 @@ return requisition_paper /datum/supply_order/proc/generateManifest(obj/structure/closet/crate/container, owner) //generates-the-manifests. - var/obj/item/paper/manifest/manifest_paper = new(container, id, 0) - - manifest_paper.name = "shipping manifest - #[id]" - var/manifest_text = "

[market.name] Shipping Manifest

" manifest_text += "
" if(owner && !(owner == "Unknown")) manifest_text += "Direct purchase from [owner]
" - manifest_paper.name += " - Purchased by [owner]" manifest_text += "Destination: [market.name]
" manifest_text += "Contents:
" manifest_text += "" manifest_text += "

Stamp below to confirm receipt of goods:

" - manifest_paper.add_raw_text(manifest_text) - manifest_paper.update_appearance() - manifest_paper.forceMove(container) - container.manifest = manifest_paper + container.manifest_id = id + container.AddComponent(/datum/component/writing, raw_text = manifest_text) container.update_appearance() - return manifest_paper - /datum/supply_order/proc/generate(atom/location) var/account_holder var/datum/supply_pack/initial_pack = supply_packs[1] diff --git a/code/modules/cargo/packs/food.dm b/code/modules/cargo/packs/food.dm index 6a53bf86f2c..d23fd563cbe 100644 --- a/code/modules/cargo/packs/food.dm +++ b/code/modules/cargo/packs/food.dm @@ -182,6 +182,39 @@ /obj/item/food/grown/cabbage, ) +/datum/supply_pack/food/ingredients_basic/eggplant + name = "Eggplant Crate" + desc = "Crate containing five eggplants." + cost = 75 + contains = list(/obj/item/food/grown/eggplant, + /obj/item/food/grown/eggplant, + /obj/item/food/grown/eggplant, + /obj/item/food/grown/eggplant, + /obj/item/food/grown/eggplant, + ) + +/datum/supply_pack/food/ingredients_basic/whitebeet + name = "White-beet Crate" + desc = "Crate containing five white-beets." + cost = 75 + contains = list(/obj/item/food/grown/whitebeet, + /obj/item/food/grown/whitebeet, + /obj/item/food/grown/whitebeet, + /obj/item/food/grown/whitebeet, + /obj/item/food/grown/whitebeet, + ) + +/datum/supply_pack/food/ingredients_basic/redbeet + name = "Redbeet Crate" + desc = "Crate containing five redbeets." + cost = 75 + contains = list(/obj/item/food/grown/redbeet, + /obj/item/food/grown/redbeet, + /obj/item/food/grown/redbeet, + /obj/item/food/grown/redbeet, + /obj/item/food/grown/redbeet, + ) + /datum/supply_pack/food/ingredients_basic/chanterelle name = "Chanterelle Crate" desc = "Crate containing five chanterelle mushrooms." @@ -248,6 +281,17 @@ /obj/item/food/grown/apple, ) +/datum/supply_pack/food/ingredients_basic/cherry + name = "Cherry Crate" + desc = "Crate containing five cherries." + cost = 75 + contains = list(/obj/item/food/grown/cherries, + /obj/item/food/grown/cherries, + /obj/item/food/grown/cherries, + /obj/item/food/grown/cherries, + /obj/item/food/grown/cherries, + ) + /datum/supply_pack/food/ingredients_basic/lime name = "Lime Crate" desc = "Crate containing five limes." @@ -658,3 +702,11 @@ contains = list( /obj/item/reagent_containers/condiment/tiris_sale ) + +/datum/supply_pack/food/ingredients_basic/mead + name = "Mead Six Pack Crate" + desc = "Gezenan Dark Mead in a six-pack. Slightly better value than buying straight from a vendor." + cost = 50 + contains = list( + /obj/item/storage/cans/sixbeer + ) diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm index 4b56ce3481a..4b4f8f5f97b 100644 --- a/code/modules/cargo/packs/gun.dm +++ b/code/modules/cargo/packs/gun.dm @@ -637,6 +637,14 @@ crate_name = "shotguns crate" faction = /datum/faction/srm +/datum/supply_pack/gun/pyre + name = "Pyre Lever Action Rifle Crate" + desc = "Contains a devastating but unwieldy lever-action rifle for annihilating larger wildlife. Chambered in .45-70." + cost = 3000 + contains = list(/obj/item/storage/guncase/pyre) + crate_name = "rifle crate" + faction = /datum/faction/srm + /datum/supply_pack/gun/illestren name = "Illestren Rifle Crate" desc = "Contains an expertly made bolt action rifle intended for hunting wildlife. Chambered in 8x50mmR rounds." diff --git a/code/modules/cargo/packs/machinery.dm b/code/modules/cargo/packs/machinery.dm index 8680331551a..ba466bf419b 100644 --- a/code/modules/cargo/packs/machinery.dm +++ b/code/modules/cargo/packs/machinery.dm @@ -214,25 +214,7 @@ Miscellaneous machines */ -/datum/supply_pack/machinery/gravgen - name = "Ship-Portable Gravity Generator Crate" - desc = "For those tired of their tools floating away from them. Contains a single gravity generator." - cost = 2000 - contains = list(/obj/machinery/power/ship_gravity/unanchored) - crate_name = "gravity generator crate" - crate_type = /obj/structure/closet/crate/engineering/electrical - no_bundle = TRUE - -/datum/supply_pack/machinery/breach_shield_gen - name = "Anti-breach Shield Projector Crate" - desc = "Hull breaches again? Say no more with the Nanotrasen Anti-Breach Shield Projector! Uses forcefield technology to keep the air in, and the space out. Contains one shield projector." - cost = 1250 - contains = list(/obj/machinery/shieldgen) - crate_name = "anti-breach shield projector crate" - crate_type = /obj/structure/closet/crate/secure/plasma - no_bundle = TRUE - -/datum/supply_pack/machinery/wall_shield_gen +/datum/supply_pack/ship_hardware/wall_shield_gen name = "Shield Generator Crate" desc = "These two shield wall generators are guaranteed to keep any unwanted lifeforms on the outside, where they belong! Not rated for containing singularities or tesla balls." cost = 1000 @@ -242,42 +224,6 @@ crate_type = /obj/structure/closet/crate/secure/plasma no_bundle = TRUE -/datum/supply_pack/machinery/holofield_generator - name = "Holofield Generator Crate" - desc = "Contains the electronics you need to set up a new (or replacement) holofield! Buttons not included." - cost = 1000 - contains = list(/obj/item/circuitboard/machine/shieldwallgen/atmos, - /obj/item/circuitboard/machine/shieldwallgen/atmos) - crate_name = "holofield generator crate" - crate_type = /obj/structure/closet/crate/engineering - -/datum/supply_pack/machinery/ion_thruster - name = "Ion Thruster Crate" - desc = "A crate containing an ion thruster and its precharger's electronics. For when you need a little extra thrust." - cost = 1500 - contains = list(/obj/item/circuitboard/machine/shuttle/smes, - /obj/item/circuitboard/machine/shuttle/engine/electric) - crate_name = "ion thruster crate" - crate_type = /obj/structure/closet/crate/engineering - -/datum/supply_pack/machinery/plasma_thruster - name = "Plasma Thruster Crate" - desc = "A crate containing a plasma thruster and its heater's electronics. For when you need a lot of extra thrust." - cost = 1500 - contains = list(/obj/item/circuitboard/machine/shuttle/heater, - /obj/item/circuitboard/machine/shuttle/engine/plasma) - crate_name = "plasma thruster crate" - crate_type = /obj/structure/closet/crate/engineering - -/datum/supply_pack/machinery/combustion_thruster - name = "Combustion Thruster Crate" - desc = "A crate containing a combustion thruster and its heater's electronics. For when you need complicated thrust." - cost = 2000 - contains = list(/obj/item/circuitboard/machine/shuttle/fire_heater, - /obj/item/circuitboard/machine/shuttle/engine/fire) - crate_name = "combustion thruster crate" - crate_type = /obj/structure/closet/crate/engineering - /datum/supply_pack/machinery/drill_crate name = "Heavy duty laser mining drill" desc = "An experimental laser-based mining drill that Nanotrasen is kindly allowing YOU, the customer, to opt into testing of." diff --git a/code/modules/cargo/packs/sec_supply.dm b/code/modules/cargo/packs/sec_supply.dm index a0b2471ba47..fa1514386b0 100644 --- a/code/modules/cargo/packs/sec_supply.dm +++ b/code/modules/cargo/packs/sec_supply.dm @@ -118,18 +118,18 @@ Misc. weapons / protection */ -/datum/supply_pack/sec_supply/riotshields - name = "Ballistic Shield Crate" - desc = "Contains a ballistic shield, effective at holding back hostile fauna, xenofauna, or large crowds." - cost = 1000 - contains = list(/obj/item/shield/riot) +/datum/supply_pack/sec_supply/heavyshields + name = "Heavy Ballistic Shield Crate" + desc = "Contains a heavy ballistic shield, very effective at protecting the user from light arms fire. Can struggle against stronger firepower." + cost = 1200 + contains = list(/obj/item/shield/heavy) crate_name = "riot shield crate" -/datum/supply_pack/sec_supply/teleriotshields +/datum/supply_pack/sec_supply/telescopicshields name = "Telescopic Riot Shield Crate" - desc = "Contains a telescopic riot shield, effective at holding back hostile fauna, xenofauna, or large crowds in tight spaces." + desc = "Contains a telescopic riot shield, effective at protecting the user in close quarters combat. Assuming a gun isn't involved of course." cost = 750 - contains = list(/obj/item/shield/riot/tele) + contains = list(/obj/item/shield/tele) crate_name = "riot shield crate" /datum/supply_pack/sec_supply/survknives diff --git a/code/modules/cargo/packs/ship_hardware.dm b/code/modules/cargo/packs/ship_hardware.dm new file mode 100644 index 00000000000..4639bb87e5a --- /dev/null +++ b/code/modules/cargo/packs/ship_hardware.dm @@ -0,0 +1,90 @@ +/datum/supply_pack/ship_hardware + category = "Ship Hardware" + crate_type = /obj/structure/closet/crate/engineering + +/* + Miscellaneous +*/ + +/datum/supply_pack/ship_hardware/gravgen + name = "Ship-Portable Gravity Generator Crate" + desc = "For those tired of their tools floating away from them. Contains a single gravity generator." + cost = 2000 + contains = list(/obj/machinery/power/ship_gravity/unanchored) + crate_name = "gravity generator crate" + crate_type = /obj/structure/closet/crate/engineering/electrical + no_bundle = TRUE + +/datum/supply_pack/ship_hardware/breach_shield_gen + name = "Anti-breach Shield Projector Crate" + desc = "Hull breaches again? Say no more with the Nanotrasen Anti-Breach Shield Projector! Uses forcefield technology to keep the air in, and the space out. Contains one shield projector." + cost = 1250 + contains = list(/obj/machinery/shieldgen) + crate_name = "anti-breach shield projector crate" + crate_type = /obj/structure/closet/crate/secure/plasma + no_bundle = TRUE + +/datum/supply_pack/ship_hardware/holofield_generator + name = "Holofield Generator Crate" + desc = "Contains the electronics you need to set up a new (or replacement) holofield! Buttons not included." + cost = 1000 + contains = list(/obj/item/circuitboard/machine/shieldwallgen/atmos, + /obj/item/circuitboard/machine/shieldwallgen/atmos) + crate_name = "holofield generator crate" + crate_type = /obj/structure/closet/crate/engineering + +/* + Thrusters +*/ + +/datum/supply_pack/ship_hardware/ion_thruster + name = "Ion Thruster Crate" + desc = "A crate containing an ion thruster and its precharger's electronics. For when you need a little extra thrust." + cost = 1500 + contains = list(/obj/item/circuitboard/machine/shuttle/smes, + /obj/item/circuitboard/machine/shuttle/engine/electric) + crate_name = "ion thruster crate" + crate_type = /obj/structure/closet/crate/engineering + +/datum/supply_pack/ship_hardware/plasma_thruster + name = "Plasma Thruster Crate" + desc = "A crate containing a plasma thruster and its heater's electronics. For when you need a lot of extra thrust." + cost = 1500 + contains = list(/obj/item/circuitboard/machine/shuttle/heater, + /obj/item/circuitboard/machine/shuttle/engine/plasma) + crate_name = "plasma thruster crate" + crate_type = /obj/structure/closet/crate/engineering + +/datum/supply_pack/ship_hardware/combustion_thruster + name = "Combustion Thruster Crate" + desc = "A crate containing a combustion thruster and its heater's electronics. For when you need complicated thrust." + cost = 2000 + contains = list(/obj/item/circuitboard/machine/shuttle/fire_heater, + /obj/item/circuitboard/machine/shuttle/engine/fire) + crate_name = "combustion thruster crate" + crate_type = /obj/structure/closet/crate/engineering + +/* + Military hardware +*/ + +/datum/supply_pack/ship_hardware/cloaking_device + name = "Ship Cloaking System" + desc = "A crate containing a cloaking system for hiding a ship from long-range scanners. Very high power consumption." + cost = 10000 + contains = list(/obj/item/circuitboard/machine/cloak) + crate_name = "cloaking system crate" + crate_type = /obj/structure/closet/crate/engineering + faction = /datum/faction/syndicate/hardliners + faction_discount = 30 + +/datum/supply_pack/ship_hardware/advanced_cloaking_device + name = "BFRD-3A Advanced Cloaking System" + desc = "A crate containing an advanced cloaking system capable of partially shifting an entire ship into bluespace." + cost = 6000 + contains = list(/obj/item/circuitboard/machine/cloak) + crate_name = "advanced cloaking system crate" + crate_type = /obj/structure/closet/crate/engineering + // currently unobtainable until someone adds a ship for zohil + faction = /datum/faction/zohil + faction_locked = TRUE diff --git a/code/modules/cargo/packs/tools.dm b/code/modules/cargo/packs/tools.dm index beb1c01f802..b2481b64071 100644 --- a/code/modules/cargo/packs/tools.dm +++ b/code/modules/cargo/packs/tools.dm @@ -164,7 +164,7 @@ name = "Plasmacutter Crate" desc = "Contains a plasmacutter, capable of rapidly breaking down hull." cost = 2500 - contains = list(/obj/item/gun/energy/plasmacutter) + contains = list(/obj/item/plasmacutter) crate_name = "plasmacutter crate" /datum/supply_pack/tools/sledgehammer diff --git a/code/modules/client/loadout/loadout_accessories.dm b/code/modules/client/loadout/loadout_accessories.dm index f4ce06e161c..f557233e536 100644 --- a/code/modules/client/loadout/loadout_accessories.dm +++ b/code/modules/client/loadout/loadout_accessories.dm @@ -38,6 +38,10 @@ display_name = "poncho, recolorable" path = /obj/item/clothing/neck/poncho +/datum/gear/accessory/mantle + display_name = "mantle, recolorable" + path = /obj/item/clothing/neck/mantle + //neckwraps /datum/gear/accessory/neckwraps diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 80fdda536f9..42427a80270 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -2231,14 +2231,21 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/list/limb_options = list(PROSTHETIC_NORMAL, PROSTHETIC_ROBOTIC) if(limb != BODY_ZONE_CHEST && limb != BODY_ZONE_HEAD) limb_options.Add(PROSTHETIC_AMPUTATED) // starting without a head or chest causes instant death, must be disallowed - var/datum/sprite_accessory/ipc_chassis/limb_style + var/obj/item/bodypart/part_candidate - for(var/chassis in GLOB.ipc_chassis_list) - limb_style = GLOB.ipc_chassis_list[chassis] - part_candidate = limb_style.chassis_bodyparts[limb] + var/datum/sprite_accessory/body/limb_style + for(var/body in GLOB.alternative_body_list) + limb_style = GLOB.alternative_body_list[body] + part_candidate = limb_style.replacement_bodyparts[limb] + if(isnull(part_candidate)) + continue + if(length(limb_style.allowed_species)) + if(!(pref_species.type in limb_style.allowed_species)) + continue if(!(pref_species.bodytype & initial(part_candidate.bodytype))) // don't allow vox and kepori to select limbs that aren't compatible continue - limb_options.Add(chassis) + limb_options.Add(body) + var/status = input(user, "You are modifying your [parse_zone(limb)], what should it be changed to?", "Character Preference", prosthetic_limbs[limb]) in limb_options if(status) prosthetic_limbs[limb] = status @@ -2624,8 +2631,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) qdel(old_part) character.regenerate_limb(pros_limb, robotic = TRUE) else - var/datum/sprite_accessory/ipc_chassis/limb_style = GLOB.ipc_chassis_list[prosthetic_limbs[pros_limb]] - var/obj/item/bodypart/new_part = limb_style.chassis_bodyparts[pros_limb] + var/datum/sprite_accessory/body/limb_style = GLOB.alternative_body_list[prosthetic_limbs[pros_limb]] + var/obj/item/bodypart/new_part = limb_style.replacement_bodyparts[pros_limb] new_part = new new_part() if(old_part) old_part.drop_limb(TRUE) diff --git a/code/modules/clothing/factions/ramzi.dm b/code/modules/clothing/factions/ramzi.dm index 23f6fbf30bc..4bf64f1dab2 100644 --- a/code/modules/clothing/factions/ramzi.dm +++ b/code/modules/clothing/factions/ramzi.dm @@ -123,6 +123,29 @@ jetpack = null supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION | VOX_VARIATION +/obj/item/clothing/head/helmet/space/hardsuit/stealth/ramzi + name = "INF-RC Tactical Hardsuit helmet" + desc = "A Prototype hardsuit's helmet that has seen better days. A viewport has been replaced, in the process rendering the night vision inoperable." + icon = 'icons/obj/clothing/faction/ramzi/head.dmi' + mob_overlay_icon = 'icons/mob/clothing/faction/ramzi/head.dmi' + icon_state = "hardsuit0-ramsee" + item_state = "hardsuit0-ramsee" + hardsuit_type = "ramsee" + armor = list("melee" = 30, "bullet" = 25, "laser" = 20, "energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75, "wound" = 20) + flash_protect = null + lighting_alpha = null + +/obj/item/clothing/suit/space/hardsuit/stealth/ramzi + name = "INF-RC Tactical Hardsuit" + desc = "A prototype hardsuit refitted and repaired by the Ramzi Clique. Many inner components appear to be broken, yet some armor has been stripped off to retain mobility." + icon = 'icons/obj/clothing/faction/ramzi/suits.dmi' + mob_overlay_icon = 'icons/mob/clothing/faction/ramzi/suits.dmi' + icon_state = "hardsuit-ramsee" + item_state = "hardsuit-ramsee" + armor = list("melee" = 30, "bullet" = 25, "laser" = 20, "energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75, "wound" = 20) + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/stealth/ramzi + + //Ramzi Elite Suit /obj/item/clothing/head/helmet/space/hardsuit/syndi/ramzi/elite name = "elite rust-red hardsuit helmet" diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 5713b35478f..4cde2ecc258 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -127,9 +127,12 @@ darkness_view = 8 flash_protect = FLASH_PROTECTION_SENSITIVE lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - glass_colour_type = /datum/client_colour/glass_colour/green supports_variations = VOX_VARIATION flags_cover = GLASSESCOVERSEYES | SEALS_EYES + unique_reskin = list( + "mono-eye" = "night", + "bino-eye" = "nightalt", + ) /obj/item/clothing/glasses/eyepatch name = "eyepatch" diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index b3d55df26ac..f0389fa0099 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -590,6 +590,59 @@ /obj/item/clothing/neck/shemagh/black icon_state = "shemagh_black" +// mantles + +/obj/item/clothing/neck/mantle + name = "mantle" + desc = "A big mantle for big shoulders." + icon_state = "mantle" + item_state = "mantle" + unique_reskin = list("black mantle" = "mantle", + "olive mantle" = "mantle_forest", + "red mantle" = "mantle_red", + "snow mantle" = "mantle_snow", + "desert mantle" = "mantle_sand", + "navy mantle" = "mantle_navy", + "leather mantle" = "mantle_leather" + ) + unique_reskin_changes_base_icon_state = TRUE + unique_reskin_changes_name = TRUE + +/obj/item/clothing/neck/mantle/black + name = "black mantle" + icon_state = "mantle" + current_skin = "black mantle" + +/obj/item/clothing/neck/mantle/olive + name = "olive mantle" + icon_state = "mantle_forest" + current_skin = "olive mantle" + +/obj/item/clothing/neck/mantle/red + name = "red mantle" + icon_state = "mantle_red" + current_skin = "red mantle" + +/obj/item/clothing/neck/mantle/snow + name = "snow mantle" + icon_state = "mantle_snow" + current_skin = "snow mantle" + +/obj/item/clothing/neck/mantle/sand + name = "desert mantle" + icon_state = "mantle_sand" + current_skin = "desert mantle" + +/obj/item/clothing/neck/mantle/navy + name = "navy mantle" + icon_state = "mantle_navy" + current_skin = "navy mantle" + +/obj/item/clothing/neck/mantle/leather + name = "leather mantle" + icon_state = "mantle_leather" + current_skin = "leather mantle" + // neck wraps /obj/item/clothing/neck/neckwraps diff --git a/code/modules/clothing/outfits/ert/minutemen_ert.dm b/code/modules/clothing/outfits/ert/minutemen_ert.dm index f32258c622e..ed901c70008 100644 --- a/code/modules/clothing/outfits/ert/minutemen_ert.dm +++ b/code/modules/clothing/outfits/ert/minutemen_ert.dm @@ -169,10 +169,10 @@ backpack_contents = null box = null - backpack = /obj/item/shield/riot - duffelbag = /obj/item/shield/riot - courierbag = /obj/item/shield/riot - satchel = /obj/item/shield/riot + backpack = /obj/item/shield/heavy + duffelbag = /obj/item/shield/heavy + courierbag = /obj/item/shield/heavy + satchel = /obj/item/shield/heavy /datum/outfit/job/clip/minutemen/military_police/leader name = "ERT - C-MM Chief Military Police" @@ -202,10 +202,10 @@ backpack_contents = null box = null - backpack = /obj/item/shield/riot/flash - duffelbag = /obj/item/shield/riot/flash - courierbag = /obj/item/shield/riot/flash - satchel = /obj/item/shield/riot/flash + backpack = /obj/item/shield/heavy + duffelbag = /obj/item/shield/heavy + courierbag = /obj/item/shield/heavy + satchel = /obj/item/shield/heavy /datum/outfit/job/clip/minutemen/grunt/dressed/hardsuit name = "ERT - CLIP Minutemen - Minuteman (Spotter Hardsuit)" diff --git a/code/modules/clothing/outfits/factions/syndicate.dm b/code/modules/clothing/outfits/factions/syndicate.dm index 931402eb788..46754ebed80 100644 --- a/code/modules/clothing/outfits/factions/syndicate.dm +++ b/code/modules/clothing/outfits/factions/syndicate.dm @@ -166,9 +166,9 @@ . = ..() var/obj/item/card/id/W = H.get_idcard() - if(H.age < AGE_MINOR) - W.registered_age = AGE_MINOR - to_chat(H, span_notice("You're not technically old enough to access or serve alcohol, but your ID has been discreetly modified to display your age as [AGE_MINOR]. Try to keep that a secret!")) + if(H.age < AGE_DRINKING) + W.registered_age = AGE_DRINKING + to_chat(H, span_notice("You're not technically old enough to access or serve alcohol, but your ID has been discreetly modified to display your age as [AGE_DRINKING]. Try to keep that a secret!")) /datum/outfit/job/syndicate/bartender/suns name = "Syndicate - Student Mixologist (SUNS)" diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 5088401b8a3..5a9b2175b25 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -264,6 +264,34 @@ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite jetpack = /obj/item/tank/jetpack/suit + //Infiltrator hardsuit +/obj/item/clothing/head/helmet/space/hardsuit/stealth + name = "INF-95 Tactical Hardsuit helmet" + desc = "A Prototype hardsuit's helmet created at the tail end of the ICW, Designed for infiltration and maneueverability over protection. Comes with superb field of view and integrated night vision." + icon_state = "hardsuit0-stealth" + item_state = "stealth_helm" + hardsuit_type = "stealth" + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + resistance_flags = FIRE_PROOF + armor = list("melee" = 35, "bullet" = 35, "laser" = 30, "energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75, "wound" = 20) + heat_protection = HEAD + flash_protect = FLASH_PROTECTION_SENSITIVE + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + +/obj/item/clothing/suit/space/hardsuit/stealth + name = "INF-95 Tactical Hardsuit" + desc = "A prototype hardsuit created at the tail-end of the ICW, for the Gorlex Marauders. Designed for infiltration and maneuverability over protection. Despite it being well-received, production ended shortly after the war. A surpising amount are kept in good condition, often on collector's racks." + icon_state = "hardsuit-stealth" + item_state = "stealth_hardsuit" + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + resistance_flags = FIRE_PROOF + armor = list("melee" = 35, "bullet" = 35, "laser" = 30, "energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75, "wound" = 20) + allowed = list(/obj/item/tank/internals) + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/stealth + heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + slowdown = 0 + supports_variations = DIGITIGRADE_VARIATION + //Mining hardsuit /obj/item/clothing/head/helmet/space/hardsuit/mining name = "frontier hardsuit helmet" @@ -314,6 +342,7 @@ resistance_flags = FIRE_PROOF | ACID_PROOF armor = list("melee" = 65, "bullet" = 30, "laser" = 25, "energy" = 30, "bomb" = 70, "bio" = 100, "rad" = 85, "fire" = 100, "acid" = 100, "wound" = 30) light_range = 10 + supports_variations = SNOUTED_VARIATION //NS hardsuit /obj/item/clothing/suit/space/hardsuit/mining/heavy/ns @@ -461,7 +490,7 @@ armor = list("melee" = 35, "bullet" = 40, "laser" = 20,"energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75, "wound" = 20) slowdown = 0.5 jetpack = null - supports_variations = KEPORI_VARIATION + supports_variations = KEPORI_VARIATION | DIGITIGRADE_VARIATION /obj/item/clothing/head/helmet/space/hardsuit/syndi/old name = "worn blood-red hardsuit helmet" @@ -1036,6 +1065,7 @@ item_state = "independent_mining_helm" hardsuit_type = "independent-mining" armor = list("melee" = 50, "bullet" = 20, "laser" = 20, "energy" = 30, "bomb" = 65, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 100, "wound" = 20) + supports_variations = SNOUTED_VARIATION /obj/item/clothing/suit/space/hardsuit/mining/independent name = "mining hardsuit" @@ -1045,3 +1075,4 @@ hardsuit_type = "independent-mining" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining/independent armor = list("melee" = 50, "bullet" = 20, "laser" = 20, "energy" = 30, "bomb" = 65, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 100, "wound" = 20) + supports_variations = DIGITIGRADE_VARIATION diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 6c4aad67fd0..f43875ee829 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -447,6 +447,7 @@ Contains: item_state = "syndicate-helm-orange" armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 0, "acid" = 0) strip_delay = 65 + supports_variations = SNOUTED_VARIATION /obj/item/clothing/suit/space/fragile name = "emergency space suit" @@ -457,6 +458,7 @@ Contains: slowdown = 2 armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 0, "acid" = 0) strip_delay = 65 + supports_variations = DIGITIGRADE_VARIATION /obj/item/clothing/suit/space/fragile/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) if(!torn && prob(50)) diff --git a/code/modules/clothing/spacesuits/softsuit.dm b/code/modules/clothing/spacesuits/softsuit.dm index 7e1f0946996..2f8a1f195ff 100644 --- a/code/modules/clothing/spacesuits/softsuit.dm +++ b/code/modules/clothing/spacesuits/softsuit.dm @@ -8,6 +8,7 @@ armor = list("melee" = 15, "bullet" = 5, "laser" = 20, "energy" = 10, "bomb" = 20, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75, "wound" = 10) pocket_storage_component_path = /datum/component/storage/concrete/pockets/exo/large resistance_flags = FIRE_PROOF + supports_variations = DIGITIGRADE_VARIATION /obj/item/clothing/head/helmet/space/light/engineer name = "engineering space helmet" @@ -23,6 +24,7 @@ light_power = 1 light_on = FALSE on = FALSE + supports_variations = SNOUTED_VARIATION //Pilot Softsuit /obj/item/clothing/suit/space/pilot diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index 7a1c1d484a4..951d639319e 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -26,6 +26,7 @@ icon_state = "syndicate-helm-generic" item_state = "syndicate-helm-generic" armor = list("melee" = 30, "bullet" = 20, "laser" = 30, "energy" = 40, "bomb" = 20, "bio" = 100, "rad" = 30, "fire" = 75, "acid" = 75, "wound" = 15) // you dont get buffed + supports_variations = SNOUTED_VARIATION /obj/item/clothing/suit/space/syndicate/generic name = "armored olive space suit" @@ -40,8 +41,8 @@ /obj/item/clothing/suit/space/syndicate/generic/grey name = "armored grey space suit" - icon_state = "syndicate-grey" - item_state = "syndicate-grey" + icon_state = "syndicate-generic-grey" + item_state = "syndicate-generic-grey" //Hardliner + Cybersun /obj/item/clothing/head/helmet/space/syndicate/white_red diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 77171b3522f..1e361e2a2c2 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -138,22 +138,18 @@ . = ..() AddElement(/datum/element/update_icon_updates_onmob) -/obj/item/clothing/suit/toggle/attack_hand_secondary(mob/user, list/modifiers) - suit_toggle(user) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - /obj/item/clothing/suit/toggle/AltClick(mob/user) if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY)) return FALSE - . = SEND_SIGNAL(src, COMSIG_CLICK_ALT, user) - if(. & COMPONENT_CANCEL_CLICK_ALT) - return - if(unique_reskin && !current_skin) reskin_obj(user) return TRUE + if(SEND_SIGNAL(src, COMSIG_CLICK_ALT, user) & COMPONENT_CANCEL_CLICK_ALT) + return TRUE + + suit_toggle(user) return TRUE /obj/item/clothing/suit/toggle/ui_action_click() diff --git a/code/modules/faction/faction_datum.dm b/code/modules/faction/faction_datum.dm index e496add8c9f..44b44d9287b 100644 --- a/code/modules/faction/faction_datum.dm +++ b/code/modules/faction/faction_datum.dm @@ -106,7 +106,7 @@ name = FACTION_CLIP short_name = "CLIP" parent_faction = /datum/faction/clip - official_language = /datum/language/zohil_kalixcian + official_language = /datum/language/league_kalixcian prefixes = PREFIX_CLIP color = "#3F90DF" @@ -143,6 +143,14 @@ prefixes = PREFIX_PGF color = "#359829" +/datum/faction/zohil // in case anyone wants to give zohil a ship + name = FACTION_ZOHIL + short_name = "ZHL" + parent_faction = /datum/faction/zohil + official_language = /datum/language/zohil_kalixcian + prefixes = PREFIX_ZOHIL + color = "#6b2ba0" + /datum/faction/independent name = FACTION_INDEPENDENT short_name = "IND" diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index 948f855b564..379b18e2f59 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -136,7 +136,7 @@ /obj/item/food/grown/mushroom/plumphelmet seed = /obj/item/seeds/plump name = "plump-helmet" - desc = "Plumus Hellmus: Plump, soft and s-so inviting~" + desc = "Plumus Hellmus; Named for it's helmet-shaped cap and purple coloration." icon_state = "plumphelmet" filling_color = "#9370DB" distill_reagent = /datum/reagent/consumable/ethanol/manly_dorf diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index 99da357485a..9b538537152 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -28,6 +28,6 @@ . = ..() var/obj/item/card/id/W = H.get_idcard() - if(H.age < AGE_MINOR) - W.registered_age = AGE_MINOR - to_chat(H, span_notice("You're not technically old enough to access or serve alcohol, but your ID has been discreetly modified to display your age as [AGE_MINOR]. Try to keep that a secret!")) + if(H.age < AGE_DRINKING) + W.registered_age = AGE_DRINKING + to_chat(H, span_notice("You're not technically old enough to access or serve alcohol, but your ID has been discreetly modified to display your age as [AGE_DRINKING]. Try to keep that a secret!")) diff --git a/code/modules/language/common.dm b/code/modules/language/common.dm index ce4f0ce4a18..8c279151fb2 100644 --- a/code/modules/language/common.dm +++ b/code/modules/language/common.dm @@ -9,6 +9,7 @@ icon_state = "galcom" mutual_understanding = list( + /datum/language/league_kalixcian = 25, /datum/language/solarian_international = 20, /datum/language/gezena_kalixcian = 20, /datum/language/zohil_kalixcian = 15, // similar to gezenan diff --git a/code/modules/language/gezenan.dm b/code/modules/language/gezenan.dm index d1e1699960e..5ff5dfd30ae 100644 --- a/code/modules/language/gezenan.dm +++ b/code/modules/language/gezenan.dm @@ -27,4 +27,5 @@ default_priority = 90 mutual_understanding = list( /datum/language/zohil_kalixcian = 90, // enough to sort of understand each other, but not perfectly + /datum/language/league_kalixcian = 80, ) diff --git a/code/modules/language/league_kalixcian.dm b/code/modules/language/league_kalixcian.dm new file mode 100644 index 00000000000..60bc4996c76 --- /dev/null +++ b/code/modules/language/league_kalixcian.dm @@ -0,0 +1,32 @@ +/datum/language/league_kalixcian + name = "League Zohilan" + desc = "A variation of Zohilan spoken in the former colonies of the URFZ, primarily in the Maxin system, emerging after around a century of drift." + speech_verb = "hisses" + ask_verb = "questions" + exclaim_verb = "bellows" + sing_verb = "sings" + key = "y" + flags = TONGUELESS_SPEECH | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD | ROUNDSTART_LANGUAGE | NO_HISS + space_chance = 12 + sentence_chance = 0 + between_word_sentence_chance = 10 + between_word_space_chance = 50 + additional_syllable_low = -1 + additional_syllable_high = 2 + syllables = list( + "zah", "az", "zeh", "ez", "zie", "iz", "zou", "ozh", "zu", "uz", "zs", "sz", + "hah", "ah", "heh", "eh", "hie", "ih", "hou", "ohm", "hu", "uh", "hs", "sh", + "lah", "al", "leh", "el", "lie", "il", "lou", "ole", "lu", "ul", "ls", "sl", + "kah", "ak", "keh", "eek", "kie", "ik", "kou", "okh", "kue", "uke", "ksh", "skh", + "sah", "as", "seh", "eas", "sie", "is", "sou", "osu", "sue", "us", "ss", "ss", + "rah", "ar", "reh", "err", "rie", "ir", "roe", "ore", "rue", "ur", "rs", "sr", + "a", "a", "e", "e", "i", "i", "o", "o", "u", "u", "s", "s" + ) + special_characters = list("'") + special_character_chance = 20 + icon_state = "clip_kalixcian" + default_priority = 80 + mutual_understanding = list( + /datum/language/zohil_kalixcian = 90, // enough to sort of understand each other, but not perfectly + /datum/language/gezena_kalixcian = 80, + ) diff --git a/code/modules/language/zohilan.dm b/code/modules/language/zohilan.dm index a64d15ef880..e2abde0f2e4 100644 --- a/code/modules/language/zohilan.dm +++ b/code/modules/language/zohilan.dm @@ -1,6 +1,6 @@ /datum/language/zohil_kalixcian name = "Zohilan" - desc = "A Kalixcian language commonly spoken in the Zohil Explorat and its former colonies in the Maxin system. Speakers of other Kalixcian languages often find it difficult to pronounce." + desc = "A Kalixcian language commonly spoken in the Zohil Explorat. Speakers of other Kalixcian languages often find it difficult to pronounce." speech_verb = "hisses" ask_verb = "hisses" exclaim_verb = "roars" @@ -30,4 +30,5 @@ default_priority = 90 mutual_understanding = list( /datum/language/gezena_kalixcian = 90, // enough to sort of understand each other, but not perfectly + /datum/language/league_kalixcian = 90 ) diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index a3b31d434aa..01b3fe3c795 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -84,6 +84,8 @@ icon = 'icons/effects/mapping/mapping_helpers.dmi' icon_state = "" invisibility = INVISIBILITY_OBSERVER + // Unless otherwise specified, layer above everything + layer = ABOVE_ALL_MOB_LAYER var/late = FALSE /obj/effect/mapping_helpers/Initialize() @@ -515,12 +517,12 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) /obj/effect/mapping_helpers/chair/tim_buckley name = "chair buckler 12000" desc = "buckles a guy into the chair if theres a guy and a chair." + late = TRUE /obj/effect/mapping_helpers/chair/tim_buckley/LateInitialize() - var/turf/turf = get_turf(src) - if(locate(/obj/structure/chair) in turf && locate(/mob/living/carbon) in turf) - var/obj/structure/chair/idiot_throne = locate(/obj/structure/chair) in turf - var/mob/living/carbon/idiot = locate(/mob/living/carbon) + var/obj/structure/chair/idiot_throne = locate(/obj/structure/chair) in loc + var/mob/living/idiot = locate(/mob/living) in loc + if(idiot_throne && idiot) idiot_throne.buckle_mob(idiot, TRUE) qdel(src) log_mapping("[src] at [x],[y] could not find a chair and guy on current turf.") @@ -532,8 +534,22 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) /obj/effect/mapping_helpers/turf/burnt name = "turf_burner" desc = "burns the everliving shit out of the turf its on." + late = TRUE /obj/effect/mapping_helpers/turf/burnt/LateInitialize() var/turf/our_turf = loc our_turf.burn_tile() qdel(src) + +/obj/effect/mapping_helpers/neuter + icon_state = "cut" + late = TRUE + var/weapon_drop_chance = 0 + +/obj/effect/mapping_helpers/neuter/LateInitialize() + var/mob/living/simple_animal/hostile/human/dog = locate(/mob/living/simple_animal/hostile/human) in loc + if(dog) + dog.weapon_drop_chance = weapon_drop_chance + qdel(src) + log_mapping("[src] at [x],[y] could not find a hostile human to neuter.") + qdel(src) diff --git a/code/modules/mapping/mapping_helpers/basic_mob.dm b/code/modules/mapping/mapping_helpers/basic_mob.dm new file mode 100644 index 00000000000..b8827a6139b --- /dev/null +++ b/code/modules/mapping/mapping_helpers/basic_mob.dm @@ -0,0 +1,55 @@ +///Basic mob flag helpers for things like deleting on death. +/obj/effect/mapping_helpers/basic_mob_flags + name = "Basic mob flags helper" + desc = "Used to apply basic_mob_flags to basic mobs on the same turf." + late = TRUE + + ///The basic mob flag that we're adding to all basic mobs on the turf. + var/flag_to_give + +/obj/effect/mapping_helpers/basic_mob_flags/Initialize(mapload) + . = ..() + if(!mapload) + log_mapping("[src] spawned outside of mapload!") + return INITIALIZE_HINT_QDEL + +/obj/effect/mapping_helpers/basic_mob_flags/LateInitialize() + var/had_any_mobs = FALSE + for(var/mob/living/basic/basic_mobs in loc) + had_any_mobs = TRUE + basic_mobs.basic_mob_flags |= flag_to_give + if(!had_any_mobs) + CRASH("[src] called on a turf without any basic mobs.") + qdel(src) + +/obj/effect/mapping_helpers/basic_mob_flags/del_on_death + name = "Basic mob del on death flag helper" + icon_state = "basic_mob_del_on_death" + flag_to_give = DEL_ON_DEATH + +/* +/obj/effect/mapping_helpers/basic_mob_flags/flip_on_death + name = "Basic mob flip on death flag helper" + icon_state = "basic_mob_flip_on_death" + flag_to_give = FLIP_ON_DEATH + +/obj/effect/mapping_helpers/basic_mob_flags/remain_dense_while_dead + name = "Basic mob remain dense while dead flag helper" + icon_state = "basic_mob_remain_dense_while_dead" + flag_to_give = REMAIN_DENSE_WHILE_DEAD + +/obj/effect/mapping_helpers/basic_mob_flags/flammable_mob + name = "Basic mob flammable flag helper" + icon_state = "basic_mob_flammable" + flag_to_give = FLAMMABLE_MOB + +/obj/effect/mapping_helpers/basic_mob_flags/immune_to_fists + name = "Basic mob immune to fists flag helper" + icon_state = "basic_mob_immune_to_fists" + flag_to_give = IMMUNE_TO_FISTS + +/obj/effect/mapping_helpers/basic_mob_flags/immune_to_getting_wet + name = "Basic mob immune to getting wet flag helper" + icon_state = "basic_mob_immune_to_getting_wet" + flag_to_give = IMMUNE_TO_GETTING_WET +*/ diff --git a/code/modules/mining/drill.dm b/code/modules/mining/drill.dm index 11208c930fb..8fa95098a0d 100644 --- a/code/modules/mining/drill.dm +++ b/code/modules/mining/drill.dm @@ -19,7 +19,7 @@ density = TRUE anchored = FALSE use_power = NO_POWER_USE - layer = ABOVE_ALL_MOB_LAYER + layer = LYING_MOB_LAYER armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) component_parts = list() diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 8d35e8f3380..a2979fc1cfb 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -68,7 +68,7 @@ D.preparePixelProjectile(target, user, modifiers) D.firer = user D.hammer_synced = src - playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, TRUE) + playsound(user, 'sound/weapons/melee/plasmacutter/plasma_cutter.ogg', 100, TRUE) D.fire() charged = FALSE update_appearance() diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index b67d37ebc9d..f6455824646 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -638,7 +638,6 @@ var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionnaire) H.equip_to_slot_or_del(new hat(H), ITEM_SLOT_HEAD) H.equip_to_slot_or_del(new /obj/item/clothing/under/costume/roman(H), ITEM_SLOT_ICLOTHING) - H.put_in_hands(new /obj/item/shield/riot/roman(H), TRUE) H.put_in_hands(new /obj/item/melee/sword/claymore(H), TRUE) H.equip_to_slot_or_del(new /obj/item/melee/spear(H), ITEM_SLOT_BACK) diff --git a/code/modules/missions/outpost/dogtag_stipend.dm b/code/modules/missions/outpost/dogtag_stipend.dm index 7a2ee9c1043..144c45f3b1e 100644 --- a/code/modules/missions/outpost/dogtag_stipend.dm +++ b/code/modules/missions/outpost/dogtag_stipend.dm @@ -20,6 +20,10 @@ Retrieve their dogtags, put them in the provided case, and return it to us to complete the bounty." value += (num_wanted*200) +/datum/mission/acquire/dogtags/accept(datum/overmap/ship/controlled/acceptor, turf/accept_loc, obj/hangar_crate_spawner/cargo_belt) + . = ..() + container.name = "dogtag case ([num_wanted] [pirate_type] dogtags)" + /datum/mission/acquire/dogtags/ramzi name = "Ramzi Clique Bounty" desc = null diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body/_body.dm b/code/modules/mob/dead/new_player/sprite_accessories/body/_body.dm new file mode 100644 index 00000000000..7d90b17c89a --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/body/_body.dm @@ -0,0 +1,31 @@ +/datum/sprite_accessory/body // Used for changing limb icons, doesn't need to hold the actual icon. + icon = null + icon_state = "who cares fuck you" + /// Associated list of bodyparts by zone. + var/list/replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head, + BODY_ZONE_CHEST = /obj/item/bodypart/chest, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right, + ) + /// Associated list of features granted by this chassis and their default values. + var/list/body_features = list() + ///species whitelist + var/list/allowed_species = list() + + +/* Test body for checking functionality +/datum/sprite_accessory/body/test_body + name = "testificate" + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/plasmaman, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/plasmaman, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/plasmaman, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/plasmaman, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/plasmaman, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/plasmaman, + ) + allowed_species = list(/datum/species/moth) +*/ diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body/ipc.dm b/code/modules/mob/dead/new_player/sprite_accessories/body/ipc.dm new file mode 100644 index 00000000000..972203ead25 --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/body/ipc.dm @@ -0,0 +1,225 @@ +/datum/sprite_accessory/body/ipc_chassis // Used for changing limb icons, doesn't need to hold the actual icon. That's handled in ipc.dm + icon = null + icon_state = "who cares fuck you" // In order to pull the chassis correctly, we need AN icon_state(see line 36-39). It doesn't have to be useful, because it isn't used. + color_src = 0 + /// Associated list of bodyparts by zone. + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc, + ) + +/datum/sprite_accessory/body/ipc_chassis/morpheus + name = "Morpheus Cyberkinetics (Custom)" + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/morpheus, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/morpheus, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/morpheus, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/morpheus, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/morpheus, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/morpheus, + ) + color_src = MUTCOLORS + +/datum/sprite_accessory/body/ipc_chassis/bishop + name = "Bishop Cyberkinetics" + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/bishop, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/bishop, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/bishop, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/bishop, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/bishop, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/bishop, + ) + +/datum/sprite_accessory/body/ipc_chassis/bishop_v2 + name = "Bishop Cyberkinetics 2.0" + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/bishop_v2, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/bishop_v2, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/bishop_v2, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/bishop_v2, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/bishop_v2, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/bishop_v2, + ) + +/datum/sprite_accessory/body/ipc_chassis/hephaestus + name = "Hephaestus Industries" + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/hephaestus, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/hephaestus, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/hephaestus, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/hephaestus, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/hephaestus, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/hephaestus, + ) + +/datum/sprite_accessory/body/ipc_chassis/hephaestus_v2 + name = "Hephaestus Industries 2.0" + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/hephaestus_v2, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/hephaestus_v2, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/hephaestus_v2, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/hephaestus_v2, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/hephaestus_v2, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/hephaestus_v2, + ) + +/datum/sprite_accessory/body/ipc_chassis/pawsitrons + name = "Pawsitrons United" + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/pawsitrons, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/pawsitrons, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/pawsitrons, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/pawsitrons, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/pawsitrons, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/pawsitrons, + ) + +/datum/sprite_accessory/body/ipc_chassis/shellguard + name = "Shellguard Munitions Standard Series" + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/shellguard, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/shellguard, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/shellguard, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/shellguard, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/shellguard, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/shellguard, + ) + +/datum/sprite_accessory/body/ipc_chassis/ward_takahashi + name = "Ward-Takahashi Manufacturing" + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/ward_takahashi, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/ward_takahashi, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/ward_takahashi, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/ward_takahashi, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/ward_takahashi, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/ward_takahashi, + ) + +/datum/sprite_accessory/body/ipc_chassis/xion + name = "Xion Manufacturing Group" + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/xion, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/xion, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/xion, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/xion, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/xion, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/xion, + ) + +/datum/sprite_accessory/body/ipc_chassis/xion_v2 + name = "Xion Manufacturing Group 2.0" + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/xion_v2, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/xion_v2, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/xion_v2, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/xion_v2, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/xion_v2, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/xion_v2, + ) + +/datum/sprite_accessory/body/ipc_chassis/zeng_hu + name = "Zeng-Hu Pharmaceuticals" + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/zeng_hu, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/zeng_hu, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/zeng_hu, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/zeng_hu, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/zeng_hu, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/zeng_hu, + ) + +/datum/sprite_accessory/body/ipc_chassis/pgf + name = "PGF Mechanics Type-P" + color_src = MUTCOLORS + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/pgf, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/pgf, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/pgf, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/pgf, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/pgf, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/pgf, + ) + +/datum/sprite_accessory/body/ipc_chassis/pgf_type_d + name = "PGF Mechanics Type-D" + color_src = MUTCOLORS + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/pgf, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/pgf, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/pgf, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/pgf, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/pgf/type_d, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/pgf/type_d, + ) + +/datum/sprite_accessory/body/ipc_chassis/sprinter + name = "Inteq Mothership 'Sprinter' Type 1" + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/sprinter, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/sprinter, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/sprinter, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/sprinter, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/sprinter, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/sprinter, + ) + +/datum/sprite_accessory/body/ipc_chassis/sprinter_v2 + name = "Inteq Mothership 'Sprinter' Type 2" + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/sprinter/type_2, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/sprinter, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/sprinter, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/sprinter, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/sprinter, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/sprinter, + ) + +/datum/sprite_accessory/body/ipc_chassis/seeker + name = "Maxim Dynamics 'Seeker'" + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/seeker, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/seeker, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/seeker, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/seeker, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/seeker, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/seeker, + ) + +/datum/sprite_accessory/body/ipc_chassis/solferino + name = "Absolution-Lux 'Solferino'" + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/solferino, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/solferino, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/solferino, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/solferino, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/solferino, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/solferino, + ) + +/datum/sprite_accessory/body/ipc_chassis/humaniform + name = "Clover Corporation 'Humaniform'" + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/humaniform, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/humaniform, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/humaniform, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/humaniform, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/humaniform, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/humaniform, + ) + +/datum/sprite_accessory/body/ipc_chassis/cybersun + name = "Cybersun Biodynamics S Series 'Ghost'" + replacement_bodyparts = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/ghost, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/ghost, + BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/ghost, + BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/ghost, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/ghost, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/ghost, + ) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair.dm index 64c1d422dee..13e124284d5 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/hair.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/hair.dm @@ -378,6 +378,10 @@ name = "Long Hair 2" icon_state = "hair_long2" +/datum/sprite_accessory/hair/longhalf + name = "Long Hair (half)" + icon_state = "hair_longhalf" + /datum/sprite_accessory/hair/long_over_eye name = "Long Over Eye" icon_state = "hair_longovereye" @@ -546,6 +550,9 @@ name = "Ponytail 7" icon_state = "hair_ponytail7" +/datum/sprite_accessory/hair/rattail + name = "Ponytail (Rat)" + icon_state = "hair_ponytailrat" /datum/sprite_accessory/hair/stail name = "Ponytail (Short)" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ipc.dm b/code/modules/mob/dead/new_player/sprite_accessories/ipc.dm index 9cd38d6d02e..2e146faebc6 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ipc.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ipc.dm @@ -299,232 +299,3 @@ name = "Pawsitrons Fox 2" icon_state = "fox2" -// Start chassis - the worst thing ever please rework this - -/datum/sprite_accessory/ipc_chassis // Used for changing limb icons, doesn't need to hold the actual icon. That's handled in ipc.dm - icon = null - icon_state = "who cares fuck you" // In order to pull the chassis correctly, we need AN icon_state(see line 36-39). It doesn't have to be useful, because it isn't used. - color_src = 0 - /// Associated list of bodyparts by zone. - var/list/chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc, - ) - /// Associated list of features granted by this chassis and their default values. - var/list/chassis_features = list() - -/datum/sprite_accessory/ipc_chassis/morpheus - name = "Morpheus Cyberkinetics (Custom)" - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/morpheus, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/morpheus, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/morpheus, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/morpheus, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/morpheus, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/morpheus, - ) - color_src = MUTCOLORS - -/datum/sprite_accessory/ipc_chassis/bishop - name = "Bishop Cyberkinetics" - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/bishop, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/bishop, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/bishop, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/bishop, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/bishop, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/bishop, - ) - -/datum/sprite_accessory/ipc_chassis/bishop_v2 - name = "Bishop Cyberkinetics 2.0" - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/bishop_v2, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/bishop_v2, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/bishop_v2, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/bishop_v2, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/bishop_v2, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/bishop_v2, - ) - -/datum/sprite_accessory/ipc_chassis/hephaestus - name = "Hephaestus Industries" - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/hephaestus, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/hephaestus, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/hephaestus, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/hephaestus, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/hephaestus, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/hephaestus, - ) - -/datum/sprite_accessory/ipc_chassis/hephaestus_v2 - name = "Hephaestus Industries 2.0" - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/hephaestus_v2, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/hephaestus_v2, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/hephaestus_v2, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/hephaestus_v2, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/hephaestus_v2, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/hephaestus_v2, - ) - -/datum/sprite_accessory/ipc_chassis/pawsitrons - name = "Pawsitrons United" - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/pawsitrons, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/pawsitrons, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/pawsitrons, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/pawsitrons, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/pawsitrons, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/pawsitrons, - ) - -/datum/sprite_accessory/ipc_chassis/shellguard - name = "Shellguard Munitions Standard Series" - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/shellguard, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/shellguard, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/shellguard, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/shellguard, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/shellguard, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/shellguard, - ) - -/datum/sprite_accessory/ipc_chassis/ward_takahashi - name = "Ward-Takahashi Manufacturing" - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/ward_takahashi, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/ward_takahashi, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/ward_takahashi, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/ward_takahashi, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/ward_takahashi, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/ward_takahashi, - ) - -/datum/sprite_accessory/ipc_chassis/xion - name = "Xion Manufacturing Group" - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/xion, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/xion, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/xion, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/xion, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/xion, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/xion, - ) - -/datum/sprite_accessory/ipc_chassis/xion_v2 - name = "Xion Manufacturing Group 2.0" - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/xion_v2, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/xion_v2, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/xion_v2, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/xion_v2, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/xion_v2, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/xion_v2, - ) - -/datum/sprite_accessory/ipc_chassis/zeng_hu - name = "Zeng-Hu Pharmaceuticals" - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/zeng_hu, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/zeng_hu, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/zeng_hu, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/zeng_hu, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/zeng_hu, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/zeng_hu, - ) - -/datum/sprite_accessory/ipc_chassis/pgf - name = "PGF Mechanics Type-P" - color_src = MUTCOLORS - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/pgf, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/pgf, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/pgf, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/pgf, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/pgf, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/pgf, - ) - -/datum/sprite_accessory/ipc_chassis/pgf_type_d - name = "PGF Mechanics Type-D" - color_src = MUTCOLORS - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/pgf, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/pgf, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/pgf, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/pgf, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/pgf/type_d, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/pgf/type_d, - ) - -/datum/sprite_accessory/ipc_chassis/sprinter - name = "Inteq Mothership 'Sprinter' Type 1" - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/sprinter, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/sprinter, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/sprinter, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/sprinter, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/sprinter, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/sprinter, - ) - -/datum/sprite_accessory/ipc_chassis/sprinter_v2 - name = "Inteq Mothership 'Sprinter' Type 2" - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/sprinter/type_2, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/sprinter, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/sprinter, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/sprinter, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/sprinter, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/sprinter, - ) - -/datum/sprite_accessory/ipc_chassis/seeker - name = "Maxim Dynamics 'Seeker'" - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/seeker, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/seeker, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/seeker, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/seeker, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/seeker, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/seeker, - ) - -/datum/sprite_accessory/ipc_chassis/solferino - name = "Absolution-Lux 'Solferino'" - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/solferino, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/solferino, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/solferino, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/solferino, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/solferino, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/solferino, - ) - -/datum/sprite_accessory/ipc_chassis/humaniform - name = "Clover Corporation 'Humaniform'" - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/humaniform, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/humaniform, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/humaniform, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/humaniform, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/humaniform, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/humaniform, - ) - -/datum/sprite_accessory/ipc_chassis/cybersun - name = "Cybersun Biodynamics S Series 'Ghost'" - chassis_bodyparts = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/ipc/ghost, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/ipc/ghost, - BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ipc/ghost, - BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ipc/ghost, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ipc/ghost, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ipc/ghost, - ) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 20b5172014d..3b4f46be80f 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -61,16 +61,13 @@ else mode() // Activate held item -/mob/living/carbon/attackby(obj/item/I, mob/user, params) - if(!all_wounds || !(user.a_intent == INTENT_HELP || user == src)) - return ..() - - for(var/i in shuffle(all_wounds)) - var/datum/wound/W = i - if(W.try_treating(I, user)) - return 1 - - return ..() +/mob/living/carbon/handle_tool_treatment(obj/item/tool, mob/living/user, list/modifiers) + . = ..() + if(. || !all_wounds || !(user.a_intent == INTENT_HELP || user == src)) + return + for(var/datum/wound/iterated_wound as anything in shuffle(all_wounds)) + if(iterated_wound.try_treating(tool, user)) + return TRUE /mob/living/carbon/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() @@ -1277,14 +1274,6 @@ /mob/living/carbon/is_face_visible() return !(wear_mask?.flags_inv & HIDEFACE) && !(head?.flags_inv & HIDEFACE) -/** - * get_biological_state is a helper used to see what kind of wounds we roll for. By default we just assume carbons (read:monkeys) are flesh and bone, but humans rely on their species datums - * - * go look at the species def for more info [/datum/species/proc/get_biological_state] - */ -/mob/living/carbon/proc/get_biological_state() //todo: silicon wounds for ipcs - return BIO_FLESH_BONE - /// Modifies the handcuffed value if a different value is passed, returning FALSE otherwise. The variable should only be changed through this proc. /mob/living/carbon/proc/set_handcuffed(new_value) if(handcuffed == new_value) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 5ab473dcb4e..196ec177f52 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -84,7 +84,7 @@ if(I.force) var/attack_direction = get_dir(user, src) apply_damage(I.force, I.damtype, affecting, wound_bonus = I.wound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness(), attack_direction = attack_direction) - if(I.damtype == BRUTE && (IS_ORGANIC_LIMB(affecting))) + if(I.damtype == BRUTE && affecting.can_bleed()) if(prob(33)) I.add_mob_blood(src) var/turf/location = get_turf(src) @@ -113,15 +113,38 @@ return var/extra_wound_details = "" - if(I.damtype == BRUTE && hit_bodypart.can_dismember()) + + if(I.damtype != STAMINA && hit_bodypart.can_dismember()) + var/mangled_state = hit_bodypart.get_mangled_state() - var/bio_state = get_biological_state() - if(mangled_state == BODYPART_MANGLED_BOTH) + + var/bio_status = hit_bodypart.get_bio_state_status() + + var/has_exterior = ((bio_status & ANATOMY_EXTERIOR)) + var/has_interior = ((bio_status & ANATOMY_INTERIOR)) + + var/exterior_ready_to_dismember = (!has_exterior || ((mangled_state & BODYPART_MANGLED_EXTERIOR))) + var/interior_ready_to_dismember = (!has_interior || ((mangled_state & BODYPART_MANGLED_INTERIOR))) + + var/dismemberable = ((hit_bodypart.dismemberable_by_wound()) || hit_bodypart.dismemberable_by_total_damage()) + if (dismemberable) extra_wound_details = ", threatening to sever it entirely" - else if((mangled_state == BODYPART_MANGLED_FLESH && I.get_sharpness()) || (mangled_state & BODYPART_MANGLED_BONE && bio_state == BIO_JUST_BONE)) - extra_wound_details = ", [I.get_sharpness() == SHARP_EDGED ? "slicing" : "piercing"] through to the bone" - else if((mangled_state == BODYPART_MANGLED_BONE && I.get_sharpness()) || (mangled_state & BODYPART_MANGLED_FLESH && bio_state == BIO_JUST_FLESH)) - extra_wound_details = ", [I.get_sharpness() == SHARP_EDGED ? "slicing" : "piercing"] at the remaining tissue" + else + var/sharpness = I.get_sharpness() + var/sharpness_text + switch(sharpness) + if(SHARP_EDGED) + sharpness_text = "slicing" + if(SHARP_POINTY) + sharpness_text = "piercing" + else + sharpness_text = "smashing" + if((has_interior && (has_exterior && exterior_ready_to_dismember) && I.get_sharpness())) + var/bone_text = hit_bodypart.get_internal_description() + extra_wound_details = ", [sharpness_text] through to the [bone_text]" + else if(has_exterior && ((has_interior && interior_ready_to_dismember) && I.get_sharpness())) + var/tissue_text = hit_bodypart.get_external_description() + extra_wound_details = ", [sharpness_text] at the remaining [tissue_text]" var/message_hit_area = "" if(hit_area) @@ -134,7 +157,7 @@ attack_message_local = "[user] [message_verb] you[message_hit_area] with [I][extra_wound_details]!" if(user == src) - attack_message_local = "You [message_verb] yourself[message_hit_area] with [I][extra_wound_details]" + attack_message_local = "You [message_verb] yourself[message_hit_area] with [I][extra_wound_details]!" visible_message( span_danger("[attack_message]"), span_userdanger("[attack_message_local]"), null, COMBAT_MESSAGE_RANGE, @@ -617,10 +640,13 @@ . = ..() var/damage = intensity - get_eye_protection() - if(.) // we've been flashed + if(. & FLASH_DAMAGE) // we've been flashed if(visual) return + if(!damage) + return + if (damage == 1) to_chat(src, span_warning("Your eyes sting a little.")) if(prob(40)) @@ -651,8 +677,7 @@ else to_chat(src, span_warning("Your eyes are really starting to hurt. This can't be good for you!")) - return 1 - else if(damage == 0) // just enough protection + else if(!is_blind()) // just enough protection if(prob(20)) to_chat(src, span_notice("Something bright flashes in the corner of your vision!")) @@ -730,7 +755,7 @@ self_grasp_bleeding_limb(grasped_part, supress_message) /mob/living/carbon/proc/self_grasp_bleeding_limb(obj/item/bodypart/grasped_part, supress_message = FALSE) - if(!grasped_part?.get_part_bleed_rate()) + if(!grasped_part?.can_be_grasped()) return var/starting_hand_index = active_hand_index @@ -738,7 +763,9 @@ to_chat(src, span_danger("You can't grasp your [grasped_part.name] with itself!")) return - to_chat(src, span_warning("You try grasping at your [grasped_part.name], trying to stop the bleeding...")) + var/bleed_rate = grasped_part.get_part_bleed_rate() + var/bleeding_text = (bleed_rate ? ", trying to stop the bleeding" : "") + to_chat(src, span_warning("You try grasping at your [grasped_part.name][bleeding_text]...")) if(!do_after(src, 0.5 SECONDS)) to_chat(src, span_danger("You fail to grasp your [grasped_part.name].")) return @@ -750,6 +777,17 @@ return grasp.grasp_limb(grasped_part) +/// If TRUE, the owner of this bodypart can try grabbing it to slow bleeding, as well as various other effects. +/obj/item/bodypart/proc/can_be_grasped() + if (get_part_bleed_rate()) + return TRUE + + for (var/datum/wound/iterated_wound as anything in wounds) + if (iterated_wound.wound_flags & CAN_BE_GRASPED) + return TRUE + + return FALSE + /// an abstract item representing you holding your own limb to staunch the bleeding, see [/mob/living/carbon/proc/grabbedby] will probably need to find somewhere else to put this. /obj/item/self_grasp name = "self-grasp" @@ -795,8 +833,10 @@ RegisterSignal(user, COMSIG_QDELETING, PROC_REF(qdel_void)) RegisterSignal(grasped_part, list(COMSIG_CARBON_REMOVE_LIMB, COMSIG_QDELETING), PROC_REF(qdel_void)) + var/bleed_rate = grasped_part.get_part_bleed_rate() + var/bleeding_text = (bleed_rate ? ", trying to stop the bleeding" : "") user.visible_message( - span_danger("[user] grasps at [user.p_their()] [grasped_part.name], trying to stop the bleeding."), + span_danger("[user] grasps at [user.p_their()] [grasped_part.name][bleeding_text]."), span_notice("You grab hold of your [grasped_part.name] tightly."), vision_distance=COMBAT_MESSAGE_RANGE, ) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 09f59ebd270..b8d9c80fe2d 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -91,6 +91,9 @@ /// All of the wounds a carbon has afflicted throughout their limbs var/list/all_wounds + /// Assoc list of BODY_ZONE -> wounding_type. Set when a limb is dismembered, unset when one is attached. Used for determining what scar to add when it comes time to generate them. + var/list/body_zone_dismembered_by + /// Levels of moth dust var/mothdust diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 899783042f1..4fd2e46f806 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -88,11 +88,11 @@ heal_overall_damage(abs(amount), 0, 0, required_status, updating_health) return amount -/mob/living/carbon/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_status) +/mob/living/carbon/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_status, ignore_reduction = 0) if(!forced && (status_flags & GODMODE)) return FALSE if(amount > 0) - take_overall_damage(0, amount, 0, updating_health, required_status) + take_overall_damage(0, amount, 0, updating_health, required_status, ignore_reduction) else if(!required_status) required_status = forced ? null : BODYTYPE_ORGANIC @@ -273,7 +273,7 @@ update_damage_overlays() /// damage MANY bodyparts, in random order -/mob/living/carbon/take_overall_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status) +/mob/living/carbon/take_overall_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status, ignore_reduction = 0) if(status_flags & GODMODE) return //godmode @@ -290,7 +290,7 @@ var/stamina_was = picked.stamina_dam - update |= picked.receive_damage(brute_per_part, burn_per_part, stamina_per_part, FALSE, required_status, wound_bonus = CANT_WOUND) + update |= picked.receive_damage(brute_per_part, burn_per_part, stamina_per_part, FALSE, required_status, wound_bonus = CANT_WOUND, ignore_reduction = ignore_reduction) brute = round(brute - (picked.brute_dam - brute_was), DAMAGE_PRECISION) burn = round(burn - (picked.burn_dam - burn_was), DAMAGE_PRECISION) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 396c0fd9881..5186f4dc873 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -502,7 +502,7 @@ //ohh god this'll need to be reworked into a zone-by-zone selection, rather than just "are yuor jorts thick" -/mob/living/carbon/human/proc/is_exposed(mob/user, error_msg, target_zone) +/mob/living/carbon/human/is_exposed(mob/user, target_zone, error_msg) . = TRUE // Default to returning true. if(user && !target_zone) target_zone = user.zone_selected @@ -894,8 +894,8 @@ if(!body_part) continue var/numbing_wound = FALSE - for(var/datum/wound/W in body_part.wounds) - if(W.wound_type == WOUND_BURN) + for(var/datum/wound/iterated_wound in body_part.wounds) + if(iterated_wound.wound_flags & NUMBS_BODYPART) numbing_wound = TRUE var/damage = body_part.burn_dam + body_part.brute_dam diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 46ac5117e88..7512400fc18 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -469,24 +469,8 @@ switch (severity) if (EXPLODE_DEVASTATE) - if(bomb_armor < EXPLODE_GIB_THRESHOLD) //gibs the mob if their bomb armor is lower than EXPLODE_GIB_THRESHOLD - for(var/I in contents) - var/atom/A = I - if(!QDELETED(A)) - switch(severity) - if(EXPLODE_DEVASTATE) - SSexplosions.highobj += A - if(EXPLODE_HEAVY) - SSexplosions.medobj += A - if(EXPLODE_LIGHT) - SSexplosions.lowobj += A - gib() - return - else - brute_loss = 500 - var/atom/throw_target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src))) - throw_at(throw_target, 200, 4) - damage_clothes(400 - bomb_armor, BRUTE, "bomb") + brute_loss = 500 + damage_clothes(400 - bomb_armor, BRUTE, "bomb") if (EXPLODE_HEAVY) brute_loss = 35 diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 814a75dd6d2..23551f57e9f 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -2390,14 +2390,4 @@ GLOBAL_LIST_EMPTY(roundstart_races) /datum/species/proc/get_harm_descriptors() return -/** - * The human species version of [/mob/living/carbon/proc/get_biological_state]. Depends on the HAS_FLESH and HAS_BONE species traits, having bones lets you have bone wounds, having flesh lets you have burn, slash, and piercing wounds - */ -/datum/species/proc/get_biological_state(mob/living/carbon/human/H) - . = BIO_INORGANIC - if(HAS_FLESH in species_traits) - . |= BIO_JUST_FLESH - if(HAS_BONE in species_traits) - . |= BIO_JUST_BONE - #undef MINIMUM_MOLS_TO_HARM diff --git a/code/modules/mob/living/carbon/human/species_types/IPC.dm b/code/modules/mob/living/carbon/human/species_types/IPC.dm index 3e1729d7ffa..3e412e2b503 100644 --- a/code/modules/mob/living/carbon/human/species_types/IPC.dm +++ b/code/modules/mob/living/carbon/human/species_types/IPC.dm @@ -3,7 +3,7 @@ id = SPECIES_IPC species_age_min = 0 species_age_max = 300 - species_traits = list(HAIR,NOTRANSSTING,NO_DNA_COPY,TRAIT_EASYDISMEMBER,NOZOMBIE,MUTCOLORS,REVIVESBYHEALING,NOHUSK,NOMOUTH) //all of these + whatever we inherit from the real species + species_traits = list(HAIR,NOTRANSSTING,NO_DNA_COPY,NOZOMBIE,MUTCOLORS,REVIVESBYHEALING,NOHUSK,NOMOUTH) //all of these + whatever we inherit from the real species inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_LIMBATTACHMENT) inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID mutantbrain = /obj/item/organ/brain/mmi_holder/posibrain @@ -48,6 +48,7 @@ /// The last screen used when the IPC died. var/saved_screen var/datum/action/innate/change_screen/change_screen + var/datum/action/innate/change_eye_color/change_eye_color var/has_screen = TRUE //do we have a screen. Used to determine if we mess with the screen or not /datum/species/ipc/random_name(unique) @@ -70,16 +71,20 @@ if(ishuman(C)) var/mob/living/carbon/human/H = C if(!change_screen) - var/datum/species/ipc/species_datum = H.dna.species - if(species_datum?.has_screen) + if(C.bodyparts[BODY_ZONE_HEAD].has_screen) change_screen = new change_screen.Grant(H) + else if (C.bodyparts[BODY_ZONE_HEAD].draw_eyes) + change_eye_color = new + change_eye_color.Grant(H) C.RegisterSignal(C, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, TYPE_PROC_REF(/mob/living/carbon, charge)) /datum/species/ipc/on_species_loss(mob/living/carbon/C) . = ..() if(change_screen) change_screen.Remove(C) + if(change_eye_color) + change_eye_color.Remove(C) C.UnregisterSignal(C, COMSIG_PROCESS_BORGCHARGER_OCCUPANT) /datum/species/ipc/spec_death(gibbed, mob/living/carbon/C) @@ -123,6 +128,25 @@ H.eye_color = sanitize_hexcolor(color_choice) H.update_body() +/datum/action/innate/change_eye_color + name = "Change Eye Color" + check_flags = AB_CHECK_CONSCIOUS + icon_icon = 'icons/obj/surgery.dmi' + button_icon_state = "robotic_eyes" + +/datum/action/innate/change_eye_color/Activate() + var/color_choice = input(usr, "Which color do you want your eyes to be?", "Color Change") as null | color + if(!color_choice) + return + if(!ishuman(owner)) + return + var/mob/living/carbon/human/H = owner + var/datum/species/ipc/species_datum = H.dna.species + if(!species_datum) + return + H.eye_color = sanitize_hexcolor(color_choice) + H.update_body() + /obj/item/apc_powercord name = "power cord" desc = "An internal power cord hooked up to a battery. Useful if you run on electricity. Not so much otherwise." @@ -217,7 +241,7 @@ /datum/species/ipc/spec_life(mob/living/carbon/human/H) . = ..() if(H.health <= HEALTH_THRESHOLD_CRIT && H.stat != DEAD) // So they die eventually instead of being stuck in crit limbo. - H.adjustFireLoss(6) // After BODYTYPE_ROBOTIC resistance this is ~2/second + H.adjustFireLoss(2, ignore_reduction = INFINITY) if(prob(5)) to_chat(H, span_warning("Alert: Internal temperature regulation systems offline; thermal damage sustained. Shutdown imminent.")) H.visible_message("[H]'s cooling system fans stutter and stall. There is a faint, yet rapid beeping coming from inside their chassis.") @@ -239,18 +263,18 @@ H.update_body() /datum/species/ipc/replace_body(mob/living/carbon/C, datum/species/old_species, datum/species/new_species, robotic) - var/datum/sprite_accessory/ipc_chassis/chassis_of_choice = GLOB.ipc_chassis_list[C.dna.features["ipc_chassis"]] + var/datum/sprite_accessory/body/ipc_chassis/chassis_of_choice = GLOB.ipc_chassis_list[C.dna.features["ipc_chassis"]] if(chassis_of_choice) qdel(species_limbs) - species_limbs = chassis_of_choice.chassis_bodyparts.Copy() // elegant. + species_limbs = chassis_of_choice.replacement_bodyparts.Copy() // elegant. var/obj/item/bodypart/chest/new_chest = species_limbs[BODY_ZONE_CHEST] if(new_chest) bodytype = initial(new_chest.acceptable_bodytype) else stack_trace("[chassis_of_choice.type] had no chest bodypart!") - for(var/feature in chassis_of_choice.chassis_features) + for(var/feature in chassis_of_choice.body_features) mutant_bodyparts |= feature - default_features[feature] = chassis_of_choice.chassis_features[feature] + default_features[feature] = chassis_of_choice.body_features[feature] else // in case of fuckery stack_trace("Invalid IPC chassis: [C.dna.features["ipc_chassis"]]") return ..() diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index 6c431627375..a6e9916c009 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -2,7 +2,7 @@ name = "\improper Abductor" id = SPECIES_ABDUCTOR species_traits = list(NOBLOOD) - inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_CHUNKYFINGERS,TRAIT_NOHUNGER,TRAIT_NOBREATH) + inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_CHUNKYFINGERS,TRAIT_NOHUNGER,TRAIT_NOBREATH,TRAIT_NODISMEMBER,TRAIT_NEVER_WOUNDED) mutanttongue = /obj/item/organ/tongue/abductor changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN ass_image = 'icons/ass/assgrey.png' diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index 2bc17dbb452..95cdac23845 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -16,7 +16,7 @@ attack_type = BURN //burn bish exotic_bloodtype = "E" species_age_max = 300 - species_traits = list(DYNCOLORS, HAIR, FACEHAIR, HAS_FLESH, HAS_BONE) + species_traits = list(DYNCOLORS, HAIR, FACEHAIR) changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN species_language_holder = /datum/language_holder/ethereal inherent_traits = list(TRAIT_NOHUNGER) diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index 9efc99b8ce7..a7c6b5236b5 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -1,7 +1,7 @@ /datum/species/fly name = "\improper Flyperson" id = SPECIES_FLYPERSON - species_traits = list(TRAIT_ANTENNAE, HAS_FLESH, HAS_BONE) + inherent_traits = list(TRAIT_ANTENNAE) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG mutanttongue = /obj/item/organ/tongue/fly mutantliver = /obj/item/organ/liver/fly diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index 2d5bf7b4f9a..70b6d66ffa9 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -2,7 +2,7 @@ name = "\improper Human" id = SPECIES_HUMAN default_color = "FFFFFF" - species_traits = list(HAIR,FACEHAIR,LIPS,SCLERA,EMOTE_OVERLAY,SKINCOLORS,HAS_FLESH,HAS_BONE) + species_traits = list(HAIR,FACEHAIR,LIPS,SCLERA,EMOTE_OVERLAY,SKINCOLORS) default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None") mutant_bodyparts = list("ears", "tail_human") use_skintones = TRUE diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index f2347aa142d..41ee147d4c3 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -3,7 +3,7 @@ name = "\improper Jellyperson" id = SPECIES_JELLYPERSON default_color = "00FF90" - species_traits = list(MUTCOLORS,NOBLOOD,HAIR,FACEHAIR,HAS_FLESH) + species_traits = list(MUTCOLORS,NOBLOOD,HAIR,FACEHAIR) inherent_traits = list(TRAIT_TOXINLOVER) hair_color = "mutcolor" hair_alpha = 150 diff --git a/code/modules/mob/living/carbon/human/species_types/kepori.dm b/code/modules/mob/living/carbon/human/species_types/kepori.dm index 5edff12d874..43fbc218966 100644 --- a/code/modules/mob/living/carbon/human/species_types/kepori.dm +++ b/code/modules/mob/living/carbon/human/species_types/kepori.dm @@ -2,7 +2,7 @@ name = "\improper Kepori" id = SPECIES_KEPORI default_color = "6060FF" - species_traits = list(SCLERA, MUTCOLORS, MUTCOLORS_SECONDARY, HAS_FLESH, HAS_BONE) + species_traits = list(SCLERA, MUTCOLORS, MUTCOLORS_SECONDARY) inherent_traits = list(TRAIT_SCOOPABLE) mutant_bodyparts = list("kepori_body_feathers", "kepori_head_feathers", "kepori_tail_feathers", "kepori_feathers") default_features = list("mcolor" = "0F0", "wings" = "None", "kepori_feathers" = "None", "kepori_head_feathers" = "None", "kepori_body_feathers" = "None", "kepori_tail_feathers" = "None") diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index b99d24a083c..300c0ba31d4 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -8,7 +8,7 @@ id = SPECIES_SARATHI default_color = "00FF00" species_age_max = 175 - species_traits = list(MUTCOLORS, LIPS, SCLERA, EMOTE_OVERLAY, MUTCOLORS_SECONDARY, HAS_FLESH, HAS_BONE) + species_traits = list(MUTCOLORS, LIPS, SCLERA, EMOTE_OVERLAY, MUTCOLORS_SECONDARY) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE mutant_bodyparts = list("tail_lizard", "face_markings", "frills", "horns", "spines", "body_markings") mutanttongue = /obj/item/organ/tongue/lizard diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm index a8b5f5cc5f6..2e20ab6f5d0 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -2,7 +2,8 @@ name = "\improper Moth" id = SPECIES_MOTH default_color = "00FF00" - species_traits = list(LIPS, TRAIT_ANTENNAE, HAIR, EMOTE_OVERLAY, HAS_FLESH, HAS_BONE) + species_traits = list(LIPS, HAIR, EMOTE_OVERLAY) + inherent_traits = list(TRAIT_ANTENNAE) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG mutant_bodyparts = list("moth_wings", "moth_fluff", "moth_markings") default_features = list("moth_wings" = "Plain", "moth_fluff" = "Plain", "moth_markings" = "None") diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index ffd8e37e8db..32976b827cc 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -2,7 +2,7 @@ name = "\improper Phorid" id = SPECIES_PLASMAMAN meat = /obj/item/stack/sheet/mineral/plasma - species_traits = list(NOBLOOD, NOTRANSSTING, HAS_BONE) + species_traits = list(NOBLOOD, NOTRANSSTING) // plasmemes get hard to wound since they only need a severe bone wound to dismember, but unlike skellies, they can't pop their bones back into place inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_NOHUNGER,TRAIT_ALWAYS_CLEAN, TRAIT_HARDLY_WOUNDED) inherent_biotypes = MOB_HUMANOID|MOB_MINERAL diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 31bbb3c60f7..5430f531eac 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -6,7 +6,7 @@ name = "???" id = SPECIES_SHADOW species_traits = list(NOBLOOD) - inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH) + inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH,TRAIT_NODISMEMBER,TRAIT_NEVER_WOUNDED) inherent_factions = list("faithless") changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC mutanteyes = /obj/item/organ/eyes/night_vision diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm index ea7f4cda2eb..fcd689ed14e 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -2,7 +2,7 @@ // 2spooky name = "\improper Skeleton" id = SPECIES_SKELETON - species_traits = list(NOBLOOD, HAS_BONE, NOHUSK) + species_traits = list(NOBLOOD, NOHUSK) inherent_traits = list(TRAIT_NOMETABOLISM,TRAIT_TOXIMMUNE,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,\ TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH,TRAIT_XENO_IMMUNE,TRAIT_NOCLONELOSS) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm index bf961591298..e42b8245308 100644 --- a/code/modules/mob/living/carbon/human/species_types/snail.dm +++ b/code/modules/mob/living/carbon/human/species_types/snail.dm @@ -2,7 +2,7 @@ name = "\improper Snailperson" id = SPECIES_SNAIL default_color = "336600" //vomit green - species_traits = list(MUTCOLORS, NO_UNDERWEAR, HAS_FLESH, HAS_BONE) + species_traits = list(MUTCOLORS, NO_UNDERWEAR) inherent_traits = list(TRAIT_ALWAYS_CLEAN, TRAIT_NOSLIPALL) attack_verb = "slap" coldmod = 0.5 //snails only come out when its cold and wet diff --git a/code/modules/mob/living/carbon/human/species_types/vox.dm b/code/modules/mob/living/carbon/human/species_types/vox.dm index 16dc505b6a3..c3f250f9b92 100644 --- a/code/modules/mob/living/carbon/human/species_types/vox.dm +++ b/code/modules/mob/living/carbon/human/species_types/vox.dm @@ -4,7 +4,6 @@ id = SPECIES_VOX default_color = "6060FF" species_age_max = 280 - species_traits = list(HAS_BONE, HAS_FLESH) mutant_bodyparts = list("vox_head_quills", "vox_neck_quills") default_features = list("mcolor" = "0F0", "wings" = "None", "vox_head_quills" = "None", "vox_neck_quills" = "None") meat = /obj/item/food/meat/slab/chicken diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 5a935279585..7a9f42099d4 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -34,8 +34,6 @@ handle_diseases(seconds_per_tick, times_fired)// DEAD check is in the proc itself; we want it to spread even if the mob is dead, but to handle its disease-y properties only if you're not. - handle_wounds() - if (QDELETED(src)) // diseases can qdel the mob via transformations return @@ -56,6 +54,8 @@ handle_traits() // eye, ear, brain damages handle_status_effects() //all special effects, stun, knockdown, jitteryness, hallucination, sleeping, etc + handle_wounds(seconds_per_tick, times_fired) + if(machine) machine.check_eye(src) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 93cf5a5d659..87382771f03 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -561,6 +561,9 @@ /mob/living/proc/can_inject(mob/user, target_zone, injection_flags) return TRUE +/mob/living/proc/is_exposed(mob/user, target_zone, error_msg) + return TRUE + /** * Like can_inject, but it can perform side effects. * diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 0c5f8255465..9d0c4c34bef 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -431,12 +431,14 @@ //called when the mob receives a bright flash /mob/living/proc/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash) if(HAS_TRAIT(src, TRAIT_NOFLASH)) - return FALSE - if(get_eye_protection() < intensity && (override_blindness_check || !is_blind())) - overlay_fullscreen("flash", type) - addtimer(CALLBACK(src, PROC_REF(clear_fullscreen), "flash", 25), 25) - return TRUE - return FALSE + return NONE + if(get_eye_protection() >= intensity) + return NONE + if(is_blind() && !override_blindness_check) + return FLASH_DAMAGE + overlay_fullscreen("flash", type) + addtimer(CALLBACK(src, PROC_REF(clear_fullscreen), "flash", 25), 25) + return FLASH_EFFECT | FLASH_DAMAGE //called when the mob receives a loud bang /mob/living/proc/soundbang_act() diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index be46d3e4045..73edae84e64 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -114,6 +114,19 @@ back = /obj/item/storage/backpack r_pocket = /obj/item/tank/internals/emergency_oxygen +/datum/outfit/ramzi/sniper + name = "Ramzi Clique Sniper" + uniform = /obj/item/clothing/under/syndicate/ramzi + head = /obj/item/clothing/head/helmet/space/hardsuit/stealth/ramzi + suit = /obj/item/clothing/suit/space/hardsuit/stealth/ramzi + back = /obj/item/tank/jetpack/oxygen/harness + r_pocket = /obj/item/tank/internals/emergency_oxygen + +/obj/effect/mob_spawn/human/corpse/ramzi/sniper + name = "Ramzi Clique Sniper" + id_job = "Operative" + outfit = /datum/outfit/ramzi/sniper + /obj/effect/mob_spawn/human/corpse/ramzi/stormtrooper name = "Ramzi Clique Trooper" id_job = "Operative" diff --git a/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm b/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm index dfadd5e5ec7..725772ba5b8 100644 --- a/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm +++ b/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm @@ -536,7 +536,7 @@ rapid_fire_delay = 10 /mob/living/simple_animal/hostile/human/frontier/ranged/officer/rifle/neutered - weapon_drop_chance = 100 + weapon_drop_chance = 0 /mob/living/simple_animal/hostile/human/frontier/ranged/officer/internals icon_state = "frontiersmanofficer_mask" diff --git a/code/modules/mob/living/simple_animal/hostile/human/survivors.dm b/code/modules/mob/living/simple_animal/hostile/human/survivors.dm index b6147164766..e792b350dc9 100644 --- a/code/modules/mob/living/simple_animal/hostile/human/survivors.dm +++ b/code/modules/mob/living/simple_animal/hostile/human/survivors.dm @@ -69,7 +69,7 @@ desc = "A stanced figure sheltered behind a shoddy, makeshift wooden buckler. A jagged machete is held within their clutch." mob_spawner = /obj/effect/mob_spawn/human/corpse/damaged/whitesands r_hand = /obj/item/melee/sword/mass - l_hand = /obj/item/shield/riot/buckler + l_hand = /obj/item/shield/buckler projectile_deflect_chance = 25 /mob/living/simple_animal/hostile/human/hermit/ranged diff --git a/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm index 6a25bf0da1e..e74825cef88 100644 --- a/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm @@ -556,6 +556,8 @@ casingtype = /obj/item/ammo_casing/a65clip l_hand = /obj/item/gun/ballistic/automatic/marksman/boomslang projectilesound = 'sound/weapons/gun/sniper/cmf90.ogg' + armor_base = /obj/item/clothing/suit/space/hardsuit/stealth/ramzi + mob_spawner = /obj/effect/mob_spawn/human/corpse/ramzi/sniper /mob/living/simple_animal/hostile/human/ramzi/ranged/space/sniper/sentry vision_range = 14 @@ -612,6 +614,15 @@ vision_range = 12 aggro_vision_range = 14 +/mob/living/simple_animal/hostile/human/ramzi/ranged/space/stormtrooper/hydra/dmr/sentry + vision_range = 14 + aggro_vision_range = 14 + minimum_distance = 14 + stop_automated_movement = 1 + wander = 0 + retreat_distance = 0 + environment_smash = 0 + /mob/living/simple_animal/hostile/human/ramzi/ranged/space/stormtrooper/smg name = "Ramzi Clique Shock Trooper" desc = "Night-black armor traces the silhouette of a soldier equaled by precious few. Their Sidewinder tracks you perfectly, a staccato bark of 5.7 already in its throat." diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 92e468af4d0..e36754e6207 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -446,26 +446,6 @@ alert_overlay.plane = FLOAT_PLANE A.add_overlay(alert_overlay) -/** - * Heal a robotic body part on a mob - */ -/proc/item_heal_robotic(mob/living/carbon/human/H, mob/user, brute_heal, burn_heal) - var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) - if(affecting && (!IS_ORGANIC_LIMB(affecting))) - var/dam //changes repair text based on how much brute/burn was supplied - if(brute_heal > burn_heal) - dam = 1 - else - dam = 0 - if((brute_heal > 0 && affecting.brute_dam > 0) || (burn_heal > 0 && affecting.burn_dam > 0)) - if(affecting.heal_damage(brute_heal, burn_heal, 0, BODYTYPE_ROBOTIC)) - H.update_damage_overlays() - user.visible_message("[user] has fixed some of the [dam ? "dents on" : "burnt wires in"] [H]'s [parse_zone(affecting.body_zone)].", \ - span_notice("You fix some of the [dam ? "dents on" : "burnt wires in"] [H == user ? "your" : "[H]'s"] [parse_zone(affecting.body_zone)].")) - return 1 //successful heal - else - to_chat(user, span_warning("[affecting] is already in good condition!")) - ///Is the passed in mob a ghost with admin powers, doesn't check for AI interact like isAdminGhost() used to /proc/isAdminObserver(mob/user) if(!user) //Are they a mob? Auto interface updates call this with a null src diff --git a/code/modules/movespeed/modifiers/reagent.dm b/code/modules/movespeed/modifiers/reagent.dm index dceceb1bbc5..3d1c67c3943 100644 --- a/code/modules/movespeed/modifiers/reagent.dm +++ b/code/modules/movespeed/modifiers/reagent.dm @@ -28,6 +28,9 @@ /datum/movespeed_modifier/reagent/shoalmix multiplicative_slowdown = -0.4 +/datum/movespeed_modifier/reagent/cytodron + multiplicative_slowdown = -0.1 + /datum/movespeed_modifier/reagent/cinesia multiplicative_slowdown = -0.55 diff --git a/code/modules/overmap/_overmap_datum.dm b/code/modules/overmap/_overmap_datum.dm index b48e0a2a140..73eafdbf26b 100644 --- a/code/modules/overmap/_overmap_datum.dm +++ b/code/modules/overmap/_overmap_datum.dm @@ -13,6 +13,8 @@ var/name ///A quick description of the event. Should fit into a quick tgui hoverover tip. var/desc + ///The class of this object, used in place of its name when cloaked or obscured. + var/ship_class = "Object" ///Extra info that would fit into a sidebar or an extra pane such as. Should fit into a quick tgui hoverover tip. var/extra_info ///the color of the event if it isn't overridden by the overmap @@ -94,6 +96,8 @@ if(!char_rep && name) char_rep = name[1] + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_CLOAKED), PROC_REF(activate_cloak)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_CLOAKED), PROC_REF(deactivate_cloak)) Initialize(arglist(args)) /datum/overmap/Destroy(force) @@ -673,6 +677,12 @@ token.color = current_overmap.primary_color current_overmap.post_edit_token_state(src) +/datum/overmap/proc/activate_cloak() + alter_token_appearance() + +/datum/overmap/proc/deactivate_cloak() + alter_token_appearance() + /* * For use when this datum is just completely fucked with no real solutions. * diff --git a/code/modules/overmap/helm.dm b/code/modules/overmap/helm.dm index b51664f03e2..43c814fcc3e 100644 --- a/code/modules/overmap/helm.dm +++ b/code/modules/overmap/helm.dm @@ -186,6 +186,8 @@ user.client.register_map_obj(current_ship.token.cam_screen) user.client.register_map_obj(current_ship.token.cam_plane_master) user.client.register_map_obj(current_ship.token.cam_background) + if(current_ship.cloaked_image) + user.client.images += current_ship.cloaked_image current_ship.token.update_screen() // Open UI @@ -225,6 +227,8 @@ var/list/other_data = list( name = object.name, candock = available_dock, + object_class = object.ship_class, + hidden = HAS_TRAIT(object, TRAIT_CLOAKED), ref = REF(object) ) .["otherInfo"] += list(other_data) @@ -242,6 +246,12 @@ .["aiControls"] = allow_ai_control .["burnDirection"] = current_ship.burn_direction .["burnPercentage"] = current_ship.burn_percentage + .["cloaked"] = HAS_TRAIT_FROM(current_ship, TRAIT_CLOAKED, SHIPMODULE_CLOAKING) + + var/obj/machinery/power/cloak/cloaking_system = current_ship.ship_modules[SHIPMODULE_CLOAKING] + if(cloaking_system) + .["cloakChargePercent"] = 100 * cloaking_system.current_charge / max(cloaking_system.max_charge, 1) + for(var/datum/weakref/engine in current_ship.shuttle_port.engine_list) var/obj/machinery/power/shuttle/engine/real_engine = engine.resolve() if(!real_engine) @@ -277,6 +287,7 @@ mass = current_ship.shuttle_port.turf_count, sensor_range = 4 ) + .["hasCloaking"] = !isnull(current_ship.ship_modules[SHIPMODULE_CLOAKING]) .["canFly"] = TRUE .["aiUser"] = issilicon(user) @@ -324,6 +335,12 @@ allow_ai_control = !allow_ai_control say(allow_ai_control ? "AI Control has been enabled." : "AI Control is now disabled.") return + if("toggle_cloak") + var/obj/machinery/power/cloak/cloaking_system = current_ship.ship_modules[SHIPMODULE_CLOAKING] + if(!cloaking_system) + return + cloaking_system.set_cloak(!cloaking_system.cloak_active) + return TRUE if("act_overmap") if(SSshuttle.jump_mode > BS_JUMP_CALLED) to_chat(usr, "Cannot interact due to bluespace jump preperations!") @@ -427,6 +444,8 @@ if(current_ship.burn_direction > BURN_NONE && !length(concurrent_users) && !viewer && is_living) // If accelerating with nobody else to stop it say("Pilot absence detected, engaging acceleration safeties.") current_ship.change_heading(BURN_NONE) + if(current_ship.cloaked_image) + user.client.images -= current_ship.cloaked_image // Turn off the console if(!length(concurrent_users) && is_living) @@ -450,10 +469,21 @@ playsound(src, 'sound/effects/fuse.ogg') current_ship.helm_locked = FALSE -/obj/machinery/computer/helm/multitool_act(mob/living/user, obj/item/I) +/obj/machinery/computer/helm/multitool_act(mob/living/user, obj/item/multitool/tool) if(!Adjacent(user)) return + if(istype(tool, /obj/item/multitool) && isweakref(tool.buffer)) + var/datum/weakref/buffer_ref = tool.buffer + var/obj/machinery/power/cloak/linked_cloak = buffer_ref.resolve() + if(istype(linked_cloak, /obj/machinery/power/cloak)) + var/obj/machinery/power/cloak/current_cloak = current_ship.ship_modules[SHIPMODULE_CLOAKING] + if(current_cloak) + current_cloak.unlink_from_ship() + linked_cloak.link_to_ship(current_ship) + balloon_alert(user, "[linked_cloak.name] linked!") + return COMPONENT_BLOCK_TOOL_ATTACK + to_chat(user, span_warning("You begin to manually override the local database...")) if(!do_after(user, 2 SECONDS, list(src))) return COMPONENT_BLOCK_TOOL_ATTACK diff --git a/code/modules/overmap/objects/event_datum.dm b/code/modules/overmap/objects/event_datum.dm index 926dec72b0f..5b2e78d3b67 100644 --- a/code/modules/overmap/objects/event_datum.dm +++ b/code/modules/overmap/objects/event_datum.dm @@ -323,6 +323,10 @@ if(S.shuttle_port.is_in_shuttle_bounds(poor_crew)) poor_crew.playsound_local(poor_crew, THUNDER_SOUND, rand(min_damage, max_damage)) + var/obj/machinery/power/cloak/cloaking_system = S.ship_modules[SHIPMODULE_CLOAKING] + if(cloaking_system?.cloak_active) + cloaking_system.set_cloak(FALSE) + cloaking_system.visible_message("[src] is overloaded by the electrical storm and shuts off!") /datum/overmap/event/electric/modify_emptyspace_mapgen(datum/overmap/dynamic/our_planet) our_planet.weather_controller_type = /datum/weather_controller/shrouded @@ -370,7 +374,7 @@ /datum/overmap/event/nebula/process() . = ..() - var/list/nearby_objects = get_nearby_overmap_objects() + var/list/nearby_objects = get_nearby_overmap_objects(include_docked = TRUE) var/datum/virtual_level/ship_vlevel for(var/datum/overmap/ship/controlled/ship as anything in affected_ships) @@ -378,8 +382,7 @@ ship_vlevel = ship.shuttle_port.get_virtual_level() affected_ships -= ship - ship.hidden = FALSE - ship.alter_token_appearance() + REMOVE_TRAIT(ship, TRAIT_CLOAKED, REF(src)) for(var/obj/machinery/light/light_to_mess in GLOB.machines) if(light_to_mess.virtual_z() != ship_vlevel.id) @@ -398,8 +401,7 @@ if(affected_ships.len == 0) START_PROCESSING(SSfastprocess, src) affected_ships += ship - ship.hidden = TRUE - ship.alter_token_appearance() + ADD_TRAIT(ship, TRAIT_CLOAKED, REF(src)) for(var/obj/machinery/light/light_to_mess in GLOB.machines) diff --git a/code/modules/overmap/ships/controlled_ship_datum.dm b/code/modules/overmap/ships/controlled_ship_datum.dm index ef9f1ca461a..b8df44b377f 100644 --- a/code/modules/overmap/ships/controlled_ship_datum.dm +++ b/code/modules/overmap/ships/controlled_ship_datum.dm @@ -78,6 +78,9 @@ ///The ship's real name, without the prefix var/real_name + ///Image shown to helm console viewers while cloaked, allows the pilot to see + var/image/cloaked_image + ///Stations the ship has been blacklisted from landing at, associative station = reason var/list/blacklisted = list() @@ -125,6 +128,7 @@ source_template = creation_template unique_ship_access = source_template.unique_ship_access job_slots = source_template.job_slots?.Copy() + ship_class = source_template.ship_class stationary_icon_state = creation_template.token_icon_state alter_token_appearance() if(create_shuttle) @@ -538,6 +542,32 @@ if(our_helm) our_helm.cancel_jump() +/datum/overmap/ship/controlled/activate_cloak() + . = ..() + var/mutable_appearance/token_appearance = new(token) + cloaked_image = new(loc = token) + token_appearance.dir = token.dir + token_appearance.appearance_flags = RESET_COLOR|RESET_ALPHA + token_appearance.alpha = 64 + cloaked_image.appearance = token_appearance + for(var/obj/machinery/computer/helm/helm_console as anything in helms) + for(var/user_ref in helm_console.concurrent_users) + var/mob/user = locate(user_ref) + if(!user) + continue + user.client.images += cloaked_image + +/datum/overmap/ship/controlled/deactivate_cloak() + . = ..() + if(!cloaked_image) + return + for(var/obj/machinery/computer/helm/helm_console as anything in helms) + for(var/user_ref in helm_console.concurrent_users) + var/mob/user = locate(user_ref) + if(!user) + continue + user.client.images -= cloaked_image + QDEL_NULL(cloaked_image) /obj/item/key/ship name = "ship key" diff --git a/code/modules/overmap/ships/ship_datum.dm b/code/modules/overmap/ships/ship_datum.dm index fdb23530ed0..406b53287cd 100644 --- a/code/modules/overmap/ships/ship_datum.dm +++ b/code/modules/overmap/ships/ship_datum.dm @@ -37,9 +37,6 @@ ///ONLY USED FOR NON-SIMULATED SHIPS. The amount per burn that this ship accelerates var/acceleration_speed = 0.02 - ///Is this ship hidden? If true we hide the ships name/class on the token. - var/hidden = FALSE - var/registered_to_docked = FALSE /datum/overmap/ship/Initialize(position, system_spawned_in, ...) @@ -264,22 +261,40 @@ token_icon_state = stationary_icon_state if(direction) token.dir = direction - ..() - if(hidden) - token.name = "???" - token.desc = "There's no identification of what this is. It's possible to get more information with your radar by getting closer." - token.icon_state = "unknown" - token.color = current_overmap.primary_structure_color + + var/cloaked = HAS_TRAIT(src, TRAIT_CLOAKED) + if(!cloaked) + ..() // no need to update while invisible + token.color = current_overmap.primary_structure_color + current_overmap.post_edit_token_state(src) if(!legacy_rendering_switch) token.cut_overlays() if(direction) token.add_overlay("dir_moving") - else if(!hidden) + else if(!cloaked) token.add_overlay("dir_idle") if(speed) token.add_overlay("speed_[clamp(round(speed,1),0,10)]") +/datum/overmap/ship/activate_cloak() + . = ..() + animate(token, 0.8 SECONDS, alpha = 0, color = (HAS_TRAIT(src, TRAIT_BLUESPACE_SHIFT) ? COLOR_BLUE : COLOR_RED)) + addtimer(CALLBACK(src, PROC_REF(after_activate_cloak)), 0.8 SECONDS) + +/datum/overmap/ship/proc/after_activate_cloak() + if(!HAS_TRAIT(src, TRAIT_CLOAKED)) + return + token.name = "???" + token.desc = "There's no identification of what this is. It's possible to get more information with your radar by getting closer." + token.icon_state = "unknown" + +/datum/overmap/ship/deactivate_cloak() + if(!token.alpha) + token.color = HAS_TRAIT(src, TRAIT_BLUESPACE_SHIFT) ? COLOR_BLUE : COLOR_RED + animate(token, 0.8 SECONDS, alpha = token::alpha, color = current_overmap.primary_structure_color) + return ..() + // ensures the camera always moves when the ship moves /datum/overmap/ship/overmap_move(new_x, new_y) . = ..() diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 4acd30258ae..cfc85aef8e0 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -31,19 +31,9 @@ grind_results = list(/datum/reagent/cellulose = 3) color = COLOR_WHITE - /// Lazylist of raw, unsanitised, unparsed text inputs that have been made to the paper. - var/list/datum/paper_input/raw_text_inputs - /// Lazylist of all raw stamp data to be sent to tgui. - var/list/datum/paper_stamp/raw_stamp_data - /// Lazylist of all fields that have had some input added to them. - var/list/datum/paper_field/raw_field_input_data - /// Whether the icon should show little scribbly written words when the paper has some text on it. var/show_written_words = TRUE - /// Helper cache that contains a list of all icon_states that are currently stamped on the paper. - var/list/stamp_cache - /// Reagent to transfer to the user when they pick the paper up without proper protection. var/contact_poison /// Volume of contact_poison to transfer to the user when they pick the paper up without proper protection. @@ -52,9 +42,6 @@ /// Default raw text to fill this paper with on init. var/default_raw_text - /// The number of input fields - var/input_field_count = 0 - /// Paper can be shown via cameras. When that is done, a deep copy of the paper is made and stored as a var on the camera. /// The paper is located in nullspace, and holds a weak ref to the camera that once contained it so the paper can do some /// state checking on if it should be shown to a viewer. @@ -63,18 +50,12 @@ ///If TRUE, staff can read paper everywhere, but usually from requests panel. var/request_state = FALSE - /// The (text for the) stamps on the paper. - var/list/stamps /// Positioning for the stamp in tgui - var/list/stamped /// Overlay info - /obj/item/paper/Initialize(mapload) . = ..() pixel_x = base_pixel_x + rand(-9, 9) pixel_y = base_pixel_y + rand(-8, 8) - if(default_raw_text) - add_raw_text(default_raw_text) - + AddComponent(/datum/component/writing, default_raw_text) update_appearance() /obj/item/paper/Destroy() @@ -82,42 +63,6 @@ camera_holder = null clear_paper() -/// Returns a deep copy list of raw_text_inputs, or null if the list is empty or doesn't exist. -/obj/item/paper/proc/copy_raw_text() - if(!LAZYLEN(raw_text_inputs)) - return null - - var/list/datum/paper_input/copy_text = list() - - for(var/datum/paper_input/existing_input as anything in raw_text_inputs) - copy_text += existing_input.make_copy() - - return copy_text - -/// Returns a deep copy list of raw_field_input_data, or null if the list is empty or doesn't exist. -/obj/item/paper/proc/copy_field_text() - if(!LAZYLEN(raw_field_input_data)) - return null - - var/list/datum/paper_field/copy_text = list() - - for(var/datum/paper_field/existing_input as anything in raw_field_input_data) - copy_text += existing_input.make_copy() - - return copy_text - -/// Returns a deep copy list of raw_stamp_data, or null if the list is empty or doesn't exist. Does not copy overlays or stamp_cache, only the tgui rendered stamps. -/obj/item/paper/proc/copy_raw_stamps() - if(!LAZYLEN(raw_stamp_data)) - return null - - var/list/datum/paper_field/copy_stamps = list() - - for(var/datum/paper_stamp/existing_input as anything in raw_stamp_data) - copy_stamps += existing_input.make_copy() - - return copy_stamps - /** * This proc copies this sheet of paper to a new * sheet. Used by carbon papers and the photocopier machine. @@ -131,144 +76,21 @@ /obj/item/paper/proc/copy(paper_type = /obj/item/paper, atom/location = loc, colored = TRUE, greyscale_override = null) var/obj/item/paper/new_paper = new paper_type(location) - - new_paper.raw_text_inputs = copy_raw_text() - new_paper.raw_field_input_data = copy_field_text() + var/datum/component/writing/our_text = GetComponent(/datum/component/writing) + var/datum/component/writing/new_text = new_paper.GetComponent(/datum/component/writing) if(colored) new_paper.color = color - else - var/new_color = greyscale_override || COLOR_WEBSAFE_DARK_GRAY - for(var/datum/paper_input/text as anything in new_paper.raw_text_inputs) - text.colour = new_color - - for(var/datum/paper_field/text as anything in new_paper.raw_field_input_data) - text.field_data.colour = new_color + our_text.copy_to(new_text, colored, greyscale_override) - new_paper.input_field_count = input_field_count - new_paper.raw_stamp_data = copy_raw_stamps() - new_paper.stamp_cache = stamp_cache?.Copy() new_paper.update_icon_state() copy_overlays(new_paper, TRUE) return new_paper -/* This simple helper adds the supplied raw text to the paper, appending to the end of any existing contents. - * - * This a God proc that does not care about paper max length and expects sanity checking beforehand if you want to respect it. - * - * The caller is expected to handle updating icons and appearance after adding text, to allow for more efficient batch adding loops. - * * Arguments: - * * text - The text to append to the paper. - * * font - The font to use. - * * color - The font color to use. - * * bold - Whether this text should be rendered completely bold. - */ - -/obj/item/paper/proc/add_raw_text(text, font, color, bold, advanced_html) - var/new_input_datum = new /datum/paper_input( - text, - font, - color, - bold, - advanced_html, - ) - - input_field_count += get_input_field_count(text) - - LAZYADD(raw_text_inputs, new_input_datum) - -/** - * This simple helper adds the supplied input field data to the paper. - * - * It will not overwrite any existing input field data by default and will early return FALSE if this scenario happens unless overwrite is - * set properly. - * - * Other than that, this is a God proc that does not care about max length or out-of-range IDs and expects sanity checking beforehand if - * you want to respect it. - * - * * Arguments: - * * field_id - The ID number of the field to which this data applies. - * * text - The text to append to the paper. - * * font - The font to use. - * * color - The font color to use. - * * bold - Whether this text should be rendered completely bold. - * * overwrite - If TRUE, will overwrite existing field ID's data if it exists. - */ -/obj/item/paper/proc/add_field_input(field_id, text, font, color, bold, signature_name, overwrite = FALSE) - var/datum/paper_field/field_data_datum = null - - var/is_signature = ((text == "%sign") || (text == "%s")) - - var/field_text = is_signature ? signature_name : text - var/field_font = is_signature ? SIGNATURE_FONT : font - - for(var/datum/paper_field/field_input in raw_field_input_data) - if(field_input.field_index == field_id) - if(!overwrite) - return FALSE - field_data_datum = field_input - break - - if(!field_data_datum) - var/new_field_input_datum = new /datum/paper_field( - field_id, - field_text, - field_font, - color, - bold, - is_signature, - ) - LAZYADD(raw_field_input_data, new_field_input_datum) - return TRUE - - var/new_input_datum = new /datum/paper_input( - field_text, - field_font, - color, - bold, - ) - - field_data_datum.field_data = new_input_datum; - field_data_datum.is_signature = is_signature; - - return TRUE - -/** - * This simple helper adds the supplied stamp to the paper, appending to the end of any existing stamps. - * - * This a God proc that does not care about stamp max count and expects sanity checking beforehand if you want to respect it. - * - * It does however respect the overlay limit and will not apply any overlays past the cap. - * - * The caller is expected to handle updating icons and appearance after adding text, to allow for more efficient batch adding loops. - * * Arguments: - * * stamp_class - Div class for the stamp. - * * stamp_x - X coordinate to render the stamp in tgui. - * * stamp_y - Y coordinate to render the stamp in tgui. - * * rotation - Degrees of rotation for the stamp to be rendered with in tgui. - * * stamp_icon_state - Icon state for the stamp as part of overlay rendering. - */ - -/obj/item/paper/proc/add_stamp(stamp_class, stamp_x, stamp_y, rotation, stamp_icon_state) - var/new_stamp_datum = new /datum/paper_stamp(stamp_class, stamp_x, stamp_y, rotation) - LAZYADD(raw_stamp_data, new_stamp_datum); - - if(LAZYLEN(stamp_cache) > MAX_PAPER_STAMPS_OVERLAYS) - return - - var/mutable_appearance/stamp_overlay = mutable_appearance('icons/obj/bureaucracy.dmi', "paper_[stamp_icon_state]") - stamp_overlay.pixel_x = rand(-2, 2) - stamp_overlay.pixel_y = rand(-3, 2) - add_overlay(stamp_overlay) - LAZYADD(stamp_cache, stamp_icon_state) - /// Removes all input and all stamps from the paper, clearing it completely. /obj/item/paper/proc/clear_paper() - LAZYNULL(raw_text_inputs) - LAZYNULL(raw_stamp_data) - LAZYNULL(raw_field_input_data) - LAZYNULL(stamp_cache) - + if(!QDELETED(src)) + AddComponent(/datum/component/writing) // deletes old component cut_overlays() update_appearance() @@ -282,7 +104,8 @@ . = ..() /obj/item/paper/update_icon_state() - if(LAZYLEN(raw_text_inputs) && show_written_words) + var/datum/component/writing/words = GetComponent(/datum/component/writing) + if(words && show_written_words && LAZYLEN(words.raw_text_inputs)) icon_state = "[initial(icon_state)]_words" return ..() @@ -305,38 +128,12 @@ name = "paper[(n_name ? text("- '[n_name]'") : null)]" add_fingerprint(usr) -/obj/item/paper/examine(mob/user) - . = ..() - if(!in_range(user, src) && !isobserver(user)) - . += span_warning("You're too far away to read it!") - return - - if(user.is_blind()) - to_chat(user, span_warning("You are blind and can't read anything!")) - return - - if(user.can_read(src)) - ui_interact(user) - return - . += span_warning("You cannot read it!") - /obj/item/paper/ui_status(mob/user,/datum/ui_state/state) // Are we on fire? Hard to read if so if(resistance_flags & ON_FIRE) return UI_CLOSE if(camera_holder && can_show_to_mob_through_camera(user) || request_state) return UI_UPDATE - if(!in_range(user, src) && !isobserver(user)) - return UI_CLOSE - if(user.incapacitated(TRUE, TRUE) || (isobserver(user) && !check_rights_for(user.client, R_ADMIN))) - return UI_UPDATE - // Even harder to read if your blind...braile? humm - // .. or if you cannot read - if(user.is_blind()) - to_chat(user, span_warning("You are blind and can't read anything!")) - return UI_CLOSE - if(!user.can_read(src)) - return UI_CLOSE if(in_contents_of(/obj/machinery/door/airlock) || in_contents_of(/obj/item/clipboard)) return UI_INTERACTIVE return ..() @@ -369,52 +166,23 @@ /obj/item/paper/attackby(obj/item/attacking_item, mob/living/user, params) if(burn_paper_product_attackby_check(attacking_item, user)) SStgui.close_uis(src) - return + return TRUE -// Enable picking paper up by clicking on it with the clipboard or folder + // Enable picking paper up by clicking on it with the clipboard or folder if(istype(attacking_item, /obj/item/clipboard) || istype(attacking_item, /obj/item/folder) || istype(attacking_item, /obj/item/paper_bin)) attacking_item.attackby(src, user) - return - -// Handle writing items. - var/writing_stats = istype(attacking_item) ? attacking_item.get_writing_implement_details() : null + return TRUE - if(!writing_stats) - if (attacking_item.sharpness > SHARP_NONE && !istype(src, /obj/item/paper/paperslip) && do_after(user, 5, src)) + // Handle cutting paper apart + if(!attacking_item.get_writing_implement_details() && attacking_item.sharpness > SHARP_NONE && !istype(src, /obj/item/paper/paperslip)) + if(do_after(user, 5, src)) playsound(src.loc, 'sound/weapons/slash.ogg', 50, TRUE) to_chat(user, span_notice("You neatly cut [src].")) new /obj/item/paper/paperslip(get_turf(src)) new /obj/item/paper/paperslip(get_turf(src)) qdel(src) - return - ui_interact(user) - return ..() - - if(writing_stats["interaction_mode"] == MODE_WRITING) - if(!user.can_write(attacking_item)) - return - if(get_total_length() >= MAX_PAPER_LENGTH) - to_chat(user, span_warning("This sheet of paper is full!")) - return - - ui_interact(user) - return - - - // Handle stamping items. - if(writing_stats["interaction_mode"] == MODE_STAMPING) - if(!user.can_read(src) || user.is_blind()) - //The paper's stampable window area is assumed approx 400x500 - add_stamp(writing_stats["stamp_class"], rand(0, 400), rand(0, 500), rand(0, 360), writing_stats["stamp_icon_state"]) - user.visible_message(span_notice("[user] blindly stamps [src] with \the [attacking_item]!")) - to_chat(user, span_notice("You stamp [src] with \the [attacking_item] the best you can!")) - playsound(src, 'sound/items/handling/standard_stamp.ogg', 50, vary = TRUE) - else - to_chat(user, span_notice("You ready your stamp over the paper! ")) - ui_interact(user) - return + return TRUE - ui_interact(user) return ..() /** @@ -426,7 +194,8 @@ if(!can_show_to_mob_through_camera(user)) return - return ui_interact(user) + var/datum/component/writing/words = GetComponent(/datum/component/writing) + return words?.ui_interact(user) /obj/item/paper/proc/can_show_to_mob_through_camera(mob/living/user) var/obj/machinery/camera/held_to_camera = camera_holder.resolve() @@ -446,307 +215,29 @@ return TRUE -/obj/item/paper/ui_assets(mob/user) - return list( - get_asset_datum(/datum/asset/spritesheet/simple/paper), - ) - -/obj/item/paper/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "PaperSheet", name) - ui.open() - -/obj/item/paper/ui_static_data(mob/user) - var/list/static_data = list() - - static_data["user_name"] = user.real_name - - static_data["raw_text_input"] = list() - for(var/datum/paper_input/text_input as anything in raw_text_inputs) - static_data["raw_text_input"] += list(text_input.to_list()) - - static_data["raw_field_input"] = list() - for(var/datum/paper_field/field_input as anything in raw_field_input_data) - static_data["raw_field_input"] += list(field_input.to_list()) - - static_data["raw_stamp_input"] = list() - for(var/datum/paper_stamp/stamp_input as anything in raw_stamp_data) - static_data["raw_stamp_input"] += list(stamp_input.to_list()) - - static_data["max_length"] = MAX_PAPER_LENGTH - static_data["max_input_field_length"] = MAX_PAPER_INPUT_FIELD_LENGTH - static_data["paper_color"] = color ? color : COLOR_WHITE - static_data["paper_name"] = name - - static_data["default_pen_font"] = PEN_FONT - static_data["default_pen_color"] = COLOR_BLACK - static_data["signature_font"] = FOUNTAIN_PEN_FONT - - return static_data; - -/obj/item/paper/ui_data(mob/user) - var/list/data = list() - if(!isliving(user)) - return data - - var/obj/item/holding = user.get_active_held_item() - // Use a clipboard's pen, if applicable - if(istype(loc, /obj/item/clipboard)) - var/obj/item/clipboard/clipboard = loc - // This is just so you can still use a stamp if you're holding one. Otherwise, it'll - // use the clipboard's pen, if applicable. - if(!istype(holding, /obj/item/stamp) && clipboard.pen) - holding = clipboard.pen - data["held_item_details"] = istype(holding) ? holding.get_writing_implement_details() : null - - - // If the paper is on an unwritable noticeboard, clear the held item details so it's read-only. - if(istype(loc, /obj/structure/noticeboard)) - var/obj/structure/noticeboard/noticeboard = loc - if(!noticeboard.allowed(user)) - data["held_item_details"] = null; - - return data - -/obj/item/paper/ui_act(action, params, datum/tgui/ui) - . = ..() - if(.) - return - - var/mob/user = ui.user - - switch(action) - if("add_stamp") - var/obj/item/holding = user.get_active_held_item() - var/stamp_info = holding?.get_writing_implement_details() - if(!stamp_info || (stamp_info["interaction_mode"] != MODE_STAMPING)) - to_chat(src, span_warning("You can't stamp with the [holding]!")) - return TRUE - - var/stamp_class = stamp_info["stamp_class"]; - - // If the paper is on an unwritable noticeboard, this usually shouldn't be possible. - if(istype(loc, /obj/structure/noticeboard)) - var/obj/structure/noticeboard/noticeboard = loc - if(!noticeboard.allowed(user)) - log_paper("[key_name(user)] tried to add stamp to [name] when it was on an unwritable noticeboard: \"[stamp_class]\"") - return TRUE - - var/stamp_x = text2num(params["x"]) - var/stamp_y = text2num(params["y"]) - var/stamp_rotation = text2num(params["rotation"]) - var/stamp_icon_state = stamp_info["stamp_icon_state"] - - if (LAZYLEN(raw_stamp_data) >= MAX_PAPER_STAMPS) - to_chat(usr, pick("You try to stamp but you miss!", "There is no where else you can stamp!")) - return TRUE - - add_stamp(stamp_class, stamp_x, stamp_y, stamp_rotation, stamp_icon_state) - user.visible_message(span_notice("[user] stamps [src] with \the [holding.name]!"), span_notice("You stamp [src] with \the [holding.name]!")) - playsound(src, 'sound/items/handling/standard_stamp.ogg', 50, vary = TRUE) - update_appearance() - update_static_data_for_all_viewers() - return TRUE - if("add_text") - var/paper_input = params["text"] - var/this_input_length = length(paper_input) - - if(this_input_length == 0) - to_chat(user, pick("Writing block strikes again!", "You forgot to write anything!")) - return TRUE - - // If the paper is on an unwritable noticeboard, this usually shouldn't be possible. - if(istype(loc, /obj/structure/noticeboard)) - var/obj/structure/noticeboard/noticeboard = loc - if(!noticeboard.allowed(user)) - log_paper("[key_name(user)] tried to write to [name] when it was on an unwritable noticeboard: \"[paper_input]\"") - return TRUE - - var/obj/item/holding = user.get_active_held_item() - // Use a clipboard's pen, if applicable - if(istype(loc, /obj/item/clipboard)) - var/obj/item/clipboard/clipboard = loc - // This is just so you can still use a stamp if you're holding one. Otherwise, it'll - // use the clipboard's pen, if applicable. - if(!istype(holding, /obj/item/stamp) && clipboard.pen) - holding = clipboard.pen - - // As of the time of writing, can_write outputs a message to the user so we don't have to. - if(!user.can_write(holding)) - return TRUE - - var/current_length = get_total_length() - var/new_length = current_length + this_input_length - - // tgui should prevent this outcome. - if(new_length > MAX_PAPER_LENGTH) - log_paper("[key_name(user)] tried to write to [name] when it would exceed the length limit by [new_length - MAX_PAPER_LENGTH] characters: \"[paper_input]\"") - return TRUE - - // Safe to assume there are writing implement details as user.can_write(...) fails with an invalid writing implement. - var/writing_implement_data = holding.get_writing_implement_details() - - add_raw_text(paper_input, writing_implement_data["font"], writing_implement_data["color"], writing_implement_data["use_bold"], check_rights_for(user?.client, R_FUN)) - - log_paper("[key_name(user)] wrote to [name]: \"[paper_input]\"") - to_chat(user, "You have added to your paper masterpiece!"); - - update_static_data_for_all_viewers() - update_appearance() - return TRUE - if("fill_input_field") - // If the paper is on an unwritable noticeboard, this usually shouldn't be possible. - if(istype(loc, /obj/structure/noticeboard)) - var/obj/structure/noticeboard/noticeboard = loc - if(!noticeboard.allowed(user)) - log_paper("[key_name(user)] tried to write to the input fields of [name] when it was on an unwritable noticeboard!") - return TRUE - - var/obj/item/holding = user.get_active_held_item() - // Use a clipboard's pen, if applicable - if(istype(loc, /obj/item/clipboard)) - var/obj/item/clipboard/clipboard = loc - // This is just so you can still use a stamp if you're holding one. Otherwise, it'll - // use the clipboard's pen, if applicable. - if(!istype(holding, /obj/item/stamp) && clipboard.pen) - holding = clipboard.pen - - // As of the time of writing, can_write outputs a message to the user so we don't have to. - if(!user.can_write(holding)) - return TRUE - - // Safe to assume there are writing implement details as user.can_write(...) fails with an invalid writing implement. - var/writing_implement_data = holding.get_writing_implement_details() - var/list/field_data = params["field_data"] - - for(var/field_key in field_data) - var/field_text = field_data[field_key] - var/text_length = length(field_text) - if(text_length > MAX_PAPER_INPUT_FIELD_LENGTH) - log_paper("[key_name(user)] tried to write to field [field_key] with text over the max limit ([text_length] out of [MAX_PAPER_INPUT_FIELD_LENGTH]) with the following text: [field_text]") - return TRUE - if(text2num(field_key) >= input_field_count) - log_paper("[key_name(user)] tried to write to invalid field [field_key] (when the paper only has [input_field_count] fields) with the following text: [field_text]") - return TRUE - - if(!add_field_input(field_key, field_text, writing_implement_data["font"], writing_implement_data["color"], writing_implement_data["use_bold"], user.real_name)) - log_paper("[key_name(user)] tried to write to field [field_key] when it already has data, with the following text: [field_text]") - - update_static_data_for_all_viewers() - return TRUE - -/obj/item/paper/proc/get_input_field_count(raw_text) - var/static/regex/field_regex = new(@"\[_+\]","g") - - var/counter = 0 - while(field_regex.Find(raw_text)) - counter++ - - return counter - /obj/item/paper/ui_host(mob/user) if(istype(loc, /obj/structure/noticeboard)) return loc return ..() -/obj/item/paper/proc/get_total_length() - var/total_length = 0 - for(var/datum/paper_input/entry as anything in raw_text_inputs) - total_length += length(entry.raw_text) +/// Adds raw text to the writing component +/obj/item/paper/proc/add_raw_text(text, font, color, bold, advanced_html) + var/datum/component/writing/words = GetComponent(/datum/component/writing) + return words?.add_raw_text(text, font, color, bold, advanced_html) - return total_length +/// Adds raw text to the writing component +/obj/item/paper/proc/add_stamp(stamp_class, stamp_x, stamp_y, rotation, stamp_icon_state) + var/datum/component/writing/words = GetComponent(/datum/component/writing) + return words?.add_raw_text(stamp_class, stamp_x, stamp_y, rotation, stamp_icon_state) + +/obj/item/paper/proc/get_total_length() + var/datum/component/writing/words = GetComponent(/datum/component/writing) + return words?.get_total_length() /// Get a single string representing the text on a page /obj/item/paper/proc/get_raw_text() - var/paper_contents = "" - for(var/datum/paper_input/line as anything in raw_text_inputs) - paper_contents += line.raw_text + "/" - return paper_contents - -/// A single instance of a saved raw input onto paper. -/datum/paper_input - /// Raw, unsanitised, unparsed text for an input. - var/raw_text = "" - /// Font to draw the input with. - var/font = "" - /// Colour to draw the input with. - var/colour = "" - /// Whether to render the font bold or not. - var/bold = FALSE - /// Whether the creator of this input field has the R_FUN permission, thus allowing less sanitization - var/advanced_html = FALSE - -/datum/paper_input/New(_raw_text, _font, _colour, _bold, _advanced_html) - raw_text = _raw_text - font = _font - colour = _colour - bold = _bold - advanced_html = _advanced_html - -/datum/paper_input/proc/make_copy() - return new /datum/paper_input(raw_text, font, colour, bold, advanced_html); - -/datum/paper_input/proc/to_list() - return list( - raw_text = raw_text, - font = font, - color = colour, - bold = bold, - advanced_html = advanced_html, - ) - -/// A single instance of a saved stamp on paper. -/datum/paper_stamp - /// Asset class of the for rendering in tgui - var/class = "" - /// X position of stamp. - var/stamp_x = 0 - /// Y position of stamp. - var/stamp_y = 0 - /// Rotation of stamp in degrees. 0 to 359. - var/rotation = 0 - -/datum/paper_stamp/New(_class, _stamp_x, _stamp_y, _rotation) - class = _class - stamp_x = _stamp_x - stamp_y = _stamp_y - rotation = _rotation - -/datum/paper_stamp/proc/make_copy() - return new /datum/paper_stamp(class, stamp_x, stamp_y, rotation) - -/datum/paper_stamp/proc/to_list() - return list( - class = class, - x = stamp_x, - y = stamp_y, - rotation = rotation, - ) - -/// A reference to some data that replaces a modifiable input field at some given index in paper raw input parsing. -/datum/paper_field - /// When tgui parses the raw input, if it encounters a field_index matching the nth user input field, it will disable it and replace it with the field_data. - var/field_index = -1 - /// The data that tgui should substitute in-place of the input field when parsing. - var/datum/paper_input/field_data = null - /// If TRUE, requests tgui to render this field input in a more signature-y style. - var/is_signature = FALSE - -/datum/paper_field/New(_field_index, raw_text, font, colour, bold, _is_signature) - field_index = _field_index - field_data = new /datum/paper_input(raw_text, font, colour, bold) - is_signature = _is_signature - -/datum/paper_field/proc/make_copy() - return new /datum/paper_field(field_index, field_data.raw_text, field_data.font, field_data.colour, field_data.bold, is_signature) - -/datum/paper_field/proc/to_list() - return list( - field_index = field_index, - field_data = field_data.to_list(), - is_signature = is_signature, - ) + var/datum/component/writing/words = GetComponent(/datum/component/writing) + return words?.get_raw_text() /obj/item/paper/construction diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index 4d1eec1b0ac..db8e92aad26 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -54,8 +54,11 @@ /obj/item/paperplane/update_overlays() . = ..() - for(var/stamp in internalPaper.stamp_cache) - . += "paperplane_[stamp]" + var/datum/component/writing/words = internalPaper.GetComponent(/datum/component/writing) + if(!words) + return + for(var/graphic in words.graphic_cache) + . += "paperplane_[graphic]" /obj/item/paperplane/attack_self(mob/user) to_chat(user, span_notice("You unfold [src].")) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 4e6f10fd7ba..ea7e9682521 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -525,35 +525,13 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list(new/datum/stack_recipe("cable restrain pixel_x = base_pixel_x + rand(-2,2) pixel_y = base_pixel_y + rand(-2,2) update_appearance() + AddElement(/datum/element/robotic_heal, burn_heal = 15) recipes = GLOB.cable_coil_recipes - /////////////////////////////////// // General procedures /////////////////////////////////// - -//you can use wires to heal robotics -/obj/item/stack/cable_coil/attack(mob/living/carbon/human/H, mob/user) - if(!istype(H)) - return ..() - - if(!H.is_exposed(user, TRUE, user.zone_selected)) - return TRUE - - var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) - if(affecting && (!IS_ORGANIC_LIMB(affecting))) - if(user == H) - user.visible_message(span_notice("[user] starts to fix some of the wires in [H]'s [parse_zone(affecting.body_zone)]."), span_notice("You start fixing some of the wires in [H == user ? "your" : "[H]'s"] [parse_zone(affecting.body_zone)].")) - if(!do_after(user, 0.5 SECONDS, H)) - return - if(item_heal_robotic(H, user, 0, 15)) - use(1) - return - else - return ..() - - /obj/item/stack/cable_coil/update_appearance() . = ..() icon_state = "[base_icon_state][amount < 3 ? amount : ""]" diff --git a/code/modules/power/cloaking.dm b/code/modules/power/cloaking.dm new file mode 100644 index 00000000000..5677389235e --- /dev/null +++ b/code/modules/power/cloaking.dm @@ -0,0 +1,247 @@ +#define WATTS_PER_TURF 200 +#define BASE_RECHARGE_RATE 80 + +/obj/machinery/power/cloak + name = "ship cloaking device" + desc = "A machine capable of hiding a ship from long-range scanners. Very high power consumption. \ + There is a warning label advising against flying through electrical storms while active." + density = TRUE + use_power = NO_POWER_USE + active_power_usage = WATTS_PER_TURF + circuit = /obj/item/circuitboard/machine/cloak + + icon = 'icons/obj/machines/bsm.dmi' + icon_state = "bsm_idle" + base_icon_state = "bsm" + + /// Whether the cloaking device is active + var/cloak_active = FALSE + /// The current limit on power draw + var/recharge_rate = 0 + /// The maximum power the cloaking device can draw from the power network + var/max_recharge_rate = 40000 + /// Current stored power + var/current_charge + /// Maximum power storage + var/max_charge + /// Multiplier for power consumption + var/power_multiplier = 1 + /// Traits granted to the ship while active + var/list/cloak_traits = list(TRAIT_CLOAKED) + /// The ship linked to this cloaking device + var/datum/overmap/ship/controlled/linked_ship + +/obj/machinery/power/cloak/Initialize(mapload, apply_default_parts) + . = ..() + recharge_rate ||= max_recharge_rate / 2 + connect_to_network() + START_PROCESSING(SSmachines, src) + +/obj/machinery/power/cloak/Destroy() + set_cloak(FALSE) + if(linked_ship) + for(var/obj/console as anything in linked_ship.helms) + console.update_static_data_for_all_viewers() + unlink_from_ship() + return ..() + +/obj/machinery/power/cloak/examine(mob/user) + . = ..() + . += "Right-Click to quickly toggle it." + if(!powernet) + . += span_notice("There is no power grid connection.") + if(!linked_ship) + . += span_warning("It is not linked to a ship! Use a multitool to link it to the helm.") + +/obj/machinery/power/cloak/ui_interact(mob/user, datum/tgui/ui) + . = ..() + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "CloakingDevice", name) + ui.open() + +/obj/machinery/power/cloak/ui_data(mob/user) + return list( + "cloak_active" = cloak_active, + "recharge_rate" = recharge_rate, + "current_charge" = current_charge, + "available_power" = avail(), + ) + +/obj/machinery/power/cloak/ui_static_data(mob/user) + return list( + "linked_ship" = !isnull(linked_ship), + "power_consumption" = active_power_usage, + "max_recharge_rate" = max_recharge_rate, + "max_charge" = max_charge, + "observer" = isobserver(user) && !isAdminGhostAI(user) + ) + +/obj/machinery/power/cloak/ui_act(action, list/params) + . = ..() + + if(!isliving(usr)) + return + + switch(action) + if("toggle_cloak") + set_cloak(!cloak_active) + return TRUE + if("set_charge_rate") + var/new_charge_rate = params["target"] + if(!isnum(new_charge_rate)) + return FALSE + recharge_rate = clamp(new_charge_rate, 0, max_recharge_rate) + return TRUE + +/obj/machinery/power/cloak/RefreshParts() + . = ..() + max_charge = 0 + current_charge = 0 + max_recharge_rate = 0 + for(var/obj/item/stock_parts/cell/cell in component_parts) + max_charge += cell.maxcharge / GLOB.CELLRATE + current_charge += cell.charge / GLOB.CELLRATE + for(var/obj/item/stock_parts/capacitor/capacitor in component_parts) + max_recharge_rate += capacitor.rating * BASE_RECHARGE_RATE / GLOB.CELLRATE + recharge_rate = clamp(recharge_rate, 0, max_recharge_rate) + update_static_data_for_all_viewers() + +/obj/machinery/power/cloak/exchange_parts(mob/user, obj/item/storage/part_replacer/replacer) + for(var/obj/item/stock_parts/cell/cell in component_parts) + cell.charge = (current_charge / max_charge) * cell.maxcharge + return ..() + +/obj/machinery/power/cloak/on_deconstruction() + for(var/obj/item/stock_parts/cell/cell in component_parts) + cell.charge = (current_charge / max_charge) * cell.maxcharge + +/obj/machinery/power/cloak/attack_hand_secondary(mob/user, list/modifiers) + set_cloak(!cloak_active) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/machinery/power/cloak/screwdriver_act(mob/living/user, obj/item/tool, list/modifiers) + if(flags_1 & NODECONSTRUCT_1) + return FALSE + if(cloak_active) + balloon_alert(user, "turn it off!") + return TRUE + panel_open = !panel_open + tool.play_tool_sound(src, 50) + update_appearance(UPDATE_ICON_STATE) + return TRUE + +/obj/machinery/power/cloak/crowbar_act(mob/living/user, obj/item/tool, list/modifiers) + default_deconstruction_crowbar(tool) + return TRUE + +/obj/machinery/power/cloak/multitool_act(mob/living/user, obj/item/multitool/tool, list/modifiers) + if(istype(tool, /obj/item/multitool)) + tool.buffer = WEAKREF(src) + balloon_alert(user, "saved to buffer") + return TRUE + +/obj/machinery/power/cloak/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock) + . = ..() + if(port.current_ship.ship_modules[SHIPMODULE_CLOAKING]) + return + link_to_ship(port.current_ship, port) + +/obj/machinery/power/cloak/proc/link_to_ship(datum/overmap/ship/controlled/new_ship, obj/docking_port/mobile/new_port) + new_port ||= new_ship.shuttle_port + linked_ship = new_ship + linked_ship.ship_modules[SHIPMODULE_CLOAKING] = src + active_power_usage = new_port.turf_count * power_multiplier * WATTS_PER_TURF + update_appearance(UPDATE_ICON_STATE) + update_static_data_for_all_viewers() + for(var/obj/console as anything in linked_ship.helms) + console.update_static_data_for_all_viewers() + +/obj/machinery/power/cloak/proc/unlink_from_ship() + set_cloak(FALSE) + active_power_usage = 0 + linked_ship.ship_modules[SHIPMODULE_CLOAKING] = null + linked_ship = null + update_appearance(UPDATE_ICON_STATE) + +/obj/machinery/power/cloak/update_icon_state() + . = ..() + if(panel_open) + icon_state = "[base_icon_state]_t" + else if(!linked_ship) + icon_state = "[base_icon_state]_off" + else + icon_state = "[base_icon_state]_[cloak_active ? "on" : "idle"]" + +/obj/machinery/power/cloak/proc/set_cloak(new_state, mob/user) + if(new_state == cloak_active) + return FALSE + if(!linked_ship) + if(!new_state) + cloak_active = FALSE + if(user) + balloon_alert(user, "no linked ship!") + return FALSE + if(new_state && current_charge < active_power_usage) + if(user) + balloon_alert(user, "insufficient power!") + return FALSE + cloak_active = new_state + + var/cloak_sound + if(cloak_active) + cloak_sound = 'sound/vehicles/cloak_activate.ogg' + for(var/trait in cloak_traits) + ADD_TRAIT(linked_ship, trait, SHIPMODULE_CLOAKING) + else + cloak_sound = 'sound/vehicles/cloak_deactivate.ogg' + for(var/trait in cloak_traits) + REMOVE_TRAIT(linked_ship, trait, SHIPMODULE_CLOAKING) + + var/turf/own_turf = get_turf(src) + var/source_z = "[own_turf.virtual_z]" + var/list/listeners = (LAZYACCESS(SSmobs.players_by_virtual_z, source_z) || list()) | (LAZYACCESS(SSmobs.dead_players_by_virtual_z, source_z) || list()) + for(var/mob/listener as anything in listeners) + listener.playsound_local(listener, cloak_sound, 50, FALSE, pressure_affected = FALSE) + + play_click_sound("switch") + update_appearance(UPDATE_ICON_STATE) + return TRUE + +/obj/machinery/power/cloak/process(seconds_per_tick) + if(!powernet) + connect_to_network() + + if(current_charge < max_charge && recharge_rate > 0) + var/delta_power = min(max_charge - current_charge, recharge_rate, surplus()) + current_charge += delta_power + add_load(delta_power) + if(!cloak_active) + return + + var/power_consumption = active_power_usage + if(current_charge < power_consumption) + current_charge = 0 + balloon_alert_to_viewers("out of power!") + set_cloak(FALSE) + return + current_charge -= power_consumption + +/obj/machinery/power/cloak/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + if(cloak_active) + visible_message("[src] ") + tesla_zap(src, 5, active_power_usage / 10, ZAP_DEFAULT_FLAGS) + set_cloak(FALSE) + +/obj/machinery/power/cloak/advanced + name = "\improper BFRD-3A cloaking device" + desc = "A bluespace-field radar deflector, capable of cloaking ships at a low enough power cost to be practical. " + power_multiplier = 0.5 + circuit = /obj/item/circuitboard/machine/advanced_cloak + cloak_traits = list(TRAIT_BLUESPACE_SHIFT, TRAIT_CLOAKED) + +#undef BASE_RECHARGE_RATE +#undef WATTS_PER_TURF diff --git a/code/modules/projectiles/ammunition/ballistic/lmg.dm b/code/modules/projectiles/ammunition/ballistic/lmg.dm deleted file mode 100644 index d716618b0d6..00000000000 --- a/code/modules/projectiles/ammunition/ballistic/lmg.dm +++ /dev/null @@ -1,26 +0,0 @@ -// 7.12x82mm (L6 SAW) - -/obj/item/ammo_casing/mm712x82 - name = "7.12x82mm bullet casing" - desc = "A 7.12x82mm bullet casing." - icon_state = "rifle-steel" - caliber = "7.12x82mm" - projectile_type = /obj/projectile/bullet/mm712x82 - -/obj/item/ammo_casing/mm712x82/ap - name = "7.12x82mm armor-piercing bullet casing" - desc = "A 7.12x82mm armor-piercing bullet casing." - projectile_type = /obj/projectile/bullet/mm712x82/ap - bullet_skin = "ap" - -/obj/item/ammo_casing/mm712x82/hp - name = "7.12x82mm hollow point bullet casing" - desc = "A 7.12x82mm hollow point bullet casing." - projectile_type = /obj/projectile/bullet/mm712x82/hp - bullet_skin = "hollow" - -/obj/item/ammo_casing/mm712x82/match - name = "7.12x82mm match bullet casing" - desc = "A 7.12x82mm match bullet casing." - projectile_type = /obj/projectile/bullet/mm712x82/match - bullet_skin = "rubber" diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm index 1b8c0c2183d..a3e52ec9428 100644 --- a/code/modules/projectiles/ammunition/ballistic/revolver.dm +++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm @@ -6,6 +6,7 @@ caliber = ".357" icon_state = "magnum-brass" projectile_type = /obj/projectile/bullet/a357 + stack_size = 12 /obj/item/ammo_casing/a357/match name = ".357 match bullet casing" @@ -123,6 +124,7 @@ caliber = ".44 Roumain" icon_state = "pistol-steel" projectile_type = /obj/projectile/bullet/a44roum + stack_size = 12 /obj/item/ammo_casing/a44roum/rubber name = ".44 roumain rubber bullet casing" diff --git a/code/modules/projectiles/ammunition/ballistic/smg.dm b/code/modules/projectiles/ammunition/ballistic/smg.dm index c255fe85c29..e25b751c302 100644 --- a/code/modules/projectiles/ammunition/ballistic/smg.dm +++ b/code/modules/projectiles/ammunition/ballistic/smg.dm @@ -6,6 +6,7 @@ icon_state = "rifle-steel" caliber = "5.7x39mm" projectile_type = /obj/projectile/bullet/c57x39mm + stack_size = 20 /obj/item/ammo_casing/c57x39mm/ap name = "5.7x39mm armor piercing bullet casing" @@ -33,7 +34,7 @@ icon_state = "rifle-brass" caliber = "4.6x30mm" projectile_type = /obj/projectile/bullet/c46x30mm - stack_size = 15 + stack_size = 20 /obj/item/ammo_casing/c46x30mm/recycled name = "4.6x30mm recycled bullet casing" @@ -76,6 +77,7 @@ icon_state = "caseless" caliber = "4.73x33mm caseless" projectile_type = /obj/projectile/bullet/c47x33mm + stack_size = 12 // 5.56mm HITP caseless (Pistole C) diff --git a/code/modules/projectiles/ammunition/ballistic/sniper.dm b/code/modules/projectiles/ammunition/ballistic/sniper.dm index e2094ba8a3f..62be8e4bd98 100644 --- a/code/modules/projectiles/ammunition/ballistic/sniper.dm +++ b/code/modules/projectiles/ammunition/ballistic/sniper.dm @@ -6,6 +6,7 @@ icon_state = "big-steel" caliber = ".50 BMG" projectile_type = /obj/projectile/bullet/p50 + stack_size = 5 /obj/item/ammo_casing/p50/soporific name = ".50 BMG soporific bullet casing" @@ -28,7 +29,7 @@ icon_state = "rifle-steel" caliber = "a300" projectile_type = /obj/projectile/bullet/a300 - stack_size = 15 + stack_size = 5 /obj/item/ammo_casing/a300/trac name = ".300 Magnum Trac bullet casing" diff --git a/code/modules/projectiles/ammunition/energy/plasma.dm b/code/modules/projectiles/ammunition/energy/plasma.dm index d593086157f..05cd02c52d0 100644 --- a/code/modules/projectiles/ammunition/energy/plasma.dm +++ b/code/modules/projectiles/ammunition/energy/plasma.dm @@ -1,7 +1,7 @@ /obj/item/ammo_casing/energy/plasma projectile_type = /obj/projectile/plasma select_name = "plasma burst" - fire_sound = 'sound/weapons/plasma_cutter.ogg' + fire_sound = 'sound/weapons/melee/plasmacutter/plasma_cutter.ogg' delay = 30 e_cost = 100 diff --git a/code/modules/projectiles/ammunition/special/gauss.dm b/code/modules/projectiles/ammunition/special/gauss.dm index be8b6ad18d1..68b7af8c543 100644 --- a/code/modules/projectiles/ammunition/special/gauss.dm +++ b/code/modules/projectiles/ammunition/special/gauss.dm @@ -6,6 +6,7 @@ projectile_type = /obj/projectile/bullet/gauss auto_rotate = FALSE firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/gauss + stack_size = 22 var/energy_cost = 100 /obj/item/ammo_casing/caseless/gauss/hc @@ -26,6 +27,7 @@ projectile_type = /obj/projectile/bullet/gauss/lance auto_rotate = TRUE energy_cost = 155 + stack_size = 16 /obj/item/ammo_casing/caseless/gauss/lance/hc name = "high conductivity lance" @@ -45,6 +47,7 @@ projectile_type = /obj/projectile/bullet/gauss/slug auto_rotate = TRUE energy_cost = 700 + stack_size = 10 /obj/item/ammo_casing/caseless/gauss/slug/hc name = "high conductivity slug" diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index 3cd86e94310..07771485660 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -18,7 +18,7 @@ ///list containing the actual ammo within the magazine var/list/stored_ammo = list() ///type that the magazine will be searching for, rejects if not a subtype of - var/ammo_type = /obj/item/ammo_casing + var/obj/item/ammo_casing/ammo_type = /obj/item/ammo_casing ///maximum amount of ammo in the magazine var/max_ammo = 7 ///Controls how sprites are updated for the ammo box; see defines in combat.dm: AMMO_BOX_ONE_SPRITE; AMMO_BOX_PER_BULLET; AMMO_BOX_FULL_EMPTY @@ -236,7 +236,26 @@ bullet2pop.fire_act() /obj/item/ammo_box/magazine - w_class = WEIGHT_CLASS_SMALL //Default magazine weight, only differs for tiny mags and drums + //Default magazine weight, only differs for tiny mags and drums + w_class = WEIGHT_CLASS_SMALL + ///if this magazine can be quickly emptied with an alt-click + var/quick_empty = TRUE + +/obj/item/ammo_box/magazine/examine(mob/user) + . = ..() + if(quick_empty) + . += span_notice("You can Alt-Click [src] to quickly empty the entire magazine") + +/obj/item/ammo_box/magazine/AltClick(mob/user) + . = ..() + if(quick_empty) + if(do_after(user, 20, src)) + playsound(src, 'sound/weapons/gun/smg/uzi_unload.ogg', 50) + empty_magazine() + to_chat(user, "You unload [src]") + return + + ///Count of number of bullets in the magazine /obj/item/ammo_box/magazine/proc/ammo_count(countempties = TRUE) diff --git a/code/modules/projectiles/boxes_magazines/ammo_loaders.dm b/code/modules/projectiles/boxes_magazines/ammo_loaders.dm index 90efc570739..fc0b1f0260a 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_loaders.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_loaders.dm @@ -127,6 +127,24 @@ /obj/item/ammo_box/a300/empty start_empty = TRUE +// .45-70 Stripper Clip + +/obj/item/ammo_box/a4570 + name = "stripper clip (.45-70)" + desc = "A 5-round stripper clip for the Pyre Rifle. These rounds do devastating damage with average armor penetration." + icon_state = "850-5" + base_icon_state = "850" + ammo_type = /obj/item/ammo_casing/a4570 + caliber = ".45-70" + max_ammo = 5 + multiple_sprites = AMMO_BOX_PER_BULLET + w_class = WEIGHT_CLASS_TINY + instant_load = TRUE + custom_materials = list(/datum/material/iron = 500) + +/obj/item/ammo_box/a4570/empty + start_empty = TRUE + // .300 Blackout Stripper Clip /obj/item/ammo_box/a762_stripper diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/_ammo_stack.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/_ammo_stack.dm index f1e84780cb1..3e7f0323ca0 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_stacks/_ammo_stack.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/_ammo_stack.dm @@ -3,6 +3,7 @@ * Practically every casing type needs an associated ammo stack type, because that was the easiest * way for me to handle it. */ +//and because it was the easiest way now we have more gun jank :( /obj/item/ammo_box/magazine/ammo_stack name = "ammo stack" desc = "A pile of live rounds." @@ -14,6 +15,7 @@ multiload = FALSE start_empty = TRUE max_ammo = 12 + quick_empty = FALSE /obj/item/ammo_box/magazine/ammo_stack/update_icon(updates) icon = initial(icon) diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/_premade_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/_premade_stacks.dm index ae797547c85..1f0af31d088 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/_premade_stacks.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/_premade_stacks.dm @@ -1,6 +1,5 @@ /obj/item/ammo_box/magazine/ammo_stack/prefilled var/load_override //if we want the stack to spawn with a certain amount of ammo for whatever reason - var/obj/item/ammo_casing/set_ammo /obj/item/ammo_box/magazine/ammo_stack/prefilled/Initialize(mapload, amt, to_copy) if(amt) diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_lmg_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_lmg_stacks.dm deleted file mode 100644 index 4b50912e5e1..00000000000 --- a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_lmg_stacks.dm +++ /dev/null @@ -1,12 +0,0 @@ -// 7.12x82mm (L6 SAW) -/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82 - ammo_type = /obj/item/ammo_casing/mm712x82 - -/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82/ap - ammo_type = /obj/item/ammo_casing/mm712x82/ap - -/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82/hp - ammo_type = /obj/item/ammo_casing/mm712x82/hp - -/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82/match - ammo_type = /obj/item/ammo_casing/mm712x82/match diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_misc_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_misc_stacks.dm index 871c25d84af..cbdd48ee1c9 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_misc_stacks.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_misc_stacks.dm @@ -1,5 +1,6 @@ /obj/item/ammo_box/magazine/ammo_stack/prefilled/foam_darts ammo_type = /obj/item/ammo_casing/caseless/foam_dart + max_ammo = 15 /obj/item/storage/box/ammo/foam_darts name = "box of foam darts" diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_pistol_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_pistol_stacks.dm index 85d88058236..d4a902b642e 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_pistol_stacks.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_pistol_stacks.dm @@ -2,6 +2,7 @@ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm ammo_type = /obj/item/ammo_casing/c10mm + max_ammo = 15 /obj/item/storage/box/ammo/c10mm name = "box of 10x22mm ammo" @@ -441,6 +442,7 @@ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum ammo_type = /obj/item/ammo_casing/a44roum + max_ammo = 12 /obj/item/storage/box/ammo/a44roum name = "box of .44 roumain ammo" diff --git a/code/modules/projectiles/boxes_magazines/external/lmg.dm b/code/modules/projectiles/boxes_magazines/external/lmg.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm index 00e40c05bf8..01a71f4aeab 100644 --- a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm +++ b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm @@ -4,6 +4,7 @@ caliber = ".357" max_ammo = 6 instant_load = TRUE + quick_empty = FALSE /obj/item/ammo_box/magazine/internal/cylinder/get_round(keep = FALSE, counter_clockwise = FALSE) rotate(counter_clockwise) diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm index bd8418c85d5..6f8fc19e42c 100644 --- a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm +++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm @@ -54,6 +54,13 @@ caliber = "12ga" max_ammo = 5 +/obj/item/ammo_box/magazine/internal/shot/winchester/pyre + name = "pyre internal magazine" + ammo_type = /obj/item/ammo_casing/a4570 + caliber = ".45-70" + max_ammo = 5 + instant_load = TRUE + /obj/item/ammo_box/magazine/internal/shot/beacon name = "beacon internal magazine" ammo_type = /obj/item/ammo_casing/a4570 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 15ae36373f1..b9094b0bd9d 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -758,20 +758,27 @@ if(isliving(user) && in_range(src, user)) toggle_safety(user) -// /obj/item/gun/attack_hand_secondary(mob/user, list/modifiers) -// if(toggle_safety(user)) -// return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -// return ..() +// This is overridden when interacting with attached underbarrel guns. +/obj/item/gun/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + if(toggle_safety(user)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -// /obj/item/gun/attackby_secondary(obj/item/weapon, mob/user, params) -// if(toggle_safety(user)) -// return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -// return ..() +/obj/item/gun/attackby_secondary(obj/item/weapon, mob/user, params) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + if(toggle_safety(user)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -// /obj/item/gun/attack_self_secondary(mob/user, modifiers) -// if(toggle_safety(user)) -// return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -// return ..() +/obj/item/gun/attack_self_secondary(mob/user, modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + if(toggle_safety(user)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/item/gun/proc/toggle_safety(mob/user, silent=FALSE, override_check = FALSE) if(!has_safety) @@ -1194,9 +1201,10 @@ return ..() GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( - /obj/item/gun/energy/plasmacutter, + /obj/item/plasmacutter, /obj/item/melee/energy, /obj/item/gear_handle/anglegrinder, + /obj/item/hatchet, ))) ///Handles all the logic of sawing off guns, diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 9c92e94e990..0d6691aa312 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -126,112 +126,6 @@ ammo_type = list(/obj/item/ammo_casing/energy/bolt/large) manufacturer = MANUFACTURER_NONE - -/obj/item/gun/energy/plasmacutter - name = "plasma cutter" - desc = "An engineering tool capable of expelling concentrated plasma bursts. You could use it to cut limbs off xenos! Or, you know, cut through walls." - icon_state = "plasmacutter" - item_state = "plasmacutter" - ammo_type = list(/obj/item/ammo_casing/energy/plasma) - flags_1 = CONDUCT_1 - attack_verb = list("attacked", "slashed", "cut", "sliced") - force = 12 - sharpness = SHARP_EDGED - can_charge = FALSE - - heat = 3800 - usesound = list('sound/items/welder.ogg', 'sound/items/welder2.ogg') - tool_behaviour = TOOL_DECONSTRUCT - wall_decon_damage = 200 - toolspeed = 1 //plasmacutters can be used like angle grinders - internal_magazine = TRUE //so you don't cheese through the need for plasma - WS EDIT - var/charge_cut = 100 //amount of charge used up to start action (multiplied by amount) and per progress_flash_divisor ticks of cutting - var/adv = FALSE - -/obj/item/gun/energy/plasmacutter/ComponentInitialize() - . = ..() - AddComponent(/datum/component/butchering, 25, 105, 0, 'sound/weapons/plasma_cutter.ogg') - AddElement(/datum/element/update_icon_blocker) - AddElement(/datum/element/tool_flash, 1) - -/obj/item/gun/energy/plasmacutter/examine(mob/user) - . = ..() - if(cell) - . += span_notice("[src] is [round(cell.percent())]% charged.") - -/obj/item/gun/energy/plasmacutter/attackby(obj/item/I, mob/user) - var/charge_multiplier = 0 //2 = Refined stack, 1 = Ore - if(istype(I, /obj/item/stack/sheet/mineral/plasma)) - charge_multiplier = 2 - if(istype(I, /obj/item/stack/ore/plasma)) - charge_multiplier = 1 - if(charge_multiplier) - if(cell.charge == cell.maxcharge) - to_chat(user, span_notice("You try to insert [I] into [src], but it's fully charged.")) //my cell is round and full - return - I.use(1) - cell.give(500*charge_multiplier) - to_chat(user, span_notice("You insert [I] in [src], recharging it.")) - else - ..() - -// Can we cut? Plasma cutter does not use charge continuously. -// Amount cannot be defaulted to 1: most of the code specifies 0 in the call. -/obj/item/gun/energy/plasmacutter/tool_use_check(mob/living/user, atom/target, amount) - if(QDELETED(cell)) - to_chat(user, span_warning("[src] does not have a cell, and cannot be used!")) - return FALSE - // Amount cannot be used if drain is made continuous, e.g. amount = 5, charge_cut = 25 - // Then it'll drain 125 at first and 25 periodically, but fail if charge dips below 125 even though it still can finish action - // Alternately it'll need to drain amount*charge_cut every period, which is either obscene or makes it free for other uses - if(amount ? cell.charge < charge_cut * amount : cell.charge < charge_cut) - to_chat(user, span_warning("You need more charge to complete this task!")) - return FALSE - - return TRUE - -/obj/item/gun/energy/plasmacutter/attack(mob/living/carbon/human/target, mob/user) - if(!istype(target)) - return ..() - var/obj/item/bodypart/attackedLimb = target.get_bodypart(check_zone(user.zone_selected)) - if(!attackedLimb || IS_ORGANIC_LIMB(attackedLimb) || (user.a_intent == INTENT_HARM)) - return ..() - if(!target.is_exposed(user, TRUE, user.zone_selected)) - return TRUE - if(!tool_start_check(user, amount = 1)) - return TRUE - user.visible_message(span_notice("[user] starts to fix some of the dents on [target]'s [parse_zone(attackedLimb.body_zone)]."), - span_notice("You start fixing some of the dents on [target == user ? "your" : "[target]'s"] [parse_zone(attackedLimb.body_zone)].")) - if(!use_tool(target, user, delay = (target == user ? 5 SECONDS : 0.5 SECONDS), amount = 1, volume = 25)) - return TRUE - item_heal_robotic(target, user, brute_heal = 15, burn_heal = 0) - return TRUE - -/obj/item/gun/energy/plasmacutter/use(amount) - return (!QDELETED(cell) && cell.use(amount ? amount * charge_cut : charge_cut)) - -/obj/item/gun/energy/plasmacutter/use_tool(atom/target, mob/living/user, delay, amount=1, volume=0, datum/callback/extra_checks) - if(amount) - if(adv) - target.add_overlay(GLOB.advanced_cutting_effect) - else - target.add_overlay(GLOB.cutting_effect) - . = ..() - if(adv) - target.cut_overlay(GLOB.advanced_cutting_effect) - else - target.cut_overlay(GLOB.cutting_effect) - else - . = ..(amount=1) - -/obj/item/gun/energy/plasmacutter/adv - name = "advanced plasma cutter" - icon_state = "adv_plasmacutter" - item_state = "adv_plasmacutter" - force = 15 - wall_decon_damage = 300 - ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv) - /obj/item/gun/energy/wormhole_projector name = "bluespace wormhole projector" desc = "A projector that emits high density quantum-coupled bluespace beams." //WS Edit - Any anomaly core for phazons diff --git a/code/modules/projectiles/guns/manufacturer/clip_lanchester/ballistics.dm b/code/modules/projectiles/guns/manufacturer/clip_lanchester/ballistics.dm index 2ca35d90cac..a818f5dd82c 100644 --- a/code/modules/projectiles/guns/manufacturer/clip_lanchester/ballistics.dm +++ b/code/modules/projectiles/guns/manufacturer/clip_lanchester/ballistics.dm @@ -637,6 +637,7 @@ NO_MAG_GUN_HELPER(automatic/assault/skm/cm24) base_icon_state = "cm40_mag" icon_state = "cm40_mag-1" ammo_type = /obj/item/ammo_casing/a762_40 + caliber = "7.62x40mm" max_ammo = 80 w_class = WEIGHT_CLASS_NORMAL diff --git a/code/modules/projectiles/guns/manufacturer/hunter_pride/ballistics.dm b/code/modules/projectiles/guns/manufacturer/hunter_pride/ballistics.dm index 0c58a2bbb76..b1fdcd28b82 100644 --- a/code/modules/projectiles/guns/manufacturer/hunter_pride/ballistics.dm +++ b/code/modules/projectiles/guns/manufacturer/hunter_pride/ballistics.dm @@ -974,6 +974,58 @@ EMPTY_GUN_HELPER(shotgun/flamingarrow/bolt) item_state = "absolution_factory_sawn" mob_overlay_state = item_state +/obj/item/gun/ballistic/shotgun/flamingarrow/pyre + name = "HP Pyre" + base_icon_state = "pyre" + icon_state = "pyre" + item_state = "pyre" + fire_sound = 'sound/weapons/gun/revolver/shot_hunting.ogg' + desc = "A powerful lever-action rifle with hand-stamped Hunter's Pride marks on the receiver and an 5 round ammunition capacity. Bulky and unwieldy but devastatingly powerful. Chambered in .45-70." + default_ammo_type = /obj/item/ammo_box/magazine/internal/shot/winchester/pyre + allowed_ammo_types = list( + /obj/item/ammo_box/magazine/internal/shot/winchester/pyre, + ) + fire_delay = 0.8 SECONDS + wield_slowdown = HEAVY_RIFLE_SLOWDOWN + wield_delay = 1 SECONDS + spread_unwielded = 15 + spread = 0 + recoil = 1.5 + recoil_unwielded = 4 + gunslinger_recoil_bonus = 0 + + slot_available = list( + ATTACHMENT_SLOT_MUZZLE = 1, + ATTACHMENT_SLOT_SCOPE = 1 + ) + + + valid_attachments = list( + /obj/item/attachment/silencer, + /obj/item/attachment/bayonet + ) + unique_attachments = list(/obj/item/attachment/scope) + slot_offsets = list( + ATTACHMENT_SLOT_MUZZLE = list( + "x" = 48, + "y" = 19, + ), + ATTACHMENT_SLOT_SCOPE = list( + "x" = 25, + "y" = 21, + ) + ) + + can_be_sawn_off = FALSE + +EMPTY_GUN_HELPER(shotgun/flamingarrow/pyre) + +/obj/item/gun/ballistic/shotgun/flamingarrow/pyre/factory + base_icon_state = "pyre_factory" + icon_state = "pyre_factory" + item_state = "pyre_factory" + desc = "A powerful lever-action rifle with hand-stamped Hunter's Pride marks on the receiver and an 5 round ammunition capacity, in pristine wood furniture lined with brass. Bulky and unwieldy but devastatingly powerful. Chambered in .45-70." + //Break-Action Rifle /obj/item/gun/ballistic/shotgun/doublebarrel/beacon name = "HP Beacon" diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 755a45d983e..f3c283e5238 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -103,7 +103,7 @@ var/ricochet_auto_aim_angle = 30 /// the angle of impact must be within this many degrees of the struck surface, set to 0 to allow any angle var/ricochet_incidence_leeway = 40 - /// accuracy modifier. Used as a multiplier + /// accuracy modifier. Used as a multiplier when calculating which body part is hit on a living target var/accuracy_mod = 1 ///If the object being hit can pass ths damage on to something else, it should not do it for this bullet diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index f7cb1754a80..5ea9d807dc7 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -281,7 +281,7 @@ icon_state = "u_laser" damage = 40 bullet_identifier = "pulse" - wall_damage_flags = PROJECTILE_BONUS_DAMAGE_MINERALS | PROJECTILE_BONUS_DAMAGE_WALLS | PROJECTILE_BONUS_DAMAGE_WALLS + wall_damage_flags = PROJECTILE_BONUS_DAMAGE_MINERALS | PROJECTILE_BONUS_DAMAGE_WALLS | PROJECTILE_BONUS_DAMAGE_RWALLS wall_damage_override = 200 impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_BLUE diff --git a/code/modules/projectiles/projectile/bullets/lmg.dm b/code/modules/projectiles/projectile/bullets/lmg.dm index 2ae19e7ca32..57288308346 100644 --- a/code/modules/projectiles/projectile/bullets/lmg.dm +++ b/code/modules/projectiles/projectile/bullets/lmg.dm @@ -72,32 +72,3 @@ /obj/projectile/bullet/syndicate_turret damage = 20 armour_penetration = 20 - -// 7.12x82mm (L6 SAW) - -/obj/projectile/bullet/mm712x82 - name = "7.12x82mm bullet" - damage = 25 - armour_penetration = 40 - speed = BULLET_SPEED_RIFLE - bullet_identifier = "large bullet" - -/obj/projectile/bullet/mm712x82/ap - name = "7.12x82mm armor-piercing bullet" - armour_penetration = 75 - speed_mod = BULLET_SPEED_AP_MOD - -/obj/projectile/bullet/mm712x82/hp - name = "7.12x82mm hollow point bullet" - damage = 40 - armour_penetration = -20 - speed_mod = BULLET_SPEED_HP_MOD - -/obj/projectile/bullet/mm712x82/match - name = "7.12x82mm match bullet" - armour_penetration = 50 - ricochets_max = 2 - ricochet_chance = 60 - ricochet_auto_aim_range = 4 - ricochet_incidence_leeway = 35 - speed_mod = BULLET_SPEED_HP_MOD diff --git a/code/modules/projectiles/projectile/special/plasma.dm b/code/modules/projectiles/projectile/special/plasma.dm index 68071bd2c55..03e26360890 100644 --- a/code/modules/projectiles/projectile/special/plasma.dm +++ b/code/modules/projectiles/projectile/special/plasma.dm @@ -2,28 +2,28 @@ name = "plasma blast" icon_state = "plasmacutter" damage_type = BURN - damage = 15 + damage = 25 + armour_penetration = -20 range = 4 dismemberment = 10 - /// chance that the plasmablast ruins the ore - var/slag_chance = 33 + wall_damage_flags = PROJECTILE_BONUS_DAMAGE_MINERALS | PROJECTILE_BONUS_DAMAGE_WALLS | PROJECTILE_BONUS_DAMAGE_RWALLS + wall_damage_override = 150 impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser tracer_type = /obj/effect/projectile/tracer/plasma_cutter muzzle_type = /obj/effect/projectile/muzzle/plasma_cutter impact_type = /obj/effect/projectile/impact/plasma_cutter + hitscan = TRUE + +/obj/projectile/plasma/on_hit(atom/target, blocked = 0) + if(isobj(target) && (blocked != 100)) + var/obj/O = target + O.take_damage(80, BRUTE, "bullet", FALSE) + return ..() /obj/projectile/plasma/adv - damage = 7 + damage = 30 range = 5 - slag_chance = 20 /obj/projectile/plasma/adv/mech damage = 10 range = 9 - -/obj/projectile/plasma/turret - //Between normal and advanced for damage, made a beam so not the turret does not destroy glass - name = "plasma beam" - damage = 24 - range = 7 - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index a9c14cd0864..45207685342 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -237,18 +237,13 @@ holdingitems -= O qdel(O) -/obj/machinery/reagentgrinder/proc/shake_for(duration) - var/offset = prob(50) ? -2 : 2 - var/old_pixel_x = pixel_x - animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = -1) //start shaking - addtimer(CALLBACK(src, PROC_REF(stop_shaking), old_pixel_x), duration) - /obj/machinery/reagentgrinder/proc/stop_shaking(old_px) animate(src) pixel_x = old_px /obj/machinery/reagentgrinder/proc/operate_for(time, silent = FALSE, juicing = FALSE) - shake_for(time / speed) + var/duration = time / speed + Shake(pixelshiftx = 1, pixelshifty = 0, duration = duration) operating = TRUE if(!silent) if(!juicing) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents/mixed_drinks.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents/mixed_drinks.dm index da591989248..80afdaa8da8 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents/mixed_drinks.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents/mixed_drinks.dm @@ -41,7 +41,7 @@ overdose_threshold = 60 addiction_threshold = 30 taste_description = "oily syrup" - glass_icon_state = "vimukti_glass" + glass_icon_state = "thirteen_loko_glass" glass_name = "glass of Vimukti" glass_desc = "A spiritually-taxing drink from the Shoal. Numerous warnings about this drink tell you to not drink too much, lest you incur some sort of wrath... or an overdose of a psychoactive lichen." diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 1ca1f915a5c..69e3676fdba 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -11,7 +11,7 @@ /datum/reagent/drug/space_drugs name = "Dropsight" - description = "An illegal chemical compound used as drug." + description = "An illegal hallucinogenic chemical compound used as drug." color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 30 @@ -742,3 +742,78 @@ M.apply_status_effect(/datum/status_effect/stagger) M.set_timed_status_effect(20 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) ..() + +/datum/reagent/drug/cytodron + name = "Reflex-Cytodron" + description = "A popular trade in the Confederated League - although barely legal, Reflex-Cytodron is a chemical that aids in reception of neural impulses at extremities of the body, allowing someone to faster and more precise." + reagent_state = SOLID + color = "#5a360e" + overdose_threshold = 20 + addiction_threshold = 17 + metabolization_rate = 0.1 + taste_description = "pharmacokinetics" + +/datum/reagent/drug/cytodron/on_mob_metabolize(mob/living/L) + ..() + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "tweaking", /datum/mood_event/stimulant_light, name) + L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/cytodron) + if(ishuman(L)) + var/mob/living/carbon/human/drugged = L + drugged.physiology.do_after_speed -= 0.1 + +/datum/reagent/drug/cytodron/on_mob_end_metabolize(mob/living/L) + ..() + L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/cytodron) + if(ishuman(L)) + var/mob/living/carbon/human/drugged = L + drugged.physiology.do_after_speed += 0.1 + +/datum/reagent/drug/cytodron/overdose_start(mob/living/M) + . = ..() + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "tweaking", /datum/mood_event/stimulant_bad, name) + M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/cytodron) + +/datum/reagent/drug/cytodron/overdose_process(mob/living/M) + . = ..() + if(prob(10)) + M.drop_all_held_items() + if(prob(40)) + M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + +/datum/reagent/drug/sting + name = "Sting" + description = "A Sybelnatch-originating 'attention-aide' devised for usage in educational and research setting. Focuses the mind on the task at hand." + reagent_state = GAS + color = "#5a360e" + overdose_threshold = 16 + addiction_threshold = 15 + metabolization_rate = 0.2 + taste_description = "a jolt of pain" + +/datum/reagent/drug/sting/on_mob_metabolize(mob/living/L) + ..() + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "tweaking", /datum/mood_event/stimulant_medium, name) + ADD_TRAIT(L, TRAIT_SENSITIVE_TONGUE, type) + ADD_TRAIT(L, TRAIT_PINPOINT_EYES, type) + if(ishuman(L)) + var/mob/living/carbon/human/drugged = L + drugged.physiology.do_after_speed -= 0.2 + +/datum/reagent/drug/sting/on_mob_end_metabolize(mob/living/L) + ..() + REMOVE_TRAIT(L, TRAIT_SENSITIVE_TONGUE, type) + REMOVE_TRAIT(L, TRAIT_PINPOINT_EYES, type) + if(ishuman(L)) + var/mob/living/carbon/human/drugged = L + drugged.physiology.do_after_speed += 0.2 + +/datum/reagent/drug/cytodron/overdose_start(mob/living/M) + . = ..() + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "tweaking", /datum/mood_event/headache, name) + +/datum/reagent/drug/sting/overdose_process(mob/living/M) + . = ..() + if(prob(30)) + M.blur_eyes(rand(5,12)) + if(prob(5)) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1) diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/flora_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/flora_reagents.dm index ea6755e5b5e..2a7483850c9 100644 --- a/code/modules/reagents/chemistry/reagents/medical_reagents/flora_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medical_reagents/flora_reagents.dm @@ -21,7 +21,7 @@ return var/mob/living/carbon/human/blood_boy = M - blood_boy.physiology?.bleed_mod /= passive_bleed_modifier + blood_boy.physiology?.bleed_mod *= passive_bleed_modifier return ..() /datum/reagent/medicine/polypyr/on_mob_end_metabolize(mob/living/M) diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/ipc_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/ipc_reagents.dm index 06fe6fdd906..76f368956d9 100644 --- a/code/modules/reagents/chemistry/reagents/medical_reagents/ipc_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medical_reagents/ipc_reagents.dm @@ -2,15 +2,16 @@ ** for some reason */ -/datum/reagent/medicine/system_cleaner +/datum/reagent/space_cleaner/system_cleaner name = "System Cleaner" description = "Neutralizes harmful chemical compounds inside synthetic systems." reagent_state = LIQUID color = "#F1C40F" metabolization_rate = 0.5 * REAGENTS_METABOLISM process_flags = SYNTHETIC + robot_clean_power = 10 -/datum/reagent/medicine/system_cleaner/on_mob_life(mob/living/M) +/datum/reagent/space_cleaner/system_cleaner/on_mob_life(mob/living/M) M.adjustToxLoss(-2*REM, 0) . = 1 for(var/datum/reagent/R in M.reagents.reagent_list) diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/medicine_reagents.dm index 96a420d9d9c..887d5ced8ff 100644 --- a/code/modules/reagents/chemistry/reagents/medical_reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medical_reagents/medicine_reagents.dm @@ -57,7 +57,7 @@ if(prob(5)) var/obj/item/bodypart/open_sore = victim.get_random_bodypart() if(IS_ORGANIC_LIMB(open_sore)) - open_sore.force_wound_upwards(/datum/wound/slash/moderate) + open_sore.force_wound_upwards(/datum/wound/slash/flesh/moderate) M.emote("gasps") /datum/reagent/medicine/indomide/on_mob_end_metabolize(mob/living/L) diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/wound_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/wound_reagents.dm index fa644a7a25d..14da07350a8 100644 --- a/code/modules/reagents/chemistry/reagents/medical_reagents/wound_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medical_reagents/wound_reagents.dm @@ -19,7 +19,7 @@ if(31 to INFINITY) C.AdjustSleeping(40) //formerly everything-fixing juice - for(var/datum/wound/blunt/broken_bone in C.all_wounds) + for(var/datum/wound/blunt/bone/broken_bone in C.all_wounds) broken_bone.remove_wound() for(var/obj/item/organ/O in C.internal_organs) O.damage = 0 diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 41246e0caa5..96eafdb2f9e 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -875,6 +875,7 @@ color = "#A5F0EE" // rgb: 165, 240, 238 taste_description = "sourness" reagent_weight = 0.6 //so it sprays further + var/robot_clean_power = 2 var/clean_types = CLEAN_WASH /datum/reagent/space_cleaner/expose_obj(obj/O, reac_volume) @@ -900,6 +901,7 @@ description = "A powerful, acidic cleaner sold by Waffle Co. Affects organic matter while leaving other objects unaffected." metabolization_rate = 1.5 * REAGENTS_METABOLISM taste_description = "acid" + robot_clean_power = 15 /datum/reagent/space_cleaner/ez_clean/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(3.33) @@ -2200,6 +2202,7 @@ self_consuming = TRUE taste_description = "pure determination" overdose_threshold = 45 + process_flags = ALL /// Whether we've had at least WOUND_DETERMINATION_SEVERE (2.5u) of determination at any given time. No damage slowdown immunity or indication we're having a second wind if it's just a single moderate wound var/significant = FALSE diff --git a/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm b/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm index c48352567af..803c8ffdf4a 100644 --- a/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm @@ -356,9 +356,9 @@ var/mob/living/carbon/guy_who_probably_got_shot = M if(prob(20) && length(guy_who_probably_got_shot.all_wounds)) to_chat(M, span_warning("Your cuts and punctures sear for a second, before ceasing their bloody flow!")) - for(var/datum/wound/slash/cut in guy_who_probably_got_shot.all_wounds) + for(var/datum/wound/slash/flesh/cut in guy_who_probably_got_shot.all_wounds) cut.remove_wound() - for(var/datum/wound/pierce/hole in guy_who_probably_got_shot.all_wounds) + for(var/datum/wound/pierce/bleed/hole in guy_who_probably_got_shot.all_wounds) hole.remove_wound() if(prob(10) && length(guy_who_probably_got_shot.all_wounds)) diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 221c20ee2d4..1350c6b66ee 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -257,10 +257,6 @@ required_temp = 207 is_cold_recipe = TRUE -/datum/chemical_reaction/system_cleaner - results = list(/datum/reagent/medicine/system_cleaner = 4) - required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/chlorine = 1, /datum/reagent/phenol = 2, /datum/reagent/potassium = 1) - /datum/chemical_reaction/liquid_solder results = list(/datum/reagent/medicine/liquid_solder = 3) required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/copper = 1, /datum/reagent/silver = 1) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 897c833214f..039ad16e5c8 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -340,6 +340,10 @@ results = list(/datum/reagent/space_cleaner = 2) required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/water = 1) +/datum/chemical_reaction/system_cleaner + results = list(/datum/reagent/space_cleaner/system_cleaner = 4) + required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/chlorine = 1, /datum/reagent/phenol = 2, /datum/reagent/potassium = 1) + /datum/chemical_reaction/plantbgone results = list(/datum/reagent/toxin/plantbgone = 5) required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/water = 4) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 7a8f0069406..672642263be 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -303,7 +303,7 @@ var/atom/A = holder.my_atom A.flash_lighting_fx(_range = (range + 2)) for(var/mob/living/C in get_hearers_in_view(range, location)) - if(C.flash_act(affect_silicon = TRUE)) + if(C.flash_act(affect_silicon = TRUE) & FLASH_EFFECT) if(get_dist(C, location) < 4) C.Paralyze(60) else @@ -322,7 +322,7 @@ var/atom/A = holder.my_atom A.flash_lighting_fx(_range = (range + 2)) for(var/mob/living/C in get_hearers_in_view(range, location)) - if(C.flash_act(affect_silicon = TRUE)) + if(C.flash_act(affect_silicon = TRUE) & FLASH_EFFECT) if(get_dist(C, location) < 4) C.Paralyze(60) else diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index e21e7d1d454..c8fb8420ad4 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -313,9 +313,19 @@ list_reagents = list(/datum/reagent/medicine/mannitol = 15) volume = 15 amount_per_transfer_from_this = 15 - icon_state = "morphen" - base_icon_state = "morphen" - item_state = "morphen" + icon_state = "brainpen" + base_icon_state = "brainpen" + item_state = "brainpen" + +/obj/item/reagent_containers/hypospray/medipen/neurine + name = "neurine injector" + desc = "An injector filled with neurine, a restorative compound that targets brain trauma." + list_reagents = list(/datum/reagent/medicine/neurine = 15) + volume = 15 + amount_per_transfer_from_this = 15 + icon_state = "brainpen" + base_icon_state = "brainpen" + item_state = "brainpen" /obj/item/reagent_containers/hypospray/medipen/badstop name = "Stabilizer injector" diff --git a/code/modules/reagents/reagent_containers/inhaler.dm b/code/modules/reagents/reagent_containers/inhaler.dm index 08cdff35476..b0e26db8a7d 100644 --- a/code/modules/reagents/reagent_containers/inhaler.dm +++ b/code/modules/reagents/reagent_containers/inhaler.dm @@ -296,3 +296,25 @@ name = "rescue inhaler" icon_state = "inhaler_generic" initial_casister_path = /obj/item/reagent_containers/inhaler_canister/salbutamol + +/obj/item/inhaler/sting + name = "sting inhaler" + icon_state = "inhaler_generic" + initial_casister_path = /obj/item/reagent_containers/inhaler_canister/sting + +/obj/item/reagent_containers/inhaler_canister/sting + name = "sting canister" + desc = "A small canister filled with aerosolized reagents for use in a inhaler. This one contains Sting, and the mark of a Syeben'Altch guild." + icon_state = "canister_generic" + list_reagents = list(/datum/reagent/drug/sting = 30) + +/obj/item/inhaler/cocktail + name = "shoalmix inhaler" + icon_state = "inhaler_syndicate" + initial_casister_path = /obj/item/reagent_containers/inhaler_canister/combat_drug + +/obj/item/reagent_containers/inhaler_canister/combat_drug + name = "shoalmix canister" + desc = "A small canister filled with aerosolized reagents for use in a inhaler. This one contains a blend of shoalmix and panacea. Hit it in a fight!" + icon_state = "canister_syndicate" + list_reagents = list(/datum/reagent/drug/combat_drug = 20, /datum/reagent/medicine/panacea = 10) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 019aa6c7a51..f0fb25cdfaa 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -316,3 +316,9 @@ desc = "A pill composed of a white, powdery substance. Take as prescribed." icon_state = "pill9" list_reagents = list(/datum/reagent/drug/placebatol = 10) + +/obj/item/reagent_containers/pill/rcyte + name = "R-Cyte tablet" + desc = "A pill composed of a white, powdery substance. Take as prescribed." + icon_state = "pill0" + list_reagents = list(/datum/reagent/drug/cytodron = 10) diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 359151810ab..cfeba54ab4e 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -1214,6 +1214,14 @@ build_path = /obj/item/ammo_box/magazine/illestren_a850r/empty category = list("initial", "Security", "Ammo") +/datum/design/a4570clip + name = ".45-70 Stripper Clip" + id = "PyreStripClip" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 1000) + build_path = /obj/item/ammo_box/a4570/empty + category = list("initial", "Security", "Ammo") + /datum/design/a300clip name = ".300 Scout Stripper Clip" id = "ScoutStripClip" diff --git a/code/modules/research/designs/mining_designs.dm b/code/modules/research/designs/mining_designs.dm index 01c05a9c4ad..b6c7e6f487e 100644 --- a/code/modules/research/designs/mining_designs.dm +++ b/code/modules/research/designs/mining_designs.dm @@ -37,17 +37,7 @@ id = "plasmacutter" build_type = PROTOLATHE materials = list(/datum/material/iron = 1500, /datum/material/glass = 500, /datum/material/plasma = 400) - build_path = /obj/item/gun/energy/plasmacutter - category = list("Mining Designs") - departmental_flags = DEPARTMENTAL_FLAG_CARGO - -/datum/design/plasmacutter_adv - name = "Advanced Plasma Cutter" - desc = "It's an advanced plasma cutter, oh my god." - id = "plasmacutter_adv" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 3000, /datum/material/glass = 1000, /datum/material/plasma = 2000, /datum/material/gold = 500) - build_path = /obj/item/gun/energy/plasmacutter/adv + build_path = /obj/item/plasmacutter category = list("Mining Designs") departmental_flags = DEPARTMENTAL_FLAG_CARGO diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 20caa369199..7c85aeb25d7 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -83,7 +83,7 @@ id = "tele_shield" build_type = PROTOLATHE materials = list(/datum/material/iron = 4000, /datum/material/glass = 4000, /datum/material/silver = 300, /datum/material/titanium = 200) - build_path = /obj/item/shield/riot/tele + build_path = /obj/item/shield/tele category = list("Weapons") /datum/design/beamrifle diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 70d40d6e764..8a2b51d67e1 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -303,7 +303,7 @@ display_name = "Advanced Plasma Research" description = "Research on how to fully exploit the power of plasma." prereq_ids = list("basic_plasma") - design_ids = list("mech_plasma_cutter","plasmacutter_adv") + design_ids = list("mech_plasma_cutter") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm index ba0a019340b..358c4506c15 100644 --- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm +++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm @@ -257,6 +257,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) layer = ABOVE_OPEN_TURF_LAYER anchored = TRUE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + var/list/give_turf_traits = list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED, TRAIT_LAVA_STOPPED, TRAIT_TURF_IGNORE_SLOWDOWN, TRAIT_ACID_STOPPED) var/tile_key = "pristine_tile" var/tile_random_sprite_max = 24 var/fall_on_cross = STABLE //If the tile has some sort of effect when crossed @@ -271,6 +272,9 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) COMSIG_ATOM_ENTERED = PROC_REF(on_entered) ) AddElement(/datum/element/connect_loc, loc_connections) + if(length(give_turf_traits)) + give_turf_traits = string_list(give_turf_traits) + AddElement(/datum/element/give_turf_traits, give_turf_traits) /obj/structure/stone_tile/Destroy(force) if(force || fallen) @@ -307,6 +311,9 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) playsound(src, 'sound/effects/pressureplate.ogg', 50, TRUE) Shake(-1, -1, 25) sleep(5) + if(length(give_turf_traits)) + give_turf_traits = string_list(give_turf_traits) + RemoveElement(/datum/element/give_turf_traits, give_turf_traits) if(break_that_sucker) playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE) else @@ -325,6 +332,9 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) sleep(30) falling = FALSE fallen = FALSE + if(length(give_turf_traits)) + give_turf_traits = string_list(give_turf_traits) + AddElement(/datum/element/give_turf_traits, give_turf_traits) /obj/structure/stone_tile/proc/crossed_effect(atom/movable/AM) return diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 756d889f5bc..7cd9591feb8 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -4,12 +4,14 @@ name = "emergency space helmet" icon_state = "syndicate-helm-orange" item_state = "syndicate-helm-orange" + supports_variations = SNOUTED_VARIATION /obj/item/clothing/suit/space/orange name = "emergency space suit" icon_state = "syndicate-orange" item_state = "syndicate-orange" slowdown = 3 + supports_variations = DIGITIGRADE_VARIATION /obj/item/pickaxe/emergency name = "emergency disembarkation tool" diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 8e69438a167..b3982101160 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -39,7 +39,16 @@ All ShuttleMove procs go here if(isanimal(M) || isbasicmob(M)) qdel(M) else - M.gib() + //you're going to get, unequivocally, fucked up + M.apply_damage(400, BRUTE, forced = TRUE, spread_damage = TRUE) + M.apply_damage(100, BRUTE, BODY_ZONE_CHEST, forced = TRUE) + M.apply_damage(100, BRUTE, BODY_ZONE_HEAD, forced = TRUE) + if(istype(M, /mob/living/carbon)) + var/mob/living/carbon/mob = M + for(var/obj/item/bodypart/limb in mob.bodyparts) + limb.check_wounding(list(WOUND_BLUNT = 50), 50) + M.AddElement(/datum/element/squish, 20 SECONDS) + M.spawn_gibs() else //non-living mobs shouldn't be affected by shuttles, which is why this is an else diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index f8fba4a5455..427e38d4bc1 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -15,6 +15,9 @@ ///List of bodytypes flags, important for fitting clothing. If you'd like to know if a bodypart is organic, please use is_organic_limb() var/bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC + ///The types of wounds this bodypart is capable of receiving. + var/biological_state = BIO_STANDARD_UNJOINTED + ///Whether the clothing being worn forces the limb into being "squished" to plantigrade/standard humanoid compliance var/plantigrade_forced = FALSE ///Whether the limb is husked @@ -120,6 +123,8 @@ var/list/scars /// Our current stored wound damage multiplier var/wound_damage_multiplier = 1 + /// The amount of damage on this limb that cannot be healed until the wounds causing it are fixed + var/wound_integrity_loss = 0 /// This number is subtracted from all wound rolls on this bodypart, higher numbers mean more defense, negative means easier to wound var/wound_resistance = 0 @@ -142,6 +147,16 @@ //band-aid for blood overlays & other external overlays until they get refactored var/stored_icon_state + /// In the case we dont have dismemberable features, or literally cant get wounds, we will use this percent to determine when we can be dismembered. + /// Compared to our ABSOLUTE maximum. Stored in decimal; 0.8 = 80%. + var/hp_percent_to_dismemberable = 0.8 + /// If true, we will use [hp_percent_to_dismemberable] even if we are dismemberable via wounds. Useful for things with extreme wound resistance. + var/use_alternate_dismemberment_calc_even_if_mangleable = FALSE + /// If false, no wound that can be applied to us can mangle our exterior. Used for determining if we should use [hp_percent_to_dismemberable] instead of normal dismemberment. + var/any_existing_wound_can_mangle_our_exterior + /// If false, no wound that can be applied to us can mangle our interior. Used for determining if we should use [hp_percent_to_dismemberable] instead of normal dismemberment. + var/any_existing_wound_can_mangle_our_interior + /obj/item/bodypart/Initialize() . = ..() if(dynamic_rename) @@ -238,12 +253,14 @@ I.forceMove(T) ///since organs aren't actually stored in the bodypart themselves while attached to a person, we have to query the owner for what we should have -/obj/item/bodypart/proc/get_organs() +/obj/item/bodypart/proc/get_organs(required_status) if(!owner) return FALSE var/list/bodypart_organs for(var/obj/item/organ/organ_check as anything in owner.internal_organs) //internal organs inside the dismembered limb are dropped. + if(required_status && required_status != organ_check.status) + continue if(check_zone(organ_check.zone) == body_zone) LAZYADD(bodypart_organs, organ_check) // this way if we don't have any, it'll just return null @@ -260,7 +277,7 @@ //Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all. //Damage will not exceed max_damage using this proc //Cannot apply negative damage -/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, stamina = 0, blocked = 0, updating_health = TRUE, required_status = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE, attack_direction = null) +/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, stamina = 0, blocked = 0, updating_health = TRUE, required_status = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE, attack_direction = null, ignore_reduction = 0) var/hit_percent = (100-blocked)/100 if((!brute && !burn && !stamina) || hit_percent <= 0) return FALSE @@ -275,8 +292,8 @@ brute = round(max(brute * dmg_mlt, 0),DAMAGE_PRECISION) burn = round(max(burn * dmg_mlt, 0),DAMAGE_PRECISION) stamina = round(max(stamina * dmg_mlt, 0),DAMAGE_PRECISION) - brute = max(0, brute - brute_reduction) - burn = max(0, burn - burn_reduction) + brute = max(0, brute - max(brute_reduction - ignore_reduction, 0)) + burn = max(0, burn - max(burn_reduction - ignore_reduction, 0)) if(!brute && !burn && !stamina) return FALSE @@ -288,69 +305,8 @@ if(ALIEN_BODYPART,LARVA_BODYPART) //aliens take double burn //nothing can burn with so much snowflake code around burn *= 2 - //START WOUND HANDLING - - // what kind of wounds we're gonna roll for, take the greater between brute and burn, then if it's brute, we subdivide based on sharpness - var/wounding_type = (brute > burn ? WOUND_BLUNT : WOUND_BURN) - var/wounding_dmg = max(brute, burn) - - var/mangled_state = get_mangled_state() - var/bio_state = owner.get_biological_state() - var/easy_dismember = HAS_TRAIT(owner, TRAIT_EASYDISMEMBER) // if we have easydismember, we don't reduce damage when redirecting damage to different types (slashing weapons on mangled/skinless limbs attack at 100% instead of 50%) - - if(wounding_type == WOUND_BLUNT && sharpness) - wounding_type = (sharpness == SHARP_EDGED ? WOUND_SLASH : WOUND_PIERCE) - - //Handling for bone only/flesh only(none right now)/flesh and bone targets - switch(bio_state) - // if we're bone only, all cutting attacks go straight to the bone - if(BIO_JUST_BONE) - if(wounding_type == WOUND_SLASH) - wounding_type = WOUND_BLUNT - wounding_dmg *= (easy_dismember ? 1 : 0.6) - else if(wounding_type == WOUND_PIERCE) - wounding_type = WOUND_BLUNT - wounding_dmg *= (easy_dismember ? 1 : 0.75) - if((mangled_state & BODYPART_MANGLED_BONE) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus)) - return - // if we're flesh only, all blunt attacks become weakened slashes in terms of wound damage - if(BIO_JUST_FLESH) - if(wounding_type == WOUND_BLUNT) - wounding_type = WOUND_SLASH - wounding_dmg *= (easy_dismember ? 1 : 0.3) - if((mangled_state & BODYPART_MANGLED_FLESH) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus)) - return - // standard humanoids - if(BIO_FLESH_BONE) - // If the bodypart is not mangled, and its a limb, we have a chance we hit a muscle - if(mangled_state != BODYPART_MANGLED_BOTH && body_zone != BODY_ZONE_CHEST && body_zone != BODY_ZONE_HEAD && prob(MUSCLE_WOUND_CHANCE)) - wounding_type = WOUND_MUSCLE - // if we've already mangled the skin (critical slash or piercing wound), then the bone is exposed, and we can damage it with sharp weapons at a reduced rate - // So a big sharp weapon is still all you need to destroy a limb - else if(mangled_state == BODYPART_MANGLED_FLESH && sharpness) - playsound(src, "sound/effects/wounds/crackandbleed.ogg", 100) - if(wounding_type == WOUND_SLASH && !easy_dismember) - wounding_dmg *= 0.4 - if(wounding_type == WOUND_PIERCE && !easy_dismember) - wounding_dmg *= 0.6 - wounding_type = WOUND_BLUNT - else if(mangled_state == BODYPART_MANGLED_BOTH && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus)) - return - - // now we have our wounding_type and are ready to carry on with wounds and dealing the actual damage - if(owner && wounding_dmg >= WOUND_MINIMUM_DAMAGE && wound_bonus != CANT_WOUND) - if(current_gauze) - current_gauze.take_damage() - if(current_splint) - current_splint.take_damage() - check_wounding(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus, attack_direction) - - for(var/datum/wound/iter_wound as anything in wounds) - iter_wound.receive_damage(wounding_type, wounding_dmg, wound_bonus) - - /* - // END WOUND HANDLING - */ + if(wound_roll(brute, burn, wound_bonus, bare_wound_bonus, sharpness, attack_direction)) + return // stop here if dismembered //back to our regularly scheduled program, we now actually apply damage if there's room below limb damage cap var/can_inflict = max_damage - get_damage() @@ -381,46 +337,49 @@ . = TRUE return update_bodypart_damage_state() || . -/// Allows us to roll for and apply a wound without actually dealing damage. Used for aggregate wounding power with pellet clouds -/obj/item/bodypart/proc/painless_wound_roll(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus, sharpness=SHARP_NONE) - if(!owner || phantom_wounding_dmg <= WOUND_MINIMUM_DAMAGE || wound_bonus == CANT_WOUND) +/// Rolls for wounds, returning TRUE if the limb was dismembered. +/obj/item/bodypart/proc/wound_roll(brute, burn, wound_bonus = 0, bare_wound_bonus = 0, sharpness=SHARP_NONE, attack_direction, no_dismember = FALSE) + if(wound_bonus == CANT_WOUND) return - var/mangled_state = get_mangled_state() - var/bio_state = owner.get_biological_state() - var/easy_dismember = HAS_TRAIT(owner, TRAIT_EASYDISMEMBER) // if we have easydismember, we don't reduce damage when redirecting damage to different types (slashing weapons on mangled/skinless limbs attack at 100% instead of 50%) - - if(wounding_type == WOUND_BLUNT && sharpness) - wounding_type = (sharpness == SHARP_EDGED ? WOUND_SLASH : WOUND_PIERCE) - - //Handling for bone only/flesh only(none right now)/flesh and bone targets - switch(bio_state) - // if we're bone only, all cutting attacks go straight to the bone - if(BIO_JUST_BONE) - if(wounding_type == WOUND_SLASH) - wounding_type = WOUND_BLUNT - phantom_wounding_dmg *= (easy_dismember ? 1 : 0.6) - else if(wounding_type == WOUND_PIERCE) - wounding_type = WOUND_BLUNT - phantom_wounding_dmg *= (easy_dismember ? 1 : 0.75) - if((mangled_state & BODYPART_MANGLED_BONE) && try_dismember(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus)) - return - // note that there's no handling for BIO_JUST_FLESH since we don't have any that are that right now (slimepeople maybe someday) - // standard humanoids - if(BIO_FLESH_BONE) - // if we've already mangled the skin (critical slash or piercing wound), then the bone is exposed, and we can damage it with sharp weapons at a reduced rate - // So a big sharp weapon is still all you need to destroy a limb - if(mangled_state == BODYPART_MANGLED_FLESH && sharpness) - playsound(src, "sound/effects/wounds/crackandbleed.ogg", 100) - if(wounding_type == WOUND_SLASH && !easy_dismember) - phantom_wounding_dmg *= 0.6 // edged weapons pass along 60% of their wounding damage to the bone since the power is spread out over a larger area - if(wounding_type == WOUND_PIERCE && !easy_dismember) - phantom_wounding_dmg *= 0.75 // piercing weapons pass along 75% of their wounding damage to the bone since it's more concentrated - wounding_type = WOUND_BLUNT - else if(mangled_state == BODYPART_MANGLED_BOTH && try_dismember(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus)) - return + // if we have easydismember, we don't reduce damage when redirecting damage to different types (slashing weapons on mangled/skinless limbs attack at 100% instead of 50%) + var/easy_dismember = HAS_TRAIT(owner, TRAIT_EASYDISMEMBER) || HAS_TRAIT(src, TRAIT_EASYDISMEMBER) + + /// Associated list of each wound type and how much effective wounding damage can be done of that type. + var/list/wounding_types + switch(sharpness) + if(SHARP_NONE) + if(brute) + LAZYSET(wounding_types, WOUND_BLUNT, brute) + if(SHARP_EDGED) + LAZYSET(wounding_types, WOUND_SLASH, brute + burn) + if(brute) + LAZYSET(wounding_types, WOUND_BLUNT, brute * (easy_dismember ? 1 : 0.6)) + if(SHARP_POINTY) + LAZYSET(wounding_types, WOUND_PIERCE, brute + burn) + if(brute) + LAZYSET(wounding_types, WOUND_BLUNT, brute * (easy_dismember ? 1 : 0.6)) + if(burn) + LAZYSET(wounding_types, WOUND_BURN, burn) - check_wounding(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus) + if(!no_dismember && (dismemberable_by_wound() || dismemberable_by_total_damage()) && try_dismember(wounding_types, wound_bonus, bare_wound_bonus)) + return TRUE + + var/highest_damage = 0 + // now we have our wounding_type and are ready to carry on with wounds and dealing the actual damage + if(LAZYLEN(wounding_types)) + if(current_gauze) + current_gauze.take_damage() + if(current_splint) + current_splint.take_damage() + for(var/wound_type in wounding_types) + if(!owner) + break + highest_damage = max(highest_damage, wounding_types[wound_type]) + check_wounding(wounding_types, wound_bonus, bare_wound_bonus, attack_direction, no_dismember) + + for(var/datum/wound/iter_wound as anything in wounds) + iter_wound.receive_damage(wounding_types, highest_damage, wound_bonus) /** * check_wounding() is where we handle rolling for, selecting, and applying a wound if we meet the criteria @@ -434,76 +393,198 @@ * * wound_bonus- The wound_bonus of an attack * * bare_wound_bonus- The bare_wound_bonus of an attack */ -/obj/item/bodypart/proc/check_wounding(woundtype, damage, wound_bonus, bare_wound_bonus, attack_direction) +/obj/item/bodypart/proc/check_wounding(list/wounding_types, wound_bonus, bare_wound_bonus, attack_direction, no_dismember = FALSE) + var/damage_mult = 1 + // note that these are fed into an exponent, so these are magnified if(HAS_TRAIT(owner, TRAIT_EASILY_WOUNDED)) - damage *= 1.5 - else - damage = min(damage, WOUND_MAX_CONSIDERED_DAMAGE) + damage_mult *= 1.5 if(HAS_TRAIT(owner,TRAIT_HARDLY_WOUNDED)) - damage *= 0.85 + damage_mult *= 0.85 if(HAS_TRAIT(owner, TRAIT_VERY_HARDLY_WOUNDED)) - damage *= 0.6 + damage_mult *= 0.6 if(HAS_TRAIT(owner, TRAIT_EASYDISMEMBER)) - damage *= 1.1 - - var/base_roll = rand(1, round(damage ** WOUND_DAMAGE_EXPONENT)) - var/injury_roll = base_roll - injury_roll += check_woundings_mods(woundtype, damage, wound_bonus, bare_wound_bonus) - var/list/wounds_checking = GLOB.global_wound_types[woundtype] - - if(injury_roll > WOUND_DISMEMBER_OUTRIGHT_THRESH && prob(get_damage() / max_damage * 100)) + damage_mult *= 1.1 + + var/wounding_mods = check_woundings_mods(wound_bonus, bare_wound_bonus) + var/highest_roll = 0 + var/highest_wound_type + var/list/wound_rolls = list() + for(var/wounding_type in wounding_types) + for(var/wounding_series in SSwounds.types_to_series[wounding_type]) + var/injury_roll = rand(1, round(min(wounding_types[wounding_type], WOUND_MAX_CONSIDERED_DAMAGE) * damage_mult) ** WOUND_DAMAGE_EXPONENT) + wounding_mods + if(injury_roll > highest_roll) + highest_wound_type = wounding_type + highest_roll = highest_roll + wound_rolls[wounding_series] = max(injury_roll, wound_rolls[wounding_series]) + if(!wound_rolls.len) + CRASH("check_wounding called with a null wounding_types list!") + if(!no_dismember && highest_roll > WOUND_DISMEMBER_OUTRIGHT_THRESH && prob(get_damage() / max_damage * 100)) var/datum/wound/loss/dismembering = new - dismembering.apply_dismember(src, woundtype, outright = TRUE, attack_direction = attack_direction) + dismembering.apply_dismember(src, highest_wound_type, outright = TRUE, attack_direction = attack_direction) return + var/list/series_wounding_mods = check_series_wounding_mods() + + var/list/datum/wound/possible_wounds = list() + for(var/datum/wound/wound_type as anything in SSwounds.pregen_data) + var/datum/wound_pregen_data/pregen_data = SSwounds.pregen_data[wound_type] + if(pregen_data.can_be_applied_to(src, wounding_types, random_roll = TRUE)) + possible_wounds[wound_type] = pregen_data.get_weight(src, wounding_types, attack_direction) + // quick re-check to see if bare_wound_bonus applies, for the benefit of log_wound(), see about getting the check from check_woundings_mods() somehow if(ishuman(owner)) var/mob/living/carbon/human/human_wearer = owner var/list/clothing = human_wearer.get_clothing_on_part(src) for(var/obj/item/clothing/clothes_check as anything in clothing) // unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary - if(clothes_check.armor.getRating("wound")) + if(clothes_check.armor.getRating(WOUND)) bare_wound_bonus = 0 break - //cycle through the wounds of the relevant category from the most severe down - for(var/PW in wounds_checking) - var/datum/wound/possible_wound = PW + for(var/datum/wound/iterated_path as anything in possible_wounds) + for(var/datum/wound/existing_wound as anything in wounds) + if(iterated_path == existing_wound.type) + possible_wounds -= iterated_path + break // breaks out of the nested loop + + var/datum/wound_pregen_data/pregen_data = SSwounds.pregen_data[iterated_path] + var/specific_injury_roll = (wound_rolls[pregen_data.wound_series] + series_wounding_mods[pregen_data.wound_series]) + if(pregen_data.get_threshold_for(src, attack_direction) > specific_injury_roll) + possible_wounds -= iterated_path + continue + + if(pregen_data.compete_for_wounding) + for(var/datum/wound/other_path as anything in possible_wounds) + if(other_path == iterated_path) + continue + if(iterated_path::severity == other_path::severity && pregen_data.overpower_wounds_of_even_severity) + possible_wounds -= other_path + continue + else if(pregen_data.competition_mode == WOUND_COMPETITION_OVERPOWER_LESSERS) + if(iterated_path::severity > other_path::severity) + possible_wounds -= other_path + continue + else if(pregen_data.competition_mode == WOUND_COMPETITION_OVERPOWER_GREATERS) + if(iterated_path::severity < other_path::severity) + possible_wounds -= other_path + continue + + var/list/datum/wound/applied_wounds + while(length(possible_wounds)) + var/datum/wound/possible_wound = pick_weight(possible_wounds) + var/datum/wound_pregen_data/possible_pregen_data = SSwounds.pregen_data[possible_wound] + possible_wounds -= possible_wound + + // this makes muscle wounds show up less consistently at the same time as others + if(LAZYLEN(applied_wounds) && !prob(possible_wounds[possible_wound])) + continue + var/datum/wound/replaced_wound for(var/i in wounds) var/datum/wound/existing_wound = i - if(existing_wound.type in wounds_checking) - if(existing_wound.severity >= initial(possible_wound.severity)) - return + var/datum/wound_pregen_data/existing_pregen_data = SSwounds.pregen_data[existing_wound.type] + if(existing_pregen_data.wound_series == possible_pregen_data.wound_series) + if(existing_wound.severity >= possible_wound::severity) + continue else replaced_wound = existing_wound - if(initial(possible_wound.threshold_minimum) < injury_roll) - var/datum/wound/new_wound - if(replaced_wound) - new_wound = replaced_wound.replace_wound(possible_wound, attack_direction = attack_direction) - log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll) // dismembering wounds are logged in the apply_wound() for loss wounds since they delete themselves immediately, these will be immediately returned - else - new_wound = new possible_wound - new_wound.apply_wound(src, attack_direction = attack_direction) - log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll) - return new_wound + // if we get through this whole loop without continuing, we found our winner + var/datum/wound/new_wound = new possible_wound + if(replaced_wound) + new_wound = replaced_wound.replace_wound(new_wound, attack_direction = attack_direction) + else + new_wound.apply_wound(src, attack_direction = attack_direction) + LAZYADD(applied_wounds, new_wound) + + if(LAZYLEN(applied_wounds)) // dismembering wounds are logged in the apply_wound() for loss wounds since they delete themselves immediately, these will be immediately returned + log_wound(owner, src, applied_wounds, wounding_types, wound_bonus, bare_wound_bonus, wound_rolls) + return applied_wounds // try forcing a specific wound, but only if there isn't already a wound of that severity or greater for that type on this bodypart -/obj/item/bodypart/proc/force_wound_upwards(specific_woundtype, smited = FALSE) - var/datum/wound/potential_wound = specific_woundtype +/obj/item/bodypart/proc/force_wound_upwards(datum/wound/potential_wound, smited = FALSE, wound_source) + SHOULD_NOT_OVERRIDE(TRUE) + + if (isnull(potential_wound)) + return + + var/datum/wound_pregen_data/pregen_data = SSwounds.pregen_data[potential_wound] for(var/datum/wound/existing_wound as anything in wounds) - if(existing_wound.wound_type == initial(potential_wound.wound_type)) - if(existing_wound.severity < initial(potential_wound.severity)) // we only try if the existing one is inferior to the one we're trying to force - existing_wound.replace_wound(potential_wound, smited) + var/datum/wound_pregen_data/existing_pregen_data = existing_wound.get_pregen_data() + if(existing_pregen_data.wound_series == pregen_data.wound_series) + if(existing_wound.severity < potential_wound::severity) // we only try if the existing one is inferior to the one we're trying to force + existing_wound.replace_wound(new potential_wound, smited) return var/datum/wound/new_wound = new potential_wound new_wound.apply_wound(src, smited = smited) + return new_wound + +/** + * A simple proc to force a type of wound onto this mob. If you just want to force a specific mainline (fractures, bleeding, etc.) wound, you only need to care about the first 3 args. + * + * Args: + * * wounding_type: The wounding_type, e.g. WOUND_BLUNT, WOUND_SLASH to force onto the mob. Can be a list. + * * obj/item/bodypart/limb: The limb we wil be applying the wound to. If null, a random bodypart will be picked. + * * min_severity: The minimum severity that will be considered. + * * max_severity: The maximum severity that will be considered. + * * severity_pick_mode: The "pick mode" to be used. See get_corresponding_wound_type's documentation + * * wound_source: The source of the wound to be applied. Nullable. + * + * For the rest of the args, refer to get_corresponding_wound_type(). + * + * Returns: + * A new wound instance if the application was successful, null otherwise. +*/ +/mob/living/carbon/proc/cause_wound_of_type_and_severity(wounding_type, obj/item/bodypart/limb, min_severity, max_severity = min_severity, severity_pick_mode = WOUND_PICK_HIGHEST_SEVERITY, wound_source) + if(isnull(limb)) + limb = pick(bodyparts) + + var/list/type_list = wounding_type + if(!islist(type_list)) + type_list = list(type_list) + + var/datum/wound/corresponding_typepath = SSwounds.get_corresponding_wound_type(type_list, limb, min_severity, max_severity, severity_pick_mode) + if(corresponding_typepath) + return limb.force_wound_upwards(corresponding_typepath, wound_source = wound_source) + +/// Limb is nullable, but picks a random one. Defers to limb.get_wound_threshold_of_wound_type, see it for documentation. +/mob/living/carbon/proc/get_wound_threshold_of_wound_type(wounding_type, severity, default, obj/item/bodypart/limb, wound_source) + if(isnull(limb)) + limb = pick(bodyparts) + + if(!limb) + return default + + return limb.get_wound_threshold_of_wound_type(wounding_type, severity, default, wound_source) + +/** + * A simple proc that gets the best wound to fit the criteria laid out, then returns its wound threshold. + * + * Args: + * * wounding_type: The wounding_type, e.g. WOUND_BLUNT, WOUND_SLASH to force onto the mob. Can be a list of wounding_types. + * * severity: The severity that will be considered. + * * return_value_if_no_wound: If no wound is found, we will return this instead. (It is reccomended to use named args for this one, as its unclear what it is without) + * * wound_source: The theoretical source of the wound. Nullable. + * + * Returns: + * return_value_if_no_wound if no wound is found - if one IS found, the wound threshold for that wound. + */ +/obj/item/bodypart/proc/get_wound_threshold_of_wound_type(wounding_type, severity, return_value_if_no_wound, wound_source) + var/list/type_list = wounding_type + if(!islist(type_list)) + type_list = list(type_list) + + var/datum/wound/wound_path = SSwounds.get_corresponding_wound_type(type_list, src, severity, duplicates_allowed = TRUE, care_about_existing_wounds = FALSE) + if(wound_path) + var/datum/wound_pregen_data/pregen_data = SSwounds.pregen_data[wound_path] + return pregen_data.get_threshold_for(src, damage_source = wound_source) + + return return_value_if_no_wound /** * check_wounding_mods() is where we handle the various modifiers of a wound roll @@ -515,7 +596,7 @@ * Arguments: * * It's the same ones on [/obj/item/bodypart/proc/receive_damage] */ -/obj/item/bodypart/proc/check_woundings_mods(wounding_type, damage, wound_bonus, bare_wound_bonus) +/obj/item/bodypart/proc/check_woundings_mods(wound_bonus, bare_wound_bonus) var/armor_ablation = 0 var/injury_mod = 0 @@ -532,28 +613,104 @@ injury_mod -= armor_ablation injury_mod += wound_bonus - for(var/datum/wound/W as anything in wounds) - if(W.wound_type == wounding_type) - injury_mod += W.threshold_penalty + for(var/datum/wound/wound as anything in wounds) + injury_mod += wound.threshold_penalty var/part_mod = -wound_resistance - if(get_damage(TRUE) >= max_damage) + if(bodypart_disabled >= max_damage) part_mod += disabled_wound_penalty injury_mod += part_mod return injury_mod +/// Returns a bitflag using ANATOMY_EXTERIOR or ANATOMY_INTERIOR. Used to determine if we as a whole have a interior or exterior biostate, or both. +/obj/item/bodypart/proc/get_bio_state_status() + SHOULD_BE_PURE(TRUE) + + var/bio_status = NONE + + for (var/state as anything in SSwounds.bio_state_anatomy) + var/flag = text2num(state) + if (!(biological_state & flag)) + continue + + var/value = SSwounds.bio_state_anatomy[state] + if (value & ANATOMY_EXTERIOR) + bio_status |= ANATOMY_EXTERIOR + if (value & ANATOMY_INTERIOR) + bio_status |= ANATOMY_INTERIOR + + if ((bio_status & ANATOMY_EXTERIOR_AND_INTERIOR) == ANATOMY_EXTERIOR_AND_INTERIOR) + break + + return bio_status + +/// Returns if our current mangling status allows us to be dismembered. Requires both no exterior/mangled exterior and no interior/mangled interior. +/obj/item/bodypart/proc/dismemberable_by_wound() + SHOULD_BE_PURE(TRUE) + + var/mangled_state = get_mangled_state() + + var/bio_status = get_bio_state_status() + + var/has_exterior = ((bio_status & ANATOMY_EXTERIOR)) + var/has_interior = ((bio_status & ANATOMY_INTERIOR)) + + var/exterior_ready_to_dismember = (!has_exterior || ((mangled_state & BODYPART_MANGLED_EXTERIOR))) + var/interior_ready_to_dismember = (!has_interior || ((mangled_state & BODYPART_MANGLED_INTERIOR))) + + return (exterior_ready_to_dismember && interior_ready_to_dismember) + +/// Returns TRUE if our total percent damage is more or equal to our dismemberable percentage, but FALSE if a wound can cause us to be dismembered. +/obj/item/bodypart/proc/dismemberable_by_total_damage() + + update_wound_theory() + + var/bio_status = get_bio_state_status() + + var/has_interior = ((bio_status & ANATOMY_INTERIOR)) + var/can_theoretically_be_dismembered_by_wound = (any_existing_wound_can_mangle_our_interior || (any_existing_wound_can_mangle_our_exterior && has_interior)) + + var/wound_dismemberable = dismemberable_by_wound() + var/ready_to_use_alternate_formula = (use_alternate_dismemberment_calc_even_if_mangleable || (!wound_dismemberable && !can_theoretically_be_dismembered_by_wound)) + + if (ready_to_use_alternate_formula) + var/percent_to_total_max = (get_damage() / max_damage) + if (percent_to_total_max >= hp_percent_to_dismemberable) + return TRUE + + return FALSE + +/// Updates our "can be theoretically dismembered by wounds" variables by iterating through all wound static data. +/obj/item/bodypart/proc/update_wound_theory() + // We put this here so we dont increase init time by doing this all at once on initialization + // Effectively, we "lazy load" + if (isnull(any_existing_wound_can_mangle_our_interior) || isnull(any_existing_wound_can_mangle_our_exterior)) + any_existing_wound_can_mangle_our_interior = FALSE + any_existing_wound_can_mangle_our_exterior = FALSE + for (var/datum/wound/wound_type as anything in SSwounds.pregen_data) + var/datum/wound_pregen_data/pregen_data = SSwounds.pregen_data[wound_type] + if (!pregen_data.can_be_applied_to(src, random_roll = TRUE)) // we only consider randoms because non-randoms are usually really specific + continue + if (initial(pregen_data.wound_path_to_generate.wound_flags) & MANGLES_EXTERIOR) + any_existing_wound_can_mangle_our_exterior = TRUE + if (initial(pregen_data.wound_path_to_generate.wound_flags) & MANGLES_INTERIOR) + any_existing_wound_can_mangle_our_interior = TRUE + + if (any_existing_wound_can_mangle_our_interior && any_existing_wound_can_mangle_our_exterior) + break + //Heals brute and burn damage for the organ. Returns 1 if the damage-icon states changed at all. -//Damage cannot go below zero. +//Damage cannot go below zero, or min_damage. //Cannot remove negative damage (i.e. apply damage) /obj/item/bodypart/proc/heal_damage(brute, burn, stamina, required_status, updating_health = TRUE) if(required_status && !(bodytype & required_status)) //So we can only heal certain kinds of limbs, ie robotic vs organic. return if(brute) - set_brute_dam(round(max(brute_dam - brute, 0), DAMAGE_PRECISION)) + set_brute_dam(round(max(brute_dam - brute, wound_integrity_loss - burn_dam, 0), DAMAGE_PRECISION)) if(burn) - set_burn_dam(round(max(burn_dam - burn, 0), DAMAGE_PRECISION)) + set_burn_dam(round(max(burn_dam - burn, wound_integrity_loss - brute_dam, 0), DAMAGE_PRECISION)) if(stamina) set_stamina_dam(round(max(stamina_dam - stamina, 0), DAMAGE_PRECISION)) if(owner) @@ -979,6 +1136,19 @@ drop_organs() qdel(src) +/// Should return an assoc list of (wound_series -> penalty). Will be used in determining series-specific penalties for wounding. +/obj/item/bodypart/proc/check_series_wounding_mods() + RETURN_TYPE(/list) + + var/list/series_mods = list() + + for (var/datum/wound/iterated_wound as anything in wounds) + var/datum/wound_pregen_data/pregen_data = SSwounds.pregen_data[iterated_wound.type] + + series_mods[pregen_data.wound_series] += iterated_wound.series_threshold_penalty + + return series_mods + /// Get whatever wound of the given type is currently attached to this limb, if any /obj/item/bodypart/proc/get_wound_type(checking_type) if(isnull(wounds)) @@ -998,12 +1168,15 @@ */ /obj/item/bodypart/proc/update_wounds(replaced = FALSE) var/dam_mul = 1 //initial(wound_damage_multiplier) + var/integrity_mul = 0 -// we can (normally) only have one wound per type, but remember there's multiple types (smites like :B:loodless can generate multiple cuts on a limb) + // we can (normally) only have one wound per type, but remember there's multiple types (smites like :B:loodless can generate multiple cuts on a limb) for(var/datum/wound/iter_wound as anything in wounds) dam_mul *= iter_wound.damage_mulitplier_penalty + integrity_mul += iter_wound.limb_integrity_penalty wound_damage_multiplier = dam_mul + wound_integrity_loss = min(max_damage, WOUND_MAX_INTEGRITY_CONSIDERED) * integrity_mul /** * Calculates how much blood this limb is losing per life tick @@ -1083,6 +1256,11 @@ #undef BLEED_OVERLAY_MED #undef BLEED_OVERLAY_GUSH +/obj/item/bodypart/proc/can_bleed() + SHOULD_BE_PURE(TRUE) + + return ((biological_state & BIO_BLOODED) && (!owner || !HAS_TRAIT(owner, TRAIT_NOBLOOD))) + /** * apply_gauze() is used to- well, apply gauze to a bodypart * @@ -1113,3 +1291,23 @@ return current_splint = new new_splint.splint_type(src) new_splint.use(1) + +/* NOTE: it makes absolutely NO sense for wires to be "external," it should likely be renamed to hard/soft materials but i'm too lazy to do that right now */ + +/// Returns the generic description of our BIO_EXTERNAL feature(s), prioritizing certain ones over others. Returns error on failure. +/obj/item/bodypart/proc/get_external_description() + if (biological_state & BIO_FLESH) + return "flesh" + if (biological_state & BIO_WIRED) + return "wiring" + + return "error" + +/// Returns the generic description of our BIO_INTERNAL feature(s), prioritizing certain ones over others. Returns error on failure. +/obj/item/bodypart/proc/get_internal_description() + if (biological_state & BIO_BONE) + return "bone" + if (biological_state & BIO_METAL) + return "metal" + + return "error" diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 9aaea11e672..e182f2ae68d 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -1,36 +1,41 @@ /obj/item/bodypart/proc/can_dismember() + if(owner && HAS_TRAIT(owner, TRAIT_NODISMEMBER)) + return FALSE return dismemberable //Dismember a limb -/obj/item/bodypart/proc/dismember(dam_type = BRUTE, silent=TRUE) +/obj/item/bodypart/proc/dismember(dam_type = BRUTE, silent=TRUE, wounding_type) if(!owner || !dismemberable) return FALSE - var/mob/living/carbon/C = owner - if(C.status_flags & GODMODE) + var/mob/living/carbon/limb_owner = owner + if(limb_owner.status_flags & GODMODE) return FALSE - if(HAS_TRAIT(C, TRAIT_NODISMEMBER)) + if(HAS_TRAIT(limb_owner, TRAIT_NODISMEMBER)) return FALSE - var/obj/item/bodypart/affecting = C.get_bodypart(BODY_ZONE_CHEST) + var/obj/item/bodypart/affecting = limb_owner.get_bodypart(BODY_ZONE_CHEST) affecting.receive_damage(clamp(brute_dam/2 * affecting.body_damage_coeff, 15, 50), clamp(burn_dam/2 * affecting.body_damage_coeff, 0, 50), wound_bonus=CANT_WOUND) //Damage the chest based on limb's existing damage if(!silent) - C.visible_message(span_danger("[C]'s [name] sails off in a bloody arc!")) + limb_owner.visible_message(span_danger("[limb_owner]'s [name] sails off in a bloody arc!")) - if(C.stat <= SOFT_CRIT)//No more screaming while unconsious + if(limb_owner.stat <= SOFT_CRIT)//No more screaming while unconsious if(IS_ORGANIC_LIMB(affecting))//Chest is a good indicator for if a carbon is robotic in nature or not. - if(!HAS_TRAIT(C, TRAIT_ANALGESIA)) //and do we actually feel pain? - INVOKE_ASYNC(C, TYPE_PROC_REF(/mob, emote), "scream") + if(!HAS_TRAIT(limb_owner, TRAIT_ANALGESIA)) //and do we actually feel pain? + INVOKE_ASYNC(limb_owner, TYPE_PROC_REF(/mob, emote), "scream") - playsound(get_turf(C), 'sound/effects/wounds/dismember.ogg', 80, TRUE) - SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "dismembered", /datum/mood_event/dismembered) + playsound(get_turf(limb_owner), 'sound/effects/wounds/dismember.ogg', 80, TRUE) + SEND_SIGNAL(limb_owner, COMSIG_ADD_MOOD_EVENT, "dismembered", /datum/mood_event/dismembered) + + if(wounding_type) + LAZYSET(limb_owner.body_zone_dismembered_by, body_zone, wounding_type) drop_limb() - C.update_equipment_speed_mods() // Update in case speed affecting item unequipped by dismemberment - var/turf/location = C.loc - if(istype(location)) - C.add_splatter_floor(location) + limb_owner.update_equipment_speed_mods() // Update in case speed affecting item unequipped by dismemberment + var/turf/location = limb_owner.loc + if(wounding_type != WOUND_BURN && istype(location) && can_bleed()) + limb_owner.add_splatter_floor(location) if(QDELETED(src)) //Could have dropped into lava/explosion/chasm/whatever return TRUE @@ -38,8 +43,9 @@ burn() return TRUE - add_mob_blood(C) - C.bleed(rand(20, 40)) + if(can_bleed()) + add_mob_blood(limb_owner) + limb_owner.bleed(rand(20, 40)) var/direction = pick(GLOB.cardinals) var/t_range = rand(2,max(throw_range/2, 2)) @@ -56,27 +62,27 @@ return TRUE -/obj/item/bodypart/chest/dismember() +/obj/item/bodypart/chest/dismember(dam_type = BRUTE, silent = TRUE, wound_type) if(!owner) return FALSE - var/mob/living/carbon/C = owner + var/mob/living/carbon/chest_owner = owner if(!dismemberable) return FALSE - if(HAS_TRAIT(C, TRAIT_NODISMEMBER)) + if(HAS_TRAIT(chest_owner, TRAIT_NODISMEMBER)) return FALSE . = list() - var/turf/T = get_turf(C) - C.add_splatter_floor(T) - playsound(get_turf(C), 'sound/misc/splort.ogg', 80, TRUE) - for(var/obj/item/organ/O as anything in C.internal_organs) + if(wound_type != WOUND_BURN && isturf(chest_owner.loc) && can_bleed()) + chest_owner.add_splatter_floor(chest_owner.loc) + playsound(get_turf(chest_owner), 'sound/misc/splort.ogg', 80, TRUE) + for(var/obj/item/organ/O as anything in chest_owner.internal_organs) var/org_zone = check_zone(O.zone) if(org_zone != BODY_ZONE_CHEST) continue - O.Remove(C) - O.forceMove(T) + O.Remove(chest_owner) + O.forceMove(chest_owner.loc) . += O if(cavity_item) - cavity_item.forceMove(T) + cavity_item.forceMove(chest_owner.loc) . += cavity_item cavity_item = null @@ -149,23 +155,15 @@ forceMove(Tsec) -/** - * get_mangled_state() is relevant for flesh and bone bodyparts, and returns whether this bodypart has mangled skin, mangled bone, or both (or neither i guess) - * - * Dismemberment for flesh and bone requires the victim to have the skin on their bodypart destroyed (either a critical cut or piercing wound), and at least a hairline fracture - * (severe bone), at which point we can start rolling for dismembering. The attack must also deal at least 10 damage, and must be a brute attack of some kind (sorry for now, cakehat, maybe later) - * - * Returns: BODYPART_MANGLED_NONE if we're fine, BODYPART_MANGLED_FLESH if our skin is broken, BODYPART_MANGLED_BONE if our bone is broken, or BODYPART_MANGLED_BOTH if both are broken and we're up for dismembering - */ +/// Returns which of this bodypart's biological states have been sufficiently mangled. /obj/item/bodypart/proc/get_mangled_state() - . = BODYPART_MANGLED_NONE - - for(var/i in wounds) - var/datum/wound/iter_wound = i - if((iter_wound.wound_flags & MANGLES_BONE)) - . |= BODYPART_MANGLED_BONE - if((iter_wound.wound_flags & MANGLES_FLESH)) - . |= BODYPART_MANGLED_FLESH + var/mangled_states = NONE + for(var/datum/wound/iter_wound as anything in wounds) + if((iter_wound.wound_flags & MANGLES_INTERIOR)) + mangled_states |= BODYPART_MANGLED_INTERIOR + if((iter_wound.wound_flags & MANGLES_EXTERIOR)) + mangled_states |= BODYPART_MANGLED_EXTERIOR + return mangled_states /** * try_dismember() is used, once we've confirmed that a flesh and bone bodypart has both the skin and bone mangled, to actually roll for it @@ -175,20 +173,29 @@ * Lastly, we choose which kind of dismember we want based on the wounding type we hit with. Note we don't care about all the normal mods or armor for this * * Arguments: - * * wounding_type: Either WOUND_BLUNT, WOUND_SLASH, or WOUND_PIERCE, basically only matters for the dismember message - * * wounding_dmg: The damage of the strike that prompted this roll, higher damage = higher chance + * * wounding_types: An associated list of wounding types and how much effective damage each one has * * wound_bonus: Not actually used right now, but maybe someday * * bare_wound_bonus: ditto above */ -/obj/item/bodypart/proc/try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus) +/obj/item/bodypart/proc/try_dismember(list/wounding_types, wound_bonus, bare_wound_bonus) + if(!can_dismember()) + return + + var/wounding_type + var/wounding_dmg = 0 + for(var/wound in wounding_types) + if(wounding_types[wound] > wounding_dmg) + wounding_dmg = wounding_types[wound] + wounding_type = wound + if(wounding_dmg < DISMEMBER_MINIMUM_DAMAGE) return var/base_chance = wounding_dmg base_chance += (get_damage() / max_damage * 50) // how much damage we dealt with this blow, + 50% of the damage percentage we already had on this bodypart - if(locate(/datum/wound/blunt/critical) in wounds) // we only require a severe bone break, but if there's a critical bone break, we'll add 15% more - base_chance += 15 + for(var/datum/wound/iterated_wound as anything in wounds) + base_chance += iterated_wound.get_dismember_chance_bonus(base_chance) if(prob(base_chance)) var/datum/wound/loss/dismembering = new @@ -327,6 +334,7 @@ moveToNullspace() set_owner(C) C.add_bodypart(src) + LAZYREMOVE(C.body_zone_dismembered_by, body_zone) if(held_index) if(held_index > C.hand_bodyparts.len) C.hand_bodyparts.len = held_index @@ -452,9 +460,9 @@ return /mob/living/carbon/regenerate_limb(limb_zone, noheal, robotic = FALSE) - var/obj/item/bodypart/L + var/obj/item/bodypart/limb if(get_bodypart(limb_zone)) return FALSE - L = new_body_part(limb_zone, robotic, FALSE) - L.replace_limb(src, TRUE, TRUE) + limb = new_body_part(limb_zone, robotic, FALSE) + limb.replace_limb(src, TRUE, TRUE) return TRUE diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 44618e94c05..93ba95941f3 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -6,6 +6,7 @@ max_damage = 200 body_zone = BODY_ZONE_HEAD body_part = HEAD + plaintext_zone = "head" w_class = WEIGHT_CLASS_BULKY //Quite a hefty load slowdown = 1 //Balancing measure throw_range = 2 //No head bowling @@ -134,22 +135,22 @@ tongue = null /obj/item/bodypart/head/update_limb(dropping_limb, mob/living/carbon/source, is_creating) - var/mob/living/carbon/C + var/mob/living/carbon/limb_owner if(source) - C = source + limb_owner = source else - C = owner + limb_owner = owner - real_name = C.real_name - if(HAS_TRAIT(C, TRAIT_HUSK)) + real_name = limb_owner.real_name + if(HAS_TRAIT(limb_owner, TRAIT_HUSK)) real_name = "Unknown" hairstyle = "Bald" facial_hairstyle = "Shaved" lip_style = null stored_lipstick_trait = null - else if(!animal_origin && ishuman(C)) - var/mob/living/carbon/human/H = C + else if(!animal_origin && ishuman(limb_owner)) + var/mob/living/carbon/human/H = limb_owner var/datum/species/S = H.dna.species //Facial hair diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index 58c594e0894..92b7a0b654e 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -28,7 +28,7 @@ if(cavity_item) cavity_item.forceMove(drop_location()) cavity_item = null - ..() + return ..() /obj/item/bodypart/chest/monkey icon = 'icons/mob/animal_parts.dmi' @@ -70,6 +70,7 @@ px_x = -6 px_y = 0 can_be_disabled = TRUE + biological_state = BIO_STANDARD_JOINTED /obj/item/bodypart/l_arm/set_owner(new_owner) . = ..() @@ -161,6 +162,7 @@ px_y = 0 max_stamina_damage = 50 can_be_disabled = TRUE + biological_state = BIO_STANDARD_JOINTED /obj/item/bodypart/r_arm/set_owner(new_owner) . = ..() @@ -234,6 +236,9 @@ max_damage = 100 animal_origin = ALIEN_BODYPART +/obj/item/bodypart/leg + biological_state = BIO_STANDARD_JOINTED + /obj/item/bodypart/leg/left name = "left leg" desc = "Some athletes prefer to tie their left shoelaces first for good \ diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index 02ed7d02238..773cc5bc953 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -23,6 +23,7 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + biological_state = (BIO_ROBOTIC|BIO_JOINTED) brute_reduction = 5 burn_reduction = 4 @@ -48,6 +49,7 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + biological_state = (BIO_ROBOTIC|BIO_JOINTED) brute_reduction = 5 burn_reduction = 4 @@ -73,6 +75,7 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + biological_state = (BIO_ROBOTIC|BIO_JOINTED) brute_reduction = 5 burn_reduction = 4 @@ -98,6 +101,7 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + biological_state = (BIO_ROBOTIC|BIO_JOINTED) brute_reduction = 5 burn_reduction = 4 @@ -122,6 +126,7 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + biological_state = BIO_ROBOTIC brute_reduction = 5 burn_reduction = 4 @@ -224,6 +229,7 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + biological_state = BIO_ROBOTIC brute_reduction = 5 burn_reduction = 4 diff --git a/code/modules/surgery/bodyparts/species_parts/ipc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/ipc_bodyparts.dm index 1cb466e2e9d..e3dca6be192 100644 --- a/code/modules/surgery/bodyparts/species_parts/ipc_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/ipc_bodyparts.dm @@ -5,9 +5,12 @@ limb_id = "synth" dynamic_rename = FALSE draw_eyes = FALSE + var/has_screen = TRUE is_dimorphic = FALSE should_draw_greyscale = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_BOXHEAD + biological_state = BIO_ROBOTIC + light_brute_msg = "scratched" medium_brute_msg = "dented" heavy_brute_msg = "sheared" @@ -25,6 +28,7 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + biological_state = BIO_ROBOTIC light_brute_msg = "scratched" medium_brute_msg = "dented" @@ -42,6 +46,7 @@ dynamic_rename = FALSE should_draw_greyscale = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + biological_state = (BIO_ROBOTIC|BIO_JOINTED) light_brute_msg = "scratched" medium_brute_msg = "dented" @@ -59,6 +64,7 @@ dynamic_rename = FALSE should_draw_greyscale = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + biological_state = (BIO_ROBOTIC|BIO_JOINTED) light_brute_msg = "scratched" medium_brute_msg = "dented" @@ -76,6 +82,7 @@ dynamic_rename = FALSE should_draw_greyscale = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + biological_state = (BIO_ROBOTIC|BIO_JOINTED) light_brute_msg = "scratched" medium_brute_msg = "dented" @@ -93,6 +100,7 @@ dynamic_rename = FALSE should_draw_greyscale = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + biological_state = (BIO_ROBOTIC|BIO_JOINTED) light_brute_msg = "scratched" medium_brute_msg = "dented" @@ -476,6 +484,7 @@ uses_mutcolor = TRUE should_draw_greyscale = TRUE overlay_icon_state = TRUE + has_screen = FALSE draw_eyes = TRUE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_SNOUT @@ -535,6 +544,7 @@ name = "\improper Inteq Mothership 'Sprinter' Type-1 head" icon_state = "inteqsprinter_head" limb_id = "inteqsprinter" + has_screen = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC /obj/item/bodypart/chest/ipc/sprinter @@ -575,6 +585,7 @@ name = "\improper Maxim Dynamics 'Seeker' head" icon_state = "seekeripc_head" limb_id = "seekeripc" + has_screen = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC /obj/item/bodypart/chest/ipc/seeker @@ -608,6 +619,7 @@ name = "\improper Absolution-Lux 'Solferino' head" icon_state = "ablux_head" limb_id = "ablux" + has_screen = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC /obj/item/bodypart/chest/ipc/solferino @@ -642,6 +654,7 @@ icon_state = "humanipc_head" limb_id = "humanipc" draw_eyes = TRUE + has_screen = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC /obj/item/bodypart/chest/ipc/humaniform diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm index 70d663b8f0b..c8a800c495a 100644 --- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm @@ -50,24 +50,30 @@ ///JELLY /obj/item/bodypart/head/jelly - limb_id = "jelly" + limb_id = SPECIES_JELLYPERSON is_dimorphic = TRUE + biological_state = (BIO_FLESH|BIO_BLOODED) /obj/item/bodypart/chest/jelly - limb_id = "jelly" + limb_id = SPECIES_JELLYPERSON is_dimorphic = TRUE + biological_state = (BIO_FLESH|BIO_BLOODED) /obj/item/bodypart/l_arm/jelly - limb_id = "jelly" + limb_id = SPECIES_JELLYPERSON + biological_state = (BIO_FLESH|BIO_BLOODED) /obj/item/bodypart/r_arm/jelly - limb_id = "jelly" + limb_id = SPECIES_JELLYPERSON + biological_state = (BIO_FLESH|BIO_BLOODED) /obj/item/bodypart/leg/left/jelly - limb_id = "jelly" + limb_id = SPECIES_JELLYPERSON + biological_state = (BIO_FLESH|BIO_BLOODED) /obj/item/bodypart/leg/right/jelly - limb_id = "jelly" + limb_id = SPECIES_JELLYPERSON + biological_state = (BIO_FLESH|BIO_BLOODED) ///SLIME /obj/item/bodypart/head/slime @@ -201,24 +207,30 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE greyscale_eyes = FALSE + biological_state = BIO_BONE /obj/item/bodypart/chest/skeleton limb_id = "skeleton" is_dimorphic = FALSE should_draw_greyscale = FALSE + biological_state = BIO_BONE /obj/item/bodypart/l_arm/skeleton limb_id = "skeleton" should_draw_greyscale = FALSE + biological_state = (BIO_BONE|BIO_JOINTED) /obj/item/bodypart/r_arm/skeleton limb_id = "skeleton" should_draw_greyscale = FALSE + biological_state = (BIO_BONE|BIO_JOINTED) /obj/item/bodypart/leg/left/skeleton limb_id = "skeleton" should_draw_greyscale = FALSE + biological_state = (BIO_BONE|BIO_JOINTED) /obj/item/bodypart/leg/right/skeleton limb_id = "skeleton" should_draw_greyscale = FALSE + biological_state = (BIO_BONE|BIO_JOINTED) diff --git a/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm index 974075a31d4..7b52ea7b623 100644 --- a/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm @@ -4,29 +4,35 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE greyscale_eyes = FALSE + biological_state = BIO_BONE /obj/item/bodypart/chest/plasmaman static_icon = 'icons/mob/species/plasmaman/bodyparts.dmi' limb_id = SPECIES_PLASMAMAN is_dimorphic = FALSE should_draw_greyscale = FALSE + biological_state = BIO_BONE /obj/item/bodypart/l_arm/plasmaman static_icon = 'icons/mob/species/plasmaman/bodyparts.dmi' limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE + biological_state = (BIO_BONE|BIO_JOINTED) /obj/item/bodypart/r_arm/plasmaman static_icon = 'icons/mob/species/plasmaman/bodyparts.dmi' limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE + biological_state = (BIO_BONE|BIO_JOINTED) /obj/item/bodypart/leg/left/plasmaman static_icon = 'icons/mob/species/plasmaman/bodyparts.dmi' limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE + biological_state = (BIO_BONE|BIO_JOINTED) /obj/item/bodypart/leg/right/plasmaman static_icon = 'icons/mob/species/plasmaman/bodyparts.dmi' limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE + biological_state = (BIO_BONE|BIO_JOINTED) diff --git a/code/modules/surgery/bodyparts/species_parts/rachnid_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/rachnid_bodyparts.dm index 00690d92e76..440b0b7236f 100644 --- a/code/modules/surgery/bodyparts/species_parts/rachnid_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/rachnid_bodyparts.dm @@ -3,6 +3,7 @@ limb_id = SPECIES_RACHNID should_draw_greyscale = FALSE overlay_icon_state = TRUE + biological_state = (BIO_FLESH|BIO_BLOODED) draw_eyes = FALSE /obj/item/bodypart/chest/rachnid @@ -10,26 +11,31 @@ limb_id = SPECIES_RACHNID is_dimorphic = FALSE should_draw_greyscale = FALSE + biological_state = (BIO_FLESH|BIO_BLOODED) overlay_icon_state = TRUE /obj/item/bodypart/l_arm/rachnid static_icon = 'icons/mob/species/rachnid/bodyparts.dmi' limb_id = SPECIES_RACHNID should_draw_greyscale = FALSE + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) /obj/item/bodypart/r_arm/rachnid static_icon = 'icons/mob/species/rachnid/bodyparts.dmi' limb_id = SPECIES_RACHNID should_draw_greyscale = FALSE + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) /obj/item/bodypart/leg/left/rachnid static_icon = 'icons/mob/species/rachnid/bodyparts.dmi' limb_id = SPECIES_RACHNID should_draw_greyscale = FALSE overlay_icon_state = TRUE + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) /obj/item/bodypart/leg/right/rachnid static_icon = 'icons/mob/species/rachnid/bodyparts.dmi' limb_id = SPECIES_RACHNID should_draw_greyscale = FALSE overlay_icon_state = TRUE + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) diff --git a/code/modules/surgery/bone_fractures.dm b/code/modules/surgery/bone_fractures.dm index eb05b60fd14..36aa6422fca 100644 --- a/code/modules/surgery/bone_fractures.dm +++ b/code/modules/surgery/bone_fractures.dm @@ -7,7 +7,7 @@ target_mobtypes = list(/mob/living/carbon/human) possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) requires_real_bodypart = TRUE - targetable_wound = /datum/wound/blunt/severe + targetable_wound = /datum/wound/blunt/bone/severe /datum/surgery/repair_hairline_fracture/can_start(mob/living/user, mob/living/carbon/target) if(..()) @@ -21,7 +21,7 @@ target_mobtypes = list(/mob/living/carbon/human) possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) requires_real_bodypart = TRUE - targetable_wound = /datum/wound/blunt/critical + targetable_wound = /datum/wound/blunt/bone/critical /datum/surgery/reset_compound_fracture/can_start(mob/living/user, mob/living/carbon/target) if(..()) @@ -53,7 +53,8 @@ "[user] successfully repairs the fracture in [target]'s [parse_zone(target_zone)] with [tool]!", "[user] successfully repairs the fracture in [target]'s [parse_zone(target_zone)]!") log_combat(user, target, "repaired a hairline fracture in", addition="INTENT: [uppertext(user.a_intent)]") - qdel(surgery.operated_wound) + surgery.operated_wound.attached_surgery = null + QDEL_NULL(surgery.operated_wound) else to_chat(user, "[target] has no hairline fracture there!") return ..() @@ -87,7 +88,8 @@ "[user] successfully repairs the fracture in [target]'s [parse_zone(target_zone)] with [tool]!", "[user] successfully repairs the fracture in [target]'s [parse_zone(target_zone)]!") log_combat(user, target, "repaired a compound fracture in", addition="INTENT: [uppertext(user.a_intent)]") - qdel(surgery.operated_wound) + surgery.operated_wound.attached_surgery = null + QDEL_NULL(surgery.operated_wound) else to_chat(user, "[target] has no compound fracture there!") return ..() @@ -126,7 +128,7 @@ "[user] successfully repairs the fracture in [target]'s [parse_zone(target_zone)] with [tool]!", "[user] successfully repairs the fracture in [target]'s [parse_zone(target_zone)]!") log_combat(user, target, "repaired a compound fracture in", addition="INTENT: [uppertext(user.a_intent)]") - qdel(surgery.operated_wound) + QDEL_NULL(surgery.operated_wound) else to_chat(user, "[target] has no compound fracture there!") return ..() diff --git a/code/modules/surgery/buckling_repair.dm b/code/modules/surgery/buckling_repair.dm new file mode 100644 index 00000000000..61c3befe288 --- /dev/null +++ b/code/modules/surgery/buckling_repair.dm @@ -0,0 +1,38 @@ +/datum/surgery/repair_buckled_frame + name = "Repair Buckled Plating" + desc = "Replaces a buckled external plating on a robotic limb." + steps = list( + /datum/surgery_step/cut_plating, + /datum/surgery_step/add_plating, + /datum/surgery_step/weld_plating, + ) + requires_bodypart_type = BODYTYPE_ROBOTIC + self_operable = TRUE + targetable_wound = /datum/wound/blunt/buckling/severe + +/datum/surgery/repair_buckled_frame/can_start(mob/user, mob/living/patient) + if(!..()) + return FALSE + var/obj/item/bodypart/targeted_bodypart = patient.get_bodypart(user.zone_selected) + return !isnull(targeted_bodypart.get_wound_type(targetable_wound)) + +/datum/surgery/repair_sheared_frame + name = "Repair Sheared Frame" + desc = "Replaces the internal frame and external plating of a robotic limb." + steps = list( + /datum/surgery_step/cut_plating, + /datum/surgery_step/mechanic_unwrench, + /datum/surgery_step/replace_frame, + /datum/surgery_step/mechanic_wrench, + /datum/surgery_step/add_plating, + /datum/surgery_step/weld_plating, + ) + requires_bodypart_type = BODYTYPE_ROBOTIC + self_operable = TRUE + targetable_wound = /datum/wound/blunt/buckling/critical + +/datum/surgery/repair_sheared_frame/can_start(mob/user, mob/living/patient) + if(!..()) + return FALSE + var/obj/item/bodypart/targeted_bodypart = patient.get_bodypart(user.zone_selected) + return !isnull(targeted_bodypart.get_wound_type(targetable_wound)) diff --git a/code/modules/surgery/debride.dm b/code/modules/surgery/debride.dm index 69947b5b094..2c1266ee39e 100644 --- a/code/modules/surgery/debride.dm +++ b/code/modules/surgery/debride.dm @@ -8,14 +8,14 @@ target_mobtypes = list(/mob/living/carbon/human) possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) requires_real_bodypart = TRUE - targetable_wound = /datum/wound/burn + targetable_wound = /datum/wound/burn/flesh /datum/surgery/debride/can_start(mob/living/user, mob/living/carbon/target) if(!istype(target)) return FALSE if(..()) var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) - var/datum/wound/burn/burn_wound = targeted_bodypart.get_wound_type(targetable_wound) + var/datum/wound/burn/flesh/burn_wound = targeted_bodypart.get_wound_type(targetable_wound) return(burn_wound && burn_wound.infestation > 0) //SURGERY STEPS @@ -32,7 +32,7 @@ var/infestation_removed = 0.5 /// To give the surgeon a heads up how much work they have ahead of them -/datum/surgery_step/debride/proc/get_progress(mob/user, mob/living/carbon/target, datum/wound/burn/burn_wound) +/datum/surgery_step/debride/proc/get_progress(mob/user, mob/living/carbon/target, datum/wound/burn/flesh/burn_wound) if(!burn_wound?.infestation || !infestation_removed) return var/estimated_remaining_steps = burn_wound.infestation / infestation_removed @@ -52,7 +52,7 @@ /datum/surgery_step/debride/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(surgery.operated_wound) - var/datum/wound/burn/burn_wound = surgery.operated_wound + var/datum/wound/burn/flesh/burn_wound = surgery.operated_wound if(burn_wound.infestation <= 0) to_chat(user, "[target]'s [parse_zone(user.zone_selected)] has no infected flesh to remove!") surgery.status++ @@ -65,7 +65,7 @@ user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...") /datum/surgery_step/debride/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/datum/wound/burn/burn_wound = surgery.operated_wound + var/datum/wound/burn/flesh/burn_wound = surgery.operated_wound if(burn_wound) var/progress_text = get_progress(user, target, burn_wound) display_results(user, target, "You successfully excise some of the infected flesh from [target]'s [parse_zone(target_zone)][progress_text].", @@ -91,7 +91,7 @@ /datum/surgery_step/debride/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) if(!..()) return - var/datum/wound/burn/burn_wound = surgery.operated_wound + var/datum/wound/burn/flesh/burn_wound = surgery.operated_wound while(burn_wound && burn_wound.infestation > 0.25) if(!..()) break @@ -108,7 +108,7 @@ /datum/surgery_step/dress/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/datum/wound/burn/burn_wound = surgery.operated_wound + var/datum/wound/burn/flesh/burn_wound = surgery.operated_wound if(burn_wound) display_results(user, target, "You begin to dress the burns on [target]'s [parse_zone(user.zone_selected)]...", "[user] begins to dress the burns on [target]'s [parse_zone(user.zone_selected)] with [tool].", @@ -117,7 +117,7 @@ user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...") /datum/surgery_step/dress/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/datum/wound/burn/burn_wound = surgery.operated_wound + var/datum/wound/burn/flesh/burn_wound = surgery.operated_wound if(burn_wound) display_results(user, target, "You successfully wrap [target]'s [parse_zone(target_zone)] with [tool].", "[user] successfully wraps [target]'s [parse_zone(target_zone)] with [tool]!", diff --git a/code/modules/surgery/electrical_repair.dm b/code/modules/surgery/electrical_repair.dm new file mode 100644 index 00000000000..7cd3f257cb8 --- /dev/null +++ b/code/modules/surgery/electrical_repair.dm @@ -0,0 +1,158 @@ +/// Minimum temperature to melt the solder. +#define SOLDER_MELTING_POINT 600 + +/datum/surgery/repair_electrical_damage + name = "Repair Damaged Electronics" + desc = "Repairs damaged electronics inside a robotic limb." + requires_bodypart_type = BODYTYPE_ROBOTIC + steps = list( + /datum/surgery_step/mechanic_open, + /datum/surgery_step/open_hatch, + /datum/surgery_step/replace_wiring, + /datum/surgery_step/solder_wiring, + /datum/surgery_step/close_hatch, + /datum/surgery_step/mechanic_close, + ) + lying_required = FALSE + self_operable = TRUE + targetable_wound = /datum/wound/electric/severe + +/datum/surgery/repair_electrical_damage/can_start(mob/user, mob/living/patient) + if(!..()) + return FALSE + var/obj/item/bodypart/targeted_bodypart = patient.get_bodypart(user.zone_selected) + var/datum/wound/electric/targeted_wound = targeted_bodypart.get_wound_type(targetable_wound) + if(isnull(targeted_wound)) + return FALSE + if(user == patient && targeted_wound.affected_organ?.slot == ORGAN_SLOT_BRAIN) + return FALSE // can't operate on your own brain + return TRUE + +/datum/surgery/repair_short_circuit + name = "Repair Short Circuit" + desc = "Repairs short-circuiting electronics inside a robotic limb." + requires_bodypart_type = BODYTYPE_ROBOTIC + steps = list( + /datum/surgery_step/mechanic_open, + /datum/surgery_step/open_hatch, + /datum/surgery_step/prepare_electronics, + /datum/surgery_step/replace_capacitor, + /datum/surgery_step/replace_wiring, + /datum/surgery_step/solder_wiring, + /datum/surgery_step/close_hatch, + /datum/surgery_step/mechanic_close, + ) + lying_required = FALSE + self_operable = TRUE + targetable_wound = /datum/wound/electric/critical + +/datum/surgery/repair_short_circuit/can_start(mob/user, mob/living/patient) + if(!..()) + return FALSE + var/obj/item/bodypart/targeted_bodypart = patient.get_bodypart(user.zone_selected) + var/datum/wound/electric/targeted_wound = targeted_bodypart.get_wound_type(targetable_wound) + if(isnull(targeted_wound)) + return FALSE + if(user == patient && targeted_wound.affected_organ?.slot == ORGAN_SLOT_BRAIN) + return FALSE + return TRUE + +/datum/surgery_step/replace_capacitor + name = "replace capacitor" + implements = list( + /obj/item/stock_parts/capacitor = 100, + ) + preop_sound = 'sound/items/tape_flip.ogg' + success_sound = 'sound/items/taperecorder_close.ogg' + failure_sound = 'sound/machines/defib_zap.ogg' + time = 3 SECONDS + +/datum/surgery_step/replace_capacitor/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results(user, target, + span_notice("You start replacing the electronic components inside [target]'s [parse_zone(target_zone)]..."), + span_notice("[user] starts replacing the electronic components inside [target]'s [parse_zone(target_zone)] with [tool]..."), + span_notice("[user] starts replacing the electronic components inside [target]'s [parse_zone(target_zone)]...") + ) +/datum/surgery_step/replace_capacitor/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) + if(surgery.operated_wound) + qdel(tool) + return ..() + +/datum/surgery_step/replace_wiring + name = "replace wiring" + implements = list( + /obj/item/stack/cable_coil = 100, + ) + time = 3 SECONDS + +/datum/surgery_step/replace_wiring/tool_check(mob/user, obj/item/tool) + if(isstack(tool)) + var/obj/item/stack/new_wiring = tool + if(new_wiring.amount < 5) + to_chat(user, span_warning("You need 5 lengths of cable to replace the wiring!")) + return FALSE + return ..() + +/datum/surgery_step/replace_wiring/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results(user, target, + span_notice("You start replacing the wires inside [target]'s [parse_zone(target_zone)]..."), + span_notice("[user] starts replacing the wires inside [target]'s [parse_zone(target_zone)] with [tool]..."), + span_notice("[user] starts replacing the wires inside [target]'s [parse_zone(target_zone)]...") + ) + +/datum/surgery_step/replace_wiring/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) + . = ..() + tool.use(5) + +/datum/surgery_step/solder_wiring + name = "solder wiring" + implements = list( + TOOL_WELDER = 100, + TOOL_CAUTERY = 100, + /obj/item/reagent_containers = 100, + /obj/item = 40, + ) + time = 5 SECONDS + +/datum/surgery_step/solder_wiring/tool_check(mob/user, obj/item/tool) + if(tool.type == /obj/item && tool.get_temperature() < SOLDER_MELTING_POINT) + return FALSE + if(istype(tool, /obj/item/reagent_containers) && tool.reagents?.get_reagent_amount(/datum/reagent/medicine/liquid_solder) < 2) + to_chat(user, span_warning("You need more liquid solder to repair the wiring!")) + return FALSE + if(tool.usesound) + preop_sound = pick(tool.usesound) + success_sound = pick(tool.usesound) + return ..() + +/datum/surgery_step/solder_wiring/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(istype(tool, /obj/item/reagent_containers)) + display_results(user, target, + span_notice("You start adding new solder to [target]'s [parse_zone(target_zone)]..."), + span_notice("[user] starts adding new solder to [target]'s [parse_zone(target_zone)] with [tool]..."), + span_notice("[user] starts adding new solder to [target]'s [parse_zone(target_zone)]...") + ) + else + display_results(user, target, + span_notice("You start heating the solder inside [target]'s [parse_zone(target_zone)]..."), + span_notice("[user] starts heating the solder inside [target]'s [parse_zone(target_zone)] with [tool]..."), + span_notice("[user] starts heating the solder inside [target]'s [parse_zone(target_zone)]...") + ) + +/datum/surgery_step/solder_wiring/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) + if(surgery.operated_wound) + display_results(user, target, + span_notice("You solder the new wiring inside [target]'s [parse_zone(target_zone)]."), + span_notice("[user] solders the new wiring inside [target]'s [parse_zone(target_zone)] with [tool]."), + span_notice("[user] solders the new wiring inside [target]'s [parse_zone(target_zone)].") + ) + surgery.operated_wound.attached_surgery = null + QDEL_NULL(surgery.operated_wound) + return ..() + +/datum/surgery_step/solder_wiring/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob) + if(surgery.operated_bodypart) + surgery.operated_bodypart.wound_roll(0, rand(20, 40)) + return ..() + +#undef SOLDER_MELTING_POINT diff --git a/code/modules/surgery/heatwarp_repair.dm b/code/modules/surgery/heatwarp_repair.dm new file mode 100644 index 00000000000..9ecb9100137 --- /dev/null +++ b/code/modules/surgery/heatwarp_repair.dm @@ -0,0 +1,20 @@ +/datum/surgery/repair_heat_warp + name = "Repair Deformed Chassis" + desc = "Replaces the heat-warped plating and frame of a robotic limb." + steps = list( + /datum/surgery_step/cut_plating, + /datum/surgery_step/mechanic_unwrench, + /datum/surgery_step/replace_frame, + /datum/surgery_step/mechanic_wrench, + /datum/surgery_step/add_plating, + /datum/surgery_step/weld_plating, + ) + requires_bodypart_type = BODYTYPE_ROBOTIC + self_operable = TRUE + targetable_wound = /datum/wound/burn/heat_warping/critical + +/datum/surgery/repair_sheared_frame/can_start(mob/user, mob/living/patient) + if(!..()) + return FALSE + var/obj/item/bodypart/targeted_bodypart = patient.get_bodypart(user.zone_selected) + return !isnull(targeted_bodypart.get_wound_type(targetable_wound)) diff --git a/code/modules/surgery/mechanic_steps.dm b/code/modules/surgery/mechanic_steps.dm index f707232d1ad..131a700f130 100644 --- a/code/modules/surgery/mechanic_steps.dm +++ b/code/modules/surgery/mechanic_steps.dm @@ -204,3 +204,206 @@ span_notice("[user] successfully replaces [target]'s [parse_zone(target_zone)] with [tool]!"), span_notice("[user] successfully replaces [target]'s [parse_zone(target_zone)]!")) return ..() + +// Repair of specific robotic wounds. + +/datum/surgery_step/cut_plating + name = "cut plating" + implements = list( + TOOL_DECONSTRUCT = 100, + TOOL_WELDER = 100, + TOOL_SAW = 50, + ) + time = 4 SECONDS + +/datum/surgery_step/cut_plating/tool_check(mob/user, obj/item/tool) + if(tool.usesound) + preop_sound = pick(tool.usesound) + success_sound = pick(tool.usesound) + return ..() + +/datum/surgery_step/cut_plating/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(surgery.operated_wound) + display_results(user, target, + "You begin cutting the plating off of [target]'s [parse_zone(target_zone)]...", + "[user] begins cutting the plating off of [target]'s [parse_zone(target_zone)] with [tool]...", + "[user] begins cutting the plating off of [target]'s [parse_zone(target_zone)]...", + ) + +/datum/surgery_step/add_plating + name = "add new plating" + implements = list( + /obj/item/construction/rcd = 100, + /obj/item/stack/sheet/plasteel = 100, + /obj/item/stack/sheet/mineral/titanium = 100, + /obj/item/stack/sheet/mineral/plastitanium = 100, + ) + preop_sound = 'sound/machines/pda_button1.ogg' + success_sound = 'sound/machines/doorclick.ogg' + time = 2 SECONDS + +/datum/surgery_step/add_plating/tool_check(mob/user, obj/item/tool) + if(isstack(tool)) + var/obj/item/stack/new_plating = tool + if(new_plating.amount < 2) + to_chat(user, span_warning("You need 2 sheets to replace the plating!")) + return FALSE + if(istype(tool, /obj/item/construction/rcd)) + var/obj/item/construction/rcd/constructor = tool + if(constructor.matter < 20) + to_chat(user, constructor.no_ammo_message) + return FALSE + return ..() + +/datum/surgery_step/add_plating/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(!surgery.operated_wound) + return + if(istype(tool, /obj/item/construction/rcd)) + display_results(user, target, + span_notice("You begin reconstructing the plating on [target]'s [parse_zone(target_zone)]..."), + span_notice("[user] begins reconstructing the plating on [target]'s [parse_zone(target_zone)] with [tool]..."), + span_notice("[user] begins reconstructing the plating on [target]'s [parse_zone(target_zone)]..."), + ) + else + display_results(user, target, + span_notice("You begin replacing the plating on [target]'s [parse_zone(target_zone)]..."), + span_notice("[user] begins replacing the plating on [target]'s [parse_zone(target_zone)] with [tool]..."), + span_notice("[user] begins replacing the plating on [target]'s [parse_zone(target_zone)]..."), + ) + +/datum/surgery_step/add_plating/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) + if(surgery.operated_wound) + if(isstack(tool)) + var/obj/item/stack/used_stack = tool + used_stack.use(2) + if(istype(tool, /obj/item/construction/rcd)) + var/obj/item/construction/rcd/used_rcd = tool + used_rcd.useResource(20, user) + display_results(user, target, + span_notice("You reconstruct the plating on [target]'s [parse_zone(target_zone)]"), + span_notice("[user] reconstructs the plating on [target]'s [parse_zone(target_zone)] with [tool]"), + span_notice("[user] reconstructs the plating on [target]'s [parse_zone(target_zone)]"), + ) + else + display_results(user, target, + span_notice("You replace the plating on [target]'s [parse_zone(target_zone)]"), + span_notice("[user] replace the plating on [target]'s [parse_zone(target_zone)] with [tool]"), + span_notice("[user] replace the plating on [target]'s [parse_zone(target_zone)]"), + ) + return ..() + +/datum/surgery_step/add_plating/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob) + . = ..() + if(isstack(tool)) + var/obj/item/stack/used_stack = tool + used_stack.use(2) + if(istype(tool, /obj/item/construction/rcd)) + var/obj/item/construction/rcd/used_rcd = tool + used_rcd.useResource(20, user) + +/datum/surgery_step/replace_frame + name = "replace frame" + implements = list( + /obj/item/stack/rods = 100, + /obj/item/construction/rcd = 100, + ) + preop_sound = 'sound/items/tape_flip.ogg' + success_sound = 'sound/items/taperecorder_close.ogg' + time = 2 SECONDS + +/datum/surgery_step/replace_frame/tool_check(mob/user, obj/item/tool) + if(isstack(tool)) + var/obj/item/stack/new_plating = tool + if(new_plating.amount < 4) + to_chat(user, span_warning("You need 4 rods to replace the frame!")) + return FALSE + if(istype(tool, /obj/item/construction/rcd)) + var/obj/item/construction/rcd/constructor = tool + if(constructor.matter < 20) + to_chat(user, constructor.no_ammo_message) + return FALSE + return ..() + +/datum/surgery_step/replace_frame/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(!surgery.operated_wound) + return + if(istype(tool, /obj/item/construction/rcd)) + display_results(user, target, + span_notice("You begin reconstructing the frame inside [target]'s [parse_zone(target_zone)]..."), + span_notice("[user] begins reconstructing the frame inside [target]'s [parse_zone(target_zone)] with [tool]..."), + span_notice("[user] begins reconstructing the frame inside [target]'s [parse_zone(target_zone)]..."), + ) + else + display_results(user, target, + span_notice("You begin replacing the frame inside [target]'s [parse_zone(target_zone)]..."), + span_notice("[user] begins replacing the frame inside [target]'s [parse_zone(target_zone)] with [tool]..."), + span_notice("[user] begins replacing the frame inside [target]'s [parse_zone(target_zone)]..."), + ) + +/datum/surgery_step/replace_frame/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) + if(surgery.operated_wound) + if(isstack(tool)) + var/obj/item/stack/used_stack = tool + used_stack.use(4) + if(istype(tool, /obj/item/construction/rcd)) + var/obj/item/construction/rcd/used_rcd = tool + used_rcd.useResource(20, user) + display_results(user, target, + span_notice("You reconstruct the frame inside [target]'s [parse_zone(target_zone)]."), + span_notice("[user] reconstructs the frame inside [target]'s [parse_zone(target_zone)] with [tool]."), + span_notice("[user] reconstructs the frame inside [target]'s [parse_zone(target_zone)]."), + ) + else + display_results(user, target, + span_notice("You replace the frame inside [target]'s [parse_zone(target_zone)]."), + span_notice("[user] replace the frame inside [target]'s [parse_zone(target_zone)] with [tool]."), + span_notice("[user] replace the frame inside [target]'s [parse_zone(target_zone)]."), + ) + return ..() + +/datum/surgery_step/replace_frame/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob) + . = ..() + if(isstack(tool)) + var/obj/item/stack/used_stack = tool + used_stack.use(4) + if(istype(tool, /obj/item/construction/rcd)) + var/obj/item/construction/rcd/used_rcd = tool + used_rcd.useResource(20, user) + +/datum/surgery_step/weld_plating + name = "weld plating" + implements = list( + TOOL_WELDER = 100, + ) + time = 3 SECONDS + +/datum/surgery_step/weld_plating/tool_check(mob/user, obj/item/tool) + if(tool.usesound) + preop_sound = pick(tool.usesound) + success_sound = pick(tool.usesound) + return ..() + +/datum/surgery_step/weld_plating/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results(user, target, + span_notice("You start welding the plating onto [target]'s [parse_zone(target_zone)]..."), + span_notice("[user] starts welding the plating onto [target]'s [parse_zone(target_zone)] with [tool]..."), + span_notice("[user] starts welding the plating onto [target]'s [parse_zone(target_zone)]..."), + ) + +/datum/surgery_step/weld_plating/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) + if(surgery.operated_wound) + display_results(user, target, + span_notice("You weld the plating onto [target]'s [parse_zone(target_zone)]."), + span_notice("[user] welds the plating onto [target]'s [parse_zone(target_zone)] with [tool]."), + span_notice("[user] welds the plating onto [target]'s [parse_zone(target_zone)]."), + ) + var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) + for(var/datum/wound/plating_wound as anything in targeted_bodypart.wounds) // might have more than one wound solved by replacing the plating + if(!(plating_wound.wound_flags & PLATING_DAMAGE)) + continue + if(plating_wound.attached_surgery == surgery) + plating_wound.attached_surgery = null // detach the wound from this surgery so that it can be completed properly + qdel(plating_wound) + if(QDELETED(surgery.operated_wound)) + surgery.operated_wound = null + return ..() diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm index 7b9fccc04d3..a7119bf7b80 100644 --- a/code/modules/surgery/organic_steps.dm +++ b/code/modules/surgery/organic_steps.dm @@ -158,13 +158,13 @@ /obj/item/melee/arm_blade = 40, /obj/item/hatchet = 40, /obj/item/melee/knife/butcher = 33, - /obj/item/gun/energy/plasmacutter = 30, + /obj/item/plasmacutter = 30, /obj/item = 10) //10% success (sort of) with any sharp item with a force>=10 time = 5.4 SECONDS preop_sound = list( /obj/item/circular_saw = 'sound/surgery/saw.ogg', /obj/item/gear_handle/anglegrinder = 'sound/surgery/saw.ogg', - /obj/item/gun/energy/plasmacutter = 'sound/weapons/plasma_cutter.ogg', + /obj/item/plasmacutter = 'sound/weapons/melee/plasmacutter/plasma_cutter_melee.ogg', /obj/item/melee/arm_blade = 'sound/surgery/scalpel1.ogg', /obj/item/melee/axe/fire = 'sound/surgery/scalpel1.ogg', /obj/item/hatchet = 'sound/surgery/scalpel1.ogg', diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 8f9b1d9b9ba..58bc3c93baf 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -198,7 +198,7 @@ owner.adjust_fire_stacks(20) owner.ignite_mob() owner.adjustFireLoss(25) - organ_flags |= ORGAN_FAILING + ADD_TRAIT(src, TRAIT_ORGAN_FAILING, DAMAGE_TRAIT) /obj/item/organ/cyberimp/arm/gun/laser diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index bdd938d5ee6..32203468da0 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -131,11 +131,11 @@ . = ..() if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF) return - organ_flags |= ORGAN_FAILING + ADD_TRAIT(src, TRAIT_ORGAN_FAILING, EMP_TRAIT) addtimer(CALLBACK(src, PROC_REF(reboot)), 90 / severity) /obj/item/organ/cyberimp/brain/anti_stun/proc/reboot() - organ_flags &= ~ORGAN_FAILING + REMOVE_TRAIT(src, TRAIT_ORGAN_FAILING, EMP_TRAIT) /obj/item/organ/cyberimp/brain/joywire name = "\improper Midi-Sed pleasure vivifier" @@ -152,7 +152,7 @@ . = ..() if(!owner || . & EMP_PROTECT_SELF) return - organ_flags |= ORGAN_FAILING + ADD_TRAIT(src, TRAIT_ORGAN_FAILING, DAMAGE_TRAIT) SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "joywire") SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "joywire_emp", /datum/mood_event/joywire_emp) to_chat(owner, span_boldwarning("That feeling of dream-like, distilled joy is suddenly diluted. Misery sets in...")) diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index dc742f411b5..8dae3235029 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -32,8 +32,6 @@ return ..() var/mob/living/carbon/C = owner - if((damage < maxHealth) && (organ_flags & ORGAN_FAILING)) //ear damage can be repaired from the failing condition - organ_flags &= ~ORGAN_FAILING // genetic deafness prevents the body from using the ears, even if healthy if(HAS_TRAIT(C, TRAIT_DEAF)) deaf = max(deaf, 1) @@ -48,8 +46,7 @@ /obj/item/organ/ears/proc/restoreEars() deaf = 0 - damage = 0 - organ_flags &= ~ORGAN_FAILING + setOrganDamage(0) var/mob/living/carbon/C = owner @@ -57,7 +54,7 @@ deaf = 1 /obj/item/organ/ears/proc/adjustEarDamage(ddmg, ddeaf) - damage = max(damage + (ddmg*damage_multiplier), 0) + applyOrganDamage(-ddmg * damage_multiplier) deaf = max(deaf + (ddeaf*damage_multiplier), 0) /obj/item/organ/ears/proc/minimumDeafTicks(value) diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 7fa2b4258a2..19dc7ae0b99 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -50,6 +50,8 @@ sclera_color = human_owner.sclera_color M.update_tint() + if(organ_flags & ORGAN_FAILING) + M.become_blind(EYE_DAMAGE) owner.update_sight() if(M.has_dna() && ishuman(M)) M.dna.species.handle_body(M) //updates eye icon @@ -70,16 +72,10 @@ /obj/item/organ/eyes/on_life() ..() var/mob/living/carbon/C = owner - //since we can repair fully damaged eyes, check if healing has occurred - if((organ_flags & ORGAN_FAILING) && (damage < maxHealth)) - organ_flags &= ~ORGAN_FAILING - C.cure_blind(EYE_DAMAGE) //various degrees of "oh fuck my eyes", from "point a laser at your eye" to "staring at the Sun" intensities if(damage > 20) damaged = TRUE - if((organ_flags & ORGAN_FAILING)) - C.become_blind(EYE_DAMAGE) - else if(damage > 30) + if(damage > 30) C.overlay_fullscreen("eye_damage", /atom/movable/screen/fullscreen/impaired, 2) else C.overlay_fullscreen("eye_damage", /atom/movable/screen/fullscreen/impaired, 1) @@ -89,6 +85,16 @@ C.clear_fullscreen("eye_damage") return +/obj/item/organ/eyes/on_organ_fail() + . = ..() + if(owner) + owner.become_blind(EYE_DAMAGE) + +/obj/item/organ/eyes/on_organ_restore() + . = ..() + if(owner) + owner.cure_blind(EYE_DAMAGE) + /obj/item/organ/eyes/lizard name = "lizard eyes" desc = "Very similar to human eyes in functionality, only visible difference being the different shade of white." diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 7f1d9d4796a..ac758ec538b 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -49,6 +49,8 @@ pre_eat = CALLBACK(src, PROC_REF(pre_eat)),\ on_compost = CALLBACK(src, PROC_REF(pre_compost)),\ after_eat = CALLBACK(src, PROC_REF(on_eat_from))) + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_ORGAN_FAILING), PROC_REF(on_organ_fail)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_ORGAN_FAILING), PROC_REF(on_organ_restore)) ///When you take a bite you cant jam it in for surgery anymore. /obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) @@ -191,6 +193,7 @@ var/delta = damage - prev_damage if(delta > 0) if(damage >= maxHealth) + ADD_TRAIT(src, TRAIT_ORGAN_FAILING, DAMAGE_TRAIT) organ_flags |= ORGAN_FAILING return now_failing if(damage > high_threshold && prev_damage <= high_threshold) @@ -198,7 +201,7 @@ if(damage > low_threshold && prev_damage <= low_threshold) return low_threshold_passed else - organ_flags &= ~ORGAN_FAILING + REMOVE_TRAIT(src, TRAIT_ORGAN_FAILING, DAMAGE_TRAIT) if(prev_damage > low_threshold && damage <= low_threshold) return low_threshold_cleared if(prev_damage > high_threshold && damage <= high_threshold) @@ -248,3 +251,12 @@ */ /obj/item/organ/proc/get_availability(datum/species/S) return TRUE + +/obj/item/organ/proc/on_organ_fail() + SIGNAL_HANDLER + organ_flags |= ORGAN_FAILING + +/obj/item/organ/proc/on_organ_restore() + SIGNAL_HANDLER + organ_flags &= ~ORGAN_FAILING + diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 66dd7e4df15..2ebc1683695 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -25,6 +25,7 @@ /datum/language/ratvar, /datum/language/codespeak, /datum/language/aphasia, + /datum/language/league_kalixcian, )) /obj/item/organ/tongue/Initialize(mapload) @@ -142,6 +143,7 @@ /datum/language/galactic_common, /datum/language/gezena_kalixcian, /datum/language/zohil_kalixcian, + /datum/language/league_kalixcian, /datum/language/codespeak, /datum/language/monkey, /datum/language/aphasia, @@ -209,6 +211,7 @@ /datum/language/galactic_common, /datum/language/gezena_kalixcian, /datum/language/zohil_kalixcian, + /datum/language/league_kalixcian, /datum/language/teceti_unified, /datum/language/solarian_international, /datum/language/moffic, @@ -233,6 +236,7 @@ /datum/language/gezena_kalixcian, /datum/language/zohil_kalixcian, /datum/language/teceti_unified, + /datum/language/league_kalixcian, /datum/language/solarian_international, /datum/language/moffic, /datum/language/monkey, @@ -252,6 +256,7 @@ /datum/language/galactic_common, /datum/language/gezena_kalixcian, /datum/language/zohil_kalixcian, + /datum/language/league_kalixcian, /datum/language/teceti_unified, /datum/language/solarian_international, /datum/language/moffic, @@ -274,6 +279,7 @@ /datum/language/galactic_common, /datum/language/gezena_kalixcian, /datum/language/zohil_kalixcian, + /datum/language/league_kalixcian, /datum/language/teceti_unified, /datum/language/solarian_international, /datum/language/moffic, @@ -297,6 +303,7 @@ /datum/language/galactic_common, /datum/language/gezena_kalixcian, /datum/language/zohil_kalixcian, + /datum/language/league_kalixcian, /datum/language/codespeak, /datum/language/monkey, /datum/language/aphasia, @@ -338,6 +345,7 @@ /datum/language/galactic_common, /datum/language/gezena_kalixcian, /datum/language/zohil_kalixcian, + /datum/language/league_kalixcian, /datum/language/teceti_unified, /datum/language/solarian_international, /datum/language/moffic, @@ -473,6 +481,7 @@ /datum/language/galactic_common, /datum/language/gezena_kalixcian, /datum/language/zohil_kalixcian, + /datum/language/league_kalixcian, /datum/language/teceti_unified, /datum/language/solarian_international, /datum/language/moffic, diff --git a/code/modules/surgery/repair_puncture.dm b/code/modules/surgery/repair_puncture.dm index 43a48f19366..adf618426f8 100644 --- a/code/modules/surgery/repair_puncture.dm +++ b/code/modules/surgery/repair_puncture.dm @@ -12,13 +12,13 @@ target_mobtypes = list(/mob/living/carbon) possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) requires_real_bodypart = TRUE - targetable_wound = /datum/wound/pierce + targetable_wound = /datum/wound/pierce/bleed /datum/surgery/repair_puncture/can_start(mob/living/user, mob/living/carbon/target) . = ..() if(.) var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) - var/datum/wound/burn/pierce_wound = targeted_bodypart.get_wound_type(targetable_wound) + var/datum/wound/pierce/bleed/pierce_wound = targeted_bodypart.get_wound_type(targetable_wound) return(pierce_wound && pierce_wound.blood_flow > 0) //SURGERY STEPS @@ -30,7 +30,7 @@ time = 3 SECONDS /datum/surgery_step/repair_innards/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/datum/wound/pierce/pierce_wound = surgery.operated_wound + var/datum/wound/pierce/bleed/pierce_wound = surgery.operated_wound if(!pierce_wound) user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...") return @@ -45,7 +45,7 @@ "[user] begins to realign the torn blood vessels in [target]'s [parse_zone(user.zone_selected)].") /datum/surgery_step/repair_innards/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/datum/wound/pierce/pierce_wound = surgery.operated_wound + var/datum/wound/pierce/bleed/pierce_wound = surgery.operated_wound if(!pierce_wound) to_chat(user, "[target] has no puncture wound there!") return ..() @@ -78,7 +78,7 @@ return TRUE /datum/surgery_step/seal_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/datum/wound/pierce/pierce_wound = surgery.operated_wound + var/datum/wound/pierce/bleed/pierce_wound = surgery.operated_wound if(!pierce_wound) user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...") return @@ -87,7 +87,7 @@ "[user] begins to meld some of the split blood vessels in [target]'s [parse_zone(user.zone_selected)].") /datum/surgery_step/seal_veins/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/datum/wound/pierce/pierce_wound = surgery.operated_wound + var/datum/wound/pierce/bleed/pierce_wound = surgery.operated_wound if(!pierce_wound) to_chat(user, "[target] has no puncture there!") return ..() diff --git a/code/modules/surgery/surgery_helpers.dm b/code/modules/surgery/surgery_helpers.dm index db8ff316645..6207f972bc5 100644 --- a/code/modules/surgery/surgery_helpers.dm +++ b/code/modules/surgery/surgery_helpers.dm @@ -21,7 +21,7 @@ var/list/available_surgeries = list() for(var/datum/surgery/S in all_surgeries) - if(!S.possible_locs.Find(selected_zone)) + if(LAZYLEN(S.possible_locs) && !S.possible_locs.Find(selected_zone)) continue if(affecting) if(!S.requires_bodypart) diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 8e152bae180..8f9e753f8d5 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -112,7 +112,7 @@ var/was_sleeping = (target.stat != DEAD && target.IsSleeping()) - if(do_after(user, modded_time, target = target)) + if(tool ? tool.use_tool(target, user, modded_time) : do_after(user, modded_time, target = target)) var/chem_check_result = chem_check(target) if((prob(100-fail_prob) || (iscyborg(user) && !silicons_obey_prob)) && chem_check_result && !try_to_fail) diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 90b60137cdd..7949bbcbe94 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -82,6 +82,7 @@ #include "icons/spritesheets.dm" #include "icons/worn_icons.dm" #include "anchored_mobs.dm" +#include "ammo_stacks.dm" #include "atmospheres.dm" #include "autowiki.dm" #include "bespoke_id.dm" diff --git a/code/modules/unit_tests/ammo_stacks.dm b/code/modules/unit_tests/ammo_stacks.dm new file mode 100644 index 00000000000..0fbd062a5aa --- /dev/null +++ b/code/modules/unit_tests/ammo_stacks.dm @@ -0,0 +1,10 @@ +///Checks for ammo stack capacity matching +/datum/unit_test/ammo_stacks/Run() + for(var/ammo_stack_type in subtypesof(/obj/item/ammo_box/magazine/ammo_stack) - /obj/item/ammo_box/magazine/ammo_stack/prefilled - /obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun) + + var/obj/item/ammo_box/magazine/ammo_stack/target_ammo_stack = new ammo_stack_type() + if(!target_ammo_stack.ammo_type) + TEST_FAIL("Ammo stack created without ammo type.") + if (!(target_ammo_stack.max_ammo == target_ammo_stack.ammo_type.stack_size)) + TEST_FAIL("Max ammo stack size on [target_ammo_stack.type] ([target_ammo_stack.max_ammo]) does not match declared stack size on assigned ammunition ([target_ammo_stack.ammo_type.name], [target_ammo_stack.ammo_type.stack_size]) type") + qdel(target_ammo_stack) diff --git a/code/modules/unit_tests/medical_wounds.dm b/code/modules/unit_tests/medical_wounds.dm index 987d04c8ac0..34105e04ed6 100644 --- a/code/modules/unit_tests/medical_wounds.dm +++ b/code/modules/unit_tests/medical_wounds.dm @@ -12,24 +12,25 @@ var/i = 1 var/list/iter_test_wound_list - for(iter_test_wound_list in list(list(/datum/wound/blunt/moderate, /datum/wound/blunt/severe),\ - list(/datum/wound/slash/moderate, /datum/wound/slash/critical),\ - list(/datum/wound/pierce/moderate, /datum/wound/pierce/severe),\ - list(/datum/wound/burn/moderate, /datum/wound/burn/severe))) + for(iter_test_wound_list in list(list(/datum/wound/blunt/bone/moderate, /datum/wound/blunt/bone/severe, /datum/wound/blunt/bone/critical),\ + list(/datum/wound/slash/flesh/moderate, /datum/wound/slash/flesh/severe, /datum/wound/slash/flesh/critical),\ + list(/datum/wound/pierce/bleed/moderate, /datum/wound/pierce/bleed/severe, /datum/wound/pierce/bleed/critical),\ + list(/datum/wound/burn/flesh/moderate, /datum/wound/burn/flesh/severe, /datum/wound/burn/flesh/critical))) TEST_ASSERT_EQUAL(length(victim.all_wounds), 0, "Patient is somehow wounded before test") var/datum/wound/iter_test_wound + var/datum/wound_pregen_data/iter_pregen_data = SSwounds.pregen_data[iter_test_wound] var/threshold_penalty = 0 for(iter_test_wound in iter_test_wound_list) - var/threshold = initial(iter_test_wound.threshold_minimum) - threshold_penalty // just enough to guarantee the next tier of wound, given the existing wound threshold penalty + var/threshold = iter_pregen_data.threshold_minimum - threshold_penalty // just enough to guarantee the next tier of wound, given the existing wound threshold penalty if(dam_types[i] == BRUTE) tested_part.receive_damage(WOUND_MINIMUM_DAMAGE, 0, wound_bonus = threshold, sharpness=sharps[i]) else if(dam_types[i] == BURN) tested_part.receive_damage(0, WOUND_MINIMUM_DAMAGE, wound_bonus = threshold, sharpness=sharps[i]) TEST_ASSERT(length(victim.all_wounds), "Patient has no wounds when one wound is expected. Severity: [initial(iter_test_wound.severity)]") - TEST_ASSERT_EQUAL(length(victim.all_wounds), 1, "Patient has more than one wound when only one is expected. Severity: [initial(iter_test_wound.severity)]") + //TEST_ASSERT_EQUAL(length(victim.all_wounds), 1, "Patient has more than one wound when only one is expected. Severity: [initial(iter_test_wound.severity)]") var/datum/wound/actual_wound = victim.all_wounds[1] TEST_ASSERT_EQUAL(actual_wound.type, iter_test_wound, "Patient has wound of incorrect severity. Expected: [initial(iter_test_wound.name)] Got: [actual_wound]") threshold_penalty = actual_wound.threshold_penalty @@ -50,36 +51,39 @@ var/i = 1 var/list/iter_test_wound_list - victim.dna.species.species_traits &= HAS_FLESH // take away the base human's flesh (ouchie!) ((not actually ouchie, this just affects their wounds and dismemberment handling)) + tested_part.biological_state &= ~BIO_FLESH // take away the base limb's flesh (ouchie!) ((not actually ouchie, this just affects their wounds and dismemberment handling)) - for(iter_test_wound_list in list(list(/datum/wound/blunt/moderate, /datum/wound/blunt/severe),\ - list(/datum/wound/slash/moderate, /datum/wound/slash/critical),\ - list(/datum/wound/pierce/moderate, /datum/wound/pierce/severe),\ - list(/datum/wound/burn/moderate, /datum/wound/burn/severe))) + for(iter_test_wound_list in list(list(/datum/wound/blunt/bone/moderate, /datum/wound/blunt/bone/severe, /datum/wound/blunt/bone/critical),\ + list(/datum/wound/slash/flesh/moderate, /datum/wound/slash/flesh/severe, /datum/wound/slash/flesh/critical),\ + list(/datum/wound/pierce/bleed/moderate, /datum/wound/pierce/bleed/severe, /datum/wound/pierce/bleed/critical),\ + list(/datum/wound/burn/flesh/moderate, /datum/wound/burn/flesh/severe, /datum/wound/burn/flesh/critical))) TEST_ASSERT_EQUAL(length(victim.all_wounds), 0, "Patient is somehow wounded before test") var/datum/wound/iter_test_wound + var/datum/wound_pregen_data/iter_pregen_data = SSwounds.pregen_data[iter_test_wound] var/threshold_penalty = 0 for(iter_test_wound in iter_test_wound_list) - var/threshold = initial(iter_test_wound.threshold_minimum) - threshold_penalty // just enough to guarantee the next tier of wound, given the existing wound threshold penalty + var/threshold = iter_pregen_data.threshold_minimum - threshold_penalty // just enough to guarantee the next tier of wound, given the existing wound threshold penalty if(dam_types[i] == BRUTE) tested_part.receive_damage(WOUND_MINIMUM_DAMAGE, 0, wound_bonus = threshold, sharpness=sharps[i]) else if(dam_types[i] == BURN) tested_part.receive_damage(0, WOUND_MINIMUM_DAMAGE, wound_bonus = threshold, sharpness=sharps[i]) // so if we just tried to deal a flesh wound, make sure we didn't actually suffer it. We may have suffered a bone wound instead, but we just want to make sure we don't have a flesh wound - if(initial(iter_test_wound.wound_flags) & FLESH_WOUND) + var/datum/wound_pregen_data/pregen_data = SSwounds.pregen_data[iter_test_wound] + if (pregen_data.required_limb_biostate & BIO_FLESH) if(!length(victim.all_wounds)) // not having a wound is good news continue else // we have to check that it's actually a bone wound and not the intended wound type - TEST_ASSERT_EQUAL(length(victim.all_wounds), 1, "Patient has more than one wound when only one is expected. Severity: [initial(iter_test_wound.severity)]") + //TEST_ASSERT_EQUAL(length(victim.all_wounds), 1, "Patient has more than one wound when only one is expected. Severity: [initial(iter_test_wound.severity)]") var/datum/wound/actual_wound = victim.all_wounds[1] - TEST_ASSERT((actual_wound.wound_flags & ~FLESH_WOUND), "Patient has flesh wound despite no HAS_FLESH flag, expected either no wound or bone wound. Offending wound: [actual_wound]") + var/datum/wound_pregen_data/actual_pregen_data = SSwounds.pregen_data[actual_wound.type] + TEST_ASSERT((actual_pregen_data.required_limb_biostate & ~BIO_FLESH), "Limb has flesh wound despite no BIO_FLESH biological_state, expected either no wound or bone wound. Offending wound: [actual_wound]") threshold_penalty = actual_wound.threshold_penalty else // otherwise if it's a bone wound, check that we have it per usual TEST_ASSERT(length(victim.all_wounds), "Patient has no wounds when one wound is expected. Severity: [initial(iter_test_wound.severity)]") - TEST_ASSERT_EQUAL(length(victim.all_wounds), 1, "Patient has more than one wound when only one is expected. Severity: [initial(iter_test_wound.severity)]") + //TEST_ASSERT_EQUAL(length(victim.all_wounds), 1, "Patient has more than one wound when only one is expected. Severity: [initial(iter_test_wound.severity)]") var/datum/wound/actual_wound = victim.all_wounds[1] TEST_ASSERT_EQUAL(actual_wound.type, iter_test_wound, "Patient has wound of incorrect severity. Expected: [initial(iter_test_wound.name)] Got: [actual_wound]") threshold_penalty = actual_wound.threshold_penalty diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 83b3c06a475..253c56eede4 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -548,11 +548,9 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C squish_part = C.bodyparts[zone] if(!squish_part) continue - if(IS_ORGANIC_LIMB(squish_part)) - var/type_wound = pick(list(/datum/wound/blunt/severe, /datum/wound/blunt/moderate)) - squish_part.force_wound_upwards(type_wound) - else - squish_part.receive_damage(brute=30) + var/severity = pick(WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_SEVERE, WOUND_SEVERITY_CRITICAL) + if(!C.cause_wound_of_type_and_severity(WOUND_BLUNT, squish_part, severity, wound_source = "crushed by [src]")) + squish_part.receive_damage(brute = 30) C.visible_message( span_userdanger("[C]'s body is maimed underneath the mass of [src]!"), span_userdanger("Your body is maimed underneath the mass of [src]!"), diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index b28743e7f3b..5302db333c9 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -87,7 +87,6 @@ /obj/item/clothing/head/helmet/roman/fake = 1, /obj/item/clothing/head/helmet/roman/legionnaire/fake = 1, /obj/item/clothing/under/costume/roman = 1, - /obj/item/shield/riot/roman/fake = 1, /obj/item/skub = 1) refill_canister = /obj/item/vending_refill/autodrobe default_price = 90 diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm index 5dc87ed2c80..c4c26507e7d 100644 --- a/code/modules/vending/boozeomat.dm +++ b/code/modules/vending/boozeomat.dm @@ -36,6 +36,7 @@ /obj/item/reagent_containers/food/drinks/coffee = 8, /obj/item/reagent_containers/food/drinks/ale = 6, /obj/item/reagent_containers/food/drinks/beer = 8, + /obj/item/reagent_containers/food/drinks/mead = 8, /obj/item/reagent_containers/food/drinks/bottle/gin = 5, /obj/item/reagent_containers/food/drinks/bottle/whiskey = 5, /obj/item/reagent_containers/food/drinks/bottle/tequila = 5, diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm index c93fca3db9d..5e04bdf93eb 100644 --- a/code/modules/vending/medical_wall.dm +++ b/code/modules/vending/medical_wall.dm @@ -28,6 +28,7 @@ /obj/item/reagent_containers/hypospray/medipen/psicodine = 6, /obj/item/reagent_containers/hypospray/medipen/synap = 6, /obj/item/reagent_containers/hypospray/medipen/mannitol = 10, + /obj/item/reagent_containers/hypospray/medipen/neurine = 6, /obj/item/reagent_containers/hypospray/medipen/cureall = 6, /obj/item/reagent_containers/hypospray/medipen/tramal = 6, /obj/item/reagent_containers/hypospray/medipen/antihol = 10, @@ -41,6 +42,8 @@ /obj/item/reagent_containers/medigel/hadrakine = 3, /obj/item/reagent_containers/medigel/quardexane = 3, /obj/item/storage/pill_bottle/stardrop = 5, + /obj/item/storage/pill_bottle/rcyte = 5, + /obj/item/inhaler/sting = 5, ) /obj/item/vending_refill/wallmed diff --git a/config/game_options.txt b/config/game_options.txt index 20aa8120187..74e76ce5b69 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -397,7 +397,7 @@ ROUNDSTART_RACES yeosa ## Races that are better than humans in some ways, but worse in others ROUNDSTART_RACES elzuose -ROUNDSTART_RACES jelly +#ROUNDSTART_RACES jelly #ROUNDSTART_RACES golem #ROUNDSTART_RACES adamantine #ROUNDSTART_RACES plasma diff --git a/html/changelogs/AutoChangeLog-pr-5914.yml b/html/changelogs/AutoChangeLog-pr-5914.yml new file mode 100644 index 00000000000..719aba7c6d4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5914.yml @@ -0,0 +1,5 @@ +author: SapphicOverload +changes: + - {bugfix: Fixed Gorlex Hardliners receiving a 0.3% discount on cloaking + devices instead of 30%} +delete-after: true diff --git a/html/changelogs/archive/2026-02.yml b/html/changelogs/archive/2026-02.yml new file mode 100644 index 00000000000..fcc9ad1c55a --- /dev/null +++ b/html/changelogs/archive/2026-02.yml @@ -0,0 +1,126 @@ +2026-02-02: + SapphicOverload: + - rscadd: Added several new wound types for robotic limbs. + - balance: Fire stacks now apply wounds normally instead of instantly applying the + highest one possible. + - code_imp: Multiple wound types can be rolled for and applied simultaneously. + - code_imp: Burn damage weapons can now apply slash/pierce wounds with the correct + sharpness. + - bugfix: Fixed IPCs taking far more damage in crit than intended. + firebudgy: + - balance: APC Control Console removed from all player-facing environments. + thearbiber: + - rscadd: resprites nightvision +2026-02-03: + firebudgy: + - code_imp: Description change of the Plump Helmet Mushroom +2026-02-04: + firebudgy: + - bugfix: Navy Patrol Cap now has side states for Vox. + thearbiber: + - bugfix: syndicate engi suit sprite + - rscadd: digi sprites for old bloodred +2026-02-06: + Erikafox: + - bugfix: no minors +2026-02-08: + thearbiber: + - rscadd: infiltrator hardsuit + - rscadd: ramzi officer coat resprite, mantles + - rscadd: heavy mining suit resprite + - rscadd: resprites unkept/pixie, adds rat tail/longhair half + thearbiber, generalthrax: + - rscadd: Added HP Pyre, a .45-70 Lever Action Rifle, for 3000 credits. Can be loaded + with stripper clips + - balance: Replaced one Illestren on the Elder with an HP Pyre Factory +2026-02-10: + Erikafox: + - bugfix: If you are smoking with a helmet on, you will no longer make smoke clouds. + It is advised that anyone wishing to smoke indoors get an EVA helmet on in the + future. + - rscadd: You can now alt-click on some magazines to quickly empty the entire thing + - bugfix: Certain ammo types should no longer stack to odd amounts + - bugfix: Ammo boxes now rename themselves on reskin + zimon9: + - bugfix: decreased the layer that drills render at +2026-02-11: + zimon9: + - balance: made shuttlegibbing nicer + - balance: chop chop chop off weapon stocks with a hatchet +2026-02-12: + Addust: + - bugfix: After a several-hour fax exchange, Hardline have replaced the headsets + provided to Karst-class dropships and started installing light switches in the + canteen airlocks of Kali Andhi-class destroyers. + Cluckinawesome, thearbiber: + - rscadd: Added the Heavy Shield + - rscdel: Removed Goliath shield, Roman shield (real and fake), Riot shield, Spiked + riot shield, Flash riot shield + - balance: Lightly touched telescopic shield's stats to make it a little weaker + - imageadd: updated the sprites used for the telescopic shield and the new sprites + for the heavy shield + - imagedel: deleted the Goliath shield, Roman shield (real and fake), Riot shield, + Spiked riot shield, Flash riot shield, + - code_imp: Updated shields to not all use plasteel, each now has a respective material + that is used in repair + Ical92: + - bugfix: adds missing manufacturers for Lyra and Sojourner + generalthrax: + - bugfix: Fixed some bad decals on Moonbase + - bugfix: Elite DMR in command post now fires from their position instead of walking + into the wall + thearbiber: + - rscadd: remaps rustbase + thgvr: + - balance: You can no longer revive corpses without a ckey (npc bodies, DNR players) + zimon9: + - rscadd: Added the number of dogtags required for a particular dogtag case to be + filled +2026-02-13: + DIB-DOG: + - rscadd: Added miscelaneous idie snouted and digi sprites + Erikafox: + - balance: Typhon disabled pending remap + - balance: The plasmacutter has been reworked! + - rscadd: Sting and Cytodron, two outpostmed exclusive chems with minor buffs. + - rscadd: shoalmix inhaler to black market. + - bugfix: burn kits will have patches in them again + - bugfix: Polypyrylium Oligomers causing more bloodloss than intended + zimon9: + - rscadd: Added the ability to change IPC eye colors in-round + - refactor: tank alert code modified to reduce pointless operations, updates more + rapidly +2026-02-14: + Erikafox: + - bugfix: you can now revive people again + SapphicOverload: + - bugfix: Fixed a runtime error when clicking on paper with an item that has no + writing implement properties. +2026-02-17: + Ical92: + - bugfix: glasses of vimukti no longer reference an icon that doesn't exist + KOCMODECAHTHUK: + - rscadd: Refresh animation for All-In-One Grinder + generalthrax: + - bugfix: You can now actually get mead +2026-02-18: + PositiveEntropy: + - imageadd: Prettier bureaucratic supplies have been added to offices all over the + frontier! +2026-02-19: + KOCMODECAHTHUK: + - bugfix: Fixes movement keys being stuck + SapphicOverload: + - rscadd: Added ship cloaking devices. + - rscadd: The Leyak-class Covert Frigate is now equipped with a cloaking system. + - rscadd: Hiding in a nebula obscures ships from long-range sensors. +2026-02-20: + SapphicOverload: + - rscdel: Removed "Goebbles" from the list of random last names +2026-02-21: + SapphicOverload: + - rscadd: Returns Zohilan as a selectable language + - spellcheck: Zohilan + meemofcourse: + - rscadd: League Zohilian + - rscdel: Zohilian is no longer a roundstart language diff --git a/icons/effects/mapping/mapping_helpers.dmi b/icons/effects/mapping/mapping_helpers.dmi index 9b15aec3d03..3ec619aef8b 100644 Binary files a/icons/effects/mapping/mapping_helpers.dmi and b/icons/effects/mapping/mapping_helpers.dmi differ diff --git a/icons/misc/language.dmi b/icons/misc/language.dmi index c6ced0ec683..b519b0eb8ed 100644 Binary files a/icons/misc/language.dmi and b/icons/misc/language.dmi differ diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index 1abe6f945ac..9aa3d409377 100644 Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index 798a35ed597..b6768df7eaa 100644 Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ diff --git a/icons/mob/clothing/eyes/eyes.dmi b/icons/mob/clothing/eyes/eyes.dmi index a9c1752cd1b..ba72b300b18 100644 Binary files a/icons/mob/clothing/eyes/eyes.dmi and b/icons/mob/clothing/eyes/eyes.dmi differ diff --git a/icons/mob/clothing/faction/ramzi/head.dmi b/icons/mob/clothing/faction/ramzi/head.dmi index 2789090b62b..64f86d245aa 100644 Binary files a/icons/mob/clothing/faction/ramzi/head.dmi and b/icons/mob/clothing/faction/ramzi/head.dmi differ diff --git a/icons/mob/clothing/faction/ramzi/suits.dmi b/icons/mob/clothing/faction/ramzi/suits.dmi index ad786252757..5d4bfc4a294 100644 Binary files a/icons/mob/clothing/faction/ramzi/suits.dmi and b/icons/mob/clothing/faction/ramzi/suits.dmi differ diff --git a/icons/mob/clothing/head/spacesuits.dmi b/icons/mob/clothing/head/spacesuits.dmi index f03b6e98eb8..a19f6f37bc9 100644 Binary files a/icons/mob/clothing/head/spacesuits.dmi and b/icons/mob/clothing/head/spacesuits.dmi differ diff --git a/icons/mob/clothing/helmet_overlays.dmi b/icons/mob/clothing/helmet_overlays.dmi index 94929322897..57a7f968502 100644 Binary files a/icons/mob/clothing/helmet_overlays.dmi and b/icons/mob/clothing/helmet_overlays.dmi differ diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index 03abed57d7f..8dc0cc19d45 100644 Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ diff --git a/icons/mob/clothing/suits/spacesuits.dmi b/icons/mob/clothing/suits/spacesuits.dmi index a76452b4d05..441c865122d 100644 Binary files a/icons/mob/clothing/suits/spacesuits.dmi and b/icons/mob/clothing/suits/spacesuits.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index e9ba3a81929..8843fffc06f 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/inhands/equipment/shields_lefthand.dmi b/icons/mob/inhands/equipment/shields_lefthand.dmi index aceeee6bcb4..a68578cc47a 100644 Binary files a/icons/mob/inhands/equipment/shields_lefthand.dmi and b/icons/mob/inhands/equipment/shields_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/shields_righthand.dmi b/icons/mob/inhands/equipment/shields_righthand.dmi index 8c106cb8254..8d2bd44e64a 100644 Binary files a/icons/mob/inhands/equipment/shields_righthand.dmi and b/icons/mob/inhands/equipment/shields_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/melee_lefthand.dmi b/icons/mob/inhands/weapons/melee_lefthand.dmi index db1d2db8f13..a2aa1f774e7 100644 Binary files a/icons/mob/inhands/weapons/melee_lefthand.dmi and b/icons/mob/inhands/weapons/melee_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/melee_righthand.dmi b/icons/mob/inhands/weapons/melee_righthand.dmi index 31f4279d8fb..8f3d31cece0 100644 Binary files a/icons/mob/inhands/weapons/melee_righthand.dmi and b/icons/mob/inhands/weapons/melee_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/plasmacutter_left.dmi b/icons/mob/inhands/weapons/plasmacutter_left.dmi new file mode 100644 index 00000000000..78c25bd14ae Binary files /dev/null and b/icons/mob/inhands/weapons/plasmacutter_left.dmi differ diff --git a/icons/mob/inhands/weapons/plasmacutter_right.dmi b/icons/mob/inhands/weapons/plasmacutter_right.dmi new file mode 100644 index 00000000000..12725f36c00 Binary files /dev/null and b/icons/mob/inhands/weapons/plasmacutter_right.dmi differ diff --git a/icons/mob/species/misc/digitigrade_suits.dmi b/icons/mob/species/misc/digitigrade_suits.dmi index d0be30334c3..7117a4d11ce 100644 Binary files a/icons/mob/species/misc/digitigrade_suits.dmi and b/icons/mob/species/misc/digitigrade_suits.dmi differ diff --git a/icons/mob/species/vox/onmob_head_vox.dmi b/icons/mob/species/vox/onmob_head_vox.dmi index 288bafd9334..1f357737fda 100644 Binary files a/icons/mob/species/vox/onmob_head_vox.dmi and b/icons/mob/species/vox/onmob_head_vox.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index 2bc2a7ea389..7ff0900443b 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index f4f6e2d25cf..51e91ad86fa 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/eyes/eyes.dmi b/icons/obj/clothing/eyes/eyes.dmi index 61f051bdb64..0dcdb32771b 100644 Binary files a/icons/obj/clothing/eyes/eyes.dmi and b/icons/obj/clothing/eyes/eyes.dmi differ diff --git a/icons/obj/clothing/faction/ramzi/head.dmi b/icons/obj/clothing/faction/ramzi/head.dmi index 8fcff003c5d..58d56f16634 100644 Binary files a/icons/obj/clothing/faction/ramzi/head.dmi and b/icons/obj/clothing/faction/ramzi/head.dmi differ diff --git a/icons/obj/clothing/faction/ramzi/suits.dmi b/icons/obj/clothing/faction/ramzi/suits.dmi index 6830049db75..7b94e792121 100644 Binary files a/icons/obj/clothing/faction/ramzi/suits.dmi and b/icons/obj/clothing/faction/ramzi/suits.dmi differ diff --git a/icons/obj/clothing/head/spacesuits.dmi b/icons/obj/clothing/head/spacesuits.dmi index cb9efc8abc8..83e3f4fbb18 100644 Binary files a/icons/obj/clothing/head/spacesuits.dmi and b/icons/obj/clothing/head/spacesuits.dmi differ diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi index 64c28ff3141..b3ec291f6b7 100644 Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ diff --git a/icons/obj/clothing/suits/spacesuits.dmi b/icons/obj/clothing/suits/spacesuits.dmi index fdc5408f12a..9508e08ca31 100644 Binary files a/icons/obj/clothing/suits/spacesuits.dmi and b/icons/obj/clothing/suits/spacesuits.dmi differ diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi index cdd1f737196..5ea15631d5a 100644 Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ diff --git a/icons/obj/guns/attachments.dmi b/icons/obj/guns/attachments.dmi index 23be21843da..25d88541db5 100644 Binary files a/icons/obj/guns/attachments.dmi and b/icons/obj/guns/attachments.dmi differ diff --git a/icons/obj/guns/manufacturer/hunterspride/48x32.dmi b/icons/obj/guns/manufacturer/hunterspride/48x32.dmi index 5d901936153..9269da9c6e2 100644 Binary files a/icons/obj/guns/manufacturer/hunterspride/48x32.dmi and b/icons/obj/guns/manufacturer/hunterspride/48x32.dmi differ diff --git a/icons/obj/guns/manufacturer/hunterspride/lefthand.dmi b/icons/obj/guns/manufacturer/hunterspride/lefthand.dmi index 70598328e39..ff7949068df 100644 Binary files a/icons/obj/guns/manufacturer/hunterspride/lefthand.dmi and b/icons/obj/guns/manufacturer/hunterspride/lefthand.dmi differ diff --git a/icons/obj/guns/manufacturer/hunterspride/onmob.dmi b/icons/obj/guns/manufacturer/hunterspride/onmob.dmi index b1bdb217735..fb108949fd1 100644 Binary files a/icons/obj/guns/manufacturer/hunterspride/onmob.dmi and b/icons/obj/guns/manufacturer/hunterspride/onmob.dmi differ diff --git a/icons/obj/guns/manufacturer/hunterspride/righthand.dmi b/icons/obj/guns/manufacturer/hunterspride/righthand.dmi index f09141badcf..7e31229abe2 100644 Binary files a/icons/obj/guns/manufacturer/hunterspride/righthand.dmi and b/icons/obj/guns/manufacturer/hunterspride/righthand.dmi differ diff --git a/icons/obj/projectiles_impact.dmi b/icons/obj/projectiles_impact.dmi index 575a5e1c569..f4006d0b02a 100644 Binary files a/icons/obj/projectiles_impact.dmi and b/icons/obj/projectiles_impact.dmi differ diff --git a/icons/obj/projectiles_muzzle.dmi b/icons/obj/projectiles_muzzle.dmi index afce0784edf..d6266fd876e 100644 Binary files a/icons/obj/projectiles_muzzle.dmi and b/icons/obj/projectiles_muzzle.dmi differ diff --git a/icons/obj/projectiles_tracer.dmi b/icons/obj/projectiles_tracer.dmi index d7d0147747f..3e9cd8da0d4 100644 Binary files a/icons/obj/projectiles_tracer.dmi and b/icons/obj/projectiles_tracer.dmi differ diff --git a/icons/obj/shields.dmi b/icons/obj/shields.dmi index b9c30b7c5cc..64b89069781 100644 Binary files a/icons/obj/shields.dmi and b/icons/obj/shields.dmi differ diff --git a/icons/obj/syringe.dmi b/icons/obj/syringe.dmi index ab07fb775a0..b3f20b9c734 100644 Binary files a/icons/obj/syringe.dmi and b/icons/obj/syringe.dmi differ diff --git a/icons/obj/weapon/blunt.dmi b/icons/obj/weapon/blunt.dmi index 199d2b70f13..6d652dd864a 100644 Binary files a/icons/obj/weapon/blunt.dmi and b/icons/obj/weapon/blunt.dmi differ diff --git a/icons/obj/weapon/plasmacutter.dmi b/icons/obj/weapon/plasmacutter.dmi new file mode 100644 index 00000000000..c0480dc5052 Binary files /dev/null and b/icons/obj/weapon/plasmacutter.dmi differ diff --git a/icons/paper_graphics/food/bread.png b/icons/paper_graphics/food/bread.png new file mode 100644 index 00000000000..e6c438a593b Binary files /dev/null and b/icons/paper_graphics/food/bread.png differ diff --git a/icons/paper_graphics/food/cloth.png b/icons/paper_graphics/food/cloth.png new file mode 100644 index 00000000000..1f56e25cc19 Binary files /dev/null and b/icons/paper_graphics/food/cloth.png differ diff --git a/icons/paper_graphics/food/cooked_meat.png b/icons/paper_graphics/food/cooked_meat.png new file mode 100644 index 00000000000..c54e16fe3b9 Binary files /dev/null and b/icons/paper_graphics/food/cooked_meat.png differ diff --git a/icons/paper_graphics/food/dairy.png b/icons/paper_graphics/food/dairy.png new file mode 100644 index 00000000000..6437bff8c60 Binary files /dev/null and b/icons/paper_graphics/food/dairy.png differ diff --git a/icons/paper_graphics/food/fried.png b/icons/paper_graphics/food/fried.png new file mode 100644 index 00000000000..24b9afaf711 Binary files /dev/null and b/icons/paper_graphics/food/fried.png differ diff --git a/icons/paper_graphics/food/fruit.png b/icons/paper_graphics/food/fruit.png new file mode 100644 index 00000000000..91b8ac62078 Binary files /dev/null and b/icons/paper_graphics/food/fruit.png differ diff --git a/icons/paper_graphics/food/raw_meat.png b/icons/paper_graphics/food/raw_meat.png new file mode 100644 index 00000000000..a5416f298ab Binary files /dev/null and b/icons/paper_graphics/food/raw_meat.png differ diff --git a/icons/paper_graphics/food/vegetable.png b/icons/paper_graphics/food/vegetable.png new file mode 100644 index 00000000000..34f7a8d9622 Binary files /dev/null and b/icons/paper_graphics/food/vegetable.png differ diff --git a/icons/stamp_icons/font.png b/icons/paper_graphics/stamps/font.png similarity index 100% rename from icons/stamp_icons/font.png rename to icons/paper_graphics/stamps/font.png diff --git a/icons/stamp_icons/large_stamp-biodynamics.png b/icons/paper_graphics/stamps/large_stamp-biodynamics.png similarity index 100% rename from icons/stamp_icons/large_stamp-biodynamics.png rename to icons/paper_graphics/stamps/large_stamp-biodynamics.png diff --git a/icons/stamp_icons/large_stamp-cap.png b/icons/paper_graphics/stamps/large_stamp-cap.png similarity index 100% rename from icons/stamp_icons/large_stamp-cap.png rename to icons/paper_graphics/stamps/large_stamp-cap.png diff --git a/icons/stamp_icons/large_stamp-ce.png b/icons/paper_graphics/stamps/large_stamp-ce.png similarity index 100% rename from icons/stamp_icons/large_stamp-ce.png rename to icons/paper_graphics/stamps/large_stamp-ce.png diff --git a/icons/stamp_icons/large_stamp-chap.png b/icons/paper_graphics/stamps/large_stamp-chap.png similarity index 100% rename from icons/stamp_icons/large_stamp-chap.png rename to icons/paper_graphics/stamps/large_stamp-chap.png diff --git a/icons/stamp_icons/large_stamp-clip.png b/icons/paper_graphics/stamps/large_stamp-clip.png similarity index 100% rename from icons/stamp_icons/large_stamp-clip.png rename to icons/paper_graphics/stamps/large_stamp-clip.png diff --git a/icons/stamp_icons/large_stamp-clip_bard.png b/icons/paper_graphics/stamps/large_stamp-clip_bard.png similarity index 100% rename from icons/stamp_icons/large_stamp-clip_bard.png rename to icons/paper_graphics/stamps/large_stamp-clip_bard.png diff --git a/icons/stamp_icons/large_stamp-clip_cmm.png b/icons/paper_graphics/stamps/large_stamp-clip_cmm.png similarity index 100% rename from icons/stamp_icons/large_stamp-clip_cmm.png rename to icons/paper_graphics/stamps/large_stamp-clip_cmm.png diff --git a/icons/stamp_icons/large_stamp-clip_deed.png b/icons/paper_graphics/stamps/large_stamp-clip_deed.png similarity index 100% rename from icons/stamp_icons/large_stamp-clip_deed.png rename to icons/paper_graphics/stamps/large_stamp-clip_deed.png diff --git a/icons/stamp_icons/large_stamp-clip_gold.png b/icons/paper_graphics/stamps/large_stamp-clip_gold.png similarity index 100% rename from icons/stamp_icons/large_stamp-clip_gold.png rename to icons/paper_graphics/stamps/large_stamp-clip_gold.png diff --git a/icons/stamp_icons/large_stamp-clip_land.png b/icons/paper_graphics/stamps/large_stamp-clip_land.png similarity index 100% rename from icons/stamp_icons/large_stamp-clip_land.png rename to icons/paper_graphics/stamps/large_stamp-clip_land.png diff --git a/icons/stamp_icons/large_stamp-clip_lord.png b/icons/paper_graphics/stamps/large_stamp-clip_lord.png similarity index 100% rename from icons/stamp_icons/large_stamp-clip_lord.png rename to icons/paper_graphics/stamps/large_stamp-clip_lord.png diff --git a/icons/stamp_icons/large_stamp-clip_meld.png b/icons/paper_graphics/stamps/large_stamp-clip_meld.png similarity index 100% rename from icons/stamp_icons/large_stamp-clip_meld.png rename to icons/paper_graphics/stamps/large_stamp-clip_meld.png diff --git a/icons/stamp_icons/large_stamp-cmo.png b/icons/paper_graphics/stamps/large_stamp-cmo.png similarity index 100% rename from icons/stamp_icons/large_stamp-cmo.png rename to icons/paper_graphics/stamps/large_stamp-cmo.png diff --git a/icons/stamp_icons/large_stamp-cybersun.png b/icons/paper_graphics/stamps/large_stamp-cybersun.png similarity index 100% rename from icons/stamp_icons/large_stamp-cybersun.png rename to icons/paper_graphics/stamps/large_stamp-cybersun.png diff --git a/icons/stamp_icons/large_stamp-deny.png b/icons/paper_graphics/stamps/large_stamp-deny.png similarity index 100% rename from icons/stamp_icons/large_stamp-deny.png rename to icons/paper_graphics/stamps/large_stamp-deny.png diff --git a/icons/stamp_icons/large_stamp-donk.png b/icons/paper_graphics/stamps/large_stamp-donk.png similarity index 100% rename from icons/stamp_icons/large_stamp-donk.png rename to icons/paper_graphics/stamps/large_stamp-donk.png diff --git a/icons/stamp_icons/large_stamp-fo.png b/icons/paper_graphics/stamps/large_stamp-fo.png similarity index 100% rename from icons/stamp_icons/large_stamp-fo.png rename to icons/paper_graphics/stamps/large_stamp-fo.png diff --git a/icons/stamp_icons/large_stamp-hardliners.png b/icons/paper_graphics/stamps/large_stamp-hardliners.png similarity index 100% rename from icons/stamp_icons/large_stamp-hardliners.png rename to icons/paper_graphics/stamps/large_stamp-hardliners.png diff --git a/icons/stamp_icons/large_stamp-hos.png b/icons/paper_graphics/stamps/large_stamp-hos.png similarity index 100% rename from icons/stamp_icons/large_stamp-hos.png rename to icons/paper_graphics/stamps/large_stamp-hos.png diff --git a/icons/stamp_icons/large_stamp-inteq.png b/icons/paper_graphics/stamps/large_stamp-inteq.png similarity index 100% rename from icons/stamp_icons/large_stamp-inteq.png rename to icons/paper_graphics/stamps/large_stamp-inteq.png diff --git a/icons/stamp_icons/large_stamp-inteq_artificer.png b/icons/paper_graphics/stamps/large_stamp-inteq_artificer.png similarity index 100% rename from icons/stamp_icons/large_stamp-inteq_artificer.png rename to icons/paper_graphics/stamps/large_stamp-inteq_artificer.png diff --git a/icons/stamp_icons/large_stamp-inteq_corpsman.png b/icons/paper_graphics/stamps/large_stamp-inteq_corpsman.png similarity index 100% rename from icons/stamp_icons/large_stamp-inteq_corpsman.png rename to icons/paper_graphics/stamps/large_stamp-inteq_corpsman.png diff --git a/icons/stamp_icons/large_stamp-inteq_maa.png b/icons/paper_graphics/stamps/large_stamp-inteq_maa.png similarity index 100% rename from icons/stamp_icons/large_stamp-inteq_maa.png rename to icons/paper_graphics/stamps/large_stamp-inteq_maa.png diff --git a/icons/stamp_icons/large_stamp-inteq_vanguard.png b/icons/paper_graphics/stamps/large_stamp-inteq_vanguard.png similarity index 100% rename from icons/stamp_icons/large_stamp-inteq_vanguard.png rename to icons/paper_graphics/stamps/large_stamp-inteq_vanguard.png diff --git a/icons/stamp_icons/large_stamp-law.png b/icons/paper_graphics/stamps/large_stamp-law.png similarity index 100% rename from icons/stamp_icons/large_stamp-law.png rename to icons/paper_graphics/stamps/large_stamp-law.png diff --git a/icons/stamp_icons/large_stamp-ngr.png b/icons/paper_graphics/stamps/large_stamp-ngr.png similarity index 100% rename from icons/stamp_icons/large_stamp-ngr.png rename to icons/paper_graphics/stamps/large_stamp-ngr.png diff --git a/icons/stamp_icons/large_stamp-ngr_captain.png b/icons/paper_graphics/stamps/large_stamp-ngr_captain.png similarity index 100% rename from icons/stamp_icons/large_stamp-ngr_captain.png rename to icons/paper_graphics/stamps/large_stamp-ngr_captain.png diff --git a/icons/stamp_icons/large_stamp-ngr_ensign.png b/icons/paper_graphics/stamps/large_stamp-ngr_ensign.png similarity index 100% rename from icons/stamp_icons/large_stamp-ngr_ensign.png rename to icons/paper_graphics/stamps/large_stamp-ngr_ensign.png diff --git a/icons/stamp_icons/large_stamp-ngr_foreman.png b/icons/paper_graphics/stamps/large_stamp-ngr_foreman.png similarity index 100% rename from icons/stamp_icons/large_stamp-ngr_foreman.png rename to icons/paper_graphics/stamps/large_stamp-ngr_foreman.png diff --git a/icons/stamp_icons/large_stamp-ngr_lieutenant.png b/icons/paper_graphics/stamps/large_stamp-ngr_lieutenant.png similarity index 100% rename from icons/stamp_icons/large_stamp-ngr_lieutenant.png rename to icons/paper_graphics/stamps/large_stamp-ngr_lieutenant.png diff --git a/icons/stamp_icons/large_stamp-ns_captain.png b/icons/paper_graphics/stamps/large_stamp-ns_captain.png similarity index 100% rename from icons/stamp_icons/large_stamp-ns_captain.png rename to icons/paper_graphics/stamps/large_stamp-ns_captain.png diff --git a/icons/stamp_icons/large_stamp-ns_generic.png b/icons/paper_graphics/stamps/large_stamp-ns_generic.png similarity index 100% rename from icons/stamp_icons/large_stamp-ns_generic.png rename to icons/paper_graphics/stamps/large_stamp-ns_generic.png diff --git a/icons/stamp_icons/large_stamp-ns_sup_dir.png b/icons/paper_graphics/stamps/large_stamp-ns_sup_dir.png similarity index 100% rename from icons/stamp_icons/large_stamp-ns_sup_dir.png rename to icons/paper_graphics/stamps/large_stamp-ns_sup_dir.png diff --git a/icons/stamp_icons/large_stamp-nt_captain.png b/icons/paper_graphics/stamps/large_stamp-nt_captain.png similarity index 100% rename from icons/stamp_icons/large_stamp-nt_captain.png rename to icons/paper_graphics/stamps/large_stamp-nt_captain.png diff --git a/icons/stamp_icons/large_stamp-nt_central.png b/icons/paper_graphics/stamps/large_stamp-nt_central.png similarity index 100% rename from icons/stamp_icons/large_stamp-nt_central.png rename to icons/paper_graphics/stamps/large_stamp-nt_central.png diff --git a/icons/stamp_icons/large_stamp-nt_eng_dir.png b/icons/paper_graphics/stamps/large_stamp-nt_eng_dir.png similarity index 100% rename from icons/stamp_icons/large_stamp-nt_eng_dir.png rename to icons/paper_graphics/stamps/large_stamp-nt_eng_dir.png diff --git a/icons/stamp_icons/large_stamp-nt_generic.png b/icons/paper_graphics/stamps/large_stamp-nt_generic.png similarity index 100% rename from icons/stamp_icons/large_stamp-nt_generic.png rename to icons/paper_graphics/stamps/large_stamp-nt_generic.png diff --git a/icons/stamp_icons/large_stamp-nt_med_dir.png b/icons/paper_graphics/stamps/large_stamp-nt_med_dir.png similarity index 100% rename from icons/stamp_icons/large_stamp-nt_med_dir.png rename to icons/paper_graphics/stamps/large_stamp-nt_med_dir.png diff --git a/icons/stamp_icons/large_stamp-nt_officer.png b/icons/paper_graphics/stamps/large_stamp-nt_officer.png similarity index 100% rename from icons/stamp_icons/large_stamp-nt_officer.png rename to icons/paper_graphics/stamps/large_stamp-nt_officer.png diff --git a/icons/stamp_icons/large_stamp-nt_sci_dir.png b/icons/paper_graphics/stamps/large_stamp-nt_sci_dir.png similarity index 100% rename from icons/stamp_icons/large_stamp-nt_sci_dir.png rename to icons/paper_graphics/stamps/large_stamp-nt_sci_dir.png diff --git a/icons/stamp_icons/large_stamp-ok.png b/icons/paper_graphics/stamps/large_stamp-ok.png similarity index 100% rename from icons/stamp_icons/large_stamp-ok.png rename to icons/paper_graphics/stamps/large_stamp-ok.png diff --git a/icons/stamp_icons/large_stamp-qm.png b/icons/paper_graphics/stamps/large_stamp-qm.png similarity index 100% rename from icons/stamp_icons/large_stamp-qm.png rename to icons/paper_graphics/stamps/large_stamp-qm.png diff --git a/icons/stamp_icons/large_stamp-rd.png b/icons/paper_graphics/stamps/large_stamp-rd.png similarity index 100% rename from icons/stamp_icons/large_stamp-rd.png rename to icons/paper_graphics/stamps/large_stamp-rd.png diff --git a/icons/stamp_icons/large_stamp-solgov.png b/icons/paper_graphics/stamps/large_stamp-solgov.png similarity index 100% rename from icons/stamp_icons/large_stamp-solgov.png rename to icons/paper_graphics/stamps/large_stamp-solgov.png diff --git a/icons/stamp_icons/large_stamp-syndicate.png b/icons/paper_graphics/stamps/large_stamp-syndicate.png similarity index 100% rename from icons/stamp_icons/large_stamp-syndicate.png rename to icons/paper_graphics/stamps/large_stamp-syndicate.png diff --git a/icons/stamp_icons/large_stamp-vi_captain.png b/icons/paper_graphics/stamps/large_stamp-vi_captain.png similarity index 100% rename from icons/stamp_icons/large_stamp-vi_captain.png rename to icons/paper_graphics/stamps/large_stamp-vi_captain.png diff --git a/icons/stamp_icons/large_stamp-vi_generic.png b/icons/paper_graphics/stamps/large_stamp-vi_generic.png similarity index 100% rename from icons/stamp_icons/large_stamp-vi_generic.png rename to icons/paper_graphics/stamps/large_stamp-vi_generic.png diff --git a/icons/stamp_icons/large_stamp-vi_loss_prevention.png b/icons/paper_graphics/stamps/large_stamp-vi_loss_prevention.png similarity index 100% rename from icons/stamp_icons/large_stamp-vi_loss_prevention.png rename to icons/paper_graphics/stamps/large_stamp-vi_loss_prevention.png diff --git a/icons/stamp_icons/large_stamp-vi_sec_dir.png b/icons/paper_graphics/stamps/large_stamp-vi_sec_dir.png similarity index 100% rename from icons/stamp_icons/large_stamp-vi_sec_dir.png rename to icons/paper_graphics/stamps/large_stamp-vi_sec_dir.png diff --git a/icons/stamp_icons/large_stamp-void.png b/icons/paper_graphics/stamps/large_stamp-void.png similarity index 100% rename from icons/stamp_icons/large_stamp-void.png rename to icons/paper_graphics/stamps/large_stamp-void.png diff --git a/shiptest.dme b/shiptest.dme index bc80f6b98ea..6b6ca33e205 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -445,6 +445,7 @@ #include "code\controllers\subsystem\vis_overlays.dm" #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" +#include "code\controllers\subsystem\wounds.dm" #include "code\controllers\subsystem\processing\ai_basic_avoidance.dm" #include "code\controllers\subsystem\processing\ai_behaviors.dm" #include "code\controllers\subsystem\processing\ai_movement.dm" @@ -668,6 +669,7 @@ #include "code\datums\components\wearertargeting.dm" #include "code\datums\components\weatherannouncer.dm" #include "code\datums\components\wet_floor.dm" +#include "code\datums\components\writing.dm" #include "code\datums\components\crafting\crafting.dm" #include "code\datums\components\crafting\guncrafting.dm" #include "code\datums\components\crafting\recipes.dm" @@ -793,6 +795,7 @@ #include "code\datums\elements\point_of_interest.dm" #include "code\datums\elements\relay_attackers.dm" #include "code\datums\elements\renamemob.dm" +#include "code\datums\elements\robotic_heal.dm" #include "code\datums\elements\selfknockback.dm" #include "code\datums\elements\shatters_when_thrown.dm" #include "code\datums\elements\snail_crawl.dm" @@ -1014,13 +1017,18 @@ #include "code\datums\wires\syndicatebomb.dm" #include "code\datums\wires\tesla_coil.dm" #include "code\datums\wires\vending.dm" +#include "code\datums\wounds\_wound_static_data.dm" #include "code\datums\wounds\_wounds.dm" +#include "code\datums\wounds\blunt.dm" #include "code\datums\wounds\bones.dm" #include "code\datums\wounds\burns.dm" #include "code\datums\wounds\dismember.dm" #include "code\datums\wounds\muscle.dm" #include "code\datums\wounds\pierce.dm" #include "code\datums\wounds\slash.dm" +#include "code\datums\wounds\robotic\buckling.dm" +#include "code\datums\wounds\robotic\electrical.dm" +#include "code\datums\wounds\robotic\heat_warping.dm" #include "code\game\alternate_appearance.dm" #include "code\game\atoms.dm" #include "code\game\atoms_movable.dm" @@ -1574,6 +1582,7 @@ #include "code\game\objects\items\melee\energy.dm" #include "code\game\objects\items\melee\knife.dm" #include "code\game\objects\items\melee\melee.dm" +#include "code\game\objects\items\melee\plasma_cutter.dm" #include "code\game\objects\items\melee\powerfist.dm" #include "code\game\objects\items\melee\sabre.dm" #include "code\game\objects\items\melee\spear.dm" @@ -2185,6 +2194,7 @@ #include "code\modules\cargo\packs\medical.dm" #include "code\modules\cargo\packs\modsuits.dm" #include "code\modules\cargo\packs\sec_supply.dm" +#include "code\modules\cargo\packs\ship_hardware.dm" #include "code\modules\cargo\packs\spacesuits.dm" #include "code\modules\cargo\packs\telecomms.dm" #include "code\modules\cargo\packs\tools.dm" @@ -2591,6 +2601,7 @@ #include "code\modules\language\language.dm" #include "code\modules\language\language_holder.dm" #include "code\modules\language\language_menu.dm" +#include "code\modules\language\league_kalixcian.dm" #include "code\modules\language\machine.dm" #include "code\modules\language\moffic.dm" #include "code\modules\language\monkey.dm" @@ -2622,6 +2633,7 @@ #include "code\modules\mapping\reader.dm" #include "code\modules\mapping\verify.dm" #include "code\modules\mapping\writer.dm" +#include "code\modules\mapping\mapping_helpers\basic_mob.dm" #include "code\modules\mapping\space_management\multiz_helpers.dm" #include "code\modules\mapping\space_management\space_level.dm" #include "code\modules\mapping\space_management\traits.dm" @@ -2715,6 +2727,8 @@ #include "code\modules\mob\dead\new_player\sprite_accessories\tails.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\vox.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\wings.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\body\_body.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\body\ipc.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\underwear\underwear_legs.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\underwear\underwear_socks.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\underwear\underwear_torso.dm" @@ -3216,6 +3230,7 @@ #include "code\modules\power\apc.dm" #include "code\modules\power\cable.dm" #include "code\modules\power\cell.dm" +#include "code\modules\power\cloaking.dm" #include "code\modules\power\floodlight.dm" #include "code\modules\power\generator.dm" #include "code\modules\power\gravitygenerator.dm" @@ -3251,7 +3266,6 @@ #include "code\modules\projectiles\projectile.dm" #include "code\modules\projectiles\ammunition\_ammo_casing.dm" #include "code\modules\projectiles\ammunition\_firing.dm" -#include "code\modules\projectiles\ammunition\ballistic\lmg.dm" #include "code\modules\projectiles\ammunition\ballistic\pistol.dm" #include "code\modules\projectiles\ammunition\ballistic\revolver.dm" #include "code\modules\projectiles\ammunition\ballistic\rifle.dm" @@ -3280,7 +3294,6 @@ #include "code\modules\projectiles\boxes_magazines\ammo_stacks\_ammo_stack.dm" #include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\_premade_stacks.dm" #include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_gauss_stacks.dm" -#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_lmg_stacks.dm" #include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_misc_stacks.dm" #include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_pistol_stacks.dm" #include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_rifle_stacks.dm" @@ -3629,14 +3642,17 @@ #include "code\modules\surgery\blood_filter.dm" #include "code\modules\surgery\bone_fractures.dm" #include "code\modules\surgery\brain_surgery.dm" +#include "code\modules\surgery\buckling_repair.dm" #include "code\modules\surgery\cavity_implant.dm" #include "code\modules\surgery\coronary_bypass.dm" #include "code\modules\surgery\debride.dm" #include "code\modules\surgery\dental_implant.dm" +#include "code\modules\surgery\electrical_repair.dm" #include "code\modules\surgery\experimental_dissection.dm" #include "code\modules\surgery\eye_surgery.dm" #include "code\modules\surgery\gastrectomy.dm" #include "code\modules\surgery\healing.dm" +#include "code\modules\surgery\heatwarp_repair.dm" #include "code\modules\surgery\hepatectomy.dm" #include "code\modules\surgery\implant_removal.dm" #include "code\modules\surgery\ipc_revive.dm" diff --git a/sound/vehicles/cloak_activate.ogg b/sound/vehicles/cloak_activate.ogg new file mode 100644 index 00000000000..fc1e537408d Binary files /dev/null and b/sound/vehicles/cloak_activate.ogg differ diff --git a/sound/vehicles/cloak_deactivate.ogg b/sound/vehicles/cloak_deactivate.ogg new file mode 100644 index 00000000000..81cb88189ca Binary files /dev/null and b/sound/vehicles/cloak_deactivate.ogg differ diff --git a/sound/weapons/melee/plasmacutter/cutter_recharge.ogg b/sound/weapons/melee/plasmacutter/cutter_recharge.ogg new file mode 100644 index 00000000000..84bc0eda545 Binary files /dev/null and b/sound/weapons/melee/plasmacutter/cutter_recharge.ogg differ diff --git a/sound/weapons/melee/plasmacutter/plasma_cutter.ogg b/sound/weapons/melee/plasmacutter/plasma_cutter.ogg new file mode 100644 index 00000000000..0864e75e617 Binary files /dev/null and b/sound/weapons/melee/plasmacutter/plasma_cutter.ogg differ diff --git a/sound/weapons/melee/plasmacutter/plasma_cutter_melee.ogg b/sound/weapons/melee/plasmacutter/plasma_cutter_melee.ogg new file mode 100644 index 00000000000..3a50dfe2b34 Binary files /dev/null and b/sound/weapons/melee/plasmacutter/plasma_cutter_melee.ogg differ diff --git a/sound/weapons/plasma_cutter.ogg b/sound/weapons/plasma_cutter.ogg deleted file mode 100644 index 70fda591a14..00000000000 Binary files a/sound/weapons/plasma_cutter.ogg and /dev/null differ diff --git a/strings/names/last.txt b/strings/names/last.txt index 6796c7519e8..6e95b12f153 100644 --- a/strings/names/last.txt +++ b/strings/names/last.txt @@ -173,7 +173,6 @@ Garrison Gettemy Gibson Glover -Goebbles Goodman Graham Gray @@ -567,4 +566,4 @@ Zalack Zaun Zeal Zimmer -Zoucks \ No newline at end of file +Zoucks diff --git a/tgui/packages/tgui/events.ts b/tgui/packages/tgui/events.ts index 670f03e808b..9e9b96c3952 100644 --- a/tgui/packages/tgui/events.ts +++ b/tgui/packages/tgui/events.ts @@ -60,12 +60,14 @@ const stealFocus = (node: HTMLElement) => { releaseStolenFocus(); focusStolenBy = node; focusStolenBy.addEventListener('blur', releaseStolenFocus); + globalEvents.emit('input-focus'); }; const releaseStolenFocus = () => { if (focusStolenBy) { focusStolenBy.removeEventListener('blur', releaseStolenFocus); focusStolenBy = null; + globalEvents.emit('input-blur'); } }; @@ -117,27 +119,47 @@ window.addEventListener('mousemove', (e) => { // Focus event hooks // -------------------------------------------------------- -window.addEventListener('focusin', (e) => { - lastVisitedNode = null; - focusedNode = e.target as HTMLElement; +// Handle stealing focus for textbox elements +document.addEventListener( + 'focus', + (e) => { + // Window + if (!(e.target instanceof Element)) { + lastVisitedNode = null; + focusedNode = null; + return; + } + lastVisitedNode = null; + focusedNode = e.target as HTMLElement; + if (canStealFocus(e.target as HTMLElement)) { + stealFocus(e.target as HTMLElement); + } + }, + true +); + +// When we click on any element on the page, untrack the last +// visited node. +document.addEventListener( + 'blur', + () => { + lastVisitedNode = null; + }, + true +); + +window.addEventListener('focus', () => { setWindowFocus(true); - if (canStealFocus(e.target as HTMLElement)) { - stealFocus(e.target as HTMLElement); - return; - } -}); - -window.addEventListener('focusout', (e) => { - lastVisitedNode = null; - setWindowFocus(false, true); }); +// If we blur any element, the window may have unfocused if we didn't +// click on the background window.addEventListener('blur', (e) => { lastVisitedNode = null; setWindowFocus(false, true); }); -window.addEventListener('beforeunload', (e) => { +window.addEventListener('close', () => { setWindowFocus(false); }); diff --git a/tgui/packages/tgui/hotkeys.ts b/tgui/packages/tgui/hotkeys.ts index f7176bd0030..082be18ee19 100644 --- a/tgui/packages/tgui/hotkeys.ts +++ b/tgui/packages/tgui/hotkeys.ts @@ -185,6 +185,9 @@ export const setupHotKeys = () => { globalEvents.on('window-blur', () => { releaseHeldKeys(); }); + globalEvents.on('input-focus', () => { + releaseHeldKeys(); + }); globalEvents.on('key', (key: KeyEvent) => { for (const keyListener of keyListeners) { keyListener(key); diff --git a/tgui/packages/tgui/interfaces/CloakingDevice.tsx b/tgui/packages/tgui/interfaces/CloakingDevice.tsx new file mode 100644 index 00000000000..fb2991425f6 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CloakingDevice.tsx @@ -0,0 +1,94 @@ +import { useBackend } from '../backend'; +import { + Box, + Button, + LabeledList, + ProgressBar, + Section, + Slider, +} from '../components'; +import { formatSiUnit } from '../format'; +import { Window } from '../layouts'; + +type CloakingData = { + linked_ship: boolean; + cloak_active: boolean; + recharge_rate: number; + current_charge: number; + available_power: number; + power_consumption: number; + max_recharge_rate: number; + max_charge: number; + observer: boolean; +}; + +export const CloakingDevice = (props, context) => { + const { act, data } = useBackend(context); + const { + linked_ship, + cloak_active, + recharge_rate, + current_charge, + available_power, + power_consumption, + max_recharge_rate, + max_charge, + observer, + } = data; + const POWER_MUL = 1000; + + return ( + + +
act('toggle_cloak')} + > + {cloak_active ? 'Deactivate Cloaking' : 'Activate Cloaking'} + + } + > + + + + {formatSiUnit(current_charge, 1, 'J')} + + + + formatSiUnit(value * POWER_MUL, 1, 'W')} + onDrag={(e, value) => + act('set_charge_rate', { + target: value * POWER_MUL, + }) + } + /> + + + {formatSiUnit(power_consumption, 1, 'W')} + + +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/HelmConsole.js b/tgui/packages/tgui/interfaces/HelmConsole.js index 17c8c45c828..484242ae6bb 100644 --- a/tgui/packages/tgui/interfaces/HelmConsole.js +++ b/tgui/packages/tgui/interfaces/HelmConsole.js @@ -13,6 +13,7 @@ import { import { Window } from '../layouts'; import { Table } from '../components/Table'; import { decodeHtmlEntities } from 'common/string'; +import { toFixed } from '../../common/math'; export const HelmConsole = (_props, context) => { const { data } = useBackend(context); @@ -46,10 +47,47 @@ export const HelmConsole = (_props, context) => { const SharedContent = (_props, context) => { const { act, data } = useBackend(context); - const { isViewer, canRename, shipInfo = [], otherInfo = [] } = data; + const { + isViewer, + canRename, + cloaked, + cloakChargePercent, + hasCloaking, + shipInfo = [], + otherInfo = [], + } = data; return ( <> -
+
+