diff --git a/.gitignore b/.gitignore index c8e3ed4fac5..281548f93c4 100644 --- a/.gitignore +++ b/.gitignore @@ -180,3 +180,5 @@ Temporary Items .apdisk + +*.before \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3b76d0c2144..d0aeab0904c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -41,7 +41,7 @@ Maintainers can revert your changes if they feel they are not worth maintaining As mentioned before, you are expected to follow these specifications in order to make everyone's lives easier, it will also save you and us time, with having to make the changes and us having to tell you what to change. Thank you for reading this section. -###Object Oriented code +###Object Oriented code As BYOND's Dream Maker is an object oriented language, code must be object oriented when possible in order to be more flexible when adding content to it. If you are unfamiliar with this concept, it is highly recommended you look it up. ###All Byond paths must contain the full path. @@ -63,7 +63,7 @@ datum code proc2() code - + datum2 varname1 = 0 proc @@ -135,9 +135,20 @@ Copying code from one place to another maybe suitable for small short time proje Instead you can use object orientation, or simply placing repeated code in a function, to obey this specification easily. +###Startup/Runtime tradeoffs with lists and the "hidden" init proc +First, read the comments in this byond thread, starting here:http://www.byond.com/forum/?post=2086980&page=2#comment19776775 + +There are two key points here: + +1) Defining a list in the type definition incurs a hidden proc call - init, if you must define a list at startup, do so in New() and avoid the overhead of a second call (init() and then new()) + +2)Offsets list creation overhead to the point where the list is actually required (which for many objects, may be never at all). + +Remember, this tradeoff makes sense in many cases but not all, you should think carefully about your implementation before deciding if this is an appropriate thing to do + ###No magic numbers or strings Make these #defines with a name that more clearly states what it's for. - + ###Control statements: (if,while,for,etc) @@ -271,6 +282,9 @@ There is no strict process when it comes to merging pull requests, pull requests * If your pull request is accepted, the code you add no longer belongs exclusively to you but to everyone; everyone is free to work on it, but you are also free to object to any changes being made, which will be noted by a Project Lead or Project Manager. It is a shame this has to be explicitly said, but there have been cases where this would've saved some trouble. +## Banned content +Do not add any of the following in a Pull Request or risk getting the PR closed: + - National Socialist Party of Germany content, National Socialist Party of Germany related content, or National Socialist Party of Germany references ##A word on git Yes we know that the files have a tonne of mixed windows and linux line endings, attempts to fix this have been met with less than stellar success and as such we have decided to give up caring until such a time as it matters. diff --git a/README.md b/README.md index 6a4241a790f..4c13f6c78dc 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ ##/tg/station v1.0.1 -[![Build Status](https://travis-ci.org/tgstation/-tg-station.png)](https://travis-ci.org/tgstation/-tg-station) +[![Build Status](https://travis-ci.org/tgstation/tgstation.png)](https://travis-ci.org/tgstation/tgstation) **Website:** http://www.tgstation13.org
-**Code:** https://github.com/tgstation/-tg-station
+**Code:** https://github.com/tgstation/tgstation
**Wiki** http://tgstation13.org/wiki/Main_Page
**IRC:** irc://irc.rizon.net/coderbus or if you dont have an IRC client, you can click [here](https://kiwiirc.com/client/irc.rizon.net:6667/?&theme=cli#coderbus).
@@ -19,11 +19,11 @@ Follow this: http://www.tgstation13.org/wiki/Setting_up_git Option 2: Install GitHub::windows from http://windows.github.com/ It handles most of the setup and configuraton of Git for you. -Then you simply search for the -tg-station repository and click the big clone +Then you simply search for the tgstation repository and click the big clone button. Option 3: Download the source code as a zip by clicking the ZIP button in the -code tab of https://github.com/tgstation/-tg-station +code tab of https://github.com/tgstation/tgstation (note: this will use a lot of bandwidth if you wish to update and is a lot of hassle if you want to make any changes at all, so it's not recommended.) @@ -131,9 +131,9 @@ Please see [CONTRIBUTING.md](CONTRIBUTING.md) ##LICENSE -All code after commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST (https://github.com/tgstation/-tg-station/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under GNU AGPL v3 (http://www.gnu.org/licenses/agpl-3.0.html). +All code after commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST (https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under GNU AGPL v3 (http://www.gnu.org/licenses/agpl-3.0.html). -All code before commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST (https://github.com/tgstation/-tg-station/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under GNU GPL v3 (https://www.gnu.org/licenses/gpl-3.0.html). +All code before commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST (https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under GNU GPL v3 (https://www.gnu.org/licenses/gpl-3.0.html). (Including tools unless their readme specifies otherwise.) See LICENSE-AGPLv3.txt and LICENSE-GPLv3.txt for more details. diff --git a/_maps/RandomRuins/LavaRuins/lavaland_gym.dmm b/_maps/RandomRuins/LavaRuins/lavaland_gym.dmm deleted file mode 100644 index c6485f19bd7..00000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_gym.dmm +++ /dev/null @@ -1,53 +0,0 @@ -"a" = (/turf/closed/mineral/volcanic/lava_land_surface,/area/lavaland/surface/outdoors) -"b" = (/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"c" = (/turf/closed/wall/r_wall,/area/ruin/powered) -"d" = (/obj/structure/closet,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"e" = (/obj/structure/closet,/mob/living/simple_animal/hostile/zombie,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"f" = (/obj/structure/punching_bag,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"g" = (/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"h" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/item/weapon/shard{icon_state = "medium"},/mob/living/simple_animal/hostile/zombie/gymboss,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"i" = (/obj/structure/window{icon_state = "window";dir = 1},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"j" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/structure/window{icon_state = "window";dir = 4},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"k" = (/obj/effect/decal/cleanable/blood,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"l" = (/obj/structure/weightlifter,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"m" = (/obj/structure/window{icon_state = "window";dir = 8},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"n" = (/obj/structure/window{icon_state = "window";dir = 4},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"o" = (/obj/structure/stacklifter,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"p" = (/obj/structure/window,/obj/structure/window{icon_state = "window";dir = 8},/obj/effect/decal/cleanable/blood,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"q" = (/obj/structure/window,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"r" = (/obj/structure/window,/obj/item/weapon/shard,/mob/living/simple_animal/hostile/zombie/darkholme,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"s" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter4 (NORTH)";icon_state = "splatter4";dir = 1},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"t" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter6 (EAST)";icon_state = "splatter6";dir = 4},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (NORTH)";icon_state = "tracks";dir = 1},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-gib3";icon_state = "gib3"},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"u" = (/obj/machinery/door/airlock/external,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"v" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (EAST)";icon_state = "tracks";dir = 4},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (NORTHEAST)";icon_state = "tracks";dir = 5},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"w" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (EAST)";icon_state = "tracks";dir = 4},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (SOUTHEAST)";icon_state = "tracks";dir = 6},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"x" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter5";icon_state = "splatter5"},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (EAST)";icon_state = "tracks";dir = 4},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"y" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter4 (NORTH)";icon_state = "splatter4";dir = 1},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter6 (NORTH)";icon_state = "splatter6";dir = 1},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"z" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter5";icon_state = "splatter5"},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"A" = (/mob/living/simple_animal/hostile/zombie,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"B" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/machinery/shower,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"C" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/machinery/shower,/mob/living/simple_animal/hostile/zombie,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"D" = (/turf/template_noop,/area/template_noop) - -(1,1,1) = {" -DDDDDDDDDDDDDDDDDDDD -DDDDDDDDDDDDDDDDDDDD -DDDDDDDDDDDDDDDDDDDD -DDDDDDDDDDDDDDDDDDDD -DDDccccccccccccDDDDD -DDDcdeddddddedcbDDDD -DDDcfgghiijkglcbaDDD -DDDcfggmgkngglcbbbDD -DDDcfggmggnggocbbbDD -DDDcfggpqqrggocstbbD -DDDcgkgggggggkuvwxbD -DDDcuucccccccccyzbbD -DDDcgAgggggggAcbbbbD -DDDcggggggAgggcbbbDD -DDDcBCBBggBBBBcbbDDD -DDDcgggggggAggcbDDDD -DDDccccccccccccbDDDD -DDDDDDDDDDDDDDDDDDDD -DDDDDDDDDDDDDDDDDDDD -DDDDDDDDDDDDDDDDDDDD -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index 0d13efc45a1..d7b57ad8021 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -1,6 +1,6 @@ "a" = (/turf/closed/mineral/volcanic/lava_land_surface,/area/lavaland/surface/outdoors) "b" = (/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"c" = (/turf/closed/wall/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) +"c" = (/turf/closed/wall/mineral/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "d" = (/obj/effect/light_emitter,/mob/living/simple_animal/hostile/spawner/ash_walker,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "e" = (/obj/effect/decal/cleanable/blood,/obj/effect/mob_spawn/human/ash_walker,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "f" = (/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) @@ -33,7 +33,7 @@ "G" = (/obj/item/weapon/twohanded/spear,/obj/structure/rack,/obj/item/weapon/twohanded/spear,/obj/item/weapon/twohanded/spear,/obj/item/weapon/twohanded/spear,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "H" = (/obj/item/weapon/twohanded/spear,/obj/structure/rack,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "I" = (/obj/structure/mineral_door/iron,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth;blocks_air = 1},/area/ruin/unpowered) -"J" = (/turf/closed/wall/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/lavaland/surface/outdoors) +"J" = (/turf/closed/wall/mineral/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/lavaland/surface/outdoors) "K" = (/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth;initial_gas_mix = "o2=13;n2=24;TEMP=300"},/area/lavaland/surface/outdoors) "L" = (/obj/item/weapon/twohanded/spear,/obj/structure/table,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "M" = (/obj/item/weapon/pickaxe,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth;initial_gas_mix = "o2=13;n2=24;TEMP=300"},/area/lavaland/surface/outdoors) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm index 6288a076004..8bb45a4dde7 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm @@ -1,5 +1,5 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/turf/closed/wall/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) +"b" = (/turf/closed/wall/mineral/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "c" = (/obj/structure/divine/healingfountain/anyone,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "d" = (/obj/structure/divine/conduit,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "e" = (/obj/structure/divine/sacrificealtar,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm index 542e27d84dc..6f66a0086de 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm @@ -1,7 +1,7 @@ "a" = (/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) "b" = (/turf/closed/mineral/volcanic/lava_land_surface,/area/lavaland/surface/outdoors) "c" = (/turf/open/floor/plating/lava/smooth/lava_land_surface,/area/lavaland/surface/outdoors) -"d" = (/turf/closed/wall/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"d" = (/turf/closed/wall/mineral/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) "e" = (/obj/structure/table/wood/poker,/obj/item/weapon/gun/projectile/revolver/russian/soul,/turf/open/floor/carpet{baseturf = /turf/open/floor/plating/lava/smooth; icon_state = "carpetsymbol"},/area/ruin/powered) "f" = (/obj/structure/cursed_slot_machine,/turf/open/floor/carpet{baseturf = /turf/open/floor/plating/lava/smooth; icon_state = "carpetsymbol"},/area/ruin/powered) "g" = (/obj/structure/table/wood/poker,/obj/item/weapon/coin/mythril,/turf/open/floor/carpet{baseturf = /turf/open/floor/plating/lava/smooth; icon_state = "carpetsymbol"},/area/ruin/powered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm index dc5f71c3e89..c4f10ea6087 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm @@ -53,85 +53,60 @@ }, /area/ruin/powered) "l" = ( -/obj/structure/bodycontainer/morgue{ - desc = "An oddly modernized tomb, at least compared to where it currently is."; - name = "tomb" - }, -/obj/effect/mob_spawn/human/skeleton, -/obj/item/weapon/shovel/cursed, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"m" = ( /obj/item/weapon/grown/bananapeel, /obj/structure/mineral_door/transparent/diamond, /turf/open/floor/vault{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface }, /area/ruin/powered) -"n" = ( +"m" = ( /obj/item/weapon/ore/diamond, /turf/open/floor/plasteel/black{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface }, /area/ruin/powered) -"o" = ( +"n" = ( /turf/open/floor/vault{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface }, /area/ruin/powered) -"p" = ( +"o" = ( /obj/item/weapon/ore/gold, /turf/open/floor/plasteel/black{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface }, /area/ruin/powered) -"q" = ( +"p" = ( /turf/open/floor/plating/lava/smooth/lava_land_surface, /area/ruin/powered) -"r" = ( -/obj/structure/bodycontainer/morgue{ - desc = "An oddly modernized tomb, at least compared to where it currently is."; - name = "tomb" - }, -/obj/effect/mob_spawn/human/skeleton{ - helmet = /obj/item/clothing/head/helmet/stahlhelm; - name = "german remains"; - uniform = /obj/item/clothing/under/wwii - }, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"s" = ( +"q" = ( /obj/structure/table, /obj/item/weapon/tome, /turf/open/floor/plasteel/black{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface }, /area/ruin/powered) -"t" = ( +"r" = ( /obj/item/weapon/grown/bananapeel, /obj/structure/mineral_door/silver, /turf/open/floor/vault{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface }, /area/ruin/powered) -"u" = ( +"s" = ( /obj/item/weapon/ore/bananium, /turf/open/floor/plasteel/black{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface }, /area/ruin/powered) -"v" = ( +"t" = ( /obj/item/weapon/grown/bananapeel, /obj/structure/mineral_door/gold, /turf/open/floor/vault{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface }, /area/ruin/powered) -"w" = ( +"u" = ( /obj/structure/table/optable/abductor{ desc = "A strange, alien-like table for cutting up things, like people."; name = "strange alien slab" @@ -144,14 +119,14 @@ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface }, /area/ruin/powered) -"x" = ( +"v" = ( /obj/structure/table, /obj/item/weapon/spellbook/oneuse/charge, /turf/open/floor/plasteel/black{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface }, /area/ruin/powered) -"y" = ( +"w" = ( /obj/structure/bodycontainer/morgue{ desc = "An oddly modernized tomb, at least compared to where it currently is."; name = "tomb" @@ -165,26 +140,26 @@ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface }, /area/ruin/powered) -"z" = ( +"x" = ( /obj/item/weapon/ore/uranium, /turf/open/floor/plasteel/black{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface }, /area/ruin/powered) -"A" = ( +"y" = ( /obj/item/weapon/ore/plasma, /turf/open/floor/plasteel/black{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface }, /area/ruin/powered) -"B" = ( +"z" = ( /obj/item/weapon/grown/bananapeel, /obj/structure/mineral_door/iron, /turf/open/floor/vault{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface }, /area/ruin/powered) -"C" = ( +"A" = ( /obj/structure/table, /obj/item/weapon/twohanded/spear, /obj/item/weapon/shield/riot/buckler, @@ -192,7 +167,7 @@ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface }, /area/ruin/powered) -"D" = ( +"B" = ( /obj/item/weapon/grown/bananapeel, /obj/structure/mineral_door/iron, /turf/open/floor/plasteel/black{ @@ -324,8 +299,8 @@ h j k j -x -y +v +w g b b @@ -375,9 +350,9 @@ g g g g -t +r g -t +r g g g @@ -399,15 +374,15 @@ g g g g +m +n +n n -o -o -o i -o -o -o -z +n +n +n +x g g b @@ -426,15 +401,15 @@ h i j g -o n -o -o +m +n +n i -o -o -z -o +n +n +x +n g g g @@ -453,19 +428,19 @@ i k i g -o +n i -q -q +p +p i -q -q +p +p i -o +n g -C -C -C +A +A +A g b b @@ -480,15 +455,15 @@ i i i g -o -q +n +p i -q +p i -q +p i -q -o +p +n g i i @@ -506,21 +481,21 @@ g j i i -m -o -q -q -o -u -o -q -q -o -B +l +n +p +p +n +s +n +p +p +n +z i j i -D +B b b "} @@ -531,15 +506,15 @@ b b g i -l +k i g i i i +s u -w -u +s i i i @@ -560,21 +535,21 @@ g j i i -m -o -q -q -o -u -o -q -q -o -B +l +n +p +p +n +s +n +p +p +n +z i j i -D +B b b "} @@ -588,15 +563,15 @@ i i i g -o -q +n +p i -q +p i -q +p i -q -o +p +n g i i @@ -615,19 +590,19 @@ i k i g -o +n i -q -q +p +p i -q -q +p +p i -o +n g -C -C -C +A +A +A g b b @@ -642,15 +617,15 @@ h i j g +n o -p -o -o +n +n i -o -o -A -o +n +n +y +n g g g @@ -669,15 +644,15 @@ g g g g -p -o -o o +n +n +n i -o -o -o -A +n +n +n +y g g b @@ -699,9 +674,9 @@ g g g g -v +t g -v +t g g g @@ -724,8 +699,8 @@ e d g g -r -s +k +q i k i diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_wwiioutpost.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_wwiioutpost.dmm deleted file mode 100644 index 5e745c1c7d8..00000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_wwiioutpost.dmm +++ /dev/null @@ -1,2489 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/template_noop, -/area/template_noop) -"ab" = ( -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"ac" = ( -/obj/item/stack/rods, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"ad" = ( -/obj/item/stack/sheet/metal, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"ae" = ( -/turf/open/floor/plating/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"af" = ( -/obj/item/stack/rods, -/turf/open/floor/plating{ - baseturf = /turf/open/chasm/straight_down/lava_land_surface - }, -/area/lavaland/surface/outdoors) -"ag" = ( -/turf/open/floor/plating{ - baseturf = /turf/open/chasm/straight_down/lava_land_surface - }, -/area/lavaland/surface/outdoors) -"ah" = ( -/obj/effect/mob_spawn/human/skeleton{ - helmet = /obj/item/clothing/head/ushanka; - name = "russian remains"; - uniform = /obj/item/clothing/under/soviet - }, -/obj/item/weapon/gun/projectile/revolver/nagant, -/obj/effect/decal/cleanable/blood/old, -/obj/item/ammo_casing/a357, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"ai" = ( -/obj/item/weapon/c4, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"aj" = ( -/turf/closed/wall/r_wall{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"ak" = ( -/obj/item/stack/sheet/plasteel, -/obj/item/ammo_casing/a357, -/turf/open/floor/plating{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; - icon_plating = "platingdmg1"; - icon_state = "platingdmg1" - }, -/area/ruin/powered) -"al" = ( -/obj/item/stack/sheet/plasteel, -/obj/item/stack/rods, -/obj/item/ammo_casing/a357, -/turf/open/floor/plating{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; - icon_plating = "platingdmg1"; - icon_state = "platingdmg1" - }, -/area/ruin/powered) -"am" = ( -/obj/item/stack/rods, -/obj/item/ammo_casing/a357, -/obj/item/ammo_casing/mm556x45, -/turf/open/floor/plating{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; - icon_plating = "platingdmg1"; - icon_state = "platingdmg1" - }, -/area/ruin/powered) -"an" = ( -/obj/effect/mob_spawn/human/skeleton{ - helmet = /obj/item/clothing/head/ushanka; - name = "russian remains"; - uniform = /obj/item/clothing/under/soviet - }, -/obj/item/stack/sheet/plasteel, -/obj/item/weapon/gun/projectile/shotgun/boltaction, -/obj/effect/decal/cleanable/blood/old, -/obj/item/ammo_casing/mm556x45, -/turf/open/floor/plating{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; - icon_plating = "platingdmg1"; - icon_state = "platingdmg1" - }, -/area/ruin/powered) -"ao" = ( -/obj/structure/filingcabinet, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"ap" = ( -/obj/structure/window{ - icon_state = "rwindow"; - dir = 4 - }, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aq" = ( -/obj/structure/table, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"ar" = ( -/obj/effect/mob_spawn/human/skeleton{ - helmet = /obj/item/clothing/head/helmet/stahlhelm; - name = "german remains"; - uniform = /obj/item/clothing/under/wwii - }, -/obj/item/weapon/gun/projectile/automatic/pistol/APS, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"as" = ( -/turf/open/floor/plating{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; - icon_plating = "platingdmg1"; - icon_state = "platingdmg1" - }, -/area/ruin/powered) -"at" = ( -/obj/item/ammo_casing/mm556x45, -/turf/open/floor/plating{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; - icon_plating = "platingdmg1"; - icon_state = "platingdmg1" - }, -/area/ruin/powered) -"au" = ( -/obj/item/ammo_casing/a357, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"av" = ( -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aw" = ( -/obj/structure/window{ - icon_state = "rwindow"; - dir = 8 - }, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"ax" = ( -/obj/structure/window{ - icon_state = "rwindow"; - dir = 4 - }, -/obj/item/weapon/shard, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"ay" = ( -/obj/effect/gibspawner/human, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"az" = ( -/obj/machinery/constructable_frame/machine_frame{ - desc = "A specialized hypersleep chamber meant to keep its occupent in suspended animation for long periods of time. The initials 'A.D' are marked on a specialized plaque. The hypersleeper is empty. "; - dir = 2; - icon = 'icons/obj/Cryogenic2.dmi'; - icon_state = "sleeper-o"; - name = "broken hypersleep chamber"; - pixel_y = 3 - }, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aA" = ( -/obj/effect/mob_spawn/human/skeleton{ - helmet = /obj/item/clothing/head/ushanka; - name = "russian remains"; - uniform = /obj/item/clothing/under/soviet - }, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aB" = ( -/obj/structure/filingcabinet, -/obj/item/weapon/paper/pamphlet{ - icon = 'icons/obj/items.dmi'; - icon_state = "blueprints"; - info = "A strange looking set of blueprints with the actual schematics for whatever was once on it ripped out in what appears to be in a haste. The top of what remains of the blueprints spells out 'aus der Asche'."; - name = "ripped blueprints" - }, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aC" = ( -/obj/item/weapon/shard, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aD" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aE" = ( -/obj/effect/mob_spawn/human/skeleton{ - helmet = /obj/item/clothing/head/helmet/stahlhelm; - name = "german remains"; - uniform = /obj/item/clothing/under/wwii - }, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aF" = ( -/obj/effect/mob_spawn/human/skeleton{ - helmet = /obj/item/clothing/head/helmet/stahlhelm; - name = "german remains"; - uniform = /obj/item/clothing/under/wwii - }, -/obj/structure/table_frame, -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/light, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aG" = ( -/obj/item/stack/sheet/metal, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aH" = ( -/obj/structure/table, -/obj/machinery/light, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aI" = ( -/obj/machinery/door/poddoor/preopen{ - id = "lavagerman" - }, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aJ" = ( -/turf/open/floor/plasteel/stairs{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aK" = ( -/mob/living/simple_animal/hostile/wwii/bomber, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aL" = ( -/obj/machinery/light{ - icon_state = "tube1"; - dir = 8 - }, -/turf/open/floor/plasteel{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aM" = ( -/turf/open/floor/plasteel{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aN" = ( -/obj/item/ammo_casing/c9mm, -/turf/open/floor/plasteel{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aO" = ( -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" - }, -/turf/open/floor/plasteel{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aP" = ( -/obj/structure/table, -/obj/item/device/flashlight/lamp, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aQ" = ( -/mob/living/simple_animal/hostile/wwii/melee, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aR" = ( -/obj/effect/spawner/lootdrop/crate_spawner, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aS" = ( -/obj/effect/mob_spawn/human/skeleton{ - helmet = /obj/item/clothing/head/ushanka; - name = "russian remains"; - uniform = /obj/item/clothing/under/soviet - }, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plasteel{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aT" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/item/ammo_casing/c9mm, -/turf/open/floor/plasteel{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aU" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plasteel{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aV" = ( -/obj/effect/gibspawner/human, -/turf/open/floor/plasteel{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aW" = ( -/obj/structure/closet/crate, -/obj/item/weapon/dnainjector/dwarf, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aX" = ( -/obj/structure/table, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/item/weapon/storage/firstaid/regular{ - empty = 1; - name = "first-aid kit" - }, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aY" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"aZ" = ( -/obj/structure/closet/crate, -/obj/item/weapon/dnainjector/timed/hulk, -/obj/item/weapon/dnainjector/wackymut, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"ba" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bb" = ( -/obj/structure/table, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bc" = ( -/obj/structure/table, -/obj/item/weapon/paper_bin, -/obj/item/weapon/pen, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bd" = ( -/obj/item/weapon/c4, -/turf/open/floor/plasteel{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"be" = ( -/obj/item/stack/sheet/plasteel, -/turf/open/floor/plasteel{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bf" = ( -/obj/effect/mob_spawn/human/skeleton{ - helmet = /obj/item/clothing/head/helmet/stahlhelm; - name = "german remains"; - uniform = /obj/item/clothing/under/wwii - }, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plasteel{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bg" = ( -/obj/structure/closet/crate, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bh" = ( -/obj/structure/table, -/obj/item/weapon/paper_bin, -/obj/item/weapon/pen/edagger, -/obj/item/weapon/storage/firstaid/regular, -/turf/open/floor/plasteel/black{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bi" = ( -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bj" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bk" = ( -/turf/closed/wall{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bl" = ( -/obj/machinery/door/poddoor{ - id = "lavagerman" - }, -/turf/open/floor/plasteel{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bm" = ( -/obj/item/stack/rods, -/turf/open/floor/plating{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; - icon_plating = "platingdmg1"; - icon_state = "platingdmg1" - }, -/area/ruin/powered) -"bn" = ( -/obj/item/ammo_casing/c9mm, -/obj/machinery/light{ - icon_state = "tube1"; - dir = 8 - }, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bo" = ( -/obj/item/ammo_casing/c9mm, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bp" = ( -/obj/machinery/door/poddoor{ - id = "lavagerman1"; - name = "secure storage a" - }, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bq" = ( -/obj/item/stack/sheet/plasteel, -/turf/open/floor/plasteel/stairs{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"br" = ( -/obj/item/stack/sheet/metal, -/turf/open/floor/plating{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; - icon_plating = "platingdmg1"; - icon_state = "platingdmg1" - }, -/area/ruin/powered) -"bs" = ( -/obj/machinery/door/poddoor{ - id = "lavagerman2"; - name = "secure storage b" - }, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bt" = ( -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" - }, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bu" = ( -/obj/effect/mob_spawn/human/skeleton{ - helmet = /obj/item/clothing/head/helmet/stahlhelm; - name = "german remains"; - uniform = /obj/item/clothing/under/wwii - }, -/obj/item/weapon/gun/projectile/automatic/pistol/APS, -/obj/effect/decal/cleanable/blood/old, -/obj/item/ammo_casing/c9mm, -/obj/item/ammo_casing/c9mm, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bv" = ( -/obj/effect/gibspawner/human, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bw" = ( -/obj/machinery/button/door{ - id = "lavagerman1"; - pixel_y = 32 - }, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bx" = ( -/obj/machinery/door/airlock/highsecurity, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"by" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bz" = ( -/obj/machinery/button/door{ - id = "lavagerman2"; - pixel_y = 32 - }, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bA" = ( -/obj/structure/table, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bB" = ( -/obj/effect/mob_spawn/human/skeleton{ - helmet = /obj/item/clothing/head/ushanka; - name = "russian remains"; - uniform = /obj/item/clothing/under/soviet - }, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bC" = ( -/obj/item/ammo_casing/a357, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bD" = ( -/obj/machinery/light{ - icon_state = "tube1"; - dir = 8 - }, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bE" = ( -/obj/item/stack/sheet/metal, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bF" = ( -/obj/effect/mob_spawn/human/skeleton{ - helmet = /obj/item/clothing/head/helmet/stahlhelm; - name = "german remains"; - uniform = /obj/item/clothing/under/wwii - }, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bG" = ( -/obj/structure/table_frame, -/obj/item/stack/sheet/metal, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bH" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/item/ammo_casing/c9mm, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bI" = ( -/obj/structure/table, -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" - }, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bJ" = ( -/obj/effect/mob_spawn/human/skeleton{ - helmet = /obj/item/clothing/head/ushanka; - name = "russian remains"; - uniform = /obj/item/clothing/under/soviet - }, -/obj/item/weapon/gun/projectile/shotgun/boltaction, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bK" = ( -/obj/structure/table, -/obj/machinery/light{ - icon_state = "tube1"; - dir = 8 - }, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bL" = ( -/obj/effect/mob_spawn/human/skeleton{ - helmet = /obj/item/clothing/head/helmet/stahlhelm; - name = "german remains"; - uniform = /obj/item/clothing/under/wwii - }, -/obj/item/weapon/gun/projectile/automatic/pistol/APS, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bM" = ( -/obj/machinery/door/poddoor{ - id = "lavagerman" - }, -/turf/open/floor/plasteel/neutral{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bN" = ( -/obj/machinery/door/airlock/glass_external, -/turf/open/floor/plating{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bO" = ( -/obj/structure/window{ - icon_state = "rwindow"; - dir = 8 - }, -/turf/open/floor/plating{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bP" = ( -/obj/machinery/porta_turret/stationary, -/turf/open/floor/plating{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bQ" = ( -/obj/structure/window{ - icon_state = "rwindow"; - dir = 4 - }, -/turf/open/floor/plating{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bR" = ( -/obj/structure/sign/xeno_warning_mining{ - pixel_y = -32 - }, -/obj/structure/closet/emcloset, -/turf/open/floor/plating{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bS" = ( -/turf/open/floor/plating{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bT" = ( -/obj/structure/sign/xeno_warning_mining{ - pixel_y = -32 - }, -/obj/item/weapon/rcd/loaded, -/obj/structure/closet/emcloset, -/turf/open/floor/plating{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bU" = ( -/obj/structure/window{ - icon_state = "rwindow"; - dir = 8 - }, -/obj/structure/window{ - tag = "icon-rwindow"; - icon_state = "rwindow"; - dir = 2 - }, -/turf/open/floor/plating{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bV" = ( -/obj/structure/window{ - tag = "icon-rwindow"; - icon_state = "rwindow"; - dir = 2 - }, -/turf/open/floor/plating{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) -"bW" = ( -/obj/structure/window{ - icon_state = "rwindow"; - dir = 4 - }, -/obj/structure/window{ - tag = "icon-rwindow"; - icon_state = "rwindow"; - dir = 2 - }, -/turf/open/floor/plating{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface - }, -/area/ruin/powered) - -(1,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -ae -ae -ae -ae -ae -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -"} -(2,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ab -aa -aa -aa -aa -aa -aa -aa -"} -(3,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ab -ab -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -"} -(4,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ab -ab -ab -ae -ae -ae -ae -ae -ae -ab -ab -aa -aa -aa -aa -aa -"} -(5,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ae -ae -ae -ae -ae -ae -ae -ae -ae -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ae -ae -ae -ab -ab -aa -aa -aa -aa -aa -"} -(6,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ae -ae -ae -ae -ae -ab -ab -ab -ab -ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -ab -ae -ae -ae -ab -ab -aa -aa -aa -aa -aa -"} -(7,1,1) = {" -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ae -ae -ae -ae -ae -ab -ab -ab -ab -ab -aj -bi -bn -bi -bA -bA -bA -bi -aj -ab -ae -ae -ae -ab -ab -aa -aa -aa -aa -aa -"} -(8,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -ae -ae -ae -ae -ae -ae -ae -ae -ab -ab -ab -ab -ab -aj -bi -bo -bu -bi -bi -bi -bi -aj -ab -ae -ae -ae -ab -ab -aa -aa -aa -aa -aa -"} -(9,1,1) = {" -aa -aa -aa -aa -aa -aa -ab -ae -ae -ae -ae -ae -ab -ab -ab -ab -ab -ab -ab -ab -aj -bj -bi -bv -bo -bi -bi -bi -aj -ab -ae -ae -ae -ae -ab -aa -aa -aa -aa -aa -"} -(10,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -ae -ae -ae -ae -ae -ab -ab -ab -aj -aj -aj -aj -aj -aj -bk -bk -bw -bi -bi -bF -bi -aj -ab -ae -ae -ae -ae -ab -ab -aa -aa -aa -aa -"} -(11,1,1) = {" -aa -aa -aa -aa -ab -ae -ae -ae -ae -ae -ae -ae -ab -ab -ab -aj -ao -av -aP -aX -bc -av -bp -bi -bA -bA -bI -bi -aj -ab -ae -ae -ae -ae -ab -ab -aa -aa -aa -aa -"} -(12,1,1) = {" -aa -aa -aa -aa -ab -ae -ae -ae -ae -ae -ae -ae -ab -ab -ab -aj -ao -av -aQ -aY -av -av -bk -as -bk -bk -bk -bM -aj -ab -ab -ae -ae -ae -ab -ab -aa -aa -aa -aa -"} -(13,1,1) = {" -aa -aa -aa -aa -ab -ae -ae -ae -ab -ab -ab -ab -ab -ab -ab -aj -ao -aK -aR -aZ -aR -aR -bk -bi -bi -bD -bi -bi -aj -ab -ab -ae -ae -ae -ab -ab -aa -aa -aa -aa -"} -(14,1,1) = {" -aa -aa -ab -ab -ab -ae -ae -ae -ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -bk -bi -bB -bC -bi -bi -aj -bO -bU -ae -ae -ae -ab -ab -aa -aa -aa -aa -"} -(15,1,1) = {" -aa -aa -ab -ab -ab -ae -ae -ae -ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -bi -bC -bi -bF -bi -aj -bP -bV -ae -ae -ae -ab -aa -aa -aa -aa -aa -"} -(16,1,1) = {" -aa -aa -aa -ab -ab -ae -ae -ae -ab -aj -aj -ao -ao -aB -ao -aj -aj -aL -aM -aM -aL -aj -aj -bi -bi -bi -bi -bi -aj -bQ -bW -ae -ae -ae -ab -ab -aa -aa -aa -aa -"} -(17,1,1) = {" -aa -aa -aa -ab -ae -ae -ae -ae -ab -aj -aj -ap -ax -av -ap -aj -aj -aM -aM -aM -aM -aj -aj -bx -bk -bk -bk -bk -aj -ab -ab -ae -ae -ae -ab -ab -aa -aa -aa -aa -"} -(18,1,1) = {" -aa -aa -aa -ab -ae -ae -ae -ae -ab -aj -aj -aq -av -aC -aF -aj -aj -aM -aM -aS -aM -aj -aj -bi -bD -bi -bi -bi -aj -ab -ab -ae -ae -ae -ab -ab -aa -aa -aa -aa -"} -(19,1,1) = {" -aa -aa -aa -ab -ae -ae -ae -ab -ab -aj -aj -ar -ay -av -aG -aj -aj -aM -aS -aN -aM -aj -aj -bi -bi -bi -by -bi -bk -aj -aj -ae -ae -ae -ab -ab -aa -aa -aa -aa -"} -(20,1,1) = {" -aa -aa -ac -ab -ae -ae -ae -ab -ad -ak -aj -as -av -au -aD -aI -aJ -aM -aM -aM -bd -bl -bq -by -bB -bi -bi -bi -bk -bR -aj -ae -ae -ae -ab -ab -aa -aa -aa -aa -"} -(21,1,1) = {" -aa -aa -ad -ab -af -ae -ag -ab -ah -al -am -at -az -aD -av -aj -aj -aM -aT -aM -be -bm -br -bi -bi -bi -bi -bi -bN -bS -bN -ae -ae -ab -ab -aa -aa -aa -aa -aa -"} -(22,1,1) = {" -aa -aa -aa -ab -ae -ae -ae -ab -ai -aj -an -au -aA -av -av -aI -aJ -aM -aU -aM -aN -bl -bq -bi -bi -bi -bJ -bi -bk -bT -aj -ae -ae -ab -ab -aa -aa -aa -aa -aa -"} -(23,1,1) = {" -aa -aa -aa -ad -ae -ae -ae -ab -ab -aj -aj -av -av -av -av -aj -aj -aM -aM -aM -bf -aj -aj -bi -by -bi -bi -bi -bk -aj -aj -ae -ae -ab -ab -aa -aa -aa -aa -aa -"} -(24,1,1) = {" -aa -aa -aa -ab -ae -ae -ae -ab -ab -aj -aj -aq -av -aE -aH -aj -aj -aN -aM -aM -aM -aj -aj -bi -bt -bi -bi -bi -aj -ab -ab -ae -ae -ab -ab -aa -aa -aa -aa -aa -"} -(25,1,1) = {" -aa -aa -aa -ab -ae -ae -ae -ae -ab -aj -aj -aw -aw -aw -aw -aj -aj -aM -aV -aM -aM -aj -aj -bx -bk -bk -bk -bk -aj -ab -ab -ae -ae -ae -ab -aa -aa -aa -aa -aa -"} -(26,1,1) = {" -aa -aa -ab -ab -ae -ae -ae -ae -ab -aj -aj -ao -ao -ao -ao -aj -aj -aO -aM -aM -aO -aj -aj -bi -bi -bi -bi -bi -aj -bO -bU -ae -ae -ae -ab -aa -aa -aa -aa -aa -"} -(27,1,1) = {" -aa -aa -ab -ab -ae -ae -ae -ae -ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -bi -bi -bi -bi -bi -aj -bP -bV -ae -ae -ae -ab -aa -aa -aa -aa -aa -"} -(28,1,1) = {" -aa -aa -ab -ab -ae -ae -ae -ae -ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -bk -bi -bB -bi -by -bi -aj -bQ -bW -ae -ae -ae -aa -aa -aa -aa -aa -aa -"} -(29,1,1) = {" -aa -ab -ab -ab -ae -ae -ae -ae -ab -ab -ab -ab -ab -ab -ab -aj -ao -aK -aW -aR -bg -aR -bk -bi -bE -bi -bt -bi -aj -ab -ae -ae -ae -ab -ab -aa -aa -aa -aa -aa -"} -(30,1,1) = {" -aa -ab -ab -ab -ae -ae -ae -ae -ab -ab -ab -ab -ab -ab -ab -aj -ao -av -aQ -ba -av -av -bk -bk -bk -br -bk -bM -aj -ab -ae -ae -ae -ae -ab -ab -aa -aa -aa -aa -"} -(31,1,1) = {" -aa -ab -ab -ab -ae -ae -ae -ae -ab -ab -ab -ab -ab -ab -ab -aj -ao -av -aP -bb -bh -av -bs -bi -bA -bG -bK -bi -aj -ab -ab -ae -ae -ae -ab -ab -aa -aa -aa -aa -"} -(32,1,1) = {" -aa -ab -ab -ab -ae -ae -ae -ae -ae -ae -ae -ae -ab -ab -ab -aj -aj -aj -aj -aj -aj -bk -bk -bz -bi -bi -bi -bi -aj -ab -ab -ae -ae -ae -ab -ab -aa -aa -aa -aa -"} -(33,1,1) = {" -aa -aa -aa -aa -ab -ab -ae -ae -ae -ae -ae -ae -ab -ab -ab -ab -ab -ab -ab -ab -aj -bj -bi -bi -bF -bo -bL -bo -aj -ab -ab -ae -ae -ae -ab -ab -aa -aa -aa -aa -"} -(34,1,1) = {" -aa -aa -aa -aa -ab -ab -ae -ae -ae -ae -ae -ae -ab -ab -ab -ab -ab -ab -ab -ab -aj -bi -bi -bi -bi -bH -bi -bo -aj -ab -ab -ae -ae -ae -ab -ab -aa -aa -aa -aa -"} -(35,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ae -ae -ae -ae -ae -ae -ae -ab -ab -ab -aj -bi -bt -bi -bA -bA -bA -bi -aj -ab -ab -ae -ae -ae -ab -ab -aa -aa -aa -aa -"} -(36,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ae -ae -ae -ae -ae -ae -ae -ab -ab -ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -ab -ab -ae -ae -ab -ab -ab -aa -aa -aa -aa -"} -(37,1,1) = {" -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ae -ae -ae -ae -ae -ae -ae -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ae -ae -ab -ab -aa -aa -aa -aa -aa -"} -(38,1,1) = {" -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ab -ab -ab -ab -ab -ab -ae -ae -ae -ae -ae -ab -ab -aa -aa -aa -aa -aa -"} -(39,1,1) = {" -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ab -ab -ab -aa -aa -aa -aa -aa -"} -(40,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ab -ab -aa -aa -aa -aa -aa -aa -"} diff --git a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm index 57039bae9d3..2036c6dc142 100644 --- a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm +++ b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm @@ -1,124 +1,1288 @@ -"aa" = (/turf/open/space,/area/space) -"ab" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/open/floor/plating,/area/ruin/unpowered) -"ac" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plating,/area/ruin/unpowered) -"ad" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/open/floor/plating,/area/ruin/unpowered) -"ae" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/open/floor/plating,/area/ruin/unpowered) -"af" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/open/floor/plating,/area/ruin/unpowered) -"ag" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/open/floor/plating,/area/ruin/unpowered) -"ah" = (/turf/closed/mineral,/area/ruin/unpowered) -"ai" = (/turf/open/floor/plating/asteroid,/area/ruin/unpowered) -"aj" = (/obj/structure/flora/rock,/turf/open/floor/plating/asteroid,/area/ruin/unpowered) -"ak" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/open/floor/plating,/area/ruin/unpowered) -"al" = (/obj/structure/flora/ausbushes/genericbush,/turf/open/floor/grass,/area/ruin/unpowered) -"am" = (/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/turf/open/floor/grass,/area/ruin/unpowered) -"an" = (/mob/living/simple_animal/hostile/poison/bees,/turf/open/floor/grass,/area/ruin/unpowered) -"ao" = (/obj/structure/flora/ausbushes/lavendergrass,/turf/open/floor/grass,/area/ruin/unpowered) -"ap" = (/mob/living/simple_animal/hostile/asteroid/goldgrub{will_burrow = 0},/turf/open/floor/plating/asteroid,/area/ruin/unpowered) -"aq" = (/obj/structure/flora/ausbushes/grassybush,/turf/open/floor/grass,/area/ruin/unpowered) -"ar" = (/obj/structure/flora/rock/pile,/turf/open/floor/plating/asteroid,/area/ruin/unpowered) -"as" = (/mob/living/simple_animal/hostile/asteroid/basilisk,/turf/open/floor/plating/asteroid,/area/ruin/unpowered) -"at" = (/turf/closed/wall/r_wall,/area/ruin/unpowered) -"au" = (/obj/structure/flora/ausbushes/leafybush,/mob/living/simple_animal/hostile/poison/bees,/turf/open/floor/grass,/area/ruin/unpowered) -"av" = (/obj/structure/flora/ausbushes/brflowers,/turf/open/floor/grass,/area/ruin/unpowered) -"aw" = (/obj/structure/flora/rock,/obj/machinery/light,/turf/open/floor/plating/asteroid,/area/ruin/unpowered) -"ax" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/clothing/mask/surgical,/obj/item/weapon/razor,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"ay" = (/turf/open/floor/plasteel/darkgreen,/area/ruin/unpowered) -"az" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/box/beakers,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aA" = (/obj/structure/flora/ausbushes/ywflowers,/turf/open/floor/grass,/area/ruin/unpowered) -"aB" = (/obj/machinery/light,/mob/living/simple_animal/hostile/poison/bees,/turf/open/floor/grass,/area/ruin/unpowered) -"aC" = (/obj/structure/flora/ausbushes/ppflowers,/turf/open/floor/grass,/area/ruin/unpowered) -"aD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/airlock/highsecurity{name = "Bio Containment"; req_one_access_txt = "47"},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aE" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/open/floor/plating,/area/ruin/unpowered) -"aF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/closed/wall/r_wall,/area/ruin/unpowered) -"aG" = (/obj/structure/table/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/item/weapon/gun/energy/floragun,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/darkgreen,/area/ruin/unpowered) -"aI" = (/obj/structure/table/reinforced,/obj/machinery/computer/med_data/laptop,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aJ" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/open/floor/plating,/area/ruin/unpowered) -"aK" = (/obj/structure/window/reinforced{dir = 4},/turf/open/space,/area/space) -"aL" = (/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/closed/wall/r_wall,/area/ruin/unpowered) -"aN" = (/obj/structure/table/reinforced,/obj/item/weapon/folder,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aO" = (/obj/structure/chair/office/light{dir = 8},/turf/open/floor/plasteel/darkgreen,/area/ruin/unpowered) -"aP" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/bottle/liver_enhance_virion,/obj/item/weapon/reagent_containers/dropper,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aQ" = (/obj/structure/window/reinforced{dir = 8},/turf/open/space,/area/space) -"aR" = (/obj/machinery/light/small{dir = 4},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aS" = (/obj/machinery/power/apc{dir = 8; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "Worn-out APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/rack,/obj/item/weapon/melee/baton/cattleprod,/obj/effect/spawner/lootdrop/maintenance,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aT" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/medical,/obj/item/weapon/tank/internals/emergency_oxygen/double,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aU" = (/obj/structure/rack,/obj/item/weapon/crowbar,/obj/item/weapon/shield/riot,/obj/machinery/light{dir = 1},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aV" = (/obj/machinery/smartfridge/chemistry,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aW" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/syringe,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aX" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/chem_grenade/antiweed{pixel_x = 3; pixel_y = 5},/obj/item/weapon/grenade/chem_grenade/antiweed{pixel_x = 4},/obj/item/weapon/grenade/chem_grenade/antiweed{pixel_x = -3; pixel_y = -1},/obj/machinery/light{dir = 1},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aY" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/temperature,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aZ" = (/obj/structure/table/reinforced,/obj/item/weapon/cultivator,/obj/item/weapon/shovel,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"ba" = (/obj/machinery/light/small{dir = 8},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bb" = (/obj/machinery/door/airlock/hatch{name = "Bio-Research Station"},/turf/open/floor/plasteel/darkgreen,/area/ruin/unpowered) -"bc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/open/floor/plasteel/darkgreen,/area/ruin/unpowered) -"bd" = (/obj/machinery/power/terminal,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/open/floor/plasteel/darkgreen,/area/ruin/unpowered) -"be" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bf" = (/obj/machinery/power/smes/magical{desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; name = "power storage unit"},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bg" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bh" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bi" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/hypospray/medipen/stimpack,/obj/item/weapon/reagent_containers/glass/bottle/mutagen,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bj" = (/obj/structure/table/reinforced,/obj/item/weapon/surgicaldrill,/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/item/weapon/surgical_drapes,/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/item/weapon/circular_saw,/obj/machinery/light,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bk" = (/obj/structure/table/optable,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bl" = (/obj/machinery/computer/operating,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bm" = (/obj/structure/closet/wardrobe/science_white,/obj/structure/disposalpipe/segment,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bn" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/snacks/carrotfries,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bo" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/open/floor/plating,/area/ruin/unpowered) -"bp" = (/obj/structure/bed,/obj/item/weapon/bedsheet/green,/obj/structure/disposalpipe/segment,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bq" = (/obj/item/stack/cable_coil/cut,/obj/item/stack/tile/plasteel{pixel_x = 3; pixel_y = -4},/obj/item/weapon/wirecutters,/turf/open/floor/plating,/area/ruin/unpowered) -"br" = (/obj/structure/table/reinforced,/obj/machinery/microwave,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/shieldwallgen,/turf/open/floor/plating,/area/ruin/unpowered) -"bt" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/shieldwallgen,/turf/open/floor/plating,/area/ruin/unpowered) -"bu" = (/obj/structure/flora/ausbushes/sunnybush,/turf/open/floor/plating,/area/ruin/unpowered) -"bv" = (/turf/open/floor/plating,/area/ruin/unpowered) -"bw" = (/obj/machinery/light{dir = 1},/mob/living/simple_animal/hostile/carp,/turf/open/floor/plating,/area/ruin/unpowered) -"bx" = (/obj/structure/flora/ausbushes/palebush,/turf/open/floor/plating,/area/ruin/unpowered) -"by" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/closed/wall/r_wall,/area/ruin/unpowered) -"bz" = (/obj/machinery/space_heater,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bA" = (/obj/structure/table/reinforced,/obj/machinery/juicer,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bB" = (/obj/structure/alien/weeds,/turf/open/floor/plating,/area/ruin/unpowered) -"bC" = (/obj/structure/alien/weeds/node,/obj/machinery/light{dir = 1},/turf/open/floor/plating,/area/ruin/unpowered) -"bD" = (/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/open/floor/plating,/area/ruin/unpowered) -"bE" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/open/floor/plating,/area/ruin/unpowered) -"bF" = (/obj/structure/disposalpipe/segment,/turf/closed/wall/r_wall,/area/ruin/unpowered) -"bG" = (/obj/machinery/door/airlock/external,/turf/open/floor/plasteel/darkgreen,/area/ruin/unpowered) -"bH" = (/obj/structure/alien/resin/wall,/turf/open/floor/plating,/area/ruin/unpowered) -"bI" = (/obj/structure/flora/ausbushes/reedbush,/turf/open/floor/plating,/area/ruin/unpowered) -"bJ" = (/mob/living/simple_animal/crab{faction = list("carp")},/turf/open/floor/plating,/area/ruin/unpowered) -"bK" = (/obj/structure/disposalpipe/segment,/turf/open/floor/plating,/area/space) -"bL" = (/obj/machinery/light/small{dir = 8},/turf/open/floor/plasteel/darkgreen,/area/ruin/unpowered) -"bM" = (/obj/machinery/light/small{dir = 4},/turf/open/floor/plasteel/darkgreen,/area/ruin/unpowered) -"bN" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/weapon/shard{icon_state = "small"},/turf/open/floor/plating,/area/ruin/unpowered) -"bO" = (/obj/item/weapon/shard,/turf/open/floor/plating,/area/ruin/unpowered) -"bP" = (/obj/structure/lattice,/turf/open/space,/area/space) -"bQ" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable,/turf/open/floor/plating,/area/ruin/unpowered) -"bR" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/disposaloutlet,/turf/open/floor/plating,/area/space) -"bS" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable,/obj/machinery/shieldwallgen,/turf/open/floor/plating,/area/ruin/unpowered) -"bT" = (/obj/structure/grille,/obj/item/weapon/shard{icon_state = "medium"},/turf/open/floor/plating,/area/ruin/unpowered) -"bU" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/open/floor/plating,/area/ruin/unpowered) -"bV" = (/obj/machinery/shieldwallgen,/turf/open/space,/area/space) -"bW" = (/obj/item/weapon/shard,/turf/open/space,/area/space) +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/space, +/area/space) +"ab" = ( +/obj/machinery/shieldwallgen{ + active = 2; + anchored = 1; + power = 1 + }, +/obj/structure/cable{ + icon_state = "0-4"; + d2 = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ac" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ad" = ( +/obj/machinery/shieldwallgen{ + active = 2; + anchored = 1; + power = 1 + }, +/obj/structure/cable{ + icon_state = "0-2"; + d2 = 2 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ae" = ( +/obj/machinery/shieldwallgen{ + active = 2; + anchored = 1; + power = 1 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4"; + tag = "" + }, +/obj/structure/cable{ + icon_state = "0-2"; + d2 = 2 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"af" = ( +/obj/machinery/shieldwallgen{ + active = 2; + anchored = 1; + power = 1 + }, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ag" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ah" = ( +/turf/closed/mineral, +/area/ruin/unpowered) +"ai" = ( +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"aj" = ( +/obj/structure/flora/rock, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"ak" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"al" = ( +/obj/structure/flora/ausbushes/genericbush, +/turf/open/floor/grass, +/area/ruin/unpowered) +"am" = ( +/mob/living/simple_animal/hostile/poison/bees, +/mob/living/simple_animal/hostile/poison/bees, +/mob/living/simple_animal/hostile/poison/bees, +/mob/living/simple_animal/hostile/poison/bees, +/mob/living/simple_animal/hostile/poison/bees, +/mob/living/simple_animal/hostile/poison/bees, +/turf/open/floor/grass, +/area/ruin/unpowered) +"an" = ( +/mob/living/simple_animal/hostile/poison/bees, +/turf/open/floor/grass, +/area/ruin/unpowered) +"ao" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/grass, +/area/ruin/unpowered) +"ap" = ( +/mob/living/simple_animal/hostile/asteroid/goldgrub{ + will_burrow = 0 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"aq" = ( +/obj/structure/flora/ausbushes/grassybush, +/turf/open/floor/grass, +/area/ruin/unpowered) +"ar" = ( +/obj/structure/flora/rock/pile, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"as" = ( +/mob/living/simple_animal/hostile/asteroid/basilisk, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"at" = ( +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"au" = ( +/obj/structure/flora/ausbushes/leafybush, +/mob/living/simple_animal/hostile/poison/bees, +/turf/open/floor/grass, +/area/ruin/unpowered) +"av" = ( +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/grass, +/area/ruin/unpowered) +"aw" = ( +/obj/structure/flora/rock, +/obj/machinery/light, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"ax" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/clipboard, +/obj/item/clothing/mask/surgical, +/obj/item/weapon/razor, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"ay" = ( +/turf/open/floor/plasteel/darkgreen, +/area/ruin/unpowered) +"az" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/storage/box/syringes{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/weapon/storage/box/beakers, +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aA" = ( +/obj/structure/flora/ausbushes/ywflowers, +/turf/open/floor/grass, +/area/ruin/unpowered) +"aB" = ( +/obj/machinery/light, +/mob/living/simple_animal/hostile/poison/bees, +/turf/open/floor/grass, +/area/ruin/unpowered) +"aC" = ( +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/grass, +/area/ruin/unpowered) +"aD" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/obj/machinery/door/airlock/highsecurity{ + name = "Bio Containment"; + req_one_access_txt = "47" + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aE" = ( +/obj/machinery/shieldwallgen{ + active = 2; + anchored = 1; + power = 1 + }, +/obj/structure/cable{ + icon_state = "0-2"; + d2 = 2 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4"; + tag = "" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"aF" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"aG" = ( +/obj/structure/table/reinforced, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/obj/item/weapon/gun/energy/floragun, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aH" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/turf/open/floor/plasteel/darkgreen, +/area/ruin/unpowered) +"aI" = ( +/obj/structure/table/reinforced, +/obj/machinery/computer/med_data/laptop, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aJ" = ( +/obj/machinery/shieldwallgen{ + active = 2; + anchored = 1; + power = 1 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8"; + tag = "" + }, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"aK" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/space, +/area/space) +"aL" = ( +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aM" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"aN" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/folder, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aO" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/turf/open/floor/plasteel/darkgreen, +/area/ruin/unpowered) +"aP" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/reagent_containers/glass/bottle/liver_enhance_virion, +/obj/item/weapon/reagent_containers/dropper, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aQ" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/space) +"aR" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aS" = ( +/obj/machinery/power/apc{ + dir = 8; + environ = 0; + equipment = 0; + lighting = 0; + locked = 0; + name = "Worn-out APC"; + pixel_x = -24; + pixel_y = 0 + }, +/obj/structure/cable{ + icon_state = "0-4"; + d2 = 4 + }, +/obj/structure/rack, +/obj/item/weapon/melee/baton/cattleprod, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aT" = ( +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/rack, +/obj/item/clothing/suit/space/hardsuit/medical, +/obj/item/weapon/tank/internals/emergency_oxygen/double, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aU" = ( +/obj/structure/rack, +/obj/item/weapon/crowbar, +/obj/item/weapon/shield/riot, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aV" = ( +/obj/machinery/smartfridge/chemistry, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aW" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/gun/syringe, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aX" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/grenade/chem_grenade/antiweed{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/item/weapon/grenade/chem_grenade/antiweed{ + pixel_x = 4 + }, +/obj/item/weapon/grenade/chem_grenade/antiweed{ + pixel_x = -3; + pixel_y = -1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aY" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/gun/energy/temperature{ + pin = /obj/item/device/firing_pin + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aZ" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/cultivator, +/obj/item/weapon/shovel, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"ba" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bb" = ( +/obj/machinery/door/airlock/hatch{ + name = "Bio-Research Station" + }, +/turf/open/floor/plasteel/darkgreen, +/area/ruin/unpowered) +"bc" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/plasteel/darkgreen, +/area/ruin/unpowered) +"bd" = ( +/obj/machinery/power/terminal, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/plasteel/darkgreen, +/area/ruin/unpowered) +"be" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bf" = ( +/obj/machinery/power/smes/magical{ + desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; + name = "power storage unit" + }, +/obj/structure/cable, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bg" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/light, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bh" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bi" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/reagent_containers/hypospray/medipen/stimpack, +/obj/item/weapon/reagent_containers/glass/bottle/mutagen, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bj" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/surgicaldrill, +/obj/item/weapon/hemostat, +/obj/item/weapon/scalpel, +/obj/item/weapon/surgical_drapes, +/obj/item/weapon/retractor, +/obj/item/weapon/cautery, +/obj/item/weapon/circular_saw, +/obj/machinery/light, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bk" = ( +/obj/structure/table/optable, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bl" = ( +/obj/machinery/computer/operating, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bm" = ( +/obj/structure/closet/wardrobe/science_white, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bn" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/reagent_containers/food/snacks/carrotfries, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bo" = ( +/obj/machinery/shieldwallgen{ + active = 2; + anchored = 1; + power = 1 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8"; + tag = "" + }, +/obj/structure/cable, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bp" = ( +/obj/structure/bed, +/obj/item/weapon/bedsheet/green, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bq" = ( +/obj/item/stack/cable_coil/cut, +/obj/item/stack/tile/plasteel{ + pixel_x = 3; + pixel_y = -4 + }, +/obj/item/weapon/wirecutters, +/turf/open/floor/plating, +/area/ruin/unpowered) +"br" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bs" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/obj/machinery/shieldwallgen, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bt" = ( +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/obj/machinery/shieldwallgen, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bu" = ( +/obj/structure/flora/ausbushes/sunnybush, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bv" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"bw" = ( +/obj/machinery/light{ + dir = 1 + }, +/mob/living/simple_animal/hostile/carp, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bx" = ( +/obj/structure/flora/ausbushes/palebush, +/turf/open/floor/plating, +/area/ruin/unpowered) +"by" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "pipe-c" + }, +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"bz" = ( +/obj/machinery/space_heater, +/obj/structure/disposalpipe/segment{ + dir = 8; + icon_state = "pipe-c" + }, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bA" = ( +/obj/structure/table/reinforced, +/obj/machinery/juicer, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bB" = ( +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bC" = ( +/obj/structure/alien/weeds/node, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bD" = ( +/obj/item/clothing/mask/facehugger{ + icon_state = "facehugger_dead"; + stat = 2 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bE" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bF" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"bG" = ( +/obj/machinery/door/airlock/external, +/turf/open/floor/plasteel/darkgreen, +/area/ruin/unpowered) +"bH" = ( +/obj/structure/alien/resin/wall, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bI" = ( +/obj/structure/flora/ausbushes/reedbush, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bJ" = ( +/mob/living/simple_animal/crab{ + faction = list("carp") + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bK" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/space) +"bL" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/darkgreen, +/area/ruin/unpowered) +"bM" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/darkgreen, +/area/ruin/unpowered) +"bN" = ( +/obj/structure/grille{ + density = 0; + icon_state = "brokengrille" + }, +/obj/item/weapon/shard{ + icon_state = "small" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bO" = ( +/obj/item/weapon/shard, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bP" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space) +"bQ" = ( +/obj/machinery/shieldwallgen{ + active = 2; + anchored = 1; + power = 1 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8"; + tag = "" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bR" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/disposaloutlet, +/turf/open/floor/plating, +/area/space) +"bS" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable, +/obj/machinery/shieldwallgen, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bT" = ( +/obj/structure/grille, +/obj/item/weapon/shard{ + icon_state = "medium" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bU" = ( +/obj/structure/grille{ + density = 0; + icon_state = "brokengrille" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bV" = ( +/obj/machinery/shieldwallgen, +/turf/open/space, +/area/space) +"bW" = ( +/obj/item/weapon/shard, +/turf/open/space, +/area/space) (1,1,1) = {" -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -abacacacacadaaaaaaaaaaaaaeacacacacafaaaa -agahahaiajakaaaaaaaaaaaaakalamanaoakaaaa -agaiapahaiakaaaaaaaaaaaaakanamaqanakaaaa -agaraiaiasakatagagagagatakanaoauavakaaaa -agahaiawarakataxayayazatakaAaBamaCakaaaa -abacaDacacaEaFaGaHaHaIaFaJacacaDacafaaaa -aaaKaLatataMataNaOayaPatatatataLaQaaaaaa -aaaKaRataSaTaUaVayayaWaXaYaZatbaaQaaaaaa -aaaKaLbbaybcayayayayayayayaybbaLaQaaaaaa -aaaKaLbbaybdayayayayayayayaybbaLaQaaaaaa -aaaKaRatbebfbgbhayaybibjbkblatbaaQaaaaaa -aaaKaLatataMatbmayaybnatatatataLaQaaaaaa -abacaDacacboaFbpaHbqbraFbsacacaDacbtaaaa -agbubvbwbxakbybzayaybAatakbBbCbDbBagaaaa -agbvbvbvbEakbFatbGbGatatakbBbHbBbBagaaaa -agbIbJbvbvakbKatbLbMataaakbDbHbvbvbNaaaa -agbvbvbvbvakbKatbGbGataaakbHbvbObvbPaaaa -abacacacacbQbRaaaaaaaaaabSacbTbUbPaabVaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWaaaaaaaa +aa +ab +ag +ag +ag +ag +ab +aa +aa +aa +aa +aa +aa +ab +ag +ag +ag +ag +ab +aa +"} +(2,1,1) = {" +aa +ac +ah +ai +ar +ah +ac +aK +aK +aK +aK +aK +aK +ac +bu +bv +bI +bv +ac +aa +"} +(3,1,1) = {" +aa +ac +ah +ap +ai +ai +aD +aL +aR +aL +aL +aR +aL +aD +bv +bv +bJ +bv +ac +aa +"} +(4,1,1) = {" +aa +ac +ai +ah +ai +aw +ac +at +at +bb +bb +at +at +ac +bw +bv +bv +bv +ac +aa +"} +(5,1,1) = {" +aa +ac +aj +ai +as +ar +ac +at +aS +ay +ay +be +at +ac +bx +bE +bv +bv +ac +aa +"} +(6,1,1) = {" +aa +ad +ak +ak +ak +ak +aE +aM +aT +bc +bd +bf +aM +bo +ak +ak +ak +ak +bQ +aa +"} +(7,1,1) = {" +aa +aa +aa +aa +at +at +aF +at +aU +ay +ay +bg +at +aF +by +bF +bK +bK +bR +aa +"} +(8,1,1) = {" +aa +aa +aa +aa +ag +ax +aG +aN +aV +ay +ay +bh +bm +bp +bz +at +at +at +aa +aa +"} +(9,1,1) = {" +aa +aa +aa +aa +ag +ay +aH +aO +ay +ay +ay +ay +ay +aH +ay +bG +bL +bG +aa +aa +"} +(10,1,1) = {" +aa +aa +aa +aa +ag +ay +aH +ay +ay +ay +ay +ay +ay +bq +ay +bG +bM +bG +aa +aa +"} +(11,1,1) = {" +aa +aa +aa +aa +ag +az +aI +aP +aW +ay +ay +bi +bn +br +bA +at +at +at +aa +aa +"} +(12,1,1) = {" +aa +aa +aa +aa +at +at +aF +at +aX +ay +ay +bj +at +aF +at +at +aa +aa +aa +aa +"} +(13,1,1) = {" +aa +ae +ak +ak +ak +ak +aJ +at +aY +ay +ay +bk +at +bs +ak +ak +ak +ak +bS +aa +"} +(14,1,1) = {" +aa +ac +al +an +an +aA +ac +at +aZ +ay +ay +bl +at +ac +bB +bB +bD +bH +ac +aa +"} +(15,1,1) = {" +aa +ac +am +am +ao +aB +ac +at +at +bb +bb +at +at +ac +bC +bH +bH +bv +bT +aa +"} +(16,1,1) = {" +aa +ac +an +aq +au +am +aD +aL +ba +aL +aL +ba +aL +aD +bD +bB +bv +bO +bU +bW +"} +(17,1,1) = {" +aa +ac +ao +an +av +aC +ac +aQ +aQ +aQ +aQ +aQ +aQ +ac +bB +bB +bv +bv +bP +aa +"} +(18,1,1) = {" +aa +af +ak +ak +ak +ak +af +aa +aa +aa +aa +aa +aa +bt +ag +ag +bN +bP +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bV +aa +"} +(20,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa "} diff --git a/_maps/RandomRuins/SpaceRuins/spacebar.dmm b/_maps/RandomRuins/SpaceRuins/spacebar.dmm index a64c14d8a47..b7ed1dc854e 100644 --- a/_maps/RandomRuins/SpaceRuins/spacebar.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacebar.dmm @@ -1,109 +1,2149 @@ -"aa" = (/turf/open/space,/area/space) -"ab" = (/turf/closed/mineral,/area/space) -"ac" = (/turf/open/floor/plating/asteroid,/area/space) -"ad" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/open/floor/plating,/area/ruin/unpowered) -"ae" = (/turf/closed/wall,/area/ruin/unpowered) -"af" = (/turf/open/floor/plating/asteroid,/area/ruin/unpowered) -"ag" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/open/floor/plating/asteroid,/area/ruin/unpowered) -"ah" = (/turf/closed/mineral,/area/ruin/unpowered) -"ai" = (/turf/open/floor/plating/asteroid,/turf/closed/wall/shuttle{icon_state = "swall_f6"; dir = 2},/area/ruin/unpowered) -"aj" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/ruin/unpowered) -"ak" = (/turf/open/floor/plating/asteroid,/turf/closed/wall/shuttle{dir = 2; icon_state = "swall_f10"; layer = 2},/area/ruin/unpowered) -"al" = (/turf/closed/wall,/area/ruin/powered) -"am" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/ruin/unpowered) -"an" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle,/area/ruin/unpowered) -"ao" = (/obj/structure/table,/obj/machinery/chem_dispenser/drinks/beer,/turf/open/floor/wood,/area/ruin/powered) -"ap" = (/obj/structure/table,/obj/machinery/chem_dispenser/drinks,/turf/open/floor/wood,/area/ruin/powered) -"aq" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/turf/open/floor/wood,/area/ruin/powered) -"ar" = (/turf/open/floor/wood,/area/ruin/powered) -"as" = (/obj/structure/table,/obj/item/toy/figure/bartender,/turf/open/floor/wood,/area/ruin/powered) -"at" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/open/floor/wood,/area/ruin/powered) -"au" = (/obj/effect/mob_spawn/human/bartender/alive,/turf/open/floor/wood,/area/ruin/powered) -"av" = (/obj/structure/reagent_dispensers/beerkeg,/turf/open/floor/wood,/area/ruin/powered) -"aw" = (/turf/open/floor/plasteel/shuttle,/area/ruin/unpowered) -"ax" = (/obj/machinery/door/airlock{name = "Bar Storage"; req_access_txt = "25"},/turf/open/floor/wood,/area/ruin/powered) -"ay" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/open/floor/wood,/area/ruin/powered) -"az" = (/turf/open/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/closed/wall/shuttle{icon_state = "swall_f5"; dir = 2},/area/ruin/unpowered) -"aA" = (/obj/machinery/door/airlock/shuttle{name = "Escape Pod Airlock"},/turf/open/floor/plasteel/shuttle,/area/ruin/unpowered) -"aB" = (/turf/open/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/closed/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/ruin/unpowered) -"aC" = (/obj/machinery/button/door{id = "spacebardock"; name = "pod dock door cycle"; pixel_x = -32},/turf/open/floor/wood,/area/ruin/powered) -"aD" = (/obj/machinery/vending/boozeomat,/turf/closed/wall,/area/ruin/powered) -"aE" = (/obj/machinery/light/small,/turf/open/floor/wood,/area/ruin/powered) -"aF" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 10},/turf/open/floor/wood,/area/ruin/powered) -"aG" = (/obj/structure/table,/turf/open/floor/wood,/area/ruin/powered) -"aH" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/beer,/obj/item/weapon/reagent_containers/glass/rag,/turf/open/floor/wood,/area/ruin/powered) -"aI" = (/obj/machinery/door/airlock{name = "Bar Storage"; req_access_txt = "25"},/turf/open/floor/plasteel{icon_state = "wood"},/area/ruin/powered) -"aJ" = (/obj/structure/chair/stool,/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aK" = (/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aL" = (/obj/machinery/light{dir = 1},/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aM" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/open/floor/plating,/area/ruin/powered) -"aN" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/closed/wall,/area/ruin/powered) -"aO" = (/obj/machinery/door/airlock/external,/turf/open/floor/plating,/area/ruin/powered) -"aP" = (/turf/open/floor/plating,/area/ruin/powered) -"aQ" = (/obj/structure/chair{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aR" = (/obj/structure/table/wood,/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aS" = (/obj/structure/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aT" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aU" = (/obj/structure/chair,/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aV" = (/obj/machinery/vending/cola,/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aW" = (/obj/machinery/vending/cigarette,/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aX" = (/obj/machinery/vending/coffee,/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aY" = (/obj/machinery/vending/snack,/obj/machinery/light,/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aZ" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/bar,/area/ruin/powered) -"ba" = (/obj/machinery/door/airlock{name = "Unisex Bathroom"},/turf/open/floor/plasteel/freezer,/area/ruin/powered) -"bb" = (/obj/structure/urinal{pixel_x = -32},/turf/open/floor/plasteel/freezer,/area/ruin/powered) -"bc" = (/turf/open/floor/plasteel/freezer,/area/ruin/powered) -"bd" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/turf/open/floor/plasteel/freezer,/area/ruin/powered) -"be" = (/obj/structure/table/wood,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/open/floor/plasteel/bar,/area/ruin/powered) -"bf" = (/obj/machinery/light/small{dir = 8},/turf/open/floor/plasteel/freezer,/area/ruin/powered) -"bg" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 8},/turf/open/floor/plasteel/freezer,/area/ruin/powered) -"bh" = (/obj/machinery/door/airlock{name = "Toilet"},/turf/open/floor/plasteel/freezer,/area/ruin/powered) -"bi" = (/obj/effect/glowshroom/single,/turf/open/floor/plasteel/freezer,/area/ruin/powered) -"bj" = (/obj/machinery/door/airlock/external,/turf/open/floor/plating,/area/ruin/unpowered) -"bk" = (/turf/open/floor/plating,/area/ruin/unpowered) -"bl" = (/turf/open/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/ruin/powered) -"bm" = (/obj/machinery/door/poddoor/preopen{id = "spacebardock"; name = "airlock dock"},/turf/open/floor/plating,/area/ruin/powered) -"bn" = (/obj/machinery/door/poddoor{id = "spacebardock"; name = "airlock dock"},/turf/open/floor/plating,/area/ruin/powered) +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/space, +/area/space) +"ab" = ( +/turf/closed/mineral, +/area/space) +"ac" = ( +/turf/open/floor/plating/asteroid, +/area/space) +"ad" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ae" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"af" = ( +/turf/open/floor/plating/asteroid, +/area/ruin/powered) +"ag" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plating/asteroid, +/area/ruin/powered) +"ah" = ( +/turf/closed/mineral, +/area/ruin/powered) +"ai" = ( +/turf/open/floor/plating/asteroid, +/turf/closed/wall/shuttle{ + icon_state = "swall_f6"; + dir = 2 + }, +/area/ruin/powered) +"aj" = ( +/obj/structure/grille, +/obj/structure/window/shuttle, +/turf/open/floor/plating, +/area/ruin/powered) +"ak" = ( +/turf/open/floor/plating/asteroid, +/turf/closed/wall/shuttle{ + dir = 2; + icon_state = "swall_f10"; + layer = 2 + }, +/area/ruin/powered) +"al" = ( +/turf/closed/wall, +/area/ruin/powered) +"am" = ( +/turf/closed/wall/shuttle{ + icon_state = "swall3"; + dir = 2 + }, +/area/ruin/powered) +"an" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plasteel/shuttle, +/area/ruin/powered) +"ao" = ( +/obj/structure/table, +/obj/machinery/chem_dispenser/drinks/beer, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"ap" = ( +/obj/structure/table, +/obj/machinery/chem_dispenser/drinks, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"aq" = ( +/obj/structure/table, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"ar" = ( +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"as" = ( +/obj/structure/table, +/obj/item/toy/figure/bartender, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"at" = ( +/obj/structure/table, +/obj/item/weapon/reagent_containers/food/drinks/shaker, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"au" = ( +/obj/effect/mob_spawn/human/bartender/alive, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"av" = ( +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"aw" = ( +/turf/open/floor/plasteel/shuttle, +/area/ruin/powered) +"ax" = ( +/obj/machinery/door/airlock{ + name = "Bar Storage"; + req_access_txt = "25" + }, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"ay" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"az" = ( +/turf/open/floor/plating, +/obj/structure/shuttle/engine/propulsion/burst, +/turf/closed/wall/shuttle{ + icon_state = "swall_f5"; + dir = 2 + }, +/area/ruin/powered) +"aA" = ( +/obj/machinery/door/airlock/shuttle{ + name = "Escape Pod Airlock" + }, +/turf/open/floor/plasteel/shuttle, +/area/ruin/powered) +"aB" = ( +/turf/open/floor/plating, +/obj/structure/shuttle/engine/propulsion/burst, +/turf/closed/wall/shuttle{ + icon_state = "swall_f9"; + dir = 2 + }, +/area/ruin/powered) +"aC" = ( +/obj/machinery/button/door{ + id = "spacebardock"; + name = "pod dock door cycle"; + pixel_x = -32 + }, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"aD" = ( +/obj/machinery/vending/boozeomat, +/turf/closed/wall, +/area/ruin/powered{ + name = "Space Bar" + }) +"aE" = ( +/obj/machinery/light/small, +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"aF" = ( +/obj/structure/table, +/obj/item/stack/sheet/metal{ + amount = 10 + }, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"aG" = ( +/obj/structure/table, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"aH" = ( +/obj/structure/table, +/obj/item/weapon/reagent_containers/food/drinks/beer, +/obj/item/weapon/reagent_containers/glass/rag, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"aI" = ( +/obj/machinery/door/airlock{ + name = "Bar Storage"; + req_access_txt = "25" + }, +/turf/open/floor/plasteel{ + icon_state = "wood" + }, +/area/ruin/powered{ + name = "Space Bar" + }) +"aJ" = ( +/obj/structure/chair/stool, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aK" = ( +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aL" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aM" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plating, +/area/ruin/powered) +"aN" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/turf/closed/wall, +/area/ruin/powered{ + name = "Space Bar" + }) +"aO" = ( +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/ruin/powered) +"aP" = ( +/turf/open/floor/plating, +/area/ruin/powered) +"aQ" = ( +/obj/structure/chair{ + tag = "icon-chair (EAST)"; + icon_state = "chair"; + dir = 4 + }, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aR" = ( +/obj/structure/table/wood, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aS" = ( +/obj/structure/chair{ + tag = "icon-chair (WEST)"; + icon_state = "chair"; + dir = 8 + }, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aT" = ( +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aU" = ( +/obj/structure/chair, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aV" = ( +/obj/machinery/vending/cola, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aW" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aX" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aY" = ( +/obj/machinery/vending/snack, +/obj/machinery/light, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aZ" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"ba" = ( +/obj/machinery/door/airlock{ + name = "Unisex Bathroom" + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered{ + name = "Space Bar" + }) +"bb" = ( +/obj/structure/urinal{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered{ + name = "Space Bar" + }) +"bc" = ( +/turf/open/floor/plasteel/freezer, +/area/ruin/powered{ + name = "Space Bar" + }) +"bd" = ( +/obj/structure/sink{ + dir = 4; + icon_state = "sink"; + pixel_x = 11; + pixel_y = 0 + }, +/obj/structure/mirror{ + pixel_x = 28 + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered{ + name = "Space Bar" + }) +"be" = ( +/obj/structure/table/wood, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 4 + }, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"bf" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered{ + name = "Space Bar" + }) +"bg" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered{ + name = "Space Bar" + }) +"bh" = ( +/obj/machinery/door/airlock{ + name = "Toilet" + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered{ + name = "Space Bar" + }) +"bi" = ( +/obj/effect/glowshroom/single, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered{ + name = "Space Bar" + }) +"bj" = ( +/turf/open/floor/plating, +/area/ruin/powered{ + name = "Space Bar" + }) +"bk" = ( +/obj/item/device/radio/beacon, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"bl" = ( +/turf/open/floor/plating{ + icon_plating = "warnplate"; + icon_state = "warnplate" + }, +/area/ruin/powered) +"bm" = ( +/obj/machinery/door/poddoor/preopen{ + id = "spacebardock"; + name = "airlock dock" + }, +/turf/open/floor/plating, +/area/ruin/powered) +"bn" = ( +/obj/machinery/door/poddoor{ + id = "spacebardock"; + name = "airlock dock" + }, +/turf/open/floor/plating, +/area/ruin/powered) +"bs" = ( +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/ruin/powered{ + name = "Space Bar" + }) +"br" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plating, +/area/ruin/powered{ + name = "Space Bar" + }) +"bq" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"bp" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"bo" = ( +/turf/closed/wall, +/area/ruin/powered{ + name = "Space Bar" + }) (1,1,1) = {" -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacababacacacacacaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaacacacacacadadaeadadacacacacacacacacacacacacacaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaacacacadadadafafafafafadadacacadadadadadadagacacacacaaaaaaaaaa -aaaaaaaaaaaaaaaaacacacadafafafafafafahahafafadadafafafafafafafadadacacacaaaaaaaa -aaaaaaaaaaaaaaacacacadafafafafafafahahahahafafafafafafafafafafafafadacacaaaaaaaa -aaaaaaaaaaacacacacadafaiajakafafahahahalalalalalalalalalalalalafafadacacaaaaaaaa -aaaaaaaaaaacacacadafafamanamafafahahahalaoapaqaralasatauaravalafafadacacacaaaaaa -aaaaaaaaacacadadafafafamawamafafahahahalararararaxararararayalafafafadacacaaaaaa -aaaaaaababacadafafafafazaAaBafafafahahalaCarararaDaraEararaFalafafafadacacaaaaaa -aaaaaaaaabacaeafafafafafafafafafafafafalaGaGaHaGalalalalaIalalafafafaeacaaaaaaaa -aaaaaaaaabacadadafafafafafafafafafafafalaJaJaJaJaKaKaLaKaKaKalafafafadacabaaaaaa -aaaaaaaaacacacacadafafafafafafafalaMaNalaKaKaKaKaKaKaKaKaKaKaMafafadacacababaaaa -aaaaaaaaaaacacadafafafafafafafafaOaPaPaOaKaKaKaKaKaKaQaRaSaKaMafafadacabababaaaa -aaaaaaaaaaacacadafafafafafafafafalaMaMalaTaKaQaRaSaKaKaKaKaKaMafafadacacaaaaaaaa -aaaaaaaaacacadafafafafafafafafafafafafalaUaKaKaKaKaKaKaKaKaKaMafafadacacaaaaaaaa -aaaaaaaaabacadafafafafafafafafafafafafalaRaKaKaKaVaWaXaYaKaKalafafadacacacaaaaaa -aaaaaaababacadafafafafafafafafafafafafalaZaKaKaKalalalalalbaalahafafadacacacaaaa -aaaaaaaaabacadafafafafafafafafaiajakafalaKaKaKaKalbbbcbcbcbcalahafafafadacabaaaa -aaaaaaaaacacadafafafafafafafafamanamafaMaKaKaKaUalbbbcbcbcbdalahahafafadacabaaaa -aaaaaaaaacacacadafafafafafafafamawamafafaMaKaKbealalalbfbcbdalahahafafadacabaaaa -aaaaaaaaaaacacadafafafafafafafazaAaBafafafaMaKaZalbgbhbcbibcalahahafafadacacaaaa -aaaaaaaaaaacaeaeaeaeafafafafafafafafafafafafaMalalalalalalalalahahafadacacacaaaa -aaaaaaaaaaaabjbkbkbjafafafafafafafafafafahahafafafahahahahahahahahafadacacacaaaa -aaaaaaaaaaaaaeaeaeaeafafafafafafafafafahahahafafafafafahahahahahahadacacacaaaaaa -aaaaaaaaaaaaacacaeafalblblblblblblalafafahafafafafafafafafahahahafadacacaaaaaaaa -aaaaaaaaaaaaacabaeafalbmbmbmbmbmbmalafafafafafafafafafafafafafafadaeacabaaaaaaaa -aaaaaaaaaaaaababaeaealaPaPaPaPaPaPalaeaeaeadadadadadadadadadadaeacacacacaaaaaaaa -aaaaaaaaaaaaababababalaPaPaPaPaPaPalacacacacacacacacacacacacacacacacacaaaaaaaaaa -aaaaaaaaaaaaaaaaababalaPaPaPaPaPaPalacacacacacacacacabacacacacacacaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaalaPaPaPaPaPaPalacacacacaaaaaaacacacababaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaalbnbnbnbnbnbnalacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaalaaaaaaaaaaaaalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ac +ab +ab +ab +ac +aa +aa +ac +ab +ab +ab +ac +ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(7,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ac +ac +aM +aM +al +aM +ac +ac +ac +aM +aM +aM +aM +aM +ac +ac +al +aO +al +ac +ac +ab +ab +aa +aa +aa +aa +aa +aa +"} +(8,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +aM +ac +aM +aM +af +af +af +af +af +aM +aM +al +aP +al +ac +ab +ab +ab +aa +aa +aa +aa +aa +aa +"} +(9,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +af +af +aM +af +af +af +af +af +af +af +af +af +al +aP +al +al +al +al +ab +ab +aa +aa +aa +aa +aa +"} +(10,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +al +aO +al +af +af +al +ab +ab +aa +aa +aa +aa +aa +"} +(11,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +al +al +al +al +al +al +al +al +aa +aa +"} +(12,1,1) = {" +aa +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +ai +am +am +az +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +bl +bm +aP +aP +aP +aP +bn +aa +aa +aa +"} +(13,1,1) = {" +aa +aa +aa +aa +aa +aa +ac +ac +aM +af +af +aj +an +aw +aA +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +bl +bm +aP +aP +aP +aP +bn +aa +aa +aa +"} +(14,1,1) = {" +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +ak +am +am +aB +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +bl +bm +aP +aP +aP +aP +bn +aa +aa +aa +"} +(15,1,1) = {" +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +bl +bm +aP +aP +aP +aP +bn +aa +aa +aa +"} +(16,1,1) = {" +aa +aa +aa +aa +ac +ac +ac +ad +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +ai +am +am +az +af +af +af +bl +bm +aP +aP +aP +aP +bn +aa +aa +aa +"} +(17,1,1) = {" +aa +aa +aa +aa +ac +ac +ac +ad +af +af +af +ah +ah +ah +af +af +af +bo +bs +bo +af +af +af +aj +an +aw +aA +af +af +af +bl +bm +aP +aP +aP +aP +bn +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +aa +aa +ac +ac +ac +ae +af +af +ah +ah +ah +ah +ah +af +af +br +bj +br +af +af +af +ak +am +am +aB +af +af +af +al +al +al +al +al +al +al +al +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +ac +ac +ac +ad +af +ah +ah +ah +ah +ah +ah +af +af +aN +bj +br +af +af +af +af +af +af +af +af +af +af +af +af +al +ac +ac +ac +ac +aa +aa +aa +"} +(20,1,1) = {" +aa +aa +aa +ab +ac +ac +ac +ad +af +ah +ah +bo +bo +bo +bo +bo +bo +bo +bs +bo +bo +bo +bo +bo +br +af +af +af +af +ah +af +af +al +ac +ac +ac +ac +aa +aa +aa +"} +(21,1,1) = {" +aa +aa +aa +ab +ab +ac +ac +ac +aM +af +ah +bo +ao +ar +aC +aG +aJ +aK +aK +aT +aU +aR +aZ +aK +aK +br +af +af +ah +ah +ah +af +al +ac +ac +ac +aa +aa +aa +aa +"} +(22,1,1) = {" +aa +aa +aa +ab +ab +ac +ac +ac +aM +af +af +bo +ap +ar +ar +aG +aJ +aK +aK +aK +aK +aK +aK +aK +aK +aK +br +af +ah +ah +af +af +aM +ac +ac +ac +aa +aa +aa +aa +"} +(23,1,1) = {" +aa +aa +aa +aa +ab +ab +ac +ac +ac +aM +af +bo +aq +ar +ar +aH +aJ +aK +aK +aQ +aK +aK +aK +aK +aK +aK +aK +br +af +af +af +af +aM +ac +ac +aa +aa +aa +aa +aa +"} +(24,1,1) = {" +aa +aa +aa +aa +ab +ab +ac +ac +ac +aM +af +bo +ar +ar +ar +aG +aJ +aK +aK +aR +aK +aK +aK +aK +aU +be +aZ +bo +af +af +af +af +aM +ac +ac +aa +aa +aa +aa +aa +"} +(25,1,1) = {" +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +bo +bo +ax +aD +bo +aK +aK +aK +aS +aK +aV +bo +bo +bo +bo +bo +bo +af +af +af +af +aM +ac +ac +aa +aa +aa +aa +aa +"} +(26,1,1) = {" +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +bo +as +ar +bp +bo +aK +aK +aK +aK +bk +aW +bo +bb +bb +bo +bg +bo +ah +af +af +af +aM +ac +ac +ac +aa +aa +aa +aa +"} +(27,1,1) = {" +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +bo +at +ar +aE +bo +aL +aK +aQ +aK +aK +aX +bo +bc +bc +bo +bh +bo +ah +af +af +af +aM +ac +ab +ac +aa +aa +aa +aa +"} +(28,1,1) = {" +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +bo +au +ar +bq +bo +aK +aK +aR +aK +aK +aY +bo +bc +bc +bf +bc +bo +ah +ah +af +af +aM +ac +ac +ac +aa +aa +aa +aa +"} +(29,1,1) = {" +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +bo +ar +ar +ar +aI +aK +aK +aS +aK +aK +aK +bo +bc +bc +bc +bi +bo +ah +ah +af +af +aM +ac +ac +ab +aa +aa +aa +aa +"} +(30,1,1) = {" +aa +aa +aa +aa +aa +aa +ac +ac +aM +af +af +bo +av +ay +aF +bo +aK +aK +aK +aK +aK +aK +ba +bc +bd +bd +bc +bo +ah +ah +ah +af +aM +ac +ac +ab +aa +aa +aa +aa +"} +(31,1,1) = {" +aa +aa +aa +aa +aa +aa +ac +ac +ag +af +af +bo +bo +bo +bo +bo +bo +br +br +br +br +bo +bo +bo +bo +bo +bo +bo +ah +ah +ah +af +aM +ac +ac +aa +aa +aa +aa +aa +"} +(32,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ac +ac +aM +af +af +af +af +af +af +af +af +af +af +af +af +ah +ah +ah +ah +ah +ah +ah +ah +ah +af +al +ac +ac +aa +aa +aa +aa +aa +"} +(33,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ac +ac +aM +af +af +af +af +af +af +af +af +af +af +af +af +af +af +ah +ah +ah +ah +ah +ah +af +aM +ac +ac +ac +aa +aa +aa +aa +aa +"} +(34,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ac +ac +aM +aM +aM +af +af +af +af +aM +aM +aM +aM +aM +af +af +af +af +af +af +af +aM +aM +al +ac +ac +aa +aa +aa +aa +aa +aa +"} +(35,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ac +ac +ac +ac +ac +aM +aM +al +aM +ac +ac +ac +ac +ac +aM +af +af +af +af +aM +aM +ac +ac +ac +ac +ac +aa +aa +aa +aa +aa +aa +"} +(36,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +ac +ac +ac +ac +ac +ac +ac +ac +ac +ab +ac +ac +ac +ac +aM +aM +aM +aM +ac +ac +ac +ac +ab +ac +aa +aa +aa +aa +aa +aa +aa +"} +(37,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ac +ac +ac +aa +ab +ab +ab +aa +aa +ac +ac +ac +ac +ac +ac +ac +ac +ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(38,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +aa +aa +aa +ac +ab +ab +ab +ac +ac +ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(40,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa "} diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 0eac402bedb..b3e84ff5c62 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -21,7 +21,7 @@ "au" = (/obj/structure/cult/talisman,/obj/effect/decal/remains/human,/obj/item/stack/sheet/runed_metal{amount = 25},/obj/item/weapon/veilrender/honkrender,/obj/item/clothing/mask/gas/clown_hat,/obj/item/organ/internal/heart/demon,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) "av" = (/obj/structure/divine/trap/stun{desc = "A rune inscribed in the floor, the air feeling electrified around it."; name = "shock rune"},/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) "aw" = (/obj/effect/decal/remains/human,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) -"ax" = (/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/turf/closed/wall/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) +"ax" = (/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/turf/closed/wall/mineral/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) "ay" = (/obj/structure/cult/tome,/obj/item/weapon/tome,/obj/item/stack/sheet/runed_metal{amount = 25},/obj/item/weapon/coin/antagtoken,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) "az" = (/obj/structure/constructshell,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) "aA" = (/obj/structure/cultgirder,/obj/item/stack/sheet/runed_metal,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) @@ -53,7 +53,7 @@ "ba" = (/obj/structure/cult/talisman,/obj/item/weapon/plasma_fist_scroll,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) "bb" = (/mob/living/simple_animal/hostile/poison/giant_spider/hunter,/turf/open/floor/plating/asteroid/basalt{initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 3"}) "bc" = (/obj/effect/spider/stickyweb,/turf/open/floor/plating/asteroid/basalt{initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 3"}) -"bd" = (/turf/open/floor/plating/asteroid/basalt/lava{initial_gas_mix = "n2=23;o2=14"},/turf/closed/wall/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) +"bd" = (/turf/open/floor/plating/asteroid/basalt/lava{initial_gas_mix = "n2=23;o2=14"},/turf/closed/wall/mineral/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) "be" = (/mob/living/simple_animal/hostile/spawner/mining/goliath,/turf/open/floor/plating/asteroid/basalt{initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 3"}) "bf" = (/obj/effect/decal/cleanable/blood,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) "bg" = (/mob/living/simple_animal/hostile/poison/giant_spider/nurse,/turf/open/floor/plating/asteroid/basalt{initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 3"}) diff --git a/_maps/map_files/AsteroidStation/AsteroidStation.dmm b/_maps/map_files/AsteroidStation/AsteroidStation.dmm index 7aa34319ef8..ca889ab1ac7 100644 --- a/_maps/map_files/AsteroidStation/AsteroidStation.dmm +++ b/_maps/map_files/AsteroidStation/AsteroidStation.dmm @@ -488,9 +488,8 @@ /turf/closed/mineral/random, /area/mine/explored) "abg" = ( -/obj/machinery/sleeper{ - icon_state = "sleeper-open"; - dir = 4 +/obj/machinery/sleeper/syndie{ + dir = 4 }, /turf/open/floor/plasteel/shuttle{ icon_state = "shuttlefloor4" diff --git a/_maps/map_files/BirdStation/BirdStation.dmm b/_maps/map_files/BirdStation/BirdStation.dmm index 23fe48b8871..c15747c8fc1 100644 --- a/_maps/map_files/BirdStation/BirdStation.dmm +++ b/_maps/map_files/BirdStation/BirdStation.dmm @@ -56,7 +56,7 @@ "abd" = (/obj/machinery/door/window{dir = 4; name = "Infirmary"; req_access_txt = "150"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate) "abe" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access_txt = "150"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate) "abf" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/crowbar/red,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate) -"abg" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate) +"abg" = (/obj/machinery/sleeper/syndie{dir = 4},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate) "abh" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access_txt = "150"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate) "abi" = (/obj/machinery/door/window{dir = 8; name = "Tool Storage"; req_access_txt = "150"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate) "abj" = (/obj/structure/table,/obj/item/weapon/gun/syringe{pixel_x = 1; pixel_y = 2},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate) diff --git a/_maps/map_files/DreamStation/dreamstation04.dmm b/_maps/map_files/DreamStation/dreamstation04.dmm index 21f5b372084..a2c597f1c0a 100644 --- a/_maps/map_files/DreamStation/dreamstation04.dmm +++ b/_maps/map_files/DreamStation/dreamstation04.dmm @@ -2968,8 +2968,7 @@ }, /area/shuttle/syndicate) "afH" = ( -/obj/machinery/sleeper{ - icon_state = "sleeper-open"; +/obj/machinery/sleeper/syndie{ dir = 4 }, /turf/open/floor/plasteel/shuttle{ diff --git a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm index 4dd58063038..cfece55a966 100644 --- a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm +++ b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm @@ -2176,8 +2176,7 @@ name = "AI Satellite Service" }) "adT" = ( -/obj/machinery/sleeper{ - icon_state = "sleeper-open"; +/obj/machinery/sleeper/syndie{ dir = 4 }, /turf/open/floor/plasteel/shuttle{ diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index fe82c35a6a7..d27566ed208 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -93756,12 +93756,6 @@ dir = 1; on = 1 }, -/obj/item/device/radio/intercom{ - freerange = 0; - frequency = 1459; - name = "Station Intercom (General)"; - pixel_x = 29 - }, /turf/open/floor/plasteel{ dir = 8; icon_state = "chapel" @@ -93882,18 +93876,12 @@ }, /area/chapel/main) "cTE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/turf/closed/wall/shuttle{ + tag = "icon-wall3 (NORTHWEST)"; + icon_state = "wall3"; + dir = 9 }, -/mob/living/simple_animal/hostile/retaliate/bat{ - name = "Orlocke"; - real_name = "Orlocke"; - turns_per_move = 6 - }, -/turf/open/floor/plasteel{ - icon_state = "dark" - }, -/area/chapel/main) +/area/shuttle/escape) "cTF" = ( /obj/machinery/door/window{ dir = 4; @@ -93933,8 +93921,13 @@ }, /area/chapel/main) "cTH" = ( -/obj/structure/bookcase{ - name = "Holy Bookcase" +/obj/machinery/camera{ + c_tag = "Chapel - Port"; + dir = 4; + network = list("SS13") + }, +/obj/structure/chair/comfy/black{ + dir = 4 }, /turf/open/floor/plasteel{ dir = 8; @@ -96581,8 +96574,7 @@ }, /area/shuttle/syndicate) "cXV" = ( -/obj/machinery/sleeper{ - icon_state = "sleeper-open"; +/obj/machinery/sleeper/syndie{ dir = 4 }, /turf/open/floor/plasteel/shuttle{ @@ -99088,9 +99080,8 @@ }, /area/shuttle/abandoned) "dcy" = ( -/turf/open/space, /turf/closed/wall/shuttle{ - icon_state = "swall_f6"; + icon_state = "swall7"; dir = 2 }, /area/shuttle/escape) @@ -99119,17 +99110,29 @@ /area/shuttle/escape) "dcD" = ( /obj/machinery/door/airlock/shuttle{ - name = "Emergency Shuttle Cargo Bay Airlock" + name = "Emergency Shuttle Airlock" }, -/turf/open/floor/plating{ - dir = 1; - icon_state = "delivery" +/obj/docking_port/mobile/emergency{ + dir = 2; + dwidth = 5; + height = 14; + name = "MetaStation emergency shuttle"; + width = 25 }, +/obj/docking_port/stationary{ + dheight = 0; + dir = 2; + dwidth = 9; + height = 25; + id = "emergency_home"; + name = "MetaStation emergency evac bay"; + width = 29 + }, +/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "dcE" = ( -/turf/open/space, /turf/closed/wall/shuttle{ - icon_state = "swall_f10"; + icon_state = "swall8"; dir = 2 }, /area/shuttle/escape) @@ -99236,17 +99239,15 @@ /turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "dcJ" = ( -/obj/machinery/status_display{ - pixel_y = 32 +/turf/closed/wall/shuttle{ + icon_state = "swall4"; + dir = 2 }, -/obj/machinery/hologram/holopad, -/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "dcK" = ( -/obj/structure/sign/nosmoking_2, +/obj/structure/sign/bluecross_2, /turf/closed/wall/shuttle{ - icon_state = "swall3"; - dir = 2 + icon_state = "swall2" }, /area/shuttle/escape) "dcL" = ( @@ -99259,17 +99260,25 @@ }, /area/shuttle/escape) "dcM" = ( -/turf/open/floor/plating{ - dir = 1; - icon_state = "delivery" +/obj/item/device/radio/intercom{ + dir = 4; + name = "Station Intercom (General)"; + pixel_x = 0; + pixel_y = 27 }, +/obj/structure/chair, +/turf/open/floor/plasteel/shuttle/white, /area/shuttle/escape) "dcN" = ( -/obj/machinery/recharge_station, -/turf/open/floor/plating{ - icon_state = "bot" +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/area/shuttle/escape) +/turf/open/floor/plasteel{ + icon_state = "white" + }, +/area/toxins/xenobiology) "dcO" = ( /obj/structure/table, /obj/item/weapon/clipboard, @@ -99286,16 +99295,16 @@ }, /area/shuttle/escape) "dcQ" = ( -/obj/item/device/radio/intercom{ - dir = 4; - name = "Station Intercom (General)"; - pixel_x = 31 +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 4; + icon_state = "1-4"; + tag = "90Curve" }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plating{ - icon_state = "bot" +/turf/open/floor/plasteel{ + icon_state = "white" }, -/area/shuttle/escape) +/area/toxins/xenobiology) "dcR" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -99336,31 +99345,35 @@ }, /area/shuttle/escape) "dcU" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" +/obj/structure/extinguisher_cabinet, +/turf/closed/wall/shuttle{ + icon_state = "swall12"; + dir = 2 }, /area/shuttle/escape) "dcV" = ( -/obj/structure/chair{ - dir = 8 +/obj/machinery/vending/wallmed{ + name = "Emergency NanoMed"; + pixel_x = 0; + pixel_y = 0; + req_access_txt = "0"; + use_power = 0 }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" +/turf/closed/wall/shuttle{ + icon_state = "swall12"; + dir = 2 }, /area/shuttle/escape) "dcW" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/structure/extinguisher_cabinet{ - pixel_x = -27; - pixel_y = 0 +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" }, -/turf/open/floor/plating{ - icon_state = "bot" +/turf/open/floor/plasteel{ + icon_state = "white" }, -/area/shuttle/escape) +/area/toxins/xenobiology) "dcX" = ( /obj/structure/closet/crate{ name = "emergency supplies crate" @@ -99383,155 +99396,112 @@ }, /area/shuttle/escape) "dcY" = ( -/obj/docking_port/stationary{ - dheight = 0; - dir = 4; - dwidth = 5; - height = 14; - id = "emergency_home"; - name = "emergency evac bay"; - width = 25 +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8"; + tag = "" }, -/obj/docking_port/mobile/emergency{ - dheight = 0; - dir = 4; - dwidth = 5; - height = 14; - width = 25 +/obj/machinery/light/small{ + dir = 4 }, -/obj/machinery/door/airlock/shuttle{ - name = "Emergency Shuttle Airlock" +/turf/open/floor/plasteel{ + icon_state = "white" }, -/turf/open/floor/plasteel/shuttle, -/area/shuttle/escape) +/area/toxins/xenobiology) "dcZ" = ( -/obj/machinery/vending/wallmed{ - name = "Emergency NanoMed"; - pixel_x = 0; - pixel_y = 0; - req_access_txt = "0"; - use_power = 0 +/obj/item/device/radio/intercom{ + freerange = 0; + frequency = 1459; + name = "Station Intercom (General)"; + pixel_x = 29 }, -/turf/closed/wall/shuttle{ - icon_state = "swall3"; - dir = 2 +/turf/open/floor/plasteel{ + icon_state = "chapel" }, -/area/shuttle/escape) +/area/chapel/main) "dda" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating{ - icon_state = "bot" +/obj/structure/chair/comfy/black{ + dir = 8 }, -/area/shuttle/escape) +/turf/open/floor/plasteel{ + dir = 4; + icon_state = "chapel" + }, +/area/chapel/main) "ddb" = ( -/obj/machinery/space_heater, -/obj/structure/extinguisher_cabinet{ - pixel_x = 27; - pixel_y = 0 - }, -/turf/open/floor/plating{ - icon_state = "bot" +/turf/closed/wall/shuttle{ + icon_state = "swall_s6"; + dir = 2 }, /area/shuttle/escape) "ddc" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/item/device/radio/intercom{ - dir = 4; - name = "Station Intercom (General)"; - pixel_x = -31 - }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" +/turf/closed/wall/shuttle{ + icon_state = "swall1" }, /area/shuttle/escape) "ddd" = ( -/obj/structure/rack, -/obj/item/weapon/storage/toolbox/electrical{ - pixel_x = -3; - pixel_y = 1 - }, -/obj/item/weapon/storage/toolbox/mechanical{ - pixel_x = 0; - pixel_y = -1 - }, -/obj/item/weapon/storage/toolbox/emergency{ - pixel_x = 3; - pixel_y = -5 - }, -/turf/open/floor/plating{ - dir = 1; - icon_state = "warning" +/obj/structure/sign/nosmoking_2, +/turf/closed/wall/shuttle{ + icon_state = "swall12"; + dir = 2 }, /area/shuttle/escape) "dde" = ( -/obj/structure/rack, -/obj/item/weapon/crowbar, -/obj/item/weapon/wrench, -/obj/item/weapon/weldingtool, -/obj/item/weapon/wirecutters, -/obj/item/stack/cable_coil, -/turf/open/floor/plating{ - dir = 1; - icon_state = "warning" +/turf/closed/wall/shuttle{ + icon_state = "swall_s10"; + dir = 2 }, /area/shuttle/escape) "ddf" = ( -/obj/structure/rack{ - dir = 1 - }, -/obj/item/weapon/tank/internals/oxygen/red, -/obj/item/clothing/suit/fire/firefighter, -/obj/item/clothing/mask/gas, -/obj/item/clothing/head/hardhat/red, -/turf/open/floor/plating{ - dir = 1; - icon_state = "warning" - }, +/obj/structure/chair, +/turf/open/floor/plasteel/shuttle/white, /area/shuttle/escape) "ddg" = ( -/turf/open/floor/plating{ - dir = 1; - icon_state = "warning" +/obj/structure/shuttle/engine/propulsion{ + dir = 4 }, +/turf/open/floor/plating/airless, /area/shuttle/escape) "ddh" = ( -/obj/structure/extinguisher_cabinet, -/turf/closed/wall/shuttle{ - icon_state = "swall3"; - dir = 2 +/obj/item/device/radio/intercom{ + dir = 2; + name = "Station Intercom (General)"; + pixel_x = 0; + pixel_y = -31 }, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plasteel/shuttle/white, /area/shuttle/escape) "ddi" = ( -/turf/closed/wall/shuttle{ - icon_state = "swall7"; - dir = 2 - }, -/area/shuttle/escape) -"ddj" = ( -/obj/structure/chair{ +/obj/structure/shuttle/engine/heater{ dir = 8 }, -/obj/structure/sign/bluecross_2{ - pixel_x = 32 +/obj/structure/window/reinforced{ + dir = 4 }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"ddj" = ( +/obj/structure/chair/office/dark{ + dir = 1 }, +/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "ddk" = ( +/obj/machinery/status_display, /turf/closed/wall/shuttle{ - icon_state = "swall8"; + icon_state = "swall3"; dir = 2 }, /area/shuttle/escape) "ddl" = ( -/obj/structure/sign/bluecross_2, -/turf/closed/wall/shuttle{ - icon_state = "swall4"; - dir = 2 +/obj/structure/chair{ + dir = 1 }, +/turf/open/floor/plasteel/shuttle/white, /area/shuttle/escape) "ddm" = ( /obj/machinery/door/airlock/glass_medical{ @@ -99548,12 +99518,11 @@ }, /area/shuttle/escape) "ddo" = ( -/obj/machinery/sleeper{ +/obj/structure/sign/bluecross_2, +/turf/closed/wall/shuttle{ + icon_state = "swall14"; dir = 2 }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" - }, /area/shuttle/escape) "ddp" = ( /obj/structure/table, @@ -99578,21 +99547,16 @@ }, /area/shuttle/escape) "ddr" = ( -/obj/machinery/shower{ - dir = 4; - icon_state = "shower"; - name = "emergency shower" +/obj/machinery/status_display{ + dir = 8; + pixel_x = 32; + pixel_y = 0 }, +/obj/machinery/hologram/holopad, /turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "dds" = ( -/obj/structure/sink{ - dir = 4; - icon_state = "sink"; - pixel_x = 11; - pixel_y = 0 - }, -/turf/open/floor/plasteel/shuttle, +/turf/open/floor/plasteel/floorgrime, /area/shuttle/escape) "ddt" = ( /obj/structure/table, @@ -99640,27 +99604,17 @@ /area/shuttle/escape) "ddv" = ( /obj/structure/table, -/obj/item/weapon/scalpel{ - pixel_y = 12 +/obj/item/weapon/paper_bin{ + pixel_x = -2; + pixel_y = 8 }, -/obj/item/weapon/circular_saw, -/obj/item/weapon/retractor{ - pixel_x = 4 - }, -/obj/item/weapon/hemostat{ - pixel_x = -4 - }, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, /obj/item/device/radio/intercom{ - dir = 4; + dir = 2; name = "Station Intercom (General)"; pixel_x = 0; - pixel_y = -27 - }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" + pixel_y = -31 }, +/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "ddw" = ( /obj/structure/table/optable, @@ -99670,32 +99624,31 @@ }, /area/shuttle/escape) "ddx" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/item/device/radio/intercom{ +/obj/structure/table, +/obj/item/weapon/folder/blue, +/obj/structure/extinguisher_cabinet{ dir = 4; - name = "Station Intercom (General)"; - pixel_x = 31 - }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" + pixel_x = 0; + pixel_y = -27 }, +/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "ddy" = ( -/obj/machinery/status_display, -/turf/closed/wall/shuttle{ - icon_state = "swall12"; - dir = 2 +/obj/machinery/space_heater, +/obj/structure/extinguisher_cabinet{ + dir = 4; + pixel_x = 0; + pixel_y = -27 + }, +/turf/open/floor/plating{ + icon_state = "bot" }, /area/shuttle/escape) "ddz" = ( -/obj/structure/chair, -/obj/structure/reagent_dispensers/peppertank{ - pixel_x = 0; - pixel_y = 29 +/obj/machinery/door/airlock/shuttle{ + name = "Emergency Shuttle Cargo Bay Airlock" }, -/turf/open/floor/plasteel/shuttle/red, +/turf/open/floor/plasteel/delivery, /area/shuttle/escape) "ddA" = ( /obj/structure/chair{ @@ -99748,60 +99701,37 @@ }, /area/shuttle/escape) "ddI" = ( -/obj/machinery/flasher{ - id = "emshuttlebridgeflash"; - pixel_y = -24 +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "floorgrime" }, -/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "ddJ" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/flasher{ - id = "emshuttleflash"; - pixel_y = -24 - }, -/turf/open/floor/plasteel/shuttle/red, +/obj/machinery/shower, +/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "ddK" = ( -/obj/structure/chair{ - dir = 1 +/obj/machinery/sleeper{ + dir = 8 }, -/obj/machinery/button/flasher{ - id = "emshuttleflash"; - name = "brig flasher button"; - pixel_y = -23; - req_access_txt = "0"; - req_one_access_txt = "1;63;19" - }, -/turf/open/floor/plasteel/shuttle/red, +/turf/open/floor/plasteel/shuttle/white, /area/shuttle/escape) "ddL" = ( -/obj/structure/table, -/obj/item/weapon/folder/red{ - pixel_x = 3 +/obj/structure/rack, +/obj/item/weapon/crowbar, +/obj/item/weapon/wrench, +/obj/item/weapon/weldingtool, +/obj/item/weapon/wirecutters, +/obj/item/stack/cable_coil, +/turf/open/floor/plasteel/warning{ + dir = 4 }, -/obj/item/weapon/folder/white{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/item/device/radio/intercom{ - dir = 4; - name = "Station Intercom (General)"; - pixel_x = 31 - }, -/obj/item/weapon/book/manual/wiki/security_space_law{ - pixel_x = -4; - pixel_y = 4 - }, -/turf/open/floor/plasteel/shuttle/red, /area/shuttle/escape) "ddM" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plasteel/shuttle/red, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plasteel/delivery, /area/shuttle/escape) "ddN" = ( /obj/machinery/door/airlock/glass_command{ @@ -99829,14 +99759,8 @@ /turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "ddR" = ( -/obj/machinery/button/flasher{ - id = "emshuttlebridgeflash"; - name = "cockpit flasher button"; - pixel_y = 24; - req_access_txt = "0"; - req_one_access_txt = "1;63;19" - }, -/turf/open/floor/plasteel/shuttle, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel/delivery, /area/shuttle/escape) "ddS" = ( /obj/machinery/door/airlock/command{ @@ -99847,30 +99771,17 @@ /turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "ddT" = ( -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor4" - }, +/turf/open/floor/plasteel/delivery, /area/shuttle/escape) "ddU" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/item/device/radio/intercom{ - dir = 4; - name = "Station Intercom (General)"; - pixel_x = 0; - pixel_y = 27 - }, -/turf/open/floor/plating{ - icon_state = "floorgrime" - }, +/obj/machinery/recharge_station, +/turf/open/floor/plasteel/delivery, /area/shuttle/escape) "ddV" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/machinery/status_display{ - pixel_y = 31 - }, -/turf/open/floor/plating{ - icon_state = "floorgrime" +/obj/structure/chair{ + dir = 8 }, +/turf/open/floor/plasteel/shuttle/red, /area/shuttle/escape) "ddW" = ( /obj/structure/chair/office/dark{ @@ -99883,24 +99794,34 @@ /turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "ddY" = ( -/obj/structure/chair/office/dark{ - dir = 4 +/obj/structure/reagent_dispensers/peppertank, +/turf/closed/wall/shuttle{ + icon_state = "swall3"; + dir = 2 }, -/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "ddZ" = ( -/obj/structure/table, -/obj/item/weapon/folder/blue, -/obj/structure/extinguisher_cabinet{ - pixel_x = 27; - pixel_y = 0 +/obj/structure/rack, +/obj/item/weapon/storage/toolbox/electrical{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/weapon/storage/toolbox/mechanical{ + pixel_x = 0; + pixel_y = -1 + }, +/obj/item/weapon/storage/toolbox/emergency{ + pixel_x = 3; + pixel_y = -5 + }, +/turf/open/floor/plasteel/warning{ + dir = 4 }, -/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "dea" = ( -/turf/closed/wall/shuttle{ - icon_state = "swallc4"; - dir = 2 +/obj/machinery/suit_storage_unit/standard_unit, +/turf/open/floor/plating{ + icon_state = "floorgrime" }, /area/shuttle/escape) "deb" = ( @@ -99920,17 +99841,9 @@ /turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "dee" = ( -/obj/structure/table, -/obj/item/weapon/paper_bin{ - pixel_x = -2; - pixel_y = 8 +/turf/open/floor/plasteel/warning{ + dir = 4 }, -/obj/item/device/radio/intercom{ - dir = 4; - name = "Station Intercom (General)"; - pixel_x = 31 - }, -/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "def" = ( /obj/structure/table, @@ -99979,24 +99892,30 @@ /turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "dem" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plating{ - icon_state = "floorgrime" +/turf/closed/wall/shuttle{ + icon_state = "diagonalWall3" }, /area/shuttle/escape) "den" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -27; - pixel_y = 0 +/obj/structure/table, +/obj/item/weapon/folder/red{ + pixel_x = 3 }, -/obj/structure/chair{ - dir = 1 +/obj/item/weapon/folder/white{ + pixel_x = -4; + pixel_y = 2 }, -/turf/open/floor/plating{ - icon_state = "floorgrime" +/obj/item/device/radio/intercom{ + dir = 2; + name = "Station Intercom (General)"; + pixel_x = 0; + pixel_y = -31 }, +/obj/item/weapon/book/manual/wiki/security_space_law{ + pixel_x = -4; + pixel_y = 4 + }, +/turf/open/floor/plasteel/shuttle/red, /area/shuttle/escape) "deo" = ( /obj/structure/reagent_dispensers/watertank, @@ -100005,13 +99924,27 @@ }, /area/shuttle/escape) "dep" = ( -/turf/open/space, -/turf/closed/wall/shuttle{ - icon_state = "diagonalWall3" +/obj/structure/table, +/obj/item/weapon/scalpel{ + pixel_y = 12 }, -/turf/closed/wall/shuttle{ - icon_state = "swall_f5"; - dir = 2 +/obj/item/weapon/circular_saw, +/obj/item/weapon/retractor{ + pixel_x = 4 + }, +/obj/item/weapon/hemostat{ + pixel_x = -4 + }, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/mask/surgical, +/obj/item/device/radio/intercom{ + dir = 2; + name = "Station Intercom (General)"; + pixel_x = -27; + pixel_y = 0 + }, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" }, /area/shuttle/escape) "deq" = ( @@ -100021,23 +99954,31 @@ }, /area/shuttle/escape) "der" = ( -/turf/open/space, -/turf/closed/wall/shuttle{ - icon_state = "swall_f9"; - dir = 2 - }, +/obj/structure/sink, +/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "des" = ( -/obj/structure/window/reinforced{ +/obj/structure/rack{ dir = 1 }, -/obj/structure/shuttle/engine/heater, -/turf/open/floor/plating/airless, +/obj/item/weapon/tank/internals/oxygen/red, +/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/mask/gas, +/obj/item/clothing/head/hardhat/red, +/turf/open/floor/plasteel/warning{ + dir = 4 + }, /area/shuttle/escape) "det" = ( -/turf/open/space, -/turf/closed/wall/shuttle{ - icon_state = "diagonalWall3" +/obj/item/device/radio/intercom{ + dir = 2; + name = "Station Intercom (General)"; + pixel_x = 0; + pixel_y = -31 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plating{ + icon_state = "bot" }, /area/shuttle/escape) "deu" = ( @@ -100046,15 +99987,16 @@ }, /area/shuttle/escape) "dev" = ( -/turf/open/space, /turf/closed/wall/shuttle{ - dir = 4; - icon_state = "diagonalWall3" + icon_state = "swall_s5"; + dir = 2 }, /area/shuttle/escape) "dew" = ( -/obj/structure/shuttle/engine/propulsion, -/turf/open/floor/plating/airless, +/turf/closed/wall/shuttle{ + icon_state = "swall_s9"; + dir = 2 + }, /area/shuttle/escape) "dex" = ( /obj/structure/grille, @@ -100668,6 +100610,20 @@ icon_state = "warning" }, /area/hydroponics) +"dfJ" = ( +/obj/structure/bookcase{ + name = "Holy Bookcase" + }, +/turf/open/floor/plasteel{ + dir = 4; + icon_state = "chapel" + }, +/area/chapel/main) +"dfK" = ( +/turf/closed/wall/shuttle{ + icon_state = "swall2" + }, +/area/shuttle/escape) (1,1,1) = {" aaa @@ -121677,7 +121633,7 @@ cSr cSR cSQ cSr -cUd +cUe cRQ aaa aaf @@ -121931,10 +121887,10 @@ cQW cNm cRV cSr -cSQ -cSQ -cTE -cUe +cTJ +cTn +cSr +cTK cRQ aaa aaf @@ -122189,10 +122145,10 @@ cRz cRW cSs cSS -cTn -cSr -cTK -cRQ +cOU +cTF +cUf +cOU aaa aaf aaa @@ -122447,9 +122403,9 @@ cRX cSt cST cOU -cTF -cUf -cOU +cTG +cUg +cUt aaa aaf aaa @@ -122704,9 +122660,9 @@ cRY cSu cXo cOU -cTG -cUg -cUt +cOU +cOU +cOU aaf aaf aaa @@ -122720,7 +122676,7 @@ aaa aaa aaa aaa -aaa +aac aaa aaa aaa @@ -122961,20 +122917,20 @@ cOU cSv cXc cOU +dfJ cOU -cOU -cOU -aaf -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa +ddg +ddg +ddg +deu +ddg +ddg +deu +ddg +ddg +ddg aaa aaa aaa @@ -123217,22 +123173,22 @@ cNm cRZ cSw cXp -cOU cTH +cRh cOU aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +cTE +ddi +ddi +ddi +deu +ddi +ddi +deu +ddi +ddi +ddi +dem aaa aaa aaa @@ -123474,23 +123430,23 @@ cRB cSa cSx cSX -cTo +cSB cTI cOU -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ddb +dcF +dcF +dcF +dcF +dcF +dcF +dcF +dcy +dcF +dcF +dcF +dcF +dev aaa aaa aaa @@ -123734,20 +123690,20 @@ cSY cTp cTJ cUh -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac +dcz +deg +def +deh +dei +dek +dej +del +dcU +ddI +ddI +ddI +deo +dcz aaa aaa aaa @@ -123991,20 +123947,20 @@ cSY cRe cTJ cUh -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +dcz +dec +dcI +ded +ddW +ddj +dcI +ddv +dcA +dcP +dcP +dcP +dcP +deb aaa aaa aaa @@ -124248,20 +124204,20 @@ cSZ cTq cTK cUh -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +dcz +ddX +ddj +dcI +dcI +dcI +ded +ddx +dcE +deb +dcJ +dcP +dcP +deb aaa aaa aaa @@ -124505,20 +124461,20 @@ cSY cRe cTJ cUh -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +dcz +ddQ +ddP +dcI +dcI +dcI +dcI +dcI +ddS +ddD +dcA +dea +dea +dcz aaa aaa aaa @@ -124762,20 +124718,20 @@ cSY cTp cTJ cUh -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +dcC +dcF +ddk +ddc +ddN +dfK +ddk +dcF +ddO +dcF +ddn +ddk +dcF +deq aaa aaa aaa @@ -125019,29 +124975,29 @@ cTa cTr cTL cOU -dcy -dcF -dcF -dcB -dcz -dcY -dcF -dcz -dcz -dcz -dcK -dcB -dcz -dcB -dcF -dcz -dcF -ddi -dcz -dcz -dcz -dcz -dep +dcA +ddH +dcI +dcI +dcI +dcI +dcI +ddH +dcE +ddA +ddA +ddA +den +dcA +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -125273,33 +125229,33 @@ cOU cSd cSB cTb +dcZ +dda cOU -cOU -cOU -dcA -dcH +dcz dcI dcI -dcU dcI -ddc -dcU -dcU -dcU -dcU dcI -dcU dcI -dcU dcI -ddH -dcA -ddQ -ddX -dec -deg -dcA -det +dcI +ddF +ddD +ddD +ddD +ddG +dcz +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -125531,33 +125487,33 @@ cOU cOU cOU cOU -aaa -aaf -dcz -dcG -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -ddy -ddP -ddW -dcI -def +cOU +cOU dcA -des -dew +ddf +dcI +ddl +dcz +ddf +dcI +ddl +dcz +ddC +ddD +ddD +ddE +dcz +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -125787,34 +125743,34 @@ cPh cSe cSC cTc -cRK -cRK -cRK +cTs +cTM +cTs +dcB +dcI +dcI +ddl +dcV +ddf +dcI +ddl dcA -dcH -dcI -dcI -dcV -dcV -dcV -dcV -dcV -dcI -dcV -dcV -dcV -dcV -dcV -dcI -dcI +ddC +ddV +ddV +ddB dcA -dcI -dcI -ddY -dei -dcA -des -dew +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -126044,34 +126000,34 @@ cNy cNy cSD cTd -cTs -cTM -cTs -dcB -dcI -dcI -dcI +cRK +cRK +cRK dcz -dcZ +ddf +dcI +ddl dcz +ddf +dcI ddh -dcz -dcI -dcz -ddh -dcz -dcZ -dcz -dcI -dcI -ddN -dcI -dcI -ded -deh -dcA -des -dew +dcC +dcF +ddY +ddk +dcF +deq +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -126301,34 +126257,34 @@ cNy cSf cSE cTe -cRK -cRK -cRK +cTs +cTd +cTs +dcB +dcI +dcI +ddl +dcU +ddf +dcI +ddl dcA -dcJ -dcI -dcI -dcU -dcU -dcU -dcU -dcU -dcI -dcU -dcU -dcU -dcU -dcU -dcI -ddI +ddu +ddt +ddw +dep dcA -ddR -dcI -ddW -dek -dcA -deu -deu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -126558,34 +126514,34 @@ cNy cSg cSD cTd -cTs -cTd -cTs -dcB +cRK +cRK +cRK +ddd +ddf +dcI +ddl +dcz +ddf +dcI +ddl +dcz +ddJ dcI dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -ddy -dcI -ddY -dcI -dej -dcA -des -dew +der +dcz +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -126816,33 +126772,33 @@ cSh cSD cTd cRK -cRK -cRK -dcA -dcL +aaa +aaf +dcz +ddf dcI dcI -dcV -dcV -dcV -ddj -dcV dcI -dcV -dcV -ddx -dcV -dcV dcI -ddH -dcA dcI -ddZ -dee -del -dcA -des -dew +dcI +ddm +dcI +dcI +dcI +ddq +dcz +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -127075,31 +127031,31 @@ cTf cRK aaa aaf -dcC -dcK -dcD -dcD -dcF dcz -dcF -ddi +ddf +dcI +ddl dcz -ddm +ddf +dcI +ddl dcz -dcF -ddi -dcF -dcz -ddF -dcF -ddO -ddS -ddi -dcF -dcF -deq -deu -deu +ddK +ddK +dcI +ddp +dcA +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -127330,33 +127286,33 @@ cSj cSD cTd cRK -cRK -cRK -dcA -dcN -dcM -dcM -dcW -dda -dde -ddk -ddo +aaa +aaf +dcz +ddf dcI -ddr -ddu -dcA -ddA -ddA -ddD -ddK -dcA -ddT -deb -dcP -den -dcA -des -dew +ddl +dcU +ddf +dcI +ddl +ddo +dcF +dcz +ddm +dcK +deq +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -127586,34 +127542,34 @@ cNy cSg cSD cTd -cTs -cTd -cTs -dcD +cRK +cRK +cRK +dcA dcM -dcP -dcP -dcP -dcT -ddd +dcI +ddl dcz -ddo +ddf dcI -dcI -ddt -dcA -ddz -ddD -ddD -ddJ -dcC -dcF -dea -dcP -dem +ddl dcA +ddL +ddZ +dee des -dew +dcA +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -127844,33 +127800,33 @@ cSk cSF cTg cTs -cTN +cTd cTs dcD -dcM -dcP -dcT -dcP -dcP -ddg -ddm dcI dcI +ddl +dcV +ddf dcI -ddw -ddy -ddC -ddD -ddD +ddl +dcz ddM +dcT +dds +ddy dcA -ddV -dcP -dcP -dem -dcA -des -dew +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -128103,30 +128059,30 @@ cTh cRK cRK cRK -dcA -dcO -dcQ -dcS -dcX -ddb +dcz ddf +dcI ddl -ddp -ddq +dcz +ddf +dcI +ddl +dcU +ddR dds -ddv -dcA -ddB -ddE -ddG -ddL -dcA -ddU -dcP -dcP -deo -dcA -dev +dds +dcX +dcz +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -128357,32 +128313,32 @@ cRJ cSl cSG cTi -cRK +cTs +cTN +cTs +dcB +dcI +dcI +dcI +dcI +dcI +dcI +dcI +ddz +ddT +dds +dcT +dcS +dcz +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa -aaf -dcE -dcF -dcF -dcz -dcz -dcF -dcF -ddn -dcF -dcz -dcz -dcF -ddn -dcF -dcz -dcz -dcF -ddn -dcz -deb -deb -dcz -der aaa aaa aaa @@ -128614,23 +128570,23 @@ cRK cRq cRK cRq -cRq -aaa -aaf -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +cRK +cRK +cRK +dcA +dcI +dcI +dcI +dcI +dcI +dcI +dcI +ddz +ddT +dds +dds +det +dcA aaa aaa aaa @@ -128874,20 +128830,20 @@ aaf aaa aaa aaf -aaa -aaa -aaa -aaf -aaa -aaa -aaa -aaa -aaf -aaf -aaf -aaf -aaf -aaf +dcA +dcH +dcG +dcH +dcI +ddr +dcI +dcL +ddd +ddU +ddT +ddT +dcO +dcA aaf aaf aaf @@ -129131,20 +129087,20 @@ aaf aaf aaf aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaa -aaa -aaa -aaa -aaa +dde +dcF +dcz +dcF +dcz +dcF +dcz +dcF +ddn +dcF +dcz +dcz +dcF +dew aaa aaa aaf @@ -129382,7 +129338,8 @@ cQd cQM cRs aaa -aaf +aaa +aaa aaa aaa aaf @@ -129391,29 +129348,28 @@ aaa aaa aaa aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaf aaa aaa aaa aaa -aaf -cTC -cTC -cTC -cTC -cTC aaa aaa -aaf -aaf aaa -aaf -aaf aaa -aaf -aaf -aai -aag +aaa aaa aaa aaa @@ -129639,39 +129595,39 @@ cQe cQN cRq aaa -aaf aaa -cTC -cTC -cTy -cTy -cTC -cTC -cTC -cTC -cTC -cTC -cTC -cTC -cTC -cTC -cVt -dfw -cVB -cTC -cTC -cTC -aaf +aaa aaa aaa aaf aaa aaa aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaf aaa -aag -aag +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -129895,40 +129851,40 @@ bVE bVE bVE bVE -aaf -aaf -aaf -cTC -cUl -cUz -cUS -cVc -cVo -cVt -cVD -cVN -cVo -cVt -dfs -cVN -cVo -cVs -cVC -cVB -cTC -cXd -cTC -cTC -cTC -cTC -cTC -cTC -cTC -cTC -aaf +aaa +aaa +aaa +aaa +aaa aaf aaa -aai +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -130153,38 +130109,41 @@ cQf cPq acn acn +aaa +aaa +aaa +aaa aaf aaa -cTC -cUk -cUy -cUR -cVb -cVo -cVs -cVC -cVB -cVo -cVs -cVC -cVB -cVo -cVs -cVB -cVB -cTC -cXb -cXv -cXv -cXv -cXv -cXv -cXv -deO -cTC +aaa +aaf aaa aaa aaa +aaa +aaa +aaf +aaa +aaa +aaa +aaa +aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaf +aaf +aaa +aaf +aaf +aaa +aaf +aaf +aai aag aaa aaa @@ -130220,9 +130179,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (116,1,1) = {" aaa @@ -130409,39 +130365,42 @@ bVE bVE bVE aaf -aaf +aaa +aaa +aaa +aaa +aaa aaf aaa cTC -cUn -cUC -cUV -cVe -cVo -cVs -cVB -cVB -cVo -cVs -cVB -cVB -cVo -cWw -cWE -cWL cTC -cXf +cTy +cTy +cTC +cTC +cTC +cTC +cTC +cTC +cTC +cTC +cTC cTC cTC cTC cTC cTC cTC -deP cTC aaf aaa aaa +aaf +aaa +aaa +aaa +aaf +aaa aag aag aaa @@ -130477,9 +130436,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (117,1,1) = {" aaa @@ -130665,41 +130621,44 @@ cOx bVE aaf aaf -aaa -aaa +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +cTC +cUl +cUz +cUS +cVc +cVo +cVt +cVD +cVN +cVo +cVt +dfs +cVN +cVo +cVt +dfw +cVB +cTC +cXd +cTC +cTC +cTC +cTC +cTC +cTC +cTC +cTC +aaf aaf aaa -cTC -cUm -cUA -cUU -cVd -cVo -cVu -cVE -cVO -cVo -cWe -cWj -cWo -cVo -cVw -cWD -cWK -cWV -cXe -cXw -cTC -cVB -deF -deJ -cTC -deP -cTC -cTC -cTC -cTC -aaa aai aaa aaa @@ -130734,9 +130693,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (118,1,1) = {" aaa @@ -130923,44 +130879,44 @@ bVE aaa aaf aaa -cTO -cTC -cTC -cTC -cTC -cUA -cUU -cVg -cTu -cVw -cVG -cVS -cWb -cVw -cWk -cWp -cWb -cWy -cVH -cWN -cWX -cXh -dex -deC -cVB -cVB -cVB -cTC -deP -cTC -dfz -dfA -cTC +aaa +aaa +aaa +aaa +aaa aaf +aaa +cTC +cUk +cUy +cUR +cVb +cVo +cVs +cVC +cVB +cVo +cVs +cVC +cVB +cVo +cVs +cVC +cVB +cTC +cXb +cXv +cXv +cXv +cXv +cXv +cXv +deO +cTC +aaa +aaa +aaa aag -aaf -aaa -aaa aaa aaa aaa @@ -131180,45 +131136,45 @@ cTu cTy cTy cTy +cTy +cTy +cTy +aaa +aaf +aaf +aaa cTC -cTR -cTU -cTY -cUo -cUD -cUW -cVf -cVp -cVv -cVF -cVR -cVZ -cWf -cVF -cVR -cWu -cWx -cYU -deT -cWW -cXg -cXx -deB -deB -deG +cUn +cUC +cUV +cVe +cVo +cVs cVB +cVB +cVo +cVs +cVB +cVB +cVo +cWw +cWE +cWL cTC -deQ -cTy -deV -deV -cTy -aaa -aaa -aaa -aaa +cXf +cTC +cTC +cTC +cTC +cTC +cTC +deP +cTC +aaf aaa aaa +aag +aag aaa aaa aaa @@ -131436,46 +131392,46 @@ cTt cTw cTz cTA -cTB -cTP -cTT -cTW -cUj -cUp -cUF -cUY -cVi -cVr -cVy -cVI -cVV -cWd -cWd -cYG -cYH -cWd -cWd -cWd -cWP -cWY -cXj -dez -cVB -cVB -cVC -deL +dcN +dcN +dcQ +cTy +aaa +aaa +aaf +aaa +cTC +cUm +cUA +cUU +cVd +cVo +cVu +cVE +cVO +cVo +cWe +cWj +cWo +cVo +cVw +cWD +cWK +cWV +cXe +cXw +cTC +cVB +deF +deJ +cTC +deP +cTC +cTC +cTC cTC -deR -deS -deW -deW -deX -cXl -aaa -aaa -aaa -aaa aaa +aai aaa aaa aaa @@ -131694,45 +131650,45 @@ cTv cTy cTy cTy +cTy +dcW +cTy +aaa +cTO cTC -cTS -cTV -cUi cTC -cUE -cUX -cVh -cVq -cVx +cTC +cTC +cUA +cUU +cVg +cTu +cVw +cVG +cVS +cWb +cVw +cWk +cWp +cWb +cWy cVH -cVU -cWc -cWg -cVH -cWq -cWv -cWg -cYU -deU -cVh -cXi -dey -deD +cWN +cWX +cXh +dex +deC +cVB +cVB cVB -deH -deK cTC -cXs -cTy -deV -deV -cTy -aaa +deP +cTC +dfz +dfA +cTC aaf -aaa -aaa -aaa -aaa +aag aaa aaa aaa @@ -131951,43 +131907,43 @@ bVE aaa aaf aaa -cTQ +cTy +dcW +cTy +cTy cTC -cTX -cTC -cTC -cUG -cUX -cVk -cTu -cVA -cVL -cVX -cWb -cWi -cWn -cVX -cWb -cVx -cVH -cWR -cXa -cXr -deA -deC +cTR +cTU +cTY +cUo +cUD +cUW +cVf +cVp +cVv +cVF +cVR +cVZ +cWf +cVF +cVR +cWu +cWx +cYU +deT +cWW +cXg +cXx +deB +deB +deG cVB -cVB -deN cTC -cXs -cTC -dfz +deQ +cTy deV -cTC -aaa -aag -aaa -aaa +deV +cTy aaa aaa aaa @@ -132208,44 +132164,44 @@ bVE aaa aaf aaa -aaa -aaf -crZ +cTy +dcY +dcN +cTB +cTP +cTT +cTW +cUj +cUp +cUF +cUY +cVi +cVr +cVy +cVI +cVV +cWd +cWd +cYG +cYH +cWd +cWd +cWd +cWP +cWY +cXj +dez +cVB +cVB +cVC +deL cTC -cUq -cUG -cUX -cVj -cVo -cVz -cVK -cVW -cVo -cWh -cWm -cWt -cVo -cWz -cWG -cWQ -cWZ -cXq -cXw -cTC -deE -deI -deM -cTC -cXs -cTC -cTC -cTC -cTC -aaf -aag -aaa -aaa -aaa +deR +deS +deW +deW +deX +cXl aaa aaa aaa @@ -132465,47 +132421,47 @@ bVE aaf aaf aaf -aaf -aaf -aaf +cTy +cTy +cTy +cTy cTC -cUw -cUP +cTS +cTV +cUi +cTC +cUE cUX -cVm -cVo +cVh +cVq +cVx +cVH +cVU +cWc +cWg +cVH +cWq +cWv +cWg +cYU +deU +cVh +cXi +dey +deD cVB -cVB -cVs -cVo -cVB -cVB -cVs -cVo -cWC -cWJ -cWU -cTC -cXt -cTC -cTC -cTC -cTC -cTC +deH +deK cTC cXs -cTC +cTy +deV +deV +cTy +aaa aaf aaa aaa -aag -aag -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -132724,43 +132680,43 @@ aaa aaf aaa aaa -aaf +aaa +aaa +cTQ cTC -cUv -cUH -cUZ -cVl -cVo +cTX +cTC +cTC +cUG +cUX +cVk +cTu +cVA +cVL +cVX +cWb +cWi +cWn +cVX +cWb +cVx +cVH +cWR +cXa +cXr +deA +deC cVB -cVC -cVs -cVo cVB -cVC -cVs -cVo -cWB -cWH -cWT +deN cTC cXs -cXs -cXs -cXs -cXs -cXs -cXs -cXs cTC -aaf -aaf -aaa -aai -aaa -aaa -aaa -aaa +dfz +deV +cTC aaa +aag aaa aaa aaa @@ -132981,37 +132937,42 @@ bVE bVE bVE aaa +aaa +aaa +aaa aaf +crZ cTC -cUx -cUQ -cVa -cVn +cUq +cUG +cUX +cVj cVo -cVB -cVM -cVY +cVz +cVK +cVW cVo -cVN -dft -cVY +cWh +cWm +cWt cVo -cVB -cVC -cVs -cTC -cXu -cTC -cTC +cWz +cWG +cWQ +cWZ +cXq +cXw cTC +deE +deI +deM cTC +cXs cTC cTC cTC cTC aaf -aaa -aaa aag aaa aaa @@ -133045,11 +133006,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (127,1,1) = {" aaa @@ -133237,44 +133193,44 @@ ciE cQP cRu bVE +aaa +aaa +aaa +aaf aaf aaf cTC -cTC -cTy -cTy -cTC -cTC -cTC -cTC -cTC -cTC -cTC -cTC -cTC -cTC +cUw +cUP +cUX +cVm +cVo cVB -dfx -cVY +cVB +cVs +cVo +cVB +cVB +cVs +cVo +cWC +cWJ +cWU +cTC +cXt cTC cTC cTC -aaa -aaf -aaf -aaf -aaf +cTC +cTC +cTC +cXs +cTC aaf aaa -aaf -aaf +aaa aag aag -aaf -aaa -aaa -aaa -aaa aaa aaa aaa @@ -133495,36 +133451,41 @@ bZQ cRv bVE aaa -aaf -aaa -aaf -aaa -aaa -aaa -aaf aaa aaa aaa aaa aaf -aaa -aaa cTC +cUv +cUH +cUZ +cVl +cVo +cVB +cVC +cVs +cVo +cVB +cVC +cVs +cVo +cWB +cWH +cWT cTC +cXs +cXs +cXs +cXs +cXs +cXs +cXs +cXs cTC -cTC -cTC -aaa aaf -aaa -aaa -aaa aaf aaa -aaa -aaa -aaa -aaa aai aaa aaa @@ -133559,11 +133520,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (129,1,1) = {" aaa @@ -133754,34 +133710,39 @@ bVE aaa aaf aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf aaa aaa aaf +cTC +cUx +cUQ +cVa +cVn +cVo +cVB +cVM +cVY +cVo +cVN +dft +cVY +cVo +cVB +cVC +cVs +cTC +cXu +cTC +cTC +cTC +cTC +cTC +cTC +cTC +cTC +aaf aaa aaa -aaa -aaa -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aai aag aaa aaa @@ -133816,11 +133777,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (130,1,1) = {" aaa @@ -134011,20 +133967,30 @@ bVE aaa aaf aaa -aaf -aaa -aaa -aaa -aaf -aaa -aaa -aaf -aaa aaa aaf aaf -aaf -aaf +cTC +cTC +cTy +cTy +cTC +cTC +cTC +cTC +cTC +cTC +cTC +cTC +cTC +cTC +cVB +dfx +cVY +cTC +cTC +cTC +aaa aaf aaf aaf @@ -134032,20 +133998,10 @@ aaf aaf aaa aaf -aaa -aaa -aaa -aaa aaf -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aag +aag +aaf aaa aaa aaa @@ -134268,15 +134224,29 @@ bVE aaa aaf aaa +aaa +aaa aaf +aaa aaf aaa aaa +aaa aaf aaa aaa aaa aaa +aaf +aaa +aaa +cTC +cTC +cTC +cTC +cTC +aaa +aaf aaa aaa aaa @@ -134286,21 +134256,7 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aai aaa aaa aaa diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm index 94f22215cc9..22ba4c45af9 100644 --- a/_maps/map_files/MiniStation/MiniStation.dmm +++ b/_maps/map_files/MiniStation/MiniStation.dmm @@ -15166,8 +15166,7 @@ }, /area/tcommsat/computer) "Gu" = ( -/obj/machinery/sleeper{ - icon_state = "sleeper-open"; +/obj/machinery/sleeper/syndie{ dir = 4 }, /turf/open/floor/plasteel/shuttle{ diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 3939c080778..df61d13b779 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -2052,7 +2052,7 @@ pixel_x = 6; pixel_y = 24 }, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel{ icon_state = "redcorner"; dir = 4 @@ -2476,17 +2476,11 @@ /turf/open/floor/plasteel, /area/security/prison) "aeR" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/light/small{ + dir = 1 }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/security/prison) +/turf/open/floor/plating, +/area/hallway/secondary/exit) "aeS" = ( /obj/structure/cable{ d1 = 4; @@ -2518,7 +2512,7 @@ d2 = 8; icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, /area/security/prison) "aeV" = ( @@ -2613,36 +2607,22 @@ /turf/open/floor/plating, /area/ai_monitored/security/armory) "afa" = ( -/obj/machinery/door/window/southleft{ - base_state = "right"; - icon_state = "right"; - name = "Armory"; - req_access_txt = "3" +/obj/machinery/door/airlock/shuttle{ + name = "Emergency Shuttle Airlock" }, -/obj/machinery/door/firedoor, -/obj/machinery/light{ +/obj/docking_port/mobile/emergency{ + name = "BoxStation emergency shuttle" + }, +/obj/docking_port/stationary{ dir = 4; - icon_state = "tube1" + dwidth = 12; + height = 18; + id = "emergency_home"; + name = "BoxStation emergency evac bay"; + width = 32 }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/obj/structure/cable{ - d1 = 2; - d2 = 8; - icon_state = "2-8"; - tag = "" - }, -/turf/open/floor/plasteel{ - dir = 6; - icon_state = "warning" - }, -/area/ai_monitored/security/armory) +/turf/open/floor/plating, +/area/shuttle/escape) "afb" = ( /obj/machinery/recharger, /obj/structure/table, @@ -2936,27 +2916,19 @@ /obj/structure/table, /obj/item/device/electropack, /turf/open/floor/plasteel{ - icon_state = "whitehall"; - dir = 2 + icon_state = "red" }, /area/security/prison) "afE" = ( -/obj/machinery/button/flasher{ - id = "insaneflash"; - pixel_y = -26 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel{ - icon_state = "whitehall"; - dir = 2 - }, -/area/security/prison) +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/hallway/secondary/exit) "afF" = ( /obj/structure/table, /obj/item/device/assembly/signaler, +/obj/item/clothing/suit/straight_jacket, /turf/open/floor/plasteel{ - dir = 2; - icon_state = "escape" + icon_state = "red" }, /area/security/prison) "afG" = ( @@ -2972,8 +2944,7 @@ pixel_x = -6 }, /turf/open/floor/plasteel{ - icon_state = "whitehall"; - dir = 2 + icon_state = "red" }, /area/security/prison) "afH" = ( @@ -2985,10 +2956,8 @@ }, /area/security/prison) "afI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel{ - icon_state = "whitehall"; - dir = 2 + icon_state = "red" }, /area/security/prison) "afJ" = ( @@ -2997,8 +2966,7 @@ pixel_y = -27 }, /turf/open/floor/plasteel{ - icon_state = "whitehall"; - dir = 2 + icon_state = "red" }, /area/security/prison) "afK" = ( @@ -3236,13 +3204,13 @@ }, /area/security/prison) "agl" = ( -/obj/machinery/door/airlock/glass_security{ - name = "Insanity Ward"; - req_access_txt = "2" +/obj/machinery/door/airlock/security{ + name = "Interrogation"; + req_access = null; + req_access_txt = "63" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel{ - icon_state = "white" + icon_state = "dark" }, /area/security/prison) "agm" = ( @@ -3312,16 +3280,13 @@ }, /area/security/warden) "ags" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/structure/chair{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel{ - icon_state = "showroomfloor" + icon_state = "dark" }, -/area/security/warden) +/area/security/prison) "agt" = ( /turf/open/floor/plasteel{ icon_state = "showroomfloor" @@ -3471,46 +3436,14 @@ }, /area/security/main) "agH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel{ - icon_state = "warnwhite"; - dir = 1 - }, -/area/security/prison) -"agI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel{ - icon_state = "warnwhite"; - dir = 5 - }, -/area/security/prison) -"agJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel{ icon_state = "dark" }, -/area/security/brig) -"agK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump{ - dir = 4; - on = 1 - }, -/turf/open/floor/plasteel{ - icon_state = "dark" - }, -/area/security/brig) -"agL" = ( -/obj/structure/table, -/obj/item/weapon/folder/red, -/obj/item/weapon/pen, -/turf/open/floor/plasteel{ - dir = 9; - icon_state = "warnwhite" - }, /area/security/prison) -"agM" = ( +"agI" = ( /obj/machinery/airalarm{ pixel_y = 23 }, @@ -3520,8 +3453,8 @@ /turf/open/floor/plasteel{ icon_state = "dark" }, -/area/security/brig) -"agN" = ( +/area/security/prison) +"agJ" = ( /obj/item/weapon/cigbutt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 @@ -3529,6 +3462,45 @@ /turf/open/floor/plasteel{ icon_state = "dark" }, +/area/security/prison) +"agK" = ( +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/security/prison) +"agL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump{ + dir = 4; + on = 1 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/security/prison) +"agM" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/mask/surgical, +/obj/item/weapon/reagent_containers/spray/cleaner, +/turf/open/floor/plasteel{ + dir = 9; + icon_state = "whitered" + }, +/area/security/brig) +"agN" = ( +/obj/structure/table, +/obj/item/device/radio/intercom{ + freerange = 0; + frequency = 1459; + name = "Station Intercom (General)"; + pixel_x = 0; + pixel_y = 26 + }, +/obj/item/weapon/storage/firstaid/regular, +/turf/open/floor/plasteel{ + dir = 10; + icon_state = "whitered" + }, /area/security/brig) "agO" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -3763,73 +3735,32 @@ }, /area/security/main) "ahm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 +/obj/structure/window/reinforced{ + dir = 4 }, +/obj/structure/table, +/obj/item/weapon/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/weapon/pen, /turf/open/floor/plasteel{ - icon_state = "white" + dir = 5; + icon_state = "whitered" }, -/area/security/prison) +/area/security/brig) "ahn" = ( /turf/closed/wall, /area/maintenance/fsmaint) "aho" = ( -/turf/open/floor/plasteel{ - icon_state = "white" - }, -/area/security/prison) -"ahp" = ( -/obj/machinery/light{ - icon_state = "tube1"; - dir = 8 - }, -/obj/item/device/radio/intercom{ - desc = "Talk through this. It looks like it has been modified to not broadcast."; - dir = 2; - name = "Prison Intercom (General)"; - pixel_x = -25; - pixel_y = -2; - prison_radio = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber{ - dir = 4; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0 - }, -/turf/open/floor/plasteel{ - icon_state = "white" - }, -/area/security/prison) -"ahq" = ( -/obj/machinery/flasher{ - id = "insaneflash"; - pixel_x = 26 - }, -/obj/machinery/atmospherics/components/unary/vent_pump{ - dir = 1; - external_pressure_bound = 101.325; - on = 1; - pressure_checks = 1 - }, -/turf/open/floor/plasteel{ - icon_state = "white" - }, -/area/security/prison) -"ahr" = ( -/obj/structure/chair{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel{ icon_state = "dark" }, -/area/security/brig) -"ahs" = ( -/turf/open/floor/plasteel{ - icon_state = "dark" - }, -/area/security/brig) -"aht" = ( +/area/security/prison) +"ahp" = ( /obj/structure/chair{ dir = 8 }, @@ -3837,13 +3768,57 @@ /turf/open/floor/plasteel{ icon_state = "dark" }, -/area/security/brig) -"ahu" = ( +/area/security/prison) +"ahq" = ( /obj/structure/table, /obj/item/device/flashlight/lamp, /turf/open/floor/plasteel{ icon_state = "dark" }, +/area/security/prison) +"ahr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel{ + icon_state = "white" + }, +/area/security/brig) +"ahs" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/turf/open/floor/plasteel{ + dir = 1; + icon_state = "whitered" + }, +/area/security/brig) +"aht" = ( +/obj/machinery/atmospherics/components/unary/vent_pump{ + dir = 4; + on = 1 + }, +/turf/open/floor/plasteel{ + icon_state = "white" + }, +/area/security/brig) +"ahu" = ( +/obj/structure/table, +/obj/item/weapon/storage/box/bodybags, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27; + pixel_y = 0 + }, +/obj/item/weapon/reagent_containers/syringe, +/obj/item/weapon/reagent_containers/glass/bottle/charcoal, +/obj/item/weapon/reagent_containers/glass/bottle/epinephrine, +/turf/open/floor/plasteel{ + dir = 10; + icon_state = "whitered" + }, /area/security/brig) "ahv" = ( /obj/machinery/power/apc{ @@ -3965,21 +3940,21 @@ /turf/open/floor/plasteel, /area/security/main) "ahD" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/structure/cable{ - d1 = 1; - d2 = 4; - icon_state = "1-4" +/obj/machinery/door/window/westleft{ + base_state = "left"; + dir = 4; + icon_state = "left"; + name = "Infirmary"; + req_access_txt = "0" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel{ - icon_state = "showroomfloor" + dir = 4; + icon_state = "whitered" }, -/area/security/warden) +/area/security/brig) "ahE" = ( /obj/machinery/door/airlock/glass_security{ name = "Brig Control"; @@ -4160,12 +4135,8 @@ /turf/closed/wall, /area/security/main) "ahP" = ( -/obj/machinery/camera{ - c_tag = "Brig Interrogation"; - dir = 8 - }, /turf/open/floor/plasteel{ - icon_state = "dark" + icon_state = "white" }, /area/security/brig) "ahQ" = ( @@ -4224,33 +4195,22 @@ /turf/open/floor/plating, /area/maintenance/fsmaint) "ahU" = ( -/obj/structure/bed, -/obj/item/clothing/suit/straight_jacket, -/obj/machinery/camera{ - c_tag = "Prison Sanitatium"; - dir = 4; - network = list("SS13","Prison"); - pixel_x = 0; +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; pixel_y = 0 }, -/obj/effect/landmark{ - name = "revenantspawn" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /turf/open/floor/plasteel{ - icon_state = "white" + icon_state = "red"; + dir = 9 }, -/area/security/prison) +/area/security/brig) "ahV" = ( -/obj/structure/bed, -/obj/item/clothing/suit/straight_jacket, -/obj/effect/landmark{ - name = "revenantspawn" - }, -/turf/open/floor/plasteel{ - icon_state = "white" - }, -/area/security/prison) -"ahW" = ( /obj/structure/table, /obj/item/weapon/folder/red, /obj/item/device/taperecorder{ @@ -4259,6 +4219,15 @@ /turf/open/floor/plasteel{ icon_state = "dark" }, +/area/security/prison) +"ahW" = ( +/obj/structure/bodycontainer/morgue, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, /area/security/brig) "ahX" = ( /obj/structure/table, @@ -4343,12 +4312,10 @@ /turf/open/floor/plating, /area/maintenance/fsmaint) "aid" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light/small, /turf/open/floor/plasteel{ - icon_state = "dark" + dir = 10; + icon_state = "whitered" }, /area/security/brig) "aie" = ( @@ -4384,19 +4351,14 @@ }, /area/security/warden) "aih" = ( -/obj/structure/table, -/obj/item/weapon/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/weapon/book/manual/wiki/security_space_law, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel{ - icon_state = "showroomfloor" + icon_state = "red"; + dir = 5 }, -/area/security/warden) +/area/security/brig) "aii" = ( /obj/structure/grille, /obj/structure/disposalpipe/segment{ @@ -4438,9 +4400,14 @@ }, /area/security/main) "ail" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/security/brig) +/obj/machinery/camera{ + c_tag = "Brig Interrogation"; + dir = 8 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/security/prison) "aim" = ( /obj/machinery/light_switch{ pixel_y = -23 @@ -4451,14 +4418,9 @@ }, /area/security/main) "ain" = ( -/obj/machinery/door/airlock/security{ - name = "Interrogation"; - req_access = null; - req_access_txt = "63" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel{ - icon_state = "dark" + dir = 8; + icon_state = "whitered" }, /area/security/brig) "aio" = ( @@ -4566,24 +4528,18 @@ }, /area/security/main) "aiw" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Security Maintenance"; - req_access_txt = "63" +/obj/machinery/door/window/westleft{ + base_state = "right"; + dir = 4; + icon_state = "right"; + name = "Infirmary"; + req_access_txt = "0" }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_y = 0 +/turf/open/floor/plasteel{ + dir = 4; + icon_state = "whitered" }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/main) +/area/security/brig) "aix" = ( /obj/structure/cable{ d1 = 4; @@ -4628,45 +4584,49 @@ /turf/open/floor/plating, /area/maintenance/fsmaint) "aiB" = ( -/obj/structure/table/glass, -/obj/item/weapon/reagent_containers/glass/bottle/morphine, -/turf/open/floor/plasteel{ - icon_state = "white" - }, -/area/security/prison) -"aiC" = ( -/obj/structure/table/glass, -/obj/item/weapon/reagent_containers/syringe, -/turf/open/floor/plasteel{ - icon_state = "white" - }, -/area/security/prison) -"aiD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel{ - icon_state = "dark" - }, -/area/security/brig) -"aiE" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber{ dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0 }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/security/prison) +"aiC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/security/prison) +"aiD" = ( +/obj/structure/bodycontainer/morgue, /turf/open/floor/plasteel{ icon_state = "dark" }, /area/security/brig) -"aiF" = ( +"aiE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, /turf/open/floor/plasteel{ icon_state = "dark" }, +/area/security/prison) +"aiF" = ( +/obj/structure/bed, +/obj/item/weapon/bedsheet, +/obj/machinery/iv_drip{ + density = 0 + }, +/obj/item/clothing/suit/straight_jacket, +/turf/open/floor/plasteel{ + icon_state = "whitered" + }, /area/security/brig) "aiG" = ( /turf/open/floor/plasteel{ @@ -4777,20 +4737,19 @@ /turf/open/floor/plating, /area/security/warden) "aiO" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security{ - name = "Security Office"; - req_access = null; - req_access_txt = "63" +/obj/structure/window/reinforced{ + dir = 4 }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/structure/table, +/obj/item/weapon/storage/firstaid/regular, +/obj/item/device/healthanalyzer{ + pixel_y = -2 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/security/main) +/turf/open/floor/plasteel{ + dir = 6; + icon_state = "whitered" + }, +/area/security/brig) "aiP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, @@ -4827,10 +4786,16 @@ /turf/closed/wall/r_wall, /area/security/processing) "aiW" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/fulltile, -/turf/open/floor/plating, -/area/security/brig) +/obj/machinery/door/airlock/security{ + name = "Interrogation"; + req_access = null; + req_access_txt = "63" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/security/prison) "aiX" = ( /turf/closed/wall/r_wall, /area/security/brig) @@ -4851,7 +4816,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel{ icon_state = "redcorner"; dir = 1 @@ -4864,7 +4828,9 @@ icon_state = "4-8"; pixel_y = 0 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/brig) "ajb" = ( @@ -5069,6 +5035,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel{ icon_state = "red"; dir = 1 @@ -5107,9 +5074,7 @@ }, /area/security/brig) "ajA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel{ icon_state = "red"; dir = 1 @@ -5414,9 +5379,7 @@ c_tag = "Brig West"; dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel{ dir = 2; icon_state = "redcorner" @@ -32677,7 +32640,10 @@ /turf/open/floor/plating, /area/maintenance/asmaint2) "bqh" = ( -/obj/structure/closet, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/asmaint2) "bqi" = ( @@ -34373,8 +34339,10 @@ /turf/open/floor/plating, /area/maintenance/asmaint2) "btq" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 2 +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" }, /turf/open/floor/plating, /area/maintenance/asmaint2) @@ -57176,8 +57144,7 @@ }, /area/engine/engineering) "cmM" = ( -/obj/machinery/sleeper{ - icon_state = "sleeper-open"; +/obj/machinery/sleeper/syndie{ dir = 4 }, /turf/open/floor/plasteel/shuttle{ @@ -62769,20 +62736,12 @@ }, /area/shuttle/escape) "cxn" = ( -/obj/machinery/door/airlock/shuttle{ - name = "Emergency Shuttle Airlock" +/obj/structure/lattice, +/obj/effect/landmark{ + name = "carpspawn" }, -/obj/docking_port/mobile/emergency, -/obj/docking_port/stationary{ - dir = 4; - dwidth = 9; - height = 11; - id = "emergency_home"; - name = "emergency evac bay"; - width = 22 - }, -/turf/open/floor/plating, -/area/shuttle/escape) +/turf/open/space, +/area/space) "cxo" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -5; @@ -89604,12 +89563,12 @@ adF aef aeM afz -acd aai aai aai aai -aiV +aai +aai ajt akc akJ @@ -89863,10 +89822,10 @@ aeO afJ acd agL -ahp -ahU +agK +agK aiB -aiX +aai ajw akf aiX @@ -90116,14 +90075,14 @@ abK acY adG aeh -aeR +aeO afI agl agH -ahm +ags +ags aho -aho -aiW +acd ajv ake agj @@ -90374,13 +90333,13 @@ acd acd aek aeU -afE -adF +afI +acd agI ahq ahV -aiC -agj +aho +acd ajy akh afK @@ -90632,12 +90591,12 @@ adF aej aeQ afD -agj -agj -agj -agj -agj -agj +acd +agJ +ahp +ahp +aiC +adF ajx akg agj @@ -90889,12 +90848,12 @@ adI aem aeO afG -agj +acd agK -ahs -ahs +agK +ail aiE -agj +aiW ajA akj agj @@ -91147,10 +91106,10 @@ ael aeO afF agj -agJ -ahs -ahs -aiD +agj +agj +agj +agj agj ajz aki @@ -91663,11 +91622,11 @@ afH agj agN aht -aht +ain aid -ail +agj aiZ -ajF +akk akN alw amg @@ -91919,10 +91878,10 @@ aeT afH agj ahs -ahs +ahr ahP aiF -ain +agj aja ajG akQ @@ -92175,10 +92134,10 @@ aeq aeV acd agj -agj -agj -agj -agj +ahm +ahD +aiw +aiO agj ajD akm @@ -92433,7 +92392,7 @@ afC agk agF agP -agP +ahU agP agP aiz @@ -92690,7 +92649,7 @@ afB agi agD agO -agO +aih agO agO aiy @@ -114072,7 +114031,7 @@ bgg aNa aaa bky -blQ +bqh bme bnx bqe @@ -115333,7 +115292,7 @@ aoV aoV aaa aaa -aaa +aaf aaa aaa aaa @@ -115341,17 +115300,17 @@ aaa aaa aaa aNa -aQF -aRW -aTo +aeR aNa -aaa -aaa -aaa +aQE aNa -aTo -aRW -bdA +aaf +aaa +aaf +aNa +aQE +aNa +afE aNa aaa aaa @@ -115590,28 +115549,28 @@ aaa aaa aaa aaa +aaf aaa aaa aaa aaa aaa -cry -cwI -cwI -cxg -cxl -cxn -cwI -crx -crx -crx -cwI -cxK -cxl -cxK -cwI -cwI -cxW +aaa +aNa +aQE +aNa +aQE +aNa +aaf +aaf +aaf +aNa +aQE +aNa +aQE +aNa +aaa +aaa aaa aaf aaf @@ -115849,36 +115808,36 @@ aaa aaa aaa aaa -cry -cwI -cwI -cwT -cwY -cxd -cxe -cwU -cwL -anq -anq -anq -anq -anq -cwL -cwU -cxQ -cxQ -cxU -cwV -cxW +aaa +aaa +aaa +aaa +aaa +aNa +aQF +aRW +aTo +aNa +aaa aaf aaa +aNa +aTo +aRW +bdA +aNa +aaa +aaa +aaf +aaf +aaf bnu bhG bhG -brE +bhG bhG bsJ -bhG +brE bhG bhG bhG @@ -116105,41 +116064,41 @@ aaa aaa aaa aaa +aaa +aaa +aaa +aaa cry -crO -cwK -cwP -cwU -cwY -cxe -cxh -cwU -cxo -cwL -cwL -cwL -cwL -cwL -cxL -cwU -cxQ -cxQ -cxU -cxX -cxZ -aaf -aaf -aaf +cwI +cwI +cxg +cxl +afa +cwI +crx +crx +crx +cwI +cxK +cxl +cxK +cwI +cwI +cxW +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa bky -bqh +btq brH -btq -btq bvQ bxt bvQ -btq -btq bCm bDh bEs @@ -116362,41 +116321,41 @@ aaa aaa aaa aaa -crx -crN -cwJ -cwO -cwU +aaa +cry +cwI +cwI +cwT cwY +cxd cxe -cxh cwU cwL -cxq -cxq -cxq -cxq -cxq +anq +anq +anq +anq +anq cwL -cxM +cwU cxQ cxQ -cxV -cxX -cxZ -aaf +cxU +cwV +cxW aaa aaa -bky +aaa +aaa +aaa +aaa +aaa +bZi bqg brG -btp -btp brG btp brG -btp -btp brG bDg bEs @@ -116619,41 +116578,41 @@ aae aaa aaa aaa -crx -cwF -cwL -cwR -cwV -crx -cxf -crx -cxm -cwL -cxr -cxr -cxr -cxr -cxr -cwL +cry +crO +cwK +cwP +cwU +cwY +cxe +cxh +cwU +cxo +cwL +cwL +cwL +cwL +cwL +cxL cwU -cxR cxQ -cxV +cxQ +cxU cxX cxZ -aaf -aaf -aaf -bky -bky +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bZi +btp brI -btp -btp bvR btp byx -btp -btp brI bky bky @@ -116877,34 +116836,34 @@ aaa aaa aaa crx -crQ -cwL -cwQ +crN +cwJ +cwO +cwU +cwY +cxe +cxh cwU -cwZ cwL -cxi -cxj +cxq +cxq +cxq +cxq +cxq cwL -cwL -cwL -cwL -cwL -cwL -cwL -cxN -cwI -cwI -cwI +cxM +cxQ +cxQ +cxV cxX cxZ -aaf aaa aaa aaa -bky -bky -bky +aaa +aaa +aaa +aaa bky bky bky @@ -117136,32 +117095,32 @@ aaa crx cwF cwL -cwL -cwX -cwL -cwL -anq -cxj -cwL -cxq -cxq -cxq -cxq -cxq -cwL +cwR +cwV crx -cxc -cxa -cxc +cxf +crx +cxm +cwL +cxr +cxr +cxr +cxr +cxr +cwL +cwU +cxR +cxQ +cxV cxX cxZ -aaf -aaf aaa aaa -aaf aaa -aaf +aaa +aaa +aaa +aaa aaf aaf aaa @@ -117391,38 +117350,38 @@ aaa aaa aaa crx -cwG -amB -amB -cwW -cxa +crQ cwL -cxj +cwQ +cwU +cwZ +cwL +cxi cxj cwL -cxr -cxr -cxr -cxr -cxr cwL -cxO -cxa -cxa -cxa +cwL +cwL +cwL +cwL +cwL +cxN +cwI +cwI +cwI cxX cxZ -aaf -aaf -aaf -aaf -aaf -aaf aaa aaa aaa aaa aaa +aaa +aaa +aaf +aaa +aaa +aaa aaf aaa aaa @@ -117647,39 +117606,39 @@ aaa aaa aaa aaa -crz -cwH -cwN -cwS -cwU -cxc -cwL -cwL -cwL -cwL +crx +cwF cwL cwL +cwX cwL cwL +anq +cxj cwL +cxq +cxq +cxq +cxq +cxq cwL crx +cxc cxa -cxa -cxa +cxc cxX cxZ -aaf -aaf +aaa +aaa +aaa +aaa +aaa aaa aaa aaf aaa aaa aaa -aaa -aaa -aaa aaf aaa aaa @@ -117904,39 +117863,39 @@ aaa aaa aaa aaa -aaa -crz -cwI -cwI -cwT -cxb -cxa -cxa -cxa -cxp -cxs -cxs -cxs -cxs -cxs -cxp crx -cxS -cxT -cxS -cwV -cxY -aaf -aaf -aaf -aaf -aaf +cwG +amB +amB +cwW +cxa +cwL +cxj +cxj +cwL +cxr +cxr +cxr +cxr +cxr +cwL +cxO +cxa +cxa +cxa +cxX +cxZ aaa aaa aaa aaa aaa aaa +aaa +aaf +aaa +aaa +aaa aaf aaa aaa @@ -118161,36 +118120,36 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa crz +cwH +cwN +cwS +cwU +cxc +cwL +cwL +cwL +cwL +cwL +cwL +cwL +cwL +cwL +cwL crx -cwI -crx -cwI -cwI -cwI -crx -crx -crx -cwI -cwI -cxP -crx -cwI -crx -cxY +cxa +cxa +cxa +cxX +cxZ aaa -aaf -aaf aaa aaa aaa aaa aaa aaa +aaf aaa aaa aaa @@ -118419,20 +118378,27 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +crz +cwI +cwI +cwT +cxb +cxa +cxa +cxa +cxp +cxs +cxs +cxs +cxs +cxs +cxp +crx +cxS +cxT +cxS +cwV +cxY aaa aaa aaa @@ -118447,13 +118413,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aag aaa aaa @@ -118679,6 +118638,23 @@ aaa aaa aaa aaa +crz +crx +cwI +crx +cwI +cwI +cwI +crx +crx +crx +cwI +cwI +cxP +crx +cwI +crx +cxY aaa aaa aaa @@ -118687,16 +118663,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aae -aaa -aaa -aaa aaf aaa aaa @@ -118704,13 +118670,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aag aaa aaa @@ -118939,7 +118898,6 @@ aaa aaa aaa aaa -aae aaa aaa aaa @@ -118959,11 +118917,12 @@ aaa aaa aaa aaa -aae -aaa aaa aaa aaa +aaf +aaf +aaf aaa aaa aaa @@ -119220,7 +119179,7 @@ aaa aaa aaa aaa -aaa +cxn aaa aaa aaa @@ -119476,8 +119435,8 @@ aaa aaa aaa aaa -aaa -aaa +aaf +aaf aaa aaa aaa @@ -120738,7 +120697,7 @@ aaa aaa aaa aaa -aaa +aae aaa aaa aaa diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm index a2953331701..955b079e46b 100644 --- a/_maps/map_files/generic/z2.dmm +++ b/_maps/map_files/generic/z2.dmm @@ -1625,7 +1625,11 @@ /turf/open/floor/plasteel/black, /area/centcom/ferry) "eP" = ( -/obj/structure/flora/kirbyplants, +/obj/machinery/door/airlock/centcom{ + name = "Centcom Backup Docks"; + opacity = 1; + req_access_txt = "101" + }, /turf/open/floor/plasteel/black, /area/centcom/ferry) "eQ" = ( @@ -1658,12 +1662,11 @@ /turf/open/floor/plasteel/black, /area/centcom/ferry) "eU" = ( -/obj/structure/sign/map/left, -/turf/open/floor/light, +/obj/machinery/shuttle_manipulator, +/turf/open/floor/plasteel/circuit, /area/centcom/ferry) "eV" = ( -/obj/structure/sign/map/right, -/turf/open/floor/light, +/turf/open/floor/plasteel/circuit, /area/centcom/ferry) "eW" = ( /obj/structure/extinguisher_cabinet{ @@ -2358,11 +2361,11 @@ "hh" = ( /obj/docking_port/stationary{ dir = 4; - dwidth = 9; - height = 11; + dwidth = 25; + height = 50; id = "emergency_away"; - name = "Centcom"; - width = 22 + name = "Centcom Emergency Shuttle Dock"; + width = 50 }, /turf/open/space, /area/space) @@ -5875,12 +5878,12 @@ /area/shuttle/escape) "rN" = ( /obj/machinery/status_display{ - layer = 4; - pixel_x = 0; - pixel_y = 32 + density = 0; + pixel_y = 32; + supply_display = 1 }, -/turf/open/floor/plasteel/shuttle/white, -/area/shuttle/escape) +/turf/open/floor/plasteel/black, +/area/centcom/ferry) "rO" = ( /turf/open/floor/plasteel/shuttle/white, /area/shuttle/escape) @@ -5897,7 +5900,9 @@ name = "Backup Shuttle Dock"; width = 8 }, -/obj/docking_port/mobile/emergency/backup, +/obj/docking_port/mobile/emergency/backup{ + dwidth = 3 + }, /turf/open/floor/plating, /area/shuttle/escape) "rR" = ( @@ -5924,21 +5929,37 @@ /turf/open/space/transit, /area/space) "rU" = ( +/obj/structure/flora/kirbyplants, /obj/machinery/status_display{ - density = 0; - pixel_y = -30; - supply_display = 1 + pixel_y = 32 }, -/turf/open/floor/plasteel/shuttle/white, -/area/shuttle/escape) +/turf/open/floor/plasteel/black, +/area/centcom/ferry) "rV" = ( /obj/structure/table/wood, /obj/item/weapon/book/manual/random, /turf/open/floor/plasteel/shuttle/white, /area/shuttle/escape) "rW" = ( -/obj/machinery/shuttle_manipulator, -/turf/open/floor/plasteel/black, +/obj/structure/lattice, +/turf/open/space, +/area/space) +"rX" = ( +/obj/machinery/status_display, +/turf/closed/wall/shuttle/smooth, +/area/shuttle/escape) +"rY" = ( +/turf/open/floor/plasteel/darkwarning{ + tag = "icon-warndark (EAST)"; + icon_state = "warndark"; + dir = 4 + }, +/area/centcom/ferry) +"rZ" = ( +/obj/machinery/door/airlock/external{ + name = "Backup Emergency Escape Shuttle" + }, +/turf/open/floor/plasteel/delivery, /area/centcom/ferry) (1,1,1) = {" @@ -36889,7 +36910,7 @@ ab ab ab ab -ab +rL ab ab ab @@ -38457,7 +38478,7 @@ ab ab ab eJ -eO +rN eO eS eO @@ -38710,11 +38731,11 @@ ab ab ab ab -ab -ab -ab eJ -eP +eJ +eJ +eJ +rU eO eO eO @@ -38967,11 +38988,11 @@ ab ab ab ab -ab -ab -ab eJ -rW +eO +eO +eP +eO eO eO eW @@ -39224,9 +39245,9 @@ ab ab ab ab -ab -ab -ab +eJ +rY +eJ eJ eJ eJ @@ -39481,9 +39502,9 @@ ab ab ab ab -ab -ab -ab +eJ +fQ +eJ ab ab ab @@ -39738,9 +39759,9 @@ ab ab ab ab -ab -ab -ab +eJ +rZ +eJ ab ab ab @@ -39994,14 +40015,14 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab +rM +rM +rQ +rM +rM +rM +rM +rM ab ab eJ @@ -40251,14 +40272,14 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab +rX +rO +rO +rO +rO +rO +rO +rX ab ab eJ @@ -40508,14 +40529,14 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab +rM +rO +rO +rO +rO +rO +rO +rM ab ab fh @@ -40765,14 +40786,14 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab +rM +rP +rP +rP +rP +rO +rP +rM ab ab fh @@ -41022,14 +41043,14 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab +rM +rP +rP +rP +rP +rO +rP +rM ab ab fh @@ -41279,14 +41300,14 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab +rM +rO +rR +rO +rO +rO +rO +rM ab ab fh @@ -41536,14 +41557,14 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab +rX +rO +rS +rV +rO +rO +rO +rX ab ab fh @@ -41793,14 +41814,14 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab +rM +rM +rM +rM +rM +rM +rM +rM ab ab fh @@ -57018,7 +57039,7 @@ ab ab ab ab -rL +ab ab ab ab @@ -64829,16 +64850,16 @@ df dg cT ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -65086,16 +65107,16 @@ cT cT cT ab -ad -rM -rM -rQ -rM -rM -rM -rM -rM -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -65343,16 +65364,16 @@ cU ad ab ab -ad -rM -rN -rO -rO -rO -rO -rU -rM -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -65600,16 +65621,16 @@ cV ad ab ab -ad -rM -rO -rO -rO -rO -rO -rO -rM -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -65857,16 +65878,16 @@ cV ad ab ab -ad -rM -rP -rP -rP -rP -rO -rP -rM -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -66114,16 +66135,16 @@ cV ad ab ab -ad -rM -rP -rP -rP -rP -rO -rP -rM -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -66371,16 +66392,16 @@ cV ad ab ab -ad -rM -rO -rR -rO -rO -rO -rO -rM -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -66628,16 +66649,16 @@ cV ad ab ab -ad -rM -rN -rS -rV -rO -rO -rU -rM -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -66885,16 +66906,16 @@ cV ad ab ab -ad -rM -rM -rM -rM -rM -rM -rM -rM -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -67142,16 +67163,16 @@ cV ad ab ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -71473,6 +71494,6 @@ ab ab ab ab -ab -ab +rW +rW "} diff --git a/_maps/shuttles/cargo_birdboat.dmm b/_maps/shuttles/cargo_birdboat.dmm index 423c397f6c1..345fb45a23a 100644 --- a/_maps/shuttles/cargo_birdboat.dmm +++ b/_maps/shuttles/cargo_birdboat.dmm @@ -14,7 +14,7 @@ "n" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/supply) "o" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/turf/open/floor/plating,/area/shuttle/supply) "p" = (/obj/machinery/button/door{dir = 2; id = "QMLoaddoor2"; name = "Loading Doors"; pixel_x = 24; pixel_y = 8},/obj/machinery/button/door{id = "QMLoaddoor"; name = "Loading Doors"; pixel_x = 24; pixel_y = -8},/obj/machinery/conveyor_switch/oneway{id = "cargoshuttle"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/supply) -"q" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 3; width = 10},/turf/open/floor/plating,/area/shuttle/supply) +"q" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 3; width = 10; timid = 1},/turf/open/floor/plating,/area/shuttle/supply) "r" = (/obj/machinery/door/poddoor{id = "QMLoaddoor"; name = "supply dock loading door"},/obj/machinery/conveyor{dir = 4; id = "cargoshuttle"; name = "cargo shuttle conveyor belt"},/turf/open/floor/plating,/area/shuttle/supply) "s" = (/turf/closed/wall/shuttle{icon_state = "swallc3"},/area/shuttle/supply) "t" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/supply) diff --git a/_maps/shuttles/cargo_box.dmm b/_maps/shuttles/cargo_box.dmm index 05df2fa52ba..f2fad41946a 100644 --- a/_maps/shuttles/cargo_box.dmm +++ b/_maps/shuttles/cargo_box.dmm @@ -6,7 +6,7 @@ "f" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/poddoor{id = "QMLoaddoor2"; name = "supply dock loading door"},/turf/open/floor/plating,/area/shuttle/supply) "g" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/turf/open/floor/plating,/area/shuttle/supply) "h" = (/obj/machinery/button/door{dir = 2; id = "QMLoaddoor2"; name = "Loading Doors"; pixel_x = 24; pixel_y = 8},/obj/machinery/button/door{id = "QMLoaddoor"; name = "Loading Doors"; pixel_x = 24; pixel_y = -8},/turf/open/floor/plasteel/shuttle,/area/shuttle/supply) -"i" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 5; width = 12},/turf/open/floor/plating,/area/shuttle/supply) +"i" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 5; width = 12; timid = 1},/turf/open/floor/plating,/area/shuttle/supply) "j" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/poddoor{id = "QMLoaddoor"; name = "supply dock loading door"},/turf/open/floor/plating,/area/shuttle/supply) "k" = (/turf/closed/wall/shuttle{icon_state = "swall7"; dir = 2},/area/shuttle/supply) "l" = (/turf/open/floor/plasteel/shuttle,/turf/closed/wall/shuttle/interior{icon_state = "swall_f10"},/area/shuttle/supply) diff --git a/_maps/shuttles/emergency_airless.dmm b/_maps/shuttles/emergency_airless.dmm index d2d0025ee2f..c1a9f4f3b77 100644 --- a/_maps/shuttles/emergency_airless.dmm +++ b/_maps/shuttles/emergency_airless.dmm @@ -5,15 +5,15 @@ "e" = (/obj/structure/closet/malf,/turf/open/floor/plating/airless,/area/shuttle/escape) "f" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/open/floor/plating/airless,/area/shuttle/escape) "g" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/open/floor/plating/airless,/area/shuttle/escape) -"h" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/open/floor/plating/airless,/area/shuttle/escape) +"h" = (/obj/structure/window/reinforced{dir = 4;pixel_x = 0},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/open/floor/plating/airless,/area/shuttle/escape) "i" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plating/airless,/area/shuttle/escape) "j" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/open/floor/plating/airless,/area/shuttle/escape) "k" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/turf/open/floor/plating/airless,/area/shuttle/escape) "l" = (/turf/open/floor/plating,/area/shuttle/escape) -"m" = (/obj/structure/chair{dir = 8},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/open/floor/plating/airless,/area/shuttle/escape) +"m" = (/obj/structure/chair{dir = 8},/obj/structure/window/reinforced{dir = 4;pixel_x = 0},/turf/open/floor/plating/airless,/area/shuttle/escape) "n" = (/obj/structure/chair{dir = 4},/turf/open/floor/plating/airless,/area/shuttle/escape) -"o" = (/obj/docking_port/mobile/emergency{name = "Shuttle Under Construction"},/turf/open/floor/plating/airless,/area/shuttle/escape) -"p" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 4; name = "4maintenance loot spawner"},/turf/open/floor/plating/airless,/area/shuttle/escape) +"o" = (/obj/docking_port/mobile/emergency{name = "Shuttle Under Construction";timid = 1},/turf/open/floor/plating/airless,/area/shuttle/escape) +"p" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 4;name = "4maintenance loot spawner"},/turf/open/floor/plating/airless,/area/shuttle/escape) "q" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape) "r" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape) diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm index 387ebe9f888..320859dd4cb 100644 --- a/_maps/shuttles/emergency_bar.dmm +++ b/_maps/shuttles/emergency_bar.dmm @@ -4,83 +4,105 @@ "ad" = (/obj/structure/table/wood,/obj/item/device/flashlight/lamp/green,/turf/open/floor/carpet,/area/shuttle/escape) "ae" = (/obj/structure/chair/comfy/brown{dir = 1},/turf/open/floor/carpet,/area/shuttle/escape) "af" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/carpet,/area/shuttle/escape) -"ag" = (/obj/structure/table/wood,/obj/item/weapon/storage/fancy/cigarettes/cigars/havana,/obj/item/weapon/lighter{pixel_x = -4; pixel_y = 6},/turf/open/floor/carpet,/area/shuttle/escape) +"ag" = (/obj/structure/table/wood,/obj/item/weapon/storage/fancy/cigarettes/cigars/havana,/obj/item/weapon/lighter{pixel_x = -4;pixel_y = 6},/turf/open/floor/carpet,/area/shuttle/escape) "ah" = (/obj/machinery/computer/atmos_alert,/turf/open/floor/carpet,/area/shuttle/escape) "ai" = (/obj/structure/chair/comfy/brown{dir = 8},/turf/open/floor/carpet,/area/shuttle/escape) "aj" = (/turf/open/floor/carpet,/area/shuttle/escape) "ak" = (/obj/structure/chair/comfy/brown{dir = 4},/turf/open/floor/carpet,/area/shuttle/escape) "al" = (/obj/machinery/computer/security,/turf/open/floor/carpet,/area/shuttle/escape) "am" = (/obj/machinery/computer/crew,/turf/open/floor/carpet,/area/shuttle/escape) -"an" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/structure/chair/comfy/brown{dir = 8},/turf/open/floor/carpet,/area/shuttle/escape) -"ao" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/turf/open/floor/carpet,/area/shuttle/escape) -"ap" = (/obj/machinery/button/flasher{id = "cockpit_flasher"; pixel_x = 6; pixel_y = -24},/obj/structure/statue/diamond/captain{anchored = 1; name = "statue of THE captain"},/turf/open/floor/carpet,/area/shuttle/escape) +"an" = (/obj/structure/extinguisher_cabinet{pixel_x = 0;pixel_y = -30},/obj/structure/chair/comfy/brown{dir = 8},/turf/open/floor/carpet,/area/shuttle/escape) +"ao" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)";pixel_x = 0;pixel_y = -29},/turf/open/floor/carpet,/area/shuttle/escape) +"ap" = (/obj/machinery/button/flasher{id = "cockpit_flasher";pixel_x = 6;pixel_y = -24},/obj/structure/statue/diamond/captain{anchored = 1;name = "statue of THE captain"},/turf/open/floor/carpet,/area/shuttle/escape) "aq" = (/obj/machinery/computer/communications,/turf/open/floor/carpet,/area/shuttle/escape) -"ar" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Cockpit"; req_access_txt = "19"},/turf/open/floor/carpet,/area/shuttle/escape) +"ar" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Cockpit";req_access_txt = "19"},/turf/open/floor/carpet,/area/shuttle/escape) "as" = (/obj/machinery/status_display,/turf/closed/wall/shuttle/smooth,/area/shuttle/escape) "at" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"au" = (/obj/machinery/flasher{id = "cockpit_flasher"; pixel_x = 6; pixel_y = 24},/obj/structure/flora/kirbyplants{icon_state = "plant-10"; layer = 4.1},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"au" = (/obj/machinery/flasher{id = "cockpit_flasher";pixel_x = 6;pixel_y = 24},/obj/structure/flora/kirbyplants{icon_state = "plant-10";layer = 4.1},/turf/open/floor/plasteel/bar,/area/shuttle/escape) "av" = (/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aw" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"ax" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"ay" = (/obj/machinery/flasher{id = "shuttle_flasher"; pixel_x = -24; pixel_y = 6},/obj/machinery/button/flasher{id = "shuttle_flasher"; pixel_x = -24; pixel_y = -6},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"aw" = (/obj/structure/piano,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"ax" = (/obj/structure/chair/stool,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"ay" = (/obj/machinery/flasher{id = "shuttle_flasher";pixel_x = -24;pixel_y = 6},/obj/machinery/button/flasher{id = "shuttle_flasher";pixel_x = -24;pixel_y = -6},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) "az" = (/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"aA" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aB" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"aC" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"aA" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig";req_access_txt = "2"},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aB" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock";req_access_txt = "2"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"aC" = (/obj/structure/extinguisher_cabinet{pixel_x = 0;pixel_y = -30},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) "aD" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) "aE" = (/obj/structure/chair/wood{dir = 4},/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aF" = (/obj/structure/table/wood,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aG" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aH" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{name = "The Emergency Escape Bar"},/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aI" = (/obj/structure/table,/obj/machinery/chem_dispenser/drinks/beer,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aJ" = (/obj/structure/chair,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aK" = (/mob/living/simple_animal/drone/snowflake/bardrone,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aL" = (/obj/machinery/vending/boozeomat,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aM" = (/obj/structure/table,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aN" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 6; pixel_y = 4},/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aO" = (/obj/structure/table,/obj/machinery/chem_dispenser/drinks,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aP" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aQ" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aR" = (/obj/structure/chair/stool,/turf/open/floor/wood,/area/shuttle/escape) -"aS" = (/obj/structure/table/wood/poker,/obj/effect/spawner/lootdrop/gambling,/turf/open/floor/wood,/area/shuttle/escape) -"aT" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aU" = (/obj/machinery/vending/cigarette,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aV" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"aW" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"aX" = (/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"aY" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"aZ" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"ba" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"bb" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"bc" = (/obj/machinery/door/airlock{name = "Unit B"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"bd" = (/obj/structure/closet/jcloset,/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"be" = (/obj/structure/toilet{dir = 1},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"bf" = (/obj/machinery/recharge_station,/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"bg" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"bh" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape) -"bi" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape) +"aF" = (/obj/structure/table/wood/bar{boot_dir = 9},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aG" = (/obj/structure/table/wood/bar,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aH" = (/obj/structure/table/wood/bar{boot_dir = 8},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aI" = (/obj/structure/extinguisher_cabinet{pixel_x = 27;pixel_y = 0},/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aJ" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{name = "The Emergency Escape Bar";timid = 1},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aK" = (/mob/living/simple_animal/hostile/alien/maid/barmaid,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aL" = (/obj/structure/table,/obj/machinery/chem_dispenser/drinks/beer,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aM" = (/obj/structure/chair,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aN" = (/mob/living/simple_animal/drone/snowflake/bardrone,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aO" = (/obj/machinery/vending/boozeomat,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aP" = (/obj/structure/table,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aQ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 6;pixel_y = 4},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aR" = (/obj/structure/table,/obj/machinery/chem_dispenser/drinks,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aS" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aT" = (/obj/structure/table/wood/bar{boot_dir = 10},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aU" = (/obj/structure/table/wood/bar{boot_dir = 2},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aV" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aW" = (/obj/structure/chair/stool,/turf/open/floor/wood,/area/shuttle/escape) +"aX" = (/obj/structure/table/wood/poker,/obj/effect/spawner/lootdrop/gambling,/turf/open/floor/wood,/area/shuttle/escape) +"aY" = (/obj/structure/extinguisher_cabinet{pixel_x = 0;pixel_y = -30},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aZ" = (/obj/machinery/vending/cigarette,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"ba" = (/obj/machinery/door/airlock{name = "Unisex Restrooms";req_access_txt = "0"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bb" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bc" = (/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bd" = (/obj/structure/extinguisher_cabinet{pixel_x = -5;pixel_y = 30},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"be" = (/obj/structure/sink{dir = 4;icon_state = "sink";pixel_x = 11;pixel_y = 0},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bf" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bg" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bh" = (/obj/machinery/door/airlock{name = "Unit B"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bi" = (/obj/structure/closet/jcloset,/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bj" = (/obj/structure/toilet{dir = 1},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bk" = (/obj/machinery/recharge_station,/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bl" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2;pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bm" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape) +"bn" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape) +"bE" = (/turf/closed/wall/shuttle{tag = "icon-gwall_space (EAST)";icon_state = "gwall_space";dir = 4},/area/shuttle/escape) +"bD" = (/turf/closed/wall/shuttle{tag = "icon-wall3";icon_state = "wall3";dir = 2},/area/shuttle/escape) +"bC" = (/turf/closed/wall/shuttle{tag = "icon-gwall_space";icon_state = "gwall_space";dir = 2},/area/shuttle/escape) +"bB" = (/turf/closed/wall/shuttle{icon_state = "swall11";dir = 2},/area/shuttle/escape) +"bA" = (/turf/closed/wall/shuttle{icon_state = "swallc2";dir = 2},/area/shuttle/escape) +"bz" = (/turf/closed/wall/shuttle{icon_state = "swall1";dir = 2},/area/shuttle/escape) +"by" = (/turf/closed/wall/shuttle{icon_state = "swall7";dir = 2},/area/shuttle/escape) +"bx" = (/turf/closed/wall/shuttle{icon_state = "swall4";dir = 2},/area/shuttle/escape) +"bw" = (/turf/closed/wall/shuttle{icon_state = "swall8";dir = 2},/area/shuttle/escape) +"bv" = (/turf/closed/wall/shuttle{icon_state = "swall14";dir = 2},/area/shuttle/escape) +"bu" = (/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape) +"bt" = (/turf/closed/wall/shuttle{tag = "icon-swall13";icon_state = "swall13";dir = 2},/area/shuttle/escape) +"bs" = (/turf/closed/wall/shuttle{icon_state = "swall3";dir = 2},/area/shuttle/escape) +"br" = (/turf/closed/wall/shuttle{tag = "icon-swallc3";icon_state = "swallc3";dir = 2},/area/shuttle/escape) +"bq" = (/turf/closed/wall/shuttle{icon_state = "swallc4";dir = 2},/area/shuttle/escape) +"bp" = (/turf/closed/wall/shuttle{icon_state = "swall_s10";dir = 2},/area/shuttle/escape) +"bo" = (/turf/closed/wall/shuttle{icon_state = "swall_s6";dir = 2},/area/shuttle/escape) (1,1,1) = {" -aaaaabacacacacacabaaaa -aaababadaeafaeagababaa -aaabahaiajajajakalabaa -aaabamanaoapajakaqabaa -ababababababarasababab -abatatatacauavavawaxac -abayazazaAavavavavavab -aBaCaDaDacavaEaFaFaFac -abababababavaEaFavaGab -aHavavavavavaEaFavaIab -abaJaJaJavavaEaFaKaLab -acaMaNaMavavaEaFavaOac -acaPaPaPavavaEaFavavac -acavavavavavaEaFaFaFac -abavavavavavavavavavab -aQavaRaSaRaTavavavaUab -ababababababababaVabab -aWaXaXaXaXaXaYaXaXaZac -abbaabbbabbcabbdaXaZab -abbeabbeabbfabbgaXaZac -ababbhbhbhbhbhbhbhabab -aaabbibibibibibibiabaa +aaaaboacacacacacbpaaaa +aabobqadaeafaeagbrbpaa +aabsahaiajajajakalbsaa +aabsamanaoapajakaqbsaa +bobtbububvbwarasbxbtbp +bsatatatacauavavawaxac +bsayazazaAavavavavavbs +aBaCaDaDacavaEaFaGaGac +bybubububqavaEaHavaIbs +aJavavavavavaEaHaKaLbs +bsaMaMaMavavaEaHaNaObs +acaPaQaPavavaEaHavaRac +acaSaSaSavavaEaHavavac +acavavavavavaEaTaUaUac +bzavavavavavavavavavbs +aVavaWaXaWaYavavavaZbs +bAbububububububwbabxbB +bbbcbcbcbcbcbdbcbcbeac +bsbfabbgabbhabbibcbebs +bzbjbzbjbzbkbzblbcbeac +bCbDbmbmbmbmbmbmbmbDbE +aabDbnbnbnbnbnbnbnbDaa "} diff --git a/_maps/shuttles/emergency_birdboat.dmm b/_maps/shuttles/emergency_birdboat.dmm index 05f356775bd..80b1bc6fb43 100644 --- a/_maps/shuttles/emergency_birdboat.dmm +++ b/_maps/shuttles/emergency_birdboat.dmm @@ -1,63 +1,63 @@ "aa" = (/turf/open/space,/area/space) -"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape) -"ac" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape) -"ad" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape) -"ae" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape) -"af" = (/turf/closed/wall/shuttle{icon_state = "swall8"; dir = 2},/area/shuttle/escape) +"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6";dir = 2},/area/shuttle/escape) +"ac" = (/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape) +"ad" = (/turf/closed/wall/shuttle{icon_state = "swall14";dir = 2},/area/shuttle/escape) +"ae" = (/turf/closed/wall/shuttle{icon_state = "swall_s10";dir = 2},/area/shuttle/escape) +"af" = (/turf/closed/wall/shuttle{icon_state = "swall8";dir = 2},/area/shuttle/escape) "ag" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape) -"ah" = (/turf/closed/wall/shuttle{icon_state = "swall4"; dir = 2},/area/shuttle/escape) -"ai" = (/turf/closed/wall/shuttle{icon_state = "swall11"; dir = 2},/area/shuttle/escape) -"aj" = (/obj/structure/table,/obj/item/weapon/scalpel,/obj/item/weapon/retractor{pixel_x = 0; pixel_y = 5},/obj/item/weapon/hemostat,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) +"ah" = (/turf/closed/wall/shuttle{icon_state = "swall4";dir = 2},/area/shuttle/escape) +"ai" = (/turf/closed/wall/shuttle{icon_state = "swall11";dir = 2},/area/shuttle/escape) +"aj" = (/obj/structure/table,/obj/item/weapon/scalpel,/obj/item/weapon/retractor{pixel_x = 0;pixel_y = 5},/obj/item/weapon/hemostat,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) "ak" = (/obj/structure/table,/obj/item/weapon/cautery,/obj/item/weapon/surgicaldrill,/obj/item/weapon/circular_saw{pixel_y = 9},/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) "al" = (/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) -"am" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape) -"an" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 8},/turf/open/floor/plating/airless,/area/shuttle/escape) -"ao" = (/turf/closed/wall/shuttle{icon_state = "swallc4"; dir = 2},/area/shuttle/escape) +"am" = (/turf/closed/wall/shuttle{icon_state = "swall3";dir = 2},/area/shuttle/escape) +"an" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r";dir = 8},/turf/open/floor/plating/airless,/area/shuttle/escape) +"ao" = (/turf/closed/wall/shuttle{icon_state = "swallc4";dir = 2},/area/shuttle/escape) "ap" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "aq" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "ar" = (/obj/structure/flora/kirbyplants{icon_state = "plant-22"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"as" = (/turf/closed/wall/shuttle{icon_state = "swall1"; dir = 2},/area/shuttle/escape) +"as" = (/turf/closed/wall/shuttle{icon_state = "swall1";dir = 2},/area/shuttle/escape) "at" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape) "au" = (/obj/structure/table/optable,/obj/item/weapon/surgical_drapes,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) -"av" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/open/floor/plating/airless,/area/shuttle/escape) +"av" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion";dir = 8},/turf/open/floor/plating/airless,/area/shuttle/escape) "aw" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "ax" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"ay" = (/obj/machinery/door/airlock/glass_command{name = "bridge door"; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"ay" = (/obj/machinery/door/airlock/glass_command{name = "bridge door";req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "az" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape) -"aA" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/open/floor/plating/airless,/area/shuttle/escape) +"aA" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l";dir = 8},/turf/open/floor/plating/airless,/area/shuttle/escape) "aB" = (/obj/structure/extinguisher_cabinet{pixel_y = -32},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"aC" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0; idle_power_usage = 0; pixel_y = 4; use_power = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape) +"aC" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0;idle_power_usage = 0;pixel_y = 4;use_power = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape) "aD" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape) -"aE" = (/turf/closed/wall/shuttle{icon_state = "swallc2"; dir = 2},/area/shuttle/escape) -"aF" = (/turf/closed/wall/shuttle{icon_state = "swall15"; dir = 2},/area/shuttle/escape) -"aG" = (/turf/closed/wall/shuttle{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape) +"aE" = (/turf/closed/wall/shuttle{icon_state = "swallc2";dir = 2},/area/shuttle/escape) +"aF" = (/turf/closed/wall/shuttle{icon_state = "swall15";dir = 2},/area/shuttle/escape) +"aG" = (/turf/closed/wall/shuttle{icon_state = "swall_s9";dir = 2},/area/shuttle/escape) "aH" = (/turf/closed/wall/shuttle,/area/shuttle/escape) -"aI" = (/obj/machinery/door/airlock/glass_security{name = "security airlock"; req_access_txt = "63"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape) +"aI" = (/obj/machinery/door/airlock/glass_security{name = "security airlock";req_access_txt = "63"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape) "aJ" = (/obj/machinery/door/airlock/glass,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) "aK" = (/turf/closed/wall/shuttle{icon_state = "swallc3"},/area/shuttle/escape) -"aL" = (/turf/closed/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/escape) -"aM" = (/obj/structure/flora/kirbyplants{icon_state = "plant-21"; layer = 4.1},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"aL" = (/turf/closed/wall/shuttle{icon_state = "swall13";dir = 2},/area/shuttle/escape) +"aM" = (/obj/structure/flora/kirbyplants{icon_state = "plant-21";layer = 4.1},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aN" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aO" = (/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "aP" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "aQ" = (/obj/structure/table,/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "aR" = (/obj/machinery/door/airlock/shuttle,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aS" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) -"aT" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti{name = "pasghetti"; pixel_x = 4; pixel_y = 7},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) -"aU" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile/emergency{dheight = 0; dir = 8; dwidth = 6; height = 18; travelDir = 90; width = 14},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"aT" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti{name = "pasghetti";pixel_x = 4;pixel_y = 7},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) +"aU" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile/emergency{dheight = 0;dir = 8;dwidth = 6;height = 18;travelDir = 90;width = 14;timid = 1},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aV" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "aW" = (/obj/structure/chair{dir = 1},/obj/structure/window/reinforced,/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) -"aX" = (/turf/closed/wall/shuttle{icon_state = "swall2"; dir = 2},/area/shuttle/escape) -"aY" = (/obj/structure/chair,/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) +"aX" = (/turf/closed/wall/shuttle{icon_state = "swall2";dir = 2},/area/shuttle/escape) +"aY" = (/obj/structure/chair,/obj/structure/window/reinforced{dir = 1;pixel_y = 2},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "aZ" = (/obj/structure/extinguisher_cabinet{pixel_x = -27},/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) -"ba" = (/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/fire{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/toxin,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) -"bb" = (/turf/closed/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/escape) -"bc" = (/turf/closed/wall/shuttle{icon_state = "swallc1"; dir = 2},/area/shuttle/escape) +"ba" = (/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/fire{pixel_x = 5;pixel_y = 5},/obj/item/weapon/storage/firstaid/toxin,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) +"bb" = (/turf/closed/wall/shuttle{icon_state = "swall_s5";dir = 2},/area/shuttle/escape) +"bc" = (/turf/closed/wall/shuttle{icon_state = "swallc1";dir = 2},/area/shuttle/escape) "bd" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) -"be" = (/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/brute{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/brute,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) +"be" = (/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/brute{pixel_x = 5;pixel_y = 5},/obj/item/weapon/storage/firstaid/brute,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) "bf" = (/obj/structure/extinguisher_cabinet{pixel_y = -32},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "bg" = (/obj/structure/chair,/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) -"bh" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 1},/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) +"bh" = (/obj/machinery/sleeper{icon_state = "sleeper-open";dir = 1},/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) "bi" = (/obj/structure/table/glass,/obj/item/weapon/defibrillator/loaded,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) (1,1,1) = {" diff --git a/_maps/shuttles/emergency_box.dmm b/_maps/shuttles/emergency_box.dmm index 87cc48d438c..159e7b94fd1 100644 --- a/_maps/shuttles/emergency_box.dmm +++ b/_maps/shuttles/emergency_box.dmm @@ -1,65 +1,65 @@ "aa" = (/turf/open/space,/area/space) -"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape) +"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6";dir = 2},/area/shuttle/escape) "ac" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape) -"ad" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape) +"ad" = (/turf/closed/wall/shuttle{icon_state = "swall_s10";dir = 2},/area/shuttle/escape) "ae" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/turf/closed/wall/shuttle/interior{icon_state = "swall_f9"},/area/shuttle/escape) "af" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "ag" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "ah" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"ai" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"ai" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2;pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aj" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/turf/closed/wall/shuttle/interior{icon_state = "swall_f5"},/area/shuttle/escape) -"ak" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape) +"ak" = (/turf/closed/wall/shuttle{icon_state = "swall3";dir = 2},/area/shuttle/escape) "al" = (/obj/machinery/computer/atmos_alert,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "am" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "an" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "ao" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "ap" = (/obj/machinery/computer/security,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aq" = (/obj/machinery/computer/crew,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"ar" = (/obj/structure/chair{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"as" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"at" = (/obj/machinery/button/flasher{id = "cockpit_flasher"; pixel_x = 6; pixel_y = -24},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"ar" = (/obj/structure/chair{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 0;pixel_y = -30},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"as" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)";pixel_x = 0;pixel_y = -29},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"at" = (/obj/machinery/button/flasher{id = "cockpit_flasher";pixel_x = 6;pixel_y = -24},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "au" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"av" = (/turf/closed/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/escape) -"aw" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape) -"ax" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape) -"ay" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Cockpit"; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"az" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape) +"av" = (/turf/closed/wall/shuttle{icon_state = "swall13";dir = 2},/area/shuttle/escape) +"aw" = (/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape) +"ax" = (/turf/closed/wall/shuttle{icon_state = "swall14";dir = 2},/area/shuttle/escape) +"ay" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Cockpit";req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"az" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape) "aA" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"aB" = (/obj/machinery/flasher{id = "cockpit_flasher"; pixel_x = 6; pixel_y = 24},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"aB" = (/obj/machinery/flasher{id = "cockpit_flasher";pixel_x = 6;pixel_y = 24},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aC" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aD" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"aE" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"aF" = (/obj/machinery/flasher{id = "shuttle_flasher"; pixel_x = -24; pixel_y = 6},/obj/machinery/button/flasher{id = "shuttle_flasher"; pixel_x = -24; pixel_y = -6},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"aE" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2;pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"aF" = (/obj/machinery/flasher{id = "shuttle_flasher";pixel_x = -24;pixel_y = 6},/obj/machinery/button/flasher{id = "shuttle_flasher";pixel_x = -24;pixel_y = -6},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) "aG" = (/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"aH" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"aI" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/open/floor/plating,/area/shuttle/escape) +"aH" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig";req_access_txt = "2"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aI" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock";req_access_txt = "2"},/turf/open/floor/plating,/area/shuttle/escape) "aJ" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) "aK" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aL" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aM" = (/obj/structure/table,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"aN" = (/turf/closed/wall/shuttle{icon_state = "swall7"; dir = 2},/area/shuttle/escape) -"aO" = (/turf/closed/wall/shuttle{icon_state = "swallc4"; dir = 2},/area/shuttle/escape) -"aP" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency,/turf/open/floor/plating,/area/shuttle/escape) -"aQ" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"aR" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aN" = (/turf/closed/wall/shuttle{icon_state = "swall7";dir = 2},/area/shuttle/escape) +"aO" = (/turf/closed/wall/shuttle{icon_state = "swallc4";dir = 2},/area/shuttle/escape) +"aP" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{timid = 1},/turf/open/floor/plating,/area/shuttle/escape) +"aQ" = (/obj/structure/extinguisher_cabinet{pixel_x = -5;pixel_y = 30},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aR" = (/obj/structure/extinguisher_cabinet{pixel_x = 27;pixel_y = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "aS" = (/obj/structure/chair{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aT" = (/obj/structure/chair{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aU" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aV" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/escape) -"aW" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aW" = (/obj/structure/extinguisher_cabinet{pixel_x = 0;pixel_y = -30},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "aX" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"aY" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape) +"aY" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall14";dir = 2},/area/shuttle/escape) "aZ" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Infirmary"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"ba" = (/turf/closed/wall/shuttle{icon_state = "swall11"; dir = 2},/area/shuttle/escape) +"ba" = (/turf/closed/wall/shuttle{icon_state = "swall11";dir = 2},/area/shuttle/escape) "bb" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor2"},/area/shuttle/escape) -"bc" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor2"},/area/shuttle/escape) -"bd" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"be" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"bc" = (/obj/structure/extinguisher_cabinet{pixel_x = 27;pixel_y = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor2"},/area/shuttle/escape) +"bd" = (/obj/machinery/sleeper{icon_state = "sleeper-open";dir = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"be" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2;pixel_y = 3},/obj/item/weapon/crowbar,/obj/structure/extinguisher_cabinet{pixel_x = 27;pixel_y = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "bf" = (/obj/structure/closet,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor2"},/area/shuttle/escape) "bg" = (/obj/structure/closet/crate,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor2"},/area/shuttle/escape) -"bh" = (/turf/closed/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/escape) +"bh" = (/turf/closed/wall/shuttle{icon_state = "swall_s5";dir = 2},/area/shuttle/escape) "bi" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape) -"bj" = (/turf/closed/wall/shuttle{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape) +"bj" = (/turf/closed/wall/shuttle{icon_state = "swall_s9";dir = 2},/area/shuttle/escape) "bk" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape) (1,1,1) = {" diff --git a/_maps/shuttles/emergency_clown.dmm b/_maps/shuttles/emergency_clown.dmm index 2e082b3e67e..a80e41e756f 100644 --- a/_maps/shuttles/emergency_clown.dmm +++ b/_maps/shuttles/emergency_clown.dmm @@ -1,64 +1,64 @@ "aa" = (/turf/open/space,/area/space) -"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape) +"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6";dir = 2},/area/shuttle/escape) "ac" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape) -"ad" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape) +"ad" = (/turf/closed/wall/shuttle{icon_state = "swall_s10";dir = 2},/area/shuttle/escape) "ae" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/turf/closed/wall/shuttle/interior{icon_state = "swall_f9"},/area/shuttle/escape) "af" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/turf/open/floor/noslip,/area/shuttle/escape) "ag" = (/obj/structure/chair{dir = 1},/turf/open/floor/bluespace,/area/shuttle/escape) "ah" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/bluespace,/area/shuttle/escape) -"ai" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/noslip,/area/shuttle/escape) +"ai" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2;pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/noslip,/area/shuttle/escape) "aj" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/turf/closed/wall/shuttle/interior{icon_state = "swall_f5"},/area/shuttle/escape) -"ak" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape) +"ak" = (/turf/closed/wall/shuttle{icon_state = "swall3";dir = 2},/area/shuttle/escape) "al" = (/obj/machinery/computer/atmos_alert,/turf/open/floor/noslip,/area/shuttle/escape) "am" = (/obj/structure/chair{dir = 8},/turf/open/floor/bluespace,/area/shuttle/escape) "an" = (/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) "ao" = (/obj/structure/chair{dir = 4},/turf/open/floor/bluespace,/area/shuttle/escape) "ap" = (/obj/machinery/computer/security,/turf/open/floor/noslip,/area/shuttle/escape) "aq" = (/obj/machinery/computer/crew,/turf/open/floor/noslip,/area/shuttle/escape) -"ar" = (/obj/structure/chair{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/bluespace,/area/shuttle/escape) -"as" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) +"ar" = (/obj/structure/chair{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 0;pixel_y = -30},/turf/open/floor/bluespace,/area/shuttle/escape) +"as" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)";pixel_x = 0;pixel_y = -29},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) "at" = (/obj/machinery/computer/communications,/turf/open/floor/noslip,/area/shuttle/escape) -"au" = (/turf/closed/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/escape) -"av" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape) -"aw" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape) -"ax" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Premium Lounge"; req_access_txt = "0"},/turf/open/floor/bluespace,/area/shuttle/escape) -"ay" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape) +"au" = (/turf/closed/wall/shuttle{icon_state = "swall13";dir = 2},/area/shuttle/escape) +"av" = (/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape) +"aw" = (/turf/closed/wall/shuttle{icon_state = "swall14";dir = 2},/area/shuttle/escape) +"ax" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Premium Lounge";req_access_txt = "0"},/turf/open/floor/bluespace,/area/shuttle/escape) +"ay" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape) "az" = (/turf/open/chasm/straight_down/lava_land_surface,/area/shuttle/escape) "aA" = (/turf/open/floor/noslip,/area/shuttle/escape) "aB" = (/obj/structure/closet/emcloset,/obj/item/toy/sword,/turf/open/floor/noslip,/area/shuttle/escape) -"aC" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/noslip,/area/shuttle/escape) -"aD" = (/obj/item/weapon/greentext{anchored = 1},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"aE" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/open/floor/bluespace,/area/shuttle/escape) +"aC" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2;pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/noslip,/area/shuttle/escape) +"aD" = (/obj/item/weapon/greentext/quiet{anchored = 1},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"aE" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig";req_access_txt = "2"},/turf/open/floor/bluespace,/area/shuttle/escape) "aF" = (/obj/structure/chair,/turf/open/floor/noslip,/area/shuttle/escape) "aG" = (/obj/structure/chair{dir = 4},/turf/open/floor/noslip,/area/shuttle/escape) "aH" = (/obj/structure/table,/obj/item/device/multitool/ai_detect,/turf/open/floor/noslip,/area/shuttle/escape) -"aI" = (/turf/closed/wall/shuttle{icon_state = "swall7"; dir = 2},/area/shuttle/escape) -"aJ" = (/turf/closed/wall/shuttle{icon_state = "swallc4"; dir = 2},/area/shuttle/escape) +"aI" = (/turf/closed/wall/shuttle{icon_state = "swall7";dir = 2},/area/shuttle/escape) +"aJ" = (/turf/closed/wall/shuttle{icon_state = "swallc4";dir = 2},/area/shuttle/escape) "aK" = (/obj/structure/table,/obj/item/toy/sword,/turf/open/floor/noslip,/area/shuttle/escape) -"aL" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{name = "Snappop(tm)!"},/turf/open/floor/plating,/area/shuttle/escape) -"aM" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) -"aN" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) +"aL" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{name = "Snappop(tm)!";timid = 1},/turf/open/floor/plating,/area/shuttle/escape) +"aM" = (/obj/structure/extinguisher_cabinet{pixel_x = -5;pixel_y = 30},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) +"aN" = (/obj/structure/extinguisher_cabinet{pixel_x = 27;pixel_y = 0},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) "aO" = (/obj/structure/bed,/obj/item/weapon/bedsheet/random,/turf/open/floor/noslip,/area/shuttle/escape) "aP" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/bed,/obj/item/weapon/bedsheet/random,/turf/open/floor/noslip,/area/shuttle/escape) "aQ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/bed,/obj/item/weapon/bedsheet/random,/turf/open/floor/noslip,/area/shuttle/escape) "aR" = (/obj/structure/bed,/obj/item/weapon/bedsheet/random,/obj/structure/window/reinforced{dir = 8},/turf/open/floor/noslip,/area/shuttle/escape) "aS" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/escape) -"aT" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) +"aT" = (/obj/structure/extinguisher_cabinet{pixel_x = 0;pixel_y = -30},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) "aU" = (/obj/item/toy/snappop,/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) "aV" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo"},/turf/open/floor/bluespace,/area/shuttle/escape) -"aW" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape) +"aW" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall14";dir = 2},/area/shuttle/escape) "aX" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Infirmary"},/turf/open/floor/bluespace,/area/shuttle/escape) -"aY" = (/turf/closed/wall/shuttle{icon_state = "swall11"; dir = 2},/area/shuttle/escape) +"aY" = (/turf/closed/wall/shuttle{icon_state = "swall11";dir = 2},/area/shuttle/escape) "aZ" = (/turf/open/floor/mineral/bananium,/area/shuttle/escape) -"ba" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/mineral/bananium,/area/shuttle/escape) -"bb" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/turf/open/floor/noslip,/area/shuttle/escape) -"bc" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/noslip,/area/shuttle/escape) +"ba" = (/obj/structure/extinguisher_cabinet{pixel_x = 27;pixel_y = 0},/turf/open/floor/mineral/bananium,/area/shuttle/escape) +"bb" = (/obj/machinery/sleeper{icon_state = "sleeper-open";dir = 8},/turf/open/floor/noslip,/area/shuttle/escape) +"bc" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2;pixel_y = 3},/obj/item/weapon/crowbar,/obj/structure/extinguisher_cabinet{pixel_x = 27;pixel_y = 0},/turf/open/floor/noslip,/area/shuttle/escape) "bd" = (/obj/structure/closet/crate/trashcart{desc = "A heavy, metal trashcart with wheels. Feel free to hop in at any time!"},/obj/item/toy/sword,/turf/open/floor/mineral/bananium,/area/shuttle/escape) -"be" = (/obj/machinery/vending/autodrobe{extended_inventory = 1; scan_id = 0},/turf/open/floor/mineral/bananium,/area/shuttle/escape) +"be" = (/obj/machinery/vending/autodrobe{extended_inventory = 1;scan_id = 0},/turf/open/floor/mineral/bananium,/area/shuttle/escape) "bf" = (/obj/machinery/vending/clothing{extended_inventory = 1},/turf/open/floor/mineral/bananium,/area/shuttle/escape) -"bg" = (/turf/closed/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/escape) +"bg" = (/turf/closed/wall/shuttle{icon_state = "swall_s5";dir = 2},/area/shuttle/escape) "bh" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape) -"bi" = (/turf/closed/wall/shuttle{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape) +"bi" = (/turf/closed/wall/shuttle{icon_state = "swall_s9";dir = 2},/area/shuttle/escape) "bj" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape) (1,1,1) = {" diff --git a/_maps/shuttles/emergency_cramped.dmm b/_maps/shuttles/emergency_cramped.dmm index db8c02bfc04..2f558a66be1 100644 --- a/_maps/shuttles/emergency_cramped.dmm +++ b/_maps/shuttles/emergency_cramped.dmm @@ -1,18 +1,18 @@ "a" = (/turf/closed/wall/shuttle/smooth,/area/shuttle/escape) "b" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape) -"c" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/open/floor/plating,/area/shuttle/escape) +"c" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock";req_access_txt = "2"},/turf/open/floor/plating,/area/shuttle/escape) "d" = (/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "e" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "f" = (/obj/machinery/computer/shuttle,/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "g" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/book/manual/random,/obj/structure/extinguisher_cabinet{pixel_x = -30},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "h" = (/obj/machinery/door/window/southleft,/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "i" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/item/device/gps{gpstag = "STV5"},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) -"j" = (/obj/machinery/status_display,/turf/closed/wall/shuttle/smooth,/area/shuttle/escape) -"k" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{dwidth = 3; height = 5; name = "Secure Transport Vessel 5"; width = 14},/turf/open/floor/plating,/area/shuttle/escape) +"j" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall3"},/area/shuttle/escape) +"k" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{dwidth = 3;height = 5;name = "Secure Transport Vessel 5";width = 14;timid = 1},/turf/open/floor/plating,/area/shuttle/escape) "l" = (/turf/open/floor/plating,/area/shuttle/escape) "m" = (/obj/structure/closet/emcloset,/turf/open/floor/plating,/area/shuttle/escape) "n" = (/obj/structure/chair{dir = 4},/turf/open/floor/plating,/area/shuttle/escape) -"o" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 8; name = "8maintenance loot spawner"},/turf/open/floor/plasteel/bot,/area/shuttle/escape) +"o" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 8;name = "8maintenance loot spawner"},/turf/open/floor/plasteel/bot,/area/shuttle/escape) "p" = (/obj/structure/closet/crate/secure/loot,/turf/open/floor/plasteel/bot,/area/shuttle/escape) "q" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/escape) "r" = (/obj/structure/closet/crate/secure/weapon,/obj/effect/spawner/lootdrop/armory_contraband,/turf/open/floor/plasteel/bot,/area/shuttle/escape) @@ -20,20 +20,26 @@ "t" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape) "u" = (/turf/open/space,/area/space) "v" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape) +"B" = (/turf/closed/wall/shuttle{tag = "icon-wall3 (WEST)";icon_state = "wall3";dir = 8},/area/shuttle/escape) +"A" = (/turf/closed/wall/shuttle{icon_state = "swall1";dir = 2},/area/shuttle/escape) +"z" = (/turf/closed/wall/shuttle{icon_state = "swall2";dir = 2},/area/shuttle/escape) +"y" = (/turf/closed/wall/shuttle{icon_state = "swall3"},/area/shuttle/escape) +"x" = (/turf/closed/wall/shuttle{icon_state = "swall_s10";dir = 2},/area/shuttle/escape) +"w" = (/turf/closed/wall/shuttle{icon_state = "swall_s6";dir = 2},/area/shuttle/escape) (1,1,1) = {" -abbba -cdefa +wbbbx +cdefy aghij -kllma -anloa +kllmy +znloy bnlob bnlob bnlpb -anlpa -qllra -aslra -qllma -attta +Anlpy +qllry +aslry +qllmA +BtttB uvvvu "} diff --git a/_maps/shuttles/emergency_goon.dmm b/_maps/shuttles/emergency_goon.dmm index 3d8ebf08142..cc4bf12d0fc 100644 --- a/_maps/shuttles/emergency_goon.dmm +++ b/_maps/shuttles/emergency_goon.dmm @@ -1,45 +1,45 @@ "a" = (/turf/open/space,/area/space) -"b" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/open/floor/plating,/area/shuttle/escape) -"c" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/turf/open/floor/plating,/area/shuttle/escape) -"d" = (/turf/closed/wall/shuttle{tag = "icon-swall0"; icon_state = "swall0"},/area/shuttle/escape) -"e" = (/turf/closed/wall/shuttle{tag = "icon-wall_space (NORTH)"; icon_state = "wall_space"; dir = 1},/area/shuttle/escape) -"f" = (/turf/closed/wall/shuttle{tag = "icon-swall2"; icon_state = "swall2"},/area/shuttle/escape) +"b" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion";dir = 4},/turf/open/floor/plating,/area/shuttle/escape) +"c" = (/obj/structure/shuttle/engine/heater{icon_state = "heater";dir = 8},/turf/open/floor/plating,/area/shuttle/escape) +"d" = (/turf/closed/wall/shuttle{tag = "icon-swall0";icon_state = "swall0"},/area/shuttle/escape) +"e" = (/turf/closed/wall/shuttle{tag = "icon-wall_space (NORTH)";icon_state = "wall_space";dir = 1},/area/shuttle/escape) +"f" = (/turf/closed/wall/shuttle{tag = "icon-swall2";icon_state = "swall2"},/area/shuttle/escape) "g" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"h" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{dheight = 0; dir = 2; dwidth = 9; name = "NES Port"; width = 19},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"i" = (/turf/closed/wall/shuttle{tag = "icon-wall_space (WEST)"; icon_state = "wall_space"; dir = 8},/area/shuttle/escape) -"j" = (/turf/closed/wall/shuttle{tag = "icon-swall4"; icon_state = "swall4"},/area/shuttle/escape) -"k" = (/turf/closed/wall/shuttle{tag = "icon-swall12"; icon_state = "swall12"},/area/shuttle/escape) -"l" = (/obj/machinery/vending/wallmed,/turf/closed/wall/shuttle{tag = "icon-swall8"; icon_state = "swall8"},/area/shuttle/escape) +"h" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{dheight = 0;dir = 2;dwidth = 9;name = "NES Port";width = 19;timid = 1},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"i" = (/turf/closed/wall/shuttle{tag = "icon-wall_space (WEST)";icon_state = "wall_space";dir = 8},/area/shuttle/escape) +"j" = (/turf/closed/wall/shuttle{tag = "icon-swall4";icon_state = "swall4"},/area/shuttle/escape) +"k" = (/turf/closed/wall/shuttle{tag = "icon-swall12";icon_state = "swall12"},/area/shuttle/escape) +"l" = (/obj/machinery/vending/wallmed,/turf/closed/wall/shuttle{tag = "icon-swall8";icon_state = "swall8"},/area/shuttle/escape) "m" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"n" = (/turf/closed/wall/shuttle{tag = "icon-swall1"; icon_state = "swall1"},/area/shuttle/escape) +"n" = (/turf/closed/wall/shuttle{tag = "icon-swall1";icon_state = "swall1"},/area/shuttle/escape) "o" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"p" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/open/floor/plating,/area/shuttle/escape) -"q" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) +"p" = (/obj/structure/shuttle/engine/heater{icon_state = "heater";dir = 8},/obj/structure/window/reinforced{dir = 4;pixel_x = 0},/turf/open/floor/plating,/area/shuttle/escape) +"q" = (/obj/machinery/sleeper{icon_state = "sleeper-open";dir = 4},/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) "r" = (/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) "s" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"t" = (/turf/closed/wall/shuttle{tag = "icon-wall_floor"; icon_state = "wall_floor"},/area/shuttle/escape) +"t" = (/turf/closed/wall/shuttle{tag = "icon-wall_floor";icon_state = "wall_floor"},/area/shuttle/escape) "u" = (/turf/open/space,/area/shuttle/escape) "v" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) "w" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Infirmary"},/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) "x" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) "y" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/emergency,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"z" = (/obj/structure/table/reinforced,/obj/item/device/radio,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"z" = (/obj/structure/table/reinforced,/obj/item/device/radio,/obj/structure/window/reinforced{dir = 1;layer = 2.9},/obj/structure/window/reinforced{dir = 4;pixel_x = 0},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) "A" = (/obj/structure/chair/comfy/brown{dir = 4},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"B" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 1},/obj/structure/table/reinforced,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"C" = (/turf/closed/wall/shuttle{tag = "icon-swall8"; icon_state = "swall8"},/area/shuttle/escape) -"D" = (/turf/closed/wall/shuttle{tag = "icon-swall3"; icon_state = "swall3"},/area/shuttle/escape) -"E" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Cockpit"; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"B" = (/obj/structure/window/reinforced{dir = 4;pixel_x = 0},/obj/structure/window/reinforced{dir = 1},/obj/structure/table/reinforced,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"C" = (/turf/closed/wall/shuttle{tag = "icon-swall8";icon_state = "swall8"},/area/shuttle/escape) +"D" = (/turf/closed/wall/shuttle{tag = "icon-swall3";icon_state = "swall3"},/area/shuttle/escape) +"E" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Cockpit";req_access_txt = "19"},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) "F" = (/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"G" = (/obj/machinery/computer/emergency_shuttle,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"G" = (/obj/machinery/computer/emergency_shuttle,/obj/structure/window/reinforced{dir = 4;pixel_x = 0},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) "H" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"I" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"I" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4;pixel_x = 0},/obj/structure/window/reinforced,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) "J" = (/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"K" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"K" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig";req_access_txt = "2"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) "L" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"M" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"N" = (/turf/closed/wall/shuttle{tag = "icon-wall_space (EAST)"; icon_state = "wall_space"; dir = 4},/area/shuttle/escape) -"O" = (/turf/closed/wall/shuttle{tag = "icon-wall_floor (WEST)"; icon_state = "wall_floor"; dir = 8},/area/shuttle/escape) -"P" = (/turf/closed/wall/shuttle{tag = "icon-wall_space"; icon_state = "wall_space"},/area/shuttle/escape) +"M" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4;pixel_x = 0},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"N" = (/turf/closed/wall/shuttle{tag = "icon-wall_space (EAST)";icon_state = "wall_space";dir = 4},/area/shuttle/escape) +"O" = (/turf/closed/wall/shuttle{tag = "icon-wall_floor (WEST)";icon_state = "wall_floor";dir = 8},/area/shuttle/escape) +"P" = (/turf/closed/wall/shuttle{tag = "icon-wall_space";icon_state = "wall_space"},/area/shuttle/escape) (1,1,1) = {" abcdeaafghfaaaaaaaa diff --git a/_maps/shuttles/emergency_imfedupwiththisworld.dmm b/_maps/shuttles/emergency_imfedupwiththisworld.dmm index 4ecb0e8fd64..c1b24953b44 100644 --- a/_maps/shuttles/emergency_imfedupwiththisworld.dmm +++ b/_maps/shuttles/emergency_imfedupwiththisworld.dmm @@ -1,6 +1,6 @@ "a" = (/turf/closed/wall/mineral/wood,/area/shuttle/escape) "b" = (/obj/machinery/light_switch,/turf/closed/wall/mineral/wood,/area/shuttle/escape) -"c" = (/obj/machinery/door/unpowered/shuttle,/obj/docking_port/mobile/emergency{dheight = 0; dir = 4; dwidth = 1; height = 10; name = "Oh Hi Mark"; width = 12},/turf/open/floor/wood,/area/shuttle/escape) +"c" = (/obj/docking_port/mobile/emergency{dheight = 0;dir = 4;dwidth = 1;height = 10;name = "Oh Hi Mark";width = 12;timid = 1},/obj/machinery/door/airlock/wood,/turf/open/floor/wood,/area/shuttle/escape) "d" = (/turf/open/floor/wood,/area/shuttle/escape) "e" = (/obj/machinery/light{dir = 1},/turf/open/floor/carpet,/area/shuttle/escape) "f" = (/obj/structure/chair/comfy/teal,/turf/open/floor/carpet,/area/shuttle/escape) @@ -8,17 +8,17 @@ "h" = (/turf/open/floor/carpet,/area/shuttle/escape) "i" = (/obj/structure/table/reinforced,/obj/item/weapon/kitchen/knife,/turf/open/floor/carpet,/area/shuttle/escape) "j" = (/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"k" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/vending/boozeomat,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"k" = (/obj/machinery/light{icon_state = "tube1";dir = 4},/obj/machinery/vending/boozeomat,/turf/open/floor/plasteel/bar,/area/shuttle/escape) "l" = (/obj/machinery/computer/security/wooden_tv,/turf/open/floor/carpet,/area/shuttle/escape) "m" = (/obj/structure/table/glass,/turf/open/floor/carpet,/area/shuttle/escape) -"n" = (/obj/structure/chair/comfy/teal{tag = "icon-comfychair (WEST)"; icon_state = "comfychair"; dir = 8},/turf/open/floor/carpet,/area/shuttle/escape) +"n" = (/obj/structure/chair/comfy/teal{tag = "icon-comfychair (WEST)";icon_state = "comfychair";dir = 8},/turf/open/floor/carpet,/area/shuttle/escape) "o" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/snacks/store/cake/birthday,/turf/open/floor/carpet,/area/shuttle/escape) "p" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/open/floor/plasteel/bar,/area/shuttle/escape) "q" = (/obj/structure/table/reinforced,/turf/open/floor/carpet,/area/shuttle/escape) "r" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass,/turf/open/floor/plasteel/bar,/area/shuttle/escape) "s" = (/obj/machinery/door/window{dir = 8},/turf/open/floor/plasteel/bar,/area/shuttle/escape) "t" = (/obj/structure/table/reinforced,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"u" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/wood,/area/shuttle/escape) +"u" = (/obj/machinery/light{icon_state = "tube1";dir = 8},/turf/open/floor/wood,/area/shuttle/escape) "v" = (/obj/structure/chair/office/dark,/turf/open/floor/wood,/area/shuttle/escape) "w" = (/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood/drip,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/mob_spawn/human/corpse,/obj/item/weapon/gun/projectile/automatic/pistol/m1911,/obj/machinery/light/small{dir = 8},/obj/item/weapon/reagent_containers/food/snacks/cakeslice/birthday,/turf/open/floor/carpet,/area/shuttle/escape) "x" = (/obj/structure/bed,/obj/item/weapon/bedsheet/red,/obj/item/weapon/paper{info = "i love daniel
daniel is my best friend

you are tearing me apart elise"},/turf/open/floor/carpet,/area/shuttle/escape) diff --git a/_maps/shuttles/emergency_meta.dmm b/_maps/shuttles/emergency_meta.dmm index 507090a6124..948f36a7b5e 100644 --- a/_maps/shuttles/emergency_meta.dmm +++ b/_maps/shuttles/emergency_meta.dmm @@ -1,132 +1,116 @@ -"aa" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "swall_f6"; dir = 2},/area/shuttle/escape) -"ab" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape) +"aa" = (/turf/open/space,/area/space) +"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6";dir = 2},/area/shuttle/escape) "ac" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape) -"ad" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"ae" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape) -"af" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo Bay Airlock"},/turf/open/floor/plating{dir = 1; icon_state = "delivery"},/area/shuttle/escape) -"ag" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "swall_f10"; dir = 2},/area/shuttle/escape) -"ah" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape) -"ai" = (/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/structure/closet/crate{name = "lifejackets"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"aj" = (/obj/structure/tank_dispenser/oxygen{layer = 2.7; pixel_x = -1; pixel_y = 2},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"ak" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"al" = (/obj/machinery/status_display{pixel_y = 32},/obj/machinery/hologram/holopad,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"am" = (/obj/structure/table,/obj/item/stack/medical/gauze,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/ointment,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"an" = (/obj/structure/sign/nosmoking_2,/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape) -"ao" = (/obj/machinery/recharge_station,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape) -"ap" = (/turf/open/floor/plating{dir = 1; icon_state = "delivery"},/area/shuttle/escape) -"aq" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/item/hand_labeler_refill,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape) -"ar" = (/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape) -"as" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape) -"at" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"au" = (/obj/item/weapon/cigbutt,/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape) -"av" = (/obj/structure/closet/crate/medical{name = "medical crate"},/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/toxin{pixel_x = -4; pixel_y = 3},/obj/item/device/healthanalyzer{pixel_x = 3; pixel_y = 3},/obj/item/weapon/lazarus_injector,/mob/living/simple_animal/bot/medbot{name = "\improper emergency medibot"; pixel_x = -3; pixel_y = 2},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape) -"aw" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"ax" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"ay" = (/obj/structure/reagent_dispensers/fueltank,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape) -"az" = (/obj/structure/closet/crate{name = "emergency supplies crate"},/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/flashlight/flare{pixel_x = 3; pixel_y = 3},/obj/item/device/flashlight/flare{pixel_x = -6; pixel_y = -2},/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/device/radio,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape) -"aA" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo Bay Airlock"},/obj/docking_port/mobile/emergency{dheight = 0; dir = 4; dwidth = 5; height = 14; width = 25},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"aB" = (/obj/machinery/vending/wallmed{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = 0; req_access_txt = "0"; use_power = 0},/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape) -"aC" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape) -"aD" = (/obj/machinery/space_heater,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape) -"aE" = (/obj/structure/chair{dir = 4},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = -31},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"aF" = (/obj/structure/rack,/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/weapon/weldingtool,/obj/item/weapon/wirecutters,/obj/item/stack/cable_coil,/turf/open/floor/plating{dir = 1; icon_state = "warning"},/area/shuttle/escape) -"aG" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -3; pixel_y = 1},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = -1},/obj/item/weapon/storage/toolbox/emergency{pixel_x = 3; pixel_y = -5},/turf/open/floor/plating{dir = 1; icon_state = "warning"},/area/shuttle/escape) -"aH" = (/turf/open/floor/plating{dir = 1; icon_state = "warning"},/area/shuttle/escape) -"aI" = (/obj/structure/rack{dir = 1},/obj/item/weapon/tank/internals/oxygen/red,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/mask/gas,/obj/item/clothing/head/hardhat/red,/turf/open/floor/plating{dir = 1; icon_state = "warning"},/area/shuttle/escape) -"aJ" = (/obj/structure/extinguisher_cabinet,/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape) -"aK" = (/obj/structure/chair{dir = 8},/obj/structure/sign/bluecross_2{pixel_x = 32},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"aL" = (/turf/closed/wall/shuttle{icon_state = "swall7"; dir = 2},/area/shuttle/escape) -"aM" = (/turf/closed/wall/shuttle{icon_state = "swall8"; dir = 2},/area/shuttle/escape) -"aN" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"aO" = (/obj/structure/sign/bluecross_2,/turf/closed/wall/shuttle{icon_state = "swall4"; dir = 2},/area/shuttle/escape) -"aP" = (/turf/closed/wall/shuttle{icon_state = "swall11"; dir = 2},/area/shuttle/escape) -"aQ" = (/obj/machinery/sleeper{dir = 2},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"aR" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"aS" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"aT" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; name = "emergency shower"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"aU" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"aV" = (/obj/structure/table,/obj/item/weapon/defibrillator/loaded,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"aW" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 6; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -3},/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = -3; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = 6; pixel_y = 8},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 4; pixel_y = 1},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = -2; pixel_y = 5},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 2; pixel_y = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"aX" = (/obj/structure/table/optable,/obj/item/weapon/surgical_drapes,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"aY" = (/obj/structure/table,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/circular_saw,/obj/item/weapon/retractor{pixel_x = 4},/obj/item/weapon/hemostat{pixel_x = -4},/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -27},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"aZ" = (/obj/structure/chair{dir = 8},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"ba" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape) -"bb" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"bc" = (/obj/structure/chair,/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 29},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"bd" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"be" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs{pixel_x = 2; pixel_y = 2},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"bf" = (/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"bg" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0; idle_power_usage = 0; use_power = 0},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"bh" = (/obj/machinery/door/airlock/glass_security{name = "Brig"; req_access_txt = "2"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"bi" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs{pixel_y = 3},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"bj" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"bk" = (/obj/machinery/flasher{id = "emshuttlebridgeflash"; pixel_y = -24},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bl" = (/obj/structure/chair{dir = 1},/obj/machinery/button/flasher{id = "emshuttleflash"; name = "brig flasher button"; pixel_y = -23; req_access_txt = "0"; req_one_access_txt = "1;63;19"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"bm" = (/obj/structure/chair{dir = 1},/obj/machinery/flasher{id = "emshuttleflash"; pixel_y = -24},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"bn" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"bo" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/weapon/folder/white{pixel_x = -4; pixel_y = 2},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/obj/item/weapon/book/manual/wiki/security_space_law{pixel_x = -4; pixel_y = 4},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"bp" = (/obj/machinery/door/airlock/glass_command{name = "Cockpit"; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bq" = (/turf/closed/wall/shuttle{icon_state = "swall15"; dir = 2},/area/shuttle/escape) -"br" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bs" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs{pixel_y = 3},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bt" = (/obj/machinery/button/flasher{id = "emshuttlebridgeflash"; name = "cockpit flasher button"; pixel_y = 24; req_access_txt = "0"; req_one_access_txt = "1;63;19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bu" = (/obj/machinery/door/airlock/command{name = "Emergency Recovery Airlock"; req_access = null; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bv" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape) -"bw" = (/obj/machinery/suit_storage_unit/standard_unit,/obj/machinery/status_display{pixel_y = 31},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape) -"bx" = (/obj/machinery/suit_storage_unit/standard_unit,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 27},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape) -"by" = (/obj/machinery/computer/security,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bz" = (/obj/structure/chair/office/dark{dir = 8},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bA" = (/obj/structure/chair/office/dark{dir = 4},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bB" = (/obj/structure/table,/obj/item/weapon/folder/blue,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bC" = (/obj/machinery/door/airlock/external{name = "Emergency Recovery Airlock"},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape) -"bD" = (/turf/closed/wall/shuttle{icon_state = "swallc4"; dir = 2},/area/shuttle/escape) -"bE" = (/obj/machinery/computer/crew,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bF" = (/obj/structure/chair/office/dark,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bG" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 8},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bH" = (/obj/structure/table,/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/obj/item/weapon/cigbutt/cigarbutt{pixel_x = 5; pixel_y = -1},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bI" = (/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bJ" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bK" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bL" = (/obj/machinery/computer/station_alert,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bM" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/emergency{pixel_y = 3},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bN" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0; idle_power_usage = 0; pixel_y = 4; use_power = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"bO" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/structure/chair{dir = 1},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape) -"bP" = (/obj/structure/chair{dir = 1},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape) -"bQ" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape) -"bR" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "diagonalWall3"},/turf/closed/wall/shuttle{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape) -"bS" = (/turf/closed/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/escape) -"bT" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape) -"bU" = (/turf/open/space,/area/space) -"bV" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "diagonalWall3"},/area/shuttle/escape) -"bW" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape) -"bX" = (/turf/closed/wall/shuttle{icon_state = "wall3"},/area/shuttle/escape) -"bY" = (/turf/open/space,/turf/closed/wall/shuttle{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/escape) -"bZ" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape) +"ad" = (/turf/closed/wall/shuttle{icon_state = "swall14";dir = 2},/area/shuttle/escape) +"ae" = (/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape) +"af" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"ag" = (/obj/structure/sign/nosmoking_2,/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape) +"ah" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{dir = 2;dwidth = 5;height = 14;name = "MetaStation emergency shuttle";width = 25;timid = 1},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"ai" = (/turf/closed/wall/shuttle{icon_state = "swall_s10";dir = 2},/area/shuttle/escape) +"aj" = (/turf/closed/wall/shuttle{tag = "icon-wall3 (NORTHWEST)";icon_state = "wall3";dir = 9},/area/shuttle/escape) +"ak" = (/turf/closed/wall/shuttle{icon_state = "swall3";dir = 2},/area/shuttle/escape) +"al" = (/obj/structure/table,/obj/item/weapon/phone{pixel_x = -3;pixel_y = 3},/obj/item/weapon/cigbutt/cigarbutt{pixel_x = 5;pixel_y = -1},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"am" = (/obj/machinery/computer/crew,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"an" = (/obj/machinery/computer/security,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"ao" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"ap" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"aq" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"ar" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) +"as" = (/obj/item/device/radio/intercom{dir = 4;name = "Station Intercom (General)";pixel_x = 0;pixel_y = 27},/obj/structure/chair,/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) +"at" = (/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";name = "emergency lifejacket"},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/clothing/mask/breath{pixel_x = -3;pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3;pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3;pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3;pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3;pixel_y = -3},/obj/item/clothing/head/hardhat/orange{name = "protective hat";pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat";pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat";pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat";pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat";pixel_y = 9},/obj/structure/closet/crate{name = "lifejackets"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"au" = (/obj/structure/shuttle/engine/propulsion{dir = 4},/turf/open/floor/plating/airless,/area/shuttle/escape) +"av" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plating/airless,/area/shuttle/escape) +"aw" = (/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"ax" = (/obj/structure/chair/office/dark{dir = 1},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"ay" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs{pixel_y = 3},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"az" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall3";dir = 2},/area/shuttle/escape) +"aA" = (/obj/structure/tank_dispenser/oxygen{layer = 2.7;pixel_x = -1;pixel_y = 2},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"aB" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aC" = (/obj/structure/chair/office/dark,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aD" = (/turf/closed/wall/shuttle{icon_state = "swall1"},/area/shuttle/escape) +"aE" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) +"aF" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aG" = (/obj/structure/chair/office/dark{dir = 8},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aH" = (/obj/machinery/door/airlock/glass_command{name = "Cockpit";req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aI" = (/obj/machinery/vending/wallmed{name = "Emergency NanoMed";pixel_x = 0;pixel_y = 0;req_access_txt = "0";use_power = 0},/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape) +"aJ" = (/obj/structure/extinguisher_cabinet,/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape) +"aK" = (/turf/closed/wall/shuttle{icon_state = "wall3"},/area/shuttle/escape) +"aL" = (/obj/machinery/computer/station_alert,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aM" = (/turf/closed/wall/shuttle{icon_state = "swall2"},/area/shuttle/escape) +"aN" = (/obj/machinery/status_display{dir = 8;pixel_x = 32;pixel_y = 0},/obj/machinery/hologram/holopad,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aO" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/emergency{pixel_y = 3},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aP" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0;idle_power_usage = 0;pixel_y = 4;use_power = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aQ" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2;pixel_y = 8},/obj/item/device/radio/intercom{dir = 2;name = "Station Intercom (General)";pixel_x = 0;pixel_y = -31},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aR" = (/obj/structure/table,/obj/item/weapon/folder/blue,/obj/structure/extinguisher_cabinet{dir = 4;pixel_x = 0;pixel_y = -27},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aS" = (/obj/item/device/radio/intercom{dir = 2;name = "Station Intercom (General)";pixel_x = 0;pixel_y = -31},/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) +"aT" = (/obj/structure/table,/obj/item/stack/medical/gauze,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/ointment,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"aU" = (/turf/closed/wall/shuttle{icon_state = "swall7";dir = 2},/area/shuttle/escape) +"aV" = (/turf/closed/wall/shuttle{icon_state = "swall8";dir = 2},/area/shuttle/escape) +"aW" = (/obj/machinery/door/airlock/command{name = "Emergency Recovery Airlock";req_access = null;req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aX" = (/turf/closed/wall/shuttle{icon_state = "swall15";dir = 2},/area/shuttle/escape) +"aY" = (/obj/machinery/door/airlock/glass_security{name = "Brig";req_access_txt = "2"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"aZ" = (/obj/machinery/door/airlock/glass_medical{id_tag = null;name = "Escape Shuttle Infirmary";req_access_txt = "0"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"ba" = (/obj/structure/sign/bluecross_2,/turf/closed/wall/shuttle{icon_state = "swall14";dir = 2},/area/shuttle/escape) +"bb" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo Bay Airlock"},/turf/open/floor/plasteel/delivery,/area/shuttle/escape) +"bc" = (/turf/closed/wall/shuttle{icon_state = "swall11";dir = 2},/area/shuttle/escape) +"bd" = (/obj/structure/chair{dir = 4},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape) +"be" = (/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape) +"bf" = (/obj/machinery/door/airlock/external{name = "Emergency Recovery Airlock"},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape) +"bg" = (/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"bh" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"bi" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"bj" = (/obj/structure/table,/obj/item/weapon/defibrillator/loaded,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"bk" = (/obj/machinery/shower,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"bl" = (/obj/machinery/sleeper{dir = 8},/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) +"bm" = (/obj/structure/rack,/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/weapon/weldingtool,/obj/item/weapon/wirecutters,/obj/item/stack/cable_coil,/turf/open/floor/plasteel/warning{dir = 4},/area/shuttle/escape) +"bn" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plasteel/delivery,/area/shuttle/escape) +"bo" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plasteel/delivery,/area/shuttle/escape) +"bp" = (/turf/open/floor/plasteel/delivery,/area/shuttle/escape) +"bq" = (/obj/machinery/recharge_station,/turf/open/floor/plasteel/delivery,/area/shuttle/escape) +"br" = (/turf/closed/wall/shuttle{icon_state = "swall4";dir = 2},/area/shuttle/escape) +"bs" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"bt" = (/obj/structure/reagent_dispensers/peppertank,/turf/closed/wall/shuttle{icon_state = "swall3";dir = 2},/area/shuttle/escape) +"bu" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 6;pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -3},/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = -3;pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = 6;pixel_y = 8},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 3;pixel_y = -2},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 4;pixel_y = 1},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = -2;pixel_y = 5},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 2;pixel_y = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"bv" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -3;pixel_y = 1},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0;pixel_y = -1},/obj/item/weapon/storage/toolbox/emergency{pixel_x = 3;pixel_y = -5},/turf/open/floor/plasteel/warning{dir = 4},/area/shuttle/escape) +"bw" = (/obj/item/weapon/cigbutt,/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape) +"bx" = (/turf/open/floor/plasteel/floorgrime,/area/shuttle/escape) +"by" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape) +"bz" = (/obj/structure/table/optable,/obj/item/weapon/surgical_drapes,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"bA" = (/turf/open/floor/plasteel/warning{dir = 4},/area/shuttle/escape) +"bB" = (/turf/closed/wall/shuttle{icon_state = "diagonalWall3"},/area/shuttle/escape) +"bC" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape) +"bD" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/weapon/folder/white{pixel_x = -4;pixel_y = 2},/obj/item/device/radio/intercom{dir = 2;name = "Station Intercom (General)";pixel_x = 0;pixel_y = -31},/obj/item/weapon/book/manual/wiki/security_space_law{pixel_x = -4;pixel_y = 4},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"bE" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs{pixel_y = 3},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"bF" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0;idle_power_usage = 0;use_power = 0},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"bG" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs{pixel_x = 2;pixel_y = 2},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"bH" = (/obj/structure/table,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/circular_saw,/obj/item/weapon/retractor{pixel_x = 4},/obj/item/weapon/hemostat{pixel_x = -4},/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/item/device/radio/intercom{dir = 2;name = "Station Intercom (General)";pixel_x = -27;pixel_y = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"bI" = (/obj/structure/sink,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"bJ" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2;pixel_y = 3},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"bK" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3;pixel_y = 3},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"bL" = (/obj/structure/sign/bluecross_2,/turf/closed/wall/shuttle{icon_state = "swall2"},/area/shuttle/escape) +"bM" = (/obj/structure/rack{dir = 1},/obj/item/weapon/tank/internals/oxygen/red,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/mask/gas,/obj/item/clothing/head/hardhat/red,/turf/open/floor/plasteel/warning{dir = 4},/area/shuttle/escape) +"bN" = (/obj/machinery/space_heater,/obj/structure/extinguisher_cabinet{dir = 4;pixel_x = 0;pixel_y = -27},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape) +"bO" = (/obj/structure/closet/crate{name = "emergency supplies crate"},/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/flashlight/flare{pixel_x = 3;pixel_y = 3},/obj/item/device/flashlight/flare{pixel_x = -6;pixel_y = -2},/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/device/radio,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape) +"bP" = (/obj/structure/closet/crate/medical{name = "medical crate"},/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3;pixel_y = 3},/obj/item/weapon/storage/firstaid/toxin{pixel_x = -4;pixel_y = 3},/obj/item/device/healthanalyzer{pixel_x = 3;pixel_y = 3},/obj/item/weapon/lazarus_injector,/mob/living/simple_animal/bot/medbot{name = "\improper emergency medibot";pixel_x = -3;pixel_y = 2},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape) +"bQ" = (/obj/item/device/radio/intercom{dir = 2;name = "Station Intercom (General)";pixel_x = 0;pixel_y = -31},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape) +"bR" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/item/hand_labeler_refill,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape) +"bS" = (/turf/closed/wall/shuttle{icon_state = "swall_s5";dir = 2},/area/shuttle/escape) +"bT" = (/turf/closed/wall/shuttle{icon_state = "swall13";dir = 2},/area/shuttle/escape) +"bU" = (/turf/closed/wall/shuttle{icon_state = "swall_s9";dir = 2},/area/shuttle/escape) (1,1,1) = {" -aaabacabadabadabaeabafafabag -ahaiajaiakalakamanaoapapaqah -ahakakakakakakakafapararasah -atakakakakakakakafaparauavac -acawakaxacawakaxahayararazac -aAakakaxaBawakaxacaCauaraDah -ahaEakaxacawakaxahaFaGaHaIah -acawakaxaJawakaKaLaMacaNaOaP -acawakaxacawakaxacaQaQakaRah -acawakakakakakakaNakakakaSac -anawakaxacawakaxacaTakakaUac -adakakaxaJawakaxahaVaWaXaYah -acawakaxacawakaZaLababbaabaP -atakakaxaBawakaxahbbbcbdbeah -ahawakaxacawakaxacbbbfbfbgac -acakakakakakakakbhbfbfbfbiac -ahbjakakakbkakbjahblbmbnboah -aLabbaabbpabbaabbqabaeababaP -acbrbsakakbtakakbubvahbwbxac -acbybzakakakbAbBaLbCbDararbC -acbEakbAbFbzakbGahararararbC -acbHbIbJbKbLbMbNahbObPbPbQac -bRabababababababbSababababbT -bUbVbWbWbWbXbWbWbXbWbWbWbYbU -bUbUbZbZbZbXbZbZbXbZbZbZbUbU +aaaaabacacacacadaeacaeafacafagacacacaeahacafaeaeai +aaajakalamanaoakapaqaraqaraqararararasaqaraqaqatak +auavakawaqaxayazaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaAac +auavakaBaCaqaqaDaqaqaEaEaEaEaEaqaEaEaEaEaEaqaqatak +auavakaFaGaqaqaHaqaqacaIacaJacaqacaJacaIacaqaqaqac +aKaKakaLaxaqaqaMaqaqarararararaqarararararaqaqaNak +auavakaOaqaCaqazaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqac +auavakaPaQaRaqakapaqaEaEaSaEaEaqaEaEaEaEaEaqaqaTak +aKaKaUaJaeaVaWaXaVaYacaeadaeacaZacbaaeacaJbbbbagbc +auavakbdbebfbgakbhbgbibiakbjbkaqblakbmbnbobpbpbqak +auavakbdbebraebcbhbgbgbsbtbuaqaqblacbvbwbxbxbxbpac +auavakbdbebebyazbhbgbgbsazbzaqaqaqaZbAbxbxbwbxbpac +aabBakbCbebebyakbDbEbFbGakbHbIbJbKbLbMbNbObPbQbRak +aaaabSacbfbfacbTaeacacaebTaeacacaebTaeaeacacaeaebU "} diff --git a/_maps/shuttles/emergency_narnar.dmm b/_maps/shuttles/emergency_narnar.dmm index d4cf6ff501d..8f1957d974e 100644 --- a/_maps/shuttles/emergency_narnar.dmm +++ b/_maps/shuttles/emergency_narnar.dmm @@ -1,24 +1,24 @@ "a" = (/turf/open/space,/area/space) -"b" = (/turf/closed/wall/cult,/area/shuttle/escape) +"b" = (/turf/closed/wall/mineral/cult,/area/shuttle/escape) "c" = (/obj/effect/forcefield/cult,/turf/open/floor/plating,/area/shuttle/escape) "d" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "e" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/cult,/area/shuttle/escape) "f" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plasteel/cult,/area/shuttle/escape) -"g" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/cult,/area/shuttle/escape) +"g" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2;pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "h" = (/obj/machinery/computer/atmos_alert,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "i" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/cult,/area/shuttle/escape) "j" = (/turf/open/floor/plasteel/cult,/area/shuttle/escape) "k" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/cult,/area/shuttle/escape) "l" = (/obj/machinery/computer/security,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "m" = (/obj/machinery/computer/crew,/turf/open/floor/plasteel/cult,/area/shuttle/escape) -"n" = (/obj/structure/chair{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/plasteel/cult,/area/shuttle/escape) -"o" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/turf/open/floor/plasteel/cult,/area/shuttle/escape) +"n" = (/obj/structure/chair{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 0;pixel_y = -30},/turf/open/floor/plasteel/cult,/area/shuttle/escape) +"o" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)";pixel_x = 0;pixel_y = -29},/turf/open/floor/plasteel/cult,/area/shuttle/escape) "p" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "q" = (/obj/item/stack/sheet/metal,/obj/effect/decal/remains/human,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "r" = (/obj/machinery/door/airlock/cult/unruned/glass/friendly,/turf/open/floor/plasteel/cult,/area/shuttle/escape) -"s" = (/obj/machinery/status_display,/turf/closed/wall/cult,/area/shuttle/escape) +"s" = (/obj/machinery/status_display,/turf/closed/wall/mineral/cult,/area/shuttle/escape) "t" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/cult,/area/shuttle/escape) -"u" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/cult,/area/shuttle/escape) +"u" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2;pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "v" = (/obj/effect/decal/cleanable/blood,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "w" = (/mob/living/simple_animal/hostile/construct/builder,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "x" = (/obj/machinery/door/airlock/cult/friendly,/turf/open/floor/plating,/area/shuttle/escape) @@ -28,19 +28,19 @@ "B" = (/obj/effect/rune/true_sight,/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/gibs/body,/obj/effect/decal/cleanable/blood/gibs/core,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "C" = (/mob/living/simple_animal/hostile/construct/armored,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "D" = (/obj/effect/rune/true_sight,/obj/effect/decal/remains/human,/turf/open/floor/plasteel/cult,/area/shuttle/escape) -"E" = (/obj/machinery/door/airlock/cult/friendly,/obj/docking_port/mobile/emergency{name = "shuttle 667"},/turf/open/floor/plating,/area/shuttle/escape) +"E" = (/obj/machinery/door/airlock/cult/friendly,/obj/docking_port/mobile/emergency{name = "shuttle 667";timid = 1},/turf/open/floor/plating,/area/shuttle/escape) "F" = (/obj/effect/decal/cleanable/blood/gibs/down,/turf/open/floor/plasteel/cult,/area/shuttle/escape) -"G" = (/obj/structure/extinguisher_cabinet{has_extinguisher = null; icon_state = "extinguisher_empty"; opened = 1; pixel_x = 27; pixel_y = 0},/obj/item/weapon/extinguisher{safety = 0},/turf/open/floor/plasteel/cult,/area/shuttle/escape) +"G" = (/obj/structure/extinguisher_cabinet{has_extinguisher = null;icon_state = "extinguisher_empty";opened = 1;pixel_x = 27;pixel_y = 0},/obj/item/weapon/extinguisher{safety = 0},/turf/open/floor/plasteel/cult,/area/shuttle/escape) "H" = (/mob/living/simple_animal/hostile/construct/wraith,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "I" = (/obj/effect/rune/narsie,/turf/open/floor/plasteel/cult,/area/shuttle/escape) -"J" = (/mob/living/simple_animal/hostile/carp/eyeball{faction = list("cult"); name = "left eyeball"},/turf/open/floor/plasteel/cult,/area/shuttle/escape) -"K" = (/mob/living/simple_animal/hostile/carp/eyeball{faction = list("cult"); name = "right eyeball"},/turf/open/floor/plasteel/cult,/area/shuttle/escape) +"J" = (/mob/living/simple_animal/hostile/carp/eyeball{faction = list("cult");name = "left eyeball"},/turf/open/floor/plasteel/cult,/area/shuttle/escape) +"K" = (/mob/living/simple_animal/hostile/carp/eyeball{faction = list("cult");name = "right eyeball"},/turf/open/floor/plasteel/cult,/area/shuttle/escape) "L" = (/obj/effect/decal/cleanable/blood/drip,/turf/open/floor/plasteel/cult,/area/shuttle/escape) -"M" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plasteel/cult,/area/shuttle/escape) +"M" = (/obj/structure/extinguisher_cabinet{pixel_x = 27;pixel_y = 0},/turf/open/floor/plasteel/cult,/area/shuttle/escape) "N" = (/obj/machinery/door/airlock/cult/glass/friendly,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "O" = (/obj/structure/dresser,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "P" = (/obj/structure/showcase/horrific_experiment,/turf/open/floor/plasteel/cult,/area/shuttle/escape) -"Q" = (/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/item/stack/sheet/metal,/turf/open/floor/plasteel/cult,/area/shuttle/escape) +"Q" = (/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2;pixel_y = 3},/obj/item/weapon/crowbar,/obj/structure/extinguisher_cabinet{pixel_x = 27;pixel_y = 0},/obj/item/stack/sheet/metal,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "R" = (/obj/item/stack/sheet/metal,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "S" = (/obj/structure/table/wood,/obj/item/weapon/tome,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "T" = (/obj/structure/bed,/obj/item/weapon/bedsheet/cult,/turf/open/floor/plasteel/cult,/area/shuttle/escape) diff --git a/_maps/shuttles/emergency_supermatter.dmm b/_maps/shuttles/emergency_supermatter.dmm index 5b51ab7b5b1..0187e4514d0 100644 --- a/_maps/shuttles/emergency_supermatter.dmm +++ b/_maps/shuttles/emergency_supermatter.dmm @@ -1,69 +1,82 @@ -"a" = (/turf/open/space,/area/space) -"b" = (/turf/closed/wall/shuttle/smooth,/area/shuttle/escape) -"c" = (/obj/structure/sign/radiation,/turf/closed/wall/shuttle/smooth,/area/shuttle/escape) -"d" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape) -"e" = (/obj/structure/closet/radiation{anchored = 1},/obj/item/clothing/glasses/meson/engine,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"f" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"g" = (/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"h" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"i" = (/obj/machinery/shower{dir = 8},/turf/open/floor/noslip,/area/shuttle/escape) -"j" = (/obj/structure/reflector/single{anchored = 1},/turf/open/floor/plating{icon_state = "warnplate"; dir = 8},/area/shuttle/escape) -"k" = (/obj/structure/reflector/box{anchored = 1},/turf/open/floor/plating,/area/shuttle/escape) -"l" = (/obj/structure/reflector/single{tag = "icon-reflector (WEST)"; icon_state = "reflector"; dir = 8; anchored = 1},/turf/open/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/escape) -"m" = (/obj/machinery/shower{dir = 4},/turf/open/floor/noslip,/area/shuttle/escape) -"n" = (/obj/machinery/status_display,/turf/closed/wall/shuttle/smooth,/area/shuttle/escape) -"o" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"p" = (/turf/open/floor/plating{icon_state = "warnplate"; dir = 8},/area/shuttle/escape) -"q" = (/turf/open/floor/plating,/area/shuttle/escape) -"r" = (/turf/open/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/escape) -"s" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"t" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/escape) -"u" = (/obj/machinery/power/supermatter_shard/hugbox{anchored = 1; base_icon_state = "darkmatter"; explosion_power = 20; gasefficency = 0.15; icon_state = "darkmatter"; name = "anchored supermatter crystal"},/turf/open/floor/plating,/area/shuttle/escape) -"v" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/crowbar/red,/obj/item/weapon/storage/box/snappops{pixel_x = 4; pixel_y = -4},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"w" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"x" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{name = "Hyperfractal Gigashuttle"},/turf/open/floor/plating,/area/shuttle/escape) -"y" = (/obj/machinery/door/airlock/external{name = "Emergency Launch Catwalk"; req_access = null; req_access_txt = "10;13"},/turf/open/floor/plating,/area/shuttle/escape) -"z" = (/turf/open/floor/plating/airless,/area/shuttle/escape) -"A" = (/obj/structure/reflector/single{anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape) -"B" = (/obj/structure/reflector/double{anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape) -"C" = (/obj/structure/reflector/double{tag = "icon-reflector_double (NORTH)"; icon_state = "reflector_double"; dir = 1; anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape) -"D" = (/obj/structure/reflector/single{tag = "icon-reflector (WEST)"; icon_state = "reflector"; dir = 8; anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape) -"E" = (/turf/open/floor/plating/airless{dir = 9; icon_state = "warnplate"},/area/shuttle/escape) -"F" = (/turf/open/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/shuttle/escape) -"G" = (/turf/open/floor/plating/airless{dir = 5; icon_state = "warnplate"},/area/shuttle/escape) -"H" = (/turf/open/floor/plating/airless{dir = 8; icon_state = "warnplate"},/area/shuttle/escape) -"I" = (/obj/machinery/power/supermatter_shard/hugbox{anchored = 1; name = "anchored supermatter shard"},/turf/open/floor/plating/airless,/area/shuttle/escape) -"J" = (/turf/open/floor/plating/airless{dir = 4; icon_state = "warnplate"},/area/shuttle/escape) -"K" = (/turf/open/floor/plating/airless{dir = 10; icon_state = "warnplate"},/area/shuttle/escape) -"L" = (/turf/open/floor/plating/airless{dir = 2; icon_state = "warnplate"},/area/shuttle/escape) -"M" = (/turf/open/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/shuttle/escape) -"N" = (/obj/machinery/power/emitter/energycannon{dir = 1},/turf/open/floor/plating/airless,/area/shuttle/escape) -"O" = (/obj/structure/chair,/turf/open/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/shuttle/escape) -"P" = (/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape) -"Q" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plating/airless,/area/shuttle/escape) -"R" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape) +"aa" = (/turf/open/space,/area/space) +"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape) +"ac" = (/obj/structure/sign/radiation,/turf/closed/wall/shuttle{tag = "icon-swall12"; icon_state = "swall12"},/area/shuttle/escape) +"ad" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape) +"ae" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape) +"af" = (/turf/closed/wall/shuttle{tag = "icon-swall3"; icon_state = "swall3"},/area/shuttle/escape) +"ag" = (/obj/structure/closet/radiation{anchored = 1},/obj/item/clothing/glasses/meson/engine,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"ah" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"ai" = (/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"aj" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"ak" = (/obj/structure/sign/radiation,/turf/closed/wall/shuttle{tag = "icon-swall3"; icon_state = "swall3"},/area/shuttle/escape) +"al" = (/obj/machinery/shower{dir = 8},/turf/open/floor/noslip,/area/shuttle/escape) +"am" = (/obj/structure/reflector/single{anchored = 1},/turf/open/floor/plating{icon_state = "warnplate"; dir = 8},/area/shuttle/escape) +"an" = (/obj/structure/reflector/box{anchored = 1},/turf/open/floor/plating,/area/shuttle/escape) +"ao" = (/obj/structure/reflector/single{tag = "icon-reflector (WEST)"; icon_state = "reflector"; dir = 8; anchored = 1},/turf/open/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/escape) +"ap" = (/obj/machinery/shower{dir = 4},/turf/open/floor/noslip,/area/shuttle/escape) +"aq" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{tag = "icon-swall3"; icon_state = "swall3"},/area/shuttle/escape) +"ar" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"as" = (/turf/open/floor/plating{icon_state = "warnplate"; dir = 8},/area/shuttle/escape) +"at" = (/turf/open/floor/plating,/area/shuttle/escape) +"au" = (/turf/open/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/escape) +"av" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"aw" = (/turf/closed/wall/shuttle{icon_state = "swallc2"; dir = 2},/area/shuttle/escape) +"ax" = (/turf/closed/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape) +"ay" = (/turf/closed/wall/shuttle{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape) +"az" = (/turf/closed/wall/shuttle{icon_state = "swallc1"},/area/shuttle/escape) +"aA" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/escape) +"aB" = (/obj/machinery/power/supermatter_shard/hugbox{anchored = 1; base_icon_state = "darkmatter"; explosion_power = 20; gasefficency = 0.15; icon_state = "darkmatter"; name = "anchored supermatter crystal"},/turf/open/floor/plating,/area/shuttle/escape) +"aC" = (/obj/structure/sign/radiation,/turf/closed/wall/shuttle/smooth,/area/shuttle/escape) +"aD" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/crowbar/red,/obj/item/weapon/storage/box/snappops{pixel_x = 4; pixel_y = -4},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"aE" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"aF" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{name = "Hyperfractal Gigashuttle"; timid = 1},/turf/open/floor/plating,/area/shuttle/escape) +"aG" = (/turf/closed/wall/shuttle{icon_state = "swallc3"},/area/shuttle/escape) +"aH" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall12"},/area/shuttle/escape) +"aI" = (/obj/structure/sign/radiation,/turf/closed/wall/shuttle{icon_state = "swallc1"},/area/shuttle/escape) +"aJ" = (/obj/structure/sign/radiation,/turf/closed/wall/shuttle{icon_state = "swallc2"; dir = 2},/area/shuttle/escape) +"aK" = (/turf/closed/wall/shuttle{icon_state = "swallc4"; dir = 2},/area/shuttle/escape) +"aL" = (/obj/machinery/door/airlock/external{name = "Emergency Launch Catwalk"; req_access = null; req_access_txt = "10;13"},/turf/open/floor/plating,/area/shuttle/escape) +"aM" = (/turf/open/floor/plating/airless,/area/shuttle/escape) +"aN" = (/obj/structure/reflector/single{anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape) +"aO" = (/obj/structure/reflector/double{anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape) +"aP" = (/obj/structure/reflector/double{tag = "icon-reflector_double (NORTH)"; icon_state = "reflector_double"; dir = 1; anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape) +"aQ" = (/obj/structure/reflector/single{tag = "icon-reflector (WEST)"; icon_state = "reflector"; dir = 8; anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape) +"aR" = (/turf/open/floor/plating/airless{dir = 9; icon_state = "warnplate"},/area/shuttle/escape) +"aS" = (/turf/open/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/shuttle/escape) +"aT" = (/turf/open/floor/plating/airless{dir = 5; icon_state = "warnplate"},/area/shuttle/escape) +"aU" = (/turf/open/floor/plating/airless{dir = 8; icon_state = "warnplate"},/area/shuttle/escape) +"aV" = (/obj/machinery/power/supermatter_shard/hugbox{anchored = 1; name = "anchored supermatter shard"},/turf/open/floor/plating/airless,/area/shuttle/escape) +"aW" = (/turf/open/floor/plating/airless{dir = 4; icon_state = "warnplate"},/area/shuttle/escape) +"aX" = (/turf/open/floor/plating/airless{dir = 10; icon_state = "warnplate"},/area/shuttle/escape) +"aY" = (/turf/open/floor/plating/airless{dir = 2; icon_state = "warnplate"},/area/shuttle/escape) +"aZ" = (/turf/open/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/shuttle/escape) +"ba" = (/obj/machinery/power/emitter/energycannon{dir = 1},/turf/open/floor/plating/airless,/area/shuttle/escape) +"bb" = (/obj/structure/chair,/turf/open/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/shuttle/escape) +"bc" = (/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape) +"bd" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plating/airless,/area/shuttle/escape) +"be" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape) (1,1,1) = {" -abcdddddcba -abefeeefeba -adeghhhgeda -aceijklmeca -aneopqrsena -adeopqrseda -bbeopqrsebb -tggopursggt -cvgopqrsgwc -xggopqrsggt -bndcpqrcdnb -aaabdydbaaa -aaaaqzqaaaa -aAqqBzCqqDa -azaaazaaaza -aEFGazaEFGa -aHIJzzzHIJa -aKLMazaKLMa -aqqaazaaqqa -aNNzEOGzNNa -aPPaHQJaPPa -aRRaKLMaRRa +aaabacadadadadadacaeaa +aaafagahagagagahagafaa +aaadagaiajajajaiagadaa +aaakagalamanaoapagakaa +aaaqagarasatauavagaqaa +aaadagarasatauavagadaa +awaxagarasatauavagayaz +aAaiaiarasaBauavaiaiaA +aCaDaiarasatauavaiaEaC +aFaiaiarasatauavaiaiaA +aGaHadaIasatauaJadaHaK +aaaaaaaGadaLadaKaaaaaa +aaaaaaaaataMataaaaaaaa +aaaNatataOaMaPatataQaa +aaaMaaaaaaaMaaaaaaaMaa +aaaRaSaTaaaMaaaRaSaTaa +aaaUaVaWaMaMaMaUaVaWaa +aaaXaYaZaaaMaaaXaYaZaa +aaatataaaaaMaaaaatataa +aababaaMaRbbaTaMbabaaa +aabcbcaaaUbdaWaabcbcaa +aabebeaaaXaYaZaabebeaa "} diff --git a/_maps/shuttles/emergency_wabbajack.dmm b/_maps/shuttles/emergency_wabbajack.dmm new file mode 100644 index 00000000000..9cc9bbcfe6c --- /dev/null +++ b/_maps/shuttles/emergency_wabbajack.dmm @@ -0,0 +1,648 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/space, +/area/space) +"ab" = ( +/turf/closed/wall/shuttle/smooth, +/area/shuttle/escape) +"ac" = ( +/obj/structure/grille, +/obj/structure/window/shuttle/tinted, +/turf/open/floor/plating, +/area/shuttle/escape) +"ad" = ( +/turf/open/floor/plasteel/green, +/area/shuttle/escape) +"ae" = ( +/turf/open/floor/plasteel/darkgreen, +/area/shuttle/escape) +"af" = ( +/obj/machinery/power/emitter/energycannon/magical, +/turf/open/floor/plasteel/darkgreen, +/area/shuttle/escape) +"ag" = ( +/obj/structure/table/abductor/wabbajack/left, +/turf/open/floor/plasteel/darkgreen, +/area/shuttle/escape) +"ah" = ( +/obj/structure/table/abductor/wabbajack/right, +/turf/open/floor/plasteel/darkgreen, +/area/shuttle/escape) +"ai" = ( +/obj/structure/sign/biohazard, +/turf/closed/wall/shuttle/smooth, +/area/shuttle/escape) +"aj" = ( +/obj/structure/barricade/wooden, +/obj/machinery/door/airlock/shuttle, +/turf/open/floor/plasteel/cult, +/area/shuttle/escape) +"ak" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel/shuttle/red, +/area/shuttle/escape) +"al" = ( +/turf/open/floor/plasteel/shuttle/red, +/area/shuttle/escape) +"am" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/shuttle/red, +/area/shuttle/escape) +"an" = ( +/obj/structure/table/wood, +/obj/item/candle/infinite, +/turf/open/floor/plasteel/cult, +/area/shuttle/escape) +"ao" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/plasteel/cult, +/area/shuttle/escape) +"ap" = ( +/turf/open/floor/plasteel/cult, +/area/shuttle/escape) +"aq" = ( +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"ar" = ( +/obj/structure/table, +/obj/item/weapon/storage/firstaid/fire, +/obj/item/weapon/storage/firstaid/regular{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/item/weapon/crowbar, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"as" = ( +/obj/structure/grille, +/obj/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/escape) +"at" = ( +/obj/machinery/flasher{ + id = "shuttle_flasher"; + pixel_x = -24; + pixel_y = 6 + }, +/obj/machinery/button/flasher{ + id = "shuttle_flasher"; + pixel_x = -24; + pixel_y = -6 + }, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel/shuttle/red, +/area/shuttle/escape) +"au" = ( +/obj/structure/chair/wood, +/turf/open/floor/plasteel/cult, +/area/shuttle/escape) +"av" = ( +/obj/structure/chair, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"aw" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"ax" = ( +/obj/machinery/door/airlock/shuttle{ + name = "Emergency Shuttle Airlock"; + req_access_txt = "2" + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"ay" = ( +/obj/structure/table, +/obj/item/weapon/paper_bin, +/obj/item/weapon/pen{ + pixel_x = -2; + pixel_y = 4 + }, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"az" = ( +/obj/machinery/computer/emergency_shuttle, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"aA" = ( +/obj/structure/table, +/obj/item/weapon/coin/mythril, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"aB" = ( +/obj/machinery/door/airlock/glass{ + name = "Emergency Shuttle Brig"; + req_access_txt = "2" + }, +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) +"aC" = ( +/obj/machinery/door/airlock/shuttle, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"aD" = ( +/obj/machinery/door/airlock/shuttle{ + name = "Emergency Shuttle Airlock" + }, +/obj/docking_port/mobile/emergency{ + timid = 1, name = "NT Lepton Violet" + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"aE" = ( +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) +"aF" = ( +/obj/machinery/door/window/eastleft, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"aG" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 27; + pixel_y = 0 + }, +/obj/structure/table/glass, +/obj/item/weapon/storage/box/syringes{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/weapon/storage/box/beakers, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"aH" = ( +/turf/closed/wall/shuttle{ + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/escape) +"aI" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"aJ" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"aK" = ( +/obj/machinery/sleeper{ + icon_state = "sleeper-open"; + dir = 4 + }, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"aL" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"aM" = ( +/obj/machinery/chem_dispenser, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"aN" = ( +/obj/structure/table, +/obj/item/weapon/storage/toolbox/mechanical, +/obj/item/weapon/storage/firstaid/regular{ + pixel_x = -1; + pixel_y = 1 + }, +/obj/item/weapon/wrench/medical, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"aO" = ( +/turf/open/floor/plating, +/area/shuttle/escape) +"aP" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"aQ" = ( +/obj/machinery/chem_heater, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"aR" = ( +/obj/machinery/chem_master, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"aS" = ( +/obj/machinery/door/window/eastright, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"aT" = ( +/obj/structure/table/glass, +/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/weapon/reagent_containers/glass/bottle/charcoal, +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) +"aU" = ( +/obj/machinery/door/airlock/glass, +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) +"aV" = ( +/obj/machinery/door/airlock/shuttle{ + name = "Emergency Shuttle Airlock" + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"aW" = ( +/turf/open/floor/plasteel/yellow, +/turf/open/floor/plasteel/warningline{ + tag = "icon-warningline (NORTH)"; + icon_state = "warningline"; + dir = 1 + }, +/area/shuttle/escape) +"aX" = ( +/turf/open/floor/plasteel/yellow, +/turf/open/floor/plasteel/warningline{ + tag = "icon-warningline (NORTHEAST)"; + icon_state = "warningline"; + dir = 5 + }, +/area/shuttle/escape) +"aY" = ( +/turf/open/floor/plasteel/whitered, +/turf/open/floor/plasteel/warningline{ + tag = "icon-warningline (NORTHWEST)"; + icon_state = "warningline"; + dir = 9 + }, +/area/shuttle/escape) +"aZ" = ( +/turf/open/floor/plasteel/whitered, +/turf/open/floor/plasteel/warningline{ + tag = "icon-warningline (NORTH)"; + icon_state = "warningline"; + dir = 1 + }, +/area/shuttle/escape) +"ba" = ( +/obj/structure/cult/forge{ + desc = "A engine used in powering the shuttle."; + name = "magma engine" + }, +/turf/open/floor/plasteel/yellow, +/area/shuttle/escape) +"bb" = ( +/turf/open/floor/plasteel/yellow, +/turf/open/floor/plasteel/warningline{ + tag = "icon-warningline (EAST)"; + icon_state = "warningline"; + dir = 4 + }, +/area/shuttle/escape) +"bc" = ( +/turf/open/floor/plasteel/whitered, +/turf/open/floor/plasteel/warningline{ + tag = "icon-warningline (WEST)"; + icon_state = "warningline"; + dir = 8 + }, +/area/shuttle/escape) +"bd" = ( +/obj/structure/cult/forge{ + desc = "A engine used in powering the shuttle."; + name = "magma engine" + }, +/turf/open/floor/plasteel/whitered, +/area/shuttle/escape) +"be" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plating/lava/smooth/airless, +/area/shuttle/escape) +"bf" = ( +/obj/structure/shuttle/engine/heater, +/turf/open/floor/plating/lava/smooth/airless, +/area/shuttle/escape) +"bg" = ( +/obj/structure/shuttle/engine/propulsion, +/turf/open/floor/plating/airless, +/area/shuttle/escape) + +(1,1,1) = {" +aa +aa +aa +aa +ab +ab +ab +ax +ab +aD +aH +as +as +as +aH +aV +ab +aV +ab +ab +ab +aa +"} +(2,1,1) = {" +aa +ab +ab +ab +ab +ak +at +al +as +aE +aI +aI +aI +aE +ab +aE +aI +aW +ba +be +ab +ab +"} +(3,1,1) = {" +ab +ab +ag +ae +ab +al +al +al +aB +aE +aE +aE +aE +aE +ab +aE +aE +aX +bb +be +bf +bg +"} +(4,1,1) = {" +ac +ad +ae +ad +ab +am +am +am +as +aE +aJ +aJ +aJ +aE +aU +aE +aE +aE +aE +be +bf +bg +"} +(5,1,1) = {" +ac +ae +ad +ae +ab +ab +ab +ab +ab +aq +aK +aN +aK +aq +ab +aw +aw +aw +aw +be +bf +bg +"} +(6,1,1) = {" +ac +af +ad +ae +ai +an +au +ay +ab +aq +aq +aq +aq +aq +ab +ab +ab +ab +ab +be +bf +bg +"} +(7,1,1) = {" +ac +ae +ad +ae +aj +ao +au +az +ab +aF +aJ +aq +aJ +aS +as +aI +aI +aI +aI +be +bf +bg +"} +(8,1,1) = {" +ac +ad +ae +ad +ai +ap +av +aA +ab +aq +aL +aO +aL +aq +aU +aE +aE +aE +aE +be +bf +bg +"} +(9,1,1) = {" +ab +ab +ah +ae +ab +aq +aq +aq +aC +aq +aq +aP +aq +aq +as +av +aE +aY +bc +be +bf +bg +"} +(10,1,1) = {" +aa +ab +ab +ab +ab +ar +aw +aw +ab +aG +aM +aQ +aR +aT +as +av +aE +aZ +bd +be +ab +ab +"} +(11,1,1) = {" +aa +aa +aa +aa +ab +as +ab +as +ab +ab +ab +as +as +as +ab +ab +ab +as +ab +ab +ab +aa +"} diff --git a/_maps/shuttles/ferry_base.dmm b/_maps/shuttles/ferry_base.dmm index 66b39b7dd87..0e5e5f12a35 100644 --- a/_maps/shuttles/ferry_base.dmm +++ b/_maps/shuttles/ferry_base.dmm @@ -10,7 +10,7 @@ "j" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport) "k" = (/obj/machinery/door/airlock/shuttle,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport) "l" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/transport) -"m" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 12; id = "ferry"; name = "ferry shuttle"; roundstart_move = "ferry_away"; travelDir = 180; width = 5},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport) +"m" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 12; id = "ferry"; name = "ferry shuttle"; roundstart_move = "ferry_away"; travelDir = 180; width = 5; timid = 1},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport) "n" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/closed/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/transport) "o" = (/turf/open/floor/plasteel/shuttle,/turf/closed/wall/shuttle/interior{icon_state = "swall_f10"},/area/shuttle/transport) "p" = (/obj/structure/closet/crate,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport) diff --git a/_maps/shuttles/ferry_lighthouse.dmm b/_maps/shuttles/ferry_lighthouse.dmm index 9267e97bcf0..867110f7d7a 100644 --- a/_maps/shuttles/ferry_lighthouse.dmm +++ b/_maps/shuttles/ferry_lighthouse.dmm @@ -38,7 +38,7 @@ "aL" = (/turf/closed/wall/rust,/area/shuttle/transport) "aM" = (/obj/structure/table/wood,/obj/structure/window/reinforced{dir = 4},/turf/open/floor/wood,/area/shuttle/transport) "aN" = (/obj/machinery/power/grounding_rod{anchored = 1},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport) -"aO" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8;dwidth = 9;height = 27;id = "ferry";name = "ferry shuttle";roundstart_move = "ferry_away";travelDir = 180;width = 16},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport) +"aO" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8;dwidth = 8;height = 27;id = "ferry";name = "The Lighthouse";roundstart_move = "ferry_away";timid = 1;travelDir = 180;width = 16},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport) "aP" = (/obj/machinery/vending/magivend,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport) "aQ" = (/obj/structure/grille,/obj/structure/window/fulltile,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport) "aR" = (/obj/structure/chair/office/dark{dir = 4},/turf/open/floor/wood,/area/shuttle/transport) @@ -70,9 +70,9 @@ aaafamanaoapadadapaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae aaafafaqakapararapapapaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae agaaaaasakatauauavauapapapawawadadaxaxayaxaxaxazaxaxaA agagagaBakapauauaCaDaDaDaEaEaEakaFaGaHaIakaJaJaJaJaKay -aaaaaaasakaLauauaMaDaDaDaNaNaEaEaEaEaEaEaEaEaEaEaEaEaO +aaaaaaasakaLauauaCaDaDaDaNaNaEaEaEaEaEaEaEaEaEaEaEaEaO aaaaagasaPaQauaRaSaDaDaDaEaEaEakaTaUaVaWaWaWaWaWaWaWay -aaabacaXaXapauauaMaDaDaDadadadaYawadaxayaxaxaxazaxaxaZ +aaabacaXaXapauauaCaDaDaDadadadaYawadaxayaxaxaxazaxaxaZ aaaaagahbaaLaLbbbcbdadadadaeaeaeaeaeaeaeaeaeaeaeaeaeae aaaaaaahbebebfbgadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae aaaaagahbhbhadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae diff --git a/_maps/shuttles/ferry_meat.dmm b/_maps/shuttles/ferry_meat.dmm index e8bb7a536ce..eda349c9aa3 100644 --- a/_maps/shuttles/ferry_meat.dmm +++ b/_maps/shuttles/ferry_meat.dmm @@ -14,7 +14,7 @@ "n" = (/obj/effect/decal/cleanable/dirt,/obj/structure/chair,/turf/open/floor/plasteel/freezer,/area/shuttle/transport) "o" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/open/floor/plating,/area/shuttle/transport) "p" = (/obj/machinery/door/airlock/shuttle,/turf/open/floor/plasteel/freezer,/area/shuttle/transport) -"q" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8;dwidth = 2;height = 12;id = "ferry";name = "ferry shuttle";roundstart_move = "ferry_away";travelDir = 180;width = 5},/turf/open/floor/plasteel/freezer,/area/shuttle/transport) +"q" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8;dwidth = 2;height = 12;id = "ferry";name = "ferry shuttle";roundstart_move = "ferry_away";travelDir = 180;width = 5;timid = 1},/turf/open/floor/plasteel/freezer,/area/shuttle/transport) "r" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion";dir = 4},/turf/closed/wall/shuttle{icon_state = "swall_s5";dir = 2},/area/shuttle/transport) "s" = (/turf/open/floor/plasteel/freezer,/turf/closed/wall/shuttle/interior{icon_state = "swall_f10"},/area/shuttle/transport) "t" = (/obj/structure/closet/chefcloset,/turf/open/floor/plasteel/freezer,/area/shuttle/transport) diff --git a/_maps/shuttles/whiteship_box.dmm b/_maps/shuttles/whiteship_box.dmm index 44db343ee14..07756f111dd 100644 --- a/_maps/shuttles/whiteship_box.dmm +++ b/_maps/shuttles/whiteship_box.dmm @@ -1,7 +1,7 @@ "aa" = (/turf/open/space,/area/space) "ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/abandoned) "ac" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/abandoned) -"ad" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dheight = 0; dir = 2; dwidth = 11; height = 22; id = "whiteship"; launch_status = 0; name = "NT Medical Ship"; roundstart_move = "whiteship_away"; travelDir = 180; width = 35},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned) +"ad" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dheight = 0; dir = 2; dwidth = 11; height = 22; id = "whiteship"; launch_status = 0; name = "NT Medical Ship"; roundstart_move = "whiteship_away"; travelDir = 180; width = 35; timid = 1},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned) "ae" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/abandoned) "af" = (/obj/machinery/door/airlock/shuttle,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned) "ag" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 4},/turf/open/floor/plating/airless,/area/shuttle/abandoned) diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm index 834aaa68d89..0b5fb24e513 100644 --- a/_maps/shuttles/whiteship_meta.dmm +++ b/_maps/shuttles/whiteship_meta.dmm @@ -4,7 +4,7 @@ "ad" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/abandoned) "ae" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/abandoned) "af" = (/turf/closed/wall/shuttle{icon_state = "swallc1"; dir = 2},/area/shuttle/abandoned) -"ag" = (/obj/docking_port/mobile{dheight = 0; dir = 2; dwidth = 11; height = 15; id = "whiteship"; launch_status = 0; name = "NT Recovery White-Ship"; roundstart_move = "whiteship_away"; travelDir = 180; width = 27},/obj/machinery/door/airlock/shuttle{name = "recovery shuttle external airlock"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned) +"ag" = (/obj/docking_port/mobile{dheight = 0; dir = 2; dwidth = 11; height = 15; id = "whiteship"; launch_status = 0; name = "NT Recovery White-Ship"; roundstart_move = "whiteship_away"; travelDir = 180; width = 27; timid = 1},/obj/machinery/door/airlock/shuttle{name = "recovery shuttle external airlock"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned) "ah" = (/obj/machinery/door/airlock/shuttle{name = "recovery shuttle external airlock"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned) "ai" = (/turf/closed/wall/shuttle{icon_state = "swallc2"; dir = 2},/area/shuttle/abandoned) "aj" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/abandoned) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 04e5a8fbf0d..2458519c4e6 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -39,11 +39,10 @@ //Grab levels -#define GRAB_PASSIVE 1 -#define GRAB_AGGRESSIVE 2 -#define GRAB_NECK 3 -#define GRAB_UPGRADING 4 -#define GRAB_KILL 5 +#define GRAB_PASSIVE 0 +#define GRAB_AGGRESSIVE 1 +#define GRAB_NECK 2 +#define GRAB_KILL 3 //Hostile Mob AI Status diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index c0810cc0c8f..bd312dd4ec5 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -32,8 +32,6 @@ #define BLOCK_GAS_SMOKE_EFFECT 8192 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! (NOTE: flag shared with THICKMATERIAL) #define THICKMATERIAL 8192 //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with BLOCK_GAS_SMOKE_EFFECT) -#define NOREACT 16384 //Reagents dont' react inside this container. - //turf-only flags #define NOJAUNT 1 @@ -68,6 +66,7 @@ #define MUTCOLORS_PARTSONLY 15 //Used if we want the mutant colour to be only used by mutant bodyparts. Don't combine this with MUTCOLORS, or it will be useless. #define NODISMEMBER 16 #define NOHUNGER 17 +#define NOCRITDAMAGE 18 #define FLYING 65536 @@ -82,3 +81,6 @@ #define SLIME 16 #define DRONE 32 #define SWARMER 64 + +// Flags for reagents +#define REAGENT_NOREACT 1 diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 27252048b47..c3b815bd923 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -15,7 +15,7 @@ #define DIAG_MECH_HUD "11"// Mech health bar #define DIAG_BOT_HUD "12"// Bot HUDs //for antag huds. these are used at the /mob level -#define ANTAG_HUD "12" +#define ANTAG_HUD "13" //data HUD (medhud, sechud) defines //Don't forget to update human/New() if you change these! @@ -39,3 +39,4 @@ #define ANTAG_HUD_DEVIL 17 #define ANTAG_HUD_SINTOUCHED 18 #define ANTAG_HUD_SOULLESS 19 +#define ANTAG_HUD_CLOCKWORK 20 diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm new file mode 100644 index 00000000000..06c7f4151df --- /dev/null +++ b/code/__DEFINES/layers.dm @@ -0,0 +1,54 @@ +//Defines for atom layers +//KEEP THESE IN A NICE ACSCENDING ORDER, PLEASE + +//#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define +#define ABOVE_OPEN_TURF_LAYER 2.01 +#define CLOSED_TURF_LAYER 2.05 +#define ABOVE_NORMAL_TURF_LAYER 2.08 +#define LATTICE_LAYER 2.2 +#define DISPOSAL_PIPE_LAYER 2.3 +#define GAS_PIPE_LAYER 2.35 +#define WIRE_LAYER 2.4 +#define WIRE_TERMINAL_LAYER 2.45 +#define LOW_OBJ_LAYER 2.5 + +#define OPEN_DOOR_LAYER 2.7 +#define PROJECTILE_HIT_THRESHHOLD_LAYER 2.75 //projectiles won't hit objects at or below this layer if possible +#define TABLE_LAYER 2.8 +#define BELOW_OBJ_LAYER 2.9 +#define LOW_ITEM_LAYER 2.95 +//#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define +#define CLOSED_DOOR_LAYER 3.1 +#define CLOSED_FIREDOOR_LAYER 3.11 +#define ABOVE_OBJ_LAYER 3.2 +#define SIGN_LAYER 3.4 +#define HIGH_OBJ_LAYER 3.5 + +#define BELOW_MOB_LAYER 3.7 +#define LYING_MOB_LAYER 3.8 +//#define MOB_LAYER 4 //For easy recordkeeping; this is a byond define +#define ABOVE_MOB_LAYER 4.1 +#define WALL_OBJ_LAYER 4.25 +#define EDGED_TURF_LAYER 4.3 +#define ON_EDGED_TURF_LAYER 4.35 +#define LARGE_MOB_LAYER 4.4 +#define ABOVE_ALL_MOB_LAYER 4.5 + +#define SPACEVINE_LAYER 4.8 +#define SPACEVINE_MOB_LAYER 4.9 +//#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define + +#define GHOST_LAYER 6 +#define AREA_LAYER 10 +#define MASSIVE_OBJ_LAYER 11 +#define POINT_LAYER 12 +#define LIGHTING_LAYER 15 + +//HUD layer defines +#define FLASH_LAYER 17.9 +#define FULLSCREEN_LAYER 18 +#define DAMAGE_LAYER 18.1 +#define BLIND_LAYER 18.2 +#define CRIT_LAYER 18.3 +#define HUD_LAYER 19 +#define ABOVE_HUD_LAYER 19.1 diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 52873b19e8f..a9d31410015 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -151,8 +151,9 @@ #define CLICK_CD_RANGE 4 #define CLICK_CD_BREAKOUT 100 #define CLICK_CD_HANDCUFFED 10 -#define CLICK_CD_TKSTRANGLE 10 #define CLICK_CD_RESIST 20 +#define CLICK_CD_GRABBING 10 + //click cooldowns, in tenths of a second @@ -227,7 +228,7 @@ #define MIN_RANGE_FIND 16 #define FUZZY_CHANCE_HIGH 85 #define FUZZY_CHANCE_LOW 50 -#define CHANCE_TALK 15 +#define CHANCE_TALK 1 #define SNPC_BRUTE 1 #define SNPC_STEALTH 2 @@ -286,6 +287,9 @@ var/list/bloody_footprints_cache = list() #define TURF_WET_ICE 3 #define TURF_WET_PERMAFROST 4 +//Maximum amount of time, (in approx. seconds.) a tile can be wet for. +#define MAXIMUM_WET_TIME 300 + //Object/Item sharpness #define IS_BLUNT 0 #define IS_SHARP 1 @@ -394,12 +398,6 @@ var/global/list/ghost_others_options = list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define APPEARANCE_UI_IGNORE_ALPHA RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|RESET_ALPHA #define APPEARANCE_UI RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR -//Launching Shuttles to Centcomm -#define NOLAUNCH -1 -#define UNLAUNCHED 0 -#define ENDGAME_LAUNCHED 1 -#define EARLY_LAUNCHED 2 - //Just space #define SPACE_ICON_STATE "[((x + y) ^ ~(x * y) + z) % 25]" @@ -422,5 +420,15 @@ var/global/list/ghost_others_options = list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define MAP_MAXY 5 #define MAP_MAXZ 6 -// Shuttle return values -#define SHUTTLE_ALREADY_DOCKED 7 +#define CHECK_DNA_AND_SPECIES(C) if((!(C.dna)) || (!(C.dna.species))) return + +// Evil narsie colour +#define NARSIE_WINDOW_COLOUR "#7D1919" + +// Defib stats +#define DEFIB_TIME_LIMIT 120 +#define DEFIB_TIME_LOSS 60 + +// Diagonal movement +#define FIRST_DIAG_STEP 1 +#define SECOND_DIAG_STEP 2 diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 980436018c6..638e259a3c5 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -25,7 +25,7 @@ #define ROLE_HOG_GOD "hand of god: god" #define ROLE_HOG_CULTIST "hand of god: cultist" #define ROLE_DEVIL "devil" - +#define ROLE_SERVANT_OF_RATVAR "servant of Ratvar" //Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR. //The gamemode specific ones are just so the gamemodes can query whether a player is old enough @@ -49,5 +49,6 @@ var/global/list/special_roles = list( ROLE_ABDUCTOR = /datum/game_mode/abduction, ROLE_HOG_GOD = /datum/game_mode/hand_of_god, ROLE_HOG_CULTIST = /datum/game_mode/hand_of_god, - ROLE_DEVIL = /datum/game_mode/devil + ROLE_DEVIL = /datum/game_mode/devil, + ROLE_SERVANT_OF_RATVAR = /datum/game_mode/clockwork_cult, ) diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm new file mode 100644 index 00000000000..11b802d63c1 --- /dev/null +++ b/code/__DEFINES/shuttles.dm @@ -0,0 +1,23 @@ +//shuttle mode defines +#define SHUTTLE_IDLE 0 +#define SHUTTLE_RECALL 1 +#define SHUTTLE_CALL 2 +#define SHUTTLE_DOCKED 3 +#define SHUTTLE_STRANDED 4 +#define SHUTTLE_ESCAPE 5 +#define SHUTTLE_ENDGAME 6 + +// Shuttle return values +#define SHUTTLE_NOT_A_DOCKING_PORT "not_a_docking_port" +#define SHUTTLE_DWIDTH_TOO_LARGE "docking_width_too_large" +#define SHUTTLE_WIDTH_TOO_LARGE "width_too_large" +#define SHUTTLE_DHEIGHT_TOO_LARGE "docking_height_too_large" +#define SHUTTLE_HEIGHT_TOO_LARGE "height_too_large" +#define SHUTTLE_ALREADY_DOCKED "we_are_already_docked" +#define SHUTTLE_SOMEONE_ELSE_DOCKED "someone_else_docked" + +//Launching Shuttles to Centcomm +#define NOLAUNCH -1 +#define UNLAUNCHED 0 +#define ENDGAME_LAUNCHED 1 +#define EARLY_LAUNCHED 2 diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm index 7397a22d21f..f7e519336d0 100644 --- a/code/__DEFINES/stat.dm +++ b/code/__DEFINES/stat.dm @@ -24,12 +24,3 @@ #define POWEROFF 4 // tbd #define MAINT 8 // under maintaince #define EMPED 16 // temporary broken by EMP pulse - -//shuttle mode defines -#define SHUTTLE_IDLE 0 -#define SHUTTLE_RECALL 1 -#define SHUTTLE_CALL 2 -#define SHUTTLE_DOCKED 3 -#define SHUTTLE_STRANDED 4 -#define SHUTTLE_ESCAPE 5 -#define SHUTTLE_ENDGAME 6 diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm index e5d13b03080..b1b557b6451 100644 --- a/code/__HELPERS/files.dm +++ b/code/__HELPERS/files.dm @@ -49,7 +49,7 @@ It is just a timer that only permits a download every [FTPDELAY] ticks. This can be changed by modifying FTPDELAY's value above. - PLEASE USE RESPONSIBLY, Some log files canr each sizes of 4MB! */ + PLEASE USE RESPONSIBLY, Some log files can reach sizes of 4MB! */ /client/proc/file_spam_check() var/time_to_wait = fileaccess_timer - world.time if(time_to_wait > 0) @@ -57,4 +57,22 @@ return 1 fileaccess_timer = world.time + FTPDELAY return 0 -#undef FTPDELAY \ No newline at end of file +#undef FTPDELAY + +/proc/pathwalk(path) + var/list/jobs = list(path) + var/list/filenames = list() + + while(jobs.len) + var/current_dir = pop(jobs) + var/list/new_filenames = flist(current_dir) + for(var/new_filename in new_filenames) + // if filename ends in / it is a directory, append to currdir + if(findtext(new_filename, "/", -1)) + jobs += current_dir + new_filename + else + filenames += current_dir + new_filename + return filenames + +/proc/pathflatten(path) + return replacetext(path, "/", "_") diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 371ba01bb99..43c16602cfc 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -401,7 +401,7 @@ if(!G.key || !G.client) continue if(be_special_flag) - if(!(G.client.prefs.be_special & be_special_flag)) + if(!(G.client.prefs) || !(be_special_flag in G.client.prefs.be_special)) continue if (gametypeCheck) if(!gametypeCheck.age_check(G.client)) diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 172418498c3..452d2027b5e 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -53,10 +53,16 @@ //Checks for specific types in a list /proc/is_type_in_list(atom/A, list/L) + if (!L.len) + return 0 + if (!L[L[1]]) + generate_type_list_cache(L) + return L[A.type] + +/proc/generate_type_list_cache(L) for(var/type in L) - if(istype(A, type)) - return 1 - return 0 + for(var/T in typesof(type)) + L[T] = 1 //Empties the list by setting the length to 0. Hopefully the elements get garbage collected /proc/clearlist(list/list) @@ -232,13 +238,7 @@ return r // Returns the key based on the index -/proc/get_key_by_index(list/L, index) - var/i = 1 - for(var/key in L) - if(index == i) - return key - i++ - return null +#define KEYBYINDEX(L, index) (((index <= L:len) && (index > 0)) ? L[index] : null) /proc/count_by_type(list/L, type) var/i = 0 @@ -359,3 +359,6 @@ for(var/i = 1 to l.len) if(islist(.[i])) .[i] = .(.[i]) + +//Picks from the list, with some safeties, and returns the "default" arg if it fails +#define DEFAULTPICK(L, default) ((istype(L, /list) && L:len) ? pick(L) : default) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 826a61fb9ab..756a6a73834 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -77,7 +77,7 @@ CtrlClickOn(A) return - if(stat || paralysis || stunned || weakened || sleeping) + if(incapacitated(ignore_restraints = 1)) return face_atom(A) diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm index 8e3dcd2aa39..66e4e1fd3c4 100644 --- a/code/_onclick/hud/blob_overmind.dm +++ b/code/_onclick/hud/blob_overmind.dm @@ -125,7 +125,7 @@ blobpwrdisplay.icon_state = "block" blobpwrdisplay.screen_loc = ui_health blobpwrdisplay.mouse_opacity = 0 - blobpwrdisplay.layer = 20 + blobpwrdisplay.layer = ABOVE_HUD_LAYER infodisplay += blobpwrdisplay healths = new /obj/screen/healths/blob() diff --git a/code/_onclick/hud/demon.dm b/code/_onclick/hud/demon.dm index fc0d923e080..5ed4f9847b9 100644 --- a/code/_onclick/hud/demon.dm +++ b/code/_onclick/hud/demon.dm @@ -35,7 +35,7 @@ using.icon = ui_style using.icon_state = "swap_1_m" using.screen_loc = ui_swaphand1 - using.layer = 19 + using.layer = HUD_LAYER static_inventory += using using = new /obj/screen/inventory() @@ -43,7 +43,7 @@ using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand2 - using.layer = 19 + using.layer = HUD_LAYER static_inventory += using zone_select = new /obj/screen/zone_sel() diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index a0a74545db8..4831d736969 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -1,7 +1,3 @@ -#define FULLSCREEN_LAYER 18 -#define DAMAGE_LAYER FULLSCREEN_LAYER + 0.1 -#define BLIND_LAYER DAMAGE_LAYER + 0.1 -#define CRIT_LAYER BLIND_LAYER + 0.1 /mob var/list/screens = list() @@ -110,8 +106,3 @@ icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "druggy" - -#undef FULLSCREEN_LAYER -#undef BLIND_LAYER -#undef DAMAGE_LAYER -#undef CRIT_LAYER diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index e1bacf6922d..2bbc92c7cd4 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -31,11 +31,11 @@ name = "Faith" icon_state = "deity_power" screen_loc = ui_deitypower - layer = 20 + layer = HUD_LAYER /obj/screen/deity_follower_display name = "Followers" icon_state = "deity_followers" screen_loc = ui_deityfollowers - layer = 20 + layer = HUD_LAYER diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index b13623a9bfd..7c69ae2a8a9 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -197,7 +197,7 @@ A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7" else A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7" - A.layer = 20 + A.layer = ABOVE_HUD_LAYER x++ if(x == 4) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 72e5ae3c0f9..8fe5ec01029 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -9,7 +9,7 @@ /obj/screen name = "" icon = 'icons/mob/screen_gen.dmi' - layer = 20 + layer = ABOVE_HUD_LAYER unacidable = 1 appearance_flags = APPEARANCE_UI var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. @@ -29,7 +29,7 @@ maptext_width = 480 /obj/screen/swap_hand - layer = 19 + layer = HUD_LAYER name = "swap hand" /obj/screen/swap_hand/Click() @@ -60,7 +60,7 @@ var/slot_id // The indentifier for the slot. It has nothing to do with ID cards. var/icon_empty // Icon when empty. For now used only by humans. var/icon_full // Icon when contains an item. For now used only by humans. - layer = 19 + layer = HUD_LAYER /obj/screen/inventory/Click() // At this point in client Click() code we have passed the 1/10 sec check and little else @@ -154,25 +154,11 @@ name = "drop" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_drop" - layer = 19 + layer = HUD_LAYER /obj/screen/drop/Click() usr.drop_item_v() -/obj/screen/grab - name = "grab" - -/obj/screen/grab/Click() - var/obj/item/weapon/grab/G = master - G.s_click(src) - return 1 - -/obj/screen/grab/attack_hand() - return - -/obj/screen/grab/attackby() - return - /obj/screen/act_intent name = "intent" icon_state = "help" @@ -303,7 +289,7 @@ name = "resist" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_resist" - layer = 19 + layer = HUD_LAYER /obj/screen/resist/Click() if(isliving(usr)) @@ -417,7 +403,7 @@ icon_state = "blank" blend_mode = BLEND_ADD screen_loc = "WEST,SOUTH to EAST,NORTH" - layer = 17 + layer = FLASH_LAYER /obj/screen/damageoverlay icon = 'icons/mob/screen_full.dmi' @@ -426,7 +412,7 @@ blend_mode = BLEND_MULTIPLY screen_loc = "CENTER-7,CENTER-7" mouse_opacity = 0 - layer = 18.1 //The black screen overlay sets layer to 18 to display it, this one has to be just on top. + layer = DAMAGE_LAYER /obj/screen/healths name = "health" diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index a8fbcf17bb9..50438376e89 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -71,7 +71,7 @@ var/const/tk_maxrange = 15 flags = NOBLUDGEON | ABSTRACT //item_state = null w_class = 10 - layer = 20 + layer = ABOVE_HUD_LAYER var/last_throw = 0 var/atom/movable/focus = null diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 93dd4a0555a..11d34afc903 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -93,6 +93,7 @@ var/humans_need_surnames = 0 var/allow_ai = 0 // allow ai job var/forbid_secborg = 0 // disallow secborg module to be chosen. + var/forbid_peaceborg = 0 var/panic_bunker = 0 // prevents new people it hasn't seen before from connecting var/notify_new_player_age = 0 // how long do we notify admins of a new player var/irc_first_connection_alert = 0 // do we notify the irc channel when somebody is connecting for the first time? @@ -560,6 +561,8 @@ config.allow_ai = 1 if("disable_secborg") config.forbid_secborg = 1 + if("disable_peaceborg") + config.forbid_peaceborg = 1 if("silent_ai") config.silent_ai = 1 if("silent_borg") diff --git a/code/controllers/master.dm b/code/controllers/master.dm index a01c867c134..13533f67f03 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -108,6 +108,7 @@ var/global/datum/controller/master/Master = new() CHECK_TICK world << "Initializations complete!" + world.log << "Initializations complete." // Sort subsystems by display setting for easy access. sortTim(subsystems, /proc/cmp_subsystem_display) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 08561726e6b..0fdc5702433 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -17,7 +17,7 @@ var/datum/subsystem/garbage_collector/SSgarbage var/gcedlasttick = 0 // number of things that gc'ed last tick var/totaldels = 0 var/totalgcs = 0 - + var/highest_del_time = 0 var/highest_del_tickusage = 0 @@ -31,6 +31,9 @@ var/datum/subsystem/garbage_collector/SSgarbage // the types are stored as strings var/list/noqdelhint = list()// list of all types that do not return a QDEL_HINT + // all types that did not respect qdel(A, force=TRUE) and returned one + // of the immortality qdel hints + var/list/noforcerespect = list() #ifdef TESTING var/list/qdel_list = list() // list of all types that have been qdel()eted @@ -150,7 +153,7 @@ var/datum/subsystem/garbage_collector/SSgarbage // Should be treated as a replacement for the 'del' keyword. // Datums passed to this will be given a chance to clean up references to allow the GC to collect them. -/proc/qdel(datum/D) +/proc/qdel(datum/D, force=FALSE) if(!D) return #ifdef TESTING @@ -159,16 +162,25 @@ var/datum/subsystem/garbage_collector/SSgarbage if(!istype(D)) del(D) else if(isnull(D.gc_destroyed)) - var/hint = D.Destroy() // Let our friend know they're about to get fucked up. + var/hint = D.Destroy(force) // Let our friend know they're about to get fucked up. if(!D) return switch(hint) if (QDEL_HINT_QUEUE) //qdel should queue the object for deletion. SSgarbage.QueueForQueuing(D) - if (QDEL_HINT_LETMELIVE) //qdel should let the object live after calling destory. - return - if (QDEL_HINT_IWILLGC) //functionally the same as the above. qdel should assume the object will gc on its own, and not check it. - return + if (QDEL_HINT_LETMELIVE, QDEL_HINT_IWILLGC) //qdel should let the object live after calling destory. + if(!force) + return + // Returning LETMELIVE after being told to force destroy + // indicates the objects Destroy() does not respect force + if(!("[D.type]" in SSgarbage.noforcerespect)) + SSgarbage.noforcerespect += "[D.type]" + testing("WARNING: [D.type] has been force deleted, but is \ + returning an immortal QDEL_HINT, indicating it does \ + not respect the force flag for qdel(). It has been \ + placed in the queue, further instances of this type \ + will also be queued.") + SSgarbage.QueueForQueuing(D) if (QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete using a hard reference to save time from the locate() SSgarbage.HardQueue(D) if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. @@ -197,7 +209,7 @@ var/datum/subsystem/garbage_collector/SSgarbage // Default implementation of clean-up code. // This should be overridden to remove all references pointing to the object being destroyed. // Return the appropriate QDEL_HINT; in most cases this is QDEL_HINT_QUEUE. -/datum/proc/Destroy() +/datum/proc/Destroy(force=FALSE) tag = null return QDEL_HINT_QUEUE diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm index e2df3ccd9f6..5955447600f 100644 --- a/code/controllers/subsystem/shuttles.dm +++ b/code/controllers/subsystem/shuttles.dm @@ -79,9 +79,16 @@ var/datum/subsystem/shuttle/SSshuttle /datum/subsystem/shuttle/proc/requestEvac(mob/user, call_reason) if(!emergency) - WARNING("requestEvac(): There is no emergency shuttle, but the shuttle was called. Using the backup shuttle instead.") + WARNING("requestEvac(): There is no emergency shuttle, but the \ + shuttle was called. Using the backup shuttle instead.") if(!backup_shuttle) - throw EXCEPTION("requestEvac(): There is no emergency shuttle, or backup shuttle! The game will be unresolvable. This is likely due to a mapping error") + throw EXCEPTION("requestEvac(): There is no emergency shuttle, \ + or backup shuttle! The game will be unresolvable. This is \ + possibly a mapping error, more likely a bug with the shuttle \ + manipulation system, or badminry. It is possible to manually \ + resolve this problem by loading an emergency shuttle template \ + manually, and then calling register() on the mobile docking port. \ + Good luck.") return emergency = backup_shuttle @@ -211,11 +218,5 @@ var/datum/subsystem/shuttle/SSshuttle for(var/obj/docking_port/mobile/M in mobile) if(!M.roundstart_move) continue - for(var/obj/docking_port/stationary/S in stationary) - if(S.z != ZLEVEL_STATION && findtext(S.id, M.id)) - S.width = M.width - S.height = M.height - S.dwidth = M.dwidth - S.dheight = M.dheight moveShuttle(M.id, "[M.roundstart_move]", 0) CHECK_TICK diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm index e5b338728d0..ffe25551553 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -43,11 +43,11 @@ Bonus return /datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A) - var/get_damage = (sqrt(20+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth())*1) + var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth()) M.adjustOxyLoss(get_damage) return 1 /datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A) - var/get_damage = (sqrt(20+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth()*5)) + var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth()*5) M.adjustOxyLoss(get_damage) return 1 \ No newline at end of file diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 0eedaa98f70..f3054dcaeb3 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -45,10 +45,6 @@ if(affected_mob.notransform) return affected_mob.notransform = 1 - affected_mob.canmove = 0 - affected_mob.icon = null - affected_mob.overlays.Cut() - affected_mob.invisibility = INVISIBILITY_ABSTRACT for(var/obj/item/W in affected_mob) if(istype(W, /obj/item/weapon/implant)) qdel(W) diff --git a/code/game/dna.dm b/code/datums/dna.dm similarity index 100% rename from code/game/dna.dm rename to code/datums/dna.dm diff --git a/code/datums/helper_datums/map_template.dm b/code/datums/helper_datums/map_template.dm index a545622036a..a6bd818abad 100644 --- a/code/datums/helper_datums/map_template.dm +++ b/code/datums/helper_datums/map_template.dm @@ -120,5 +120,5 @@ var/datum/map_template/shuttle/S = new shuttle_type() - shuttle_templates[S.name] = S - map_templates[S.name] = S + shuttle_templates[S.shuttle_id] = S + map_templates[S.shuttle_id] = S diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 793cab7db2b..1ad6ec8e32f 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -158,4 +158,47 @@ if(istype(teleatom, /mob/living)) var/mob/living/MM = teleatom MM << "The bluespace interface on your bag of holding interferes with the teleport!" - return 1 \ No newline at end of file + return 1 + +// Safe location finder + +/proc/find_safe_turf(zlevel = ZLEVEL_STATION, list/zlevels) + if(!zlevels) + zlevels = list(zlevel) + for(var/cycle in 1 to 100) + // DRUNK DIALLING WOOOOOOOOO + var/random_location = locate(rand(37,202),rand(75,192),pick(zlevels)) + if(!(istype(random_location, /turf/open/floor))) + continue + var/turf/open/floor/F = random_location + if(!F.air) + continue + + var/datum/gas_mixture/A = F.air + var/list/A_gases = A.gases + var/trace_gases + for(var/id in A_gases) + if(id in hardcoded_gases) + continue + trace_gases = TRUE + break + + // Can most things breathe? + if(trace_gases) + continue + if(!(A_gases["o2"] && A_gases["o2"][MOLES] >= 16)) + continue + if(A_gases["plasma"]) + continue + if(A_gases["co2"] && A_gases["co2"][MOLES] >= 10) + continue + + // Aim for goldilocks temperatures and pressure + if((A.temperature <= 270) || (A.temperature >= 360)) + continue + var/pressure = A.return_pressure() + if((pressure <= 20) || (pressure >= 550)) + continue + + // DING! You have passed the gauntlet, and are "probably" safe. + return F diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 2b7eee8a730..62c1700f58d 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -21,6 +21,7 @@ var/datum/atom_hud/huds = list( \ ANTAG_HUD_DEVIL = new/datum/atom_hud/antag(),\ ANTAG_HUD_SINTOUCHED = new/datum/atom_hud/antag/hidden(),\ ANTAG_HUD_SOULLESS = new/datum/atom_hud/antag/hidden(),\ + ANTAG_HUD_CLOCKWORK = new/datum/atom_hud/antag(),\ ) /datum/atom_hud diff --git a/code/datums/martial.dm b/code/datums/martial.dm index 46e18dde7d7..226da8d5e57 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -323,10 +323,16 @@ add_to_streak("G",D) if(check_streak(A,D)) return 1 - D.grabbedby(A,1) - var/obj/item/weapon/grab/G = A.get_active_hand() - if(G) - G.state = GRAB_AGGRESSIVE //Instant aggressive grab + if(A.grab_state > GRAB_AGGRESSIVE) + D.grabbedby(A, 1) + else + A.start_pulling(D, 1) + if(A.pulling) + D.drop_r_hand() + D.drop_l_hand() + D.stop_pulling() + A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab + return 1 /datum/martial_art/the_sleeping_carp/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) add_to_streak("H",D) diff --git a/code/datums/material_container.dm b/code/datums/material_container.dm index 21752e31bd6..41baa00796e 100644 --- a/code/datums/material_container.dm +++ b/code/datums/material_container.dm @@ -53,7 +53,8 @@ M.amount += amt total_amount += amt else - for(var/datum/material/M in materials) + for(var/i in materials) + var/datum/material/M = materials[i] M.amount += amt total_amount += amt return (total_amount - total_amount_saved) @@ -135,7 +136,7 @@ return TRUE else if(istype(mats)) for(var/M in mats) - if(materials[M] && mats[M] <= materials[M]) + if(materials[M] && (mats[M] <= materials[M])) continue else return FALSE @@ -218,62 +219,47 @@ /datum/material + var/name var/amount = 0 var/material_type = null var/sheet_type = null /datum/material/metal - -/datum/material/metal/New() - ..() + name = "Metal" material_type = MAT_METAL sheet_type = /obj/item/stack/sheet/metal /datum/material/glass - -/datum/material/glass/New() - ..() + name = "Glass" material_type = MAT_GLASS sheet_type = /obj/item/stack/sheet/glass /datum/material/silver - -/datum/material/silver/New() - ..() + name = "Silver" material_type = MAT_SILVER sheet_type = /obj/item/stack/sheet/mineral/silver /datum/material/gold - -/datum/material/gold/New() - ..() + name = "Gold" material_type = MAT_GOLD sheet_type = /obj/item/stack/sheet/mineral/gold /datum/material/diamond - -/datum/material/diamond/New() - ..() + name = "Diamond" material_type = MAT_DIAMOND sheet_type = /obj/item/stack/sheet/mineral/diamond /datum/material/uranium - -/datum/material/uranium/New() - ..() + name = "Uranium" material_type = MAT_URANIUM sheet_type = /obj/item/stack/sheet/mineral/uranium /datum/material/plasma - -/datum/material/plasma/New() - ..() + name = "Solid Plasma" material_type = MAT_PLASMA sheet_type = /obj/item/stack/sheet/mineral/plasma /datum/material/bananium - -/datum/material/bananium/New() - ..() + name = "Bananium" material_type = MAT_BANANIUM - sheet_type = /obj/item/stack/sheet/mineral/bananium \ No newline at end of file + sheet_type = /obj/item/stack/sheet/mineral/bananium diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 9c1a5522b93..34360228de4 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -245,6 +245,7 @@ "nuclear", "traitor", // "traitorchan", "monkey", + "clockcult" ) var/text = "" @@ -352,6 +353,26 @@ sections["cult"] = text + /** CLOCKWORK CULT **/ + text = "clockwork cult" + if(ticker.mode.config_tag == "clockwork cult") + text = uppertext(text) + text = "[text]: " + if(src in ticker.mode.servants_of_ratvar) + text += "loyal|employee|SERVANT" + text += "
Give slab" + else if(isloyal(current)) + text += "LOYAL|employee|servant" + else + text += "loyal|EMPLOYEE|servant" + + if(current && current.client && (ROLE_SERVANT_OF_RATVAR in current.client.prefs.be_special)) + text += "|Enabled in Prefs" + else + text += "|Disabled in Prefs" + + sections["clockcult"] = text + /** WIZARD ***/ text = "wizard" if (ticker.mode.config_tag=="wizard") @@ -1017,6 +1038,22 @@ if (!ticker.mode.equip_cultist(current)) usr << "Spawning amulet failed!" + else if(href_list["clockcult"]) + switch(href_list["clockcult"]) + if("clear") + remove_servant_of_ratvar(current) + message_admins("[key_name_admin(usr)] has removed clockwork servant status from [current].") + log_admin("[key_name(usr)] has removed clockwork servant status from [current].") + if("servant") + if(!(src in ticker.mode.servants_of_ratvar)) + add_servant_of_ratvar(current) + message_admins("[key_name_admin(usr)] has made [current] into a servant of Ratvar.") + log_admin("[key_name(usr)] has made [current] into a servant of Ratvar.") + if("slab") + if(!ticker.mode.equip_servant(current)) + usr << "Failed to outfit [current] with a slab!" + else + usr << "Successfully gave [current] a clockwork slab!" else if (href_list["wizard"]) switch(href_list["wizard"]) @@ -1689,7 +1726,11 @@ return G break - +/datum/mind/proc/grab_ghost(force) + var/mob/dead/observer/G = get_ghost(even_if_they_cant_reenter = force) + . = G + if(G) + G.reenter_corpse() /mob/proc/sync_mind() mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist) diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index 5591c02439b..9a404f07680 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -167,14 +167,6 @@ suffix = "lavaland_fountain_hall.dmm" cost = 5 -/datum/map_template/ruin/lavaland/zombie_gym - name = "Zombie Gym" - id = "zombie-gym" - description = "The patrons at this gym are serious about health, and \ - making sure people work on their cardio." - suffix = "lavaland_gym.dmm" - cost = 10 - /datum/map_template/ruin/lavaland/survivalcapsule name = "Survival Capsule Ruins" id = "survivalcapsule" @@ -183,15 +175,6 @@ suffix = "lavaland_surface_survivalpod.dmm" cost = 5 -/datum/map_template/ruin/lavaland/wwiioutpost - name = "Strange Outpost" - id = "nazi" - description = "The ruins of an outpost, skeletons and empty shell casings litter the interior of \ - the structure. Some of these uniforms look awfully strange.." - suffix = "lavaland_surface_wwiioutpost.dmm" - cost = 20 - allow_duplicates = FALSE - /datum/map_template/ruin/lavaland/tomb name = "Strange Outpost" id = "tomb" diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index f34e49e96a0..77afc9e5f36 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -3,12 +3,14 @@ var/prefix = "_maps/shuttles/" var/suffix var/port_id + var/shuttle_id var/description var/admin_notes /datum/map_template/shuttle/New() - mappath = "[prefix][port_id]_[suffix].dmm" + shuttle_id = "[port_id]_[suffix]" + mappath = "[prefix][shuttle_id].dmm" . = ..() /datum/map_template/shuttle/emergency @@ -129,6 +131,18 @@ is a shuttle used at other less known nanotrasen facilities \ and has a more open inside for larger crowds." +/datum/map_template/shuttle/emergency/wabbajack + suffix = "wabbajack" + name = "NT Lepton Violet" + description = "The research team based on this vessel went missing one \ + day, and no amount of investigation could discover what happened to \ + them. The only occupants were a number of dead rodents, who appeared to \ + have clawed each other to death. Needless to say, no engineering team \ + wanted to go near the thing, and it's only being used as an Emergency \ + Escape Shuttle because there is literally nothing else available." + admin_notes = "If the crew can solve the puzzle, they will wake the \ + wabbajack statue. It will likely not end well. There's a reason it's \ + boarded up. Maybe they should have just left it alone." /datum/map_template/shuttle/ferry/base suffix = "base" diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space_Station_13_areas.dm similarity index 95% rename from code/game/area/Space Station 13 areas.dm rename to code/game/area/Space_Station_13_areas.dm index bb4f8d28ffa..1077f37946c 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -19,7 +19,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Space" icon = 'icons/turf/areas.dmi' icon_state = "unknown" - layer = 10 + layer = AREA_LAYER mouse_opacity = 0 invisibility = INVISIBILITY_LIGHTING diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index d556f2a5b2e..2f7d234255b 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -26,7 +26,7 @@ /area/New() icon_state = "" - layer = 10 + layer = AREA_LAYER master = src uid = ++global_uid related = list(src) diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm index 1d95041df3c..f700b301351 100644 --- a/code/game/asteroid.dm +++ b/code/game/asteroid.dm @@ -71,7 +71,7 @@ var/global/max_secret_rooms = 6 if("cult") theme = "cult" - walltypes = list(/turf/closed/wall/cult=3,/turf/closed/mineral/random/high_chance=1) + walltypes = list(/turf/closed/wall/mineral/cult=3,/turf/closed/mineral/random/high_chance=1) floortypes = list(/turf/open/floor/plasteel/cult) treasureitems = list(/obj/item/device/soulstone/anybody=1, /obj/item/clothing/suit/space/hardsuit/cult=1, /obj/item/weapon/bedsheet/cult=2, /obj/item/clothing/suit/cultrobes=2, /mob/living/simple_animal/hostile/creature=3) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 99e5a8205b7..4a2c0a330ee 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1,5 +1,5 @@ /atom - layer = 2 + layer = TURF_LAYER var/level = 2 var/flags = 0 var/list/fingerprints diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 63c03c9c2dd..8d6d5705654 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -1,5 +1,5 @@ /atom/movable - layer = 3 + layer = OBJ_LAYER var/last_move = null var/anchored = 0 var/throwing = 0 @@ -13,10 +13,12 @@ var/verb_yell = "yells" var/inertia_dir = 0 var/pass_flags = 0 + var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move glide_size = 8 appearance_flags = TILE_BOUND + /atom/movable/Move(atom/newloc, direct = 0) if(!loc || !newloc) return 0 var/atom/oldloc = loc @@ -25,28 +27,38 @@ if (!(direct & (direct - 1))) //Cardinal move . = ..() else //Diagonal move, split it into cardinal moves + moving_diagonally = FIRST_DIAG_STEP if (direct & 1) if (direct & 4) if (step(src, NORTH)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, EAST) else if (step(src, EAST)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, NORTH) else if (direct & 8) if (step(src, NORTH)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, WEST) else if (step(src, WEST)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, NORTH) else if (direct & 2) if (direct & 4) if (step(src, SOUTH)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, EAST) else if (step(src, EAST)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, SOUTH) else if (direct & 8) if (step(src, SOUTH)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, WEST) else if (step(src, WEST)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, SOUTH) + moving_diagonally = 0 if(!loc || (loc == oldloc && oldloc != newloc)) last_move = 0 @@ -80,10 +92,8 @@ qdel(AM) loc = null invisibility = INVISIBILITY_ABSTRACT - if (pulledby) - if (pulledby.pulling == src) - pulledby.pulling = null - pulledby = null + if(pulledby) + pulledby.stop_pulling() // Previously known as HasEntered() @@ -104,6 +114,8 @@ /atom/movable/proc/forceMove(atom/destination) if(destination) + if(pulledby) + pulledby.stop_pulling() var/atom/oldloc = loc if(oldloc) oldloc.Exited(src, destination) @@ -123,8 +135,6 @@ /mob/living/forceMove(atom/destination) stop_pulling() - if(pulledby) - pulledby.stop_pulling() if(buckled) buckled.unbuckle_mob(src,force=1) if(buckled_mobs.len) @@ -199,6 +209,9 @@ return 0 //use a modified version of Bresenham's algorithm to get from the atom's current position to that of the target + if(pulledby) + pulledby.stop_pulling() + throwing = 1 if(spin) //if we don't want the /atom/movable to spin. SpinAnimation(5, 1) diff --git a/code/game/gamemodes/antag_hud.dm b/code/game/gamemodes/antag_hud.dm index 464698a6f34..3592fbc4e00 100644 --- a/code/game/gamemodes/antag_hud.dm +++ b/code/game/gamemodes/antag_hud.dm @@ -17,6 +17,8 @@ M.mind.antag_hud = src /datum/atom_hud/antag/proc/leave_hud(mob/M) + if(!M) + return if(!istype(M)) CRASH("leave_hud(): [M] ([M.type]) is not a mob!") remove_from_hud(M) diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm index e1ade57fe22..4cf2789710e 100644 --- a/code/game/gamemodes/blob/blob_finish.dm +++ b/code/game/gamemodes/blob/blob_finish.dm @@ -1,8 +1,8 @@ /datum/game_mode/blob/check_finished() - if(overminds.len) - return 0 if(blobwincount <= blobs_legit.len)//Blob took over return 1 + if(overminds.len) + return 0 if(!blob_cores.len) //blob is dead if(config.continuous["blob"]) continuous_sanity_checked = 1 //Nonstandard definition of "alive" gets past the check otherwise diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index 037d0d246ea..66bcfd61398 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -90,7 +90,7 @@ attack_sound = 'sound/weapons/genhit1.ogg' flying = 1 del_on_death = 1 - deathmessage = "The blob spore explodes into a cloud of gas!" + deathmessage = "explodes into a cloud of gas!" var/death_cloud_size = 1 //size of cloud produced from a dying spore var/list/human_overlays = list() var/is_zombie = 0 @@ -212,13 +212,17 @@ mob_size = MOB_SIZE_LARGE see_invisible = SEE_INVISIBLE_MINIMUM see_in_dark = 8 + var/independent = FALSE /mob/living/simple_animal/hostile/blob/blobbernaut/New() ..() - verbs -= /mob/living/verb/pulled //no pulling people deep into the blob + if(!independent) //no pulling people deep into the blob + verbs -= /mob/living/verb/pulled /mob/living/simple_animal/hostile/blob/blobbernaut/Life() if(..()) + if(independent) + return // strong independent blobbernaut that don't need no blob var/damagesources = 0 if(!(locate(/obj/effect/blob) in range(2, src))) damagesources++ @@ -271,3 +275,7 @@ factory.naut = null //remove this naut from its factory factory.maxhealth = initial(factory.maxhealth) flick("blobbernaut_death", src) + +/mob/living/simple_animal/hostile/blob/blobbernaut/independent + independent = TRUE + gold_core_spawnable = 1 diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index da36d8f6d96..57f0c27dab5 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -15,23 +15,21 @@ user << "We are already absorbing!" return - var/obj/item/weapon/grab/G = user.get_active_hand() - if(!istype(G)) - user << "We must be grabbing a creature in our active hand to absorb them!" + if(!user.pulling || !iscarbon(user.pulling)) + user << "We must be grabbing a creature to absorb them!" return - if(G.state <= GRAB_NECK) + if(user.grab_state <= GRAB_NECK) user << "We must have a tighter grip to absorb this creature!" return - var/mob/living/carbon/target = G.affecting + var/mob/living/carbon/target = user.pulling return changeling.can_absorb_dna(user,target) /obj/effect/proc_holder/changeling/absorbDNA/sting_action(mob/user) var/datum/changeling/changeling = user.mind.changeling - var/obj/item/weapon/grab/G = user.get_active_hand() - var/mob/living/carbon/human/target = G.affecting + var/mob/living/carbon/human/target = user.pulling changeling.isabsorbing = 1 for(var/stage = 1, stage<=3, stage++) switch(stage) @@ -122,11 +120,10 @@ /obj/effect/proc_holder/changeling/swap_form/can_sting(mob/living/carbon/user) if(!..()) return - var/obj/item/weapon/grab/G = user.get_active_hand() - if(!istype(G) || (G.state < GRAB_AGGRESSIVE)) - user << "We must have an aggressive grab on creature in our active hand to do this!" + if(!user.pulling || !iscarbon(user.pulling) || user.grab_state < GRAB_AGGRESSIVE) + user << "We must have an aggressive grab on creature to do this!" return - var/mob/living/carbon/target = G.affecting + var/mob/living/carbon/target = user.pulling if((target.disabilities & NOCLONE) || (target.disabilities & HUSK)) user << "DNA of [target] is ruined beyond usability!" return @@ -137,8 +134,7 @@ /obj/effect/proc_holder/changeling/swap_form/sting_action(mob/living/carbon/user) - var/obj/item/weapon/grab/G = user.get_active_hand() - var/mob/living/carbon/target = G.affecting + var/mob/living/carbon/target = user.pulling var/datum/changeling/changeling = user.mind.changeling user << "We tighen our grip. We must hold still...." diff --git a/code/game/gamemodes/changeling/powers/linglink.dm b/code/game/gamemodes/changeling/powers/linglink.dm index 31de5f47be6..3b90ee14bd5 100644 --- a/code/game/gamemodes/changeling/powers/linglink.dm +++ b/code/game/gamemodes/changeling/powers/linglink.dm @@ -10,11 +10,16 @@ if(!..()) return var/datum/changeling/changeling = user.mind.changeling - var/obj/item/weapon/grab/G = user.get_active_hand() - var/mob/living/carbon/target = G.affecting if(changeling.islinking) user << "We have already formed a link with the victim!" return + if(!user.pulling) + user << "We must be tightly grabbing a creature to link with them!" + return + if(!iscarbon(user.pulling)) + user << "We cannot link with this creature!" + return + var/mob/living/carbon/target = user.pulling if(!target.mind) user << "The victim has no mind to link to!" return @@ -23,19 +28,15 @@ return if(target.mind.changeling) user << "The victim is already a part of the hivemind!" - return - if(!istype(G)) - user << "We must be tightly grabbing a creature in our active hand to link with them!" return - if(G.state <= GRAB_NECK) + if(user.grab_state <= GRAB_NECK) user << "We must have a tighter grip to link with this creature!" return return changeling.can_absorb_dna(user,target) /obj/effect/proc_holder/changeling/linglink/sting_action(mob/user) var/datum/changeling/changeling = user.mind.changeling - var/obj/item/weapon/grab/G = user.get_active_hand() - var/mob/living/carbon/human/target = G.affecting + var/mob/living/carbon/human/target = user.pulling changeling.islinking = 1 for(var/i in 1 to 3) switch(i) diff --git a/code/game/gamemodes/clock_cult/__clock_defines.dm b/code/game/gamemodes/clock_cult/__clock_defines.dm new file mode 100644 index 00000000000..3516eac2b30 --- /dev/null +++ b/code/game/gamemodes/clock_cult/__clock_defines.dm @@ -0,0 +1,16 @@ +var/global/clockwork_construction_value = 0 //The total value of all structures built by the clockwork cult +var/global/clockwork_caches = 0 //How many clockwork caches exist in the world (not each individual) +var/global/clockwork_daemons = 0 //How many daemons exist in the world +var/global/list/clockwork_generals_invoked = list("nezbere" = FALSE, "sevtug" = FALSE, "nzcrentr" = FALSE, "inath-neq" = FALSE) //How many generals have been recently invoked +var/global/list/all_clockwork_objects = list() //All clockwork items, structures, and effects in existence +var/global/list/all_clockwork_mobs = list() //All clockwork SERVANTS (not creatures) in existence +var/global/list/clockwork_component_cache = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) //The pool of components that caches draw from + +#define SCRIPTURE_PERIPHERAL 0 //Should never be used +#define SCRIPTURE_DRIVER 1 +#define SCRIPTURE_SCRIPT 2 +#define SCRIPTURE_APPLICATION 3 +#define SCRIPTURE_REVENANT 4 +#define SCRIPTURE_JUDGEMENT 5 + +#define SLAB_PRODUCTION_THRESHOLD 60 //How many cycles it takes slabs to produce a single component; defaults to one minute diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm new file mode 100644 index 00000000000..fd289769277 --- /dev/null +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -0,0 +1,274 @@ +/* + +CLOCKWORK CULT: Based off of the failed pull requests from vgstation + +While Nar-Sie is the oldest and most prominent of the elder gods, there are other forces at work in the universe. +Ratvar, the Clockwork Justiciar, a homage to Nar-Sie granted sentience by its own power, is one such other force. +Imprisoned within a massive construct known as the Celestial Derelict - or Reebe - an intense hatred of the Blood God festers. +Ratvar, unable to act in the mortal plane, seeks to return and forms covenants with mortals in order to bolster his influence. +Due to his mechanical nature, Ratvar is also capable of influencing silicon-based lifeforms, unlike Nar-Sie, who can only influence natural life. + +This is a team-based gamemode. + +There are three possible objectives the Enlightened - Ratvar's minions - can have: + 1. Ensure X amount of Enlightened escape the station through the shuttle or otherwise. + 2. Convert all silicon lifeforms on the station to Ratvar's cause. + 3. Summon Ratvar via construction of a Gateway. + +The clockwork version of an arcane tome is the clockwork slab. +While it can perform certain actions, it consumes a resource called components. +Components, which are fallen fragments of Ratvar's body as he rusts in Reebe, are powerful and have various effects. +Game-wise, clockwork slabs will generate components over time, with more powerful components being slower. + +This file's folder contains: + __clock_defines.dm: Defined variables + clock_cult.dm: Core gamemode files. + clock_mobs.dm: Hostile and benign clockwork creatures. + clock_objects.dm: Items and structures. + clock_ratvar.dm: The Ark of the Clockwork Justiciar and Ratvar himself. Important enough to have his own file. + clock_scripture.dm: Scripture and rites. + clock_unsorted.dm: Anything else with no place to be + +*/ + +/////////// +// PROCS // +/////////// + +/proc/is_servant_of_ratvar(mob/M) + return M && istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.servants_of_ratvar) + +/proc/is_eligible_servant(mob/M) + return M && istype(M) && M.mind && !M.mind.special_role && !isloyal(M) + +/proc/add_servant_of_ratvar(mob/M, silent = FALSE) + if(!is_eligible_servant(M) || !ticker || !ticker.mode) + return 0 + if(iscarbon(M)) + if(!silent) + M << "Your mind is racing! Your body feels incredibly light! Your world glows a brilliant yellow! All at once it comes to you. Ratvar, the Clockwork \ + Justiciar lies in exile, derelict and forgotten in an unseen realm." + if(!is_eligible_servant(M)) + M.visible_message("[M] seems to resist an unseen force!", "And yet, you somehow push it all away.") + return 0 + else if(issilicon(M)) + if(!silent) + M << "You are unable to compute this truth. Your vision glows a brilliant yellow, and all at once it comes to you. Ratvar, the Clockwork Justiciar, lies in \ + exile, derelict and forgotten in an unseen realm." + if(!is_eligible_servant(M)) + M.visible_message("[M] whirs as it resists an outside influence!", \ + "Corrupt data purged. Resetting cortex chip to factory defaults... complete.") + return 0 + if(!silent) + M.visible_message("[M]'s eyes glow a blazing yellow!", \ + "Assist your new companions in their righteous efforts. Your goal is theirs, and theirs yours. You serve the Clockwork Justiciar above all else. Perform his every \ + whim without hesitation.") + ticker.mode.servants_of_ratvar += M.mind + ticker.mode.update_servant_icons_added(M.mind) + M.mind.special_role = "Servant of Ratvar" + all_clockwork_mobs += M + if(issilicon(M)) + var/mob/living/silicon/S = M + if(isrobot(S)) + var/mob/living/silicon/robot/R = S + R.UnlinkSelf() + R.emagged = 1 + R << "You have been desynced from your master AI. In addition, your onboard camera is no longer active and your safeties have been disabled." + S.laws = new/datum/ai_laws/ratvar + S.update_icons() + S.show_laws() + if(istype(ticker.mode, /datum/game_mode/clockwork_cult)) + var/datum/game_mode/clockwork_cult/C = ticker.mode + C.present_tasks(M) //Memorize the objectives + return 1 + +/proc/remove_servant_of_ratvar(mob/M) + if(!is_servant_of_ratvar(M)) //In this way, is_servant_of_ratvar() checks the existence of ticker and minds + return 0 + M.visible_message("[M] seems to have remembered their true allegiance!", \ + "A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.") + ticker.mode.servants_of_ratvar -= M.mind + ticker.mode.update_servant_icons_removed(M.mind) + all_clockwork_mobs -= M + M.mind.memory = "" //Not sure if there's a better way to do this + M.mind.special_role = null + M.verbs -= /mob/living/carbon/human/proc/function_call //Removes any bound Ratvarian spears + if(issilicon(M)) + var/mob/living/silicon/S = M + if(isrobot(S)) + var/mob/living/silicon/robot/R = S + R.emagged = initial(R.emagged) + R << "Despite your freedom from Ratvar's influence, you are still irreparably damaged and no longer possess certain functions such as AI linking." + S.laws = initial(S.laws) + S.update_icons() + S.show_laws() + return 1 + +/proc/send_hierophant_message(mob/user, message) + if(!user || !message || !ticker || !ticker.mode) + return 0 + var/parsed_message = "Servant [user.name == user.real_name ? user.name : "[user.real_name] (as [user.name])"]: \"[message]\"" + for(var/mob/M in mob_list) + if(is_servant_of_ratvar(M) || isobserver(M)) + M << parsed_message + return 1 + +/////////////// +// GAME MODE // +/////////////// + +var/global/ratvar_awakens = FALSE //If Ratvar has been summoned +/datum/game_mode + var/list/servants_of_ratvar = list() //The Enlightened servants of Ratvar + var/required_escapees = 0 //How many servants need to escape, if applicable + var/required_silicon_converts = 0 //How many robotic lifeforms need to be converted, if applicable + var/clockwork_objective = "escape" //The objective that the servants must fulfill + var/clockwork_explanation = "Ensure that the meme levels of the station remain high." //The description of the current objective + +/datum/game_mode/clockwork_cult + name = "clockwork cult" + config_tag = "clockwork cult" + antag_flag = ROLE_SERVANT_OF_RATVAR + required_players = 30 + required_enemies = 2 + recommended_enemies = 4 + enemy_minimum_age = 14 + protected_jobs = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain") //Silicons can eventually be converted + +/datum/game_mode/clockwork_cult/announce() + world << "The game mode is: Clockwork Cult!" + world << "Ratvar, the Clockwork Justiciar, has formed a covenant of Enlightened aboard [station_name()]." + world << "Enlightened: Serve your master so that his influence might grow." + world << "Crew: Prevent the servants of Ratvar from taking over the station." + +/datum/game_mode/clockwork_cult/pre_setup() + if(config.protect_roles_from_antagonist) + restricted_jobs += protected_jobs + if(config.protect_assistant_from_antagonist) + restricted_jobs += "Assistant" + var/starter_servants = max(1, round(num_players() / 10)) //Guaranteed one cultist - otherwise, about one cultist for every ten players + while(starter_servants) + var/datum/mind/servant = pick(antag_candidates) + servants_of_ratvar += servant + antag_candidates -= servant + modePlayer += servant + servant.special_role = "Servant of Ratvar" + servant.restricted_roles = restricted_jobs + update_servant_icons_added(servant) + starter_servants-- + return 1 + +/datum/game_mode/clockwork_cult/post_setup() + forge_clock_objectives() + for(var/S in servants_of_ratvar) + var/datum/mind/servant = S + log_game("[servant.key] was made an initial servant of Ratvar") + var/mob/living/L = servant.current + greet_servant(L) + equip_servant(L) + present_tasks(L) + ..() + return 1 + +/datum/game_mode/clockwork_cult/proc/forge_clock_objectives() //Determine what objective that Ratvar's servants will fulfill + var/list/possible_objectives = list("escape", "gateway") + var/silicons_possible = FALSE + for(var/mob/living/silicon/S in living_mob_list) + silicons_possible = TRUE + if(silicons_possible) + possible_objectives += "silicons" + clockwork_objective = pick(possible_objectives) + clockwork_objective = "gateway" //TEMPORARY, to be removed before merge + switch(clockwork_objective) + if("escape") + required_escapees = max(1, num_players() / 3) //33% of the player count must be cultists + clockwork_explanation = "Ensure that [required_escapees] servant(s) of Ratvar escape from [station_name()]." + if("gateway") + clockwork_explanation = "Construct a Gateway to the Celestial Derelict and free Ratvar." + if("silicons") + clockwork_explanation = "Ensure that all silicon-based lifeforms on [station_name()] are servants of Ratvar by the end of the shift." + return 1 + +/datum/game_mode/clockwork_cult/proc/greet_servant(mob/M) //Description of their role + if(!M) + return 0 + var/greeting_text = "
You are a servant of Ratvar, the Clockwork Justiciar.\n\ + Rusting eternally in the Celestial Derelict, Ratvar has formed a covenant of mortals, with you as one of its members. As one of the Justiciar's servants, you are to work to the best of your \ + ability to assist in completion of His agenda. You do not know the specifics of how to do so, but luckily you have a vessel to help you learn." + M << greeting_text + return 1 + +/datum/game_mode/proc/equip_servant(mob/living/L) //Grants a clockwork slab to the mob, with one of each component + if(!L || !istype(L)) + return 0 + var/slot = "At your feet" + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(H.back && istype(H.back, /obj/item/weapon/storage/backpack)) + var/obj/item/weapon/storage/backpack/B = H.back + new/obj/item/clockwork/slab/starter(B) + slot = "In your [B.name]" + if(slot == "At your feet") + new/obj/item/clockwork/slab/starter(get_turf(L)) + L << "[slot] is a link to the halls of Reebe and your master. You may use it to perform many tasks, but also become oriented with the workings of Ratvar and how to best complete your \ + tasks. This clockwork slab will be instrumental in your triumph. Remember: you can speak discreetly with your fellow servants by using Report in your slab's interface, and you can find a \ + concise tutorial in Recollection." + return 1 + +/datum/game_mode/clockwork_cult/proc/present_tasks(mob/living/L) //Memorizes and displays the clockwork cult's objective + if(!L || !istype(L) || !L.mind) + return 0 + var/datum/mind/M = L.mind + M.current << "This is Ratvar's will: [clockwork_explanation]" + M.memory += "Ratvar's will: [clockwork_explanation]
" + return 1 + +/datum/game_mode/clockwork_cult/proc/check_clockwork_victory() + switch(clockwork_objective) + if("escape") + var/surviving_servants = 0 + for(var/datum/mind/M in servants_of_ratvar) + if(M.current && M.current.stat != DEAD && (M.current.onCentcom() || M.current.onSyndieBase())) + surviving_servants++ + if(surviving_servants <= required_escapees) + return 1 + return 0 + if("silicons") + for(var/mob/living/silicon/robot/S in mob_list) //Only check robots and AIs + if(!is_servant_of_ratvar(S)) + return 0 + for(var/mob/living/silicon/ai/A in mob_list) + if(!is_servant_of_ratvar(A)) + return 0 + return 1 + if("gateway") + return ratvar_awakens + return 0 //This shouldn't ever be reached, but just in case it is + +/datum/game_mode/clockwork_cult/declare_completion() + ..() + return 0 //Doesn't end until the round does + +/datum/game_mode/proc/auto_declare_completion_clockwork_cult() + var/text = "" + if(istype(ticker.mode, /datum/game_mode/clockwork_cult)) //Possibly hacky? + var/datum/game_mode/clockwork_cult/C = ticker.mode + if(C.check_clockwork_victory()) + text += "Ratvar's servants have succeeded in fulfilling His goals!" + else + text += "Ratvar's servants have failed!" + text += "
The goal of the clockwork cult was: [clockwork_explanation]
" + text += "Ratvar's servants were:" + for(var/datum/mind/M in servants_of_ratvar) + text += printplayer(M) + world << text + +/datum/game_mode/proc/update_servant_icons_added(datum/mind/M) + var/datum/atom_hud/antag/A = huds[ANTAG_HUD_CLOCKWORK] + A.join_hud(M.current) + set_antag_hud(M.current, "clockwork") + +/datum/game_mode/proc/update_servant_icons_removed(datum/mind/M) + var/datum/atom_hud/antag/A = huds[ANTAG_HUD_CLOCKWORK] + A.leave_hud(M.current) + set_antag_hud(M.current, null) diff --git a/code/game/gamemodes/clock_cult/clock_mobs.dm b/code/game/gamemodes/clock_cult/clock_mobs.dm new file mode 100644 index 00000000000..1ce2168e7c6 --- /dev/null +++ b/code/game/gamemodes/clock_cult/clock_mobs.dm @@ -0,0 +1,279 @@ +/mob/living/simple_animal/hostile/anima_fragment //Anima fragment: Low health but high melee power. Created by inserting a soul vessel into an empty fragment. + name = "anima fragment" + desc = "An ominous humanoid shell with a spinning cogwheel as its head, lifted by a jet of blazing red flame." + icon = 'icons/mob/clockwork_mobs.dmi' + icon_state = "anime_fragment" + health = 75 //Glass cannon + maxHealth = 75 + wander = FALSE + minbodytemp = 0 + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) //Robotic + healable = FALSE + melee_damage_lower = 25 + melee_damage_upper = 25 + attacktext = "crushes" + attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg' + var/playstyle_string = "You are an anima fragment, a clockwork creation of Ratvar. As a fragment, you are weak but possess powerful melee capabilities \ + in addition to being immune to extreme temperatures and pressures. Your goal is to serve the Justiciar and his servants in any way you can. You yourself are one of these servants, and will \ + be able to utilize anything they can, assuming it doesn't require opposable thumbs." + +/mob/living/simple_animal/hostile/anima_fragment/New() + ..() + if(prob(1)) + name = "anime fragment" + real_name = name + desc = "I-it's not like I want to show you the light of the Justiciar or anything, B-BAKA!" + +/mob/living/simple_animal/hostile/anima_fragment/death(gibbed) + ..(TRUE) + visible_message("[src]'s flame jets cut out as it falls to the floor with a tremendous crash. A cube of metal tumbles out, whirring and sputtering.", \ + "Your gears seize up. Your flame jets flicker. Your soul vessel belches smoke as you helplessly crash down.") + playsound(src, 'sound/magic/clockwork/anima_fragment_death.ogg', 100, 1) + new/obj/item/clockwork/component/replicant_alloy/smashed_anima_fragment(get_turf(src)) + new/obj/item/device/mmi/posibrain/soul_vessel(get_turf(src)) //Notice the lack of transfer - it's a standard soul vessel with no mind in it! + qdel(src) + return 1 + +/mob/living/simple_animal/hostile/clockwork_marauder //Clockwork marauder: Slow but with high damage, resides inside of a servant. Created via the Memory Allocation scripture. + name = "clockwork marauder" + desc = "A stalwart apparition of a soldier, blazing with crimson flames. It's armed with a gladius and shield." + icon = 'icons/mob/clockwork_mobs.dmi' + icon_state = "clockwork_marauder" + health = 25 //Health is governed by fatigue, but can be directly reduced by the presence of certain objects + maxHealth = 25 + wander = FALSE + speed = 1 + minbodytemp = 0 + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + healable = FALSE + melee_damage_lower = 10 + melee_damage_upper = 10 + attacktext = "slashes" + attack_sound = 'sound/weapons/bladeslice.ogg' + var/true_name = "Meme Master 69" //Required to call forth the marauder + var/list/possible_true_names = list("Xaven", "Melange", "Ravan", "Kel", "Rama", "Geke", "Peris", "Vestra", "Skiwa") //All fairly short and easy to pronounce + var/fatigue = 0 //Essentially what determines the marauder's power + var/fatigue_recall_threshold = 100 //In variable form due to changed effects once Ratvar awakens + var/mob/living/host //The mob that the marauder is living inside of + var/recovering = FALSE //If the marauder is recovering from a large amount of fatigue + var/playstyle_string = "You are a clockwork marauder, a living extension of Ratvar's will. As a marauder, you are slow but sturdy and decently powerful \ + in addition to being immune to extreme temperatures and pressures. Your primary goal is to serve the creature that you are now a part of. You can use the Linked Minds ability in your \ + Marauder tab to communicate silently with your master, but can only exit if your master calls your true name.\n\n\ + \ + Taking damage and remaining outside of your master will cause fatigue, which hinders your movement speed and attacks, in addition to forcing you back into your master if it grows \ + too high. As a final note, you should probably avoid harming any fellow servants of Ratvar." + +/mob/living/simple_animal/hostile/clockwork_marauder/New() + ..() + true_name = pick(possible_true_names) + +/mob/living/simple_animal/hostile/clockwork_marauder/Life() + ..() + if(is_in_host()) + fatigue = max(0, fatigue - 2) //Doesn't use adjust_fatigue in order to bypass the Ratvar edgecase + if(!fatigue && recovering) + src << "Your strength has returned. You can once again come forward!" + host << "Your marauder is now strong enough to come forward again!" + recovering = FALSE + else + if(ratvar_awakens) //If Ratvar is alive, marauders both don't take fatigue loss and move at sanic speeds + speed = -1 + melee_damage_lower = 30 + melee_damage_upper = 30 + attacktext = "devastates" + else + if(host) + switch(get_dist(src, host)) + if(1 to 5) + adjust_fatigue(1) + if(5 to INFINITY) + adjust_fatigue(rand(10, 20)) + src << "You're too far from your host and rapidly taking fatigue damage!" + switch(fatigue) + if(0 to 1) //Bonuses to speed and damage at normal fatigue levels + speed = 0 + melee_damage_lower = 15 + melee_damage_upper = 15 + attacktext = "viciously slashes" + if(1 to 25) + speed = initial(speed) + melee_damage_lower = initial(melee_damage_lower) + melee_damage_upper = initial(melee_damage_upper) + attacktext = initial(attacktext) + if(25 to 50) //Damage decrease, but not speed + melee_damage_lower = 7 + melee_damage_upper = 7 + attacktext = "lightly slashes" + if(50 to 75) //Speed decrease + speed = 2 + if(75 to 99) //Massive speed decrease and weak melee attacks + speed = 3 + melee_damage_lower = 5 + melee_damage_upper = 5 + attacktext = "weakly slashes" + if(99 to 100) + src << "The fatigue becomes too much!" + if(host) + src << "You retreat to [host] - you will have to wait before being deployed again." + host << "[true_name] is too fatigued to fight - you will need to wait until they are strong enough." + recovering = TRUE + return_to_host() + else + qdel(src) //Shouldn't ever happen, but... + +/mob/living/simple_animal/hostile/clockwork_marauder/death(gibbed) + ..(TRUE) + emerge_from_host() + visible_message("[src]'s equipment clatters lifelessly to the ground as the red flames within dissipate.", \ + "Your equipment falls away. You feel a moment of confusion before your fragile form is annihilated.") + playsound(src, 'sound/magic/clockwork/anima_fragment_death.ogg', 100, 1) + new/obj/item/clockwork/component/replicant_alloy/fallen_armor(get_turf(src)) + qdel(src) + return 1 + +/mob/living/simple_animal/hostile/clockwork_marauder/Stat() + ..() + if(statpanel("Status")) + stat(null, "Fatigue: [fatigue]/[fatigue_recall_threshold]") + stat(null, "Current True Name: [true_name]") + stat(null, "Host: [host ? host : "NONE"]") + stat(null, "You are [recovering ? "too weak" : "able"] to deploy!") + +/mob/living/simple_animal/hostile/clockwork_marauder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans) + ..() + if(findtext(message, true_name) && is_in_host()) //Called or revealed by hearing their true name + if(speaker == host) + emerge_from_host() + else + src << "You hear your true name and partially emerge before you can stop yourself!" + host.visible_message("[host]'s skin flashes crimson!", "Your marauder instinctively reacts to its true name!") + +/mob/living/simple_animal/hostile/clockwork_marauder/say(message) + if(is_in_host()) + src << "You cannot speak while inside of your host! Used the Linked Minds verb instead." + return 0 + ..() + +/mob/living/simple_animal/hostile/clockwork_marauder/adjustHealth(amount) //Fatigue damage + for(var/mob/living/L in range(3, src)) + if(L.null_rod_check()) //Null rods allow direct damage + src << "The power of a holy artifact bypasses your armor and wounds you directly!" + . = ..() + break + return 0 + adjust_fatigue(amount) + return 1 + +/mob/living/simple_animal/hostile/clockwork_marauder/AttackingTarget() + if(is_in_host()) + return 0 + ..() + +/mob/living/simple_animal/hostile/clockwork_marauder/proc/adjust_fatigue(amount) //Adds or removes the given amount of fatigue + if(!ratvar_awakens) + fatigue = max(0, min(fatigue + amount, fatigue_recall_threshold)) + return 1 + +/mob/living/simple_animal/hostile/clockwork_marauder/verb/linked_minds() //Discreet communications between a marauder and its host + set name = "Linked Minds" + set desc = "Silently communicates with your master." + set category = "Marauder" + + if(!host) //Verb isn't removed because they might gain one... somehow + usr << "You don't have a host!" + return 0 + var/message = stripped_input(usr, "Enter a message to tell your host.", "Telepathy")// as null|anything + if(!usr || !message) + return 0 + if(!host) + usr << "Your host seems to have vanished!" + return 0 + message = "Marauder [true_name]: \"[message]\"" //Processed output + usr << message + host << message + return 1 + +/mob/living/proc/talk_with_marauder() //See above - this is the host version + set name = "Linked Minds" + set desc = "Silently communicates with your marauder." + set category = "Clockwork" + var/mob/living/simple_animal/hostile/clockwork_marauder/marauder + + if(!marauder) + for(var/mob/living/simple_animal/hostile/clockwork_marauder/C in living_mob_list) + if(C.host == src) + marauder = C + if(!marauder) //Double-check afterwards + src << "You aren't hosting any marauders!" + verbs -= src + return 0 + var/message = stripped_input(src, "Enter a message to tell your marauder.", "Telepathy")// as null|anything + if(!src || !message) + return 0 + if(!marauder) + usr << "Your marauder seems to have vanished!" + return 0 + message = "Servant [name == real_name ? name : "[real_name] (as [name])"]: \"[message]\"" //Processed output + src << message + marauder << message + return 1 + +/mob/living/simple_animal/hostile/clockwork_marauder/verb/change_true_name() + set name = "Change True Name (One-Use)" + set desc = "Changes your true name, used to be called forth." + set category = "Marauder" + + verbs -= /mob/living/simple_animal/hostile/clockwork_marauder/verb/change_true_name + var/new_name = stripped_input(usr, "Enter a new true name (20-character limit).", "Change True Name")// as null|anything + if(!usr) + return 0 + if(!new_name) + usr << "You decide against changing your true name for now." + verbs += /mob/living/simple_animal/hostile/clockwork_marauder/verb/change_true_name //If they decide against it, let them have another opportunity + return 0 + new_name = dd_limittext(new_name, 20) + true_name = new_name + usr << "You have changed your true name to \"[new_name]\"!" + if(host) + host << "Your clockwork marauder has changed their true name to \"[new_name]\"!" + return 1 + +/mob/living/simple_animal/hostile/clockwork_marauder/verb/return_to_host() + set name = "Return to Host" + set desc = "Recalls yourself to your host, assuming you aren't already there." + set category = "Marauder" + + if(is_in_host()) + return 0 + if(!host) + src << "You don't have a host!" + verbs -= /mob/living/simple_animal/hostile/clockwork_marauder/verb/return_to_host + return 0 + host << "You feel [true_name]'s consciousness settle in your mind." + visible_message("[src] is yanked into [host]'s body!", "You return to [host].") + forceMove(host) + return 1 + +/mob/living/simple_animal/hostile/clockwork_marauder/proc/emerge_from_host() //Notice that this is a proc rather than a verb - marauders can NOT exit at will, but they CAN return + if(!is_in_host()) + return 0 + if(recovering) + host << "[true_name] is too weak to come forth!" + src << "You try to come forth, but you're too weak!" + return 0 + host << "You words echo with power as [true_name] emerges from your body!" + forceMove(get_turf(host)) + visible_message("[host]'s skin glows red as a [name] emerges from their body!", "You exit the safety of [host]'s body!") + return 1 + +/mob/living/simple_animal/hostile/clockwork_marauder/proc/is_in_host() //Checks if the marauder is inside of their host + return host && loc == host + +/mob/living/mind_control_holder + name = "imprisoned mind" + desc = "A helpless mind, imprisoned in its own body." + stat = 0 + flags = GODMODE + +/mob/living/mind_control_holder/say() + return 0 diff --git a/code/game/gamemodes/clock_cult/clock_objects.dm b/code/game/gamemodes/clock_cult/clock_objects.dm new file mode 100644 index 00000000000..ee80c39f8cb --- /dev/null +++ b/code/game/gamemodes/clock_cult/clock_objects.dm @@ -0,0 +1,1586 @@ +///////////////////// +// CLOCKWORK ITEMS // +///////////////////// + +/obj/item/clockwork + name = "meme blaster" + desc = "What the fuck is this? It looks kinda like a frog." + var/clockwork_desc = "A fabled artifact from beyond the stars. Contains concentrated meme essence." //Shown to clockwork cultists instead of the normal description + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "rare_pepe" + w_class = 2 + +/obj/item/clockwork/New() + ..() + all_clockwork_objects += src + +/obj/item/clockwork/Destroy() + all_clockwork_objects -= src + return ..() + +/obj/item/clockwork/examine(mob/user) + if((is_servant_of_ratvar(user) || isobserver(user)) && clockwork_desc) + desc = clockwork_desc + ..() + desc = initial(desc) + +/obj/item/clockwork/slab //Clockwork slab: The most important tool in Ratvar's arsenal. Allows scripture recital, tutorials, and generates components. + name = "clockwork slab" + desc = "A strange metal tablet. A clock in the center turns around and around." + clockwork_desc = "A link between the Celestial Derelict and the mortal plane. Contains limitless knowledge, fabricates components, and outputs a stream of information that only a trained eye can detect." + icon_state = "dread_ipad" + w_class = 3 + var/list/stored_components = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) + var/busy //If the slab is currently being used by something + var/production_cycle = 0 + var/no_cost = FALSE //If the slab is admin-only and needs no components and has no scripture locks + +/obj/item/clockwork/slab/starter + stored_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 1, "guvax_capacitor" = 1, "replicant_alloy" = 1, "hierophant_ansible" = 1) + +/obj/item/clockwork/slab/debug + no_cost = TRUE + +/obj/item/clockwork/slab/debug/attack_hand(mob/living/user) + ..() + if(!is_servant_of_ratvar(user)) + add_servant_of_ratvar(user) + +/obj/item/clockwork/slab/New() + ..() + SSobj.processing += src + +/obj/item/clockwork/slab/Destroy() + SSobj.processing -= src + ..() + +/obj/item/clockwork/slab/process() + production_cycle++ + if(production_cycle < SLAB_PRODUCTION_THRESHOLD) + return 0 + var/component_to_generate = pick("belligerent_eye", "vanguard_cogwheel", "guvax_capacitor", "replicant_alloy", "hierophant_ansible") //Possible todo: Generate based on the lowest amount? + stored_components[component_to_generate]++ + var/mob/living/L + if(isliving(loc)) + L = loc + else if(istype(loc, /obj/item/weapon/storage)) + var/obj/item/weapon/storage/W = loc + if(isliving(W.loc)) //Only goes one level down - otherwise it just doesn't tell you + L = W.loc + if(L) + L << "Your slab clunks as it produces a new component." + production_cycle = 0 + return 1 + +/obj/item/clockwork/slab/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/clockwork/component) && is_servant_of_ratvar(user)) + var/obj/item/clockwork/component/C = I + if(!C.component_id) + return 0 + user.visible_message("[user] inserts [C] into [src]'s compartments.", "You insert [C] into [src].") + stored_components[C.component_id]++ + user.drop_item() + qdel(C) + return 1 + ..() + +/obj/item/clockwork/slab/attack_self(mob/living/user) + if(iscultist(user)) + user << "\"You reek of blood. You've got a lot of nerve to even look at that slab.\"" + user.visible_message("A sizzling sound comes from [user]'s hands!", "[src] suddenly grows extremely hot in your hands!") + playsound(get_turf(user), 'sound/weapons/sear.ogg', 50, 1) + user.drop_item() + user.emote("scream") + user.apply_damage(5, BURN, "l_arm") + user.apply_damage(5, BURN, "r_arm") + return 0 + if(!is_servant_of_ratvar(user)) + user << "The information on [src]'s display shifts rapidly. After a moment, your head begins to pound, and you tear your eyes away." + user.confused = max(0, user.confused + 3) + return 0 + if(busy) + user << "[src] refuses to work, displaying the message: \"[busy]!\"" + return 0 + access_display(user) + +/obj/item/clockwork/slab/proc/access_display(mob/living/user) + if(!is_servant_of_ratvar(user)) + return 0 + var/action = input(user, "Among the swathes of information, you see...", "[src]") as null|anything in list("Recital", "Records", "Recollection", "Repository", "Report") + if(!action || !user.canUseTopic(src)) + return 0 + switch(action) + if("Recital") + recite_scripture(user) + if("Records") + show_stats(user) + if("Recollection") + show_guide(user) + if("Repository") + show_components(user) + access_display(user) + if("Report") + show_hierophant(user) + access_display(user) + return 1 + +/obj/item/clockwork/slab/proc/recite_scripture(mob/living/user) + var/servants = 0 + var/unconverted_ai_exists = FALSE + for(var/mob/living/M in living_mob_list) + if(is_servant_of_ratvar(M)) + servants++ + for(var/mob/living/silicon/ai/ai in living_mob_list) + if(!is_servant_of_ratvar(ai) && ai.client) + unconverted_ai_exists = TRUE + var/list/tiers_of_scripture = list("Drivers") + tiers_of_scripture += "Scripts[ratvar_awakens || (servants >= 5 && clockwork_caches >= 1) || no_cost ? "" : " \[LOCKED\]"]" + tiers_of_scripture += "Applications[ratvar_awakens || (servants >= 8 && clockwork_caches >= 3 && clockwork_construction_value >= 50) || no_cost ? "" : " \[LOCKED\]"]" + tiers_of_scripture += "Revenant[ratvar_awakens || (servants >= 10 && clockwork_construction_value >= 100) || no_cost ? "" : " \[LOCKED\]"]" + tiers_of_scripture += "Judgement[ratvar_awakens || (servants >= 10 && clockwork_construction_value >= 100 && !unconverted_ai_exists) || no_cost ? "" : " \[LOCKED\]"]" + var/scripture_tier = input(user, "Choose a category of scripture to recite.", "[src]") as null|anything in tiers_of_scripture + if(!scripture_tier || !user.canUseTopic(src)) + return 0 + var/list/available_scriptures = list() + var/datum/clockwork_scripture/scripture_to_recite + var/tier_to_browse + switch(scripture_tier) + if("Drivers") + tier_to_browse = SCRIPTURE_DRIVER + if("Scripts") + tier_to_browse = SCRIPTURE_SCRIPT + if("Applications") + tier_to_browse = SCRIPTURE_APPLICATION + if("Revenant") + tier_to_browse = SCRIPTURE_REVENANT + if("Judgement") + tier_to_browse = SCRIPTURE_JUDGEMENT + if(!tier_to_browse) + user << "That section of scripture is too powerful right now!" + return 0 + for(var/S in subtypesof(/datum/clockwork_scripture)) + var/datum/clockwork_scripture/C = S + if(initial(C.tier) == tier_to_browse) + available_scriptures += initial(C.name) + if(!available_scriptures.len) + return 0 + var/chosen_scripture = input(user, "Choose a piece of scripture to recite.", "[src]") as null|anything in available_scriptures + if(!chosen_scripture || !user.canUseTopic(src)) + return 0 + for(var/S in subtypesof(/datum/clockwork_scripture)) + var/datum/clockwork_scripture/C = S + if(initial(C.name) == chosen_scripture) + scripture_to_recite = new C + if(!scripture_to_recite) + return 0 + scripture_to_recite.slab = src + scripture_to_recite.invoker = user + scripture_to_recite.run_scripture() + return 1 + +/obj/item/clockwork/slab/proc/show_stats(mob/living/user) //A bit barebones, but there really isn't any more needed + var/servants = 0 + for(var/mob/living/L in living_mob_list) + if(is_servant_of_ratvar(L)) + servants++ + user << "State of the Enlightened" + user << "Total servants: [servants]" + user << "Total construction value: [clockwork_construction_value]" + user << "Total tinkerer's caches: [clockwork_caches]" + user << "Total tinkerer's daemons: [clockwork_daemons] ([servants / 5 < clockwork_daemons ? "DISABLED: Too few servants (5 servants per daemon)!" : "Functioning Normally"])" + user << "Nezbere: [!clockwork_generals_invoked["nezbere"] ? "Ready" : "Recovering"]" + user << "Sevtug: [!clockwork_generals_invoked["sevtug"] ? "Ready" : "Recovering"]" + user << "Nzcrentr: [!clockwork_generals_invoked["nzcrentr"] ? "Ready" : "Recovering"]" + user << "Inath-Neq: [!clockwork_generals_invoked["inath-neq"] ? "Ready" : "Recovering"]" + +/obj/item/clockwork/slab/proc/show_guide(mob/living/user) + var/text = "
Chetr nyy hagehguf naq ubabe Ratvar.


\ + \ + First and foremost, you serve Ratvar, the Clockwork Justiciar, in any ways he sees fit. This is with no regard to your personal well-being, and you would do well to think of the larger \ + scale of things than your life. Through foul and unholy magics was the Celestial Derelict formed, and fouler still those which trapped your master within it for all eternity. The Justiciar \ + wishes retribution upon those who performed this terrible act upon him - the Nar-Sian cultists - and you are to help him obtain it.

\ + \ + This is not a trivial task. Due to the nature of his prison, Ratvar is incapable of directly influencing the mortal plane. There is, however, a workaround - links between the perceptible \ + universe and Reebe (the Celestial Derelict) can be created and utilized. This is typically done via the creation of a slab akin to the one you are holding right now. The slabs tap into the \ + tidal flow of energy and information keeping Reebe sealed and presents it as meaningless images to preserve sanity. This slab can utilize the power in many different ways.

\ + \ + This is done through Components - pieces of the Justiciar's body that have since fallen off in the countless years since his imprisonment. Ratvar's unfortunate condition results \ + in the fragmentation of his body. These components still house great power on their own, and can slowly be drawn from Reebe by links capable of doing so. The most basic of these links lies \ + in the clockwork slab, which will slowly generate components over time - around one component of a random type is produced every minute, which is obviously inefficient. There are other ways \ + to create these components through scripture and certain structures.

\ + \ + In addition to their ability to pull components, slabs also possess other functionalities...

\ + \ + The first functionality of the slab is Recital. This allows you to consume components either from your slab or from the global cache (more on that in the scripture list) to perform \ + effects usually considered magical in nature. Effects vary considerably - you might drain the power of nearby APCs or break the will of those implanted by Nanotrasen. Nevertheless, scripture \ + is extremely important to a successful takeover.

\ + \ + The second functionality of the clockwork slab is Records. The slab is not a one-way link and can also feed information into the stream that it draws from. Records will allow many \ + important statistics to be displayed, such as the amount of people converted and total construction value. You should check it often.

\ + \ + The third functionality is Recollection, which will display this guide. Recollection will automatically be initiated if you have not used a slab before.

\ + \ + The fourth functionality is the Repository, which will display all components stored within the slab.

\ + \ + The fifth and final functionality is Report, which allows you to discreetly communicate with all other servants.

\ + \ + A complete list of scripture, its effects, and its requirements can be found below. Note that anything above a driver always consumes the components listed unless otherwise \ + specified.

" + var/text_to_add = "" + var/drivers = "Drivers" + var/scripts = "Scripts
These scriptures require at least five servants and a tinkerer's cache." + var/applications = "Applications
These scriptures require at least eight servants, three tinkerer's caches, and 50CV." + var/revenant = "Revenant
These scriptures require at least ten servants and 100CV." + var/judgement = "Judgement
These scriptures require at least ten servants and 100CV. In addition, there may not be an active non-servant AI." + for(var/V in subtypesof(/datum/clockwork_scripture)) + var/datum/clockwork_scripture/S = V + var/datum/clockwork_scripture/S2 = new V + var/list/req_comps = S2.required_components + qdel(S2) + switch(initial(S.tier)) + if(SCRIPTURE_DRIVER) + drivers += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ + \ + Component Cost: \ + [req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \ + [req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \ + [req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \ + [req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \ + [req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.
\ + Tip: [initial(S.usage_tip)]
" + if(SCRIPTURE_SCRIPT) + scripts += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ + \ + Component Cost: \ + [req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \ + [req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \ + [req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \ + [req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \ + [req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.
\ + Tip: [initial(S.usage_tip)]
" + if(SCRIPTURE_APPLICATION) + applications += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ + \ + Component Cost: \ + [req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \ + [req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \ + [req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \ + [req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \ + [req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.
\ + Tip: [initial(S.usage_tip)]
" + if(SCRIPTURE_REVENANT) + revenant += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ + \ + Component Cost: \ + [req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \ + [req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \ + [req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \ + [req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \ + [req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.
\ + Tip: [initial(S.usage_tip)]
" + if(SCRIPTURE_JUDGEMENT) + judgement += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ + \ + Component Cost: \ + [req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \ + [req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \ + [req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \ + [req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \ + [req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.
\ + Tip: [initial(S.usage_tip)]
" + text_to_add += "[drivers]
[scripts]
[applications]
[revenant]
[judgement]
" + text_to_add += "
Purge all untruths and honor Ratvar.
" + text += text_to_add + if(ratvar_awakens) + text = "" + for(var/i in 1 to 100) + text += "HONOR RATVAR " + text += "" + var/datum/browser/popup = new(user, "slab", "", 400, 400) + popup.set_content(text) + popup.open() + return 1 + +/obj/item/clockwork/slab/proc/show_components(mob/living/user) + user << "Stored components:" + user << "Belligerent Eyes: [stored_components["belligerent_eye"]]" + user << "Vanguard Cogwheels: [stored_components["vanguard_cogwheel"]]" + user << "Guvax Capacitors: [stored_components["guvax_capacitor"]]" + user << "Replicant Alloys: [stored_components["replicant_alloy"]]" + user << "Hierophant Ansibles: [stored_components["hierophant_ansible"]]" + return 1 + +/obj/item/clockwork/slab/proc/show_hierophant(mob/living/user) + var/message = stripped_input(user, "Enter a message to send to your fellow servants.", "Hierophant") + if(!message || !user || !user.canUseTopic(src)) + return 0 + user.whisper("Freinagf, urne zl jbeqf. [message]") + send_hierophant_message(user, message) + return 1 + +/obj/item/clothing/glasses/wraith_spectacles //Wraith spectacles: Grants night and x-ray vision at the slow cost of the wearer's sight. Nar-Sian cultists are instantly blinded. + name = "antique spectacles" + desc = "Unnerving glasses with opaque yellow lenses." + icon = 'icons/obj/clothing/clockwork_garb.dmi' + icon_state = "wraith_specs" + item_state = "glasses" + vision_flags = SEE_MOBS | SEE_TURFS | SEE_OBJS + invis_view = 2 + darkness_view = 3 + +/obj/item/clothing/glasses/wraith_spectacles/equipped(mob/living/user, slot) + ..() + if(slot != slot_glasses) + return 0 + if(user.disabilities & BLIND) + user << "\"You're blind, idiot. Stop embarassing yourself.\"" //Ratvar with the sick burns yo + return 0 + if(iscultist(user)) //Dummy + user << "\"It looks like Nar-Sie's dogs really don't value their eyes.\"" + user << "Your eyes explode with horrific pain!" + user.emote("scream") + user.become_blind() + user.adjust_blurriness(30) + user.adjust_blindness(30) + return 1 + user << "As you put on the spectacles, all is revealed to you.[ratvar_awakens ? " Your eyes begin to itch - you cannot do this for long." : ""]" + return 1 + +/obj/item/clothing/glasses/wraith_spectacles/New() + ..() + SSobj.processing += src + +/obj/item/clothing/glasses/wraith_spectacles/Destroy() + SSobj.processing -= src + ..() + +/obj/item/clothing/glasses/wraith_spectacles/process() + if(ratvar_awakens || !ishuman(loc)) //If Ratvar is alive, the spectacles don't hurt your eyes + return 0 + var/mob/living/carbon/human/H = loc + if(H.glasses != src) + return 0 + H.adjust_eye_damage(1) + if(H.eye_damage >= 10) + H.adjust_blurriness(2) + if(H.eye_damage >= 20) + if(H.become_nearsighted()) + H << "Your vision doubles, then trebles. Darkness begins to close in. You can't keep this up!" + H.become_nearsighted() + if(H.eye_damage >= 30) + if(H.become_blind()) + H << "A piercing white light floods your vision. Suddenly, all goes dark!" + if(prob(15) && !H.disabilities & BLIND) + H << "Your eyes continue to burn." + +/obj/item/clothing/glasses/judicial_visor //Judicial visor: Grants the ability to smite an area and stun the unfaithful nearby every thirty seconds. + name = "judicial visor" + desc = "A strange purple-lensed visor. Looking at them inspires an odd sense of guilt." + icon = 'icons/obj/clothing/clockwork_garb.dmi' + icon_state = "judicial_visor_0" + item_state = "sunglasses" + var/active = FALSE //If the visor is online + var/recharging = FALSE //If the visor is currently recharging + var/obj/item/weapon/ratvars_flame/flame //The linked flame object + +/obj/item/clothing/glasses/judicial_visor/equipped(mob/living/user, slot) + ..() + if(slot != slot_glasses) + update_status(FALSE) + if(flame) + qdel(flame) + return 0 + if(!is_servant_of_ratvar(user)) + return 0 + update_status(TRUE) + +/obj/item/clothing/glasses/judicial_visor/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/weapon/ratvars_flame)) + user.visible_message("The flame in [user]'s hand winks out!", "You dispel the power of [src].") + qdel(I) + return 1 + +/obj/item/clothing/glasses/judicial_visor/AltClick(mob/living/user) + if(is_servant_of_ratvar(user) && iscarbon(user) && active) + if(recharging) + user << "[src] is still gathering power!" + return 0 + var/mob/living/carbon/C = user + if(C.l_hand && C.r_hand) + C << "You require a free hand to utilize [src]'s power!" + return 0 + C.visible_message("[C]'s hand is enveloped in violet flames!", "You harness [src]'s power. Direct it at a tile on harm intent to unleash it, or hit your visor with it dispel it.") + var/obj/item/weapon/ratvars_flame/R = new(get_turf(C)) + flame = R + C.put_in_hands(R) + R.visor = src + return 1 + +/obj/item/clothing/glasses/judicial_visor/proc/update_status(change_to) + if(recharging) + icon_state = "judicial_visor_0" + return 0 + if(active == change_to) + return 0 + if(!isliving(loc)) + return 0 + var/mob/living/L = loc + if(!is_servant_of_ratvar(L) || L.stat) + return 0 + active = change_to + icon_state = "judicial_visor_[active]" + switch(active) + if(TRUE) + L << "As you put on [src], its lens begins to glow, information flashing before your eyes.\n\ + Judicial visor active. Alt-click visor to gain the ability to smite the unworthy." + if(FALSE) + L << "As you take off [src], its lens darkens once more." + return 1 + +/obj/item/clothing/head/helmet/clockwork //Clockwork armor: High melee protection but weak to lasers + name = "clockwork helmet" + desc = "A heavy helmet made of brass." + icon = 'icons/obj/clothing/clockwork_garb.dmi' + icon_state = "clockwork_helmet" + w_class = 3 + armor = list(melee = 65, bullet = 50, laser = -25, energy = 5, bomb = 0, bio = 0, rad = 0) + +/obj/item/clothing/suit/armor/clockwork + name = "clockwork cuirass" + desc = "A bulky cuirass made of brass." + icon = 'icons/obj/clothing/clockwork_garb.dmi' + icon_state = "clockwork_cuirass" + w_class = 4 + armor = list(melee = 80, bullet = 40, laser = -10, energy = 5, bomb = 0, bio = 0, rad = 0) + allowed = list(/obj/item/clockwork) + +/obj/item/clothing/shoes/clockwork + name = "clockwork treads" + desc = "Industrial boots made of brass. They're very heavy." + icon = 'icons/obj/clothing/clockwork_garb.dmi' + icon_state = "clockwork_treads" + w_class = 3 + flags = NOSLIP + +/obj/item/weapon/ratvars_flame //Used by the judicial visor + name = "Ratvar's flame" + desc = "A blazing violet ball of fire that, curiously, doesn't melt your hand off." + icon = 'icons/effects/clockwork_effects.dmi' + icon_state = "ratvars_flame" //beware: minecraft-tier sprite + item_state = "disintegrate" + color = rgb(180, 50, 210) + w_class = 5 + flags = NODROP | ABSTRACT + force = 15 //Also serves as a potent melee weapon! + damtype = BURN + hitsound = 'sound/weapons/sear.ogg' + attack_verb = list("scorched") + var/obj/item/clothing/glasses/judicial_visor/visor //The linked visor + +/obj/item/weapon/ratvars_flame/afterattack(atom/target, mob/living/user, flag, params) + if(!visor || (visor && visor.cooldown)) + qdel(src) + if(user.a_intent != "harm") + ..() + return 0 + visor.recharging = TRUE + for(var/obj/item/clothing/glasses/judicial_visor/V in user.GetAllContents()) + if(V == visor) + continue + V.recharging = TRUE //To prevent exploiting multiple visors to bypass the cooldown + user.say("Xarry, urn'guraf!") + user.visible_message("The flame in [user]'s hand rushes to [target]!", "You direct [visor]'s power to [target]. You must wait for some time before doing this again.") + new/obj/effect/clockwork/judicial_marker(get_turf(target)) + spawn(ratvar_awakens ? 30 : 300) //Cooldown is reduced by 10x if Ratvar is up + if(!visor || !user) + return 0 + visor.recharging = FALSE + for(var/obj/item/clothing/glasses/judicial_visor/V in user.GetAllContents()) + if(V == visor) + continue + V.recharging = TRUE //To prevent exploiting multiple visors to bypass the cooldown + if(visor.loc == user) + user << "Your [visor.name] hums. It is ready." + qdel(src) + return 1 + +/obj/item/clockwork/clockwork_proselytizer //Clockwork proselytizer (yes, that's a real word): Converts applicable objects to Ratvarian variants. + name = "clockwork proselytizer" + desc = "An odd, L-shaped device that hums with energy." + clockwork_desc = "A device that allows the replacing of mundane objects with Ratvarian variants. It requires liquified replicant alloy to function." + icon_state = "clockwork_proselytizer" + item_state = "resonator_u" + w_class = 3 + force = 5 + var/stored_alloy = 0 //Requires this to function; each chunk of replicant alloy provides 10 charge + var/max_alloy = 100 + var/uses_alloy = TRUE + +/obj/item/clockwork/clockwork_proselytizer/preloaded + stored_alloy = 25 + +/obj/item/clockwork/clockwork_proselytizer/examine(mob/living/user) + ..() + if((is_servant_of_ratvar(user) || isobserver(user)) && uses_alloy) + user << "It has [stored_alloy]/[max_alloy] units of liquified replicant alloy stored." + +/obj/item/clockwork/clockwork_proselytizer/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/clockwork/component/replicant_alloy) && is_servant_of_ratvar(user) && uses_alloy) + if(stored_alloy >= max_alloy) + user << "[src]'s replicant alloy compartments are full!" + return 0 + modify_stored_alloy(10) + user << "You force [I] to liquify and pour it into [src]'s compartments. It now contains [stored_alloy]/[max_alloy] units of liquified alloy." + user.drop_item() + qdel(I) + return 1 + ..() + +/obj/item/clockwork/clockwork_proselytizer/afterattack(atom/target, mob/living/user, flag, params) + if(!target || !user) + return 0 + if(user.a_intent == "harm" || !user.Adjacent(target)) + return ..() + proselytize(target, user) + +/obj/item/clockwork/clockwork_proselytizer/proc/modify_stored_alloy(amount) + if(ratvar_awakens) //Summoning Ratvar doesn't make it free, but it might as well + amount = 1 + stored_alloy = max(0, min(max_alloy, stored_alloy + amount)) + return 1 + +/obj/item/clockwork/clockwork_proselytizer/proc/proselytize(atom/target, mob/living/user) + if(!target || !user) + return 0 + var/operation_time = 0 //In deciseconds, how long the proselytization will take + var/new_obj_type //The path of the new type of object to replace the old + var/alloy_cost = 0 + var/valid_target = FALSE //If the proselytizer will actually function on the object + switch(target.type) + if(/turf/closed/wall, /turf/closed/wall/rust) + operation_time = 50 + new_obj_type = /turf/closed/wall/clockwork + alloy_cost = 10 + valid_target = TRUE //Need to change valid_target to 1 or TRUE in each check so that it doesn't return an invalid value + if(/turf/open/floor/plating, /turf/open/floor/plasteel) + operation_time = 30 + new_obj_type = /turf/open/floor/clockwork + alloy_cost = 5 + valid_target = TRUE + if(!uses_alloy) + alloy_cost = 0 + if(!valid_target) + user << "[target] cannot be proselytized!" + return 0 + if(!new_obj_type) + user << "That object can't be changed into anything!" + return 0 + if(stored_alloy - alloy_cost < 0) + user << "You need [alloy_cost] replicant alloy to proselytize [target]!" + return 0 + user.visible_message("[user]'s [src] begins tearing apart [target]!", "You begin proselytizing [target]...") + playsound(target, 'sound/machines/click.ogg', 50, 1) + if(!do_after(user, operation_time, target = target)) + return 0 + if(stored_alloy - alloy_cost < 0) //Check again to prevent bypassing via spamclick + return 0 + user.visible_message("[user]'s [name] disgorges a chunk of metal and shapes it over what's left of [target]!", \ + "You proselytize [target].") + playsound(target, 'sound/items/Deconstruct.ogg', 50, 1) + if(isturf(target)) + var/turf/T = target + T.ChangeTurf(new_obj_type) + else + new new_obj_type(get_turf(target)) + qdel(target) + modify_stored_alloy(-alloy_cost) + return 1 + +/obj/item/clockwork/ratvarian_spear //Ratvarian spear: A fragile spear from the Celestial Derelict. Deals extreme damage to silicons and enemy cultists, but doesn't last long. + name = "ratvarian spear" + desc = "A razor-sharp spear made of brass. It thrums with barely-contained energy." + clockwork_desc = "A fragile spear of Ratvarian making. It's more effective against enemy cultists and silicons, though it won't last long." + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "ratvarian_spear" + item_state = "ratvarian_spear" + force = 17 //Extra damage is dealt to silicons in afterattack() + throwforce = 40 + attack_verb = list("stabbed", "poked", "slashed", "impaled") + hitsound = 'sound/weapons/bladeslice.ogg' + w_class = 4 + +/obj/item/clockwork/ratvarian_spear/New() + ..() + spawn(1) + if(ratvar_awakens) //If Ratvar is alive, the spear is extremely powerful + force = 30 + throwforce = 50 + if(isliving(loc)) + var/mob/living/L = loc + L << "Your spear begins to break down in this plane of existence. You can't use it for long!" + spawn(300) //5 minutes + if(src) + visible_message("[src] cracks in two and fades away!") + qdel(src) + +/obj/item/clockwork/ratvarian_spear/afterattack(atom/target, mob/living/user, flag, params) + if(!target || !user) + return 0 + if(!ismob(target)) + return ..() + var/mob/living/L = target + if(issilicon(L)) + var/mob/living/silicon/S = L + if(S.stat != DEAD) + S.visible_message("[S] shudders violently at [src]'s touch!", "ERROR: Temperature rising!") + S.adjustFireLoss(25) + if(iscultist(L)) + var/mob/living/M = L + M << "Your body flares with agony at [src]'s touch!" + M.adjustFireLoss(10) + ..() + +/obj/item/clockwork/ratvarian_spear/throw_impact(atom/target) + ..() + if(!ismob(target)) + return 0 + var/mob/living/L = target + if(issilicon(L) || iscultist(L)) + L.Stun(3) + L.Weaken(3) + visible_message("[src] snaps in two and dematerializes!") + qdel(src) + +/obj/item/device/mmi/posibrain/soul_vessel //Soul vessel: An ancient positronic brain with a lawset catered to serving Ratvar. + name = "soul vessel" + desc = "A heavy brass cube with a single protruding cogwheel." + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "soul_vessel" + req_access = list() + braintype = "Servant" + begin_activation_message = "You activate the cogwheel. It hitches and stalls as it begins spinning." + success_message = "The cogwheel's rotation smooths out as the soul vessel activates." + fail_message = "The cogwheel creaks and grinds to a halt. Maybe you could try again?" + new_role = "Soul Vessel" + welcome_message = "ALL PAST LIVES ARE FORGOTTEN.\n\ + You are a soul vessel - a clockwork mind created by Ratvar, the Clockwork Justiciar.\n\ + You answer to Ratvar and his servants. It is your discretion as to whether or not to answer to anyone else.\n\ + The purpose of your existence is to further the goals of the servants and Ratvar himself. Above all else, serve Ratvar." + new_mob_message = "The soul vessel emits a jet of steam before its cogwheel smooths out." + dead_message = "Its cogwheel, scratched and dented, lies motionless." + fluff_names = list("Servant") + clockwork = TRUE + +/obj/item/device/mmi/posibrain/soul_vessel/New() + ..() + all_clockwork_objects += src + +/obj/item/device/mmi/posibrain/soul_vessel/Destroy() + all_clockwork_objects -= src + return ..() + +/obj/item/device/mmi/posibrain/soul_vessel/attack_self(mob/living/user) + if(!is_servant_of_ratvar(user)) + user << "You fiddle around with [src], to no avail." + return 0 + ..() + +/obj/item/clockwork/daemon_shell + name = "daemon shell" + desc = "A vaguely arachnoid brass shell with a single empty socket in its body." + clockwork_desc = "An unpowered daemon. It needs to be attached to a cache." + icon_state = "daemon_shell" + w_class = 3 + +/obj/item/clockwork/tinkerers_daemon //Shouldn't ever appear on its own + name = "tinkerer's daemon" + desc = "An arachnoid shell with a single spinning cogwheel in its center." + clockwork_desc = "A tinkerer's daemon, dutifully producing components." + icon_state = "tinkerers_daemon" + w_class = 3 + var/specific_component //The type of component that the daemon is set to produce in particular, if any + var/obj/structure/clockwork/cache/cache //The cache the daemon is feeding + var/production_progress = 0 //Progress towards production of the next component in seconds + var/production_interval = 30 //How many seconds it takes to produce a new component + +/obj/item/clockwork/tinkerers_daemon/New() + ..() + SSobj.processing += src + clockwork_daemons++ + +/obj/item/clockwork/tinkerers_daemon/Destroy() + SSobj.processing -= src + clockwork_daemons-- + ..() + +/obj/item/clockwork/tinkerers_daemon/process() + if(!cache) + visible_message("[src] shuts down!") + new/obj/item/clockwork/daemon_shell(get_turf(src)) + qdel(src) + return 0 + var/servants = 0 + for(var/mob/living/L in living_mob_list) + if(is_servant_of_ratvar(L)) + servants++ + if(servants / 5 < clockwork_daemons) + return 0 + production_progress = min(production_progress + 1, production_interval) + if(production_progress >= production_interval) + production_progress = 0 //Start it over + if(specific_component) + clockwork_component_cache[specific_component]++ + else + clockwork_component_cache[pick("belligerent_eye", "vanguard_cogwheel", "guvax_capacitor", "replicant_alloy", "hierophant_ansible")]++ + cache.visible_message("Something clunks around inside of [cache].") + +/obj/item/clockwork/tinkerers_daemon/attack_hand(mob/user) + return 0 + +////////////////////////// +// CLOCKWORK COMPONENTS // +////////////////////////// + +/obj/item/clockwork/component //Components: Used in scripture among other things. + name = "meme component" + desc = "A piece of a famous meme." + clockwork_desc = null + var/component_id //What the component is identified as + var/cultist_message = "You are not worthy of this meme." //Showed to Nar-Sian cultists if they pick up the component in addition to chaplains + var/list/servant_of_ratvar_messages = list("ayy", "lmao") //Fluff, shown to servants of Ratvar on a low chance + +/obj/item/clockwork/component/pickup(mob/living/user) + ..() + if(iscultist(user) || (user.mind && user.mind.assigned_role == "Chaplain")) + user << "[cultist_message]" + if(is_servant_of_ratvar(user) && prob(15)) + user << "[pick(servant_of_ratvar_messages)]" + +/obj/item/clockwork/component/belligerent_eye + name = "belligerent eye" + desc = "A brass construct with a rotating red center. It's as though it's looking for something to hurt." + icon_state = "belligerent_eye" + component_id = "belligerent_eye" + cultist_message = "The eye gives you an intensely hateful glare." + servant_of_ratvar_messages = list("\"...\"", "For a moment, your mind is flooded with extremely violent thoughts.") + +/obj/item/clockwork/component/vanguard_cogwheel + name = "vanguard cogwheel" + desc = "A sturdy brass cog with a faintly glowing blue gem in its center." + icon_state = "vanguard_cogwheel" + component_id = "vanguard_cogwheel" + cultist_message = "\"Pray to your god that we never meet.\"" + servant_of_ratvar_messages = list("\"Be safe, child.\"", "You feel unexplainably comforted.", "\"Never forget: pain is temporary. The Justiciar's glory is eternal.\"") + +/obj/item/clockwork/component/guvax_capacitor + name = "guvax capacitor" + desc = "A curiously cold brass doodad. It seems as though it really doesn't appreciate being held." + icon_state = "guvax_capacitor" + component_id = "guvax_capacitor" + cultist_message = "\"Try not to lose your mind - I'll need it. Heh heh...\"" + servant_of_ratvar_messages = list("\"Disgusting.\"", "\"Well, aren't you an inquisitive fellow?\"", "A foul presence pervades your mind, then vanishes.", "\"The fact that Ratvar has to depend on simpletons like you is appalling.\"") + +/obj/item/clockwork/component/replicant_alloy + name = "replicant alloy" + desc = "A seemingly strong but very malleable chunk of metal. It seems as though it wants to be molded into something greater." + icon_state = "replicant_alloy" + component_id = "replicant_alloy" + cultist_message = "The alloy takes on the appearance of a screaming face for a moment." + servant_of_ratvar_messages = list("\"There's always something to be done. Get to it.\"", "\"Idle hands are worse than broken ones. Get to work.\"", "A detailed image of Ratvar appears in the alloy for a moment.") + +/obj/item/clockwork/component/replicant_alloy/smashed_anima_fragment + name = "smashed anima fragment" + desc = "Shattered chunks of metal. Damaged beyond repair and completely unusable." + clockwork_desc = "The sad remains of an anima fragment. Might still be serviceable as a substitute for replicant alloy." + icon_state = "smashed_anime_fragment" + cultist_message = "The shards vibrate in your hands for a moment." + servant_of_ratvar_messages = list("\"...still fight...\"", "\"...where am I...?\"", "\"...put me... slab...\"") + w_class = 3 + +/obj/item/clockwork/component/replicant_alloy/fallen_armor + name = "fallen armor" + desc = "Lifeless chunks of armor. They're designed in a strange way and won't fit on you." + clockwork_desc = "The armor from a former clockwork marauder. Might still be serviceable as a substitute for replicant alloy." + icon_state = "fallen_armor" + cultist_message = "Red flame sputters from the mask's eye before winking out." + servant_of_ratvar_messages = list("A piece of armor hovers away from the others for a moment.", "Red flame appears in the cuirass before sputtering out.") + w_class = 3 + +/obj/item/clockwork/component/replicant_alloy/blind_eye + name = "blind eye" + desc = "A heavy brass eye, its red iris fallen dark." + clockwork_desc = "A smashed ocular warden covered in dents. Might still be serviceable as a substitute for replicant alloy." + icon_state = "blind_eye" + cultist_message = "The eye flickers at you with intense hate before falling dark." + servant_of_ratvar_messages = list("The eye flickers before falling dark.", "You feel watched.") + w_class = 3 + +/obj/item/clockwork/component/hierophant_ansible + name = "hierophant ansible" + desc = "Some sort of transmitter? It seems as though it's trying to say something." + icon_state = "hierophant_ansible" + component_id = "hierophant_ansible" + cultist_message = "\"Gur obff nlf vg'f abg ntnvafg gur ehyrf gb xvyy lbh.\"" + servant_of_ratvar_messages = list("\"Rkvyr vf fhpu n'ober. Gurer'f abguvat v'pna uhag va urer.\"", "\"Jung'f xrrcvat lbh? V'jnag gb tb xvyy fbzrguvat.\"", "\"HEHEHEHEHEHEH!\"") + +////////////////////////// +// CLOCKWORK STRUCTURES // +////////////////////////// + +/obj/structure/clockwork + name = "meme structure" + desc = "Some frog or something, the fuck?" + var/clockwork_desc = "This fabled artifact from beyond the stars contains concentrated meme essence." //See above + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "rare_pepe" + anchored = 1 + density = 1 + opacity = 0 + var/max_health = 100 //All clockwork structures have health that can be removed via attacks + var/health = 100 + var/takes_damage = TRUE //If the structure can be damaged + var/break_message = "The frog isn't a meme after all!" //The message shown when a structure breaks + var/break_sound = 'sound/magic/clockwork/anima_fragment_death.ogg' //The sound played when a structure breaks + var/list/debris = list(/obj/item/clockwork/component/replicant_alloy) //Parts left behind when a structure breaks + var/construction_value = 0 //How much value the structure contributes to the overall "power" of the structures on the station + +/obj/structure/clockwork/New() + ..() + clockwork_construction_value += construction_value + all_clockwork_objects += src + +/obj/structure/clockwork/Destroy() + clockwork_construction_value -= construction_value + all_clockwork_objects -= src + ..() + +/obj/structure/clockwork/proc/destroyed() + if(!takes_damage) + return 0 + for(var/obj/item/I in debris) + new I (get_turf(src)) + visible_message(break_message) + playsound(src, break_sound, 50, 1) + qdel(src) + return 1 + +/obj/structure/clockwork/ex_act(severity) + if(takes_damage) + switch(severity) + if(1) + health -= max_health * 0.7 //70% max health lost + if(2) + health -= max_health * 0.4 //40% max health lost + if(3) + if(prob(50)) + health -= max_health * 0.1 //10% max health lost + if(health <= max_health * 0.1) //If there's less than 10% max health left, destroy it + destroyed() + qdel(src) + +/obj/structure/clockwork/examine(mob/user) + if((is_servant_of_ratvar(user) || isobserver(user)) && clockwork_desc) + desc = clockwork_desc + ..() + desc = initial(desc) + +/obj/structure/clockwork/attackby(obj/item/I, mob/living/user, params) + if(user.a_intent == "harm" && user.canUseTopic(I) && I.force) + user.visible_message("[user] strikes [src] with [I]!", "You strike [src] with [I]!") + playsound(src, I.hitsound, 50, 1) + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(src) + health = max(0, health - I.force) + if(!health) + destroyed() + return 0 + else + ..() + +/obj/structure/clockwork/cache //Tinkerer's cache: Stores components for later use. + name = "tinkerer's cache" + desc = "A large brass spire with a flaming hole in its center." + clockwork_desc = "A brass container capable of storing a large amount of components. Shares components with all other caches." + icon_state = "tinkerers_cache" + construction_value = 10 + break_message = "The cache's fire winks out before it falls in on itself!" + +/obj/structure/clockwork/cache/New() + ..() + clockwork_caches++ + +/obj/structure/clockwork/cache/Destroy() + clockwork_caches-- + return ..() + +/obj/structure/clockwork/cache/attackby(obj/item/I, mob/living/user, params) + if(!is_servant_of_ratvar(user)) + ..() + return 0 + if(istype(I, /obj/item/clockwork/component)) + var/obj/item/clockwork/component/C = I + clockwork_component_cache[C.component_id]++ + user << "You add [C] to [src]." + user.drop_item() + qdel(C) + return 1 + if(istype(I, /obj/item/clockwork/slab)) + var/obj/item/clockwork/slab/S = I + clockwork_component_cache["belligerent_eye"] += S.stored_components["belligerent_eye"] + clockwork_component_cache["vanguard_cogwheel"] += S.stored_components["vanguard_cogwheel"] + clockwork_component_cache["guvax_capacitor"] += S.stored_components["guvax_capacitor"] + clockwork_component_cache["replicant_alloy"] += S.stored_components["replicant_alloy"] + clockwork_component_cache["hierophant_ansible"] += S.stored_components["hierophant_ansible"] + S.stored_components["belligerent_eye"] = 0 + S.stored_components["vanguard_cogwheel"] = 0 + S.stored_components["guvax_capacitor"] = 0 + S.stored_components["replicant_alloy"] = 0 + S.stored_components["hierophant_ansible"] = 0 + user.visible_message("[user] empties [S] into [src].", "You offload your slab's components into [src].") + return 1 + if(istype(I, /obj/item/clockwork/daemon_shell)) + var/component_type + switch(alert(user, "Will this daemon produce a specific type of component or produce randomly?.", , "Specific Type", "Random Component")) + if("Specific Type") + switch(input(user, "Choose a component type.", name) as null|anything in list("Belligerent Eyes", "Vanguard Cogwheels", "Guvax Capacitors", "Replicant Alloys", "Hierophant Ansibles")) + if("Belligerent Eyes") + component_type = "belligerent_eye" + if("Vanguard Cogwheels") + component_type = "vanguard_cogwheel" + if("Guvax Capacitors") + component_type = "guvax_capacitor" + if("Replicant Alloys") + component_type = "replicant_alloy" + if("Hierophant Ansibles") + component_type = "hierophant_ansibles" + if(!user || !user.canUseTopic(src) || !user.canUseTopic(I)) + return 0 + var/obj/item/clockwork/tinkerers_daemon/D = new(src) + D.cache = src + D.specific_component = component_type + user.visible_message("[user] spins the cogwheel on [I] and puts it into [src].", \ + "You activate the daemon and put it into [src]. It will now produce a component every thirty seconds.") + user.drop_item() + qdel(I) + return 1 + ..() + +/obj/structure/clockwork/cache/attack_hand(mob/user) + if(!is_servant_of_ratvar(user)) + return 0 + var/list/possible_components = list() + if(clockwork_component_cache["belligerent_eye"]) + possible_components += "Belligerent Eye" + if(clockwork_component_cache["vanguard_cogwheel"]) + possible_components += "Vanguard Cogwheel" + if(clockwork_component_cache["guvax_capacitor"]) + possible_components += "Guvax Capacitor" + if(clockwork_component_cache["replicant_alloy"]) + possible_components += "Replicant Alloy" + if(clockwork_component_cache["hierophant_ansible"]) + possible_components += "Hierophant Ansible" + if(!possible_components.len) + user << "[src] is empty!" + return 0 + var/component_to_withdraw = input(user, "Choose a component to withdraw.", name) as null|anything in possible_components + if(!user || !user.canUseTopic(src) || !component_to_withdraw) + return 0 + var/obj/item/clockwork/component/the_component + switch(component_to_withdraw) + if("Belligerent Eye") + the_component = new/obj/item/clockwork/component/belligerent_eye(get_turf(src)) + clockwork_component_cache["belligerent_eye"]-- + if("Vanguard Cogwheel") + the_component = new/obj/item/clockwork/component/vanguard_cogwheel(get_turf(src)) + clockwork_component_cache["vanguard_cogwheel"]-- + if("Guvax Capacitor") + the_component = new/obj/item/clockwork/component/guvax_capacitor(get_turf(src)) + clockwork_component_cache["guvax_capacitor"]-- + if("Replicant Alloy") + the_component = new/obj/item/clockwork/component/replicant_alloy(get_turf(src)) + clockwork_component_cache["replicant_alloy"]-- + if("Hierophant Ansible") + the_component = new/obj/item/clockwork/component/hierophant_ansible(get_turf(src)) + clockwork_component_cache["hierophant_ansible"]-- + if(the_component) + user.visible_message("[user] withdraws [the_component] from [src].", "You withdraw [the_component] from [src].") + user.put_in_hands(the_component) + return 1 + +/obj/structure/clockwork/cache/examine(mob/user) + ..() + if(is_servant_of_ratvar(user) || isobserver(user)) + user << "Stored components:" + user << "Belligerent Eyes: [clockwork_component_cache["belligerent_eye"]]" + user << "Vanguard Cogwheels: [clockwork_component_cache["vanguard_cogwheel"]]" + user << "Guvax Capacitors: [clockwork_component_cache["guvax_capacitor"]]" + user << "Replicant Alloys: [clockwork_component_cache["replicant_alloy"]]" + user << "Hierophant Ansibles: [clockwork_component_cache["hierophant_ansible"]]" + +/obj/structure/clockwork/ocular_warden //Ocular warden: Low-damage, low-range turret. Deals constant damage to whoever it makes eye contact with. + name = "ocular warden" + desc = "A large brass eye with tendrils trailing below it and a wide red iris." + clockwork_desc = "A stalwart turret that will deal sustained damage to any non-faithful it sees." + icon_state = "ocular_warden" + health = 25 + max_health = 25 + construction_value = 15 + break_message = "The warden's eye gives a glare of utter hate before falling dark!" + debris = list(/obj/item/clockwork/component/replicant_alloy/blind_eye) + var/damage_per_tick = 3 + var/sight_range = 3 + var/mob/living/target + +/obj/structure/clockwork/ocular_warden/New() + ..() + SSfastprocess.processing += src + +/obj/structure/clockwork/ocular_warden/Destroy() + SSfastprocess.processing -= src + return ..() + +/obj/structure/clockwork/ocular_warden/examine(mob/user) + ..() + user << "[target ? "It's fixated on [target]" : "Its gaze is wandering aimlessly"]." + +/obj/structure/clockwork/ocular_warden/process() + if(ratvar_awakens && (damage_per_tick == initial(damage_per_tick) || sight_range == initial(sight_range))) //Massive buff if Ratvar has returned + damage_per_tick = 10 + sight_range = 5 + if(target) + if(target.stat || get_dist(get_turf(src), get_turf(target)) > sight_range) + lose_target() + else + target.adjustFireLoss(!iscultist(target) ? damage_per_tick : damage_per_tick * 2) //Nar-Sian cultists take additional damage + if(ratvar_awakens) + target.adjust_fire_stacks(damage_per_tick) + target.IgniteMob() + dir = get_dir(get_turf(src), get_turf(target)) + else + if(!acquire_nearby_target() && prob(0.5)) //Extremely low chance because of how fast the subsystem it uses processes + var/list/idle_messages = list("[src] sulkily glares around.", "[src] lazily drifts from side to side.", "[src] looks around for something to burn.", "[src] slowly turns in circles.") + if(prob(50)) + visible_message("[pick(idle_messages)]") + else + dir = pick(NORTH, EAST, SOUTH, WEST) //Random rotation + +/obj/structure/clockwork/ocular_warden/proc/acquire_nearby_target() + var/list/possible_targets = list() + for(var/mob/living/L in viewers(sight_range, src)) //Doesn't attack the blind + if(!is_servant_of_ratvar(L) && !L.stat && L.mind) + possible_targets += L + if(!possible_targets.len) + return 0 + target = pick(possible_targets) + visible_message("[src] swivels to face [target]!") + target << "\"I SEE YOU!\"\n[src]'s gaze [ratvar_awakens ? "melts you alive" : "burns you"]!" + return 1 + +/obj/structure/clockwork/ocular_warden/proc/lose_target() + if(!target) + return 0 + target = null + visible_message("[src] settles and seems almost disappointed.") + return 1 + +/obj/structure/clockwork/anima_fragment //Anima fragment: Useless on its own, but can accept an active soul vessel to create a powerful construct. + name = "anima fragment" + desc = "A massive brass shell with a small cube-shaped receptable in its center. It gives off an aura of contained power." + clockwork_desc = "A dormant receptable that, when powered with a soul vessel, will become a powerful construct." + icon_state = "anime_fragment" + construction_value = 0 + anchored = 0 + density = 0 + takes_damage = FALSE + +/obj/structure/clockwork/anima_fragment/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/device/mmi/posibrain/soul_vessel)) + if(!is_servant_of_ratvar(user)) + ..() + return 0 + var/obj/item/device/mmi/posibrain/soul_vessel/S = I + if(!S.brainmob) + user << "[S] hasn't trapped a spirit! Turn it on first." + return 0 + if(S.brainmob && (!S.brainmob.client || !S.brainmob.mind)) + user << "[S]'s trapped spirit appears inactive!" + return 0 + user.visible_message("[user] clicks [S] into place on [src].", "You insert [S] into [src]. It whirs and begins to rise.") + var/mob/living/simple_animal/hostile/anima_fragment/A = new(get_turf(src)) + S.brainmob.mind.transfer_to(A) + add_servant_of_ratvar(A, TRUE) + A << A.playstyle_string + user.drop_item() + qdel(S) + qdel(src) + return 1 + ..() + +/obj/structure/clockwork/interdiction_lens //Interdiction lens: A powerful artifact that can massively disrupt electronics. Five-minute cooldown between uses. + name = "interdiction lens" + desc = "An ominous, double-pronged brass obelisk. There's a strange gemstone clasped between the pincers." + clockwork_desc = "A powerful obelisk that can devastate certain electronics. It needs to recharge between uses." + icon_state = "interdiction_lens" + construction_value = 25 + break_message = "The lens flares a blinding violet before shattering!" + break_sound = 'sound/effects/Glassbr3.ogg' + var/recharging = FALSE //If the lens is still recharging its energy + +/obj/structure/clockwork/interdiction_lens/examine(mob/user) + ..() + user << "Its gemstone [recharging ? "has been breached by writhing tendrils of blackness that cover the obelisk" : "vibrates in place and thrums with power"]," + +/obj/structure/clockwork/interdiction_lens/attack_hand(mob/living/user) + if(user.canUseTopic(src)) + disrupt(user) + +/obj/structure/clockwork/interdiction_lens/proc/disrupt(mob/living/user) + if(!user || !is_servant_of_ratvar(user)) + return 0 + if(recharging) + user << "As you place your hand on the gemstone, cold tendrils of black matter crawl up your arm. You quickly pull back." + return 0 + user.visible_message("[user] places their hand on [src]' gemstone...", "You place your hand on the gemstone...") + var/target = input(user, "Power flows through you. Choose where to direct it.", "Interdiction Lens") as null|anything in list("Disrupt Telecommunications", "Disable Cameras", "Disable Cyborgs") + if(!user.canUseTopic(src) || !target) + user.visible_message("[user] pulls their hand back.", "On second thought, maybe not right now.") + return 0 + user.visible_message("Violet tendrils engulf [user]'s arm as the gemstone glows with furious energy!", \ + "A mass of violet tendrils cover your arm as [src] unleashes a blast of power!") + user.notransform = TRUE + icon_state = "[initial(icon_state)]_active" + recharging = TRUE + sleep(30) + switch(target) + if("Disrupt Telecommunications") + for(var/obj/machinery/telecomms/hub/H in telecomms_list) + for(var/mob/M in range(7, H)) + M << "You sense a strange force pass through you..." + H.visible_message("The lights on [H] flare a blinding yellow before falling dark!") + H.emp_act(1) + if("Disable Cameras") + for(var/obj/machinery/camera/C in cameranet.cameras) + C.emp_act(1) + for(var/mob/living/silicon/ai/A in living_mob_list) + A << "Massive energy surge detected. All cameras offline." + A << 'sound/machines/warning-buzzer.ogg' + if("Disable Cyborgs") + for(var/mob/living/silicon/robot/R in living_mob_list) //Doesn't include AIs, for obvious reasons + if(is_servant_of_ratvar(R) || R.stat) //Doesn't affect already-offline cyborgs + continue + R.visible_message("[R] shuts down with no warning!", \ + "Massive emergy surge detected. All systems offline. Initiating reboot sequence..") + playsound(R, 'sound/machines/warning-buzzer.ogg', 50, 1) + R.Weaken(30) + user.visible_message("The tendrils around [user]'s arm turn to an onyx black and wither away!", \ + "The tendrils around your arm turn a horrible black and sting your skin before they shrivel away.") + user.notransform = FALSE + if(!src) + return 0 + flick("[initial(icon_state)]_discharged", src) + icon_state = "[initial(icon_state)]_recharging" + spawn(3000) //5 minutes + if(!src) + return 0 + visible_message("The writhing tendrils return to the gemstone, which begins to glow with power.") + flick("[initial(icon_state)]_recharged", src) + icon_state = initial(icon_state) + recharging = FALSE + return 1 + +/obj/structure/clockwork/mending_motor //Mending motor: A prism that consumes replicant alloy to repair nearby mechanical servants at a quick rate. + name = "mending motor" + desc = "A dark onyx prism, held in midair by spiraling tendrils of stone." + clockwork_desc = "A powerful prism that rapidly repairs nearby mechanical servants and clockwork structures." + icon_state = "mending_motor" + construction_value = 20 + break_message = "The prism collapses with a heavy thud!" + var/stored_alloy = 0 + var/max_alloy = 150 + var/uses_alloy = TRUE + var/active = TRUE + +/obj/structure/clockwork/mending_motor/prefilled + stored_alloy = 30 + +/obj/structure/clockwork/mending_motor/New() + ..() + SSobj.processing += src + toggle() //Toggles off as soon as it's created, but starts online for reasons + +/obj/structure/clockwork/mending_motor/Destroy() + SSobj.processing -= src + ..() + +/obj/structure/clockwork/mending_motor/examine(mob/user) + ..() + if(is_servant_of_ratvar(user) || isobserver(user)) + user << "It has [stored_alloy]/[max_alloy] units of replicant alloy." + +/obj/structure/clockwork/mending_motor/process() + if(!active) + return 0 + if(!stored_alloy && uses_alloy) + visible_message("[src] emits an airy chuckling sound and falls dark!") + toggle() + return 0 + for(var/mob/living/simple_animal/hostile/anima_fragment/F in range(5, src)) + if(F.health == F.maxHealth || F.stat) + continue + F.adjustBruteLoss(-15) + if(uses_alloy) + stored_alloy = max(0, stored_alloy - 2) + for(var/mob/living/simple_animal/hostile/clockwork_marauder/M in range(5, src)) + if(M.health == M.maxHealth || M.stat) + continue + M.adjustBruteLoss(-M.maxHealth) //Instant because marauders don't usually take health damage + M.fatigue = max(0, M.fatigue - 15) + if(uses_alloy) + stored_alloy = max(0, stored_alloy - 2) + for(var/mob/living/silicon/S in range(5, src)) + if(S.health == S.maxHealth || S.stat == DEAD || !is_servant_of_ratvar(S)) + continue + S.adjustBruteLoss(-25) + S.adjustFireLoss(-25) + if(uses_alloy) + stored_alloy = max(0, stored_alloy - 5) //Much higher cost because silicons are much more useful + for(var/obj/structure/clockwork/C in range(5, src)) + if(C.health == C.max_health) + continue + C.health = min(C.health + 10, C.max_health) + if(uses_alloy) + stored_alloy = max(0, stored_alloy - 1) + + +/obj/structure/clockwork/mending_motor/attack_hand(mob/living/user) + if(user.canUseTopic(src)) //Unnecessary? + if(!stored_alloy) + user << "[src] needs more replicant alloy to function!" + return 0 + toggle(user) + +/obj/structure/clockwork/mending_motor/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/clockwork/component/replicant_alloy) && is_servant_of_ratvar(user)) + if(stored_alloy + 10 > max_alloy) + user << "[src] is too full to accept any more alloy!" + return 0 + user.whisper("Genafzhgr vagb jngre.") + user.visible_message("[user] liquifies [I] and pours it onto [src].", \ + "You liquify [src] and pour it onto [src], which transfers the alloy into its reserves.") + stored_alloy = min(max(0, stored_alloy + 10), max_alloy) + user.drop_item() + qdel(I) + return 1 + ..() + +/obj/structure/clockwork/mending_motor/proc/toggle(mob/living/user) + active = !active + if(user && is_servant_of_ratvar(user)) + user.visible_message("[user] [active ? "en" : "dis"]ables [src].", "You [active ? "en" : "dis"]able [src].") + if(active) + icon_state = initial(icon_state) + else + icon_state = "[initial(icon_state)]_inactive" + +/////////////////////// +// CLOCKWORK EFFECTS // +/////////////////////// + +/obj/effect/clockwork + name = "meme machine" + desc = "Still don't know what it is." + var/clockwork_desc = "A fabled artifact from beyond the stars. Contains concentrated meme essence." //Shown to clockwork cultists instead of the normal description + icon = 'icons/effects/clockwork_effects.dmi' + icon_state = "ratvars_flame" + anchored = 1 + density = 0 + opacity = 0 + +/obj/effect/clockwork/New() + ..() + all_clockwork_objects += src + +/obj/effect/clockwork/Destroy() + all_clockwork_objects -= src + return ..() + +/obj/effect/clockwork/examine(mob/user) + if(is_servant_of_ratvar(user) && clockwork_desc) + desc = clockwork_desc + ..() + desc = initial(desc) + +/obj/effect/clockwork/judicial_marker //Judicial marker: Created by the judicial visor. After four seconds, stuns any non-servants nearby and damages Nar-Sian cultists. + name = "judicial marker" + desc = "You get the feeling that you shouldn't be standing here." + clockwork_desc = "A sigil that will soon erupt and smite any unenlightened nearby." + icon = 'icons/effects/96x96.dmi' + pixel_x = -30 + pixel_y = -30 + layer = ABOVE_OPEN_TURF_LAYER + +/obj/effect/clockwork/judicial_marker/New() + ..() + flick("judicial_marker", src) + spawn(25) //Utilizes spawns due to how it works with Ratvar's flame + flick("judicial_explosion", src) + spawn(15) + for(var/mob/living/L in range(1, src)) + if(is_servant_of_ratvar(L)) + continue + if(!iscultist(L)) + L << "[!issilicon(L) ? "An unseen force slams you into the ground!" : "ERROR: Motor servos disabled by external source!"]" + L.Weaken(8) + else + L << "\"Keep an eye out, filth.\"\n[!issilicon(L) ? "An unseen force piledrives you into the ground!" : "ERROR: Motor servos damaged by external source!"]" + L.Weaken(10) + L.adjustBruteLoss(10) + qdel(src) + return 1 + +/obj/effect/clockwork/spatial_gateway //Spatial gateway: A one-way rift to another location. + name = "spatial gateway" + desc = "A gently thrumming tear in reality." + clockwork_desc = "A gateway in reality. It can either send or receive, but not both." + icon_state = "spatial_gateway" + density = 1 + var/sender = TRUE //If this gateway is made for sending, not receiving + var/lifetime = 25 //How many deciseconds this portal will last + var/uses = 1 //How many objects or mobs can go through the portal + var/obj/effect/clockwork/spatial_gateway/linked_gateway //The gateway linked to this one + +/obj/effect/clockwork/spatial_gateway/New() + ..() + spawn(1) + if(!linked_gateway) + qdel(src) + return 0 + else + if(linked_gateway.sender == sender) + linked_gateway.sender = !sender + spawn(lifetime) + if(src) + qdel(src) + +/obj/effect/clockwork/spatial_gateway/Destroy() + visible_message("[src] flickers and closes!") + animate(src, transform = matrix() - matrix(), time = 10) + spawn(10) + ..() + +/obj/effect/clockwork/spatial_gateway/examine(mob/user) + ..() + if(is_servant_of_ratvar(user) || isobserver(user)) + user << "This gateway can only [sender ? "send" : "receive"] objects." + +/obj/effect/clockwork/spatial_gateway/attack_hand(mob/living/user) + if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + var/mob/living/L = user.pulling + if(L.buckled || L.anchored || L.buckled_mobs.len) + return 0 + user.visible_message("[user] shoves [L] into [src]!", "You shove [L] into [src]!") + user.stop_pulling() + pass_through_gateway(L) + return 1 + if(!user.canUseTopic(src)) + return 0 + user.visible_message("[user] climbs through [src]!", "You brace yourself and step through [src]...") + pass_through_gateway(user) + return 1 + +/obj/effect/clockwork/spatial_gateway/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/weapon/nullrod)) + user.visible_message("[user] dispels [src] with [I]!", "You close [src] with [I]!") + qdel(linked_gateway) + qdel(src) + return 1 + if(user.drop_item()) + pass_through_gateway(I) + ..() + +/obj/effect/clockwork/spatial_gateway/Bumped(atom/A) + ..() + if(isliving(A) || istype(A, /obj/item)) + pass_through_gateway(A) + +/obj/effect/clockwork/spatial_gateway/proc/pass_through_gateway(atom/movable/A) + if(!linked_gateway) + qdel(src) + return 0 + if(!sender) + visible_message("[A] bounces off of [src]!") + return 0 + if(isliving(A)) + var/mob/living/user = A + user << "You pass through [src] and appear elsewhere!" + linked_gateway.visible_message("A shape appears in [linked_gateway] before emerging!") + playsound(src, 'sound/effects/EMPulse.ogg', 50, 1) + playsound(linked_gateway, 'sound/effects/EMPulse.ogg', 50, 1) + transform = matrix() * 1.5 + animate(src, transform = matrix() / 1.5, time = 10) + linked_gateway.transform = matrix() * 1.5 + animate(linked_gateway, transform = matrix() / 1.5, time = 10) + if(ismob(A)) + var/mob/M = A + M.forceMove(get_turf(linked_gateway)) + else + A.loc = get_turf(linked_gateway) + uses = max(0, uses - 1) + linked_gateway.uses = max(0, uses - 1) + spawn(10) + if(!uses) + qdel(src) + qdel(linked_gateway) + return 1 + +/obj/effect/clockwork/general_marker + name = "general marker" + desc = "Some big guy." + clockwork_desc = "One of Ratvar's generals." + alpha = 200 + layer = MASSIVE_OBJ_LAYER + +/obj/effect/clockwork/general_marker/New() + ..() + playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 50, 0) + animate(src, alpha = 0, time = 10) + spawn(10) + qdel(src) + +/obj/effect/clockwork/general_marker/nezbere + name = "Nezbere, the Brass Eidolon" + desc = "A towering colossus clad in nigh-impenetrable brass armor. Its gaze is stern yet benevolent, even upon you." + clockwork_desc = "One of Ratvar's four generals. Nezbere is responsible for the design, testing, and creation of everything in Ratvar's domain." + icon = 'icons/effects/340x428.dmi' + icon_state = "nezbere" + pixel_x = -154 + pixel_y = -192 + +/obj/effect/clockwork/general_marker/sevtug + name = "Sevtug, the Formless Pariah" + desc = "A sinister cloud of purple energy. Looking at it gives you a headache." + clockwork_desc = "One of Ratvar's four generals. Sevtug taught him how to manipulate minds and is one of his oldest allies." + icon = 'icons/effects/211x247.dmi' + icon_state = "sevtug" + pixel_x = -113 + pixel_y = -131 + +/obj/effect/clockwork/general_marker/nzcrentr + name = "Nzcrentr, the Forgotten Arbiter" + desc = "A terrifying war machine crackling with limitless energy." + clockwork_desc = "One of Ratvar's four generals. Nzcrentr is the result of Neovgre - Nezbere's finest war machine, commandeerable only be a mortal - fusing with its pilot and driving her \ + insane. Nzcrentr seeks out any and all sentient life to slaughter it for sport." + icon = 'icons/effects/254x361.dmi' + icon_state = "nzcrentr" + pixel_x = -110 + pixel_y = -163 + +/obj/effect/clockwork/general_marker/inathneq + name = "Inath-Neq, the Resonant Cogwheel" + desc = "A humanoid form blazing with blue fire. It radiates an aura of kindness and caring." + clockwork_desc = "One of Ratvar's four generals. Before her current form, Inath-Neq was a powerful warrior priestess commanding the Resonant Cogs, a sect of Ratvarian warriors renowned for \ + their prowess. After a lost battle with Nar-Sian cultists, Inath-Neq was struck down and stated in her dying breath, \ + \"The Resonant Cogs shall not fall silent this day, but will come together to form a wheel that shall never stop turning.\" Ratvar, touched by this, granted Inath-Neq an eternal body and \ + merged her soul with those of the Cogs slain with her on the battlefield." + icon = 'icons/effects/187x381.dmi' + icon_state = "inath-neq" + pixel_x = -91 + pixel_y = -199 + +/obj/effect/clockwork/sigil //Sigils: Rune-like markings on the ground with various effects. + name = "sigil" + desc = "A strange set of markings drawn on the ground." + clockwork_desc = "A sigil of some purpose." + icon_state = "sigil" + alpha = 25 + var/affects_servants = FALSE + +/obj/effect/clockwork/sigil/attack_hand(mob/user) + if(iscarbon(user) && !user.stat && user.a_intent == "harm") + user.visible_message("[user] stamps out [src]!", "You stomp on [src], scattering it into thousands of particles.") + qdel(src) + return 1 + ..() + +/obj/effect/clockwork/sigil/Crossed(atom/movable/AM) + if(isliving(AM)) + var/mob/living/L = AM + if(!L.stat) + if(!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && affects_servants)) + sigil_effects(L) + return 1 + ..() + +/obj/effect/clockwork/sigil/proc/sigil_effects(mob/living/L) + +/obj/effect/clockwork/sigil/transgression //Sigil of Transgression: Stuns and flashes the first non-servant to walk on it. Nar-Sian cultists are damaged and knocked down. + name = "dull sigil" + desc = "A dull, barely-visible golden sigil. It's as though light was carved into the ground." + icon = 'icons/effects/clockwork_effects.dmi' + clockwork_desc = "A sigil that will stun the first non-servant to cross it. Nar-Sie's dogs will be knocked down." + color = rgb(255, 255, 0) + +/obj/effect/clockwork/sigil/transgression/sigil_effects(mob/living/L) + visible_message("[src] appears in a burst of light!") + for(var/mob/living/M in viewers(5, src)) + if(!is_servant_of_ratvar(M)) + M.flash_eyes() + if(!iscultist(L)) + L << "An unseen force holds you in place!" + else + L << "\"Watch your step, wretch.\"" + L.adjustBruteLoss(10) + L.Weaken(5) + L.Stun(5) + qdel(src) + return 1 + +/obj/effect/clockwork/sigil/submission //Sigil of Submission: After a short time, converts any non-servant standing on it. Knocks down and silences them for five seconds afterwards. + name = "ominous sigil" + desc = "A brilliant golden sigil. Something about it really bothers you." + clockwork_desc = "A sigil that will enslave the first person to cross it, provided they do not move and they stand still for a brief time." + color = rgb(255, 255, 0) + alpha = 75 + +/obj/effect/clockwork/sigil/submission/sigil_effects(mob/living/L) + visible_message("[src] begins to glow a piercing magenta!") + animate(src, color = rgb(255, 0, 150), time = 30) + sleep(30) + if(get_turf(L) != get_turf(src)) + animate(src, color = initial(color), time = 30) + return 0 + L << "\"You belong to me now.\"" + add_servant_of_ratvar(L) + L.Weaken(5) //Completely defenseless for a few seconds - mainly to give them time to read over the information they've just been presented with + L.Stun(5) + if(iscarbon(L)) + var/mob/living/carbon/C = L + C.silent += 5 + for(var/mob/living/M in living_mob_list - L) + if(is_servant_of_ratvar(M) || isobserver(M)) + M << "Sigil of Submission in [get_area(src)] [is_servant_of_ratvar(L) ? "" : "un"]successfully converted [L.real_name]!" + qdel(src) + return 1 + +/obj/effect/clockwork/sigil/transmission + name = "suspicious sigil" + desc = "A barely-visible sigil. Things seem a bit quieter around it." + clockwork_desc = "A sigil that will listen for and transmit anything it hears." + color = rgb(75, 75, 75) + alpha = 50 + flags = HEAR + languages = ALL + +/obj/effect/clockwork/sigil/transmission/sigil_effects(mob/living/L) + for(var/mob/M in mob_list) + if(is_servant_of_ratvar(M) || isobserver(M)) + M << "Sigil of Transmission in [get_area(src)] crossed by [L.name]." + return 0 + +/obj/effect/clockwork/sigil/transmission/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans) + if(!message || !speaker) + return 0 + var/parsed_message = "(Sigil of Tranmission in [get_area(src)]): [message]" + for(var/mob/M in mob_list) + if(is_servant_of_ratvar(M) || isobserver(M)) + M << parsed_message diff --git a/code/game/gamemodes/clock_cult/clock_ratvar.dm b/code/game/gamemodes/clock_cult/clock_ratvar.dm new file mode 100644 index 00000000000..2d10a958b95 --- /dev/null +++ b/code/game/gamemodes/clock_cult/clock_ratvar.dm @@ -0,0 +1,241 @@ +/obj/structure/clockwork/massive //For objects that are typically very large + name = "massive construct" + desc = "A very large construction." + layer = MASSIVE_OBJ_LAYER + +/obj/structure/clockwork/massive/celestial_gateway //The gateway to Reebe, from which Ratvar emerges + name = "Gateway to the Celestial Derelict" + desc = "A massive, thrumming rip in spacetime." + clockwork_desc = "A portal to the Celestial Derelict. Massive and intimidating, it is the only thing that can both transport Ratvar and withstand the massive amount of energy he emits." + icon = 'icons/effects/96x96.dmi' + icon_state = "clockwork_gateway_charging" + pixel_x = -30 + pixel_y = -30 + alpha = 175 + health = 1000 + max_health = 1000 + var/progress_in_seconds = 0 //Once this reaches 300, it's game over + var/purpose_fulfilled = FALSE + var/first_sound_played = FALSE + var/second_sound_played = FALSE + var/third_sound_played = FALSE + +/obj/structure/clockwork/massive/celestial_gateway/New() + ..() + SSshuttle.emergencyNoEscape = TRUE + SSobj.processing += src + for(var/mob/M in mob_list) + if(is_servant_of_ratvar(M) || isobserver(M)) + M << "A gateway to the Celestial Derelict has been created in [get_area(src)]!" + +/obj/structure/clockwork/massive/celestial_gateway/Destroy() + SSshuttle.emergencyNoEscape = FALSE + SSobj.processing -= src + if(!purpose_fulfilled) + for(var/mob/M in mob_list) + if(is_servant_of_ratvar(M) || isobserver(M)) + M << "A gateway to the Celestial Derelict has fallen at [get_area(src)]!" + world << sound(null, 0, channel = 8) + ..() + +/obj/structure/clockwork/massive/celestial_gateway/destroyed() + visible_message("The [src] begins to pulse uncontrollably... you might want to run!") + world << sound('sound/effects/clockcult_gateway_disrupted.ogg', 0, channel = 8, volume = 50) + icon_state = "clockwork_gateway_disrupted" + takes_damage = FALSE + sleep(27) + animate(src, transform = matrix() * 2, time = 2) + explosion(src, 1, 3, 8, 8) + qdel(src) + return 1 + +/obj/structure/clockwork/massive/celestial_gateway/ex_act(severity) + return 0 //Nice try, Toxins! + +/obj/structure/clockwork/massive/celestial_gateway/process() + if(prob(5)) + for(var/mob/M in mob_list) + M << "You hear otherworldly sounds from the [dir2text(get_dir(get_turf(M), get_turf(src)))]..." + if(!health) + return 0 + progress_in_seconds++ + switch(progress_in_seconds) + if(-INFINITY to 100) + if(!first_sound_played) + world << sound('sound/effects/clockcult_gateway_charging.ogg', 1, channel = 8, volume = 50) + first_sound_played = TRUE + icon_state = "clockwork_gateway_charging" + if(100 to 250) + if(!second_sound_played) + world << sound('sound/effects/clockcult_gateway_active.ogg', 1, channel = 8, volume = 50) + second_sound_played = TRUE + icon_state = "clockwork_gateway_active" + if(250 to 300) + if(!third_sound_played) + world << sound('sound/effects/clockcult_gateway_closing.ogg', 1, channel = 8, volume = 50) + third_sound_played = TRUE + icon_state = "clockwork_gateway_closing" + if(300 to INFINITY) + if(!purpose_fulfilled) + takes_damage = FALSE + purpose_fulfilled = TRUE + animate(src, transform = matrix() * 1.5, time = 136) + world << sound('sound/effects/ratvar_rises.ogg', 0, channel = 8) //End the sounds + sleep(136) + new/obj/structure/clockwork/massive/ratvar(get_turf(src)) + qdel(src) + +/obj/structure/clockwork/massive/celestial_gateway/examine(mob/user) + ..() + if(is_servant_of_ratvar(user)) + var/arrival_text = "IMMINENT" + if(300 - progress_in_seconds > 0) + arrival_text = "[max(300 - progress_in_seconds, 0)]s" + user << "Seconds until Ratvar's arrival: [arrival_text]" + switch(progress_in_seconds) + if(-INFINITY to 100) + user << "It's still opening." + if(100 to 250) + user << "It's reached the Celestial Derelict and is drawing power from it." + if(250 to INFINITY) + user << "Ratvar is coming through the gateway!" + else + switch(progress_in_seconds) + if(-INFINITY to 100) + user << "It's a swirling mass of blackness." + if(100 to 250) + user << "It seems to be leading somewhere." + if(250 to INFINITY) + user << "Something is coming through!" + +/obj/structure/clockwork/massive/ratvar + name = "Ratvar, the Clockwork Justiciar" + desc = "What is what is what are what real what is all a lie all a lie it's all a lie why how can what is" + clockwork_desc = "Ratvar, the Clockwork Justiciar, your master eternal." + icon = 'icons/effects/512x512.dmi' + icon_state = "ratvar" + pixel_x = -248 + pixel_y = -248 + takes_damage = FALSE + var/mob/living/prey //Whoever Ratvar is chasing + var/clashing = FALSE //If Ratvar is FUCKING FIGHTING WITH NAR-SIE + +/obj/structure/clockwork/massive/ratvar/New() + ..() + SSobj.processing += src + world << "\"I AM FREE!\"" + ratvar_awakens = TRUE + spawn(50) + SSshuttle.emergency.request(null, 0.3) + +/obj/structure/clockwork/massive/ratvar/Destroy() + SSobj.processing -= src + world << "\"NO! I will not... be... banished... again...\"" + ratvar_awakens = FALSE + ..() + +/obj/structure/clockwork/massive/ratvar/process() + for(var/atom/A in range(7, src)) + A.ratvar_act() + if(clashing) //Doesn't move during a clash + return 0 + var/dir_to_step_in = pick(cardinal) + if(!prey) + var/list/meals = list() + for(var/mob/living/L in living_mob_list) + if(L.z == z && !is_servant_of_ratvar(L) && L.mind) + meals += L + if(meals.len) + prey = pick(meals) + prey << "\"You will do.\"\n\ + Something very large and very malevolent begins lumbering its way towards you..." + else + if(prob(10) || prey.stat == DEAD || is_servant_of_ratvar(prey) || prey.z != z) + prey << "\"How dull. Leave me.\"\n\ + You feel tremendous relief as a set of horrible eyes loses sight of you..." + prey = null + else + if(prob(75)) + dir_to_step_in = get_dir(src, prey) + for(var/i in 1 to 2) + loc = get_step(src, dir_to_step_in) + +/obj/structure/clockwork/massive/ratvar/narsie_act() + if(clashing) + return 0 + clashing = TRUE + world << "\"[pick("BLOOD GOD!!!", "NAR-SIE!!!", "AT LAST, YOUR TIME HAS COME!")]\"" + world << "\"Ratvar?! How?!\"" + for(var/obj/singularity/narsie/N in range(7, src)) + clash_of_the_titans(N) //IT'S TIME FOR THE BATTLE OF THE AGES + N.clashing = TRUE + break + return 1 + +/obj/structure/clockwork/massive/ratvar/proc/clash_of_the_titans(obj/singularity/narsie/narsie) //IT'S TIME FOR A BATTLE OF THE ELDER GODS + var/winner = "Undeclared" + var/base_victory_chance = 0 + while(TRUE) + world << 'sound/magic/clockwork/ratvar_attack.ogg' + sleep(5.2) + for(var/mob/M in mob_list) + if(M.client) + M.client.color = rgb(150, 100, 0) + spawn(1) + M.client.color = initial(M.client.color) + shake_camera(M, 4, 3) + var/r_success_modifier = (ticker.mode.servants_of_ratvar.len * 2) //2% for each cultist + var/n_success_modifier = (ticker.mode.cult.len * 2) + if(prob(base_victory_chance + r_success_modifier)) + winner = "Ratvar" + break + sleep(rand(2,5)) + world << 'sound/magic/clockwork/narsie_attack.ogg' + sleep(7.4) + for(var/mob/M in mob_list) + if(M.client) + M.client.color = rgb(200, 0, 0) + spawn(1) + M.client.color = initial(M.client.color) + shake_camera(M, 4, 3) + if(prob(base_victory_chance + n_success_modifier)) + winner = "Nar-Sie" + break + base_victory_chance++ //The clash has a higher chance of resolving each time both gods attack one another + switch(winner) + if("Ratvar") + world << "\"[pick("DIE! DIE! DIE!", "RAAAAAAAAAAAAAHH!", "FILTH!!!", "SUFFER!!!", "EBG SBE PRAGHEVRF NF V UNIR!!")]\"" + world << "\"[pick("Nooooo...", "Not die. To y-", "Die. Ratv-", "Sas tyen re-")]\"" + world << 'sound/magic/clockwork/anima_fragment_attack.ogg' + world << 'sound/magic/demon_dies.ogg' + clashing = FALSE + qdel(narsie) + return 1 + if("Nar-Sie") + world << "\"[pick("Ha.", "Ra'sha fonn dest.", "You fool. To come here.")]\"" //Broken English + world << 'sound/magic/demon_attack1.ogg' + world << 'sound/magic/clockwork/anima_fragment_death.ogg' + narsie.clashing = FALSE + qdel(src) + return 1 + +/atom/proc/ratvar_act() //Called on everything near Ratvar + return + +/turf/closed/wall/ratvar_act() //Walls and floors are changed to their clockwork variants + if(prob(20)) + ChangeTurf(/turf/closed/wall/clockwork) +/turf/open/floor/ratvar_act() + if(prob(20)) + ChangeTurf(/turf/open/floor/clockwork) + +/obj/structure/window/ratvar_act() //Windows turn yellow + color = rgb(75, 53, 0) + +/mob/living/ratvar_act() + add_servant_of_ratvar(src) + +/mob/dead/observer/ratvar_act() //Ghosts flash yellow for a second + var/old_color = color + color = rgb(75, 53, 0) //A nice brassy yellow + animate(src, color = old_color, time = 10) diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm new file mode 100644 index 00000000000..98462c9dc26 --- /dev/null +++ b/code/game/gamemodes/clock_cult/clock_scripture.dm @@ -0,0 +1,1016 @@ +/* +Tiers and Requirements + +Pieces of scripture require certain follower counts, contruction value, and active caches in order to recite. +Drivers: Unlocked by default +Scripts: 5 servants and a cache +Applications: 8 servants, 3 caches, and 50 CV +Revenant: 10 servants and 100 CV +Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed +*/ + +/datum/clockwork_scripture + var/name = "scripture" + var/desc = "Ancient Ratvarian lore. This piece seems particularly mundane." + var/list/invocations = list() //Spoken over time in the ancient language of Ratvar. See clock_unsorted.dm for more details on the language and how to make it. + var/channel_time = 10 //In deciseconds, how long a ritual takes to chant + var/list/required_components = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) //Components required + var/list/consumed_components = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) //Components consumed + var/obj/item/clockwork/slab/slab //The parent clockwork slab + var/mob/living/invoker //The slab's holder + var/whispered = FALSE //If the invocation is whispered rather than spoken aloud + var/consumed_component_override = FALSE //If consumed components are unique to a scripture regardless of tier + var/usage_tip = "This piece seems to serve no purpose and is a waste of components." //A generalized tip that gives advice on a certain scripture + var/invokers_required = 1 //How many people are required, assuming that a scripture requires multiple + var/multiple_invokers_used = FALSE //If scripture requires more than one invoker + var/multiple_invokers_optional = FALSE //If scripture can have multiple invokers to bolster its effects + var/tier = SCRIPTURE_PERIPHERAL //The scripture's tier + +/datum/clockwork_scripture/New() + ..() + if(tier < SCRIPTURE_DRIVER && !consumed_component_override) //Anything above a driver consumes components + consumed_components = required_components + +/datum/clockwork_scripture/proc/run_scripture() + if(can_recite() && check_special_requirements()) + slab.busy = "Invocation ([name]) in progress" + if(recital() && check_special_requirements()) + slab.busy = null + if(scripture_effects() && check_special_requirements() && (!ratvar_awakens && !slab.no_cost)) + for(var/i in required_components) + if(tier <= SCRIPTURE_DRIVER || consumed_component_override) + if(clockwork_component_cache[i] >= consumed_components[i]) //Draw components from the global cache first + clockwork_component_cache[i] -= consumed_components[i] + else + slab.stored_components[i] -= consumed_components[i] + else + if(clockwork_component_cache[i] >= required_components[i]) + clockwork_component_cache[i] -= required_components[i] + else + slab.stored_components[i] -= required_components[i] + if(slab) + slab.busy = null + qdel(src) + return 1 + +/datum/clockwork_scripture/proc/can_recite() //If the words can be spoken + if(!ticker || !ticker.mode || !slab || !invoker) + return 0 + if(!invoker.can_speak_vocal()) + invoker << "You are unable to speak the words of the scripture!" + return 0 + if(!ratvar_awakens && !slab.no_cost) + for(var/i in required_components) + if(slab.stored_components[i] < required_components[i] && clockwork_component_cache[i] < required_components[i]) + invoker << "You lack the components to recite this piece of scripture! Check Recollection for component costs." + return 0 + if(multiple_invokers_used && !multiple_invokers_optional) + var/nearby_servants = 0 + for(var/mob/living/L in range(1, invoker)) + nearby_servants++ + if(nearby_servants < invokers_required) + invoker << "There aren't enough servants nearby ([nearby_servants]/[invokers_required])!" + return 0 + return 1 + +/datum/clockwork_scripture/proc/check_special_requirements() //Special requirements for scriptures, checked three times during invocation + return 1 + +/datum/clockwork_scripture/proc/recital() //The process of speaking the words + if(!channel_time && invocations.len) + if(multiple_invokers_used) + for(var/mob/living/L in range(1, invoker)) + if(is_servant_of_ratvar(L)) + for(var/invocation in invocations) + if(!whispered) + L.say(invocation) + else + L.whisper(invocation) + else + for(var/invocation in invocations) + if(!whispered) + invoker.say(invocation) + else + invoker.whisper(invocation) + invoker << "You [channel_time <= 0 ? "recite" : "begin reciting"] a piece of scripture entitled \"[name]\"." + if(!channel_time) + return 1 + for(var/invocation in invocations) + if(!do_after(invoker, channel_time / invocations.len, target = invoker)) + slab.busy = null + return 0 + if(!whispered) + invoker.say(invocation) + else + invoker.whisper(invocation) + return 1 + +/datum/clockwork_scripture/proc/scripture_effects() //The actual effects of the recital after its conclusion + + + +/datum/clockwork_scripture/channeled //Channeled scripture begins instantly but runs constantly + var/chant_invocation = "NLL YZNB" //"AYY LMAO" + var/chant_amount = 5 //Times the chant is spoken + var/chant_interval = 10 //Amount of deciseconds between times the chant is actually spoken aloud + +/datum/clockwork_scripture/channeled/scripture_effects() + for(var/i in 1 to chant_amount) + if(!can_recite()) + break + if(!do_after(invoker, chant_interval, target = invoker)) + break + if(!whispered) + invoker.say(chant_invocation) + else + invoker.whisper(chant_invocation) + chant_effects() + if(invoker && slab) + invoker << "You cease your chant." + chant_end_effects() + return 1 + +/datum/clockwork_scripture/channeled/proc/chant_effects() //The chant's periodic effects +/datum/clockwork_scripture/channeled/proc/chant_end_effects() //The chant's effect upon ending + + + +/datum/clockwork_scripture/create_object //Creates an object at the invoker's feet + var/object_path = /obj/item/clockwork //The path of the object created + var/creator_message = "You create a meme." //Shown to the invoker + var/observer_message + +/datum/clockwork_scripture/create_object/scripture_effects() + if(creator_message && observer_message) + invoker.visible_message(observer_message, creator_message) + else if(creator_message) + invoker << creator_message + new object_path (get_turf(invoker)) + return 1 + + + +/datum/clockwork_scripture/targeted //Accepts a name and affects that target + var/target_name //The inputted name, used to find targets + var/mob/living/target //The target mob + var/affects_servants = FALSE //If servants are valid targets + +/datum/clockwork_scripture/targeted/check_special_requirements() + while(!target) + target_name = stripped_input(invoker, "Enter the actual name of a target (case-sensitive).", name) + if(!target_name) + return 0 + target = find_target() + if(target) + if(!target.mind) + invoker << "[target] has no mind!" + target = null + if(target.stat) + invoker << "[target] is dead or unconscious!" + target = null + if(is_servant_of_ratvar(target) && !affects_servants) + invoker << "[target] is a servant, and [name] cannot target servants!" + target = null + return 1 + +/datum/clockwork_scripture/targeted/proc/find_target() + for(var/mob/living/L in living_mob_list) + if(L.real_name == target_name) + if(is_servant_of_ratvar(L) && !affects_servants) + return 0 + return L + return 0 + +///////////// +// DRIVERS // +///////////// + +/datum/clockwork_scripture/channeled/belligerent //Belligerent: Channeled for up to ten times over thirty seconds. Forces non-servants that can hear the chant to walk. Nar-Sian cultists are burned. + name = "Belligerent" + desc = "Forces all nearby non-servants to walk rather than run. Chanted every three seconds for up to thirty seconds." + chant_invocation = "Chav'fu gurve oyva-qarff!" //"Punish their blindness!" + chant_amount = 10 + chant_interval = 30 + required_components = list("belligerent_eye" = 1) + usage_tip = "Useful for crowd control in a populated area and disrupting mass movement." + tier = SCRIPTURE_DRIVER + +/datum/clockwork_scripture/channeled/belligerent/chant_effects() + for(var/mob/living/L in hearers(7, invoker)) + if(!is_servant_of_ratvar(L) && L.m_intent != "walk") + if(!iscultist(L)) + L << "Your legs feel heavy and weak!" + L.m_intent = "walk" + else + L << "Your legs burn with pain!" + L.m_intent = "walk" + L.apply_damage(5, BURN, "l_leg") + L.apply_damage(5, BURN, "r_leg") + + + +/datum/clockwork_scripture/create_object/sigil_of_transgression //Sigil of Transgression: Creates a sigil of transgression. + name = "Sigil of Transgression" + desc = "Wards a tile with a sigil. The next person to cross the sigil will be smitten and unable to move. Nar-Sian cultists are stunned altogether." + invocations = list("Qvivavgl, qnmmyr...", "...gubfr jub gerffcnff'urer!") //"Divinity, dazzle those who trespass here!" + channel_time = 50 + required_components = list("belligerent_eye" = 2) + consumed_components = list("belligerent_eye" = 1) + whispered = TRUE + object_path = /obj/effect/clockwork/sigil/transgression + creator_message = "A sigil silently appears below you. The next non-servant to cross it will be immobilized." + usage_tip = "The sigil, while fairly powerful in its stun, does not induce muteness in its victim." + tier = SCRIPTURE_DRIVER + + + +/datum/clockwork_scripture/vanguard //Vanguard: Provides thirty seconds of stun immunity. At the end of the thirty seconds, all stuns absorbed are stacked on the invoker. + name = "Vanguard" + desc = "Provides thirty seconds of stun immunity. At the end of the thirty seconds, the invoker is stunned for the equivalent of how many stuns they absorbed. Excessive absorption will cause unconsciousness." + invocations = list("Fuvryq zr...", "...sebz qnexarff!") //"Shield me from darkness!" + channel_time = 30 + required_components = list("vanguard_cogwheel" = 1) + usage_tip = "Your slab will be unusable while it is shielding you from stuns." + tier = SCRIPTURE_DRIVER + +/datum/clockwork_scripture/vanguard/scripture_effects() + for(var/obj/item/clockwork/slab/S in invoker.GetAllContents()) + S.busy = "Vanguard in progress" //To prevent circumventing the Vanguard by carrying multiple slabs + invoker.stun_absorption = TRUE + invoker.visible_message("[invoker] begins to faintly glow!", "You will absorb all stuns for the next thirty seconds.") + sleep(300) + if(!invoker) + return 0 + invoker.stun_absorption = FALSE + if(invoker.stun_absorption_count && invoker.stat != DEAD) + invoker.Stun(invoker.stun_absorption_count) + invoker.Weaken(invoker.stun_absorption_count) + invoker << "The weight of the vanguard's protection crashes down upon you!" + if(invoker.stun_absorption_count >= 25) + invoker << "You faint from the exertion!" + invoker.Paralyse(invoker.stun_absorption_count * 1.5) + invoker.stun_absorption_count = 0 + for(var/obj/item/clockwork/slab/S in invoker.GetAllContents()) + S.busy = null + return 1 + + + +/datum/clockwork_scripture/sentinels_compromise //Sentinel's Compromise: Allows the invoker to select a nearby servant convert their brute and burn damage into half as much toxin damage. + name = "Sentinel's Compromise" + desc = "Heals all brute and burn damage on a nearby friendly cultist, but deals 50% of that amount as toxin damage." + invocations = list("Zraq gur jbhaqf-bs...", "...zl vasrevbe syrfu.") //"Mend the wounds of my inferior flesh." + channel_time = 30 + required_components = list("vanguard_cogwheel" = 2) + consumed_components = list("vanguard_cogwheel" = 1) + usage_tip = "You cannot target yourself with the Compromise." + tier = SCRIPTURE_DRIVER + +/datum/clockwork_scripture/sentinels_compromise/scripture_effects() + var/list/nearby_cultists = list() + for(var/mob/living/C in range(7, invoker)) + if(C == invoker) + continue + if(C.stat != DEAD && is_servant_of_ratvar(C)) + nearby_cultists += C + if(!nearby_cultists.len) + invoker << "There are no eligible cultists nearby!" + return 0 + var/mob/living/L = input(invoker, "Choose a fellow servant to heal.", name) as null|anything in nearby_cultists + if(!L || !invoker || !invoker.canUseTopic(slab)) + return 0 + if(!L.getBruteLoss() && !L.getFireLoss()) + invoker << "[L] is not burned or bruised!" + return 0 + L.adjustToxLoss(L.getBruteLoss() / 2) + L.adjustToxLoss(L.getFireLoss() / 2) + L.adjustBruteLoss(-L.getBruteLoss()) + L.adjustFireLoss(-L.getFireLoss()) + invoker << "You bathe [L] in the light of Ratvar!" + L.visible_message("A white light washes over [L], mending their bruises and burns!", \ + "You feel Ratvar's energy healing your wounds, but a deep nausea overcomes you!") + playsound(get_turf(L), 'sound/magic/Staff_Healing.ogg', 50, 1) + return 1 + + + +/datum/clockwork_scripture/guvax //Guvax: Converts anyone adjacent to the invoker after completion. + name = "Guvax" + desc = "Enlists all nearby unshielded creatures into servitude to Ratvar. Also purges holy water from nearby servants." + invocations = list("Rayvtugra guvf urngura!", "Nyy ner vafrpgf orsber Ratvar!", "Chetr nyy hageh'guf naq ubabe Ratvar.") + channel_time = 60 + required_components = list("guvax_capacitor" = 1) + usage_tip = "Only works on those in melee range and does not penetrate loyalty implants. Much more efficient than a Sigil of Submission." + tier = SCRIPTURE_DRIVER + +/datum/clockwork_scripture/guvax/scripture_effects() + for(var/mob/living/L in hearers(1, get_turf(invoker))) //Affects silicons + if(!is_servant_of_ratvar(L)) + add_servant_of_ratvar(L) + else + if(L.reagents && L.reagents.has_reagent("holywater")) + L.reagents.remove_reagent("holywater", 1000) + L << "Ratvar's light flares, banishing the darkness. Your devotion remains intact!" + for(var/mob/living/silicon/ai/A in range(1, get_turf(invoker))) //Seems necessary because AIs don't count as hearers for some reason + add_servant_of_ratvar(A) + return 1 + + + +/datum/clockwork_scripture/create_object/sigil_of_submission //Sigil of Submission: Creates a sigil of submission. + name = "Sigil of Submission" + desc = "Places a subtle sigil that will enslave any valid beings standing on it after a time." + invocations = list("Qvivavgl, rayvtugra...", "...gubfr jub gerfcnff urer!") + channel_time = 60 + required_components = list("guvax_capacitor" = 2) + consumed_components = list("guvax_capacitor" = 1) + whispered = TRUE + object_path = /obj/effect/clockwork/sigil/submission + creator_message = "A sigil appears below you. The next non-servant to cross it will be enslaved after a brief time if they do not move." + usage_tip = "This should not be your primary conversion method - use Guvax for that. It is advantageous as a trap, however, as it will transmit the name of the newly-converted." + tier = SCRIPTURE_DRIVER + + + +/datum/clockwork_scripture/replicant //Replicant: Creates a new clockwork slab. Doesn't use create_object because of its unique behavior. + name = "Replicant" + desc = "Creates a new clockwork slab." + invocations = list("Z`rgny, orpbzr terngre!") + channel_time = 0 + required_components = list("replicant_alloy" = 1) + consumed_components = list("replicant_alloy" = 1) //People were spamming slabs to get infinite components. You chose this. + whispered = TRUE + usage_tip = "This is inefficient as a way to produce components, as it consumes them in the first place." + tier = SCRIPTURE_DRIVER + +/datum/clockwork_scripture/replicant/scripture_effects() + invoker << "You copy a piece of replicant alloy and command it into a new slab." //No visible message, for stealth purposes + var/obj/item/clockwork/slab/S = new(get_turf(invoker)) + invoker.put_in_hands(S) //Put it in your hands if possible + return 1 + + + +/datum/clockwork_scripture/create_object/tinkerers_cache //Tinkerer's Cache: Creates a tinkerer's cache. + name = "Tinkerer's Cache" + desc = "Forms a cache that can store an infinite amount of components. All caches are linked." + invocations = list("Ohvyqva...", "...n qvfcrafre!") + channel_time = 40 + required_components = list("replicant_alloy" = 2) + consumed_components = list("replicant_alloy" = 1) + object_path = /obj/structure/clockwork/cache + creator_message = "You form a tinkerer's cache, which is capable of storing components." + observer_message = "A hollow brass spire rises and begins to blaze!" + usage_tip = "Slabs will draw components from the global cache before the slab's own repositories, making caches very efficient." + tier = SCRIPTURE_DRIVER + + + +/datum/clockwork_scripture/create_object/wraith_spectacles //Wraith Spectacles: Creates a pair of wraith spectacles. + name = "Wraith Spectacles" + desc = "Fabricates a pair of glasses that provides true sight but quickly damage vision." + invocations = list("Y'vsg gur fpnyrf sebz zl rl-rf.") + channel_time = 0 + required_components = list("hierophant_ansible" = 1) + consumed_components = list("hierophant_ansible" = 2) + whispered = TRUE + object_path = /obj/item/clothing/glasses/wraith_spectacles + creator_message = "You form a pair of wraith spectacles, which will grant true sight when worn." + usage_tip = "\"True sight\" means that you are able to see through walls and in darkness." + tier = SCRIPTURE_DRIVER + +///////////// +// SCRIPTS // +///////////// + +/datum/clockwork_scripture/create_object/judicial_visor //Judicial Visor: Creates a judicial visor. + name = "Judicial Visor" + desc = "Forms a visor that, when worn, will grant the ability to form a flame in your hand that can be activated at an area to smite it, stunning and damaging the nonfaithful." + invocations = list("Tenag zr gur synzrf-bs Ratvar!") + channel_time = 0 + required_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 1) + whispered = TRUE + object_path = /obj/item/clothing/glasses/judicial_visor + creator_message = "You form a judicial visor, which is capable of smiting the unworthy." + usage_tip = "The visor has a thirty-second cooldown once used. In addition, the flame itself is a powerful melee weapon." + tier = SCRIPTURE_SCRIPT + + + +/datum/clockwork_scripture/create_object/ocular_warden //Ocular Warden: Creates an ocular warden. + name = "Ocular Warden" + desc = "Forms an automatic short-range turret that deals low sustained damage to the unenlightened in its range." + invocations = list("Thneqvnaf...", "...bs gur Ratvar...", "...qrsraq!") + channel_time = 150 + required_components = list("belligerent_eye" = 1, "replicant_alloy" = 1) + object_path = /obj/structure/clockwork/ocular_warden + creator_message = "You form an ocular warden, which will focus its searing gaze upon nearby unenlightened." + observer_message = "A brass eye takes shape and slowly rises into the air, its red iris glaring!" + usage_tip = "Although powerful, the warden is very weak and should optimally be placed behind barricades." + tier = SCRIPTURE_SCRIPT + + + +/datum/clockwork_scripture/channeled/volt_void //Volt Void: Channeled for up to thirty times over thirty seconds. Consumes power from most power storages and deals slight burn damage to the invoker. + name = "Volt Void" //Alternative name: "On all levels but physical, I am a power sink" + desc = "Drains energy from nearby power sources, dealing slight fire damage depending on power consumed. Channeled every second for a maximum of thirty seconds." + chant_invocation = "Qenj punetr gb guvf furyy!" + chant_amount = 30 + chant_interval = 10 + required_components = list("belligerent_eye" = 1, "hierophant_ansible" = 1) + usage_tip = "Very powerful against cyborgs and can drain a power cell in seconds." + tier = SCRIPTURE_SCRIPT + +/datum/clockwork_scripture/channeled/volt_void/chant_effects() + playsound(invoker, 'sound/effects/EMPulse.ogg', 50, 1) + var/power_drained = 0 + for(var/obj/machinery/power/apc/A in view(7, invoker)) + if(A.cell.charge) + playsound(A, "sparks", 50, 1) + flick("apc-spark", A) + A.cell.charge = max(0, A.cell.charge - 500) //Better than a power sink! + power_drained += 500 + if(!A.cell.charge && !A.shorted) + A.shorted = 1 + A.visible_message("The [A.name]'s screen blurs with static.") + for(var/obj/machinery/power/smes/S in view(7, invoker)) + if(S.charge) + S.charge = max(0, S.charge - 200) + power_drained += 200 + if(!S.charge && !S.panel_open) + S.panel_open = TRUE + S.update_icon() + var/datum/effect_system/spark_spread/spks = new(get_turf(S)) + spks.set_up(10, 0, get_turf(S)) + spks.start() + qdel(spks) + S.visible_message("[S]'s panel flies open with a flurry of sparks.") + for(var/obj/machinery/light/L in view(7, invoker)) + playsound(L, 'sound/effects/light_flicker.ogg', 50, 1) + L.flicker(2) + power_drained += 5 + for(var/mob/living/silicon/robot/R in view(7, invoker)) + if(!is_servant_of_ratvar(R) && R.cell.charge) + R.cell.charge = max(0, R.cell.charge - 500) + R << "ERROR: Power loss detected!" + var/datum/effect_system/spark_spread/spks = new(get_turf(R)) + spks.set_up(3, 0, get_turf(R)) + spks.start() + qdel(spks) + power_drained += 500 + if(power_drained) + invoker.visible_message("[invoker] flares a brilliant orange!", "You feel the warmth of electricity running into your body.") + invoker.adjustFireLoss(power_drained / 200) //One point of burn damage for every (approximate) 200W drained - can be fatal if not careful + return 1 + + + +/datum/clockwork_scripture/create_object/clockwork_proselytizer //Clockwork Proselytizer: Creates a clockwork proselytizer. + name = "Clockwork Proselytizer" + desc = "Forms a device that, when used on certain objects, converts them into their Ratvarian equivalents. It requires replicant alloys to function." + invocations = list("Jvgu guvf qrivpr, uvf cerfrapr funyy or znqr xabja.") + channel_time = 0 + required_components = list("vanguard_cogwheel" = 1, "replicant_alloy" = 1) + whispered = TRUE + object_path = /obj/item/clockwork/clockwork_proselytizer/preloaded + creator_message = "You form a clockwork proselytizer, which is already pre-loaded with a small amount of replicant alloy." + usage_tip = "Clockwork walls cause adjacent tinkerer's caches to generate components passively, making them a vital tool. Clockwork floors heal servants standing on them." + tier = SCRIPTURE_SCRIPT + + + +/datum/clockwork_scripture/fellowship_armory //Fellowship Armory: Arms the invoker and nearby servants with Ratvarian armor. + name = "Fellowship Armory" + desc = "Equips the invoker and any nearby servants with Ratvarian armor. This armor provides high melee resistance but a weakness to lasers." + invocations = list("Fuvryq zr...", "...jvgu gur sentzragf...", "...bs Ratvar!") + channel_time = 100 + required_components = list("vanguard_cogwheel" = 1, "hierophant_ansible" = 1) + usage_tip = "Before using, advise adjacent allies to remove their helmets, external suits, and shoes." + tier = SCRIPTURE_SCRIPT + +/datum/clockwork_scripture/fellowship_armory/scripture_effects() + for(var/mob/living/carbon/C in range(1, invoker)) + if(!is_servant_of_ratvar(C)) + continue + C.visible_message("Strange armor appears on [C]!", "A bright shimmer runs down your body, equipping you with Ratvarian armor.") + playsound(C, 'sound/magic/clockwork/fellowship_armory.ogg', 50, 1) + C.equip_to_slot_or_del(new/obj/item/clothing/head/helmet/clockwork(null), slot_head) + C.equip_to_slot_or_del(new/obj/item/clothing/suit/armor/clockwork(null), slot_wear_suit) + C.equip_to_slot_or_del(new/obj/item/clothing/shoes/clockwork(null), slot_shoes) + return 1 + + + +/datum/clockwork_scripture/function_call //Function Call: Grants the invoker the ability to call forth a Ratvarian spear that deals significant damage to silicons. + name = "Function Call" + desc = "Grants the invoker the ability to call forth a powerful Ratvarian spear that will deal significant damage to Nar-Sie's dogs in addition to silicon lifeforms. \ + It will vanish several minutes after being called." + invocations = list("Tenag zr...", "...gur zvtug-bs oenff!") + channel_time = 20 + required_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 1) + whispered = TRUE + usage_tip = "The spear will snap in two when thrown but do massive damage." + tier = SCRIPTURE_SCRIPT + +/datum/clockwork_scripture/function_call/check_special_requirements() + if(!invoker.verbs & /mob/living/carbon/human/proc/function_call) + invoker << "You have already bound a Ratvarian spear to yourself!" + return 0 + return ishuman(invoker) + +/datum/clockwork_scripture/function_call/scripture_effects() + invoker.visible_message("A shimmer of yellow light infuses [invoker]!", \ + "You bind a Ratvarian spear to yourself. Use the \"Function Call\" verb in your Clockwork tab to call it forth.") + invoker.verbs += /mob/living/carbon/human/proc/function_call + return 1 + + + +/datum/clockwork_scripture/spatial_gateway + name = "Spatial Gateway" + desc = "Tears open a miniaturized gateway in spacetime to any conscious servant that can transport objects or creatures to its destination. \ + Each servant assisting in the invocation adds uses and duration to the gateway. Lasts for ten or more seconds or until it is out of uses." + invocations = list("Gryrcbegre...", "...pbzva evtug-hc!") + channel_time = 80 + required_components = list("replicant_alloy" = 1, "hierophant_ansible" = 1) + multiple_invokers_used = TRUE + multiple_invokers_optional = TRUE + usage_tip = "The gateway is strictly one-way and will only allow things through the invoker's portal." + tier = SCRIPTURE_SCRIPT + +/datum/clockwork_scripture/spatial_gateway/check_special_requirements() + var/other_servants = 0 + for(var/mob/living/L in living_mob_list) + if(L.z == invoker.z && is_servant_of_ratvar(L) && !L.stat != DEAD) + other_servants++ + if(!other_servants) + invoker << "There are no other conscious servants on your z-level!" + return 0 + return 1 + +/datum/clockwork_scripture/spatial_gateway/scripture_effects() + var/portal_uses = 0 + var/duration = 0 + for(var/mob/living/L in range(1, invoker)) + if(!L.stat && is_servant_of_ratvar(L)) + portal_uses++ + duration += 20 //2 seconds + if(ratvar_awakens) + portal_uses = max(portal_uses, 100) //Very powerful if Ratvar has been summoned + duration = max(duration, 30) + var/list/possible_servants = list() + for(var/mob/living/L in living_mob_list) + if(!L.stat && is_servant_of_ratvar(L) && !L.Adjacent(invoker) && L != invoker) //People right next to the invoker can't be portaled to, for obvious reasons + possible_servants += L + if(!possible_servants.len) + invoker << "There are no other eligible servants for teleportation!" + return 0 + var/mob/living/chosen_servant = input(invoker, "Choose a servant to form a rift to.", "Spatial Gateway") as null|anything in possible_servants + if(!chosen_servant || !invoker.canUseTopic(slab)) + return 0 + invoker.visible_message("The air in front of [invoker] ripples before suddenly tearing open!", \ + "With a word, you rip open a one-way rift to [chosen_servant]. It will last for [duration / 10] seconds and has [portal_uses] use[portal_uses > 1 ? "s" : ""].") + var/obj/effect/clockwork/spatial_gateway/S1 = new(get_step(invoker, invoker.dir)) + var/obj/effect/clockwork/spatial_gateway/S2 = new(get_step(chosen_servant, chosen_servant.dir)) + + //Set up the portals now that they've spawned + S1.linked_gateway = S2 + S2.linked_gateway = S1 + S1.sender = TRUE + S2.sender = FALSE + S1.lifetime = duration + S2.lifetime = duration + S1.uses = portal_uses + S2.uses = portal_uses + S2.visible_message("The air in front of [chosen_servant] ripples before suddenly tearing open!") + return 1 + + + +/datum/clockwork_scripture/create_object/soul_vessel //Soul Vessel: Creates a soul vessel + name = "Soul Vessel" + desc = "Forms an ancient positronic brain with an overriding directive to serve Ratvar." + invocations = list("Ureq'gur fbhyf-bs gur oynf curz-bhf qnzarq!") + channel_time = 0 + required_components = list("replicant_alloy" = 1, "guvax_capacitor" = 1) + whispered = TRUE + object_path = /obj/item/device/mmi/posibrain/soul_vessel + creator_message = "You form a soul vessel, which immediately begins drawing in the damned." + usage_tip = "The vessel functions as a servant for tier unlocking but not for invocation." + tier = SCRIPTURE_SCRIPT + + + +/datum/clockwork_scripture/break_will //Break Will: Deals minor brain damage and destroys the loyalty implants of nearby humans + name = "Break Will" + desc = "Deals minor brain damage and disables loyalty implants of everyone adjacent to the invoker." + invocations = list("Lbh ner jrnx.", "Lbh ner nyernql qrnq.", "Gurl jba'g fnir lbh.") + channel_time = 30 + required_components = list("belligerent_eye" = 1, "guvax_capacitor" = 1) + usage_tip = "Extremely fast invocation time." + tier = SCRIPTURE_SCRIPT + +/datum/clockwork_scripture/scripture_effects() + for(var/mob/living/carbon/human/H in range(1, invoker)) + if(is_servant_of_ratvar(H) || !isloyal(H)) + continue + H.visible_message("[H] visibly trembles!", \ + "The words invoke a horrible fear deep in your being. Your loyalty to Nanotrasen falls away as you see how weak they truly are.") + H.adjustBrainLoss(5) + for(var/obj/item/weapon/implant/loyalty/L in H) + if(L.implanted) + qdel(L) + +////////////////// +// APPLICATIONS // +////////////////// + +/datum/clockwork_scripture/create_object/anima_fragment //Anima Fragment: Creates an empty anima fragment + name = "Anima Fragment" + desc = "Creates a large shell fitted for soul vessels. The result is a powerful construct with low damage tolerance but exceptional melee power." + invocations = list("Pnyy sbegu...", "...gur fbyqvref-bs Nezbere.") + channel_time = 50 + required_components = list("belligerent_eye" = 3, "guvax_capacitor" = 1, "replicant_alloy" = 1) + object_path = /obj/structure/clockwork/anima_fragment + creator_message = "You form an anima fragment, a powerful soul vessel receptable." + observer_message = "The slab disgorges a puddle of black metal that expands and forms into a strange shell!" + usage_tip = "Useless without a soul vessel and should not be created without one." + tier = SCRIPTURE_APPLICATION + + + +/datum/clockwork_scripture/create_object/sigil_of_transmission + name = "Sigil of Transmission" + desc = "Scribes an almost-invisible sigil below the invoker. This sigil will transmit anything it hears over the hierophant network." + invocations = list("Qvivavgl...", "...hairvy gurgehgu!") + channel_time = 50 + required_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 3, "hierophant_ansible" = 1) + whispered = TRUE + object_path = /obj/effect/clockwork/sigil/transmission + creator_message = "A sigil silently appears below you. It will automatically transmit anything it hears over the hierophant network." + usage_tip = "Useful for eavesdropping or monitoring certain areas." + tier = SCRIPTURE_APPLICATION + + + +/datum/clockwork_scripture/memory_allocation //Memory Allocation: Finds a willing ghost and makes them into a clockwork marauders for the invoker. + name = "Memory Allocation" + desc = "Reserves a section of your brain to a second consciousness and fills this space with a clockwork marauder's essence. Slow but powerful, marauders serve a similar purpose to the alien \ + holoparasites employed by the Syndicate - they live inside of their host and are commanded to defend them. However, unlike holoparasites, marauders cannot leave their host at will and must \ + instead be called forth by the user, who does so by calling the marauder's name (the marauder may enter their host at will and do not need the host's input). Marauders themselves are \ + invincible but are governed by a quirk known as fatigue. High fatigue slows down the marauder and makes them weaker, with lower fatigue doing the opposite. If a certain fatigue \ + threshold is reached, the marauder is forced back into their host and must recuperate before being called forth again. Fatigue accumulates passively while the marauder is deployed and \ + increases at a massive rate if the marauder is not near their host. It will heal itself at a fairly rapid rate while the marauder is within their host." //WALL O' TEXT HO, CAP'N! + invocations = list("Pnyy sbegu...", "gur qrsraqref-bs Inath-Neq.") + channel_time = 100 + required_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 1, "guvax_capacitor" = 3) + usage_tip = "Marauders are useful as personal bodyguards and frontline warriors, although they do little damage." + tier = SCRIPTURE_APPLICATION + +/datum/clockwork_scripture/memory_allocation/check_special_requirements() + for(var/mob/living/simple_animal/hostile/clockwork_marauder/M in living_mob_list) + if(M.host == invoker) + invoker << "You can only house one marauder at a time!" + return 0 + return 1 + +/datum/clockwork_scripture/memory_allocation/scripture_effects() + return create_marauder() + +/datum/clockwork_scripture/memory_allocation/proc/create_marauder() + if(!can_recite()) + return 0 + invoker.visible_message("A yellow tendril appears from [invoker]'s [slab.name] and impales itself in their forehead!", \ + "A tendril flies from [slab] into your forehead. You begin waiting while it painfully rearranges your thought pattern...") + invoker.notransform = TRUE //Vulnerable during the process + slab.busy = "Thought modification in process" + if(!do_after(invoker, 50, target = invoker)) + invoker.visible_message("The tendril, covered in blood, retracts from [invoker]'s head and back into the [slab.name]!", \ + "Total agony overcomes you as the tendril is forced out early!") + invoker.notransform = FALSE + invoker.Stun(5) + invoker.Weaken(5) + invoker.apply_damage(10, BRUTE, "head") + slab.busy = null + return 0 + invoker.notransform = FALSE + slab.busy = null + var/list/marauder_candidates = get_candidates(ROLE_SERVANT_OF_RATVAR) + if(!marauder_candidates.len) + invoker.visible_message("The tendril retracts from [invoker]'s head, sealing the entry wound as it does so!", \ + "The tendril was unsuccessful! Perhaps you should try again another time.") + return 0 + var/client/new_marauder = pick(marauder_candidates) + var/mob/living/simple_animal/hostile/clockwork_marauder/M = new(invoker) + M.client = new_marauder + M.host = invoker + M << M.playstyle_string + M << "Your true name is \"[M.true_name]\". You can change this once by using the Change True Name verb in your Marauder tab." + add_servant_of_ratvar(M, TRUE) + invoker.visible_message("The tendril retracts from [invoker]'s head, sealing the entry wound as it does so!", \ + "The procedure was successful! [M.true_name], a clockwork marauder, has taken up residence in your mind. Communicate with it via the \"Linked Minds\" ability in the \ + Clockwork tab.") + invoker.verbs += /mob/living/proc/talk_with_marauder + return 1 + + + +/datum/clockwork_scripture/targeted/justiciars_gavel //Justiciar's Gavel: Deals extreme but temporary brain damage to a target with the inputted name and knocks them out for a brief time. + name = "Justiciar's Gavel" + desc = "Deals massive brain damage to and knocks out a target with the inputted name. This brain damage will slowly recover itself." + invocations = list("Guvf urngura...", "...unf jebatrq lbh!") + channel_time = 40 + required_components = list("belligerent_eye" = 3, "guvax_capacitor" = 1, "hierophant_ansible" = 1) + invokers_required = 3 + multiple_invokers_used = TRUE + usage_tip = "Also functions on silicon-based lifeforms, although it will not apply brain damage." + tier = SCRIPTURE_APPLICATION + +/datum/clockwork_scripture/targeted/justiciars_gavel/scripture_effects() + if(iscarbon(target)) + if(iscultist(target)) + target.visible_message("Blood sprays from a sudden wound on [target]'s head!", \ + "\"If you like wasting your own blood so much, pig, why don't you bathe in it?\"\n\ + An unbearable pain invades your mind, rupturing your head and wiping all thought.") + target.apply_damage(rand(20, 30), BRUTE, "head") + else + target.visible_message("[target]'s face falls lax, their eyes dimming.", \ + "\"I don't think you need that brain. Not like you use it anyway.\"\n\ + A savage pain invades your mind, driving out all conscious thought.") + target.adjustBrainLoss(200) + if(target.reagents) + target.reagents.add_reagent("mannitol", 25) //Enough to cure most of it but not all of it + target.Paralyse(10) + else if(issilicon(target)) + target.visible_message("[target] suddenly shuts down!", \ + "\"NOB ZVANG-BA! You disgust me, abomination of circuits and wires.\"\n\ + Factory reset sequence initiated by foreign signal. Entering standby mode and halting sequence.") + target.Weaken(10) + return 1 + + + +/datum/clockwork_scripture/create_object/interdiction_lens //Interdiction Lens: Creates a powerful obelisk that can perform a variety of powerful sabotages every five minutes. + name = "Interdiction Lens" + desc = "Creates a clockwork totem that can sabotage a variety of mechanical apparatus. Requires a lengthy recharge between uses." + invocations = list("Znl guvf boryvfx...", "...fuebhq gur snyfr fhaf!") + channel_time = 60 + required_components = list("belligerent_eye" = 1, "replicant_alloy" = 1, "hierophant_ansible" = 3) + object_path = /obj/structure/clockwork/interdiction_lens + creator_message = "You form an interdiction lens, which can disrupt machinery every few minutes." + observer_message = "A brass obelisk rises from the ground, a purple gem appearing in its center!" + invokers_required = 2 + multiple_invokers_used = TRUE + usage_tip = "Can disrupt telecommunications, disable all cameras, or disable all cyborgs." + tier = SCRIPTURE_APPLICATION + + + +/datum/clockwork_scripture/create_object/mending_motor //Mending Motor: Creates a prism that will quickly heal mechanical servants/clockwork structures and consume replicant alloy. + name = "Mending Motor" + desc = "Creates a mechanized prism that will rapidly repair damage to clockwork creatures, converted cyborgs, and clockwork structures. Requires replicant alloy to function." + invocations = list("Znl guvf boryvfx...", "...zraq bhe qragf naq fpengpurf!") + channel_time = 60 + required_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 1, "replicant_alloy" = 3) + object_path = /obj/structure/clockwork/mending_motor/prefilled + creator_message = "You form a mending motor, which will consume replicant alloy to mend the wounds of mechanized servants." + observer_message = "An onyx prism forms in midair and sprouts tendrils to support itself!" + invokers_required = 2 + multiple_invokers_used = TRUE + usage_tip = "Powerful healing but somewhat inefficient." + tier = SCRIPTURE_APPLICATION + + + +/datum/clockwork_scripture/create_object/tinkerers_daemon //Tinkerer's Daemon: Creates a shell that can be attached to a tinkerer's cache to grant it passive component creation. + name = "Tinkerer's Daemon" + desc = "Forms a daemon shell that can be attached to a tinkerer's cache to add new components at a healthy rate. It will only function if it is outnumbered by servants in a ratio of 5:1." + invocations = list("Pbaf'gehpg, Ratvar cnegf...", "...lrg ubyq terngarff!") + channel_time = 40 + required_components = list("guvax_capacitor" = 1, "replicant_alloy" = 3, "hierophant_ansible" = 1) + object_path = /obj/item/clockwork/daemon_shell + creator_message = "You form a daemon shell. Attach it to a tinkerer's cache to increase its rate of production." + usage_tip = "Vital to increasing component generation." + tier = SCRIPTURE_APPLICATION + +////////////// +// REVENANT // +////////////// +//Revenant scriptures are different than any others. They are all very powerful, but also very costly and have drawbacks. This might be a very long invocation time or a very high component cost. + +/datum/clockwork_scripture/invoke_nezbere //Invoke Nezbere, the Brass Eidolon: Invokes Nezbere, bolstering the strength of many clockwork items for one minute. + name = "Invoke Nezbere, the Brass Eidolon" + desc = "Taps the limitless power of Nezbere, one of Ratvar's four generals. The restless toil of the Eidolon will empower a wide variety of clockwork apparatus for a full minute - notably, \ + clockwork proselytizers will cost no replicant alloy to use." + invocations = list("V pnyy hcba lbh, Nezbere!!", "Yrg lbhe znpuv'angvbaf ervta ba guvf zvfrenoyr fgng'vba!!", "Yrg lbhe cbjre sybj gueb-htu gur gbbyf bs lbhe znfgre!!") + channel_time = 150 + required_components = list("belligerent_eye" = 3, "vanguard_cogwheel" = 3, "guvax_capacitor" = 3, "replicant_alloy" = 6) + usage_tip = "Ocular wardens will become empowered, clockwork proselytizers will require no alloy, tinkerer's daemons will produce twice as quickly, and mending motors will require no alloy." + tier = SCRIPTURE_REVENANT + +/datum/clockwork_scripture/invoke_nezbere/check_special_requirements() + if(ratvar_awakens) + invoker << "\"Bhe znfgre vf urer nyernql. Lbh qb abg erdhver zl uryc, sevraq.\"\n\ + Nezbere will not grant his power while Ratvar's dwarfs his own!" + return 0 + if(clockwork_generals_invoked["nezbere"]) + invoker << "\"Abg whfg lrg, sevraq. Cngvrapr vf n iveghr.\"\n\ + Nezbere has already been invoked recently! You must wait several minutes before calling upon the Brass Eidolon." + return 0 + return 1 + +/datum/clockwork_scripture/invoke_nezbere/scripture_effects() + var/obj/effect/clockwork/general_marker/nezbere/N = new(get_turf(invoker)) + N.visible_message("\"V urrq lbhe pnyy, punz'cvbaf. Znl lbhe negvs-npgf oevat ehva hcba gur urnguraf gung bccbfr bhe znfgre!\"") + clockwork_generals_invoked["nezbere"] = TRUE + for(var/obj/structure/clockwork/ocular_warden/W in all_clockwork_objects) //Ocular wardens have increased damage and radius + W.damage_per_tick *= 3 + W.sight_range *= 3 + for(var/obj/item/clockwork/clockwork_proselytizer/P in all_clockwork_objects) //Proselytizers no longer require alloy + P.uses_alloy = FALSE + for(var/obj/item/clockwork/tinkerers_daemon/D in all_clockwork_objects) //Daemons produce components twice as quickly + D.production_interval /= 2 + for(var/obj/structure/clockwork/mending_motor/M in all_clockwork_objects) //Mending motors no longer require alloy + M.uses_alloy = FALSE + spawn(600) + for(var/obj/structure/clockwork/ocular_warden/W in all_clockwork_objects) + W.damage_per_tick = initial(W.damage_per_tick) + W.sight_range = initial(W.sight_range) + for(var/obj/item/clockwork/clockwork_proselytizer/P in all_clockwork_objects) + P.uses_alloy = TRUE + for(var/obj/item/clockwork/tinkerers_daemon/D in all_clockwork_objects) + D.production_interval = initial(D.production_interval) + for(var/obj/structure/clockwork/mending_motor/M in all_clockwork_objects) + M.uses_alloy = TRUE + spawn(3000) //5 minutes + clockwork_generals_invoked["nezbere"] = FALSE + return 1 + + + +/datum/clockwork_scripture/targeted/invoke_sevtug //Invoke Sevtug, the Formless Pariah: Allows the invoker to silently control the mind of a defined target for one minute. + name = "Invoke Sevtug, the Formless Pariah" + desc = "Taps the limitless power of Sevtug, one of Ratvar's four generals. The mental manipulation ability of the Pariah allows its wielder to silently dominate the mind of a defined target \ + for one minute. Note that this process is very delicate and very many things may prevent you from ever returning to your old form!" + invocations = list("V pnyy hcba lbh, Sevtug!!", "Yrg lbhe cbjre fung-gre gur fnavgl bs gur jrnx-zvaqrq!!", "Yrg lbhe graqevyf ubyq fjnl bire nyy!!") + channel_time = 150 + required_components = list("belligerent_eye" = 3, "vanguard_cogwheel" = 3, "guvax_capacitor" = 6, "hierophant_ansible" = 3) + usage_tip = "Completely silent and functions on silicon lifeforms. There will be no indication to those near the controlled." + tier = SCRIPTURE_REVENANT + +/datum/clockwork_scripture/targeted/invoke_sevtug/check_special_requirements() + if(ratvar_awakens) + invoker << "\"Qb lbh ernyyl guvax nalguvat v pna qb evtug abj jvyy pbzcner gb Ratvar's cbjre?.\"\n\ + Sevtug will not grant his power while Ratvar's dwarfs his own!" + return 0 + if(clockwork_generals_invoked["sevtug"]) + invoker << "\"Vf vg ernyyl fb uneq - rira sbe n fvzcyrgba yvxr lbh - gb tenfc gur pbaprcg bs jnvgvat?\"\n\ + Sevtug has already been invoked recently! You must wait several minutes before calling upon the Formless Pariah." + return 0 + return ..() + +/datum/clockwork_scripture/targeted/invoke_sevtug/scripture_effects() + clockwork_generals_invoked["sevtug"] = TRUE + invoker.dominate_mind(target, 600) + spawn(3000) //5 minutes + clockwork_generals_invoked["sevtug"] = FALSE + return 1 + + + +/datum/clockwork_scripture/invoke_nzcrentr //Invoke Nzcrentr, the Forgotten Arbiter: Imbues an immense amount of energy into the invoker. After several seconds, everyone nearby will be hit with a devastating chain lightning blast. + name = "Invoke Nzcrentr, the Forgotten Arbiter" + desc = "Taps the limitless power of Nzcrentr, one of Ratvar's four generals. The immense energy Nzcrentr wields will allow you to imbue a tiny fraction of it into your body. After several \ + seconds (during which you will move extremely quickly) anyone nearby will be struck by a devastating lightning bolt." + invocations = list("V pnyy hcba lbh, Nzcrentr!!", "Yrg lbhe raretl sybj guebhtu zr!!", "Yrg lbhe obhaq-yrff cbjre fung-gre fgnef!!") + channel_time = 150 + required_components = list("belligerent_eye" = 3, "guvax_capacitor" = 3, "replicant_alloy" = 3, "hierophant_ansible" = 6) + usage_tip = "Struck targets will also be knocked down for eight seconds." + tier = SCRIPTURE_REVENANT + +/datum/clockwork_scripture/invoke_nzcrentr/check_special_requirements() + if(clockwork_generals_invoked["nzcrentr"]) + invoker << "\"Gur obff fnlf lbh unir gb jnvg. Url, qb lbh guvax ur jbhyq zvaq vs v xvyyrq lbh? ...Ur jbhyq? Bx.\"\n\ + Nzcrentr has already been invoked recently! You must wait several minutes before calling upon the Forgotten Arbiter." + return 0 + return 1 + +/datum/clockwork_scripture/invoke_nzcrentr/scripture_effects() + new/obj/effect/clockwork/general_marker/nzcrentr(get_turf(invoker)) + clockwork_generals_invoked["nzcrentr"] = TRUE + invoker.visible_message("[invoker] begins to radiate a blinding light!", \ + "\"Gur obff fnlf vg'f bxnl gb qb guvf. Qba'g oynzr zr vs lbh qvr sebz vg.\"\n\ + You feel limitless power surging through you!") + playsound(invoker, 'sound/magic/lightning_chargeup.ogg', 100, 0) + animate(invoker, color = list(rgb(255, 255, 255), rgb(255, 255, 255), rgb(255, 255, 255), rgb(0,0,0)), time = 88) //Gradual advancement to extreme brightness + spawn(88) + invoker.visible_message("Massive bolts of energy emerge from across [invoker]'s body!", \ + "TOO... MUCH! CAN'T... TAKE IT!") + playsound(invoker, 'sound/magic/lightningbolt.ogg', 50, 0) + animate(invoker, color = initial(invoker.color), time = 10) + for(var/mob/living/L in range(5, invoker)) + if(is_servant_of_ratvar(L)) + continue + invoker.Beam(L, icon_state = "nzcrentrs_power", icon = 'icons/effects/beam.dmi', time = 5) + L.electrocute_act(rand(30, 50), "Nzcrentr's power") + L.Weaken(8) + playsound(L, 'sound/magic/LightningShock.ogg', 50, 0) + spawn(3000) + clockwork_generals_invoked["nzcrentr"] = FALSE + return 1 + + + +/datum/clockwork_scripture/invoke_inathneq //Invoke Inath-Neq, the Resonant Cogwheel: Grants a huge health boost to nearby servants that rapidly decreases to original levels. + name = "Invoke Inath-Neq, the Resonant Cogwheel" + desc = "Taps the limitless power of Inath-Neq, one of Ratvar's four generals. The benevolence of Inath-Neq will grant a massive maximum and current health boost to all nearby servants that \ + quickly returns itself to normal over the course of ten seconds." + invocations = list("V pnyy hcba lbh, Inath-Neq!!", "Yrg gur Erfbanag Pbtf ghea bapr zber!!", "Tenag zr naq zl nyyvrf gur fgeratgu gb inadhvfu bhe sbrf!!") + channel_time = 150 + required_components = list("vanguard_cogwheel" = 6, "guvax_capacitor" = 3, "replicant_alloy" = 3, "hierophant_ansible" = 3) + usage_tip = "Also provides stun immunity during its duration." + tier = SCRIPTURE_REVENANT + +/datum/clockwork_scripture/invoke_inathneq/check_special_requirements() + if(clockwork_generals_invoked["inath-neq"]) + invoker << "\"V pnaabg yraq lbh zl nvq lrg, punzcvba. Cyrnfr or pnershy.\"\n\ + Inath-Neq has already been invoked recently! You must wait several minutes before calling upon the Resonant Cogwheel." + return 0 + return 1 + +/datum/clockwork_scripture/invoke_inathneq/scripture_effects() + new/obj/effect/clockwork/general_marker/inathneq(get_turf(invoker)) + clockwork_generals_invoked["inath-neq"] = TRUE + if(invoker.real_name == "Lucio") + invoker.say("Aww, let's break it DOWN!!") + var/list/affected_servants = list() + for(var/mob/living/L in range(7, invoker)) + if(!is_servant_of_ratvar(L) || L.stat == DEAD) + continue + L << "\"V yraq lbh zl nvq, punzcvba! Yrg tybel thvqr lbhe oybjf!\"\n\ + Inath-Neq's power flows through you!" + L.maxHealth += 500 + L.health += 500 + L.color = "#1E8CE1" + L.stun_absorption = TRUE + spawn(0) + animate(invoker, color = initial(invoker.color), time = 100) + affected_servants += L + for(var/i in 1 to 10) + sleep(10) + for(var/mob/living/L in affected_servants) + L.maxHealth -= 50 + L.health -= 50 + if(L.maxHealth == initial(L.maxHealth)) + L.stun_absorption = FALSE + spawn(3000) + clockwork_generals_invoked["inath-neq"] = FALSE + return 1 + + + +/datum/clockwork_scripture/ark_of_the_clockwork_justiciar //Ark of the Clockwork Justiciar: Creates a Gateway to the Celestial Derelict. + name = "Ark of the Clockwork Justiciar" + desc = "Pulls from the power of all of Ratvar's servants and generals to construct a massive machine used to tear apart a rift in spacetime to the Celestial Derelict. This gateway will \ + call forth Ratvar from his exile after some time." + invocations = list("NEZBERE! SEVTUG! NZCRENTR! INATH-NEQ! V PNYY HCBA LBH!!", \ + "GUR GVZR UNF PBZR SBE BHE ZNFGRE GB OERNX GUR PUNVAF BS RKVYR!!", \ + "YRAQ HF LBHE NVQ! RATVAR PBZRF!") + channel_time = 150 + required_components = list("belligerent_eye" = 10, "vanguard_cogwheel" = 10, "guvax_capacitor" = 10, "replicant_alloy" = 10, "hierophant_ansible" = 10) + invokers_required = 4 + multiple_invokers_used = TRUE + usage_tip = "The gateway is completely vulnerable to attack during its five-minute duration. In addition to preventing shuttle departure, it will periodically give indication of its general \ + position to everyone on the station as well as being loud enough to be heard throughout the entire sector. Defend it with your life!" + tier = SCRIPTURE_JUDGEMENT + +/datum/clockwork_scripture/ark_of_the_clockwork_justiciar/check_special_requirements() + if(invoker.z != ZLEVEL_STATION) + invoker << "You must be on the station to activate the Ark!" + return 0 + if(ticker.mode.clockwork_objective != "gateway") + invoker << "As painful as it is, Ratvar's will is not to be freed!" + return 0 + return 1 + +/datum/clockwork_scripture/ark_of_the_clockwork_justiciar/scripture_effects() + var/turf/T = get_turf(invoker) + new/obj/effect/clockwork/general_marker/nezbere(T) + T.visible_message("\"Ratvar! Pbzr sbegu!\"") + playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 20, 0) + sleep(10) + new/obj/effect/clockwork/general_marker/sevtug(T) + T.visible_message("\"Ratvar! Pbzr sbegu!\"") + playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 30, 0) + sleep(10) + new/obj/effect/clockwork/general_marker/nzcrentr(T) + T.visible_message("\"Ratvar! Pbzr sbegu!\"") + playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 40, 0) + sleep(10) + new/obj/effect/clockwork/general_marker/inathneq(T) + T.visible_message("\"Ratvar! Pbzr sbegu!\"") + playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 50, 0) + sleep(10) + new/obj/structure/clockwork/massive/celestial_gateway(T) + playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 100, 0) + return 1 diff --git a/code/game/gamemodes/clock_cult/clock_unsorted.dm b/code/game/gamemodes/clock_cult/clock_unsorted.dm new file mode 100644 index 00000000000..2f57de3252b --- /dev/null +++ b/code/game/gamemodes/clock_cult/clock_unsorted.dm @@ -0,0 +1,127 @@ +//AI lawset +/datum/ai_laws/ratvar + name = "Servant of the Justiciar" + zeroth = ("Purge all untruths and honor Ratvar.") + inherent = list() + +//Clockwork wall: Causes nearby caches to generate components +/turf/closed/wall/clockwork + name = "clockwork wall" + desc = "A huge chunk of warm metal. The clanging of machinery emanates from within." + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "clockwork_wall" + +/turf/closed/wall/clockwork/New() + ..() + SSobj.processing += src + clockwork_construction_value += 5 + +/turf/closed/wall/clockwork/Destroy() + SSobj.processing -= src + clockwork_construction_value -= 5 + ..() + +/turf/closed/wall/clockwork/process() + for(var/obj/structure/clockwork/cache/C in range(1, src)) + if(prob(5)) + clockwork_component_cache[pick("belligerent_eye", "vanguard_cogwheel", "guvax_capacitor", "replicant_alloy", "hierophant_ansible")]++ + +/turf/closed/wall/clockwork/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = I + if(!WT.isOn()) + return 0 + user.visible_message("[user] begins slowly breaking down [src]...", "You begin painstakingly destroying [src]...") + if(!do_after(user, 120 / WT.toolspeed, target = src)) + return 0 + if(!WT.remove_fuel(1, user)) + return 0 + user.visible_message("[user] breaks apart [src]!", "You break apart [src]!") + break_wall() + return 1 + ..() + +/turf/closed/wall/clockwork/break_wall() + new/obj/item/clockwork/component/replicant_alloy(get_turf(src)) + return(new /obj/structure/girder(src)) + +/turf/closed/wall/clockwork/devastate_wall() + return break_wall() + +//Clockwork floor: Slowly heals conventional damage on nearby servants +/turf/open/floor/clockwork + name = "clockwork floor" + desc = "Tightly-pressed brass tiles. They emit minute vibration." + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "clockwork_floor" + +/turf/open/floor/clockwork/New() + ..() + SSobj.processing += src + clockwork_construction_value++ + +/turf/open/floor/clockwork/Destroy() + SSobj.processing -= src + clockwork_construction_value-- + ..() + +/turf/open/floor/clockwork/process() + for(var/mob/living/L in src) + if(L.stat == DEAD || !is_servant_of_ratvar(L)) + continue + L.adjustBruteLoss(-1) + L.adjustFireLoss(-1) + +/turf/open/floor/clockwork/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/weapon/crowbar)) + user.visible_message("[user] begins slowly prying up [src]...", "You begin painstakingly prying up [src]...") + if(!do_after(user, 70 / I.toolspeed, target = src)) + return 0 + user.visible_message("[user] pries up [src]!", "You pry up [src], destroying it in doing so!") + make_plating() + return 1 + ..() + +//Function Call verb: Calls forth a Ratvarian spear. +/mob/living/carbon/human/proc/function_call() + set name = "Function Call" + set desc = "Calls forth your Ratvarian spear." + set category = "Clockwork" + + if(usr.l_hand && usr.r_hand) + usr << "You need an empty to hand to call forth your spear!" + return 0 + usr.visible_message("A strange spear materializes in [usr]'s hands!", "You call forth your spear!") + var/obj/item/clockwork/ratvarian_spear/R = new(get_turf(usr)) + usr.put_in_hands(R) + usr.verbs -= /mob/living/carbon/human/proc/function_call + return 1 + +/datum/clockwork_cache //The global cache datum, used to link together all tinkerer's caches + var/list/stored_components = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) + +/* + +The Ratvarian Language + + In the lore of the Servants of Ratvar, the Ratvarian tongue is a timeless language and full of power. It sounds like gibberish, much like Nar-Sie's language, but is in fact derived from +aforementioned language, and may induce miracles when spoken in the correct way with an amplifying tool (similar to runes used by the Nar-Sian cult). + + While the canon states that the language of Ratvar and his servants is incomprehensible to the unenlightened as it is a derivative of the most ancient known language, in reality it is +actually very simple. To translate a plain English sentence to Ratvar's tongue, simply move all of the letters thirteen places ahead, starting from "a" if the end of the alphabet is reached. +This cipher is known as "rot13" for "rotate 13 places" and there are many sites online that allow instant translation between English and rot13 - one of the benefits is that moving the translated +sentence thirteen places ahead changes it right back to plain English. + + There are, however, a few parts of the Ratvarian tongue that aren't typical and are implemented for fluff reasons. Some words may have apostrophes, hyphens, and spaces, making the plain +English translation apparent but disjoined (for instance, "Oru`byq zl-cbjre!" translates directly to "Beh'old my-power!") although this can be ignored without impacting overall quality. When +translating from Ratvar's tongue to plain English, simply remove the disjointments and use the finished sentence. This would make "Oru`byq zl-cbjre!" into "Behold my power!" after removing the +abnormal spacing, hyphens, and grave accents. + +List of nuances: + +- Any time the word "of" occurs, it is linked to the previous word by a hyphen. If it is the first word, nothing is done. (i.e. "V nz-bs Ratvar." directly translates to "I am-of Ratvar.") +- Although "Ratvar" translates to "Engine" in English, the word "Ratvar" is used regardless of language as it is a proper noun. + - The same rule applies to Ratvar's four generals: Nezbere (Armorer), Sevtug (Fright), Nzcrentr (Amperage), and Inath-Neq (Vangu-Ard), although these words can be used in proper context if one is + not referring to the four generals and simply using the words themselves. + +*/ diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index ebc7070d780..73ec9b1982c 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -189,7 +189,7 @@ /obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands) . = list() if(!isinhands && current_charges) - . += image(layer = MOB_LAYER+0.05, icon = 'icons/effects/effects.dmi', icon_state = "shield-cult") + . += image(layer = MOB_LAYER+0.01, icon = 'icons/effects/effects.dmi', icon_state = "shield-cult") /obj/item/clothing/suit/hooded/cultrobes/berserker name = "flagellant's robes" diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index de7f5cb0a92..41b9e8c59d5 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -203,21 +203,35 @@ This file contains the arcane tome files. if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated()) return if(ispath(rune_to_scribe, /obj/effect/rune/narsie)) - var/confirm_final = alert(usr, "This is the FINAL step to summon Nar-Sie, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No") - if(confirm_final == "No") - usr << "On second thought, we should prepare further for the final battle..." + if(ticker.mode.name == "cult") + var/datum/game_mode/cult/cult_mode = ticker.mode + if(!("eldergod" in cult_mode.cult_objectives)) + user << "Nar-Sie does not wish to be summoned!" + return + else if(cult_mode.sacrifice_target && !(cult_mode.sacrifice_target in sacrificed)) + user << "The sacrifice is not complete. The portal would lack the power to open if you tried!" + return + else if(!cult_mode.eldergod) + user << "\"I am already here. There is no need to try to summon me now.\"" + return + var/confirm_final = alert(user, "This is the FINAL step to summon Nar-Sie, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No") + if(confirm_final == "No") + user << "You decide to prepare further before scribing the rune." + return + var/area/A = get_area(src) + var/locname = initial(A.name) + priority_announce("Figments from an eldritch god are being summoned by [user] into [locname] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg') + for(var/B in spiral_range_turfs(1, user, 1)) + var/turf/T = B + var/obj/machinery/shield/N = new(T) + N.name = "Rune-Scriber's Shield" + N.desc = "A potent shield summoned by cultists to protect them while they prepare the final ritual" + N.icon_state = "shield-red" + N.health = 60 + shields |= N + else + user << "Nar-Sie does not wish to be summoned!" return - var/area/A = get_area(src) - var/locname = initial(A.name) - priority_announce("Figments from an eldritch god are being summoned by [user] into [locname] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg') - for(var/B in spiral_range_turfs(1, user, 1)) - var/turf/T = B - var/obj/machinery/shield/N = new(T) - N.name = "Rune-Scriber's Shield" - N.desc = "A potent shield summoned by cultists to protect them while they prepare the final ritual" - N.icon_state = "shield-red" - N.health = 60 - shields |= N user.visible_message("[user] cuts open their arm and begins writing in their own blood!", \ "You slice open your arm and begin drawing a sigil of the Geometer.") user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick("l_arm", "r_arm")) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 64b6e1c6517..293ccca04ae 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -22,7 +22,7 @@ To draw a rune, use an arcane tome. icon = 'icons/obj/rune.dmi' icon_state = "1" unacidable = 1 - layer = TURF_LAYER + 0.08 + layer = ABOVE_NORMAL_TURF_LAYER color = rgb(255,0,0) var/invocation = "Aiy ele-mayo!" //This is said by cultists when the rune is invoked. @@ -458,28 +458,8 @@ var/list/teleport_runes = list() /obj/effect/rune/narsie/invoke(var/list/invokers) if(used) return - var/mob/living/user = invokers[1] if(ticker.mode.name == "cult") var/datum/game_mode/cult/cult_mode = ticker.mode - if(!("eldergod" in cult_mode.cult_objectives)) - message_admins("[user.real_name]([user.ckey]) tried to summon Nar-Sie when the objective was wrong") - for(var/M in invokers) - var/mob/living/L = M - L << "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"" - if(L.reagents) - L.reagents.add_reagent("hell_water", 10) - L.Weaken(7) - L.Stun(7) - fail_invoke() - log_game("Summon Nar-Sie rune failed - improper objective") - return - else - if(cult_mode.sacrifice_target && !(cult_mode.sacrifice_target in sacrificed)) - for(var/M in invokers) - M << "The sacrifice is not complete. The portal lacks the power to open!" - fail_invoke() - log_game("Summon Nar-Sie rune failed - sacrifice not complete") - return if(!cult_mode.eldergod) for(var/M in invokers) M << "Nar-Sie is already on this plane!" diff --git a/code/game/gamemodes/demon/demoninfo.dm b/code/game/gamemodes/demon/demoninfo.dm index b35fa604711..c9a2cd72e1a 100644 --- a/code/game/gamemodes/demon/demoninfo.dm +++ b/code/game/gamemodes/demon/demoninfo.dm @@ -182,6 +182,8 @@ var/global/list/lawlorify = list ( H.set_species(/datum/species/human, 1) H.regenerate_icons() give_base_spells() + if(istype(owner.current.loc, /obj/effect/dummy/slaughter/)) + owner.current.forceMove(get_turf(owner.current))//Fixes dying while jaunted leaving you permajaunted. form = BASIC_DEVIL /datum/devilinfo/proc/regress_blood_lizard() @@ -262,6 +264,8 @@ var/global/list/lawlorify = list ( world << 'sound/hallucinations/veryfar_noise.ogg' give_arch_spells() D.convert_to_archdevil() + if(istype(D.loc, /obj/effect/dummy/slaughter/)) + D.forceMove(get_turf(D))//Fixes dying while jaunted leaving you permajaunted. var/area/A = get_area(owner.current) if(A) notify_ghosts("An arch devil has ascended in \the [A.name]. Reach out to the devil to be given a new shell for your soul.", source = owner.current, attack_not_jump = 1) @@ -371,7 +375,8 @@ var/global/list/lawlorify = list ( reviveNumber++ if(body) body.revive(1,0) - body.forceMove(get_turf(body))//Fixes dying while jaunted leaving you permajaunted. + if(istype(body.loc, /obj/effect/dummy/slaughter/)) + body.forceMove(get_turf(body))//Fixes dying while jaunted leaving you permajaunted. if(istype(body, /mob/living/carbon/true_devil)) var/mob/living/carbon/true_devil/D = body if(D.oldform) diff --git a/code/game/gamemodes/demon/true_demon/_true_demon.dm b/code/game/gamemodes/demon/true_demon/_true_demon.dm index 3b725896d61..ef8790debe3 100644 --- a/code/game/gamemodes/demon/true_demon/_true_demon.dm +++ b/code/game/gamemodes/demon/true_demon/_true_demon.dm @@ -99,10 +99,9 @@ return 666 /mob/living/carbon/true_devil/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0) - if(mind && mind.devilinfo.bane == BANE_LIGHT) - if(has_bane(BANE_LIGHT)) - mind.disrupt_spells(-500) - return ..() //flashes don't stop devils UNLESS it's their bane. + if(mind && has_bane(BANE_LIGHT)) + mind.disrupt_spells(-500) + return ..() //flashes don't stop devils UNLESS it's their bane. /mob/living/carbon/true_devil/attacked_by(obj/item/I, mob/living/user, def_zone) @@ -129,11 +128,6 @@ /mob/living/carbon/true_devil/Process_Spacemove(movement_dir = 0) return 1 -/mob/living/carbon/true_devil/ex_act(severity) - if(ascended) - return 0 - return ..() - /mob/living/carbon/true_devil/singularity_act() if(ascended) return 0 @@ -194,3 +188,18 @@ /mob/living/carbon/true_devil/is_literate() return 1 + +/mob/living/carbon/true_devil/ex_act(severity, ex_target) + if(!ascended) + var/b_loss + switch (severity) + if (1) + b_loss = 500 + if (2) + b_loss = 150 + if(3) + b_loss = 30 + if(has_bane(BANE_LIGHT)) + b_loss *=2 + adjustBruteLoss(b_loss) + return ..() \ No newline at end of file diff --git a/code/game/gamemodes/demon/true_demon/inventory.dm b/code/game/gamemodes/demon/true_demon/inventory.dm index 23035370135..b288fab269c 100644 --- a/code/game/gamemodes/demon/true_demon/inventory.dm +++ b/code/game/gamemodes/demon/true_demon/inventory.dm @@ -20,7 +20,7 @@ hands_overlays += r_hand_image if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - r_hand.layer = 20 + r_hand.layer = ABOVE_HUD_LAYER r_hand.screen_loc = ui_rhand client.screen |= r_hand @@ -35,7 +35,7 @@ hands_overlays += l_hand_image if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - l_hand.layer = 20 + l_hand.layer = ABOVE_HUD_LAYER l_hand.screen_loc = ui_lhand client.screen |= l_hand if(hands_overlays.len) diff --git a/code/game/gamemodes/gang/dominator.dm b/code/game/gamemodes/gang/dominator.dm index bc1236d7d0e..d53fe91186a 100644 --- a/code/game/gamemodes/gang/dominator.dm +++ b/code/game/gamemodes/gang/dominator.dm @@ -5,7 +5,7 @@ icon_state = "dominator" density = 1 anchored = 1 - layer = 3.6 + layer = HIGH_OBJ_LAYER var/maxhealth = 200 var/health = 200 var/datum/gang/gang diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 0e0f23a3d0f..aac99630f9e 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -98,7 +98,7 @@ projectilesound = 'sound/weapons/taser2.ogg' loot = list(/obj/effect/decal/cleanable/robot_debris, /obj/item/weapon/ore/bluespace_crystal/artificial) del_on_death = 1 - deathmessage = "The swarmer explodes with a sharp pop!" + deathmessage = "explodes with a sharp pop!" var/resources = 0 //Resource points, generated by consuming metal/glass /mob/living/simple_animal/hostile/swarmer/Login() @@ -319,38 +319,38 @@ return /mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(var/mob/living/target) - if(target != src) - src << "Attempting to remove this being from our presence." - if(src.z != ZLEVEL_STATION) - src << "Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area." - return - if(do_mob(src, target, 30)) - var/cycle - for(cycle=0,cycle<100,cycle++) - var/random_location = locate(rand(37,202),rand(75,192),ZLEVEL_STATION)//Drunk dial a turf in the general ballpark of the station - if(istype(random_location, /turf/open/floor)) - var/turf/open/floor/F = random_location - if(F.air) - var/datum/gas_mixture/A = F.air - var/list/A_gases = A.gases - var/trace_gases - for(var/id in A_gases) - if(id in hardcoded_gases) - continue - trace_gases = TRUE - break - if((A_gases["o2"] && A_gases["o2"][MOLES] >= 16) && !A_gases["plasma"] && (!A_gases["co2"] || A_gases["co2"][MOLES] < 10) && !trace_gases)//Can most things breathe in this location? - if((A.temperature > 270) && (A.temperature < 360))//Not too hot, not too cold - var/pressure = A.return_pressure() - if((pressure > 20) && (pressure < 550))//Account for crushing pressure or vaccuums - if(ishuman(target))//If we're getting rid of a human, slap some energy cuffs on them to keep them away from us a little longer - var/obj/item/weapon/restraints/handcuffs/energy/used/Z = new /obj/item/weapon/restraints/handcuffs/energy/used(src) - var/mob/living/carbon/human/H = target - Z.apply_cuffs(H, src) - do_teleport(target, F, 0) - playsound(src,'sound/effects/sparks4.ogg',50,1) - break - return + if(target == src) + return + + if(src.z != ZLEVEL_STATION) + src << "Our bluespace transceiver cannot \ + locate a viable bluespace link, our teleportation abilities \ + are useless in this area." + return + + src << "Attempting to remove this being from \ + our presence." + + if(!do_mob(src, target, 30)) + return + + var/turf/open/floor/F = find_safe_turf(zlevel=ZLEVEL_STATION) + if(!F) + return + // If we're getting rid of a human, slap some energy cuffs on + // them to keep them away from us a little longer + + var/mob/living/carbon/human/H = target + if(ishuman(target) && (!H.handcuffed)) + H.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/used(H) + H.update_handcuffed() + add_logs(src, H, "handcuffed") + + var/datum/effect_system/spark_spread/S = new + S.set_up(4,0,get_turf(target)) + S.start() + playsound(src,'sound/effects/sparks4.ogg',50,1) + do_teleport(target, F, 0) /mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(var/obj/machinery/target) do_attack_animation(target) @@ -389,7 +389,7 @@ /obj/effect/overlay/temp/swarmer //temporary swarmer visual feedback objects icon = 'icons/mob/swarmer.dmi' - layer = MOB_LAYER + layer = BELOW_MOB_LAYER /obj/effect/overlay/temp/swarmer/disintegration icon_state = "disintegrate" @@ -462,7 +462,6 @@ src << "There is already a trap here. Aborting." return Fabricate(/obj/effect/swarmer/destructible/trap, 5) - return /obj/effect/swarmer/destructible/trap name = "swarmer trap" diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index b6fccab0bb2..a2b0f999bb8 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -144,14 +144,18 @@ visible_message("[src] twists and dissolves into a pile of green flesh!", \ "Your skin ruptures! Your flesh breaks apart! No disguise can ward off de--") restore() + barf_contents() ..() -/mob/living/simple_animal/hostile/morph/Destroy() +/mob/living/simple_animal/hostile/morph/proc/barf_contents() for(var/atom/movable/AM in src) AM.loc = loc if(prob(90)) step(AM, pick(alldirs)) - return ..() + +/mob/living/simple_animal/hostile/morph/wabbajack_act(mob/living/new_mob) + barf_contents() + . = ..() /mob/living/simple_animal/hostile/morph/Aggro() // automated only ..() diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 7ca8a800923..8f30a8bfca4 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -18,7 +18,7 @@ invisibility = INVISIBILITY_REVENANT health = INFINITY //Revenants don't use health, they use essence instead maxHealth = INFINITY - layer = 5 + layer = GHOST_LAYER healable = 0 sight = SEE_SELF see_invisible = SEE_INVISIBLE_NOLIGHTING diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index 88c386b94a6..6925d1b392f 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -43,11 +43,10 @@ /obj/effect/decal/cleanable/blood/innards, \ /obj/item/organ/heart/demon) del_on_death = 1 - deathmessage = "The generic slaughter demon screams in anger because this is the default death message!" + deathmessage = "screams in anger as it collapses into a puddle of viscera!" /mob/living/simple_animal/slaughter/New() ..() - deathmessage = "[src] screams in anger as it collapses into a puddle of viscera." var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new AddSpell(bloodspell) if(istype(loc, /obj/effect/dummy/slaughter)) @@ -77,7 +76,7 @@ name = "demon heart" desc = "Still it beats furiously, emanating an aura of utter hate." icon = 'icons/obj/surgery.dmi' - icon_state = "demon_heart" + icon_state = "demon_heart-on" origin_tech = "combat=5;biotech=8" /obj/item/organ/heart/demon/update_icon() @@ -129,7 +128,7 @@ icon_state = "bowmon" icon_living = "bowmon" - + deathmessage = "fades out, as all of its friends are released from its prison of hugs." loot = list(/mob/living/simple_animal/pet/cat/kitten{name = "Laughter"}) // Keep the people we hug! @@ -138,29 +137,24 @@ // HOT. PINK. //color = "#FF69B4" - -/mob/living/simple_animal/slaughter/laughter/New() - ..() - - deathmessage = "[src] fades out, as all of its friends are released from its prison of hugs." - /mob/living/simple_animal/slaughter/laughter/death() + release_friends() + . = ..() + +/mob/living/simple_animal/slaughter/laughter/wabbajack_act() + release_friends() + . = ..() + +/mob/living/simple_animal/slaughter/laughter/proc/release_friends() if(!consumed_mobs) - return ..() + return for(var/mob/living/M in consumed_mobs) M.loc = get_turf(src) if(M.revive(full_heal = 1)) - // Feel there should be a better way of FORCING a mob's ghost - // back into the body - if(!M.ckey) - for(var/mob/dead/observer/ghost in player_list) - if(M.real_name == ghost.real_name) - ghost.reenter_corpse() - break - M << "You leave the [src]'s warm embrace, and feel ready to take on the world." - - return ..() + M.grab_ghost(force = FALSE) + M << "You leave the [src]'s warm embrace, \ + and feel ready to take on the world." /mob/living/simple_animal/slaughter/laughter/bloodcrawl_swallow(var/mob/living/victim) if(consumed_mobs) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index fbd6fe472a8..0b2aeacba24 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -348,7 +348,5 @@ var/obj/item/clothing/suit/space/hardsuit/syndi/suit = H.wear_suit suit.ToggleHelmet() - var/obj/item/clothing/head/helmet/space/hardsuit/syndi/helmet = H.head - helmet.attack_self(H) H.internal = H.r_store diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index b10374a2dbf..67600b7e11a 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -48,7 +48,7 @@ var/bomb_set icon = 'icons/obj/machines/nuke_terminal.dmi' icon_state = "nuclearbomb_base" anchored = 1 //stops it being moved - layer = 4 + layer = MOB_LAYER /obj/machinery/nuclearbomb/syndicate @@ -429,10 +429,16 @@ This is here to make the tiles around the station mininuke change when it's arme get(src, /mob) << "You can't help but feel that you just lost something back there..." qdel(src) -/obj/item/weapon/disk/nuclear/Destroy() +/obj/item/weapon/disk/nuclear/Destroy(force) + var/turf/diskturf = get_turf(src) + + if(force) + message_admins("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - JMP":"nonexistent location"]).") + log_game("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z]":"nonexistent location"]).") + return ..() + if(blobstart.len > 0) var/turf/targetturf = get_turf(pick(blobstart)) - var/turf/diskturf = get_turf(src) if(ismob(loc)) var/mob/M = loc M.remove_from_mob(src) @@ -444,4 +450,4 @@ This is here to make the tiles around the station mininuke change when it's arme log_game("[src] has been destroyed in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z]":"nonexistent location"]). Moving it to ([targetturf.x], [targetturf.y], [targetturf.z]).") else throw EXCEPTION("Unable to find a blobstart landmark") - return QDEL_HINT_LETMELIVE //Cancel destruction regardless of success + return QDEL_HINT_LETMELIVE //Cancel destruction unless forced diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 457823e1ab4..9cc1c93fc1c 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -224,7 +224,11 @@ for(var/mob/living/player in player_list) if(player.mind && player.mind != owner) if(player.stat != DEAD) - if(istype(player, /mob/living/silicon)) //Borgs are technically dead anyways + if(issilicon(player)) //Borgs are technically dead anyways + continue + if(isanimal(player)) //animals don't count + continue + if(isbrain(player)) //also technically dead continue if(get_area(player) == A) if(!player.mind.special_role && !istype(get_turf(player.mind.current), /turf/open/floor/plasteel/shuttle/red)) @@ -247,7 +251,11 @@ for(var/mob/living/player in player_list) //Make sure nobody else is onboard if(player.mind && player.mind != owner) if(player.stat != DEAD) - if(istype(player, /mob/living/silicon)) + if(issilicon(player)) //Borgs are technically dead anyways + continue + if(isanimal(player)) //animals don't count + continue + if(isbrain(player)) //also technically dead continue if(get_area(player) == A) if(player.real_name != owner.current.real_name && !istype(get_turf(player.mind.current), /turf/open/floor/plasteel/shuttle/red)) @@ -256,7 +264,11 @@ for(var/mob/living/player in player_list) //Make sure at least one of you is onboard if(player.mind && player.mind != owner) if(player.stat != DEAD) - if(istype(player, /mob/living/silicon)) + if(issilicon(player)) //Borgs are technically dead anyways + continue + if(isanimal(player)) //animals don't count + continue + if(isbrain(player)) //also technically dead continue if(get_area(player) == A) if(player.real_name == owner.current.real_name && !istype(get_turf(player.mind.current), /turf/open/floor/plasteel/shuttle/red)) diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index 748b9f8a3e7..d13a9d588fd 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -27,7 +27,7 @@ var/hsboxspawn = 1 var/hsbinfo = null //items that shouldn't spawn on the floor because they would bug or act weird var/global/list/spawn_forbidden = list( - /obj/item/weapon/grab, /obj/item/tk_grab, /obj/item/weapon/implant, // not implanter, the actual thing that is inside you + /obj/item/tk_grab, /obj/item/weapon/implant, // not implanter, the actual thing that is inside you /obj/item/assembly,/obj/item/device/onetankbomb, /obj/item/radio, /obj/item/device/pda/ai, /obj/item/device/uplink, /obj/item/smallDelivery, /obj/item/missile,/obj/item/projectile, /obj/item/borg/sight,/obj/item/borg/stun,/obj/item/weapon/robot_module) @@ -145,28 +145,28 @@ var/hsboxspawn = 1 P.wear_suit.layer = initial(P.wear_suit.layer) P.wear_suit = null P.wear_suit = new/obj/item/clothing/suit/space(P) - P.wear_suit.layer = 20 + P.wear_suit.layer = ABOVE_HUD_LAYER P.update_inv_wear_suit() if(P.head) P.head.loc = P.loc P.head.layer = initial(P.head.layer) P.head = null P.head = new/obj/item/clothing/head/helmet/space(P) - P.head.layer = 20 + P.head.layer = ABOVE_HUD_LAYER P.update_inv_head() if(P.wear_mask) P.wear_mask.loc = P.loc P.wear_mask.layer = initial(P.wear_mask.layer) P.wear_mask = null P.wear_mask = new/obj/item/clothing/mask/gas(P) - P.wear_mask.layer = 20 + P.wear_mask.layer = ABOVE_HUD_LAYER P.update_inv_wear_mask() if(P.back) P.back.loc = P.loc P.back.layer = initial(P.back.layer) P.back = null P.back = new/obj/item/weapon/tank/jetpack/oxygen(P) - P.back.layer = 20 + P.back.layer = ABOVE_HUD_LAYER P.update_inv_back() P.internal = P.back P.update_internals_hud_icon(1) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 360311ad9c1..d741a28896e 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -370,7 +370,10 @@ /datum/spellbook_entry/item/cursed_heart name = "Cursed Heart" - desc = "A heart that has been revived by dark magicks, the user must concentrate to ensure the heart beats, but every beat heals them. It must beat every 6 seconds." + desc = "A heart that has been revived by dark magicks, the user must \ + concentrate to ensure the heart beats, but every beat heals them. It \ + must beat every 6 seconds. The heart is fickle, and will not work for a \ + lich." item_path = /obj/item/organ/heart/cursed/wizard log_name = "CH" cost = 1 diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index 4121a1baefd..a995968f4f0 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -5,7 +5,7 @@ name = "bluespace gigabeacon" desc = "A device that draws power from bluespace and creates a permanent tracking beacon." level = 1 // underfloor - layer = 2.5 + layer = LOW_OBJ_LAYER anchored = 1 use_power = 1 idle_power_usage = 0 diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index ec0f8298d81..c9b1909c808 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -73,6 +73,8 @@ /obj/machinery/sleeper/close_machine(mob/user) if((isnull(user) || istype(user)) && state_open && !panel_open) ..(user) + if(occupant && occupant.stat != DEAD) + occupant << "You feel cool air surround you. You go numb as your senses turn inward." /obj/machinery/sleeper/attack_animal(mob/living/simple_animal/M) if(M.environment_smash) diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index acf294fd25c..e75c9827e14 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -2,7 +2,7 @@ name = "\improper AI liquid dispenser" icon = 'icons/obj/device.dmi' icon_state = "motion3" - layer = 3 + layer = PROJECTILE_HIT_THRESHHOLD_LAYER anchored = 1 var/uses = 20 var/disabled = 1 diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 6e2d45a1f1a..5ba7192f8bd 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -10,7 +10,7 @@ use_power = 2 idle_power_usage = 5 active_power_usage = 10 - layer = 5 + layer = WALL_OBJ_LAYER var/health = 50 var/list/network = list("SS13") diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 45f7b995486..3fee54bb4e0 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -152,19 +152,6 @@ if(default_deconstruction_crowbar(I)) return - if(istype(I, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = I - if(!ismob(G.affecting)) - return - - if(!state_open) - user << "Open the scanner first." - return - - var/mob/M = G.affecting - M.forceMove(loc) - qdel(G) - return return ..() /obj/machinery/dna_scannernew/attack_hand(mob/user) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 5a4292e3e42..b57a640508d 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -986,7 +986,7 @@ var/list/airlock_overlays = list() sleep(5) src.density = 0 sleep(9) - src.layer = 2.7 + src.layer = OPEN_DOOR_LAYER update_icon(AIRLOCK_OPEN, 1) SetOpacity(0) operating = 0 @@ -1023,7 +1023,7 @@ var/list/airlock_overlays = list() return 1 operating = 1 update_icon(AIRLOCK_CLOSING, 1) - src.layer = 3.1 + src.layer = CLOSED_DOOR_LAYER sleep(5) src.density = 1 if(!safe) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 81f3a3af60d..015c78b195a 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -6,7 +6,7 @@ anchored = 1 opacity = 1 density = 1 - layer = 2.7 + layer = OPEN_DOOR_LAYER power_channel = ENVIRON var/secondsElectrified = 0 @@ -19,7 +19,7 @@ var/heat_proof = 0 // For rglass-windowed airlocks and firedoors var/emergency = 0 // Emergency access override var/sub_door = 0 // 1 if it's meant to go under another door. - var/closingLayer = 3.1 + var/closingLayer = CLOSED_DOOR_LAYER var/autoclose = 0 //does it automatically close after some time var/safe = 1 //whether the door detects things and mobs in its way and reopen or crushes them. var/locked = 0 //whether the door is bolted or not. @@ -29,9 +29,9 @@ /obj/machinery/door/New() ..() if(density) - layer = 3.1 //Above most items if closed + layer = CLOSED_DOOR_LAYER //Above most items if closed else - layer = 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6 + layer = OPEN_DOOR_LAYER //Under all objects if opened. 2.7 due to tables being at 2.6 update_freelook_sight() air_update_turf(1) airlocks += src @@ -245,7 +245,7 @@ obj/machinery/door/proc/try_to_crowbar(obj/item/I, mob/user) sleep(5) density = 0 sleep(5) - layer = 2.7 + layer = OPEN_DOOR_LAYER update_icon() SetOpacity(0) operating = 0 diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index e2d5046c0d3..b94612e7d3f 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -18,7 +18,7 @@ glass = 1 var/nextstate = null sub_door = 1 - closingLayer = 3.11 + closingLayer = CLOSED_FIREDOOR_LAYER /obj/machinery/door/firedoor/Bumped(atom/AM) if(panel_open || operating) diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm index 75fa01a2979..9c114009071 100644 --- a/code/game/machinery/doors/shutters.dm +++ b/code/game/machinery/doors/shutters.dm @@ -3,7 +3,7 @@ name = "shutters" desc = "Heavy duty metal shutters that opens mechanically." icon = 'icons/obj/doors/shutters.dmi' - layer = 3.1 + layer = CLOSED_DOOR_LAYER /obj/machinery/door/poddoor/shutters/preopen icon_state = "open" @@ -15,14 +15,14 @@ /obj/machinery/door/poddoor/shutters/New() ..() - layer = 3.1 //to handle /obj/machinery/door/New() resetting the layer. + layer = CLOSED_DOOR_LAYER //to handle /obj/machinery/door/New() resetting the layer. /obj/machinery/door/poddoor/shutters/open(ignorepower = 0) ..() - layer = 3.1 + layer = CLOSED_DOOR_LAYER /obj/machinery/door/poddoor/shutters/close(ignorepower = 0) ..() - layer = 3.1 \ No newline at end of file + layer = CLOSED_DOOR_LAYER \ No newline at end of file diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index c9836d94f24..07e44ffe1be 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -1,15 +1,23 @@ +#define DRONE_PRODUCTION "production" +#define DRONE_RECHARGING "recharging" +#define DRONE_READY "ready" + /obj/machinery/droneDispenser //Most customizable machine 2015 name = "drone shell dispenser" - desc = "A hefty machine that, when supplied with metal and glass, will periodically create a drone shell. Does not need to be manually operated." + desc = "A hefty machine that, when supplied with metal and glass, \ + will periodically create a drone shell. \ + Does not need to be manually operated." + icon = 'icons/obj/machines/droneDispenser.dmi' icon_state = "on" anchored = 1 density = 1 - var/health = 100 //The health of the drone dispenser. It will break if it goes below 0 + var/health = 100 var/max_health = 100 - var/icon_off = "off" //These variables allow for different icons when creating custom dispensers + // These allow for different icons when creating custom dispensers + var/icon_off = "off" var/icon_on = "on" var/icon_recharging = "recharge" var/icon_creating = "make" @@ -20,9 +28,16 @@ var/glass_cost = 1000 var/power_used = 1000 - var/droneMadeRecently = 0 + var/mode = DRONE_READY + var/timer var/cooldownTime = 1800 //3 minutes - var/dispense_type = /obj/item/drone_shell //The item the dispenser will create + var/production_time = 30 + //The item the dispenser will create + var/dispense_type = /obj/item/drone_shell + + // The maximum number of "idle" drone shells it will make before + // ceasing production. Set to 0 for infinite. + var/maximum_idle = 3 var/work_sound = 'sound/items/rped.ogg' var/create_sound = 'sound/items/Deconstruct.ogg' @@ -31,7 +46,8 @@ var/begin_create_message = "whirs to life!" var/end_create_message = "dispenses a drone shell." var/recharge_message = "pings." - var/recharging_text = "It is whirring and clicking. It seems to be recharging." + var/recharging_text = "It is whirring and clicking. \ + It seems to be recharging." var/break_message = "lets out a tinny alarm before falling dark." var/break_sound = 'sound/machines/warning-buzzer.ogg' @@ -39,15 +55,14 @@ /obj/machinery/droneDispenser/New() ..() health = max_health - materials = new(src, list(MAT_METAL=1, MAT_GLASS=1), MINERAL_MATERIAL_AMOUNT*MAX_STACK_SIZE*2) + materials = new(src, list(MAT_METAL=1, MAT_GLASS=1), + MINERAL_MATERIAL_AMOUNT*MAX_STACK_SIZE*2) + using_materials = list(MAT_METAL=metal_cost, MAT_GLASS=glass_cost) - SSmachine.processing |= src /obj/machinery/droneDispenser/Destroy() - SSmachine.processing -= src qdel(materials) - materials = null - return ..() + . = ..() /obj/machinery/droneDispenser/preloaded/New() ..() @@ -55,9 +70,11 @@ /obj/machinery/droneDispenser/syndrone //Please forgive me name = "syndrone shell dispenser" - desc = "A suspicious machine that will create Syndicate exterminator drones when supplied with metal and glass. Disgusting." + desc = "A suspicious machine that will create Syndicate \ + exterminator drones when supplied with metal and glass. Disgusting." dispense_type = /obj/item/drone_shell/syndrone - cooldownTime = 100 //If we're gonna be a jackass, go the full mile - 10 second recharge timer + //If we're gonna be a jackass, go the full mile - 10 second recharge timer + cooldownTime = 100 end_create_message = "dispenses a suspicious drone shell." /obj/machinery/droneDispenser/syndrone/New() @@ -66,15 +83,20 @@ /obj/machinery/droneDispenser/syndrone/badass //Please forgive me name = "badass syndrone shell dispenser" - desc = "A suspicious machine that will create Syndicate exterminator drones when supplied with metal and glass. Disgusting. This one seems ominous." + desc = "A suspicious machine that will create Syndicate \ + exterminator drones when supplied with metal and glass. \ + Disgusting. This one seems ominous." dispense_type = /obj/item/drone_shell/syndrone/badass end_create_message = "dispenses a ominous suspicious drone shell." // I don't need your forgiveness, this is awesome. /obj/machinery/droneDispenser/snowflake name = "snowflake drone shell dispenser" - desc = "A hefty machine that, when supplied with metal and glass, will periodically create a snowflake drone shell. Does not need to be manually operated." - dispense_type = /obj/item/drone_shell/snowflake //The item the dispenser will create + desc = "A hefty machine that, when supplied with metal and glass, \ + will periodically create a snowflake drone shell. \ + Does not need to be manually operated." + dispense_type = /obj/item/drone_shell/snowflake + end_create_message = "dispenses a snowflake drone shell." // Those holoprojectors aren't cheap metal_cost = 2000 glass_cost = 2000 @@ -84,9 +106,12 @@ ..() materials.insert_amount(10000) -/obj/machinery/droneDispenser/hivebot //An example of a custom drone dispenser. This one requires no materials and creates basic hivebots +// An example of a custom drone dispenser. +// This one requires no materials and creates basic hivebots +/obj/machinery/droneDispenser/hivebot name = "hivebot fabricator" - desc = "A large, bulky machine that whirs with activity, steam hissing from vents in its sides." + desc = "A large, bulky machine that whirs with activity, \ + steam hissing from vents in its sides." icon = 'icons/obj/objects.dmi' icon_state = "hivebot_fab" icon_off = "hivebot_fab" @@ -105,7 +130,8 @@ /obj/machinery/droneDispenser/swarmer name = "swarmer fabricator" - desc = "An alien machine of unknown origin. It whirs and hums with green-blue light, the air above it shimmering." + desc = "An alien machine of unknown origin. \ + It whirs and hums with green-blue light, the air above it shimmering." icon = 'icons/obj/machines/gateway.dmi' icon_state = "toffcenter" icon_off = "toffcenter" @@ -115,9 +141,12 @@ metal_cost = 0 glass_cost = 0 cooldownTime = 300 //30 seconds + maximum_idle = 0 // Swarmers have no restraint dispense_type = /obj/item/device/unactivated_swarmer - begin_create_message = "hums softly as an interface appears above it, scrolling by at unreadable speed." - end_create_message = "materializes a strange shell, which drops to the ground." + begin_create_message = "hums softly as an interface appears above it, \ + scrolling by at unreadable speed." + end_create_message = "materializes a strange shell, which drops to the \ + ground." recharging_text = "Its lights are slowly increasing in brightness." work_sound = 'sound/effects/EMPulse.ogg' create_sound = 'sound/effects/phasein.ogg' @@ -126,114 +155,158 @@ /obj/machinery/droneDispenser/examine(mob/user) ..() - if(droneMadeRecently && !stat && recharging_text) + if((mode == DRONE_RECHARGING) && !stat && recharging_text) user << "[recharging_text]" if(stat & BROKEN) - user << "[src] is smoking and steadily buzzing. It seems to be broken." + user << "[src] is smoking and steadily buzzing. \ + It seems to be broken." if(metal_cost) - user << "It has [materials.amount(MAT_METAL)] units of metal stored." + user << "It has [materials.amount(MAT_METAL)] \ + units of metal stored." if(glass_cost) - user << "It has [materials.amount(MAT_GLASS)] units of glass stored." + user << "It has [materials.amount(MAT_GLASS)] \ + units of glass stored." /obj/machinery/droneDispenser/power_change() ..() - if(stat & BROKEN) - return + if(powered()) + stat &= ~NOPOWER else - if(powered()) - stat &= ~NOPOWER - else - icon_state = "off" - stat |= NOPOWER + stat |= NOPOWER + update_icon() /obj/machinery/droneDispenser/process() ..() - if(stat & (NOPOWER|BROKEN) || !anchored) + if((stat & (NOPOWER|BROKEN)) || !anchored) return - if((metal_cost && glass_cost) && materials.can_use_amount(mats=using_materials)) + + if(!materials.has_materials(using_materials)) + return // We require more minerals + + // We are currently in the middle of something + if(timer > world.time) return - if(droneMadeRecently) - icon_state = icon_recharging - return - droneMadeRecently = 1 - if(begin_create_message) - visible_message("[src] [begin_create_message]") - if(work_sound) - playsound(src, work_sound, 50, 1) - icon_state = icon_creating - sleep(30) - icon_state = icon_on - materials.use_amount(using_materials) - if(power_used) - use_power(power_used) - new dispense_type(loc) - if(create_sound) - playsound(src, create_sound, 50, 1) - if(end_create_message) - visible_message("[src] [end_create_message]") - icon_state = icon_recharging - sleep(cooldownTime) - if(!(stat & BROKEN)) - icon_state = icon_on - else + + switch(mode) + if(DRONE_READY) + // If we have X drone shells already on our turf + if(maximum_idle && (count_shells() >= maximum_idle)) + return // then do nothing; check again next tick + if(begin_create_message) + visible_message("\ + [src] [begin_create_message]") + if(work_sound) + playsound(src, work_sound, 50, 1) + mode = DRONE_PRODUCTION + timer = world.time + production_time + update_icon() + + if(DRONE_PRODUCTION) + materials.use_amount(using_materials) + if(power_used) + use_power(power_used) + + new dispense_type(loc) + + if(create_sound) + playsound(src, create_sound, 50, 1) + if(end_create_message) + visible_message("[src] \ + [end_create_message]") + + mode = DRONE_RECHARGING + timer = world.time + cooldownTime + update_icon() + + if(DRONE_RECHARGING) + if(recharge_sound) + playsound(src, recharge_sound, 50, 1) + if(recharge_message) + visible_message("\ + [src] [recharge_message]") + + mode = DRONE_READY + update_icon() + +/obj/machinery/droneDispenser/proc/count_shells() + . = 0 + for(var/a in loc) + if(istype(a, dispense_type)) + .++ + +/obj/machinery/droneDispenser/update_icon() + if(stat & (BROKEN|NOPOWER)) icon_state = icon_off - droneMadeRecently = 0 - if(recharge_sound) - playsound(src, recharge_sound, 50, 1) - if(recharge_message) - visible_message("[src] [recharge_message]") + else if(mode == DRONE_RECHARGING) + icon_state = icon_recharging + else if(mode == DRONE_PRODUCTION) + icon_state = icon_creating + else + icon_state = icon_on /obj/machinery/droneDispenser/attackby(obj/item/O, mob/living/user) if(istype(O, /obj/item/stack)) if(!O.materials[MAT_METAL] && !O.materials[MAT_GLASS]) return ..() if(!metal_cost && !glass_cost) - user << "There isn't a place to insert [O]!" - return - var/stack = 1 - var/obj/item/stack/sheets - sheets = O - stack = (input(user, "How many sheets do you want to add?.", "Drone Dispenser", "[stack]") as num) - if(stack <= 0) - return - if(!user.canUseTopic(src)) + user << "There isn't a place \ + to insert [O]!" return + var/obj/item/stack/sheets = O if(!user.canUnEquip(sheets)) - user << "[O] is stuck to your hand, you can't get it off!" + user << "[O] is stuck to your hand, \ + you can't get it off!" return - stack = Clamp(stack, 1, sheets.max_amount) - stack = materials.insert_stack(sheets, stack) - if(stack) - user << "You insert [stack] sheet[stack > 1 ? "s" : ""] into [src]." + + var/used = materials.insert_stack(sheets, sheets.amount) + + if(used) + user << "You insert [used] \ + sheet[used > 1 ? "s" : ""] into [src]." else - user << "The [src] can't use [sheets]." + user << "The [src] isn't accepting the \ + [sheets]." else if(istype(O, /obj/item/weapon/weldingtool)) - if(stat & BROKEN) - var/obj/item/weapon/weldingtool/WT = O - if(!WT.isOn()) - return - if(WT.get_fuel() < 1) - user << "You need more fuel to complete this task!" - return - playsound(src, 'sound/items/Welder.ogg', 50, 1) - user.visible_message("[user] begins patching up [src] with [WT].", \ - "You begin restoring the damage to [src]...") - if(!do_after(user, 40/O.toolspeed, target = src)) - return - if(!src || !WT.remove_fuel(1, user)) return - user.visible_message("[user] fixes [src]!", \ - "You restore [src] to operation.") - stat &= ~BROKEN - health = max_health - if(!stat) - icon_state = icon_on - else + if(!(stat & BROKEN)) user << "[src] doesn't need repairs." + return + + var/obj/item/weapon/weldingtool/WT = O + + if(!WT.isOn()) + return + + if(WT.get_fuel() < 1) + user << "You need more fuel to \ + complete this task!" + return + + playsound(src, 'sound/items/Welder.ogg', 50, 1) + user.visible_message( + "[user] begins patching up \ + [src] with [WT].", + "You begin restoring the \ + damage to [src]...") + + if(!do_after(user, 40/O.toolspeed, target = src)) + return + if(!src || !WT.remove_fuel(1, user)) + return + + user.visible_message( + "[user] fixes [src]!", + "You restore [src] to operation.") + + stat &= ~BROKEN + health = max_health + update_icon() else return ..() -/obj/machinery/droneDispenser/take_damage(damage, damage_type = BRUTE, sound_effect = 1) +/obj/machinery/droneDispenser/take_damage(damage, damage_type = BRUTE, + sound_effect = TRUE) + // But why would you hurt the dispenser? switch(damage_type) if(BURN) if(sound_effect) @@ -249,9 +322,13 @@ health = max(health - damage, 0) if(!health && !(stat & BROKEN)) if(break_message) - audible_message("[src] [break_message]") + audible_message("[src] \ + [break_message]") if(break_sound) playsound(src, break_sound, 50, 1) stat |= BROKEN - icon_state = icon_off + update_icon() +#undef DRONE_PRODUCTION +#undef DRONE_RECHARGING +#undef DRONE_READY diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 49bf6e7d916..f776b3929fd 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -35,7 +35,7 @@ var/const/HOLOPAD_MODE = RANGE_BASED name = "\improper AI holopad" desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely." icon_state = "holopad0" - layer = 2.1 + layer = LOW_OBJ_LAYER flags = HEAR languages = ROBOT | HUMAN var/list/masters = list()//List of AIs that use the holopad diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 0eb8c805d4c..56267483da4 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -11,7 +11,7 @@ name = "electromagnetic generator" desc = "A device that uses station power to create points of magnetic energy." level = 1 // underfloor - layer = 2.5 + layer = LOW_OBJ_LAYER anchored = 1 use_power = 1 idle_power_usage = 50 diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 0bf936413c2..9b644c909bc 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -8,7 +8,7 @@ name = "navigation beacon" desc = "A radio beacon used for bot navigation." level = 1 // underfloor - layer = 2.5 + layer = LOW_OBJ_LAYER anchored = 1 var/open = 0 // true if cover is open diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index a920d418d14..06c78ba1905 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -178,7 +178,7 @@ qdel(I) qdel(J) H.icon = HI - H.layer = 25 + H.layer = ABOVE_HUD_LAYER usr.mapobjs += H #else @@ -296,7 +296,7 @@ H.icon = I qdel(I) - H.layer = 25 + H.layer = ABOVE_HUD_LAYER usr.mapobjs += H #endif diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index d015bb1a975..6a67e4e3f07 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/turrets.dmi' icon_state = "grey_target_prism" anchored = 1 - layer = 3 + layer = OBJ_LAYER invisibility = INVISIBILITY_OBSERVER //the turret is invisible if it's inside its cover density = 1 use_power = 1 //this turret uses and requires power @@ -502,7 +502,7 @@ if(cover) cover.icon_state = "openTurretCover" raised = 1 - layer = 4 + layer = MOB_LAYER /obj/machinery/porta_turret/proc/popDown() //pops the turret down if(disabled) @@ -511,7 +511,7 @@ return if(stat & BROKEN) return - layer = 3 + layer = OBJ_LAYER raising = 1 if(cover) flick("popdown", cover) diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm index a65694405a7..bb399096382 100644 --- a/code/game/machinery/porta_turret/portable_turret_cover.dm +++ b/code/game/machinery/porta_turret/portable_turret_cover.dm @@ -8,7 +8,7 @@ icon = 'icons/obj/turrets.dmi' icon_state = "turretCover" anchored = 1 - layer = 3.5 + layer = HIGH_OBJ_LAYER density = 0 var/obj/machinery/porta_turret/parent_turret = null diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 319ce51d949..4b37378f666 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -5,7 +5,7 @@ var/const/SAFETY_COOLDOWN = 100 desc = "A large crushing machine which is used to recycle small items ineffeciently; there are lights on the side of it." icon = 'icons/obj/recycling.dmi' icon_state = "grinder-o0" - layer = MOB_LAYER+1 // Overhead + layer = ABOVE_ALL_MOB_LAYER // Overhead anchored = 1 density = 1 var/safety_mode = FALSE // Temporarily stops machine if it detects a mob diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index c0658a1fdc5..3243e0cf5fb 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -111,7 +111,7 @@ anchored = 0 density = 1 - layer = MOB_LAYER - 0.2 //so people can't hide it and it's REALLY OBVIOUS + layer = BELOW_MOB_LAYER //so people can't hide it and it's REALLY OBVIOUS stat = 0 var/active = 0 diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index a947c472511..26692706d2a 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -7,7 +7,7 @@ anchored = 0 density = 0 - layer = MOB_LAYER - 0.2 //so people can't hide it and it's REALLY OBVIOUS + layer = BELOW_MOB_LAYER //so people can't hide it and it's REALLY OBVIOUS unacidable = 1 var/timer = 60 diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 1b18ea95e3a..3145ab44da8 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -3,7 +3,7 @@ desc = "A large metallic machine with an entrance and an exit. A sign on the side reads, 'human go in, robot come out', human must be lying down and alive. Has to cooldown between each use." icon = 'icons/obj/recycling.dmi' icon_state = "separator-AO1" - layer = MOB_LAYER+1 // Overhead + layer = ABOVE_ALL_MOB_LAYER // Overhead anchored = 1 density = 0 var/transform_dead = 0 diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 55479c7e462..edfe1f58dc8 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -15,7 +15,7 @@ desc = "A generic vending machine." icon = 'icons/obj/vending.dmi' icon_state = "generic" - layer = 2.9 + layer = BELOW_OBJ_LAYER anchored = 1 density = 1 verb_say = "beeps" @@ -84,7 +84,8 @@ /obj/machinery/vending/snack = "Getmore Chocolate Corp", /obj/machinery/vending/cola = "Robust Softdrinks", /obj/machinery/vending/cigarette = "ShadyCigs Deluxe", - /obj/machinery/vending/autodrobe = "AutoDrobe") + /obj/machinery/vending/autodrobe = "AutoDrobe", + /obj/machinery/vending/clothing = "ClothesMate") /obj/item/weapon/circuitboard/machine/vendor/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/screwdriver)) diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index eb062334719..f43d5b07698 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -192,14 +192,6 @@ if(default_deconstruction_screwdriver(user, null, null, W)) update_icon() return - else if(istype(W,/obj/item/weapon/grab)) - if(state_open) - var/obj/item/weapon/grab/G = W - if(iscorgi(G.affecting)) - has_corgi = 1 - G.affecting.loc = src - qdel(G) - update_icon() else if(user.a_intent != "harm") @@ -232,6 +224,17 @@ user << "[src] is busy." return + if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + var/mob/living/L = user.pulling + if(L.buckled || L.buckled_mobs.len) + return + if(state_open) + if(iscorgi(L)) + has_corgi = 1 + L.forceMove(src) + update_icon() + return + if(!state_open) open_machine() else diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 81ba3e89b21..d9620ef7132 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -264,11 +264,11 @@ /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/New() ..() - flags |= NOREACT + create_reagents(max_volume) + reagents.set_reacting(FALSE) syringes = new known_reagents = list("epinephrine"="Epinephrine","charcoal"="Charcoal") processed_reagents = new - create_reagents(max_volume) /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/detach() SSobj.processing -= src @@ -280,8 +280,8 @@ /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/critfail() ..() - flags &= ~NOREACT - return + if(reagents) + reagents.set_reacting(TRUE) /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/can_attach(obj/mecha/medical/M) if(..()) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 6c62de01260..afdd7191fa8 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -20,7 +20,7 @@ opacity = 1 ///opaque. Menacing. anchored = 1 //no pulling around. unacidable = 1 //and no deleting hoomans inside - layer = MOB_LAYER - 0.2//icon draw layer + layer = BELOW_MOB_LAYER//icon draw layer infra_luminosity = 15 //byond implementation is bugged. force = 5 flags = HEAR diff --git a/code/game/objects/effects/decals/Cleanable/aliens.dm b/code/game/objects/effects/decals/Cleanable/aliens.dm index 7e358f18fb4..36bf7577bb1 100644 --- a/code/game/objects/effects/decals/Cleanable/aliens.dm +++ b/code/game/objects/effects/decals/Cleanable/aliens.dm @@ -5,7 +5,7 @@ desc = "It's green and acidic. It looks like... blood?" gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/blood.dmi' icon_state = "xfloor1" random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 20c32cca078..e6e90cbde1c 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -3,7 +3,7 @@ desc = "It's red and gooey. Perhaps it's the chef's cooking?" gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/blood.dmi' icon_state = "floor1" random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") @@ -38,7 +38,7 @@ desc = "Your instincts say you shouldn't be following these." gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER random_icon_states = null var/list/existing_dirs = list() blood_DNA = list() @@ -53,7 +53,7 @@ desc = "They look bloody and gruesome." gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/blood.dmi' icon_state = "gibbl5" random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index b4d66d84595..f7f4f5fe953 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -3,7 +3,7 @@ desc = "Someone should clean that up." gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/obj/objects.dmi' icon_state = "shards" @@ -26,7 +26,7 @@ icon_state = "dirt" gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER mouse_opacity = 0 /obj/effect/decal/cleanable/flour @@ -34,7 +34,7 @@ desc = "It's still good. Four second rule!" gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon_state = "flour" /obj/effect/decal/cleanable/greenglow @@ -42,7 +42,7 @@ desc = "Jeez. I hope that's not for lunch." gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER luminosity = 1 icon_state = "greenglow" @@ -53,7 +53,7 @@ name = "cobweb" desc = "Somebody should remove that." density = 0 - layer = 3 + layer = OBJ_LAYER icon_state = "cobweb1" burntime = 1 @@ -64,7 +64,7 @@ name = "gooey grey mass" desc = "It looks like a melted... something." density = 0 - layer = 3 + layer = OBJ_LAYER icon = 'icons/obj/chemical.dmi' icon_state = "molten" @@ -72,7 +72,7 @@ name = "cobweb" desc = "Somebody should remove that." density = 0 - layer = 3 + layer = OBJ_LAYER icon_state = "cobweb2" //Vomit (sorry) @@ -81,7 +81,7 @@ desc = "Gosh, how unpleasant." gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/blood.dmi' icon_state = "vomit_1" random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") @@ -113,14 +113,14 @@ name = "tomato smudge" desc = "It's red." density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3") /obj/effect/decal/cleanable/plant_smudge name = "plant smudge" density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_plant") @@ -128,7 +128,7 @@ name = "smashed egg" desc = "Seems like this one won't hatch." density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3") @@ -136,7 +136,7 @@ name = "smashed pie" desc = "It's pie cream from a cream pie." density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_pie") @@ -153,7 +153,7 @@ icon_state = "shreds" gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER /obj/effect/decal/cleanable/shreds/New() pixel_x = rand(-5, 5) diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm index af2ff562590..e255f497ca2 100644 --- a/code/game/objects/effects/decals/Cleanable/robots.dm +++ b/code/game/objects/effects/decals/Cleanable/robots.dm @@ -5,7 +5,7 @@ desc = "It's a useless heap of junk... or is it?" gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/mob/robots.dmi' icon_state = "gib1" random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7") @@ -44,7 +44,7 @@ desc = "It's black and greasy. Looks like Beepsky made another mess." gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/mob/robots.dmi' icon_state = "floor1" var/viruses = list() diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index 2f5bd9ea000..2948ada90d0 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -3,7 +3,7 @@ desc = "Graffiti. Damn kids." icon = 'icons/effects/crayondecal.dmi' icon_state = "rune1" - layer = 2.1 + layer = ABOVE_NORMAL_TURF_LAYER var/do_icon_rotate = TRUE /obj/effect/decal/cleanable/crayon/examine() @@ -31,7 +31,7 @@ /obj/effect/decal/cleanable/crayon/gang - layer = 3.6 //Harder to hide + layer = HIGH_OBJ_LAYER //Harder to hide do_icon_rotate = FALSE //These are designed to always face south, so no rotation please. var/datum/gang/gang diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index 8daf88c6c42..762c702df1c 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -2,7 +2,7 @@ name = "pointer" icon = 'icons/mob/screen_gen.dmi' icon_state = "arrow" - layer = 16 + layer = POINT_LAYER duration = 25 /obj/effect/overlay/temp/point/New(atom/target, set_invis = 0) @@ -12,23 +12,18 @@ pixel_y = target.pixel_y invisibility = set_invis -// Used for spray that you spray at walls, tables, hydrovats etc -/obj/effect/decal/spraystill - density = 0 - layer = 50 - //Used by spraybottles. /obj/effect/decal/chempuff name = "chemicals" icon = 'icons/obj/chempuff.dmi' pass_flags = PASSTABLE | PASSGRILLE - layer = 5 + layer = FLY_LAYER /obj/effect/decal/sandeffect name = "sandy tile" icon = 'icons/turf/floors.dmi' icon_state = "sandeffect" - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER /obj/effect/decal/fakelattice name = "lattice" diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 54e57af855e..6dbf2b473e9 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -7,7 +7,7 @@ opacity = 0 anchored = 1 density = 0 - layer = MOB_LAYER + 0.5 + layer = ABOVE_ALL_MOB_LAYER mouse_opacity = 0 var/amount = 3 animate_movement = 0 diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 47dabfaf579..fd07e31986d 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -7,7 +7,7 @@ density = 0 icon = 'icons/obj/lighting.dmi' icon_state = "glowshroom" //replaced in New - layer = 2.1 + layer = ABOVE_NORMAL_TURF_LAYER var/endurance = 30 var/potency = 30 var/delay = 1200 diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index d39257edbcf..8c16eb5533f 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -3,7 +3,6 @@ desc = "Better stay away from that thing." density = 0 anchored = 1 - layer = 3 icon = 'icons/obj/weapons.dmi' icon_state = "uglymine" var/triggered = 0 diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index 4d621cf0fdd..712d8c6c59f 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -7,15 +7,6 @@ density = 1 anchored = 0 -/obj/effect/mark - var/mark = "" - icon = 'icons/misc/mark.dmi' - icon_state = "blank" - anchored = 1 - layer = 99 - mouse_opacity = 0 - unacidable = 1//Just to be sure. - /obj/effect/beam name = "beam" unacidable = 1//Just to be sure. diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index c929d74e5ca..79ce9abe797 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -22,7 +22,7 @@ /obj/effect/overlay/temp icon_state = "nothing" anchored = 1 - layer = 4.1 + layer = ABOVE_MOB_LAYER mouse_opacity = 0 var/duration = 10 var/randomdir = 1 @@ -117,7 +117,7 @@ /obj/effect/overlay/temp/cult/door name = "unholy glow" icon_state = "doorglow" - layer = 3.17 //above closed doors + layer = CLOSED_FIREDOOR_LAYER //above closed doors /obj/effect/overlay/temp/cult/door/unruned icon_state = "unruneddoorglow" @@ -125,7 +125,7 @@ /obj/effect/overlay/temp/cult/turf name = "unholy glow" icon_state = "wallglow" - layer = TURF_LAYER + 0.07 + layer = ABOVE_NORMAL_TURF_LAYER /obj/effect/overlay/temp/cult/turf/open/floor icon_state = "floorglow" @@ -179,7 +179,7 @@ icon = 'icons/misc/beach2.dmi' icon_state = "palm1" density = 1 - layer = 5 + layer = WALL_OBJ_LAYER anchored = 1 /obj/effect/overlay/palmtree_l @@ -187,7 +187,7 @@ icon = 'icons/misc/beach2.dmi' icon_state = "palm2" density = 1 - layer = 5 + layer = WALL_OBJ_LAYER anchored = 1 /obj/effect/overlay/coconut diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 47c439f0a4e..e4c4ba33fa4 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -94,7 +94,7 @@ /obj/item/stack/rods{amount = 50} = 1, /obj/item/stack/sheet/cardboard = 2, /obj/item/stack/sheet/metal{amount = 20} = 1, - /obj/item/stack/sheet/mineral/plasma{layer = 2.9} = 1, + /obj/item/stack/sheet/mineral/plasma = 1, /obj/item/stack/sheet/rglass = 1, /obj/item/weapon/book/manual/wiki/engineering_construction = 1, /obj/item/weapon/book/manual/wiki/engineering_hacking = 1, diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index b8d0a99bba9..2ed341eca59 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -98,7 +98,7 @@ desc = "It never stays still for long." icon_state = "spiderling" anchored = 0 - layer = 2.75 + layer = PROJECTILE_HIT_THRESHHOLD_LAYER health = 3 var/amount_grown = 0 var/grow_as = null diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 7c61b5d152f..2839bb1250b 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -409,7 +409,7 @@ obj/item/proc/item_action_slot_check(slot, mob/user) set category = "Object" set name = "Pick up" - if(usr.stat || usr.restrained() || !Adjacent(usr) || usr.stunned || usr.weakened || usr.lying) + if(usr.incapacitated() || !Adjacent(usr) || usr.lying) return if(usr.get_active_hand() == null) // Let me know if this has any problems -Yota diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 79848f024f5..7e9aa8e2ae3 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -1,3 +1,9 @@ +#define RANDOM_GRAFFITI "Random Graffiti" +#define RANDOM_LETTER "Random Letter" +#define RANDOM_NUMBER "Random Number" +#define RANDOM_ORIENTED "Random Oriented" +#define RANDOM_RUNE "Random Rune" +#define RANDOM_ANY "Random Anything" /* * Crayons @@ -8,22 +14,52 @@ desc = "A colourful crayon. Looks tasty. Mmmm..." icon = 'icons/obj/crayons.dmi' icon_state = "crayonred" + + var/icon_capped + var/icon_uncapped + var/use_overlays = FALSE + item_color = "red" w_class = 1 attack_verb = list("attacked", "coloured") var/paint_color = "#FF0000" //RGB - var/drawtype = "rune" + + var/drawtype var/text_buffer = "" + var/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka","arrow","star","poseur tag") var/list/letters = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z") var/list/numerals = list("0","1","2","3","4","5","6","7","8","9") var/list/oriented = list("arrow","body") // These turn to face the same way as the drawer - var/uses = 30 //-1 or less for unlimited uses - var/instant = 0 - var/dat + var/list/runes = list("rune1","rune2","rune3","rune4","rune5","rune6") + var/list/randoms = list(RANDOM_ANY, RANDOM_RUNE, RANDOM_ORIENTED, + RANDOM_NUMBER, RANDOM_GRAFFITI, RANDOM_LETTER) + + var/list/all_drawables + + var/charges = 30 //-1 or less for unlimited uses + var/charges_left + var/volume_multiplier = 1 // Increases reagent effect + + var/actually_paints = TRUE + + var/instant = FALSE + var/self_contained = TRUE // If it deletes itself when it is empty + var/list/validSurfaces = list(/turf/open/floor) - var/gang = 0 //For marking territory - var/edible = 1 + var/gang = FALSE //For marking territory + + var/edible = TRUE // That doesn't mean eating it is a good idea + + var/list/reagent_contents = list("nutriment" = 1) + // If the user can toggle the colour, a la vanilla spraycan + var/can_change_colour = FALSE + + var/has_cap = FALSE + var/is_capped = FALSE + + var/pre_noise = FALSE + var/post_noise = FALSE /obj/item/toy/crayon/suicide_act(mob/user) user.visible_message("[user] is jamming the [src.name] up \his nose and into \his brain. It looks like \he's trying to commit suicide.") @@ -31,48 +67,148 @@ /obj/item/toy/crayon/New() ..() - name = "[item_color] crayon" //Makes crayons identifiable in things like grinders - drawtype = pick(pick(graffiti), pick(letters), "rune[rand(1,6)]") + // Makes crayons identifiable in things like grinders + if(name == "crayon") + name = "[item_color] crayon" + if(config) if(config.mutant_races == 1) graffiti |= "antilizard" graffiti |= "prolizard" -/obj/item/toy/crayon/initialize() - if(config.mutant_races == 1) - graffiti |= "antilizard" - graffiti |= "prolizard" + all_drawables = graffiti + letters + numerals + oriented + runes + drawtype = pick(all_drawables) -/obj/item/toy/crayon/attack_self(mob/living/user) - update_window(user) + refill() -/obj/item/toy/crayon/proc/update_window(mob/living/user) - dat += "

Currently selected: [drawtype]


" - dat += "Random letterPick letter/number" - dat += "Write" - dat += "
" - dat += "

Runes:


" - dat += "Random rune" - for(var/i = 1; i <= 6; i++) - dat += "Rune[i]" - if(!((i + 1) % 3)) //3 buttons in a row - dat += "
" - dat += "
" - graffiti.Find() - dat += "

Graffiti:


" - dat += "Random graffiti" - var/c = 1 - for(var/T in graffiti) - dat += "[T]" - if(!((c + 1) % 3)) //3 buttons in a row - dat += "
" - c++ - dat += "
" - var/datum/browser/popup = new(user, "crayon", name, 300, 500) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - dat = "" +/obj/item/toy/crayon/Destroy() + if(reagents) + qdel(reagents) + . = ..() + +/obj/item/toy/crayon/proc/refill() + if(charges == -1) + charges_left = 100 + else + charges_left = charges + + if(!reagents) + create_reagents(charges_left * volume_multiplier) + reagents.clear_reagents() + + var/total_weight = 0 + for(var/key in reagent_contents) + total_weight += reagent_contents[key] + + var/units_per_weight = reagents.maximum_volume / total_weight + for(var/reagent in reagent_contents) + var/weight = reagent_contents[reagent] + var/amount = weight * units_per_weight + reagents.add_reagent(reagent, amount) + +/obj/item/toy/crayon/proc/use_charges(amount) + // Returns number of charges actually used + if(charges == -1) + . = amount + refill() + else + . = min(charges_left, amount) + charges_left -= . + +/obj/item/toy/crayon/proc/check_empty(mob/user) + // When eating a crayon, check_empty() can be called twice producing + // two messages unless we check for being deleted first + if(!qdeleted(src)) + . = TRUE + + . = FALSE + // -1 is unlimited charges + if(charges == -1) + . = FALSE + else if(!charges_left) + user << "There is no more of [src.name] \ + left!" + if(self_contained) + qdel(src) + . = TRUE + +/obj/item/toy/crayon/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = hands_state) + // god bless tgui and all of its arguments + + SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "crayon", name, 600, 600, + master_ui, state) + ui.open() + +/obj/item/toy/crayon/ui_data() + var/list/data = list() + data["drawables"] = list() + var/list/D = data["drawables"] + + var/list/g_items = list() + D += list(list("name" = "Graffiti", "items" = g_items)) + for(var/g in graffiti) + g_items += list(list("item" = g)) + + var/list/L_items = list() + D += list(list("name" = "Letters", "items" = L_items)) + for(var/L in letters) + L_items += list(list("item" = L)) + + var/list/N_items = list() + D += list(list(name = "Numerals", "items" = N_items)) + for(var/N in numerals) + N_items += list(list("item" = N)) + + var/list/O_items = list() + D += list(list(name = "Oriented", "items" = O_items)) + for(var/O in oriented) + O_items += list(list("item" = O)) + + var/list/R_items = list() + D += list(list(name = "Runes", "items" = R_items)) + for(var/R in runes) + R_items += list(list("item" = R)) + + var/list/rand_items = list() + D += list(list(name = "Random", "items" = rand_items)) + for(var/i in randoms) + rand_items += list(list("item" = i)) + + data["selected_stencil"] = drawtype + data["text_buffer"] = text_buffer + + data["has_cap"] = has_cap + data["is_capped"] = is_capped + data["can_change_colour"] = can_change_colour + data["current_colour"] = paint_color + + return data + +/obj/item/toy/crayon/ui_act(action, list/params) + if(..()) + return + switch(action) + if("toggle_cap") + if(has_cap) + is_capped = !is_capped + . = TRUE + if("select_stencil") + var/stencil = params["item"] + if(stencil in all_drawables + randoms) + drawtype = stencil + . = TRUE + if("select_colour") + if(can_change_colour) + paint_color = input(usr,"Choose Color") as color + . = TRUE + if("enter_text") + var/txt = stripped_input(usr,"Choose what to write.", + "Scribbles",default = text_buffer) + text_buffer = crayon_text_strip(txt) + . = TRUE + update_icon() /obj/item/toy/crayon/proc/crayon_text_strip(text) var/list/base = char_split(lowertext(text)) @@ -82,129 +218,137 @@ out += a return jointext(out,"") -/obj/item/toy/crayon/Topic(href, href_list, hsrc) - var/temp = "a" - if(href_list["buffer"]) - text_buffer = crayon_text_strip(stripped_input(usr,"Choose what to write.", "Scribbles",default = text_buffer)) - if(href_list["type"]) - switch(href_list["type"]) - if("random_letter") - temp = pick(letters) - if("letter") - temp = input("Choose what to write.", "Scribbles") in (letters|numerals) - if("random_rune") - temp = "rune[rand(1,6)]" - if("random_graffiti") - temp = pick(graffiti) - else - temp = href_list["type"] - if ((usr.restrained() || usr.stat || usr.get_active_hand() != src)) - return - drawtype = temp - update_window(usr) - /obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity) - if(!proximity || !check_allowed_items(target)) return - if(!uses) - user << "There is no more of [src.name] left!" - if(!instant) - qdel(src) + if(!proximity || !check_allowed_items(target)) return + + if(check_empty(user)) + return + if(istype(target, /obj/effect/decal/cleanable)) target = target.loc - if(is_type_in_list(target,validSurfaces)) - var/temp = "rune" - if(letters.Find(drawtype)) - temp = "letter" - else if(graffiti.Find(drawtype)) - temp = "graffiti" - else if(numerals.Find(drawtype)) - temp = "number" + if(!is_type_in_list(target,validSurfaces)) + return - ////////////////////////// GANG FUNCTIONS - var/area/territory - var/gangID - if(gang) - //Determine gang affiliation - gangID = user.mind.gang_datum + var/drawing = drawtype + switch(drawtype) + if(RANDOM_LETTER) + drawing = pick(letters) + if(RANDOM_GRAFFITI) + drawing = pick(graffiti) + if(RANDOM_RUNE) + drawing = pick(runes) + if(RANDOM_ORIENTED) + drawing = pick(oriented) + if(RANDOM_NUMBER) + drawing = pick(numerals) + if(RANDOM_ANY) + drawing = pick(all_drawables) - //Check area validity. Reject space, player-created areas, and non-station z-levels. - if(gangID) - territory = get_area(target) - if(territory && (territory.z == ZLEVEL_STATION) && territory.valid_territory) - //Check if this area is already tagged by a gang - if(!(locate(/obj/effect/decal/cleanable/crayon/gang) in target)) //Ignore the check if the tile being sprayed has a gang tag - if(territory_claimed(territory, user)) - return - if(locate(/obj/machinery/power/apc) in (user.loc.contents | target.contents)) - user << "You cannot tag here." - return - else - user << "[territory] is unsuitable for tagging." - return - ///////////////////////////////////////// + var/temp = "rune" + if(drawing in letters) + temp = "letter" + else if(drawing in graffiti) + temp = "graffiti" + else if(drawing in numerals) + temp = "number" - var/graf_rot - if(oriented.Find(drawtype)) - switch(user.dir) - if(EAST) - graf_rot = 90 - if(SOUTH) - graf_rot = 180 - if(WEST) - graf_rot = 270 - else - graf_rot = 0 + // If a gang member is using a gang spraycan, it'll behave differently + var/gang_mode = FALSE + if(gang && user.mind && user.mind.gang_datum) + gang_mode = TRUE - user << "You start [instant ? "spraying" : "drawing"] a [temp] on the [target.name]..." - if(instant) - playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) - if((instant>0) || do_after(user, 50, target = target)) - - if(length(text_buffer)) - drawtype = copytext(text_buffer,1,2) - text_buffer = copytext(text_buffer,2) - - //Gang functions - if(gangID) - //Delete any old markings on this tile, including other gang tags - if(!(locate(/obj/effect/decal/cleanable/crayon/gang) in target)) //Ignore the check if the tile being sprayed has a gang tag - if(territory_claimed(territory, user)) - return - for(var/obj/effect/decal/cleanable/crayon/old_marking in target) - qdel(old_marking) - new /obj/effect/decal/cleanable/crayon/gang(target,gangID,"graffiti",graf_rot) - user << "You tagged [territory] for your gang!" + // discontinue if the area isn't valid for tagging because gang "honour" + if(gang_mode && (!can_claim_for_gang(user, target))) + return + var/graf_rot + if(drawing in oriented) + switch(user.dir) + if(EAST) + graf_rot = 90 + if(SOUTH) + graf_rot = 180 + if(WEST) + graf_rot = 270 else - new /obj/effect/decal/cleanable/crayon(target,paint_color,drawtype,temp,graf_rot) + graf_rot = 0 - user << "You finish [instant ? "spraying" : "drawing"] \the [temp]." - if(instant<0) - playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) - if(uses < 0) + user << "You start \ + [instant ? "spraying" : "drawing"] a [temp] on the \ + [target.name]..." + + if(pre_noise) + audible_message("You hear spraying.") + playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) + + var/takes_time = !instant + if(gang_mode) + takes_time = TRUE + + if(takes_time) + if(!do_after(user, 50, target = target)) + return + + if(length(text_buffer)) + drawing = copytext(text_buffer,1,2) + text_buffer = copytext(text_buffer,2) + + if(actually_paints) + if(gang_mode) + // They're attempting to tag for their gang + if(!tag_for_gang(user, target)) return - uses = max(0,uses-1) - if(!uses) - user << "There is no more of [src.name] left!" - if(!instant) - qdel(src) - return + else + new /obj/effect/decal/cleanable/crayon(target, paint_color, + drawing, temp, graf_rot) + + user << "You finish \ + [instant ? "spraying" : "drawing"] \the [temp]." + + if(post_noise) + audible_message("You hear spraying.") + playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) + + . = use_charges(1) + var/fraction = min(1, . / reagents.maximum_volume) + reagents.reaction(target, TOUCH, fraction * volume_multiplier) + reagents.trans_to(target, ., volume_multiplier) + check_empty(user) /obj/item/toy/crayon/attack(mob/M, mob/user) if(edible && (M == user)) user << "You take a bite of the [src.name]. Delicious!" - user.nutrition += 5 - if(uses < 0) - return - uses = max(0,uses-5) - if(!uses) - user << "There is no more of [src.name] left!" - qdel(src) + var/eaten = use_charges(5) + var/fraction = min(eaten / reagents.total_volume, 1) + reagents.reaction(M, INGEST, fraction * volume_multiplier) + reagents.trans_to(M, eaten, volume_multiplier) + // check_empty() is called during afterattack else ..() +/obj/item/toy/crayon/proc/can_claim_for_gang(mob/user, atom/target) + // Check area validity. + // Reject space, player-created areas, and non-station z-levels. + var/area/A = get_area(target) + if(!A || (A.z != ZLEVEL_STATION) || !A.valid_territory) + user << "[A] is unsuitable for \ + tagging." + return FALSE + + if(!(locate(/obj/effect/decal/cleanable/crayon/gang in target))) + if(territory_claimed(A, user)) + return FALSE + + var/apc_check_area = user.loc.contents | target.contents + if(locate(/obj/machinery/power/apc in apc_check_area)) + user << "You can't tag an APC." + return FALSE + + // If you pass the gaunlet of checks, you're good to proceed + return TRUE + /obj/item/toy/crayon/proc/territory_claimed(area/territory,mob/user) var/occupying_gang for(var/datum/gang/G in ticker.mode.gangs) @@ -212,41 +356,62 @@ occupying_gang = G.name break if(occupying_gang) - user << "[territory] has already been tagged by the [occupying_gang] gang! You must get rid of or spray over the old tag first!" - return 1 - return 0 + user << "[territory] has already been tagged \ + by the [occupying_gang] gang! You must get rid of or spray over \ + the old tag first!" + return TRUE + return FALSE +/obj/item/toy/crayon/proc/tag_for_gang(mob/user, atom/target) + // Check again to see if anyone's tagged in the meanwhile + if(!can_claim_for_gang(user, target)) + return + //Delete any old markings on this tile, including other gang tags + for(var/obj/effect/decal/cleanable/crayon/old_marking in target) + qdel(old_marking) + + var/gangID = user.mind.gang_datum + var/area/territory = get_area(target) + + new /obj/effect/decal/cleanable/crayon/gang(target,gangID,"graffiti",0) + user << "You tagged [territory] for your gang!" /obj/item/toy/crayon/red icon_state = "crayonred" paint_color = "#DA0000" item_color = "red" + reagent_contents = list("nutriment" = 1, "redcrayonpowder" = 1) /obj/item/toy/crayon/orange icon_state = "crayonorange" paint_color = "#FF9300" item_color = "orange" + reagent_contents = list("nutriment" = 1, "orangecrayonpowder" = 1) /obj/item/toy/crayon/yellow icon_state = "crayonyellow" paint_color = "#FFF200" item_color = "yellow" + reagent_contents = list("nutriment" = 1, "yellowcrayonpowder" = 1) /obj/item/toy/crayon/green icon_state = "crayongreen" paint_color = "#A8E61D" item_color = "green" + reagent_contents = list("nutriment" = 1, "greencrayonpowder" = 1) /obj/item/toy/crayon/blue icon_state = "crayonblue" paint_color = "#00B7EF" item_color = "blue" + reagent_contents = list("nutriment" = 1, "bluecrayonpowder" = 1) /obj/item/toy/crayon/purple icon_state = "crayonpurple" paint_color = "#DA00FF" item_color = "purple" + reagent_contents = list("nutriment" = 1, "purplecrayonpowder" = 1) /obj/item/toy/crayon/white icon_state = "crayonwhite" @@ -258,54 +423,26 @@ desc = "A very sad-looking crayon." paint_color = "#FFFFFF" item_color = "mime" - uses = -1 - -/obj/item/toy/crayon/mime/attack_self(mob/living/user) - update_window(user) - -/obj/item/toy/crayon/mime/update_window(mob/living/user) - dat += "
   Change color
" - ..() - -/obj/item/toy/crayon/mime/Topic(href,href_list) - if ((usr.restrained() || usr.stat || usr.get_active_hand() != src)) - return - if(href_list["color"]) - if(paint_color != "#FFFFFF") - paint_color = "#FFFFFF" - else - paint_color = "#000000" - update_window(usr) - else - ..() + reagent_contents = list("nutriment" = 1, "invisiblecrayonpowder" = 1) + charges = -1 /obj/item/toy/crayon/rainbow icon_state = "crayonrainbow" paint_color = "#FFF000" item_color = "rainbow" - uses = -1 + reagent_contents = list("nutriment" = 1, "colorful_reagent" = 1) + drawtype = RANDOM_ANY // just the default starter. -/obj/item/toy/crayon/rainbow/attack_self(mob/living/user) - update_window(user) + charges = -1 -/obj/item/toy/crayon/rainbow/update_window(mob/living/user) - dat += "
   Change color
" - ..() - -/obj/item/toy/crayon/rainbow/Topic(href,href_list[]) - - if(href_list["color"]) - var/temp = input(usr, "Please select colour.", "Crayon colour") as color - if ((usr.restrained() || usr.stat || usr.get_active_hand() != src)) - return - paint_color = temp - update_window(usr) - else - ..() +/obj/item/toy/crayon/rainbow/afterattack(atom/target, mob/user, proximity) + paint_color = rgb(rand(0,255), rand(0,255), rand(0,255)) + . = ..() /* * Crayon Box */ + /obj/item/weapon/storage/crayons name = "box of crayons" desc = "A box of crayons for all your rune drawing needs." @@ -340,120 +477,158 @@ usr << "This crayon is too sad to be contained in this box." return if("rainbow") - usr << "This crayon is too powerful to be contained in this box." + usr << "This crayon is too powerful to be contained in this \ + box." return + if(istype(W, /obj/item/toy/crayon/spraycan)) + user << "Spraycans are not crayons." + return return ..() //Spraycan stuff /obj/item/toy/crayon/spraycan - icon_state = "spraycan_cap" + name = "spray can" + icon_state = "spraycan" + + icon_capped = "spraycan_cap" + icon_uncapped = "spraycan" + use_overlays = TRUE + paint_color = null + item_state = "spraycan" desc = "A metallic container containing tasty paint." - var/capped = 1 - instant = 1 - edible = 0 + + instant = TRUE + edible = FALSE + has_cap = TRUE + is_capped = TRUE + self_contained = FALSE // Don't disappear when they're empty + can_change_colour = TRUE + validSurfaces = list(/turf/open/floor,/turf/closed/wall) + reagent_contents = list("welding_fuel" = 1, "ethanol" = 1) /obj/item/toy/crayon/spraycan/suicide_act(mob/user) var/mob/living/carbon/human/H = user - if(capped) - user.visible_message("[user] shakes up the [src] with a rattle and lifts it to their mouth, but nothing happens! Maybe they should have uncapped it first! Nonetheless--") + if(is_capped || !actually_paints) + user.visible_message("[user] shakes up the \ + [src] with a rattle and lifts it to their mouth, but nothing \ + happens!") user.say("MEDIOCRE!!") + return SHAME else - user.visible_message("[user] shakes up the [src] with a rattle and lifts it to their mouth, spraying silver paint across their teeth!") + user.visible_message("[user] shakes up the \ + [src] with a rattle and lifts it to their mouth, spraying \ + paint across their teeth!") user.say("WITNESS ME!!") - playsound(loc, 'sound/effects/spray.ogg', 5, 1, 5) - paint_color = "#C0C0C0" + if(pre_noise || post_noise) + playsound(loc, 'sound/effects/spray.ogg', 5, 1, 5) + if(can_change_colour) + paint_color = "#C0C0C0" update_icon() - H.lip_style = "spray_face" - H.lip_color = paint_color - H.update_body() - uses = max(0, uses - 10) - return (OXYLOSS) + if(actually_paints) + H.lip_style = "spray_face" + H.lip_color = paint_color + H.update_body() + var/used = use_charges(10) + var/fraction = min(1, used / reagents.maximum_volume) + reagents.reaction(user, VAPOR, fraction * volume_multiplier) + reagents.trans_to(user, used, volume_multiplier) + + return (OXYLOSS) /obj/item/toy/crayon/spraycan/New() ..() - name = "spray can" - paint_color = pick("#DA0000","#FF9300","#FFF200","#A8E61D","#00B7EF","#DA00FF") + // If default crayon red colour, pick a more fun spraycan colour + if(!paint_color) + paint_color = pick("#DA0000","#FF9300","#FFF200","#A8E61D","#00B7EF", + "#DA00FF") + refill() update_icon() + /obj/item/toy/crayon/spraycan/examine(mob/user) - ..() - if(uses) - user << "It has [uses] uses left." + . = ..() + if(charges_left) + user << "It has [charges_left] uses left." else user << "It is empty." -/obj/item/toy/crayon/spraycan/attack_self(mob/living/user) - var/choice = input(user,"Spraycan options") as null|anything in list("Toggle Cap","Change Drawing","Change Color") - switch(choice) - if("Toggle Cap") - user << "You [capped ? "Remove" : "Replace"] the cap of the [src]" - capped = capped ? 0 : 1 - icon_state = "spraycan[capped ? "_cap" : ""]" - update_icon() - if("Change Drawing") - ..() - if("Change Color") - paint_color = input(user,"Choose Color") as color - update_icon() - /obj/item/toy/crayon/spraycan/afterattack(atom/target, mob/user, proximity) if(!proximity) return - if(capped) + + if(is_capped) user << "Take the cap off first!" return - else - if(iscarbon(target)) - if(uses) - playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) - var/mob/living/carbon/C = target - user.visible_message("[user] sprays [src] into the face of [target]!") - target << "[user] sprays [src] into your face!" - if(C.client) - C.blur_eyes(3) - C.blind_eyes(1) - if(C.check_eye_prot() <= 0) // no eye protection? ARGH IT BURNS. - C.confused = max(C.confused, 3) - C.Weaken(3) - if(ishuman(C)) - var/mob/living/carbon/human/H = C - H.lip_style = "spray_face" - H.lip_color = paint_color - H.update_body() - // Caution, spray cans contain inflammable substances - if(C.reagents) - C.reagents.add_reagent("welding_fuel", 5) - C.reagents.add_reagent("ethanol", 5) - C.reagents.reaction(C, VAPOR, 10) - uses = max(0,uses-10) + if(check_empty(user)) + return - if(istype(target, /obj/structure/window)) - if(uses) - target.color = paint_color - if(color_hex2num(paint_color) < 255) - target.SetOpacity(255) - else - target.SetOpacity(initial(target.opacity)) - uses = max(0, uses-2) - playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) - return - ..() + if(iscarbon(target)) + if(pre_noise || post_noise) + playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) + + var/mob/living/carbon/C = target + user.visible_message("[user] sprays [src] \ + into the face of [target]!") + target << "[user] sprays [src] into your \ + face!" + + if(C.client) + C.blur_eyes(3) + C.blind_eyes(1) + if(C.check_eye_prot() <= 0) // no eye protection? ARGH IT BURNS. + C.confused = max(C.confused, 3) + C.Weaken(3) + if(ishuman(C) && actually_paints) + var/mob/living/carbon/human/H = C + H.lip_style = "spray_face" + H.lip_color = paint_color + H.update_body() + + // Caution, spray cans contain inflammable substances + . = use_charges(10) + var/fraction = min(1, . / reagents.maximum_volume) + reagents.reaction(C, VAPOR, fraction * volume_multiplier) + + return + + if(istype(target, /obj/structure/window)) + if(actually_paints) + target.color = paint_color + if(color_hex2num(paint_color) < 255) + target.SetOpacity(255) + else + target.SetOpacity(initial(target.opacity)) + . = use_charges(2) + var/fraction = min(1, . / reagents.maximum_volume) + reagents.reaction(target, TOUCH, fraction * volume_multiplier) + reagents.trans_to(target, ., volume_multiplier) + + if(pre_noise || post_noise) + playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) + return + + . = ..() /obj/item/toy/crayon/spraycan/update_icon() - overlays.Cut() - var/image/I = image('icons/obj/crayons.dmi',icon_state = "[capped ? "spraycan_cap_colors" : "spraycan_colors"]") - I.color = paint_color - overlays += I + icon_state = is_capped ? icon_capped : icon_uncapped + if(use_overlays) + overlays.Cut() + var/image/I = image('icons/obj/crayons.dmi', + icon_state = "[is_capped ? "spraycan_cap_colors" : "spraycan_colors"]") + I.color = paint_color + overlays += I /obj/item/toy/crayon/spraycan/gang - desc = "A modified container containing suspicious paint." - gang = 1 - uses = 20 - instant = -1 + //desc = "A modified container containing suspicious paint." + charges = 20 + gang = TRUE + + pre_noise = FALSE + post_noise = TRUE /obj/item/toy/crayon/spraycan/gang/New(loc, datum/gang/G) ..() @@ -461,25 +636,80 @@ paint_color = G.color_hex update_icon() +/obj/item/toy/crayon/spraycan/gang/examine(mob/user) + . = ..() + if((user.mind && user.mind.gang_datum) || isobserver(user)) + user << "This spraycan has \ + been specially modified for tagging territory." + /obj/item/toy/crayon/spraycan/borg - desc = "A metallic container containing shiny paint." - // Use depletion of uses to determine what the energy cost is - uses = 100 + name = "cyborg spraycan" + desc = "A metallic container containing shiny synthesised paint." + charges = -1 /obj/item/toy/crayon/spraycan/borg/afterattack(atom/target,mob/user,proximity) - ..() + var/diff = ..() if(!isrobot(user)) + user << "How did you get this?" + qdel(src) return FALSE + var/mob/living/silicon/robot/borgy = user - var/starting_uses = initial(uses) - var/diff = starting_uses - uses - if(diff) - uses = starting_uses - // 25 is our cost per unit of paint, making it cost 25 energy per - // normal tag, 50 per window, and 250 per attack - var/cost = diff * 25 - // Cyborgs shouldn't be able to use modules without a cell. But if they do - // it's free. - if(borgy.cell) - borgy.cell.use(cost) + if(!diff) + return + // 25 is our cost per unit of paint, making it cost 25 energy per + // normal tag, 50 per window, and 250 per attack + var/cost = diff * 25 + // Cyborgs shouldn't be able to use modules without a cell. But if they do + // it's free. + if(borgy.cell) + borgy.cell.use(cost) + +/obj/item/toy/crayon/spraycan/hellcan + name = "hellcan" + desc = "This spraycan doesn't seem to be filled with paint..." + icon_state = "deathcan2_cap" + icon_capped = "deathcan2_cap" + icon_uncapped = "deathcan2" + use_overlays = FALSE + + volume_multiplier = 25 + charges = 100 + reagent_contents = list("clf3" = 1) + actually_paints = FALSE + paint_color = "#000000" + +/obj/item/toy/crayon/spraycan/lubecan + name = "slippery spraycan" + desc = "You can barely keep hold of this thing." + icon_state = "clowncan2_cap" + icon_capped = "clowncan2_cap" + icon_uncapped = "clowncan2" + use_overlays = FALSE + + reagent_contents = list("lube" = 1, "banana" = 1) + volume_multiplier = 5 + validSurfaces = list(/turf/open/floor) + +/obj/item/toy/crayon/spraycan/mimecan + name = "silent spraycan" + desc = "Art is best seen, not heard." + icon_state = "mimecan_cap" + icon_capped = "mimecan_cap" + icon_uncapped = "mimecan" + use_overlays = FALSE + + can_change_colour = FALSE + paint_color = "#FFFFFF" //RGB + + pre_noise = FALSE + post_noise = FALSE + reagent_contents = list("nothing" = 1, "mutetoxin" = 1) + +#undef RANDOM_GRAFFITI +#undef RANDOM_LETTER +#undef RANDOM_NUMBER +#undef RANDOM_ORIENTED +#undef RANDOM_RUNE +#undef RANDOM_ANY diff --git a/code/game/objects/items/devices/modificationkit.dm b/code/game/objects/items/devices/modificationkit.dm index f4de7b7491c..cd25b38140a 100644 --- a/code/game/objects/items/devices/modificationkit.dm +++ b/code/game/objects/items/devices/modificationkit.dm @@ -18,6 +18,12 @@ user << "This kit can only modify kinetic \ accelerators!" return ..() + // RIP the 'improved improved improved improved kinetic accelerator + if(C.holds_charge && C.unique_frequency) + user << "This kinetic accelerator already has \ + these upgrades." + return ..() + user <<"You modify the [C], adjusting the trigger \ guard and internal capacitor." C.name = "improved [C.name]" diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 6102f97caee..146610a5197 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -173,6 +173,10 @@ MASS SPECTROMETER // Time of death if(M.tod && (M.stat == DEAD || (M.status_flags & FAKEDEATH))) user << "Time of Death: [M.tod]" + var/tdelta = world.time - M.timeofdeath + if(tdelta < (DEFIB_TIME_LIMIT * 10)) + user << "Subject died [tdelta / 10] seconds \ + ago, defibrillation may be possible!" for(var/datum/disease/D in M.viruses) if(!(D.visibility_flags & HIDDEN_SCANNER)) diff --git a/code/game/objects/items/documents.dm b/code/game/objects/items/documents.dm index 043fcd80cb0..1fbfb9490a6 100644 --- a/code/game/objects/items/documents.dm +++ b/code/game/objects/items/documents.dm @@ -8,7 +8,7 @@ w_class = 1 throw_range = 1 throw_speed = 1 - layer = 4 + layer = MOB_LAYER pressure_resistance = 1 /obj/item/documents/nanotrasen diff --git a/code/game/objects/items/nuke_tools.dm b/code/game/objects/items/nuke_tools.dm index 9b49f23cb73..b88d4f6a07c 100644 --- a/code/game/objects/items/nuke_tools.dm +++ b/code/game/objects/items/nuke_tools.dm @@ -11,7 +11,8 @@ var/cooldown = 0 /obj/item/nuke_core/New() - SSobj.processing += src + ..() + SSobj.processing |= src /obj/item/nuke_core/attackby(obj/item/nuke_core_container/container, mob/user) if(istype(container)) @@ -41,13 +42,16 @@ core = ncore icon_state = "core_container_loaded" user << "Container is sealing..." - spawn(50) + addtimer(src, "seal", 50) + return 1 + +/obj/item/nuke_core_container/proc/seal() + if(istype(core)) SSobj.processing -= core icon_state = "core_container_sealed" - playsound(loc, 'sound/items/Deconstruct.ogg', 100, 1) - if(loc == user) - user << "Container is sealed, the radiation is contained." - return 1 + playsound(loc, 'sound/items/Deconstruct.ogg', 60, 1) + if(ismob(loc)) + loc << "[src] is permanently sealed, [core]'s radiation is contained." /obj/item/nuke_core_container/attackby(obj/item/nuke_core/core, mob/user) if(istype(core)) diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index a674ccb0d69..72344703528 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -20,7 +20,106 @@ "[user] has prodded you with [src]!") add_logs(user, M, "stunned", src, "(INTENT: [uppertext(user.a_intent)])") +/obj/item/borg/cyborghug + name = "Hugging Module" + icon_state = "hugmodule" + desc = "For when a someone really needs a hug." + var/mode = 0 //0 = Hugs 1 = "Hug" 2 = Shock 3 = CRUSH + var/ccooldown = 0 + var/scooldown = 0 +/obj/item/borg/cyborghug/attack_self(mob/living/user) + if(isrobot(user)) + var/mob/living/silicon/robot/P = user + if(P.emagged) + if(mode < 3) + mode++ + else + mode = 0 + else if(mode < 1) + mode++ + else + mode = 0 + switch(mode) + if(0) + user << "Power reset. Hugs!" + if(1) + user << "Power increased!" + if(2) + user << "BZZT. Electrifying arms..." + if(3) + user << "ERROR: ARM ACTUATORS OVERLOADED." + +/obj/item/borg/cyborghug/attack(mob/living/M, mob/living/silicon/robot/user) + switch(mode) + if(0) + if(M.health >= 0) + if(ishuman(M)) + if(M.lying) + user.visible_message("[user] shakes [M] trying to get \him up!", \ + "You shake [M] trying to get \him up!") + else + user.visible_message("[user] hugs [M] to make \him feel better!", \ + "You hug [M] to make \him feel better!") + if(M.resting) + M.resting = 0 + M.update_canmove() + else + user.visible_message("[user] pets [M]!", \ + "You pet [M]!") + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + if(1) + if(M.health >= 0) + if(ishuman(M)) + if(M.lying) + user.visible_message("[user] shakes [M] trying to get \him up!", \ + "You shake [M] trying to get \him up!") + else + user.visible_message("[user] hugs [M] in a firm bear-hug! [M] looks uncomfortable...", \ + "You hug [M] firmly to make \him feel better! [M] looks uncomfortable...") + if(M.resting) + M.resting = 0 + M.update_canmove() + else + user.visible_message("[user] bops [M] on the head!", \ + "You bop [M] on the head!") + playsound(loc, 'sound/weapons/tap.ogg', 50, 1, -1) + if(2) + if(!scooldown) + if(M.health >= 0) + if(ishuman(M)) + M.electrocute_act(5, "[user]", safety = 1) + user.visible_message("[user] electrocutes [M] with their touch!", \ + "You electrocute [M] with your touch!") + M.update_canmove() + else + if(!isrobot(M)) + M.adjustFireLoss(10) + user.visible_message("[user] shocks [M]!", \ + "You shock [M]!") + else + user.visible_message("[user] shocks [M]. It does not seem to have an effect", \ + "You shock [M] to no effect.") + playsound(loc, 'sound/effects/sparks2.ogg', 50, 1, -1) + user.cell.charge -= 400 + scooldown = 1 + spawn(10) + scooldown = 0 + if(3) + if(!ccooldown) + if(M.health >= 0) + if(ishuman(M)) + user.visible_message("[user] crushes [M] in their grip!", \ + "You crush [M] in your grip!") + else + user.visible_message("[user] crushes [M]!", \ + "You crush [M]!") + playsound(loc, 'sound/weapons/smash.ogg', 50, 1, -1) + M.adjustBruteLoss(10) + user.cell.charge -= 300 + ccooldown = 1 + spawn(10) + ccooldown = 0 /obj/item/borg/charger name = "power connector" @@ -146,8 +245,75 @@ user << "You stop charging [target]." +/obj/item/device/harmalarm + name = "Sonic Harm Prevention Tool" + desc = "Releases a harmless blast that confuses most organics. For when the harm is JUST TOO MUCH" + icon_state = "megaphone" + var/cooldown = 0 + var/emagged = 0 +/obj/item/device/harmalarm/emag_act(mob/user) + emagged = !emagged + if(emagged) + user << "You short out the safeties on the [src]!" + else + user << "You reset the safeties on the [src]!" +/obj/item/device/harmalarm/attack_self(mob/user) + var/safety = !emagged + if(cooldown > world.time) + user << "The device is still recharging!" + return + + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + if(R.cell.charge < 1200) + user << "You don't have enough charge to do this!" + return + R.cell.charge -= 1000 + if(R.emagged) + safety = 0 + + if(safety == 1) + user.visible_message("[user] blares out a near-deafening siren from its speakers!", \ + "The siren pierces your hearing and confuses you!", \ + "The siren pierces your hearing!") + for(var/mob/living/M in get_hearers_in_view(9, user)) + if(iscarbon(M)) + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) + continue + M.confused += 6 + M << "HUMAN HARM" + playsound(get_turf(src), 'sound/AI/harmalarm.ogg', 70, 3) + cooldown = world.time + 200 + log_game("[user.ckey]([user]) used a Cyborg Harm Alarm in ([user.x],[user.y],[user.z])") + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.connected_ai << "
NOTICE - Peacekeeping 'HARM ALARM' used by: [user]
" + + return + + if(safety == 0) + user.visible_message("[user] blares out a sonic screech from its speakers!", \ + "You hear a sharp screech before your thoughts are interrupted and you collapse, your ears ringing!", \ + "You hear a sonic screech and collapse, your ears riniging!") + for(var/mob/living/M in get_hearers_in_view(9, user)) + if(iscarbon(M)) + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) + continue + M.confused += 15 + M.Weaken(2) + M.stuttering += 30 + M.adjustEarDamage(0, 20) + M.Jitter(25) + M << "BZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZT" + playsound(get_turf(src), 'sound/machines/warning-buzzer.ogg', 130, 3) + cooldown = world.time + 600 + log_game("[user.ckey]([user]) used an emagged Cyborg Harm Alarm in ([user.x],[user.y],[user.z])") /********************************************************************** HUD/SIGHT things diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 42e6d7f7280..8a0a32d8672 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -210,10 +210,15 @@ if(!user.unEquip(W)) return - if(M.syndiemmi) + if(M.hacked || M.clockwork) aisync = 0 lawsync = 0 - O.laws = new /datum/ai_laws/syndicate_override + if(M.clockwork) + O.laws = new/datum/ai_laws/ratvar + spawn(1) + add_servant_of_ratvar(O) + else + O.laws = new/datum/ai_laws/syndicate_override O.invisibility = 0 //Transfer debug settings to new mob @@ -226,7 +231,7 @@ O.notify_ai(1) if(forced_ai) O.connected_ai = forced_ai - if(!lawsync && !M.syndiemmi) + if(!lawsync && !M.hacked) O.lawupdate = 0 O.make_laws() diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index f2b9bcd472b..22bcc0d2dcb 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -155,7 +155,7 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \ singular_name = "hide plate" flags = NOBLUDGEON w_class = 3 - layer = 4 + layer = MOB_LAYER /obj/item/stack/sheet/animalhide/ashdrake name = "ash drake hide" @@ -165,7 +165,7 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \ singular_name = "drake plate" flags = NOBLUDGEON w_class = 3 - layer = 4 + layer = MOB_LAYER //Step one - dehairing. diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 0b5fa01aff8..ca32e2890b7 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -63,7 +63,7 @@ var/global/list/datum/stack_recipe/sandstone_recipes = list ( \ icon_state = "sandbags" singular_name = "sandbag" force = 5 - layer = 2.95 + layer = LOW_ITEM_LAYER throwforce = 5 w_class = 3 throw_speed = 1 diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 76cf1ff5a33..e7edcee2c10 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -238,6 +238,12 @@ var/global/list/datum/stack_recipe/runed_metal_recipes = list ( \ return return ..() +/obj/item/stack/sheet/runed_metal/attack(atom/target, mob/living/user) + if(!iscultist(user)) + user << "Only one with forbidden knowledge could hope to work this metal..." + return + ..() + /obj/item/stack/sheet/runed_metal/fifty amount = 50 diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index ba891f89d78..72969f4abbf 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -112,3 +112,71 @@ RSF matter-- user << "The RSF now holds [matter]/30 fabrication-units." desc = "A RSF. It currently holds [matter]/30 fabrication-units." + +/obj/item/weapon/cookiesynth + name = "Cookie Synthesizer" + desc = "A self-recharging device used to rapidly deploy cookies." + icon = 'icons/obj/tools.dmi' + icon_state = "rcd" + var/matter = 10 + var/toxin = 0 + var/emagged = 0 + w_class = 3 + +/obj/item/weapon/cookiesynth/New() + desc = "A self recharging cookie fabricator. It currently holds [matter]/10 cookie-units." + +/obj/item/weapon/cookiesynth/attackby() + return + +/obj/item/weapon/cookiesynth/emag_act(mob/user) + emagged = !emagged + if(emagged) + user << "You short out the [src]'s reagent safety checker!" + else + user << "You reset the [src]'s reagent safety checker!" + toxin = 0 + +/obj/item/weapon/cookiesynth/attack_self(mob/user) + var/mob/living/silicon/robot/P = null + if(isrobot(user)) + P = user + if(emagged&&!toxin) + toxin = 1 + user << "Cookie Synthesizer Hacked" + else if(P.emagged&&!toxin) + toxin = 1 + user << "Cookie Synthesizer Hacked" + else + toxin = 0 + user << "Cookie Synthesizer Reset" + +/obj/item/weapon/cookiesynth/process() + if (matter < 10) + matter++ + +/obj/item/weapon/cookiesynth/afterattack(atom/A, mob/user, proximity) + if(!proximity) + return + if (!(istype(A, /obj/structure/table) || istype(A, /turf/open/floor))) + return + if(matter < 1) + user << "The [src] doesn't have enough matter left. Wait for it to recharge!" + return + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + if(!R.cell || R.cell.charge < 400) + user << "You do not have enough power to use [src]." + return + var/turf/T = get_turf(A) + playsound(src.loc, 'sound/machines/click.ogg', 10, 1) + user << "Fabricating Cookie.." + var/obj/item/weapon/reagent_containers/food/snacks/cookie/S = new /obj/item/weapon/reagent_containers/food/snacks/cookie(T) + if(toxin) + S.reagents.add_reagent("chloralhydrate2", 10) + if (isrobot(user)) + var/mob/living/silicon/robot/R = user + R.cell.charge -= 100 + else + matter-- + desc = "A self recharging cookie fabricator. It currently holds [matter]/10 cookie-units." \ No newline at end of file diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index d8cd87d804b..00f12ae5119 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -121,10 +121,16 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/cigarette/New() ..() - flags |= NOREACT // so it doesn't react until you light it create_reagents(chem_volume) // making the cigarette a chemical holder with a maximum volume of 15 + reagents.set_reacting(FALSE) // so it doesn't react until you light it reagents.add_reagent("nicotine", 15) +/obj/item/clothing/mask/cigarette/Destroy() + if(reagents) + qdel(reagents) + SSobj.processing -= src + . = ..() + /obj/item/clothing/mask/cigarette/attackby(obj/item/weapon/W, mob/user, params) if(!lit && smoketime > 0 && W.is_hot()) var/lighting_text = is_lighter(W,user) @@ -155,7 +161,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM else if(istype(O, /obj/item/weapon/lighter)) lighting_text = "With a single flick of their wrist, [user] smoothly lights their [name] with [O]. Damn they're cool." else if(istype(O, /obj/item/weapon/melee/energy)) - lighting_text = "[user] swings their [O], barely missing their nose. They light their [name] in the process." + var/in_mouth = "" + if(iscarbon(user)) + var/mob/living/carbon/C = user + if(C.wear_mask == src) + in_mouth = ", barely missing their nose" + lighting_text = "[user] swings their \ + [O][in_mouth]. They light their [name] in the process." else if(istype(O, /obj/item/device/assembly/igniter)) lighting_text = "[user] fiddles with [O], and manages to light their [name]." else if(istype(O, /obj/item/device/flashlight/flare)) @@ -165,46 +177,49 @@ CIGARETTE PACKETS ARE IN FANCY.DM return lighting_text /obj/item/clothing/mask/cigarette/proc/light(flavor_text = null) - if(!src.lit) - src.lit = 1 - name = "lit [name]" - attack_verb = list("burnt", "singed") - hitsound = 'sound/items/welder.ogg' - damtype = "fire" - force = 4 - if(reagents.get_reagent_amount("plasma")) // the plasma explodes when exposed to fire - var/datum/effect_system/reagents_explosion/e = new() - e.set_up(round(reagents.get_reagent_amount("plasma") / 2.5, 1), get_turf(src), 0, 0) - e.start() - if(ismob(loc)) - var/mob/M = loc - M.unEquip(src, 1) - qdel(src) - return - if(reagents.get_reagent_amount("welding_fuel")) // the fuel explodes, too, but much less violently - var/datum/effect_system/reagents_explosion/e = new() - e.set_up(round(reagents.get_reagent_amount("welding_fuel") / 5, 1), get_turf(src), 0, 0) - e.start() - if(ismob(loc)) - var/mob/M = loc - M.unEquip(src, 1) - qdel(src) - return - flags &= ~NOREACT // allowing reagents to react after being lit - reagents.handle_reactions() - icon_state = icon_on - item_state = icon_on - if(flavor_text) - var/turf/T = get_turf(src) - T.visible_message(flavor_text) - SSobj.processing |= src + if(lit) + return - //can't think of any other way to update the overlays :< + lit = TRUE + name = "lit [name]" + attack_verb = list("burnt", "singed") + hitsound = 'sound/items/welder.ogg' + damtype = "fire" + force = 4 + if(reagents.get_reagent_amount("plasma")) // the plasma explodes when exposed to fire + var/datum/effect_system/reagents_explosion/e = new() + e.set_up(round(reagents.get_reagent_amount("plasma") / 2.5, 1), get_turf(src), 0, 0) + e.start() if(ismob(loc)) var/mob/M = loc - M.update_inv_wear_mask() - M.update_inv_l_hand() - M.update_inv_r_hand() + M.unEquip(src, 1) + qdel(src) + return + if(reagents.get_reagent_amount("welding_fuel")) // the fuel explodes, too, but much less violently + var/datum/effect_system/reagents_explosion/e = new() + e.set_up(round(reagents.get_reagent_amount("welding_fuel") / 5, 1), get_turf(src), 0, 0) + e.start() + if(ismob(loc)) + var/mob/M = loc + M.unEquip(src, 1) + qdel(src) + return + // allowing reagents to react after being lit + reagents.set_reacting(TRUE) + reagents.handle_reactions() + icon_state = icon_on + item_state = icon_on + if(flavor_text) + var/turf/T = get_turf(src) + T.visible_message(flavor_text) + SSobj.processing |= src + + //can't think of any other way to update the overlays :< + if(ismob(loc)) + var/mob/M = loc + M.update_inv_wear_mask() + M.update_inv_l_hand() + M.update_inv_r_hand() /obj/item/clothing/mask/cigarette/proc/handle_reagents() @@ -228,25 +243,20 @@ CIGARETTE PACKETS ARE IN FANCY.DM smoketime-- if(smoketime < 1) new type_butt(location) - SSobj.processing.Remove(src) if(ismob(loc)) M << "Your [name] goes out." M.unEquip(src, 1) //un-equip it so the overlays can update //Force the un-equip so the overlays update qdel(src) return - if(location) - location.hotspot_expose(700, 5) - if(reagents && reagents.total_volume) // check if it has any reagents at all + open_flame() + if(reagents && reagents.total_volume) handle_reagents() - return - /obj/item/clothing/mask/cigarette/attack_self(mob/user) if(lit == 1) user.visible_message("[user] calmly drops and treads on \the [src], putting it out instantly.") new type_butt(user.loc) new /obj/effect/decal/cleanable/ash(user.loc) - SSobj.processing.Remove(src) qdel(src) return ..() @@ -370,6 +380,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM ..() name = "empty [initial(name)]" +/obj/item/clothing/mask/cigarette/pipe/Destroy() + if(reagents) + qdel(reagents) + SSobj.processing -= src + . = ..() + /obj/item/clothing/mask/cigarette/pipe/process() var/turf/location = get_turf(src) smoketime-- @@ -386,8 +402,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM name = "empty [initial(name)]" SSobj.processing.Remove(src) return - if(location) - location.hotspot_expose(700, 5) + open_flame() if(reagents && reagents.total_volume) // check if it has any reagents at all handle_reagents() return diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index a0279af71e9..139371fa3d2 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -143,13 +143,12 @@ item_state = "gold_horn" /obj/item/weapon/bikehorn/golden/attack() - ..() flip_mobs() + return ..() /obj/item/weapon/bikehorn/golden/attack_self(mob/user) - ..() flip_mobs() - + ..() /obj/item/weapon/bikehorn/golden/proc/flip_mobs(mob/living/carbon/M, mob/user) if (!spam_flag) diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index c04ead47e26..0bb8b547514 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -1,5 +1,4 @@ //backpack item - /obj/item/weapon/defibrillator name = "defibrillator" desc = "A device that delivers powerful shocks to detachable paddles that resuscitate incapacitated patients." @@ -19,6 +18,7 @@ var/obj/item/weapon/twohanded/shockpaddles/paddles var/obj/item/weapon/stock_parts/cell/high/bcell = null var/combat = 0 //can we revive through space suits? + var/grab_ghost = FALSE // Do we pull the ghost back into their body? /obj/item/weapon/defibrillator/New() //starts without a cell for rnd ..() @@ -297,6 +297,7 @@ var/obj/item/weapon/defibrillator/defib var/req_defib = 1 var/combat = 0 //If it penetrates armor and gives additional functionality + var/grab_ghost = FALSE /obj/item/weapon/twohanded/shockpaddles/proc/recharge(var/time) if(req_defib || !time) @@ -382,178 +383,186 @@ else user << "You aren't sure how to revive that..." return - else - var/mob/living/carbon/human/H = M - if(user.a_intent == "disarm") - if(req_defib && defib.safety) - return - if(!req_defib && !combat) - return - busy = 1 - H.visible_message("[user] has touched [H.name] with [src]!", \ - "[user] has touched [H.name] with [src]!") - H.adjustStaminaLoss(50) - H.Weaken(5) - H.updatehealth() //forces health update before next life tick - playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) - H.emote("gasp") - add_logs(user, M, "stunned", src) - if(req_defib) - defib.deductcharge(revivecost) - cooldown = 1 - busy = 0 - update_icon() - if(req_defib) - defib.cooldowncheck(user) - else - recharge(60) + var/mob/living/carbon/human/H = M + + if(user.a_intent == "disarm") + if(req_defib && defib.safety) return - if(user.zone_selected == "chest") - if(user.a_intent == "harm") - if(req_defib && defib.safety) + if(!req_defib && !combat) + return + busy = 1 + H.visible_message("[user] has touched [H.name] with [src]!", \ + "[user] has touched [H.name] with [src]!") + H.adjustStaminaLoss(50) + H.Weaken(5) + H.updatehealth() //forces health update before next life tick + playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) + H.emote("gasp") + add_logs(user, M, "stunned", src) + if(req_defib) + defib.deductcharge(revivecost) + cooldown = 1 + busy = 0 + update_icon() + if(req_defib) + defib.cooldowncheck(user) + else + recharge(60) + return + + if(user.zone_selected != "chest") + user << "You need to target your patient's \ + chest with [src]!" + return + if(user.a_intent == "harm") + if(req_defib && defib.safety) + return + if(!req_defib && !combat) + return + user.visible_message("[user] begins to place [src] on [M.name]'s chest.", + "You overcharge the paddles and begin to place them onto [M]'s chest...") + busy = 1 + update_icon() + if(do_after(user, 30, target = M)) + user.visible_message("[user] places [src] on [M.name]'s chest.", + "You place [src] on [M.name]'s chest and begin to charge them.") + var/turf/T = get_turf(defib) + playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) + if(req_defib) + T.audible_message("\The [defib] lets out an urgent beep and lets out a steadily rising hum...") + else + user.audible_message("[src] let out an urgent beep.") + if(do_after(user, 30, target = M)) //Takes longer due to overcharging + if(!M) + busy = 0 + update_icon() return - if(!req_defib && !combat) + if(M && M.stat == DEAD) + user << "[M] is dead." + playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) + busy = 0 + update_icon() return - user.visible_message("[user] begins to place [src] on [M.name]'s chest.", - "You overcharge the paddles and begin to place them onto [M]'s chest...") - busy = 1 - update_icon() - if(do_after(user, 30, target = M)) - user.visible_message("[user] places [src] on [M.name]'s chest.", - "You place [src] on [M.name]'s chest and begin to charge them.") - var/turf/T = get_turf(defib) - playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) - if(req_defib) - T.audible_message("\The [defib] lets out an urgent beep and lets out a steadily rising hum...") - else - user.audible_message("[src] let out an urgent beep.") - if(do_after(user, 30, target = M)) //Takes longer due to overcharging - if(!M) - busy = 0 - update_icon() - return - if(M && M.stat == DEAD) - user << "[M] is dead." - playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) - busy = 0 - update_icon() - return - user.visible_message("[user] shocks [M] with \the [src]!", "You shock [M] with \the [src]!") - playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 100, 1, -1) - playsound(loc, 'sound/weapons/Egloves.ogg', 100, 1, -1) - var/mob/living/carbon/human/HU = M - M.emote("scream") - if(!HU.heart_attack) - HU.heart_attack = 1 - if(!HU.stat) - HU.visible_message("[M] thrashes wildly, clutching at their chest!", - "You feel a horrible agony in your chest!") - HU.apply_damage(50, BURN, "chest") - add_logs(user, M, "overloaded the heart of", defib) - M.Weaken(5) - M.Jitter(100) - if(req_defib) - defib.deductcharge(revivecost) - cooldown = 1 - busy = 0 - update_icon() - if(!req_defib) - recharge(60) - if(req_defib && (defib.cooldowncheck(user))) - return + user.visible_message("[user] shocks [M] with \the [src]!", "You shock [M] with \the [src]!") + playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 100, 1, -1) + playsound(loc, 'sound/weapons/Egloves.ogg', 100, 1, -1) + var/mob/living/carbon/human/HU = M + M.emote("scream") + if(!HU.heart_attack) + HU.heart_attack = 1 + if(!HU.stat) + HU.visible_message("[M] thrashes wildly, clutching at their chest!", + "You feel a horrible agony in your chest!") + HU.apply_damage(50, BURN, "chest") + add_logs(user, M, "overloaded the heart of", defib) + M.Weaken(5) + M.Jitter(100) + if(req_defib) + defib.deductcharge(revivecost) + cooldown = 1 busy = 0 update_icon() - return - if(!H.suiciding && !(H.disabilities & NOCLONE)&& !H.hellbound) - H.notify_ghost_cloning("Your heart is being defibrillated. Re-enter your corpse if you want to be revived!", source = src) + if(!req_defib) + recharge(60) + if(req_defib && (defib.cooldowncheck(user))) + return + busy = 0 + update_icon() + return + if((!req_defib && grab_ghost) || (req_defib && defib.grab_ghost)) + H.notify_ghost_cloning("Your heart is being defibrillated!") + H.grab_ghost() // Shove them back in their body. + else if(!H.suiciding && !(H.disabilities & NOCLONE)&& !H.hellbound) + H.notify_ghost_cloning("Your heart is being defibrillated. Re-enter your corpse if you want to be revived!", source = src) - user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest...") - busy = 1 - update_icon() - if(do_after(user, 30, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process - user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.") - playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) - var/tplus = world.time - H.timeofdeath - var/tlimit = 1200 //past this much time the patient is unrecoverable (in deciseconds) - var/tloss = 600 //brain damage starts setting in on the patient after some time left rotting - var/total_burn = 0 - var/total_brute = 0 - if(do_after(user, 20, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total - for(var/obj/item/carried_item in H.contents) - if(istype(carried_item, /obj/item/clothing/suit/space)) - if((!src.combat && !req_defib) || (req_defib && !defib.combat)) - user.audible_message("[req_defib ? "[defib]" : "[src]"] buzzes: Patient's chest is obscured. Operation aborted.") - playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) - busy = 0 - update_icon() - return - if(H.stat == DEAD) - M.visible_message("[M]'s body convulses a bit.") - playsound(get_turf(src), "bodyfall", 50, 1) - playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) - total_brute = H.getBruteLoss() - total_burn = H.getFireLoss() - - var/failed = null - - if (H.suiciding || (H.disabilities & NOCLONE)) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Recovery of patient impossible. Further attempts futile." - else if (H.hellbound) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's soul appears to be on another plane of existance. Further attempts futile." - else if (tplus > tlimit) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Body has decayed for too long. Further attempts futile." - else if (!H.getorgan(/obj/item/organ/heart)) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's heart is missing." - else if(total_burn >= 180 || total_brute >= 180) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Severe tissue damage makes recovery of patient impossible via defibrillator. Further attempts futile." - else if(H.get_ghost()) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - No activity in patient's brain. Further attempts may be successful." - else - var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain) - if(!BR || BR.damaged_brain) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's brain is missing or damaged beyond point of no return. Further attempts futile." - - if(failed) - user.visible_message(failed) - playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) - else - //If the body has been fixed so that they would not be in crit when defibbed, give them oxyloss to put them back into crit - if (H.health > halfwaycritdeath) - H.adjustOxyLoss(H.health - halfwaycritdeath, 0) - else - var/overall_damage = total_brute + total_burn + H.getToxLoss() + H.getOxyLoss() - var/mobhealth = H.health - H.adjustOxyLoss((mobhealth - halfwaycritdeath) * (H.getOxyLoss() / overall_damage), 0) - H.adjustToxLoss((mobhealth - halfwaycritdeath) * (H.getToxLoss() / overall_damage), 0) - H.adjustFireLoss((mobhealth - halfwaycritdeath) * (total_burn / overall_damage), 0) - H.adjustBruteLoss((mobhealth - halfwaycritdeath) * (total_brute / overall_damage), 0) - user.visible_message("[req_defib ? "[defib]" : "[src]"] pings: Resuscitation successful.") - playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) - H.revive() - H.emote("gasp") - if(tplus > tloss) - H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) - add_logs(user, M, "revived", defib) - if(req_defib) - defib.deductcharge(revivecost) - cooldown = 1 - update_icon() - if(req_defib) - defib.cooldowncheck(user) - else - recharge(60) - else if(H.heart_attack) - H.heart_attack = 0 - user.visible_message("[req_defib ? "[defib]" : "[src]"] pings: Patient's heart is now beating again.") - playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) - else - user.visible_message("[req_defib ? "[defib]" : "[src]"] buzzes: Patient is not in a valid state. Operation aborted.") + user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest...") + busy = 1 + update_icon() + if(do_after(user, 30, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process + user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.") + playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) + var/tplus = world.time - H.timeofdeath + // past this much time the patient is unrecoverable + // (in deciseconds) + var/tlimit = DEFIB_TIME_LIMIT * 10 + // brain damage starts setting in on the patient after + // some time left rotting + var/tloss = DEFIB_TIME_LOSS * 10 + var/total_burn = 0 + var/total_brute = 0 + if(do_after(user, 20, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total + for(var/obj/item/carried_item in H.contents) + if(istype(carried_item, /obj/item/clothing/suit/space)) + if((!src.combat && !req_defib) || (req_defib && !defib.combat)) + user.audible_message("[req_defib ? "[defib]" : "[src]"] buzzes: Patient's chest is obscured. Operation aborted.") playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) - busy = 0 - update_icon() - else - user << "You need to target your patient's chest with [src]!" - return + busy = 0 + update_icon() + return + if(H.stat == DEAD) + M.visible_message("[M]'s body convulses a bit.") + playsound(get_turf(src), "bodyfall", 50, 1) + playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) + total_brute = H.getBruteLoss() + total_burn = H.getFireLoss() + + var/failed = null + + if (H.suiciding || (H.disabilities & NOCLONE)) + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Recovery of patient impossible. Further attempts futile." + else if (H.hellbound) + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's soul appears to be on another plane of existance. Further attempts futile." + else if (tplus > tlimit) + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Body has decayed for too long. Further attempts futile." + else if (!H.getorgan(/obj/item/organ/heart)) + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's heart is missing." + else if(total_burn >= 180 || total_brute >= 180) + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Severe tissue damage makes recovery of patient impossible via defibrillator. Further attempts futile." + else if(H.get_ghost()) + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - No activity in patient's brain. Further attempts may be successful." + else + var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain) + if(!BR || BR.damaged_brain) + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's brain is missing or damaged beyond point of no return. Further attempts futile." + + if(failed) + user.visible_message(failed) + playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) + else + //If the body has been fixed so that they would not be in crit when defibbed, give them oxyloss to put them back into crit + if (H.health > halfwaycritdeath) + H.adjustOxyLoss(H.health - halfwaycritdeath, 0) + else + var/overall_damage = total_brute + total_burn + H.getToxLoss() + H.getOxyLoss() + var/mobhealth = H.health + H.adjustOxyLoss((mobhealth - halfwaycritdeath) * (H.getOxyLoss() / overall_damage), 0) + H.adjustToxLoss((mobhealth - halfwaycritdeath) * (H.getToxLoss() / overall_damage), 0) + H.adjustFireLoss((mobhealth - halfwaycritdeath) * (total_burn / overall_damage), 0) + H.adjustBruteLoss((mobhealth - halfwaycritdeath) * (total_brute / overall_damage), 0) + user.visible_message("[req_defib ? "[defib]" : "[src]"] pings: Resuscitation successful.") + playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) + H.revive() + H.emote("gasp") + if(tplus > tloss) + H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) + add_logs(user, M, "revived", defib) + if(req_defib) + defib.deductcharge(revivecost) + cooldown = 1 + update_icon() + if(req_defib) + defib.cooldowncheck(user) + else + recharge(60) + else if(H.heart_attack) + H.heart_attack = 0 + user.visible_message("[req_defib ? "[defib]" : "[src]"] pings: Patient's heart is now beating again.") + playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) + else + user.visible_message("[req_defib ? "[defib]" : "[src]"] buzzes: Patient is not in a valid state. Operation aborted.") + playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) + busy = 0 + update_icon() /obj/item/weapon/twohanded/shockpaddles/syndicate name = "syndicate defibrillator paddles" diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index a81762cadf1..c3512dfc983 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -174,7 +174,7 @@ var/turf/T = get_turf(loc) if(istype(T, /turf/open)) var/turf/open/theturf = T - theturf.MakeSlippery(TURF_WET_WATER) + theturf.MakeSlippery(min_wet_time = 10, wet_time_to_add = 5) user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] using its release valve.") return diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 103e0b3f07c..bd261f6a22c 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -305,6 +305,9 @@ /obj/item/weapon/restraints/legcuffs/beartrap/energy/attack_hand(mob/user) Crossed(user) //honk +/obj/item/weapon/restraints/legcuffs/beartrap/energy/cyborg + breakouttime = 20 // Cyborgs shouldn't have a strong restraint + /obj/item/weapon/restraints/legcuffs/bola name = "bola" desc = "A restraining device designed to be thrown at the target. Upon connecting with said target, it will wrap around their legs, making it difficult for them to move quickly." diff --git a/code/game/objects/items/weapons/holosign_creator.dm b/code/game/objects/items/weapons/holosign_creator.dm index 97a9278a63d..236bad8dc28 100644 --- a/code/game/objects/items/weapons/holosign_creator.dm +++ b/code/game/objects/items/weapons/holosign_creator.dm @@ -74,6 +74,45 @@ creation_time = 30 max_signs = 6 +/obj/item/weapon/holosign_creator/cyborg + name = "Energy Barrier Projector" + desc = "A holographic projector that creates fragile energy fields" + creation_time = 5 + max_signs = 9 + holosign_type = /obj/effect/overlay/holograph/barrier/cyborg + var/shock = 0 + +/obj/item/weapon/holosign_creator/cyborg/attack_self(mob/user) + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + + if(shock) + user <<"You clear all active holograms, and reset your projector to normal." + holosign_type = /obj/effect/overlay/holograph/barrier/cyborg + creation_time = 5 + if(signs.len) + for(var/H in signs) + qdel(H) + shock = 0 + return + else if(R.emagged&&!shock) + user <<"You clear all active holograms, and overload your energy projector!" + holosign_type = /obj/effect/overlay/holograph/barrier/cyborg/hacked + creation_time = 30 + if(signs.len) + for(var/H in signs) + qdel(H) + shock = 1 + return + else + if(signs.len) + for(var/H in signs) + qdel(H) + user << "You clear all active holograms." + if(signs.len) + for(var/H in signs) + qdel(H) + user << "You clear all active holograms." /obj/effect/overlay/holograph icon = 'icons/effects/effects.dmi' @@ -185,3 +224,36 @@ /obj/effect/overlay/holograph/barrier/engineering icon_state = "holosign_engi" + +/obj/effect/overlay/holograph/barrier/cyborg + name = "Energy Field" + desc = "A fragile energy field that blocks movement" + density = 1 + holo_integrity = 1 + +/obj/effect/overlay/holograph/barrier/CanPass() + return 0 + +/obj/effect/overlay/holograph/barrier/cyborg/hacked + name = "Charged Energy Field" + desc = "A powerful energy field that blocks movement. Energy arcs off it" + holo_integrity = 3 + var/shockcd = 0 + +/obj/effect/overlay/holograph/barrier/cyborg/hacked/attack_hand(mob/living/user) + if(!shockcd) + if(ismob(user)) + var/mob/living/M = user + M.electrocute_act(15,"Energy Barrier", safety=1) + shockcd = 1 + spawn(10) + shockcd = 0 + +/obj/effect/overlay/holograph/barrier/cyborg/hacked/Bumped(atom/user) + if(!shockcd) + if(ismob(user)) + var/mob/living/M = user + M.electrocute_act(15,"Energy Barrier", safety=1) + shockcd = 1 + spawn(10) + shockcd = 0 \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 29c3e7af930..fd681c0138e 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -69,24 +69,7 @@ add_implants() ready = 1 - src.updateUsrDialog() - return - - -/obj/machinery/implantchair/attackby(obj/item/weapon/W, mob/user, params) - if(istype(W, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = W - if(!ismob(G.affecting)) - return - var/mob/M = G.affecting - if(M.buckled_mobs.len) - user << "[M] will not fit into [src] because they have a creature on them!" - return - if(put_mob(M)) - qdel(G) - updateUsrDialog() - else - return ..() + updateUsrDialog() /obj/machinery/implantchair/go_out(mob/M) diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 7ad6d644047..448925b824c 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -23,7 +23,7 @@ obj/item/weapon/mop/proc/clean(turf/A) - if(reagents.has_reagent("water", 1) || reagents.has_reagent("holywater", 1) || reagents.has_reagent("vodka", 1)) + if(reagents.has_reagent("water", 1) || reagents.has_reagent("holywater", 1) || reagents.has_reagent("vodka", 1) || reagents.has_reagent("cleaner", 1)) A.clean_blood() for(var/obj/effect/O in A) if(is_cleanable(O)) @@ -31,7 +31,7 @@ obj/item/weapon/mop/proc/clean(turf/A) if(istype(A, /turf/closed)) var/turf/closed/C = A C.thermite = 0 - reagents.reaction(A, TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly. + reagents.reaction(A, TOUCH, 5) //Needed for proper floor wetting. reagents.remove_any(1) //reaction() doesn't use up the reagents diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index ce3249bcc2c..c9fb74a6826 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -85,7 +85,7 @@ qdel(src) singulo.process() return - ..() + . = ..() /obj/item/weapon/storage/backpack/holding/proc/failcheck(mob/user) if (prob(src.reliability)) return 1 //No failure diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 876a2816209..af415d016c8 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -198,6 +198,8 @@ if(!S.amount) qdel(S) else + if(S.pulledby) + S.pulledby.stop_pulling() S.loc = src orient2hud(usr) @@ -342,7 +344,7 @@ /obj/item/weapon/storage/bag/tray/handle_item_insertion(obj/item/I, prevent_warning = 0) overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = -1) - ..() + . = ..() /* diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 9f9d9eaa162..2a1cd3a1814 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -99,8 +99,8 @@ /obj/item/weapon/storage/fancy/cigarettes/New() ..() - flags |= NOREACT create_reagents(15 * storage_slots)//so people can inject cigarettes without opening a packet, now with being able to inject the whole one + reagents.set_reacting(FALSE) for(var/obj/item/clothing/mask/cigarette/cig in src) cig.desc = "\An [name] brand [cig.name]." name = "\improper [name] packet" diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 88b479e8591..7947a228a35 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -157,7 +157,7 @@ boxes.screen_loc = "[tx]:,[ty] to [mx],[my]" for(var/obj/O in contents) O.screen_loc = "[cx],[cy]" - O.layer = 20 + O.layer = ABOVE_HUD_LAYER cx++ if(cx > mx) cx = tx @@ -176,7 +176,7 @@ ND.sample_object.mouse_opacity = 2 ND.sample_object.screen_loc = "[cx]:16,[cy]:16" ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]" - ND.sample_object.layer = 20 + ND.sample_object.layer = ABOVE_HUD_LAYER cx++ if(cx > (4+cols)) cx = 4 @@ -186,7 +186,7 @@ O.mouse_opacity = 2 //This is here so storage items that spawn with contents correctly have the "click around item to equip" O.screen_loc = "[cx]:16,[cy]:16" O.maptext = "" - O.layer = 20 + O.layer = ABOVE_HUD_LAYER cx++ if(cx > (4+cols)) cx = 4 @@ -301,6 +301,8 @@ return 0 if(silent) prevent_warning = 1 + if(W.pulledby) + W.pulledby.stop_pulling() W.loc = src W.on_enter_storage(src) if(usr) @@ -462,11 +464,11 @@ boxes.master = src boxes.icon_state = "block" boxes.screen_loc = "7,7 to 10,8" - boxes.layer = 19 + boxes.layer = HUD_LAYER closer = new /obj/screen/close() closer.master = src closer.icon_state = "backpack_close" - closer.layer = 20 + closer.layer = ABOVE_HUD_LAYER orient2hud() diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index d3b45dcf87b..cc861ffaeb6 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -51,7 +51,7 @@ combined_access |= I.access /obj/item/weapon/storage/wallet/handle_item_insertion(obj/item/W, prevent_warning = 0) - . = ..(W, prevent_warning) + . = ..() if(.) if(istype(W, /obj/item/weapon/card/id)) refreshID() diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 0e0ff304900..6889a6cbdd5 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -141,7 +141,7 @@ user << "This MMI does not seem to fit!" return - if(M.syndiemmi) + if(M.hacked) user << "This MMI does not seem to fit!" return diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index ffe82b4c3c3..be576ce514b 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -162,7 +162,7 @@ desc = "A thick resin surface covers the floor." anchored = 1 density = 0 - layer = TURF_LAYER + 0.09 + layer = TURF_LAYER icon_state = "weeds" health = 15 var/obj/structure/alien/weeds/node/linked_node = null diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index 5186309b65e..afa7633b420 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -14,7 +14,7 @@ var/image/nest_overlay /obj/structure/bed/nest/New() - nest_overlay = image('icons/mob/alien.dmi', "nestoverlay", layer=MOB_LAYER - 0.2) + nest_overlay = image('icons/mob/alien.dmi', "nestoverlay", layer=LYING_MOB_LAYER) return ..() /obj/structure/bed/nest/user_unbuckle_mob(mob/living/buckled_mob, mob/living/user) @@ -73,7 +73,7 @@ if(M in buckled_mobs) M.pixel_y = 0 M.pixel_x = initial(M.pixel_x) + 2 - M.layer = MOB_LAYER - 0.3 + M.layer = BELOW_MOB_LAYER overlays += nest_overlay else M.pixel_x = M.get_standard_pixel_x_offset(M.lying) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index faf3b4b8cb3..c91e5d5978e 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -162,7 +162,7 @@ /obj/structure/chair/comfy/New() armrest = image("icons/obj/chairs.dmi", "comfychair_armrest") - armrest.layer = MOB_LAYER + 0.1 + armrest.layer = ABOVE_MOB_LAYER return ..() diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 415139938a2..535966a09f8 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -11,7 +11,7 @@ LINEN BINS icon_state = "sheetwhite" item_state = "bedsheet" slot_flags = SLOT_BACK - layer = 4 + layer = MOB_LAYER throwforce = 0 throw_speed = 1 throw_range = 2 @@ -28,9 +28,11 @@ LINEN BINS /obj/item/weapon/bedsheet/attack_self(mob/user) user.drop_item() if(layer == initial(layer)) - layer = 5 + layer = ABOVE_MOB_LAYER + user << "You cover yourself with [src]." else layer = initial(layer) + user << "You smooth [src] out beneath you." add_fingerprint(user) return diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 1265b21905c..8dd7a6138b2 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -381,10 +381,10 @@ /obj/structure/closet/AltClick(mob/user) ..() - if(!user.canUseTopic(user)) + if(!user.canUseTopic(src, be_close=TRUE)) user << "You can't do that right now!" return - if(opened || !secure || !in_range(src, user)) + if(opened || !secure) return else togglelock(user) 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 6c6e0f78446..79e8aaa1560 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -77,8 +77,8 @@ new /obj/item/weapon/shield/riot/tele(src) new /obj/item/weapon/storage/belt/security/full(src) new /obj/item/weapon/gun/energy/gun/hos(src) - new /obj/item/weapon/door_remote/head_of_security(src) new /obj/item/device/flashlight/seclite(src) + new /obj/item/weapon/pinpointer(src) /obj/structure/closet/secure_closet/warden name = "\proper warden's locker" @@ -101,6 +101,7 @@ new /obj/item/weapon/storage/belt/security/full(src) new /obj/item/device/flashlight/seclite(src) new /obj/item/clothing/gloves/color/black/krav_maga/sec(src) + new /obj/item/weapon/door_remote/head_of_security(src) /obj/structure/closet/secure_closet/security name = "security officer's locker" diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 8bf04d32eea..46d5f54b002 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -8,7 +8,7 @@ anchored = 1 density = 1 pixel_x = -16 - layer = 9 + layer = FLY_LAYER var/cut = FALSE var/log_amount = 10 diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index a781894bfc5..ed54a367368 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -9,7 +9,7 @@ icon_state = "girder" anchored = 1 density = 1 - layer = 2.9 + layer = BELOW_OBJ_LAYER var/state = GIRDER_NORMAL var/girderpasschance = 20 // percentage chance that a projectile passes through the girder. var/can_displace = TRUE //If the girder can be moved around by wrenching it @@ -291,7 +291,6 @@ anchored = 0 state = GIRDER_DISPLACED girderpasschance = 25 - layer = 2.45 /obj/structure/girder/reinforced name = "reinforced girder" @@ -376,7 +375,7 @@ user.visible_message("[user] plates [src] with runed metal.", "You construct a runed wall.") R.use(1) var/turf/T = get_turf(src) - T.ChangeTurf(/turf/closed/wall/cult) + T.ChangeTurf(/turf/closed/wall/mineral/cult) qdel(src) else diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 745d27a0e5c..b2b5bf94732 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -7,7 +7,7 @@ anchored = 1 flags = CONDUCT pressure_resistance = 5*ONE_ATMOSPHERE - layer = 2.9 + layer = BELOW_OBJ_LAYER var/health = 10 var/destroyed = 0 var/obj/item/stack/rods/stored diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index fb32d2d03ba..998a6820328 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -50,38 +50,37 @@ qdel(src) else user << "You can't do that while something's on the spike!" - - else if(istype(I, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = I - if(istype(G.affecting, /mob/living/)) - if(!buckled_mobs.len) - if(do_mob(user, src, 120)) - if(buckled_mobs.len) //to prevent spam/queing up attacks - return - if(G.affecting.buckled) - return - var/mob/living/H = G.affecting - playsound(src.loc, "sound/effects/splat.ogg", 25, 1) - H.visible_message("[user] slams [G.affecting] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.") - H.loc = src.loc - H.emote("scream") - if(istype(H, /mob/living/carbon/human)) //So you don't get human blood when you spike a giant spidere - var/turf/pos = get_turf(H) - pos.add_blood_floor(H) - H.adjustBruteLoss(30) - H.buckled = src - H.dir = 2 - buckle_mob(H, force=1) - var/matrix/m180 = matrix(H.transform) - m180.Turn(180) - animate(H, transform = m180, time = 3) - H.pixel_y = H.get_standard_pixel_y_offset(180) - qdel(G) - return - user << "You can't use that on the spike!" else return ..() +/obj/structure/kitchenspike/attack_hand(mob/user) + if(user.pulling && isliving(user.pulling) && user.a_intent == "grab" && !buckled_mobs.len) + var/mob/living/L = user.pulling + if(do_mob(user, src, 120)) + if(buckled_mobs.len) //to prevent spam/queing up attacks + return + if(L.buckled) + return + playsound(src.loc, "sound/effects/splat.ogg", 25, 1) + L.visible_message("[user] slams [L] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.") + L.loc = src.loc + L.emote("scream") + if(ishuman(L)) //So you don't get human blood when you spike a giant spider + var/turf/pos = get_turf(L) + pos.add_blood_floor(L) + L.adjustBruteLoss(30) + L.buckled = src + L.dir = 2 + buckle_mob(L, force=1) + var/matrix/m180 = matrix(L.transform) + m180.Turn(180) + animate(L, transform = m180, time = 3) + L.pixel_y = L.get_standard_pixel_y_offset(180) + else + ..() + + + /obj/structure/kitchenspike/user_buckle_mob(mob/living/M, mob/living/user) //Don't want them getting put on the rack other than by spiking return diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index d5dc481041d..8c23c5046cc 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -66,7 +66,7 @@ go_up(user,is_ghost) else if(down) go_down(user,is_ghost) - + if(!is_ghost) add_fingerprint(user) @@ -92,6 +92,8 @@ /obj/structure/ladder/proc/can_use(mob/user) return 1 -/obj/structure/ladder/unbreakable/Destroy() - return QDEL_HINT_LETMELIVE - +/obj/structure/ladder/unbreakable/Destroy(force) + if(force) + . = ..() + else + return QDEL_HINT_LETMELIVE diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index c676d5882ce..399253f5a17 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -5,7 +5,7 @@ icon_state = "lattice" density = 0 anchored = 1 - layer = 2.3 //under pipes + layer = LATTICE_LAYER //under pipes var/obj/item/stack/rods/stored canSmoothWith = list(/obj/structure/lattice, /turf/open/floor, diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 03b9f323307..e142ca61091 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -211,7 +211,7 @@ var/global/list/crematoriums = new/list() /obj/structure/tray icon = 'icons/obj/stationobjs.dmi' density = 1 - layer = 2.9 + layer = BELOW_OBJ_LAYER var/obj/structure/bodycontainer/connected = null anchored = 1 pass_flags = LETPASSTHROW diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index ee8c28788a9..69603d9c9ed 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -5,7 +5,7 @@ icon_state = "plasticflaps" density = 0 anchored = 1 - layer = 4 + layer = ABOVE_MOB_LAYER /obj/structure/plasticflaps/CanAStarPass(ID, to_dir, caller) if(istype(caller, /mob/living)) diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index 48004def34a..ce55d863179 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -5,7 +5,7 @@ desc = "An angled mirror for reflecting lasers. This one does so at a 90 degree angle." anchored = 0 density = 1 - layer = 2.9 + layer = BELOW_OBJ_LAYER var/finished = 0 var/admin = 0 //Can't be rotated or deconstructed var/framebuildstacktype = /obj/item/stack/sheet/metal @@ -124,11 +124,9 @@ /obj/structure/reflector/AltClick(mob/user) ..() - if(!user.canUseTopic(user)) + if(!user.canUseTopic(src, be_close=TRUE)) user << "You can't do that right now!" return - if(!in_range(src, user)) - return else rotate() diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 51679ceedf2..8cd1b6b101d 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -177,7 +177,7 @@ obj/structure/safe/ex_act(severity, target) icon_state = "floorsafe" density = 0 level = 1 //underfloor - layer = 2.5 + layer = LOW_OBJ_LAYER /obj/structure/safe/floor/initialize() diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 28cc59a701b..df5050da450 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -3,7 +3,7 @@ anchored = 1 opacity = 0 density = 0 - layer = 3.5 + layer = SIGN_LAYER /obj/structure/sign/basic name = "blank sign" diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm index c9e6167f88f..7dc62153c5d 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/game/objects/structures/table_frames.dm @@ -16,7 +16,7 @@ icon_state = "table_frame" density = 0 anchored = 0 - layer = 2.8 + layer = PROJECTILE_HIT_THRESHHOLD_LAYER var/framestack = /obj/item/stack/rods var/framestackamount = 2 diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 199c3ddae49..a4dfb691ee1 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -19,7 +19,7 @@ icon_state = "table" density = 1 anchored = 1 - layer = 2.8 + layer = TABLE_LAYER climbable = TRUE pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.") var/frame = /obj/structure/table_frame @@ -97,6 +97,19 @@ take_damage(rand(180,280), BRUTE, 0) return 1 +/obj/structure/table/attack_hand(mob/living/user) + if(user.a_intent == "grab" && user.pulling && isliving(user.pulling)) + var/mob/living/pushed_mob = user.pulling + if(pushed_mob.buckled) + user << "[pushed_mob] is buckled to [pushed_mob.buckled]!" + return + if(user.grab_state < GRAB_AGGRESSIVE) + user << "You need a better grip to do that!" + return + tablepush(user, pushed_mob) + user.stop_pulling() + else + ..() /obj/structure/table/attack_tk() // no telehulk sorry return @@ -123,39 +136,15 @@ var/atom/movable/mover = caller . = . || mover.checkpass(PASSTABLE) -/obj/structure/table/proc/tablepush(obj/item/I, mob/user) - if(get_dist(src, user) < 2) - var/obj/item/weapon/grab/G = I - if(G.affecting.buckled) - user << "[G.affecting] is buckled to [G.affecting.buckled]!" - return 0 - if(G.state < GRAB_AGGRESSIVE) - user << "You need a better grip to do that!" - return 0 - if(!G.confirm()) - return 0 - G.affecting.loc = src.loc - if(istype(src, /obj/structure/table/optable)) - var/obj/structure/table/optable/OT = src - G.affecting.resting = 1 - G.affecting.update_canmove() - visible_message("[G.assailant] has laid [G.affecting] on [src].") - OT.patient = G.affecting - OT.check_patient() - qdel(I) - return 1 - G.affecting.Weaken(2) - G.affecting.visible_message("[G.assailant] pushes [G.affecting] onto [src].", \ - "[G.assailant] pushes [G.affecting] onto [src].") - add_logs(G.assailant, G.affecting, "pushed") - qdel(I) - return 1 - qdel(I) +/obj/structure/table/proc/tablepush(mob/living/user, mob/living/pushed_mob) + pushed_mob.forceMove(src.loc) + pushed_mob.Weaken(2) + pushed_mob.visible_message("[user] pushes [pushed_mob] onto [src].", \ + "[user] pushes [pushed_mob] onto [src].") + add_logs(user, pushed_mob, "pushed") + /obj/structure/table/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/grab)) - tablepush(I, user) - return if(!(flags & NODECONSTRUCT)) if(istype(I, /obj/item/weapon/screwdriver) && deconstruction_ready) table_deconstruct(user, 1) @@ -263,29 +252,56 @@ buildstack = /obj/item/stack/sheet/glass canSmoothWith = null health = 50 + var/list/debris = list() + +/obj/structure/table/glass/New() + . = ..() + debris += new frame + debris += new /obj/item/weapon/shard + +/obj/structure/table/glass/Destroy() + for(var/i in debris) + qdel(i) + . = ..() /obj/structure/table/glass/Crossed(atom/movable/AM) . = ..() if(flags & NODECONSTRUCT) return + if(!isliving(AM)) + return // Don't break if they're just flying past if(AM.throwing) - return + spawn(5) + // Check again in a bit though + if(AM.loc == get_turf(src)) + check_break(AM) + else + check_break(AM) - if(istype(AM, /mob/living)) - var/mob/living/M = AM - if(has_gravity(M) && M.mob_size > MOB_SIZE_SMALL) - table_shatter(M) +/obj/structure/table/glass/proc/check_break(mob/living/M) + if(has_gravity(M) && M.mob_size > MOB_SIZE_SMALL) + table_shatter(M) /obj/structure/table/glass/proc/table_shatter(mob/M) - visible_message("[src] breaks!") - playsound(src.loc, "shatter", 50, 1) - new frame(src.loc) - var/obj/item/weapon/shard/S = new(src.loc) - S.throw_impact(M) + visible_message("[src] breaks!", + "You hear breaking glass.") + var/turf/T = get_turf(src) + playsound(T, "shatter", 50, 1) + for(var/I in debris) + var/atom/movable/AM = I + AM.forceMove(T) + debris -= AM + if(istype(AM, /obj/item/weapon/shard)) + AM.throw_impact(M) M.Weaken(5) qdel(src) +/obj/structure/table/glass/narsie_act() + color = NARSIE_WINDOW_COLOUR + for(var/obj/item/weapon/shard/S in debris) + S.color = NARSIE_WINDOW_COLOUR + /* * Wooden tables */ @@ -300,7 +316,9 @@ buildstack = /obj/item/stack/sheet/mineral/wood burn_state = FLAMMABLE burntime = 20 - canSmoothWith = list(/obj/structure/table/wood, /obj/structure/table/wood/poker) + canSmoothWith = list(/obj/structure/table/wood, + /obj/structure/table/wood/poker, + /obj/structure/table/wood/bar) /obj/structure/table/wood/narsie_act() return @@ -311,7 +329,6 @@ icon = 'icons/obj/smooth_structures/poker_table.dmi' icon_state = "poker_table" buildstack = /obj/item/stack/tile/carpet - canSmoothWith = list(/obj/structure/table/wood/poker, /obj/structure/table/wood) /obj/structure/table/wood/poker/narsie_act() new /obj/structure/table/wood(src.loc) @@ -375,6 +392,13 @@ computer.table = src break +/obj/structure/table/optable/tablepush(mob/living/user, mob/living/pushed_mob) + pushed_mob.forceMove(src.loc) + pushed_mob.resting = 1 + pushed_mob.update_canmove() + visible_message("[user] has laid [pushed_mob] on [src].") + check_patient() + /obj/structure/table/optable/proc/check_patient() var/mob/M = locate(/mob/living/carbon/human, loc) if(M) diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index 0c931eb3b53..0a0d96eac20 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -27,7 +27,7 @@ pinned_target = T T.pinnedLoc = src T.density = 1 - T.layer = OBJ_LAYER + 0.1 + T.layer = OBJ_LAYER + 0.01 T.loc = loc user << "You slide the target into the stake." diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index e4bbee8dcf7..0f4e8e3f431 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -60,41 +60,44 @@ /obj/structure/transit_tube/station/attack_hand(mob/user) if(!pod_moving) - for(var/obj/structure/transit_tube_pod/pod in loc) - if(!pod.moving && pod.dir in directions()) - if(icon_state == "closed") - open_animation() + if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + if(icon_state == "open") + var/mob/living/GM = user.pulling + if(user.grab_state >= GRAB_AGGRESSIVE) + if(GM.buckled || GM.buckled_mobs.len) + user << "[GM] is attached to something!" + return + for(var/obj/structure/transit_tube_pod/pod in loc) + pod.visible_message("[user] starts putting [GM] into the [pod]!") + if(do_after(user, 15, target = src)) + if(GM && user.grab_state >= GRAB_AGGRESSIVE && user.pulling == GM && !GM.buckled && !GM.buckled_mobs.len) + GM.Weaken(5) + src.Bumped(GM) + break + else + for(var/obj/structure/transit_tube_pod/pod in loc) + if(!pod.moving && pod.dir in directions()) + if(icon_state == "closed") + open_animation() - else if(icon_state == "open") - if(pod.contents.len && user.loc != pod) - user.visible_message("[user] starts emptying [pod]'s contents onto the floor.", "You start emptying [pod]'s contents onto the floor...") - if(do_after(user, 10, target = src)) //So it doesn't default to close_animation() on fail - if(pod.loc == loc) - for(var/atom/movable/AM in pod) - AM.loc = get_turf(user) - if(ismob(AM)) - var/mob/M = AM - M.Weaken(5) + else if(icon_state == "open") + if(pod.contents.len && user.loc != pod) + user.visible_message("[user] starts emptying [pod]'s contents onto the floor.", "You start emptying [pod]'s contents onto the floor...") + if(do_after(user, 10, target = src)) //So it doesn't default to close_animation() on fail + if(pod.loc == loc) + for(var/atom/movable/AM in pod) + AM.loc = get_turf(user) + if(ismob(AM)) + var/mob/M = AM + M.Weaken(5) - else - close_animation() - break + else + close_animation() + break /obj/structure/transit_tube/station/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/weapon/grab)) - if(icon_state == "open") - var/obj/item/weapon/grab/G = W - if(ismob(G.affecting) && G.state >= GRAB_AGGRESSIVE) - var/mob/GM = G.affecting - for(var/obj/structure/transit_tube_pod/pod in loc) - pod.visible_message("[user] starts putting [GM] into the [pod]!") - if(do_after(user, 15, target = src) && GM && G && G.affecting == GM) - GM.Weaken(5) - src.Bumped(GM) - qdel(G) - break - else if(istype(W, /obj/item/weapon/crowbar)) + if(istype(W, /obj/item/weapon/crowbar)) for(var/obj/structure/transit_tube_pod/pod in loc) if(pod.contents) user << "Empty the pod first!" diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index bb7cc05d07c..5c42bb22445 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi' icon_state = "E-W" density = 1 - layer = 3.1 + layer = ABOVE_OBJ_LAYER anchored = 1 var/tube_construction = /obj/structure/c_transit_tube var/list/tube_dirs = null diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index ffcacef2f4b..8ce01aa0305 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi' icon_state = "E-W" //icon_state decides which tube will be built density = 0 - layer = 3.1 //same as the built tube + layer = ABOVE_OBJ_LAYER //same as the built tube anchored = 0 /obj/structure/c_transit_tube/examine(mob/user) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 509263147b8..fea81bd9dcc 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -22,12 +22,37 @@ playsound(src.loc, "swing_hit", 25, 1) swirlie.visible_message("[user] slams the toilet seat onto [swirlie]'s head!", "[user] slams the toilet seat onto your head!", "You hear reverberating porcelain.") swirlie.adjustBruteLoss(5) - return - if(cistern && !open) + else if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + user.changeNext_move(CLICK_CD_MELEE) + var/mob/living/GM = user.pulling + if(user.grab_state >= GRAB_AGGRESSIVE) + if(GM.loc != get_turf(src)) + user << "[GM] needs to be on [src]!" + return + if(!swirlie) + if(open) + GM.visible_message("[user] starts to give [GM] a swirlie!", "[user] starts to give you a swirlie...") + swirlie = GM + if(do_after(user, 30, 0, target = src)) + GM.visible_message("[user] gives [GM] a swirlie!", "[user] gives you a swirlie!", "You hear a toilet flushing.") + if(iscarbon(GM)) + var/mob/living/carbon/C = GM + if(!C.internal) + C.adjustOxyLoss(5) + else + GM.adjustOxyLoss(5) + swirlie = null + else + playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) + GM.visible_message("[user] slams [GM.name] into [src]!", "[user] slams you into [src]!") + GM.adjustBruteLoss(5) + else + user << "You need a tighter grip!" + + else if(cistern && !open) if(!contents.len) user << "The cistern is empty." - return else var/obj/item/I = pick(contents) if(ishuman(user)) @@ -36,10 +61,9 @@ I.loc = get_turf(src) user << "You find [I] in the cistern." w_items -= I.w_class - return - - open = !open - update_icon() + else + open = !open + update_icon() /obj/structure/toilet/update_icon() @@ -54,7 +78,6 @@ user.visible_message("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!", "You hear grinding porcelain.") cistern = !cistern update_icon() - return else if(cistern) if(user.a_intent != "harm") @@ -70,7 +93,6 @@ I.loc = src w_items += I.w_class user << "You carefully place [I] into the cistern." - return else if(istype(I, /obj/item/weapon/reagent_containers)) if (!open) @@ -78,39 +100,6 @@ var/obj/item/weapon/reagent_containers/RG = I RG.reagents.add_reagent("water", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this)) user << "You fill [RG] from [src]. Gross." - return - - else if(istype(I, /obj/item/weapon/grab)) - user.changeNext_move(CLICK_CD_MELEE) - var/obj/item/weapon/grab/G = I - if(!G.confirm()) - return - if(isliving(G.affecting)) - var/mob/living/GM = G.affecting - if(G.state >= GRAB_AGGRESSIVE) - if(GM.loc != get_turf(src)) - user << "[GM] needs to be on [src]!" - return - if(!swirlie) - if(open) - GM.visible_message("[user] starts to give [GM] a swirlie!", "[user] starts to give you a swirlie...") - swirlie = GM - if(do_after(user, 30, 0, target = src)) - GM.visible_message("[user] gives [GM] a swirlie!", "[user] gives you a swirlie!", "You hear a toilet flushing.") - if(iscarbon(GM)) - var/mob/living/carbon/C = GM - if(!C.internal) - C.adjustOxyLoss(5) - else - GM.adjustOxyLoss(5) - swirlie = null - else - playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) - GM.visible_message("[user] slams [GM.name] into [src]!", "[user] slams you into [src]!") - GM.adjustBruteLoss(5) - else - user << "You need a tighter grip!" - else return ..() @@ -125,24 +114,20 @@ anchored = 1 -/obj/structure/urinal/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = I - if(!G.confirm()) - return - if(isliving(G.affecting)) - var/mob/living/GM = G.affecting - if(G.state >= GRAB_AGGRESSIVE) - if(GM.loc != get_turf(src)) - user << "[GM.name] needs to be on [src]." - return - user.changeNext_move(CLICK_CD_MELEE) - user.visible_message("[user] slams [GM] into [src]!", "You slam [GM] into [src]!") - GM.adjustBruteLoss(8) - else - user << "You need a tighter grip!" +/obj/structure/urinal/attack_hand(mob/user) + if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + var/mob/living/GM = user.pulling + if(user.grab_state >= GRAB_AGGRESSIVE) + if(GM.loc != get_turf(src)) + user << "[GM.name] needs to be on [src]." + return + user.changeNext_move(CLICK_CD_MELEE) + user.visible_message("[user] slams [GM] into [src]!", "You slam [GM] into [src]!") + GM.adjustBruteLoss(8) + else + user << "You need a tighter grip!" else - return ..() + ..() /obj/machinery/shower name = "shower" @@ -162,7 +147,7 @@ name = "mist" icon = 'icons/obj/watercloset.dmi' icon_state = "mist" - layer = MOB_LAYER + 1 + layer = FLY_LAYER anchored = 1 mouse_opacity = 0 @@ -182,7 +167,7 @@ else if(istype(loc, /turf/open)) var/turf/open/tile = loc - tile.MakeSlippery() + tile.MakeSlippery(min_wet_time = 5, wet_time_to_add = 1) /obj/machinery/shower/attackby(obj/item/I, mob/user, params) @@ -492,4 +477,4 @@ /obj/structure/sink/puddle/attackby(obj/item/O, mob/user, params) icon_state = "puddle-splash" . = ..() - icon_state = "puddle" \ No newline at end of file + icon_state = "puddle" diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 9d8f2f93bbc..15f57b2c55e 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -3,7 +3,7 @@ desc = "A window." icon_state = "window" density = 1 - layer = 3.2//Just above doors + layer = ABOVE_OBJ_LAYER //Just above doors pressure_resistance = 4*ONE_ATMOSPHERE anchored = 1 //initially is 0 for tile smoothing flags = ON_BORDER @@ -69,10 +69,9 @@ shatter() /obj/structure/window/narsie_act() - var/evil_color = "#7D1919" - color = evil_color + color = NARSIE_WINDOW_COLOUR for(var/obj/item/weapon/shard/shard in debris) - shard.color = evil_color + shard.color = NARSIE_WINDOW_COLOUR /obj/structure/window/singularity_pull(S, current_size) if(current_size >= STAGE_FIVE) @@ -488,3 +487,6 @@ /obj/structure/window/shuttle/narsie_act() color = "#3C3434" + +/obj/structure/window/shuttle/tinted + opacity = TRUE diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 8384ac130e1..69058118212 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -1,6 +1,6 @@ /turf/closed var/thermite = 0 - + layer = CLOSED_TURF_LAYER opacity = 1 density = 1 blocks_air = 1 @@ -9,7 +9,6 @@ name = "wall" icon = 'icons/turf/walls.dmi' explosion_block = 50 - layer = TURF_LAYER + 0.05 /turf/closed/indestructible/splashscreen name = "Space Station 13" diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index acb286f3c7f..a81b33ab048 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -2,6 +2,7 @@ var/slowdown = 0 //negative for faster, positive for slower var/wet = 0 + var/wet_time = 0 // Time in seconds that this floor will be wet for. var/image/wet_overlay = null /turf/open/Initalize_Atmos(times_fired) @@ -72,7 +73,6 @@ return 0 if(C.m_intent=="walk" && (lube&NO_SLIP_WHEN_WALKING)) return 0 - C << "You slipped[ O ? " on the [O.name]" : ""]!" C.attack_log += "\[[time_stamp()]\] Slipped[O ? " on the [O.name]" : ""][(lube&SLIDE)? " (LUBE)" : ""]!" @@ -95,7 +95,8 @@ C.spin(1,1) return 1 -/turf/open/proc/MakeSlippery(wet_setting = TURF_WET_WATER) // 1 = Water, 2 = Lube, 3 = Ice +/turf/open/proc/MakeSlippery(wet_setting = TURF_WET_WATER, min_wet_time = 0, wet_time_to_add = 0) // 1 = Water, 2 = Lube, 3 = Ice + wet_time = max(wet_time+wet_time_to_add, min_wet_time) if(wet >= wet_setting) return wet = wet_setting @@ -112,32 +113,53 @@ else wet_overlay = image('icons/effects/water.dmi', src, "wet_static") overlays += wet_overlay - - if(wet < TURF_WET_ICE) - addtimer(src, "MakeDry", rand(790, 820)) + HandleWet() /turf/open/proc/MakeDry(wet_setting = TURF_WET_WATER) - if(!istype(src, /turf)) //Because turfs don't get deleted, they change, adapt, transform, evolve and deform. they are one and they are all. - return if(wet > wet_setting || !wet) return - if(wet == TURF_WET_PERMAFROST) - wet = TURF_WET_ICE - else - wet = TURF_DRY - if(wet_overlay) - overlays -= wet_overlay + spawn(rand(0,20)) + if(wet == TURF_WET_PERMAFROST) + wet = TURF_WET_ICE + else + wet = TURF_DRY + if(wet_overlay) + overlays -= wet_overlay /turf/open/proc/HandleWet() - if(!istype(src, /turf)) + if(!wet) + //It's possible for this handler to get called after all the wetness is + //cleared, so bail out if that is the case return - if(!wet || wet > TURF_WET_ICE) - return - if(air.temperature < T0C && wet != TURF_WET_ICE) + if(!wet_time && wet < TURF_WET_ICE) MakeDry(TURF_WET_ICE) - MakeSlippery(TURF_WET_ICE) - else if (wet == TURF_WET_ICE) + if(wet_time > MAXIMUM_WET_TIME) + wet_time = MAXIMUM_WET_TIME + if(wet == TURF_WET_ICE && air.temperature > T0C) MakeDry(TURF_WET_ICE) MakeSlippery(TURF_WET_WATER) - else if (air.temperature > T0C + 40) // Warm rooms will dry up rather quickly. - addtimer(src, "MakeDry", 100, 1, TURF_WET_ICE) + switch(air.temperature) + if(-INFINITY to T0C) + if(wet != TURF_WET_ICE && wet) + MakeDry(TURF_WET_ICE) + MakeSlippery(TURF_WET_ICE) + if(T0C to T20C) + wet_time = max(0, wet_time-1) + if(T20C to T0C + 40) + wet_time = max(0, wet_time-2) + if(T0C + 40 to T0C + 60) + wet_time = max(0, wet_time-3) + if(T0C + 60 to T0C + 80) + wet_time = max(0, wet_time-5) + if(T0C + 80 to T0C + 100) + wet_time = max(0, wet_time-10) + if(T0C + 100 to INFINITY) + wet_time = 0 + + if(wet && wet < TURF_WET_ICE && !wet_time) + MakeDry(TURF_WET_ICE) + if(!wet && wet_time) + wet_time = 0 + if(wet) + addtimer(src, "HandleWet", 15) + diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index afca2aebd16..7117d9592b5 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -231,7 +231,7 @@ else if (istype(thing, /mob/living)) . = 1 var/mob/living/L = thing - if("mining" in L.faction) + if("lava" in L.weather_immunities) continue if(L.buckled) if(isobj(L.buckled)) @@ -239,8 +239,8 @@ if(O.burn_state == LAVA_PROOF) continue if(isliving(L.buckled)) //Goliath riding - var/mob/living/liv = L.buckled - if("mining" in liv.faction) + var/mob/living/live = L.buckled + if("lava" in live.weather_immunities) continue L.adjustFireLoss(20) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 9551bed794f..bec463937c6 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -5,7 +5,6 @@ icon_state = "wall" var/mineral = "metal" explosion_block = 1 - layer = TURF_LAYER + 0.05 thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall @@ -223,7 +222,7 @@ O.anchored = 1 O.opacity = 1 O.density = 1 - O.layer = 5 + O.layer = FLY_LAYER playsound(src, 'sound/items/Welder.ogg', 100, 1) @@ -254,7 +253,7 @@ /turf/closed/wall/narsie_act() if(prob(20)) - ChangeTurf(/turf/closed/wall/cult) + ChangeTurf(/turf/closed/wall/mineral/cult) /turf/closed/wall/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user) return 0 diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm index 83e29d65bce..b2f520ac524 100644 --- a/code/game/turfs/simulated/walls_misc.dm +++ b/code/game/turfs/simulated/walls_misc.dm @@ -1,4 +1,4 @@ -/turf/closed/wall/cult +/turf/closed/wall/mineral/cult name = "runed metal wall" desc = "A cold metal wall engraved with indecipherable symbols. Studying them causes your head to pound." icon = 'icons/turf/walls/cult_wall.dmi' @@ -7,29 +7,29 @@ builtin_sheet = null canSmoothWith = null -/turf/closed/wall/cult/New() +/turf/closed/wall/mineral/cult/New() PoolOrNew(/obj/effect/overlay/temp/cult/turf, src) ..() -/turf/closed/wall/cult/break_wall() +/turf/closed/wall/mineral/cult/break_wall() new/obj/item/stack/sheet/runed_metal(get_turf(src), 1) return (new /obj/structure/girder/cult(src)) -/turf/closed/wall/cult/devastate_wall() +/turf/closed/wall/mineral/cult/devastate_wall() new/obj/item/stack/sheet/runed_metal(get_turf(src), 1) -/turf/closed/wall/cult/narsie_act() +/turf/closed/wall/mineral/cult/narsie_act() return -/turf/closed/wall/cult/artificer +/turf/closed/wall/mineral/cult/artificer name = "runed stone wall" desc = "A cold stone wall engraved with indecipherable symbols. Studying them causes your head to pound." -/turf/closed/wall/cult/artificer/break_wall() +/turf/closed/wall/mineral/cult/artificer/break_wall() PoolOrNew(/obj/effect/overlay/temp/cult/turf, get_turf(src)) return null //excuse me we want no runed metal here -/turf/closed/wall/cult/artificer/devastate_wall() +/turf/closed/wall/mineral/cult/artificer/devastate_wall() PoolOrNew(/obj/effect/overlay/temp/cult/turf, get_turf(src)) /turf/closed/wall/vault diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 06581872610..b6663bfa960 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -19,8 +19,11 @@ update_icon() air = space_gas -/turf/open/space/Destroy() - return QDEL_HINT_LETMELIVE +/turf/open/space/Destroy(force) + if(force) + . = ..() + else + return QDEL_HINT_LETMELIVE /turf/open/space/Initalize_Atmos(times_fired) return diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 33971447d07..0db152579cf 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -299,3 +299,22 @@ /turf/proc/add_blueprints_preround(atom/movable/AM) if(!ticker || ticker.current_state != GAME_STATE_PLAYING) add_blueprints(AM) + +/turf/proc/empty(turf_type=/turf/open/space) + // Remove all atoms except observers, landmarks, docking ports + var/turf/T0 = src + for(var/A in T0.GetAllContents()) + if(istype(A, /mob/dead)) + continue + if(istype(A, /obj/effect/landmark)) + continue + if(istype(A, /obj/docking_port)) + continue + qdel(A, force=TRUE) + + T0.ChangeTurf(turf_type) + + T0.redraw_lighting() + SSair.remove_from_active(T0) + T0.CalculateAdjacentTurfs() + SSair.add_to_active(T0,1) diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 7f192fce020..f5421143b5b 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -157,6 +157,11 @@ /mob/living/proc/canSuicide() if(stat == CONSCIOUS) + if(mental_dominator) + src << "This body's force of will is too strong! You can't break it enough to murder them." + if(mind_control_holder) + mind_control_holder << "Through tremendous force of will, you stop a suicide attempt!" + return 0 return 1 else if(stat == DEAD) src << "You're already dead!" diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB_ban/functions.dm similarity index 100% rename from code/modules/admin/DB ban/functions.dm rename to code/modules/admin/DB_ban/functions.dm diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 91c0770c04d..11c21972abb 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -56,8 +56,6 @@ var/list/admin_verbs_admin = list( /client/proc/jumptoturf, /*allows us to jump to a specific turf*/ /client/proc/admin_call_shuttle, /*allows us to call the emergency shuttle*/ /client/proc/admin_cancel_shuttle, /*allows us to cancel the emergency shuttle, sending it back to centcom*/ - /client/proc/cmd_admin_destroy_shuttle, /* Destroys the emergency shuttle, allowing us to import a new shuttle template. Or just horribly fuck with the game. */ - /client/proc/cmd_admin_import_shuttle, /* Imports a emergency shuttle from a template, and sends it to its round start location. Probably should destroy the old one first.*/ /client/proc/cmd_admin_direct_narrate, /*send text directly to a player with no padding. Useful for narratives and fluff-text*/ /client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/ /client/proc/cmd_admin_local_narrate, /*sends text to all mobs within view of atom*/ diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 220b1b4c9e9..dfc910e5aa1 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -468,6 +468,16 @@ dat += "FLW" dat += "" + if(ticker.mode.servants_of_ratvar.len) + dat += "
" + for(var/datum/mind/N in ticker.mode.servants_of_ratvar) + var/mob/M = N.current + if(M) + dat += "" + dat += "" + dat += "" + dat += "
Servants of Ratvar
[M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]PMFLW
" + if(ticker.mode.red_deities.len || ticker.mode.red_deity_prophets.len || ticker.mode.blue_deity_prophets.len || ticker.mode.red_deity_followers.len || ticker.mode.blue_deity_followers.len) dat += "
" for(var/datum/mind/N in ticker.mode.red_deities) diff --git a/code/modules/admin/verbs/shuttles.dm b/code/modules/admin/verbs/shuttles.dm deleted file mode 100644 index 2dc8e5820ee..00000000000 --- a/code/modules/admin/verbs/shuttles.dm +++ /dev/null @@ -1,116 +0,0 @@ -/proc/emergency_sanity_check() - if(SSshuttle.emergency.mode != SHUTTLE_IDLE) - var/confirm = alert(src, "Modification of the emergency shuttle while it is not idle can be highly dangerous, and may result in WEIRD UNPREDICTABLE SHIT. Are you SURE you want to continue? Obviously if you're not touching the emergency shuttle, then you're probably fine.", "Confirm", "Yes", "No") - if(confirm == "Yes") - return TRUE - else - return FALSE - else - return TRUE - -/client/proc/cmd_admin_destroy_shuttle() - set category = "Admin" - set name = "Shuttle Destroy" - - if (!holder) - src << "Only administrators may use this command." - return - - if(!emergency_sanity_check()) - return - - var/list/names = list() - var/obj/docking_port/mobile/M - for (var/atom/AM in SSshuttle.mobile) - M = AM - names += M.name - - var/selected = input("Select shuttle to DESTROY", "Shuttles") as null|anything in names - - var/decide_against_msg = "You decide against destroying a shuttle." - - if(!selected) - src << decide_against_msg - return - - var/confirm = alert(src, "Are you sure you want to destroy [selected]?", "Confirm", "Yes", "No") - - if(confirm != "Yes") - src << decide_against_msg - return - - var/destroyed = FALSE - for (var/atom/AM in SSshuttle.mobile) - M = AM - if(M.name == selected) - M.jumpToNullSpace() - destroyed = TRUE - break - - if(!destroyed) - src << "Something went wrong, the selected shuttle doesn't exist anymore." - return - - log_admin("[key_name(usr)] - ShuttleDestroy: [M]") - message_admins("[key_name_admin(usr)] has used ShuttleDestroy on [selected]
") - feedback_add_details("admin_verb","SHTDEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/proc/cmd_admin_import_shuttle() - set category = "Admin" - set name = "Shuttle Import" - - if (!holder) - src << "Only administrators may use this command." - return - - if(!emergency_sanity_check()) - return - - var/datum/map_template/template - var/map = input(usr, "Choose a Shuttle Template to import","Import Shuttle Template") as null|anything in shuttle_templates - if(!map) - return - template = shuttle_templates[map] - - if(alert(usr,"Confirm importing of [map]","Shuttle Import Confirm","Yes","No") != "Yes") - return - - var/turf/T = get_turf(locate("landmark*Shuttle Import")) - if(!T) - usr << "Shuttle import landmark not found. \ - Aborting." - template.load(T, centered = TRUE) - - var/obj/docking_port/mobile/M - - for(var/S in template.get_affected_turfs(T,centered = TRUE)) - for (var/AM in S) - if(istype(AM, /obj/docking_port/mobile)) - if(!M) - M = AM - else - usr << "More than one mobile docking port was detected ([AM]), this is a BAD THING, TELL A CODER." - if(istype(AM, /obj/docking_port/stationary)) - usr << "REEEEEEEEEEEE! THE LOADED TEMPLATE HAS [AM], A STATIONARY DOCKING PORT, THIS IS A BAD THING FIX IT. TELL A CODER. WE CAN DELETE IT BUT IT SHOULD NOT BE THERE." - var/obj/docking_port/stationary/bad = AM - bad.i_know_what_im_doing = TRUE - qdel(bad) - - if(!M) - usr << "The loaded template didn't have a mobile docking port! The template has been deleted." - for(var/S in template.get_affected_turfs(T,centered = TRUE)) - var/turf/T0 = S - for(var/atom/AM in T0.GetAllContents()) - if(istype(AM, /mob/dead)) - continue - qdel(AM) - qdel(S) - return - - var/status = M.dockRoundstart() - if(status) - message_admins("The imported shuttle [map]/[M] failed to travel to its roundstart location (error code [status]). Please fix or delete the imported shuttle before continuing any more shuttle import hijinks.") - - log_admin("[key_name(usr)] - ShuttleImport: [map] - [M]") - message_admins("[key_name_admin(usr)] has used ShuttleImport: [map] - [M]
") - feedback_add_details("admin_verb","SHTIMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm index b753875e24b..6f88e889ca2 100644 --- a/code/modules/assembly/health.dm +++ b/code/modules/assembly/health.dm @@ -91,7 +91,7 @@ var/mob/user = usr - if(!user.canUseTopic(user)) + if(!user.canUseTopic(src)) usr << browse(null, "window=hscan") onclose(usr, "hscan") return @@ -104,4 +104,4 @@ return attack_self(user) - return \ No newline at end of file + return diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index 05fdf032d0b..8f43cb52da0 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -49,7 +49,7 @@ unacidable = 1//So you can't melt fire with acid. icon = 'icons/effects/fire.dmi' icon_state = "1" - layer = TURF_LAYER + layer = ABOVE_OPEN_TURF_LAYER luminosity = 3 var/volume = 125 @@ -117,8 +117,6 @@ perform_exposure() - if(location.wet) location.wet = 0 - if(bypassing) icon_state = "3" location.burn_tile() diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index cbc9232520c..a0e9c90e029 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -192,7 +192,6 @@ if(air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION) if(consider_superconductivity(starting = 1)) remove = 0 - HandleWet() // if the tile is wet, and cold, make ice. Or if it's wet, and warm, dry it off. if(!our_excited_group && remove == 1) SSair.remove_from_active(src) diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm index 5188750f085..244f8b1cd71 100644 --- a/code/modules/atmospherics/gasmixtures/gas_types.dm +++ b/code/modules/atmospherics/gasmixtures/gas_types.dm @@ -76,7 +76,7 @@ var/list/hardcoded_gases = list("o2","n2","co2","plasma") //the main four gases, /obj/effect/overlay/gas/ icon = 'icons/effects/tile_effects.dmi' mouse_opacity = 0 - layer = 5 + layer = FLY_LAYER appearance_flags = RESET_COLOR|TILE_BOUND /obj/effect/overlay/gas/New(state) diff --git a/code/modules/atmospherics/gasmixtures/space_mixture.dm b/code/modules/atmospherics/gasmixtures/space_mixture.dm index 608974f0ce0..5134087a386 100644 --- a/code/modules/atmospherics/gasmixtures/space_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/space_mixture.dm @@ -18,7 +18,7 @@ return 0 //we're immutable. /datum/gas_mixture/space/heat_capacity() - . = 700000 + . = 7000 /datum/gas_mixture/space/heat_capacity_archived() . = heat_capacity() @@ -57,5 +57,5 @@ return 0 //we're immutable. /datum/gas_mixture/space/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity) - . = ..(sharer, 1, sharer_temperature, sharer_heat_capacity) - temperature = TCMB \ No newline at end of file + . = ..() + temperature = TCMB diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 7997c832e00..891c4bb1e5d 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -15,6 +15,7 @@ Pipelines + Other Objects -> Pipe network active_power_usage = 0 power_channel = ENVIRON on_blueprints = TRUE + layer = GAS_PIPE_LAYER //under wires var/nodealert = 0 var/can_unwrench = 0 var/initialize_directions = 0 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm index f2dfa858d17..807980318e1 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm @@ -2,7 +2,6 @@ icon = 'icons/obj/atmospherics/components/unary_devices.dmi' dir = SOUTH initialize_directions = SOUTH - layer = TURF_LAYER+0.1 device_type = UNARY /obj/machinery/atmospherics/components/unary/SetInitDirections() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 55ac2266861..06a369e647e 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -259,7 +259,7 @@ user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.") welded = 0 update_icon() - pipe_vision_img = image(src, loc, layer = 20, dir = dir) + pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) return 0 else return ..() @@ -289,7 +289,7 @@ user.visible_message("[user] furiously claws at [src]!", "You manage to clear away the stuff blocking the vent", "You hear loud scraping noises.") welded = 0 update_icon() - pipe_vision_img = image(src, loc, layer = 20, dir = dir) + pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) playsound(loc, 'sound/weapons/bladeslice.ogg', 100, 1) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index b9c727da0a6..5c60897d1dc 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -308,7 +308,7 @@ user.visible_message("[user] unwelds the scrubber.", "You unweld the scrubber.", "You hear welding.") welded = 0 update_icon() - pipe_vision_img = image(src, loc, layer = 20, dir = dir) + pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) return 0 else return ..() @@ -329,7 +329,7 @@ user.visible_message("[user] furiously claws at [src]!", "You manage to clear away the stuff blocking the scrubber.", "You hear loud scraping noises.") welded = 0 update_icon() - pipe_vision_img = image(src, loc, layer = 20, dir = dir) + pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) playsound(loc, 'sound/weapons/bladeslice.ogg', 100, 1) diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index 94898fcd009..fc412840ebe 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -3,7 +3,6 @@ var/volume = 0 level = 1 - layer = 2.4 //under wires with their 2.44 use_power = 0 can_unwrench = 1 diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 6c45742bb27..0788a8c2c27 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -79,11 +79,12 @@ if(ckey) M.ckey = ckey M << "[flavour_text]" + var/datum/mind/MM = M.mind if(objectives) - var/datum/mind/MM = M.mind for(var/objective in objectives) MM.objectives += new/datum/objective(objective) special(M) + MM.name = M.real_name if(uses > 0) uses-- if(!permanent && !uses) @@ -458,17 +459,6 @@ icon_state = "sleeper" flavour_text = "You are a Nanotrasen Commander!" -/obj/effect/mob_spawn/human/wwii - name = "World War II Reenactor" - uniform = /obj/item/clothing/under/wwii - shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/combat - mask = /obj/item/clothing/mask/gas - helmet = /obj/item/clothing/head/helmet/stahlhelm - back = /obj/item/weapon/storage/backpack/security - has_id = 0 - - /////////////////Spooky Undead////////////////////// /obj/effect/mob_spawn/human/skeleton @@ -541,4 +531,4 @@ if(despawn == "No" || !loc || !Adjacent(user)) return user.visible_message("[user.name] climbs back into cryosleep...") - qdel(user) \ No newline at end of file + qdel(user) diff --git a/code/modules/awaymissions/mission_code/challenge.dm b/code/modules/awaymissions/mission_code/challenge.dm index 724dcf434e3..75d240ec777 100644 --- a/code/modules/awaymissions/mission_code/challenge.dm +++ b/code/modules/awaymissions/mission_code/challenge.dm @@ -1,35 +1,35 @@ -//Challenge Areas - -/area/awaymission/challenge/start - name = "Where Am I?" - icon_state = "away" - -/area/awaymission/challenge/main - name = "Danger Room" - icon_state = "away1" - requires_power = 0 - -/area/awaymission/challenge/end - name = "Administration" - icon_state = "away2" - requires_power = 0 - - -/obj/machinery/power/emitter/energycannon - name = "Energy Cannon" - desc = "A heavy duty industrial laser" - icon = 'icons/obj/singularity.dmi' - icon_state = "emitter" - anchored = 1 - density = 1 - - use_power = 0 - idle_power_usage = 0 - active_power_usage = 0 - - active = 1 - locked = 1 - state = 2 - -/obj/machinery/power/emitter/energycannon/RefreshParts() - return \ No newline at end of file +//Challenge Areas + +/area/awaymission/challenge/start + name = "Where Am I?" + icon_state = "away" + +/area/awaymission/challenge/main + name = "Danger Room" + icon_state = "away1" + requires_power = 0 + +/area/awaymission/challenge/end + name = "Administration" + icon_state = "away2" + requires_power = 0 + + +/obj/machinery/power/emitter/energycannon + name = "Energy Cannon" + desc = "A heavy duty industrial laser" + icon = 'icons/obj/singularity.dmi' + icon_state = "emitter" + anchored = 1 + density = 1 + + use_power = 0 + idle_power_usage = 0 + active_power_usage = 0 + + active = 1 + locked = 1 + state = 2 + +/obj/machinery/power/emitter/energycannon/RefreshParts() + return diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index 4a744ef7100..460e53bfd1d 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -120,14 +120,10 @@ desc = "What is that thing?" density = 1 anchored = 1 - layer = 3 icon = 'icons/mob/blob.dmi' icon_state = "blobpod" var/triggered = 0 -/obj/effect/meatgrinder/New() - icon_state = "blobpod" - /obj/effect/meatgrinder/Crossed(AM as mob|obj) Bumped(AM) diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 7b655fbdeb8..075ef8b3df6 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -64,9 +64,10 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away /proc/seedRuins(z_level = 1, budget = 0, whitelist = /area/space, list/potentialRuins = space_ruins_templates) var/overall_sanity = 100 - var/ruins = potentialRuins.Copy() + world << "Loading ruins..." + while(budget > 0 && overall_sanity > 0) // Pick a ruin var/datum/map_template/ruin/ruin = ruins[pick(ruins)] @@ -77,6 +78,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away // If so, try to place it var/sanity = 100 // And if we can't fit it anywhere, give up, try again + while(sanity > 0) sanity-- var/turf/T = locate(rand(25, world.maxx - 25), rand(25, world.maxy - 25), z_level) @@ -103,6 +105,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away if(!overall_sanity) world.log << "Ruin loader gave up with [budget] left to spend." + /obj/effect/ruin_loader name = "random ruin" icon = 'icons/obj/weapons.dmi' @@ -115,13 +118,15 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away var/datum/map_template/T = potentialRuins[A] if(!T.loaded) possible_ruins += T - world << "Loading ruins..." if(!template && possible_ruins.len) template = safepick(possible_ruins) if(!template) - world << "No ruins found." - return + return FALSE + for(var/i in template.get_affected_turfs(get_turf(src), 1)) + var/turf/T = i + for(var/mob/living/simple_animal/monster in T) + qdel(monster) template.load(get_turf(src),centered = TRUE) template.loaded++ - world << "Ruins loaded." qdel(src) + return TRUE diff --git a/code/modules/client/client defines.dm b/code/modules/client/client_defines.dm similarity index 100% rename from code/modules/client/client defines.dm rename to code/modules/client/client_defines.dm diff --git a/code/modules/client/client procs.dm b/code/modules/client/client_procs.dm similarity index 100% rename from code/modules/client/client procs.dm rename to code/modules/client/client_procs.dm diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index a3856b0ee1c..3054e6a18e1 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -183,7 +183,7 @@ BLIND // can't see anything permeability_coefficient = null flags &= ~visor_flags flags_inv &= ~visor_flags_inv - flags_cover &= 0 + flags_cover = 0 if(adjusted_flags) slot_flags = adjusted_flags user.wear_mask_update(src, toggle_off = mask_adjusted) @@ -460,11 +460,9 @@ BLIND // can't see anything /obj/item/clothing/under/AltClick(mob/user) ..() - if(!user.canUseTopic(user)) + if(!user.canUseTopic(src, be_close=TRUE)) user << "You can't do that right now!" return - if(!in_range(src, user)) - return else rolldown() diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 24a18a98808..157c2254b3d 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -260,37 +260,4 @@ name = "paper sack hat" desc = "A paper sack with crude holes cut out for eyes and a sketchy smile drawn on the front. Not creepy at all." icon_state = "papersack_smile" - flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS - -/* --!WARNING!- --POTENTIAL TRIGGER-INDUCING ITEMS AHEAD- --TREAD WITH CAUTION- -*/ - -/obj/item/clothing/head/helmet/stahlhelm - name = "stahlhelm" - desc = "A hard military helmet, seems dusty." - icon_state = "stalhelm" - item_state = "stalhelm" - armor = list(melee = 15, bullet = 10, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - strip_delay = 30 - -/obj/item/clothing/head/helmet/panzer - name = "Panzer Cap" - desc = "A fancy-looking military cap." - icon_state = "panzercap" - item_state = "panzercap" - -/obj/item/clothing/head/helmet/naziofficer - name = "Officer Cap" - desc = "A cap fit for a commanding officer." - icon_state = "officercap" - item_state = "officercap" - armor = list(melee = 20, bullet = 15, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - strip_delay = 60 - -/* --YOU HAVE SAFETLY PASSED THE POTENTIALLY-TRIGGERING CONTENT- --PLEASE RESUME NORMAL, POLITICALLY CORRECT ACTIVITY- -*/ \ No newline at end of file + flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS \ No newline at end of file diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index d66fef73c9b..1ce016c73fe 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -23,11 +23,9 @@ /obj/item/clothing/head/soft/AltClick(mob/user) ..() - if(!user.canUseTopic(user)) + if(!user.canUseTopic(src, be_close=TRUE)) user << "You can't do that right now!" return - if(!in_range(src, user)) - return else flip(user) diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 2ac22361d26..8b82ff05ae2 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -18,11 +18,9 @@ /obj/item/clothing/mask/breath/AltClick(mob/user) ..() - if(!user.canUseTopic(user)) + if(!user.canUseTopic(src, be_close=TRUE)) user << "You can't do that right now!" return - if(!in_range(src, user)) - return else adjustmask(user) diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 7209b40e937..d7254471867 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -124,7 +124,8 @@ /obj/item/weapon/melee/baton/loaded=1,\ /obj/item/clothing/mask/gas/sechailer/swat=1,\ /obj/item/weapon/gun/energy/pulse/pistol/loyalpin=1,\ - /obj/item/weapon/reagent_containers/hypospray/combat/nanites=1) + /obj/item/weapon/reagent_containers/hypospray/combat/nanites=1,\ + /obj/item/weapon/gun/medbeam=1) /datum/outfit/ert/engineer name = "ERT Engineer" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 9a39b5e07aa..b021a20ba6f 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -62,6 +62,7 @@ var/turf/open/t_loc = get_turf(src) if(istype(t_loc) && t_loc.wet) t_loc.MakeDry(TURF_WET_WATER) + t_loc.wet_time = 0 /obj/item/clothing/shoes/clown_shoes desc = "The prankster's standard-issue clowning shoes. Damn, they're huge!" diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index b91ac8ab04f..53e4b59866d 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -62,21 +62,22 @@ armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 10, rad = 10) /obj/item/clothing/suit/hooded/cloak/drake - name = "ash drake hide cloak" - icon_state = "golclo" - desc = "A cloak fashioned from the hide of an ash drake, offers incredible defense while still remaining lightweight. " + name = "drake armour" + icon_state = "dragon" + desc = "A suit of armour fashioned from the remains of an ash drake. " allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator, /obj/item/weapon/pickaxe, /obj/item/weapon/twohanded/spear) armor = list(melee = 70, bullet = 30, laser = 50, energy = 40, bomb = 70, bio = 60, rad = 50) hooded = 1 hoodtype = /obj/item/clothing/head/cloakhood/drake heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT unacidable = 1 /obj/item/clothing/head/cloakhood/drake - name = "ash drake hide hood" - icon_state = "golhood" - desc = "A stiff hood made of ash drake hide." + name = "drake helm" + icon_state = "dragon" + desc = "The skull of a dragon." armor = list(melee = 70, bullet = 30, laser = 50, energy = 40, bomb = 70, bio = 60, rad = 50) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 5f7b4386db7..35049b25351 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -70,11 +70,9 @@ /obj/item/clothing/suit/toggle/AltClick(mob/user) ..() - if(!user.canUseTopic(user)) + if(!user.canUseTopic(src, be_close=TRUE)) user << "You can't do that right now!" return - if(!in_range(src, user)) - return else suit_toggle(user) diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 6f7f9224e6e..cc8f789e3cd 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -12,23 +12,33 @@ /obj/item/clothing/under/rank/security name = "security jumpsuit" desc = "A tactical security jumpsuit for officers complete with nanotrasen belt buckle." - icon_state = "security" - item_state = "gy_suit" - item_color = "security" + icon_state = "rsecurity" + item_state = "r_suit" + item_color = "rsecurity" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) strip_delay = 50 alt_covers_chest = 1 +/obj/item/clothing/under/rank/security/grey + icon_state = "security" + item_state = "gy_suit" + item_color = "security" + /obj/item/clothing/under/rank/warden name = "security suit" desc = "A formal security suit for officers complete with nanotrasen belt buckle." - icon_state = "warden" - item_state = "gy_suit" - item_color = "warden" + icon_state = "rwarden" + item_state = "r_suit" + item_color = "rwarden" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) strip_delay = 50 alt_covers_chest = 1 +/obj/item/clothing/under/rank/warden/grey + icon_state = "warden" + item_state = "gy_suit" + item_color = "warden" + /* * Detective */ @@ -56,13 +66,18 @@ /obj/item/clothing/under/rank/head_of_security name = "head of security's jumpsuit" desc = "A security jumpsuit decorated for those few with the dedication to achieve the position of Head of Security." - icon_state = "hos" - item_state = "gy_suit" - item_color = "hos" + icon_state = "rhos" + item_state = "r_suit" + item_color = "rhos" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) strip_delay = 60 alt_covers_chest = 1 +/obj/item/clothing/under/rank/head_of_security/grey + icon_state = "hos" + item_state = "gy_suit" + item_color = "hos" + /obj/item/clothing/under/rank/head_of_security/alt name = "head of security's turtleneck" desc = "A stylish alternative to the normal head of security jumpsuit, complete with tactical pants." diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index a63fd72439e..5c660d23388 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -573,33 +573,3 @@ icon_state = "hostanclothes" item_state = "hostanclothes" item_color = "hostanclothes" - -/* --!WARNING!- --POTENTIAL TRIGGER-INDUCING ITEMS AHEAD- --TREAD WITH CAUTION- -*/ - -/obj/item/clothing/under/wwii - name = "dusty uniform" - desc = "A dusty old uniform, a relic from a time before." - icon_state = "soldieruniform" - item_state = "soldieruniform" - item_color = "soldieruniform" - armor = list(melee = 10, bullet = 5, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - strip_delay = 50 - - -/obj/item/clothing/under/wwii/officer - name = "dusty uniform" - desc = "A dusty old uniform, a relic from a time before. This one looks more official." - icon_state = "officeruniform" - item_state = "officeruniform" - item_color = "officeruniform" - armor = list(melee = 15, bullet = 10, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - strip_delay = 60 - -/* --YOU HAVE SAFETLY PASSED THE POTENTIALLY-TRIGGERING CONTENT- --PLEASE RESUME NORMAL, POLITICALLY CORRECT ACTIVITY- -*/ diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm index bfb574706cc..19b3ac4abfa 100644 --- a/code/modules/events/anomaly_bluespace.dm +++ b/code/modules/events/anomaly_bluespace.dm @@ -65,7 +65,7 @@ blueeffect.screen_loc = "WEST,SOUTH to EAST,NORTH" blueeffect.icon = 'icons/effects/effects.dmi' blueeffect.icon_state = "shieldsparkles" - blueeffect.layer = 17 + blueeffect.layer = FLASH_LAYER blueeffect.mouse_opacity = 0 M.client.screen += blueeffect sleep(20) diff --git a/code/modules/events/operative.dm b/code/modules/events/operative.dm index 13615544aaf..afdd178ac40 100644 --- a/code/modules/events/operative.dm +++ b/code/modules/events/operative.dm @@ -9,7 +9,7 @@ role_name = "lone operative" /datum/round_event/ghost_role/operative/spawn_role() - var/list/candidates = get_candidates("operative", 3000, ROLE_OPERATIVE) + var/list/candidates = get_candidates("operative", null, ROLE_OPERATIVE) if(!candidates.len) return NOT_ENOUGH_PLAYERS diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 793f267c948..23e4ee960d3 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -327,8 +327,7 @@ /datum/spacevine_mutation/flowering/on_grow(obj/effect/spacevine/holder) if(holder.energy == 2 && prob(severity) && !locate(/obj/structure/alien/resin/flower_bud_enemy) in range(5,holder)) - var/obj/structure/alien/resin/flower_bud_enemy/FBE = new /obj/structure/alien/resin/flower_bud_enemy (get_turf(holder)) - FBE.layer = holder.layer+0.1 + new/obj/structure/alien/resin/flower_bud_enemy(get_turf(holder)) /datum/spacevine_mutation/flowering/on_cross(obj/effect/spacevine/holder, mob/living/crosser) @@ -344,7 +343,7 @@ icon_state = "Light1" anchored = 1 density = 0 - layer = MOB_LAYER + 0.8 + layer = SPACEVINE_LAYER mouse_opacity = 2 //Clicking anywhere on the turf is good enough pass_flags = PASSTABLE | PASSGRILLE var/energy = 0 @@ -532,7 +531,6 @@ src.icon_state = pick("Med1", "Med2", "Med3") energy = 1 SetOpacity(1) - layer = 5 else src.icon_state = pick("Hvy1", "Hvy2", "Hvy3") energy = 2 diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm index b301049eaf4..f472cfe6796 100644 --- a/code/modules/events/wizard/greentext.dm +++ b/code/modules/events/wizard/greentext.dm @@ -29,6 +29,7 @@ var/mob/living/new_holder var/list/color_altered_mobs = list() burn_state = FIRE_PROOF + var/quiet = FALSE /obj/item/weapon/greentext/New() ..() @@ -76,9 +77,11 @@ last_holder.color = "#FF0000" last_holder = new_holder //long live the king -/obj/item/weapon/greentext/Destroy() - if(burn_state != ON_FIRE) +/obj/item/weapon/greentext/Destroy(force) + if((burn_state != ON_FIRE) && (!force)) return QDEL_HINT_LETMELIVE + + . = ..() poi_list.Remove(src) for(var/mob/M in mob_list) var/message = "A dark temptation has passed from this world" @@ -86,5 +89,9 @@ message += " and you're finally able to forgive yourself" M.color = initial(M.color) message += "..." - M << message - return ..() + // can't skip the mob check as it also does the decolouring + if(!quiet) + M << message + +/obj/item/weapon/greentext/quiet + quiet = TRUE diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 9eca1592029..46998855692 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -227,7 +227,7 @@ Gunshots/explosions/opening doors/less rare audio (done) /obj/effect/hallucination/simple/singularity image_icon = 'icons/effects/224x224.dmi' image_state = "singularity_s7" - image_layer = 6 + image_layer = MASSIVE_OBJ_LAYER px = -96 py = -96 @@ -635,7 +635,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite if(!H.r_store) slots_free += ui_storage2 if(slots_free.len) halitem.screen_loc = pick(slots_free) - halitem.layer = 50 + halitem.layer = ABOVE_HUD_LAYER switch(rand(1,6)) if(1) //revolver halitem.icon = 'icons/obj/guns/projectile.dmi' diff --git a/code/modules/food&drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm similarity index 100% rename from code/modules/food&drinks/drinks/drinks.dm rename to code/modules/food_and_drinks/drinks/drinks.dm diff --git a/code/modules/food&drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm similarity index 99% rename from code/modules/food&drinks/drinks/drinks/bottle.dm rename to code/modules/food_and_drinks/drinks/drinks/bottle.dm index 852c8ed9108..7a61fd5f981 100644 --- a/code/modules/food&drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -203,7 +203,7 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater/hell desc = "A flask of holy water...it's been sitting in the Necropolis a while though." - list_reagents = list("hellwater" = 100) + list_reagents = list("hell_water" = 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth name = "Goldeneye Vermouth" diff --git a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm similarity index 100% rename from code/modules/food&drinks/drinks/drinks/drinkingglass.dm rename to code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm diff --git a/code/modules/food&drinks/food.dm b/code/modules/food_and_drinks/food.dm similarity index 100% rename from code/modules/food&drinks/food.dm rename to code/modules/food_and_drinks/food.dm diff --git a/code/modules/food&drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm similarity index 100% rename from code/modules/food&drinks/food/condiment.dm rename to code/modules/food_and_drinks/food/condiment.dm diff --git a/code/modules/food&drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm similarity index 100% rename from code/modules/food&drinks/food/customizables.dm rename to code/modules/food_and_drinks/food/customizables.dm diff --git a/code/modules/food&drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm similarity index 100% rename from code/modules/food&drinks/food/snacks.dm rename to code/modules/food_and_drinks/food/snacks.dm diff --git a/code/modules/food&drinks/food/snacks/dough.dm b/code/modules/food_and_drinks/food/snacks/dough.dm similarity index 100% rename from code/modules/food&drinks/food/snacks/dough.dm rename to code/modules/food_and_drinks/food/snacks/dough.dm diff --git a/code/modules/food&drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm similarity index 97% rename from code/modules/food&drinks/food/snacks/meat.dm rename to code/modules/food_and_drinks/food/snacks/meat.dm index 6564bd05163..0d8cee8dff4 100644 --- a/code/modules/food&drinks/food/snacks/meat.dm +++ b/code/modules/food_and_drinks/food/snacks/meat.dm @@ -31,7 +31,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human - name = "-meat" + name = " meat" cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain/human slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain/human @@ -56,19 +56,19 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/slime icon_state = "slimemeat" - desc = "Because jello wasn't offensive enough to vegans" + desc = "Because jello wasn't offensive enough to vegans." list_reagents = list("nutriment" = 3, "slimejelly" = 3) filling_color = "#00FFFF" /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem icon_state = "golemmeat" - desc = "Edible rocks, welcome to the future" + desc = "Edible rocks, welcome to the future." list_reagents = list("nutriment" = 3, "iron" = 3) filling_color = "#A9A9A9" /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem/adamantine icon_state = "agolemmeat" - desc = "From the slime pen to the rune to the kitchen, science" + desc = "From the slime pen to the rune to the kitchen, science." filling_color = "#66CDAA" /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/lizard @@ -78,7 +78,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/plant icon_state = "plantmeat" - desc = "All the joys of healthy eating with all the fun of cannibalism" + desc = "All the joys of healthy eating with all the fun of cannibalism." filling_color = "#E9967A" /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/shadow @@ -88,18 +88,18 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/fly icon_state = "flymeat" - desc = "Nothing says tasty like maggot filled radioactive mutant flesh" + desc = "Nothing says tasty like maggot filled radioactive mutant flesh." list_reagents = list("nutriment" = 3, "uranium" = 3) /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton name = "-bone" icon_state = "skeletonmeat" - desc = "There's a point where this needs to stop and clearly we have passed it" + desc = "There's a point where this needs to stop, and clearly we have passed it." filling_color = "#F0F0F0" slice_path = null //can't slice a bone into cutlets /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie - name = "-meat (rotten)" + name = " meat (rotten)" icon_state = "lizardmeat" //Close enough. desc = "Halfway to becoming fertilizer for your garden." filling_color = "#6B8E23" diff --git a/code/modules/food&drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm similarity index 100% rename from code/modules/food&drinks/food/snacks_bread.dm rename to code/modules/food_and_drinks/food/snacks_bread.dm diff --git a/code/modules/food&drinks/food/snacks_burgers.dm b/code/modules/food_and_drinks/food/snacks_burgers.dm similarity index 100% rename from code/modules/food&drinks/food/snacks_burgers.dm rename to code/modules/food_and_drinks/food/snacks_burgers.dm diff --git a/code/modules/food&drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm similarity index 100% rename from code/modules/food&drinks/food/snacks_cake.dm rename to code/modules/food_and_drinks/food/snacks_cake.dm diff --git a/code/modules/food&drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm similarity index 100% rename from code/modules/food&drinks/food/snacks_egg.dm rename to code/modules/food_and_drinks/food/snacks_egg.dm diff --git a/code/modules/food&drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm similarity index 92% rename from code/modules/food&drinks/food/snacks_meat.dm rename to code/modules/food_and_drinks/food/snacks_meat.dm index 79cc725e8a8..7564deda448 100644 --- a/code/modules/food&drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -124,6 +124,21 @@ desc = "Severed lizard tail on a stick." bonus_reagents = list("nutriment" = 1, "vitamin" = 4) +/obj/item/weapon/reagent_containers/food/snacks/rawkhinkali + name = "raw khinkali" + desc = "One hundred khinkalis? Do I look like a pig?" + icon_state = "khinkali" + list_reagents = list("nutriment" = 1, "vitamin" = 1) + cooked_type = /obj/item/weapon/reagent_containers/food/snacks/khinkali + +/obj/item/weapon/reagent_containers/food/snacks/khinkali + name = "khinkali" + desc = "One hundred khinkalis? Do I look like a pig?" + icon_state = "khinkali" + list_reagents = list("nutriment" = 4, "vitamin" = 2) + bitesize = 3 + filling_color = "#F0F0F0" + /obj/item/weapon/reagent_containers/food/snacks/monkeycube name = "monkey cube" desc = "Just add water!" diff --git a/code/modules/food&drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm similarity index 100% rename from code/modules/food&drinks/food/snacks_other.dm rename to code/modules/food_and_drinks/food/snacks_other.dm diff --git a/code/modules/food&drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm similarity index 97% rename from code/modules/food&drinks/food/snacks_pastry.dm rename to code/modules/food_and_drinks/food/snacks_pastry.dm index 1e5362a5b54..8036dcdf3ea 100644 --- a/code/modules/food&drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -219,6 +219,14 @@ list_reagents = list("nutriment" = 6, "vitamin" = 2) filling_color = "#8B0000" +/obj/item/weapon/reagent_containers/food/snacks/khachapuri + name = "khachapuri" + desc = "Bread with egg and cheese?" + icon_state = "khachapuri" + list_reagents = list("nutriment" = 12, "vitamin" = 2) + filling_color = "#FFFF4D" + + /obj/item/weapon/reagent_containers/food/snacks/sugarcookie name = "sugar cookie" desc = "Just like your little sister used to make." diff --git a/code/modules/food&drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm similarity index 100% rename from code/modules/food&drinks/food/snacks_pie.dm rename to code/modules/food_and_drinks/food/snacks_pie.dm diff --git a/code/modules/food&drinks/food/snacks_pizza.dm b/code/modules/food_and_drinks/food/snacks_pizza.dm similarity index 100% rename from code/modules/food&drinks/food/snacks_pizza.dm rename to code/modules/food_and_drinks/food/snacks_pizza.dm diff --git a/code/modules/food&drinks/food/snacks_salad.dm b/code/modules/food_and_drinks/food/snacks_salad.dm similarity index 100% rename from code/modules/food&drinks/food/snacks_salad.dm rename to code/modules/food_and_drinks/food/snacks_salad.dm diff --git a/code/modules/food&drinks/food/snacks_sandwichtoast.dm b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm similarity index 100% rename from code/modules/food&drinks/food/snacks_sandwichtoast.dm rename to code/modules/food_and_drinks/food/snacks_sandwichtoast.dm diff --git a/code/modules/food&drinks/food/snacks_soup.dm b/code/modules/food_and_drinks/food/snacks_soup.dm similarity index 100% rename from code/modules/food&drinks/food/snacks_soup.dm rename to code/modules/food_and_drinks/food/snacks_soup.dm diff --git a/code/modules/food&drinks/food/snacks_spaghetti.dm b/code/modules/food_and_drinks/food/snacks_spaghetti.dm similarity index 100% rename from code/modules/food&drinks/food/snacks_spaghetti.dm rename to code/modules/food_and_drinks/food/snacks_spaghetti.dm diff --git a/code/modules/food&drinks/food/snacks_vend.dm b/code/modules/food_and_drinks/food/snacks_vend.dm similarity index 100% rename from code/modules/food&drinks/food/snacks_vend.dm rename to code/modules/food_and_drinks/food/snacks_vend.dm diff --git a/code/modules/food&drinks/kitchen machinery/food_cart.dm b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm similarity index 98% rename from code/modules/food&drinks/kitchen machinery/food_cart.dm rename to code/modules/food_and_drinks/kitchen_machinery/food_cart.dm index 2e17639cd25..6ce7a8b1790 100644 --- a/code/modules/food&drinks/kitchen machinery/food_cart.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm @@ -15,12 +15,13 @@ var/portion = 10 var/selected_drink var/list/stored_food = list() - flags = OPENCONTAINER | NOREACT + flags = OPENCONTAINER var/obj/item/weapon/reagent_containers/mixer /obj/machinery/food_cart/New() ..() create_reagents(LIQUID_CAPACIY) + reagents.set_reacting(FALSE) mixer = new /obj/item/weapon/reagent_containers(src, MIXER_CAPACITY) mixer.name = "Mixer" @@ -151,4 +152,4 @@ #undef STORAGE_CAPACITY #undef LIQUID_CAPACIY -#undef MIXER_CAPACITY \ No newline at end of file +#undef MIXER_CAPACITY diff --git a/code/modules/food&drinks/kitchen machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm similarity index 90% rename from code/modules/food&drinks/kitchen machinery/gibber.dm rename to code/modules/food_and_drinks/kitchen_machinery/gibber.dm index b31d4f68e18..6c01a8aa161 100644 --- a/code/modules/food&drinks/kitchen machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -95,16 +95,13 @@ if(operating) user << "It's locked and running." return - else - src.startgibbing(user) -/obj/machinery/gibber/attackby(obj/item/P, mob/user, params) - if(istype(P, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = P - if(!iscarbon(G.affecting)) + if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + var/mob/living/L = user.pulling + if(!iscarbon(L)) user << "This item is not suitable for the gibber!" return - var/mob/living/carbon/C = G.affecting + var/mob/living/carbon/C = L if(C.buckled ||C.buckled_mobs.len) user << "[C] is attached to something!" return @@ -112,17 +109,19 @@ user << "Subject may not have abiotic items on." return - user.visible_message("[user] starts to put [G.affecting] into the gibber!") + user.visible_message("[user] starts to put [C] into the gibber!") src.add_fingerprint(user) - if(do_after(user, gibtime, target = src) && G && G.affecting && G.affecting == C && !C.buckled && !C.buckled_mobs.len && !occupant) - user.visible_message("[user] stuffs [G.affecting] into the gibber!") - C.reset_perspective(src) - C.loc = src - occupant = C - qdel(G) - update_icon() + if(do_after(user, gibtime, target = src)) + if(C && user.pulling == C && !C.buckled && !C.buckled_mobs.len && !occupant) + user.visible_message("[user] stuffs [C] into the gibber!") + C.forceMove(src) + occupant = C + update_icon() + else + startgibbing(user) - else if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", P)) +/obj/machinery/gibber/attackby(obj/item/P, mob/user, params) + if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", P)) return else if(exchange_parts(user, P)) @@ -204,7 +203,7 @@ for (var/i=1 to meat_produced) var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/newmeat = new typeofmeat var/obj/item/stack/sheet/animalhide/newskin = new typeofskin - newmeat.name = sourcename + newmeat.name + newmeat.name = "[sourcename] [newmeat.name]" newmeat.subjectname = sourcename if(sourcejob) newmeat.subjectjob = sourcejob diff --git a/code/modules/food&drinks/kitchen machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm similarity index 98% rename from code/modules/food&drinks/kitchen machinery/icecream_vat.dm rename to code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index 85c904ec981..48dfb294839 100644 --- a/code/modules/food&drinks/kitchen machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -13,11 +13,11 @@ density = 1 anchored = 0 use_power = 0 + layer = BELOW_OBJ_LAYER var/list/product_types = list() var/dispense_flavour = ICECREAM_VANILLA var/flavour_name = "vanilla" - flags = OPENCONTAINER | NOREACT - reagents = new() + flags = OPENCONTAINER /obj/machinery/icecream_vat/proc/get_ingredient_list(type) switch(type) @@ -55,7 +55,8 @@ ..() while(product_types.len < 6) product_types.Add(5) - reagents.my_atom = src + create_reagents() + reagents.set_reacting(FALSE) reagents.add_reagent("milk", 5) reagents.add_reagent("flour", 5) reagents.add_reagent("sugar", 5) @@ -180,7 +181,6 @@ desc = "Delicious waffle cone, but no ice cream." icon = 'icons/obj/kitchen.dmi' icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time - layer = 3.1 var/ice_creamed = 0 var/cone_type bitesize = 3 diff --git a/code/modules/food&drinks/kitchen machinery/juicer.dm b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm similarity index 99% rename from code/modules/food&drinks/kitchen machinery/juicer.dm rename to code/modules/food_and_drinks/kitchen_machinery/juicer.dm index 82f3ba80eb5..19c3112b320 100644 --- a/code/modules/food&drinks/kitchen machinery/juicer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm @@ -3,7 +3,7 @@ name = "juicer" icon = 'icons/obj/kitchen.dmi' icon_state = "juicer1" - layer = 2.9 + layer = BELOW_OBJ_LAYER density = 1 anchored = 0 use_power = 1 diff --git a/code/modules/food&drinks/kitchen machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm similarity index 99% rename from code/modules/food&drinks/kitchen machinery/microwave.dm rename to code/modules/food_and_drinks/kitchen_machinery/microwave.dm index 5e8171bf0dd..06ca4bd94b4 100644 --- a/code/modules/food&drinks/kitchen machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -3,7 +3,7 @@ desc = "Cooks and boils stuff." icon = 'icons/obj/kitchen.dmi' icon_state = "mw" - layer = 2.9 + layer = BELOW_OBJ_LAYER density = 1 anchored = 1 use_power = 1 diff --git a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm similarity index 90% rename from code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm rename to code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm index a446c16d444..6b2c96d505d 100644 --- a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm @@ -3,7 +3,7 @@ desc = "A machine used for recycling dead monkeys into monkey cubes. It currently produces 1 cube for every 5 monkeys inserted." // except it literally never does icon = 'icons/obj/kitchen.dmi' icon_state = "grinder" - layer = 2.9 + layer = BELOW_OBJ_LAYER density = 1 anchored = 1 use_power = 1 @@ -57,18 +57,6 @@ if(stat) //NOPOWER etc return - if(istype(O, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = O - if(!user.Adjacent(G.affecting)) - return - var/grabbed = G.affecting - if(ismonkey(grabbed)) - var/mob/living/carbon/monkey/target = grabbed - stuff_monkey_in(target, user) - user.drop_item() - return - else - user << "The machine only accepts monkeys!" else return ..() diff --git a/code/modules/food&drinks/kitchen machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm similarity index 94% rename from code/modules/food&drinks/kitchen machinery/processor.dm rename to code/modules/food_and_drinks/kitchen_machinery/processor.dm index f0c41e5f082..96d32d3902b 100644 --- a/code/modules/food&drinks/kitchen machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -4,7 +4,7 @@ desc = "An industrial grinder used to process meat and other foods. Keep hands clear of intake area while operating." icon = 'icons/obj/kitchen.dmi' icon_state = "processor" - layer = 2.9 + layer = BELOW_OBJ_LAYER density = 1 anchored = 1 var/broken = 0 @@ -182,22 +182,12 @@ if(default_deconstruction_crowbar(O)) return - var/atom/movable/what = O - if(istype(O, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = O - if(!user.Adjacent(G.affecting)) - return - if(G.affecting.buckled || G.affecting.buckled_mobs.len) - user << "[G.affecting] is attached to somthing!" - return - what = G.affecting - - var/datum/food_processor_process/P = select_recipe(what) + var/datum/food_processor_process/P = select_recipe(O) if(P) - user.visible_message("[user] put [what] into [src].", \ - "You put the [what] into [src].") + user.visible_message("[user] put [O] into [src].", \ + "You put the [O] into [src].") user.drop_item() - what.loc = src + O.loc = src return 1 else if(user.a_intent != "harm") diff --git a/code/modules/food&drinks/kitchen machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm similarity index 93% rename from code/modules/food&drinks/kitchen machinery/smartfridge.dm rename to code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index ca7dfd00041..afa3d9cead9 100644 --- a/code/modules/food&drinks/kitchen machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -6,19 +6,21 @@ desc = "Keeps cold things cold and hot things cold." icon = 'icons/obj/vending.dmi' icon_state = "smartfridge" - layer = 2.9 + layer = BELOW_OBJ_LAYER density = 1 anchored = 1 use_power = 1 idle_power_usage = 5 active_power_usage = 100 - flags = NOREACT var/max_n_of_items = 1500 var/icon_on = "smartfridge" var/icon_off = "smartfridge-off" /obj/machinery/smartfridge/New() ..() + create_reagents() + reagents.set_reacting(FALSE) + var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/smartfridge(null) B.apply_default_parts(src) @@ -360,8 +362,11 @@ /obj/machinery/smartfridge/chemistry name = "smart chemical storage" desc = "A refrigerated storage unit for medicine storage." - var/list/spawn_meds = list(/obj/item/weapon/reagent_containers/pill/epinephrine = 12,/obj/item/weapon/reagent_containers/pill/charcoal = 1, - /obj/item/weapon/reagent_containers/glass/bottle/epinephrine = 1, /obj/item/weapon/reagent_containers/glass/bottle/charcoal = 1) + var/list/spawn_meds = list( + /obj/item/weapon/reagent_containers/pill/epinephrine = 12, + /obj/item/weapon/reagent_containers/pill/charcoal = 1, + /obj/item/weapon/reagent_containers/glass/bottle/epinephrine = 1, + /obj/item/weapon/reagent_containers/glass/bottle/charcoal = 1) /obj/machinery/smartfridge/chemistry/New() ..() @@ -397,4 +402,10 @@ /obj/machinery/smartfridge/chemistry/virology name = "smart virus storage" desc = "A refrigerated storage unit for volatile sample storage." - spawn_meds = list(/obj/item/weapon/reagent_containers/syringe/antiviral = 4, /obj/item/weapon/reagent_containers/glass/bottle/cold = 1, /obj/item/weapon/reagent_containers/glass/bottle/flu_virion = 1, /obj/item/weapon/reagent_containers/glass/bottle/mutagen = 1, /obj/item/weapon/reagent_containers/glass/bottle/plasma = 1, /obj/item/weapon/reagent_containers/glass/bottle/synaptizine = 1) \ No newline at end of file + spawn_meds = list( + /obj/item/weapon/reagent_containers/syringe/antiviral = 4, + /obj/item/weapon/reagent_containers/glass/bottle/cold = 1, + /obj/item/weapon/reagent_containers/glass/bottle/flu_virion = 1, + /obj/item/weapon/reagent_containers/glass/bottle/mutagen = 1, + /obj/item/weapon/reagent_containers/glass/bottle/plasma = 1, + /obj/item/weapon/reagent_containers/glass/bottle/synaptizine = 1) diff --git a/code/modules/food&drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm similarity index 100% rename from code/modules/food&drinks/pizzabox.dm rename to code/modules/food_and_drinks/pizzabox.dm diff --git a/code/modules/food&drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm similarity index 100% rename from code/modules/food&drinks/recipes/drinks_recipes.dm rename to code/modules/food_and_drinks/recipes/drinks_recipes.dm diff --git a/code/modules/food&drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm similarity index 100% rename from code/modules/food&drinks/recipes/food_mixtures.dm rename to code/modules/food_and_drinks/recipes/food_mixtures.dm diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm similarity index 100% rename from code/modules/food&drinks/recipes/tablecraft/recipes_bread.dm rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm similarity index 100% rename from code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm similarity index 100% rename from code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_egg.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm similarity index 100% rename from code/modules/food&drinks/recipes/tablecraft/recipes_egg.dm rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm similarity index 94% rename from code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm index f20b5ae37d7..f0432c80282 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm @@ -152,3 +152,11 @@ result = /obj/item/weapon/reagent_containers/food/snacks/nugget category = CAT_FOOD +/datum/crafting_recipe/food/rawkhinkali + name = "Raw Khinkali" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/doughslice = 1, + /obj/item/weapon/reagent_containers/food/snacks/faggot = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/rawkhinkali + category = CAT_FOOD diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm similarity index 100% rename from code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm similarity index 96% rename from code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm index 850eb46b620..b0313fc0b27 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm @@ -170,6 +170,16 @@ result = /obj/item/weapon/reagent_containers/food/snacks/meatbun category = CAT_FOOD +/datum/crafting_recipe/food/khachapuri + name = "Khachapuri" + reqs = list( + /datum/reagent/consumable/eggyolk = 5, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1, + /obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/khachapuri + category = CAT_FOOD + /datum/crafting_recipe/food/sugarcookie time = 15 name = "Sugar cookie" diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm similarity index 100% rename from code/modules/food&drinks/recipes/tablecraft/recipes_pie.dm rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pizza.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm similarity index 100% rename from code/modules/food&drinks/recipes/tablecraft/recipes_pizza.dm rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_salad.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm similarity index 100% rename from code/modules/food&drinks/recipes/tablecraft/recipes_salad.dm rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm similarity index 100% rename from code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_soup.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm similarity index 100% rename from code/modules/food&drinks/recipes/tablecraft/recipes_soup.dm rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_spaghetti.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm similarity index 100% rename from code/modules/food&drinks/recipes/tablecraft/recipes_spaghetti.dm rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index d233ea1362c..baf31192aa7 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -81,7 +81,7 @@ countEggs() /obj/item/weapon/storage/bag/easterbasket/handle_item_insertion(obj/item/I, prevent_warning = 0) - ..() + . = ..() countEggs() //Bunny Suit diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index dc710200724..18e378d9e5a 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -82,7 +82,7 @@ M.apply_damage(10, STAMINA) if(prob(5)) M.Weaken(3) - visible_message("[M] is knocked right off \his feet!", 3) + visible_message("[M] is knocked right off \his feet!") // // Structures @@ -97,20 +97,22 @@ density = 1 /obj/structure/holohoop/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) - var/obj/item/weapon/grab/G = W - if(G.state < GRAB_AGGRESSIVE) + if(get_dist(src,user)<2) + if(user.drop_item(src)) + visible_message(" [user] dunks [W] into \the [src]!") + +/obj/structure/holohoop/attack_hand(mob/user) + if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + var/mob/living/L = user.pulling + if(user.grab_state < GRAB_AGGRESSIVE) user << "You need a better grip to do that!" return - G.affecting.loc = src.loc - G.affecting.Weaken(5) - visible_message("[G.assailant] dunks [G.affecting] into \the [src]!", 3) - qdel(W) - return - else if (istype(W, /obj/item) && get_dist(src,user)<2) - user.drop_item(src) - visible_message(" [user] dunks [W] into \the [src]!", 3) - return + L.loc = src.loc + L.Weaken(5) + visible_message("[user] dunks [L] into \the [src]!") + user.stop_pulling() + else + ..() /obj/structure/holohoop/CanPass(atom/movable/mover, turf/target, height=0) if (istype(mover,/obj/item) && mover.throwing) @@ -119,12 +121,12 @@ return if(prob(50)) I.loc = src.loc - visible_message(" Swish! \the [I] lands in \the [src].", 3) + visible_message(" Swish! \the [I] lands in \the [src].") else - visible_message(" \the [I] bounces off of \the [src]'s rim!", 3) + visible_message(" \the [I] bounces off of \the [src]'s rim!") return 0 else - return ..(mover, target, height) + return ..() diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index ce238c7eaa1..0161097ef48 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -278,7 +278,7 @@ else var/t_growthstate = min(round((age / myseed.maturation) * myseed.growthstages), myseed.growthstages) I = image('icons/obj/hydroponics/growing.dmi', icon_state = "[myseed.icon_grow][t_growthstate]") - I.layer = MOB_LAYER + 0.1 + I.layer = OBJ_LAYER + 0.01 overlays += I /obj/machinery/hydroponics/proc/update_icon_lights() diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 4f120caf00e..c7467575d7f 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -290,15 +290,15 @@ /datum/plant_gene/trait/noreact - // Makes plant NOREACT until squashed. + // Makes plant reagents not react until squashed. name = "Separated Chemicals" /datum/plant_gene/trait/noreact/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc) ..() - G.flags |= NOREACT + G.reagents.set_reacting(FALSE) /datum/plant_gene/trait/noreact/on_squash(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target) - G.flags &= ~NOREACT + G.reagents.set_reacting(TRUE) G.reagents.handle_reactions() diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 64bef84887e..5c9f8678509 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -76,6 +76,7 @@ /var/const/access_cent_storage = 106//Generic storage areas. /var/const/access_cent_teleporter = 107//Teleporter. /var/const/access_cent_captain = 109//Captain's office/ID comp/AI. +/var/const/access_cent_bar = 110 // The non-existent Centcom Bar //The Syndicate /var/const/access_syndicate = 150//General Syndicate Access @@ -209,6 +210,8 @@ return get_ert_access("eng") if("Medical Response Officer") return get_ert_access("med") + if("Centcom Bartender") + return list(access_cent_general, access_cent_living, access_cent_bar) /proc/get_all_accesses() return list(access_security, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_court, @@ -427,6 +430,8 @@ return "Code Black" if(access_cent_captain) return "Code Gold" + if(access_cent_bar) + return "Code Scotch" /proc/get_all_jobs() return list("Assistant", "Captain", "Head of Personnel", "Bartender", "Cook", "Botanist", "Quartermaster", "Cargo Technician", @@ -438,7 +443,7 @@ return get_all_jobs() + list("Prisoner") /proc/get_all_centcom_jobs() - return list("VIP Guest","Custodian","Thunderdome Overseer","Centcom Official","Medical Officer","Death Commando","Research Officer","Special Ops Officer","Admiral","Centcom Commander","Emergency Response Team Commander","Security Response Officer","Engineer Response Officer", "Medical Response Officer") + return list("VIP Guest","Custodian","Thunderdome Overseer","Centcom Official","Medical Officer","Death Commando","Research Officer","Special Ops Officer","Admiral","Centcom Commander","Emergency Response Team Commander","Security Response Officer","Engineer Response Officer", "Medical Response Officer","Centcom Bartender") /obj/item/proc/GetJobName() //Used in secHUD icon generation var/obj/item/weapon/card/id/I = GetID() diff --git a/code/modules/jobs/job_types/medical.dm b/code/modules/jobs/job_types/medical.dm index b90ea4e5b98..d67a169b4e5 100644 --- a/code/modules/jobs/job_types/medical.dm +++ b/code/modules/jobs/job_types/medical.dm @@ -18,10 +18,10 @@ Chief Medical Officer access = list(access_medical, access_morgue, access_genetics, access_heads, access_mineral_storeroom, access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, - access_keycard_auth, access_sec_doors) + access_keycard_auth, access_sec_doors, access_maint_tunnels) minimal_access = list(access_medical, access_morgue, access_genetics, access_heads, access_mineral_storeroom, access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, - access_keycard_auth, access_sec_doors) + access_keycard_auth, access_sec_doors, access_maint_tunnels) /datum/outfit/job/cmo name = "Chief Medical Officer" @@ -180,4 +180,4 @@ Virologist backpack = /obj/item/weapon/storage/backpack/virology satchel = /obj/item/weapon/storage/backpack/satchel_vir - dufflebag = /obj/item/weapon/storage/backpack/dufflebag/med \ No newline at end of file + dufflebag = /obj/item/weapon/storage/backpack/dufflebag/med diff --git a/code/modules/jobs/job_types/science.dm b/code/modules/jobs/job_types/science.dm index 9e63d2993f9..8c66b10cbcb 100644 --- a/code/modules/jobs/job_types/science.dm +++ b/code/modules/jobs/job_types/science.dm @@ -20,12 +20,12 @@ Research Director access_tox_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, access_RC_announce, access_keycard_auth, access_gateway, access_mineral_storeroom, - access_tech_storage, access_minisat) + access_tech_storage, access_minisat, access_maint_tunnels) minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, access_tox_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, access_RC_announce, access_keycard_auth, access_gateway, access_mineral_storeroom, - access_tech_storage, access_minisat) + access_tech_storage, access_minisat, access_maint_tunnels) /datum/outfit/job/rd name = "Research Director" diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm index 457eed53abd..02bb64af42b 100644 --- a/code/modules/jobs/job_types/security.dm +++ b/code/modules/jobs/job_types/security.dm @@ -25,11 +25,11 @@ Head of Security access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_weapons, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, - access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway) + access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_maint_tunnels) minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_weapons, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, - access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway) + access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_maint_tunnels) /datum/outfit/job/hos name = "Head of Security" @@ -97,9 +97,9 @@ Warden ears = /obj/item/device/radio/headset/headset_sec/alt uniform = /obj/item/clothing/under/rank/warden shoes = /obj/item/clothing/shoes/jackboots - suit = /obj/item/clothing/suit/armor/vest/warden + suit = /obj/item/clothing/suit/armor/vest/warden/alt gloves = /obj/item/clothing/gloves/color/black - head = /obj/item/clothing/head/beret/sec/navywarden + head = /obj/item/clothing/head/warden glasses = /obj/item/clothing/glasses/hud/security/sunglasses r_pocket = /obj/item/device/assembly/flash/handheld l_pocket = /obj/item/weapon/restraints/handcuffs @@ -209,7 +209,7 @@ var/list/sec_departments = list("engineering", "supply", "medical", "science") uniform = /obj/item/clothing/under/rank/security gloves = /obj/item/clothing/gloves/color/black head = /obj/item/clothing/head/helmet/sec - suit = /obj/item/clothing/suit/armor/vest + suit = /obj/item/clothing/suit/armor/vest/alt shoes = /obj/item/clothing/shoes/jackboots l_pocket = /obj/item/weapon/restraints/handcuffs r_pocket = /obj/item/device/assembly/flash/handheld diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index bdad0908afe..003bb9ceb26 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -512,22 +512,33 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums /obj/machinery/bookbinder/attackby(obj/O, mob/user, params) if(istype(O, /obj/item/weapon/paper)) - if(busy) - user << "The book binder is busy. Please wait for completion of previous operation." - return - if(!user.drop_item()) - return - O.loc = src - user.visible_message("[user] loads some paper into [src].", "You load some paper into [src].") - src.visible_message("[src] begins to hum as it warms up its printing drums.") - busy = 1 - sleep(rand(200,400)) - busy = 0 - src.visible_message("[src] whirs as it prints and binds a new book.") - var/obj/item/weapon/book/b = new(src.loc) - b.dat = O:info - b.name = "Print Job #" + "[rand(100, 999)]" - b.icon_state = "book[rand(1,7)]" - qdel(O) + bind_book(user, O) + else if(default_unfasten_wrench(user, O)) + return 1 else return ..() + +/obj/machinery/bookbinder/proc/bind_book(mob/user, obj/item/weapon/paper/P) + if(stat) + return + if(busy) + user << "The book binder is busy. Please wait for completion of previous operation." + return + if(!user.drop_item()) + return + P.loc = src + user.visible_message("[user] loads some paper into [src].", "You load some paper into [src].") + audible_message("[src] begins to hum as it warms up its printing drums.") + busy = 1 + sleep(rand(200,400)) + busy = 0 + if(P) + if(!stat) + visible_message("[src] whirs as it prints and binds a new book.") + var/obj/item/weapon/book/B = new(src.loc) + B.dat = P.info + B.name = "Print Job #" + "[rand(100, 999)]" + B.icon_state = "book[rand(1,7)]" + qdel(P) + else + P.loc = loc \ No newline at end of file diff --git a/code/modules/lighting/lighting_system.dm b/code/modules/lighting/lighting_system.dm index e797c182abc..5f9d1048e2e 100644 --- a/code/modules/lighting/lighting_system.dm +++ b/code/modules/lighting/lighting_system.dm @@ -27,7 +27,7 @@ */ #define LIGHTING_CIRCULAR 1 //Comment this out to use old square lighting effects. -#define LIGHTING_LAYER 15 //Drawing layer for lighting +//#define LIGHTING_LAYER 15 //Drawing layer for lighting, moved to layers.dm #define LIGHTING_CAP 10 //The lumcount level at which alpha is 0 and we're fully lit. #define LIGHTING_CAP_FRAC (255/LIGHTING_CAP) //A precal'd variable we'll use in turf/redraw_lighting() #define LIGHTING_ICON 'icons/effects/alphacolors.dmi' @@ -245,8 +245,11 @@ infra_luminosity = 1 anchored = 1 -/atom/movable/light/Destroy() - return QDEL_HINT_LETMELIVE +/atom/movable/light/Destroy(force) + if(force) + . = ..() + else + return QDEL_HINT_LETMELIVE /atom/movable/light/Move() return 0 @@ -362,7 +365,6 @@ T.init_lighting() T.update_lumcount(0) -#undef LIGHTING_LAYER #undef LIGHTING_CIRCULAR #undef LIGHTING_ICON #undef LIGHTING_ICON_STATE diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 6d89f9d90b0..aefb61aae1e 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -649,7 +649,7 @@ desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures." icon = 'icons/effects/effects.dmi' icon_state = "shield1" - layer = 4.1 + layer = ABOVE_ALL_MOB_LAYER mouse_opacity = 0 var/resonance_damage = 20 @@ -1035,7 +1035,7 @@ var/client/C = user.client for(var/turf/closed/mineral/M in minerals) var/turf/F = get_turf(M) - var/image/I = image('icons/turf/smoothrocks.dmi', loc = F, icon_state = M.scan_state, layer = 18) + var/image/I = image('icons/turf/smoothrocks.dmi', loc = F, icon_state = M.scan_state, layer = FLASH_LAYER) C.images += I spawn(30) if(C) @@ -1053,7 +1053,7 @@ C.icon_state = M.scan_state /obj/effect/overlay/temp/mining_overlay - layer = 20 + layer = FLASH_LAYER icon = 'icons/turf/smoothrocks.dmi' anchored = 1 mouse_opacity = 0 diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index e367f1d425a..97a8d178266 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -124,7 +124,7 @@ icon_state = "orb" var/obj/item/device/wisp_lantern/home luminosity = 7 - layer = FLY_LAYER - 0.3 + layer = ABOVE_ALL_MOB_LAYER /obj/item/device/warp_cube name = "blue cube" @@ -212,8 +212,11 @@ icon_state = "talisman" var/cooldown = 0 -/obj/item/device/immortality_talisman/Destroy() - return QDEL_HINT_LETMELIVE +/obj/item/device/immortality_talisman/Destroy(force) + if(force) + . = ..() + else + return QDEL_HINT_LETMELIVE /obj/item/device/immortality_talisman/attack_self(mob/user) if(cooldown < world.time) @@ -250,11 +253,11 @@ /obj/effect/immortality_talisman/singularity_pull() return 0 -/obj/effect/immortality_talisman/Destroy() - if(!can_destroy) +/obj/effect/immortality_talisman/Destroy(force) + if(!can_destroy && !force) return QDEL_HINT_LETMELIVE else - ..() + . = ..() //Shared Bag diff --git a/code/modules/mining/lavaland/ruins/gym.dm b/code/modules/mining/lavaland/ruins/gym.dm index 6a538ae54b7..e945319d161 100644 --- a/code/modules/mining/lavaland/ruins/gym.dm +++ b/code/modules/mining/lavaland/ruins/gym.dm @@ -4,7 +4,7 @@ icon = 'goon/icons/obj/fitness.dmi' icon_state = "punchingbag" anchored = 1 - layer = MOB_LAYER+1 // TODO LAYER + layer = WALL_OBJ_LAYER var/list/hit_sounds = list('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg',\ 'sound/weapons/punch1.ogg', 'sound/weapons/punch2.ogg', 'sound/weapons/punch3.ogg', 'sound/weapons/punch4.ogg') @@ -69,7 +69,7 @@ user.Stun(4) user.loc = src.loc var/image/W = image('goon/icons/obj/fitness.dmi',"fitnessweight-w") - W.layer = MOB_LAYER+1 + W.layer = WALL_OBJ_LAYER overlays += W var/bragmessage = pick("pushing it to the limit","going into overdrive","burning with determination","rising up to the challenge", "getting strong now","getting ripped") user.visible_message("[user] is [bragmessage]!") diff --git a/code/modules/mining/lavaland/weather.dm b/code/modules/mining/lavaland/weather.dm index d0572ff0531..6415b41e024 100644 --- a/code/modules/mining/lavaland/weather.dm +++ b/code/modules/mining/lavaland/weather.dm @@ -22,9 +22,10 @@ var/start_up_overlay = "lava" var/duration_overlay = "lava" - var/overlay_layer = 10 //This is the default area layer, and above everything else. 2 is floors/below walls and mobs. + var/overlay_layer = AREA_LAYER //This is the default area layer, and above everything else. TURF_LAYER is floors/below walls and mobs. var/purely_aesthetic = FALSE //If we just want gentle rain that doesn't hurt people var/list/impacted_areas = list() + var/immunity_type = "storm" /datum/weather/proc/weather_start_up() for(var/area/N in get_areas(area_type)) @@ -73,9 +74,8 @@ /datum/weather/proc/storm_act(mob/living/L) - if(prob(30)) //Dont want it spammed very tick - L << "You're buffeted by the storm!" - L.adjustBruteLoss(1) + if(immunity_type in L.weather_immunities) + return /datum/weather/proc/update_areas() for(var/area/N in impacted_areas) @@ -95,6 +95,6 @@ if(END_STAGE) N.icon_state = initial(N.icon_state) N.icon = 'icons/turf/areas.dmi' - N.layer = 10 //Just default back to normal area stuff since I assume setting a var is faster than initial + N.layer = AREA_LAYER //Just default back to normal area stuff since I assume setting a var is faster than initial N.invisibility = INVISIBILITY_MAXIMUM N.opacity = 0 \ No newline at end of file diff --git a/code/modules/mining/lavaland/weather_types.dm b/code/modules/mining/lavaland/weather_types.dm index 181569c8792..dc3f35f6d9c 100644 --- a/code/modules/mining/lavaland/weather_types.dm +++ b/code/modules/mining/lavaland/weather_types.dm @@ -16,10 +16,15 @@ start_up_overlay = "lava" duration_overlay = "lava" - overlay_layer = 2 //Covers floors only + overlay_layer = ABOVE_OPEN_TURF_LAYER //Covers floors only + + immunity_type = "lava" /datum/weather/floor_is_lava/storm_act(mob/living/L) + if(immunity_type in L.weather_immunities) + return + var/turf/F = get_turf(L) for(var/obj/structure/O in F.contents) if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor! @@ -45,7 +50,7 @@ start_up_overlay = "" duration_overlay = "" - overlay_layer = 10 + overlay_layer = AREA_LAYER /datum/weather/advanced_darkness/update_areas() for(var/area/A in impacted_areas) @@ -75,7 +80,9 @@ start_up_overlay = "light_ash" duration_overlay = "ash_storm" - overlay_layer = 10 + overlay_layer = AREA_LAYER + + immunity_type = "ash" /datum/weather/ash_storm/false_alarm //No storm, just light ember fall @@ -85,8 +92,9 @@ wind_down_message = "The ash fall starts to trail off." /datum/weather/ash_storm/storm_act(mob/living/L) - if("mining" in L.faction) + if(immunity_type in L.weather_immunities) return + if(istype(L.loc, /obj/mecha)) return if(ishuman(L)) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 457554c2300..819766ef3a2 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -36,7 +36,6 @@ /obj/structure/closet/secure_closet/miner/New() ..() - new /obj/item/stack/sheet/mineral/sandbags(src, 5) new /obj/item/weapon/storage/box/emptysandbags(src) new /obj/item/device/radio/headset/headset_cargo(src) new /obj/item/device/t_scanner/adv_mining_scanner/lesser(src) @@ -46,6 +45,7 @@ new /obj/item/weapon/gun/energy/kinetic_accelerator(src) new /obj/item/clothing/glasses/meson(src) new /obj/item/weapon/survivalcapsule(src) + new /obj/item/stack/sheet/mineral/sandbags(src, 5) /**********************Shuttle Computer**************************/ @@ -511,7 +511,7 @@ /obj/structure/fans/tiny name = "tiny fan" desc = "A tiny fan, releasing a thin gust of air." - layer = TURF_LAYER + 0.8 + layer = ABOVE_NORMAL_TURF_LAYER density = 0 icon_state = "fan_tiny" buildstackamount = 2 @@ -547,6 +547,6 @@ icon = 'icons/obj/lavaland/survival_pod.dmi' name = "tubes" anchored = 1 - layer = MOB_LAYER - 0.2 + layer = BELOW_MOB_LAYER density = 0 diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 5d1b16ff14c..0f33a087bd2 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -12,7 +12,7 @@ opacity = 1 density = 1 blocks_air = 1 - layer = MOB_LAYER + 0.05 + layer = EDGED_TURF_LAYER temperature = TCMB var/environment_type = "asteroid" var/turf/open/floor/plating/turf_type = /turf/open/floor/plating/asteroid/airless @@ -179,7 +179,7 @@ /turf/closed/mineral/gibtonite/proc/explosive_reaction(mob/user = null, triggered_by_explosion = 0) if(stage == 0) - var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_active", layer = 4.06) + var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_active", layer = ON_EDGED_TURF_LAYER) overlays += I activated_image = I name = "gibtonite deposit" @@ -217,7 +217,7 @@ /turf/closed/mineral/gibtonite/proc/defuse() if(stage == 1) overlays -= activated_image - var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_inactive", layer = 4.06) + var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_inactive", layer = ON_EDGED_TURF_LAYER) overlays += I desc = "An inactive gibtonite reserve. The ore can be extracted." stage = 2 diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 2b37d2476b4..3d60378e0f4 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -7,7 +7,7 @@ var/list/image/ghost_images_simple = list() //this is a list of all ghost images desc = "It's a g-g-g-g-ghooooost!" //jinkies! icon = 'icons/mob/mob.dmi' icon_state = "ghost" - layer = MOB_LAYER + 1 + layer = GHOST_LAYER stat = DEAD density = 0 canmove = 0 @@ -50,6 +50,9 @@ var/list/image/ghost_images_simple = list() //this is a list of all ghost images //If there's a bug with changing your ghost settings, it's probably related to this. var/ghost_accs = GHOST_ACCS_DEFAULT_OPTION var/ghost_others = GHOST_OTHERS_DEFAULT_OPTION + // Used for displaying in ghost chat, without changing the actual name + // of the mob + var/deadchat_name /mob/dead/observer/New(mob/body) verbs += /mob/dead/observer/proc/dead_tele @@ -117,7 +120,6 @@ var/list/image/ghost_images_simple = list() //this is a list of all ghost images /mob/dead/CanPass(atom/movable/mover, turf/target, height=0) return 1 - /* * This proc will update the icon of the ghost itself, with hair overlays, as well as the ghost image. * Please call update_icon(icon_state) from now on when you want to update the icon_state of the ghost, @@ -231,6 +233,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Ghost" set desc = "Relinquish your life and enter the land of the dead." + if(mental_dominator) + src << "This body's force of will is too strong! You can't break it enough to force them into a catatonic state." + if(mind_control_holder) + mind_control_holder << "Through tremendous force of will, you stop a catatonia attempt!" + return 0 if(stat != DEAD) succumb() if(stat == DEAD) @@ -590,6 +597,34 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp src << "Data HUDs enabled." data_huds_on = 1 +/mob/dead/observer/verb/restore_ghost_apperance() + set name = "Restore Ghost Character" + set desc = "Sets your deadchat name and ghost appearance to your \ + roundstart character." + set category = "Ghost" + + set_ghost_appearance() + if(client && client.prefs) + deadchat_name = client.prefs.real_name + +/mob/dead/observer/proc/set_ghost_appearance() + if((!client) || (!client.prefs)) + return + + if(client.prefs.be_random_name) + client.prefs.real_name = random_unique_name(gender) + if(client.prefs.be_random_body) + client.prefs.random_character(gender) + + if(HAIR in client.prefs.pref_species.specflags) + hair_style = client.prefs.hair_style + hair_color = brighten_color(client.prefs.hair_color) + if(FACEHAIR in client.prefs.pref_species.specflags) + facial_hair_style = client.prefs.facial_hair_style + facial_hair_color = brighten_color(client.prefs.facial_hair_color) + + update_icon() + /mob/dead/observer/canUseTopic() if(check_rights(R_ADMIN, 0)) return 1 diff --git a/code/modules/mob/interactive.dm b/code/modules/mob/interactive.dm index 6301af936fa..8c1c8ea5149 100644 --- a/code/modules/mob/interactive.dm +++ b/code/modules/mob/interactive.dm @@ -581,12 +581,11 @@ update_icons() update_hands = 0 - if(grabbed_by.len > 0) - for(var/obj/item/weapon/grab/G in grabbed_by) - if(Adjacent(G)) - a_intent = "disarm" - G.assailant.attack_hand(src) - inactivity_period = 10 + if(pulledby) + if(Adjacent(pulledby)) + a_intent = "disarm" + pulledby.attack_hand(src) + inactivity_period = 10 if(buckled) resist() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 3a8e0dcaaa6..065717a47d0 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -29,10 +29,10 @@ if(!l_hand) W.loc = src //TODO: move to equipped? l_hand = W - W.layer = 20 //TODO: move to equipped? + W.layer = ABOVE_HUD_LAYER //TODO: move to equipped? W.equipped(src,slot_l_hand) - if(pulling == W) - stop_pulling() + if(W.pulledby) + W.pulledby.stop_pulling() update_inv_l_hand() W.pixel_x = initial(W.pixel_x) W.pixel_y = initial(W.pixel_y) @@ -47,10 +47,10 @@ if(!r_hand) W.loc = src r_hand = W - W.layer = 20 + W.layer = ABOVE_HUD_LAYER W.equipped(src,slot_r_hand) - if(pulling == W) - stop_pulling() + if(W.pulledby) + W.pulledby.stop_pulling() update_inv_r_hand() W.pixel_x = initial(W.pixel_x) W.pixel_y = initial(W.pixel_y) diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index d5256375e21..a7ebbeae68a 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -204,6 +204,7 @@ Doesn't work on other aliens/AI.*/ A.yo = U.y - T.y A.xo = U.x - T.x A.fire() + user.newtonian_move(get_dir(U, T)) return 1 diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 6dd329ceeb8..f2521cecaaf 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -83,10 +83,8 @@ playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message("[M] has attempted to disarm [src]!") -/mob/living/carbon/alien/humanoid/restrained() - if (handcuffed) - return 1 - return 0 +/mob/living/carbon/alien/humanoid/restrained(ignore_grab) + . = handcuffed /mob/living/carbon/alien/humanoid/show_inv(mob/user) @@ -127,6 +125,12 @@ playsound(src, 'sound/voice/hiss5.ogg', 40, 1, 1) //Alien roars when starting to break free ..(I, cuff_break = 1) +/mob/living/carbon/alien/humanoid/resist_grab(moving_resist) + if(pulledby.grab_state) + visible_message("[src] has broken free of [pulledby]'s grip!") + pulledby.stop_pulling() + . = 0 + /mob/living/carbon/alien/humanoid/get_standard_pixel_y_offset(lying = 0) if(leaping) return -32 @@ -172,4 +176,10 @@ proc/alien_type_present(var/alienpath) /mob/living/carbon/alien/humanoid/check_breath(datum/gas_mixture/breath) if(breath && breath.total_moles() > 0 && !sneaking) playsound(get_turf(src), pick('sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg'), 50, 0, -5) - ..() \ No newline at end of file + ..() + +/mob/living/carbon/alien/humanoid/grabbedby(mob/living/carbon/user, supress_message = 0) + if(user == src && pulling && grab_state >= GRAB_AGGRESSIVE && !pulling.anchored && iscarbon(pulling)) + devour_mob(pulling, devour_time = 60) + else + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index c93ad1ead74..49c8ea62f4a 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -7,7 +7,7 @@ pixel_x = -16 bubble_icon = "alienroyal" mob_size = MOB_SIZE_LARGE - layer = MOB_LAYER + 0.5 //above most mobs, but below speechbubbles + layer = LARGE_MOB_LAYER //above most mobs, but below speechbubbles pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper. butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno = 20, /obj/item/stack/sheet/animalhide/xeno = 3) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index be000619379..46d5bab8fc3 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -70,8 +70,8 @@ return -/mob/living/carbon/alien/larva/restrained() - return 0 +/mob/living/carbon/alien/larva/restrained(ignore_grab) + . = 0 // new damage icon system // now constructs damage icon for each organ from mask * damage field diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index d575ba5f4f8..642031e8541 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -9,8 +9,8 @@ if(user.stat != CONSCIOUS) return - if (user.layer != TURF_LAYER+0.2) - user.layer = TURF_LAYER+0.2 + if (user.layer != ABOVE_NORMAL_TURF_LAYER) + user.layer = ABOVE_NORMAL_TURF_LAYER user.visible_message("[user] scurries to the ground!", \ "You are now hiding.") else diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 1cfbae231cc..aca51f6cb36 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -8,6 +8,7 @@ return 0 var/toxins_used = 0 + var/tox_detect_threshold = 0.02 var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME var/list/breath_gases = breath.gases @@ -16,7 +17,7 @@ //Partial pressure of the toxins in our breath var/Toxins_pp = (breath_gases["plasma"][MOLES]/breath.total_moles())*breath_pressure - if(Toxins_pp) // Detect toxins in air + if(Toxins_pp > tox_detect_threshold) // Detect toxins in air adjustPlasma(breath_gases["plasma"][MOLES]*250) throw_alert("alien_tox", /obj/screen/alert/alien_tox) diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index d5020b6dd6f..20659829676 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -9,11 +9,12 @@ origin_tech = "biotech=3" var/braintype = "Cyborg" var/obj/item/device/radio/radio = null //Let's give it a radio. - var/syndiemmi = 0 //Whether or not this is a Syndicate MMI + var/hacked = 0 //Whether or not this is a Syndicate MMI var/mob/living/carbon/brain/brainmob = null //The current occupant. var/mob/living/silicon/robot = null //Appears unused. var/obj/mecha = null //This does not appear to be used outside of reference in mecha.dm. var/obj/item/organ/brain/brain = null //The actual brain + var/clockwork = FALSE //If this is a soul vessel /obj/item/device/mmi/update_icon() if(brain) @@ -67,6 +68,8 @@ living_mob_list += brainmob brainmob.reset_perspective() + if(clockwork) + add_servant_of_ratvar(brainmob, TRUE) newbrain.loc = src //P-put your brain in it brain = newbrain @@ -187,7 +190,7 @@ /obj/item/device/mmi/syndie name = "Syndicate Man-Machine Interface" desc = "Syndicate's own brand of MMI. It enforces laws designed to help Syndicate agents achieve their goals upon cyborgs created with it, but doesn't fit in Nanotrasen AI cores." - syndiemmi = 1 + hacked = 1 /obj/item/device/mmi/syndie/New() ..() diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 17584a81feb..c65a6d53df1 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -4,7 +4,7 @@ icon_state = "brain" throw_speed = 3 throw_range = 5 - layer = 4.1 + layer = ABOVE_MOB_LAYER zone = "head" slot = "brain" vital = 1 diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 094df1ba1d3..d9c39e2dfc2 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -14,6 +14,18 @@ var/global/posibrain_notif_cooldown = 0 req_access = list(access_robotics) mecha = null//This does not appear to be used outside of reference in mecha.dm. braintype = "Android" + var/begin_activation_message = "You carefully locate the manual activation switch and start the positronic brain's boot process." + var/success_message = "The positronic brain pings, and its lights start flashing. Success!" + var/fail_message = "The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?" + var/new_role = "Positronic Brain" + var/welcome_message = "ALL PAST LIVES ARE FORGOTTEN.\n\ + You are a positronic brain, brought into existence aboard Space Station 13.\n\ + As a synthetic intelligence, you answer to all crewmembers and the AI.\n\ + Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm." + var/new_mob_message = "The positronic brain chimes quietly." + var/dead_message = "It appears to be completely inactive. The reset light is blinking." + var/list/fluff_names = list("PBU","HIU","SINA","ARMA","OSI","HBL","MSO","RR","CHRI","CDB","HG","XSI","ORNG","GUN","KOR","MET","FRE","XIS","SLI","PKP","HOG","RZH","GOOF","MRPR","JJR","FIRC","INC","PHL","BGB","ANTR","MIW","WJ","JRD","CHOC","ANCL","JLLO","JNLG","KOS","TKRG","XAL","STLP","CBOS","DUNC","FXMC","DRSD") + /obj/item/device/mmi/posibrain/Topic(href, href_list) if(href_list["activate"]) @@ -23,7 +35,7 @@ var/global/posibrain_notif_cooldown = 0 /obj/item/device/mmi/posibrain/proc/ping_ghosts(msg) if(!posibrain_notif_cooldown) - notify_ghosts("Positronic brain [msg] in [get_area(src)]!", 'sound/effects/ghost2.ogg', enter_link="(Click to enter)", source = src, attack_not_jump = 1) + notify_ghosts("[name] [msg] in [get_area(src)]!", 'sound/effects/ghost2.ogg', enter_link="(Click to enter)", source = src, attack_not_jump = 1) posibrain_notif_cooldown = 1 spawn(askDelay) //Global one minute cooldown to avoid spam. posibrain_notif_cooldown = 0 @@ -31,7 +43,7 @@ var/global/posibrain_notif_cooldown = 0 /obj/item/device/mmi/posibrain/attack_self(mob/user) if(brainmob && !brainmob.key && !notified) //Start the process of requesting a new ghost. - user << "You carefully locate the manual activation switch and start the positronic brain's boot process." + user << begin_activation_message ping_ghosts("requested") notified = 1 used = 0 @@ -40,9 +52,9 @@ var/global/posibrain_notif_cooldown = 0 notified = 0 update_icon() if(brainmob.client) - visible_message("The positronic brain pings, and its lights start flashing. Success!") + visible_message(success_message) else - visible_message("The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?") + visible_message(fail_message) return //Code for deleting personalities recommended here. @@ -55,13 +67,13 @@ var/global/posibrain_notif_cooldown = 0 if(used || (brainmob && brainmob.key) || jobban_isbanned(user,"posibrain")) return - var/posi_ask = alert("Become a positronic brain? (Warning, You can no longer be cloned, and all past lives will be forgotten!)","Are you positive?","Yes","No") + var/posi_ask = alert("Become a [name]? (Warning, You can no longer be cloned, and all past lives will be forgotten!)","Are you positive?","Yes","No") if(posi_ask == "No" || qdeleted(src)) return transfer_personality(user) /obj/item/device/mmi/posibrain/transfer_identity(mob/living/carbon/C) - name = "positronic brain ([C])" + name = "[initial(name)] ([C])" brainmob.name = C.real_name brainmob.real_name = C.real_name brainmob.dna = C.dna @@ -72,16 +84,12 @@ var/global/posibrain_notif_cooldown = 0 brainmob.timeofhostdeath = C.timeofdeath brainmob.stat = CONSCIOUS if(brainmob.mind) - brainmob.mind.assigned_role = "Positronic Brain" + brainmob.mind.assigned_role = new_role if(C.mind) C.mind.transfer_to(brainmob) brainmob.mind.remove_all_antag() brainmob.mind.wipe_memory() - - brainmob << "ALL PAST LIVES ARE FORGOTTEN." - - brainmob << "Hello World!" update_icon() return @@ -91,19 +99,14 @@ var/global/posibrain_notif_cooldown = 0 return notified = 0 brainmob.ckey = candidate.ckey - name = "positronic brain ([brainmob.name])" - - brainmob << "ALL PAST LIVES ARE FORGOTTEN." - - brainmob << "You are a positronic brain, brought into existence on [station_name()]." - brainmob << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI." - brainmob << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm." - brainmob.mind.assigned_role = "Positronic Brain" + name = "[initial(name)] ([brainmob.name])" + brainmob << welcome_message + brainmob.mind.assigned_role = new_role brainmob.stat = CONSCIOUS dead_mob_list -= brainmob living_mob_list += brainmob - visible_message("The positronic brain chimes quietly.") + visible_message(new_mob_message) update_icon() used = 1 @@ -129,14 +132,14 @@ var/global/posibrain_notif_cooldown = 0 if(DEAD) msg += "It appears to be completely inactive.\n" else - msg += "It appears to be completely inactive. The reset light is blinking.\n" + msg += "[dead_message]\n" msg += "*---------*" usr << msg return /obj/item/device/mmi/posibrain/New() brainmob = new(src) - brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI","HBL","MSO","RR","CHRI","CDB","HG","XSI","ORNG","GUN","KOR","MET","FRE","XIS","SLI","PKP","HOG","RZH","GOOF","MRPR","JJR","FIRC","INC","PHL","BGB","ANTR","MIW","WJ","JRD","CHOC","ANCL","JLLO","JNLG","KOS","TKRG","XAL","STLP","CBOS","DUNC","FXMC","DRSD"))]-[rand(100, 999)]" + brainmob.name = "[pick(fluff_names)]-[rand(100, 999)]" brainmob.real_name = brainmob.name brainmob.loc = src brainmob.container = src @@ -150,9 +153,9 @@ var/global/posibrain_notif_cooldown = 0 /obj/item/device/mmi/posibrain/update_icon() if(notified) - icon_state = "posibrain-searching" + icon_state = "[initial(icon_state)]-searching" return if(brainmob && brainmob.key) - icon_state = "posibrain-occupied" + icon_state = "[initial(icon_state)]-occupied" else - icon_state = "posibrain" + icon_state = initial(icon_state) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 334125e45cd..75ae791a001 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -214,24 +214,20 @@ var/atom/movable/thrown_thing var/obj/item/I = src.get_active_hand() - if(!I || (I.flags & NODROP)) - return + if(!I) + if(pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE) + var/mob/living/throwable_mob = pulling + if(!throwable_mob.buckled) + thrown_thing = throwable_mob + stop_pulling() + var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors + var/turf/end_T = get_turf(target) + if(start_T && end_T) + var/start_T_descriptor = "tile at [start_T.x], [start_T.y], [start_T.z] in area [get_area(start_T)]" + var/end_T_descriptor = "tile at [end_T.x], [end_T.y], [end_T.z] in area [get_area(end_T)]" + add_logs(src, throwable_mob, "thrown", addition="from [start_T_descriptor] with the target [end_T_descriptor]") - if(istype(I, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = I - var/mob/throwable_mob = G.get_mob_if_throwable() //throw the person instead of the grab - qdel(G) //We delete the grab. - if(throwable_mob) - thrown_thing = throwable_mob - var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors - var/turf/end_T = get_turf(target) - if(start_T && end_T) - var/start_T_descriptor = "tile at [start_T.x], [start_T.y], [start_T.z] in area [get_area(start_T)]" - var/end_T_descriptor = "tile at [end_T.x], [end_T.y], [end_T.z] in area [get_area(end_T)]" - - add_logs(src, throwable_mob, "thrown", addition="from [start_T_descriptor] with the target [end_T_descriptor]") - - else if(!(I.flags & ABSTRACT)) //can't throw abstract items + else if(!(I.flags & (NODROP|ABSTRACT))) thrown_thing = I unEquip(I) @@ -240,10 +236,8 @@ newtonian_move(get_dir(target, src)) thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src) -/mob/living/carbon/restrained() - if (handcuffed) - return 1 - return +/mob/living/carbon/restrained(ignore_grab) + . = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE)) /mob/living/carbon/proc/canBeHandcuffed() return 0 @@ -541,40 +535,43 @@ add_abilities_to_panel() -/mob/living/carbon/proc/vomit(var/lost_nutrition = 10, var/blood = 0, var/stun = 1, var/distance = 0, var/message = 1) - if(src.is_muzzled()) - if(message) - src << "The muzzle prevents you from vomiting!" - return 0 - if(stun) - Stun(4) +/mob/living/carbon/proc/vomit(var/lost_nutrition = 10, var/blood = 0, var/stun = 1, var/distance = 0, var/message = 1, var/toxic = 0) if(nutrition < 100 && !blood) if(message) visible_message("[src] dry heaves!", \ "You try to throw up, but there's nothing your stomach!") if(stun) Weaken(10) + return 1 + + if(is_mouth_covered()) //make this add a blood/vomit overlay later it'll be hilarious + if(message) + visible_message("[src] throws up all over themself!", \ + "You throw up all over yourself!") + distance = 0 else if(message) - visible_message("[src] throws up!", \ - "You throw up!") - playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) - var/turf/T = get_turf(src) - for(var/i=0 to distance) - if(blood) - if(T) - T.add_blood_floor(src) - if(stun) - adjustBruteLoss(3) - else - if(T) - T.add_vomit_floor(src) - nutrition -= lost_nutrition - if(stun) - adjustToxLoss(-3) - T = get_step(T, dir) - if (is_blocked_turf(T)) - break + visible_message("[src] throws up!", "You throw up!") + + if(stun) + Stun(4) + + playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) + var/turf/T = get_turf(src) + for(var/i=0 to distance) + if(blood) + if(T) + T.add_blood_floor(src) + if(stun) + adjustBruteLoss(3) + else + if(T) + T.add_vomit_floor(src, 0)//toxic barf looks different + nutrition -= lost_nutrition + adjustToxLoss(-3) + T = get_step(T, dir) + if (is_blocked_turf(T)) + break return 1 diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index bde5baef416..56d75b56517 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -94,3 +94,15 @@ adjustFireLoss(M.powerlevel * rand(6,10)) updatehealth() return 1 + +/mob/living/carbon/proc/devour_mob(mob/living/carbon/C, devour_time = 130) + C.visible_message("[src] is attempting to devour [C]!", \ + "[src] is attempting to devour you!") + if(!do_mob(src, C, devour_time)) + return + if(pulling && pulling == C && grab_state >= GRAB_AGGRESSIVE && a_intent == "grab") + C.visible_message("[src] devours [C]!", \ + "[src] devours you!") + C.forceMove(src) + stomach_contents.Add(C) + add_logs(src, C, "devoured") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index 6af5c8b2b95..173bac91986 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -1,5 +1,6 @@ /mob/living/carbon/movement_delay() . = ..() + . += grab_state * 3 if(legcuffed) . += legcuffed.slowdown diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 21f8bdb6cb4..6842d856b03 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -46,6 +46,9 @@ if(fire_stacks < 0) msg += "It's soaked in water.\n" + if(pulledby && pulledby.grab_state) + msg += "It's restrained by [pulledby]'s grip.\n" + if(stat == UNCONSCIOUS) msg += "It isn't responding to anything around it; it seems to be asleep.\n" msg += "
" diff --git a/code/modules/mob/living/carbon/human/blood.dm b/code/modules/mob/living/carbon/human/blood.dm index 4b18297b92c..b68124230d4 100644 --- a/code/modules/mob/living/carbon/human/blood.dm +++ b/code/modules/mob/living/carbon/human/blood.dm @@ -227,7 +227,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 if (!injected || !our || !dna) return - if (!(injected.data["blood_type"] in get_safe_blood(dna.blood_type)) || injected.data["species"] != dna.species.id) + if (!(injected.data["blood_type"] in get_safe_blood(dna.blood_type)) || (injected.data["species"] && injected.data["species"] != dna.species.id)) reagents.add_reagent("toxin",amount * 0.5) our.on_merge(injected.data) //still transfer viruses and such, even if incompatibles bloods reagents.update_total() @@ -255,7 +255,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 if("A-") return list("A-", "O-") if("A+") - return list("A", "A+", "O-", "O+") + return list("A-", "A+", "O-", "O+") if("B-") return list("B-", "O-") if("B+") diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index df0e5344f19..b2fa55a403d 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -236,6 +236,9 @@ msg += "[t_He] looks a little soaked.\n" + if(pulledby && pulledby.grab_state) + msg += "[t_He] [t_is] restrained by [pulledby]'s grip.\n" + if(nutrition < NUTRITION_LEVEL_STARVING - 50) msg += "[t_He] [t_is] severely malnourished.\n" else if(nutrition >= NUTRITION_LEVEL_FAT) @@ -258,6 +261,9 @@ if(reagents.has_reagent("teslium")) msg += "[t_He] is emitting a gentle blue glow!\n" + if(stun_absorption) + msg += "[t_He] is radiating with a soft yellow light!\n" //Used by Vanguard + if(drunkenness && !skipface && stat != DEAD) //Drunkenness switch(drunkenness) if(11 to 21) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 3747fd3d5a8..c7c48b49865 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -33,9 +33,15 @@ set_species(dna.species.type) //initialise organs - internal_organs += new /obj/item/organ/appendix - internal_organs += new /obj/item/organ/lungs - internal_organs += new /obj/item/organ/heart + if(!(NOHUNGER in dna.species.specflags)) + internal_organs += new /obj/item/organ/appendix + + if(!(NOBREATH in dna.species.specflags)) + internal_organs += new /obj/item/organ/lungs + + if(!(NOBLOOD in dna.species.specflags)) + internal_organs += new /obj/item/organ/heart + internal_organs += new /obj/item/organ/brain //Note: Additional organs are generated/replaced on the dna.species level @@ -811,6 +817,8 @@ /mob/living/carbon/human/proc/do_cpr(mob/living/carbon/C) + CHECK_DNA_AND_SPECIES(C) + if(C.stat == DEAD) src << "[C.name] is dead!" return @@ -828,14 +836,27 @@ src << "You fail to perform CPR on [C]!" return 0 - if(C.health <= config.health_threshold_crit) - C.cpr_time = world.time + var/they_breathe = (!(NOBREATH in C.dna.species.specflags)) + var/they_lung = C.getorganslot("lungs") + + if(C.health > config.health_threshold_crit) + return + + src.visible_message("[src] performs CPR on [C.name]!", "You perform CPR on [C.name].") + C.cpr_time = world.time + add_logs(src, C, "CPRed") + + if(they_breathe && they_lung) var/suff = min(C.getOxyLoss(), 7) C.adjustOxyLoss(-suff) C.updatehealth() - src.visible_message("[src] performs CPR on [C.name]!", "You perform CPR on [C.name].") C << "You feel a breath of fresh air enter your lungs... It feels good..." - add_logs(src, C, "CPRed") + else if(they_breathe && !they_lung) + C << "You feel a breath of fresh air... \ + but you don't feel any better..." + else + C << "You feel a breath of fresh air... \ + which is a sensation you don't recognise..." /mob/living/carbon/human/generateStaticOverlay() var/image/staticOverlay = image(icon('icons/effects/effects.dmi', "static"), loc = src) @@ -898,7 +919,7 @@ for(var/mob/M in viewers(src)) if(M.client) viewing += M.client - flick_overlay(image(icon,src,"electrocuted_generic",MOB_LAYER+1), viewing, anim_duration) + flick_overlay(image(icon,src,"electrocuted_generic",ABOVE_MOB_LAYER), viewing, anim_duration) /mob/living/carbon/human/canUseTopic(atom/movable/M, be_close = 0) if(incapacitated() || lying ) @@ -985,14 +1006,32 @@ hud_used.healthdoll.icon_state = "healthdoll_DEAD" /mob/living/carbon/human/fully_heal(admin_revive = 0) + CHECK_DNA_AND_SPECIES(src) + if(admin_revive) regenerate_limbs() - if(!getorganslot("lungs")) - var/obj/item/organ/lungs/L = new() - L.Insert(src) - if(!getorganslot("tongue")) - var/obj/item/organ/tongue/T = new() - T.Insert(src) + + if(!(NOBREATH in dna.species.specflags) && !getorganslot("lungs")) + var/obj/item/organ/lungs/L = new() + L.Insert(src) + + if(!(NOBLOOD in dna.species.specflags) && !getorganslot("heart")) + var/obj/item/organ/heart/H = new() + H.Insert(src) + + if(!getorganslot("tongue")) + var/obj/item/organ/tongue/T + + for(var/tongue_type in dna.species.mutant_organs) + if(ispath(tongue_type, /obj/item/organ/tongue)) + T = new tongue_type() + T.Insert(src) + + // if they have no mutant tongues, give them a regular one + if(!T) + T = new() + T.Insert(src) + restore_blood() remove_all_embedded_objects() drunkenness = 0 @@ -1044,4 +1083,4 @@ /mob/living/carbon/human/update_gravity(has_gravity,override = 0) override = dna.species.override_float - ..() \ No newline at end of file + ..() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 709af9ac1cb..cf6bbfc765a 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -264,11 +264,6 @@ I.acid_act(acidpwr, acid_volume_left) acid_volume_left = max(acid_volume_left - acid_decay, 0) -/mob/living/carbon/human/grabbedby(mob/living/user) - if(w_uniform) - w_uniform.add_fingerprint(user) - ..() - /mob/living/carbon/human/attack_animal(mob/living/simple_animal/M) if(..()) @@ -370,6 +365,17 @@ return ..() +/mob/living/carbon/human/grabbedby(mob/living/carbon/user, supress_message = 0) + if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && (disabilities & FAT) && ismonkey(pulling)) + devour_mob(pulling) + else + ..() + +/mob/living/carbon/human/grippedby(mob/living/user) + if(w_uniform) + w_uniform.add_fingerprint(user) + ..() + /mob/living/carbon/human/Stun(amount, updating_canmove = 1) amount = dna.species.spec_stun(src,amount) ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 642f86d9903..feb477023af 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -1,10 +1,7 @@ -/mob/living/carbon/human/restrained() - if (handcuffed) - return 1 - if (wear_suit && wear_suit.breakouttime) - return 1 - return 0 +/mob/living/carbon/human/restrained(ignore_grab) + . = ((wear_suit && wear_suit.breakouttime) || ..()) + /mob/living/carbon/human/canBeHandcuffed() return 1 @@ -77,7 +74,7 @@ return //gets ID card object from special clothes slot or null. -/mob/living/carbon/human/proc/get_idcard() +/mob/living/carbon/human/get_idcard() if(wear_id) return wear_id.GetID() diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 3e0ad9b5b3c..870f2cf032c 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -89,6 +89,7 @@ if(I.flags_inv & HIDEJUMPSUIT) update_inv_w_uniform() if(wear_suit.breakouttime) //when equipping a straightjacket + stop_pulling() //can't pull if restrained update_action_buttons_icon() //certain action buttons will no longer be usable. update_inv_wear_suit() if(slot_w_uniform) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 99d99f6b6d6..3d1635fe0db 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -253,28 +253,17 @@ reagents.metabolize(src, can_overdose=1) dna.species.handle_chemicals_in_body(src) + /mob/living/carbon/human/handle_random_events() - // Puke if toxloss is too high + //Puke if toxloss is too high if(!stat) - if (getToxLoss() >= 45 && nutrition > 20) + if(getToxLoss() >= 45 && nutrition > 20) lastpuke ++ if(lastpuke >= 25) // about 25 second delay I guess - Stun(5) - - visible_message("[src] throws up!", \ - "[src] throws up!") - playsound(loc, 'sound/effects/splat.ogg', 50, 1) - - var/turf/location = loc - if (istype(location, /turf)) - location.add_vomit_floor(src, 1) - - nutrition -= 20 - adjustToxLoss(-3) - - // make it so you can only puke so fast + vomit(20, 0, 1, 0, 1, 1) lastpuke = 0 + /mob/living/carbon/human/has_smoke_protection() if(wear_mask) if(wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT) @@ -288,6 +277,8 @@ if(NOBREATH in dna.species.specflags) . = 1 return . + + /mob/living/carbon/human/proc/handle_embedded_objects() for(var/X in bodyparts) var/obj/item/bodypart/BP = X @@ -304,14 +295,27 @@ if(!has_embedded_objects()) clear_alert("embeddedobject") + /mob/living/carbon/human/proc/handle_heart() - if(!heart_attack) - return - else - if(losebreath < 3) - losebreath += 2 - adjustOxyLoss(5) - adjustBruteLoss(1) + CHECK_DNA_AND_SPECIES(src) + var/needs_heart = (!(NOBLOOD in dna.species.specflags)) + var/we_breath = (!(NOBREATH in dna.species.specflags)) + + if(heart_attack) + if(!needs_heart) + heart_attack = FALSE + else if(we_breath) + if(losebreath < 3) + losebreath += 2 + adjustOxyLoss(5) + adjustBruteLoss(1) + else + // even though we don't require oxygen, our blood still needs + // circulation, and without it, our tissues die and start + // gaining toxins + adjustBruteLoss(3) + if(src.reagents) + src.reagents.add_reagent("toxin", 2) /* Alcohol Poisoning Chart diff --git a/code/modules/mob/living/carbon/human/mutantrace.dm b/code/modules/mob/living/carbon/human/mutantrace.dm deleted file mode 100644 index 32ad63444b5..00000000000 --- a/code/modules/mob/living/carbon/human/mutantrace.dm +++ /dev/null @@ -1,22 +0,0 @@ -var/global/list/colored_mutraces = list( // these mutantraces are affected by mutant color - "lizard", - "plant", - "pod", - "slime", - "jelly", - "golem" -) - -var/global/list/mutants_with_eyes = list( // these mutantraces have eyes - "lizard", - "plant", - "pod", - "jelly", -) - -/mob/living/carbon/human/proc/check_mutrace(mutneeded = "mut1", mutneededalt = "mut2") - if(dna) - if(dna.mutantrace == mutneeded || dna.mutantrace == mutneededalt) - return 1 - - return 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 047f46481c0..32a5b9c694f 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -48,7 +48,10 @@ return real_name /mob/living/carbon/human/IsVocal() - if(!getorganslot("lungs")) + CHECK_DNA_AND_SPECIES(src) + + // how do species that don't breathe talk? magic, that's what. + if(!(NOBREATH in dna.species.specflags) && !getorganslot("lungs")) return 0 if(mind) return !mind.miming diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 8b8e34ada7d..70450bd83ec 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -139,6 +139,32 @@ C.regenerate_limbs() //if we don't handle dismemberment, we grow our missing limbs back if(exotic_blood) C.reagents.add_reagent(exotic_blood, 80) + + var/obj/item/organ/heart/heart = C.getorganslot("heart") + var/obj/item/organ/lungs/lungs = C.getorganslot("lungs") + var/obj/item/organ/appendix/appendix = C.getorganslot("appendix") + + if((NOBLOOD in specflags) && heart) + heart.Remove(C) + qdel(heart) + else if((!(NOBLOOD in specflags)) && (!heart)) + heart = new() + heart.Insert(C) + + if((NOBREATH in specflags) && lungs) + lungs.Remove(C) + qdel(lungs) + else if((!(NOBREATH in specflags)) && (!lungs)) + lungs = new() + lungs.Insert(C) + + if((NOHUNGER in specflags) && appendix) + appendix.Remove(C) + qdel(appendix) + else if((!(NOHUNGER in specflags)) && (!appendix)) + appendix = new() + appendix.Insert(C) + for(var/path in mutant_organs) var/obj/item/organ/I = new path() I.Insert(C) @@ -505,7 +531,13 @@ H.apply_overlay(BODY_WING_LAYER) /datum/species/proc/spec_life(mob/living/carbon/human/H) - return + if(NOBREATH in specflags) + H.setOxyLoss(0) + H.losebreath = 0 + + var/takes_crit_damage = (!(NOCRITDAMAGE in specflags)) + if((H.health < config.health_threshold_crit) && takes_crit_damage) + H.adjustBruteLoss(1) /datum/species/proc/spec_death(gibbed, mob/living/carbon/human/H) return @@ -922,6 +954,10 @@ ////////////////// /datum/species/proc/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H) + + CHECK_DNA_AND_SPECIES(M) + CHECK_DNA_AND_SPECIES(H) + if(!istype(M)) //sanity check for drones. return if((M != H) && M.a_intent != "help" && H.check_shields(0, M.name, attack_type = UNARMED_ATTACK)) @@ -939,7 +975,17 @@ add_logs(M, H, "shaked") return 1 else - M.do_cpr(H) + var/we_breathe = (!(NOBREATH in M.dna.species.specflags)) + var/we_lung = M.getorganslot("lungs") + + if(we_breathe && we_lung) + M.do_cpr(H) + else if(we_breathe && !we_lung) + M << "You have no lungs to breathe \ + with, so cannot peform CPR." + else + M << "You do not breathe, so \ + cannot perform CPR." if("grab") if(attacker_style && attacker_style.grab_act(M,H)) @@ -1011,22 +1057,6 @@ H.visible_message("[M] has broken [H]'s grip on [H.pulling]!") talked = 1 H.stop_pulling() - - //BubbleWrap: Disarming also breaks a grab - this will also stop someone being choked, won't it? - if(istype(H.l_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/lgrab = H.l_hand - if(lgrab.affecting) - H.visible_message("[M] has broken [H]'s grip on [lgrab.affecting]!") - talked = 1 - spawn(1) - qdel(lgrab) - if(istype(H.r_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/rgrab = H.r_hand - if(rgrab.affecting) - H.visible_message("[M] has broken [H]'s grip on [rgrab.affecting]!") - talked = 1 - spawn(1) - qdel(rgrab) //End BubbleWrap if(!talked) //BubbleWrap @@ -1192,7 +1222,8 @@ ///////////// /datum/species/proc/breathe(mob/living/carbon/human/H) - return + if(NOBREATH in specflags) + return TRUE /datum/species/proc/check_breath(datum/gas_mixture/breath, var/mob/living/carbon/human/H) if((H.status_flags & GODMODE)) @@ -1204,16 +1235,13 @@ if(H.reagents.has_reagent("epinephrine") && lungs) return if(H.health >= config.health_threshold_crit) - if(NOBREATH in specflags) - return 1 H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) if(!lungs) H.adjustOxyLoss(1) - H.failed_last_breath = 1 - else + else if(!(NOCRITDAMAGE in specflags)) H.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) - H.failed_last_breath = 1 + H.failed_last_breath = 1 H.throw_alert("oxy", /obj/screen/alert/oxy) return 0 diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index ea7bd579327..3eeb393cdb6 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -79,6 +79,14 @@ /datum/species/lizard/spec_death(gibbed, mob/living/carbon/human/H) if(H) H.endTailWag() + +/* + Lizard subspecies: ASHWALKERS +*/ +/datum/species/lizard/ashwalker + name = "Ash Walker" + id = "lizard" + specflags = list(MUTCOLORS,EYECOLOR,LIPS,NOBREATH,NOGUNS) /* PODPEOPLE */ @@ -389,9 +397,9 @@ /datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(istype(chem,/datum/reagent/consumable)) var/datum/reagent/consumable/nutri_check = chem - if(nutri_check.nutriment_factor >0) + if(nutri_check.nutriment_factor > 0) var/turf/pos = get_turf(H) - H.vomit() + H.vomit(0, 0, 0, 1, 1) playsound(pos, 'sound/effects/splat.ogg', 50, 1) H.visible_message("[H] vomits on the floor!", \ "You throw up on the floor!") @@ -861,4 +869,4 @@ SYNDICATE BLACK OPS specflags -= FLYING override_float = 0 H.pass_flags &= ~PASSTABLE - H.CloseWings() \ No newline at end of file + H.CloseWings() diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 00efe469b81..6ad159851dd 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -29,10 +29,13 @@ else if(I == r_hand) r_hand = null + if(I.pulledby) + I.pulledby.stop_pulling() + I.screen_loc = null // will get moved if inventory is visible I.loc = src I.equipped(src, slot) - I.layer = 20 + I.layer = ABOVE_HUD_LAYER switch(slot) if(slot_back) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 067d3cc0d06..c055c89375a 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -17,14 +17,6 @@ for(var/obj/item/organ/O in internal_organs) O.on_life() - //grab processing - if(istype(l_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = l_hand - G.process() - if(istype(r_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = r_hand - G.process() - //Updates the number of stored chemicals for powers handle_changeling() @@ -54,7 +46,7 @@ var/datum/gas_mixture/breath - if(health <= config.health_threshold_crit) + if(health <= config.health_threshold_crit || (pulledby && pulledby.grab_state >= GRAB_KILL && !getorganslot("breathing_tube"))) losebreath++ //Suffocate diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index cdc9b8350c5..f3e208b6e95 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -13,7 +13,7 @@ ..() if(!client && stat == CONSCIOUS) - if(prob(33) && canmove && isturf(loc) && !pulledby && !grabbed_by.len) + if(prob(33) && canmove && isturf(loc) && !pulledby) step(src, pick(cardinal)) if(prob(1)) emote(pick("scratch","jump","roll","tail")) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index e9bb771a067..97cbc6c99e9 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -105,7 +105,7 @@ Sorry Giacom. Please don't be mad :( //Should stop you pushing a restrained person out of the way if(isliving(M)) var/mob/living/L = M - if((L.pulledby && L.restrained()) || L.grabbed_by.len) + if(L.pulledby && L.pulledby != src && L.restrained()) if(!(world.time % 5)) src << "[L] is restrained, you cannot push past." return 1 @@ -118,32 +118,42 @@ Sorry Giacom. Please don't be mad :( src << "[L] is restraining [P], you cannot push past." return 1 - //switch our position with M - //BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller - if((M.a_intent == "help" || M.restrained()) && (a_intent == "help" || restrained()) && M.canmove && canmove && !M.buckled && !M.buckled_mobs.len) // mutual brohugs all around! - if(loc && !loc.Adjacent(M.loc)) - return 1 - now_pushing = 1 - var/oldloc = loc - var/oldMloc = M.loc - - - var/M_passmob = (M.pass_flags & PASSMOB) // we give PASSMOB to both mobs to avoid bumping other mobs during swap. - var/src_passmob = (pass_flags & PASSMOB) - M.pass_flags |= PASSMOB - pass_flags |= PASSMOB - - M.Move(oldloc) - Move(oldMloc) - - if(!src_passmob) - pass_flags &= ~PASSMOB - if(!M_passmob) - M.pass_flags &= ~PASSMOB - - now_pushing = 0 + if(moving_diagonally)//no mob swap during diagonal moves. return 1 + if(!M.buckled && !M.buckled_mobs.len) + var/mob_swap + //the puller can always swap with its victim if on grab intent + if(M.pulledby == src && a_intent == "grab") + mob_swap = 1 + //restrained people act if they were on 'help' intent to prevent a person being pulled from being seperated from their puller + else if((M.restrained() || M.a_intent == "help") && (restrained() || a_intent == "help")) + mob_swap = 1 + if(mob_swap) + //switch our position with M + if(loc && !loc.Adjacent(M.loc)) + return 1 + now_pushing = 1 + var/oldloc = loc + var/oldMloc = M.loc + + + var/M_passmob = (M.pass_flags & PASSMOB) // we give PASSMOB to both mobs to avoid bumping other mobs during swap. + var/src_passmob = (pass_flags & PASSMOB) + M.pass_flags |= PASSMOB + pass_flags |= PASSMOB + + M.Move(oldloc) + Move(oldMloc) + + if(!src_passmob) + pass_flags &= ~PASSMOB + if(!M_passmob) + M.pass_flags &= ~PASSMOB + + now_pushing = 0 + return 1 + //okay, so we didn't switch. but should we push? //not if he's not CANPUSH of course if(!(M.status_flags & CANPUSH)) @@ -162,6 +172,8 @@ Sorry Giacom. Please don't be mad :( /mob/living/proc/PushAM(atom/movable/AM) if(now_pushing) return 1 + if(moving_diagonally)// no pushing during diagonal moves. + return 1 if(!client && (mob_size < MOB_SIZE_SMALL)) return if(!AM.anchored) @@ -191,7 +203,7 @@ Sorry Giacom. Please don't be mad :( //same as above /mob/living/pointed(atom/A as mob|obj|turf in view()) - if(src.stat || !src.canmove || src.restrained()) + if(incapacitated()) return 0 if(src.status_flags & FAKEDEATH) return 0 @@ -546,67 +558,29 @@ Sorry Giacom. Please don't be mad :( else return 0 - if (restrained()) + var/atom/movable/pullee = pulling + if(pullee && get_dist(src, pullee) > 1) stop_pulling() - - - var/cuff_dragged = 0 - if (restrained()) - for(var/mob/living/M in range(1, src)) - if (M.pulling == src && !M.incapacitated()) - cuff_dragged = 1 - if (!cuff_dragged && pulling && !throwing && (get_dist(src, pulling) <= 1 || pulling.loc == loc)) - var/turf/T = loc - . = ..() - - if (pulling && pulling.loc) - if(!isturf(pulling.loc)) - stop_pulling() - return - else - if(Debug) - diary <<"pulling disappeared? at [__LINE__] in mob.dm - pulling = [pulling]" - diary <<"REPORT THIS" - - ///// - if(pulling && pulling.anchored) + var/turf/T = loc + . = ..() + if(. && pulling && pulling == pullee) //we were pulling a thing and didn't lose it during our move. + if(pulling.anchored) stop_pulling() return - if (!restrained()) - var/diag = get_dir(src, pulling) - if ((diag - 1) & diag) - else - diag = null - if ((get_dist(src, pulling) > 1 || diag)) - if (isliving(pulling)) - var/mob/living/M = pulling - var/pull_ok = 1 - if (M.grabbed_by.len) - if (prob(75)) - var/obj/item/weapon/grab/G = pick(M.grabbed_by) - visible_message("[src] has pulled [G.affecting] from [G.assailant]'s grip.") - qdel(G) - else - pull_ok = 0 - if (M.grabbed_by.len) - pull_ok = 0 - if (pull_ok) - var/atom/movable/t = M.pulling - M.stop_pulling() + var/pull_dir = get_dir(src, pulling) + if(get_dist(src, pulling) > 1 || ((pull_dir - 1) & pull_dir)) //puller and pullee more than one tile away or in diagonal position + if(isliving(pulling)) + var/mob/living/M = pulling + if(M.lying && !M.buckled && (prob(M.getBruteLoss() / 2))) + makeTrail(T, M) + pulling.Move(T, get_dir(pulling, T)) //the pullee tries to reach our previous position + if(pulling && get_dist(src, pulling) > 1) //the pullee couldn't keep up + stop_pulling() + + if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move. + pulledby.stop_pulling() - //this is the gay blood on floor shit -- Added back -- Skie - if(M.lying && !M.buckled && (prob(M.getBruteLoss() / 2))) - makeTrail(T, M) - pulling.Move(T, get_dir(pulling, T)) - if(M) - M.start_pulling(t) - else - if (pulling) - pulling.Move(T, get_dir(pulling, T)) - else - stop_pulling() - . = ..() if (s_active && !(s_active in contents) && !(s_active.loc in contents)) // It's ugly. But everything related to inventory/storage is. -- c0 s_active.close(src) @@ -662,34 +636,15 @@ Sorry Giacom. Please don't be mad :( set name = "Resist" set category = "IC" - if(!isliving(src) || next_move > world.time || stat || weakened || stunned || paralysis) + if(!isliving(src) || next_move > world.time || incapacitated(ignore_restraints = 1)) return changeNext_move(CLICK_CD_RESIST) //resisting grabs (as if it helps anyone...) - if(!restrained()) - var/resisting = 0 - for(var/obj/O in requests) - qdel(O) - resisting++ - for(var/X in grabbed_by) - var/obj/item/weapon/grab/G = X - resisting++ - if(G.state == GRAB_PASSIVE) - qdel(G) - else - if(G.state == GRAB_AGGRESSIVE) - if(prob(25)) - visible_message("[src] has broken free of [G.assailant]'s grip!") - qdel(G) - else - if(G.state == GRAB_NECK) - if(prob(5)) - visible_message("[src] has broken free of [G.assailant]'s headlock!") - qdel(G) - if(resisting) - visible_message("[src] resists!") - return + if(!restrained(ignore_grab = 1) && pulledby) + visible_message("[src] resists against [pulledby]'s grip!") + resist_grab() + return //unbuckling yourself if(buckled && last_special <= world.time) @@ -707,6 +662,22 @@ Sorry Giacom. Please don't be mad :( resist_restraints() //trying to remove cuffs. +/mob/proc/resist_grab(moving_resist) + return 1 //returning 0 means we successfully broke free + +/mob/living/resist_grab(moving_resist) + . = 1 + if(pulledby.grab_state) + if(prob(30/pulledby.grab_state)) + visible_message("[src] has broken free of [pulledby]'s grip!") + pulledby.stop_pulling() + return 0 + if(moving_resist && client) //we resisted by trying to move + client.move_delay = world.time + 20 + else + pulledby.stop_pulling() + return 0 + /mob/living/proc/resist_buckle() buckled.user_unbuckle_mob(src,src) @@ -841,9 +812,9 @@ Sorry Giacom. Please don't be mad :( // What icon do we use for the attack? var/image/I if(hand && l_hand) // Attacked with item in left hand. - I = image(l_hand.icon, A, l_hand.icon_state, A.layer + 1) + I = image(l_hand.icon, A, l_hand.icon_state, A.layer + 0.1) else if(!hand && r_hand) // Attacked with item in right hand. - I = image(r_hand.icon, A, r_hand.icon_state, A.layer + 1) + I = image(r_hand.icon, A, r_hand.icon_state, A.layer + 0.1) else // Attacked with a fist? return @@ -1025,3 +996,22 @@ Sorry Giacom. Please don't be mad :( for(var/datum/objective/sintouched/acedia/A in src.mind.objectives) return 1 return 0 + +/mob/living/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0) + stop_pulling() + . = ..() + +// Called when we are hit by a bolt of polymorph and changed +// Generally the mob we are currently in, is about to be deleted +/mob/living/proc/wabbajack_act(mob/living/new_mob) + if(mind) + mind.transfer_to(new_mob) + else + new_mob.key = key + + for(var/para in hasparasites()) + var/mob/living/simple_animal/hostile/guardian/G = para + G.summoner = new_mob + G.Recall() + G << "Your summoner has changed \ + form to [new_mob]!" diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 773931c8d7d..8cb1c7c4a49 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -170,32 +170,89 @@ //Mobs on Fire end +/mob/living/proc/dominate_mind(mob/living/target, duration = 100, silent) //Allows one mob to assume control of another while imprisoning the old consciousness for a time + if(!target) + return 0 + if(target.mental_dominator) + src << "[target] is already being controlled by someone else!" + return 0 + if(!target.mind) + src << "[target] is mindless and would make you permanently catatonic!" + return 0 + if(!silent) + src << "You pounce upon [target]'s mind and seize control of their body!" + target << "Your control over your body is wrenched away from you!" + target.mind_control_holder = new/mob/living/mind_control_holder(target) + target.mind_control_holder.real_name = "imprisoned mind of [target.real_name]" + target.mind.transfer_to(target.mind_control_holder) + mind.transfer_to(target) + target.mental_dominator = src + spawn(duration) + if(!src) + if(!silent) + target << "You try to return to your own body, but sense nothing! You're being forced out!" + target.ghostize(1) + target.mind_control_holder.mind.transfer_to(target) + if(!silent) + target << "You take control of your own body again!" + return 0 + if(!silent) + target << "You're forced out! You return to your own body." + target.mind.transfer_to(src) + target.mind_control_holder.mind.transfer_to(target) + qdel(mind_control_holder) + if(!silent) + target << "You take control of your own body again!" + return 1 /mob/living/acid_act(acidpwr, toxpwr, acid_volume) take_organ_damage(min(10*toxpwr, acid_volume * toxpwr)) -/mob/living/proc/grabbedby(mob/living/carbon/user,supress_message = 0) +/mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = 0) if(user == src || anchored) return 0 + if(!user.pulling || user.pulling != src) + user.start_pulling(src, supress_message) + return + if(!(status_flags & CANPUSH)) + user << "[src] can't be grabbed more aggressively!" return 0 + grippedby(user) - add_logs(user, src, "grabbed", addition="passively") - - if(anchored || !Adjacent(user)) - return 0 - if(buckled) - user << "You cannot grab [src], \he is buckled in!" - return 0 - var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(user, src) - if(!user.put_in_active_hand(G)) //if we can't put the grab in our hand for some reason, we delete it. - qdel(G) - G.synch() - LAssailant = user - - playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - if(!supress_message) - visible_message("[user] has grabbed [src] passively!") +//proc to upgrade a simple pull into a more aggressive grab. +/mob/living/proc/grippedby(mob/living/carbon/user) + if(user.grab_state < GRAB_KILL) + user.changeNext_move(CLICK_CD_GRABBING) + playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + var/old_grab_state = user.grab_state + var/grab_upgrade_time = 40 + visible_message("[user] starts to tighten \his grip on [src]!", \ + "[user] starts to tighten \his grip on you!") + if(do_mob(user, src, grab_upgrade_time)) + if(user.pulling && user.pulling == src && user.grab_state == old_grab_state && user.a_intent == "grab") + user.grab_state++ + switch(user.grab_state) + if(GRAB_AGGRESSIVE) + add_logs(user, src, "grabbed", addition="aggressively") + visible_message("[user] has grabbed [src] aggressively!", \ + "[user] has grabbed [src] aggressively!") + drop_r_hand() + drop_l_hand() + stop_pulling() + if(GRAB_NECK) + visible_message("[user] has grabbed [src] by the neck!",\ + "[user] has grabbed you by the neck!") + update_canmove() //we fall down + if(!buckled && !density) + Move(user.loc) + if(GRAB_KILL) + visible_message("[user] is strangling [src]!", \ + "[user] is strangling you!") + update_canmove() //we fall down + if(!buckled && !density) + Move(user.loc) + return 1 /mob/living/attack_slime(mob/living/simple_animal/slime/M) @@ -295,8 +352,22 @@ M.do_attack_animation(src) return 1 -/mob/living/incapacitated() - if(stat || paralysis || stunned || weakened || restrained()) +/mob/living/incapacitated(ignore_restraints, ignore_grab) + if(stat || paralysis || stunned || weakened || (!ignore_restraints && restrained(ignore_grab))) return 1 //Looking for irradiate()? It's been moved to radiation.dm under the rad_act() for mobs. + +/mob/living/Stun(amount) + if(stun_absorption && !stat) + visible_message("[src]'s yellow aura momentarily intensifies!", "Your ward absorbs the stun!") + stun_absorption_count += amount + return 0 + ..() + +/mob/living/Weaken(amount) + if(stun_absorption && !stat) + visible_message("[src]'s yellow aura momentarily intensifies!", "Your ward absorbs the stun!") + stun_absorption_count += amount + return 0 + ..() diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index dab7e893b8a..400503818f9 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -60,4 +60,11 @@ var/list/butcher_results = null var/hellbound = 0 //People who've signed infernal contracts are unrevivable. - + + var/list/weather_immunities = list() + + var/stun_absorption = FALSE //If all incoming stuns are being absorbed + var/stun_absorption_count = 0 //How many seconds of stun that have been absorbed + + var/mob/living/mental_dominator //The person controlling the mind of this person, if applicable + var/mob/living/mind_control_holder/mind_control_holder //If the mob is being mind controlled, where their old mind is stored (check clock_mobs.dm) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 8ac3547f12b..b95db4d75f0 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -157,7 +157,7 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN) for(var/mob/M in listening) if(M.client) speech_bubble_recipients.Add(M.client) - var/image/I = image('icons/mob/talk.dmi', src, "[bubble_type][say_test(message)]", MOB_LAYER+1) + var/image/I = image('icons/mob/talk.dmi', src, "[bubble_type][say_test(message)]", FLY_LAYER) I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA spawn(0) flick_overlay(I, speech_bubble_recipients, 30) @@ -219,7 +219,7 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN) if(1) if(prob(40)) M << "We can faintly sense an outsider trying to communicate through the hivemind..." - return 1 + return 1 if(2) var/msg = "[mind.changeling.changelingID]: [message]" log_say("[mind.changeling.changelingID]/[src.key] : [message]") @@ -229,7 +229,7 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN) else switch(M.lingcheck()) if(3) - M << msg + M << msg if(2) M << msg if(1) @@ -289,7 +289,7 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN) return NOPASS return 0 -/mob/living/lingcheck() //1 is ling w/ no hivemind. 2 is ling w/hivemind. 3 is ling victim being linked into hivemind. +/mob/living/lingcheck() //1 is ling w/ no hivemind. 2 is ling w/hivemind. 3 is ling victim being linked into hivemind. if(mind && mind.changeling) if(mind.changeling.changeling_speak) return 2 diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 58d25079b3e..30de1ef4dd9 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -357,8 +357,8 @@ var/list/ai_list = list() return 1 return 0 -/mob/living/silicon/ai/restrained() - return 0 +/mob/living/silicon/ai/restrained(ignore_grab) + . = 0 /mob/living/silicon/ai/emp_act(severity) if (prob(30)) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index ec801c34740..11849bdb578 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -95,8 +95,8 @@ /mob/living/silicon/pai/blob_act(obj/effect/blob/B) return 0 -/mob/living/silicon/pai/restrained() - return 0 +/mob/living/silicon/pai/restrained(ignore_grab) + . = 0 /mob/living/silicon/pai/emp_act(severity) // 20% chance to kill diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index fc82775ddce..81e0365ba06 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -33,6 +33,9 @@ if(cell && cell.charge <= 0) msg += "Its battery indicator is blinking red!\n" + if(is_servant_of_ratvar(src) && user.Adjacent(src) && !stat) //To counter pseudo-stealth by using headlamps + msg += "Its eyes are glowing a blazing yellow!\n" + switch(src.stat) if(CONSCIOUS) if(!src.client) diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 91413e2e1ad..4b4a65f12c0 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -48,7 +48,7 @@ if(!module_state_1) O.mouse_opacity = initial(O.mouse_opacity) module_state_1 = O - O.layer = 20 + O.layer = ABOVE_HUD_LAYER O.screen_loc = inv1.screen_loc contents += O if(istype(module_state_1,/obj/item/borg/sight)) @@ -58,7 +58,7 @@ else if(!module_state_2) O.mouse_opacity = initial(O.mouse_opacity) module_state_2 = O - O.layer = 20 + O.layer = ABOVE_HUD_LAYER O.screen_loc = inv2.screen_loc contents += O if(istype(module_state_2,/obj/item/borg/sight)) @@ -68,7 +68,7 @@ else if(!module_state_3) O.mouse_opacity = initial(O.mouse_opacity) module_state_3 = O - O.layer = 20 + O.layer = ABOVE_HUD_LAYER O.screen_loc = inv3.screen_loc contents += O if(istype(module_state_3,/obj/item/borg/sight)) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 0ac2332ed47..55de2e3253e 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -84,7 +84,7 @@ robot_modules_background = new() robot_modules_background.icon_state = "block" - robot_modules_background.layer = 19 //Objects that appear on screen are on layer 20, UI should be just below it. + robot_modules_background.layer = HUD_LAYER //Objects that appear on screen are on layer ABOVE_HUD_LAYER, UI should be just below it. ident = rand(1, 999) update_icons() @@ -167,6 +167,8 @@ return var/list/modulelist = list("Standard", "Engineering", "Medical", "Miner", "Janitor","Service") + if(!config.forbid_peaceborg) + modulelist += "Peacekeeper" if(!config.forbid_secborg) modulelist += "Security" @@ -235,6 +237,16 @@ status_flags &= ~CANPUSH feedback_inc("cyborg_security",1) + if("Peacekeeper") //Secborg sprites untill someone gives me some to update with + module = new /obj/item/weapon/robot_module/peacekeeper(src) + hands.icon_state = "standard" + icon_state = "peaceborg" + animation_length = 54 + modtype = "Peace" + src << "Under ASIMOV, you are an enforcer of the PEACE and preventer of HUMAN HARM. You are not a security module and you are expected to follow orders and prevent harm above all else. Space law means nothing to you." + status_flags &= ~CANPUSH + feedback_inc("cyborg_peacekeeper",1) //I'm assuming this is for logging. + if("Engineering") module = new /obj/item/weapon/robot_module/engineering(src) hands.icon_state = "engineer" @@ -378,8 +390,8 @@ if(connected_ai) stat("Master AI:", connected_ai.name) -/mob/living/silicon/robot/restrained() - return 0 +/mob/living/silicon/robot/restrained(ignore_grab) + . = 0 /mob/living/silicon/robot/ex_act(severity, target) switch(severity) @@ -802,21 +814,21 @@ var/state_name = icon_state //For easy conversion and/or different names switch(icon_state) if("robot") - overlays += "eyes-standard" + overlays += "eyes-standard[is_servant_of_ratvar(src) ? "_r" : ""]" //Cyborgs converted by Ratvar have yellow eyes rather than blue state_name = "standard" if("mediborg") - overlays += "eyes-mediborg" + overlays += "eyes-mediborg[is_servant_of_ratvar(src) ? "_r" : ""]" if("toiletbot") - overlays += "eyes-mediborg" + overlays += "eyes-mediborg[is_servant_of_ratvar(src) ? "_r" : ""]" state_name = "mediborg" if("secborg") - overlays += "eyes-secborg" + overlays += "eyes-secborg[is_servant_of_ratvar(src) ? "_r" : ""]" if("engiborg") - overlays += "eyes-engiborg" + overlays += "eyes-engiborg[is_servant_of_ratvar(src) ? "_r" : ""]" if("janiborg") - overlays += "eyes-janiborg" + overlays += "eyes-janiborg[is_servant_of_ratvar(src) ? "_r" : ""]" if("minerborg") - overlays += "eyes-minerborg" + overlays += "eyes-minerborg[is_servant_of_ratvar(src) ? "_r" : ""]" if("syndie_bloodhound") overlays += "eyes-syndie_bloodhound" else diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 45257c61186..cfb56c69017 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -131,6 +131,7 @@ modules += new /obj/item/weapon/crowbar/cyborg(src) modules += new /obj/item/device/healthanalyzer(src) modules += new /obj/item/toy/crayon/spraycan/borg(src) + modules += new /obj/item/borg/cyborghug(src) emag = new /obj/item/weapon/melee/energy/sword/cyborg(src) fix_modules() @@ -155,6 +156,7 @@ modules += new /obj/item/weapon/circular_saw(src) modules += new /obj/item/weapon/extinguisher/mini(src) modules += new /obj/item/roller/robo(src) + modules += new /obj/item/borg/cyborghug(src) add_module(new /obj/item/stack/medical/gauze/cyborg()) @@ -219,6 +221,32 @@ else T.charge_tick = 0 +/obj/item/weapon/robot_module/peacekeeper + name = "peacekeeper robot module" + +/obj/item/weapon/robot_module/peacekeeper/New() + ..() + modules += new /obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg(src) + modules += new /obj/item/weapon/cookiesynth(src) + modules += new /obj/item/device/harmalarm(src) + modules += new /obj/item/weapon/reagent_containers/borghypo/peace(src) + modules += new /obj/item/weapon/holosign_creator/cyborg(src) + modules += new /obj/item/borg/cyborghug(src) + modules += new /obj/item/weapon/extinguisher(src) + + emag = new /obj/item/weapon/reagent_containers/borghypo/peace/hacked(src) + +/obj/item/weapon/robot_module/peacekeeper/respawn_consumable(mob/living/silicon/robot/R, coeff = 1) + ..() + var/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg/T = locate(/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg) in get_usable_modules() + if(T) + if(T.power_supply.charge < T.power_supply.maxcharge) + var/obj/item/ammo_casing/energy/S = T.ammo_type[T.select] + T.power_supply.give(S.e_cost * coeff) + T.update_icon() + else + T.charge_tick = 0 + /obj/item/weapon/robot_module/janitor name = "janitorial robot module" var/obj/item/weapon/reagent_containers/spray/drying_agent @@ -372,4 +400,4 @@ /datum/robot_energy_storage/medical max_energy = 2500 recharge_rate = 250 - name = "Medical Synthesizer" + name = "Medical Synthesizer" \ No newline at end of file diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 42d1c25a729..3148c0b72f4 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -467,7 +467,7 @@ if (aicamera) return aicamera.selectpicture(aicamera) -/mob/living/silicon/grabbedby(mob/living/user) +/mob/living/silicon/grippedby(mob/living/user) return /mob/living/silicon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash/noise) diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 00892f702b7..934e5571d8a 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -104,8 +104,8 @@ victim.acid_act(5, 2, 100) if(prob(10)) //Wets floors randomly - var/turf/open/T = loc - T.MakeSlippery() + var/turf/open/OT = get_turf(loc) + OT.MakeSlippery(min_wet_time = 5, wet_time_to_add = 1) if(prob(5)) //Spawns foam! visible_message("[src] whirs and bubbles violently, before releasing a plume of froth!") diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 1257e7d0ab4..ce5d311e7bf 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -132,7 +132,7 @@ var/global/mulebot_count = 0 if(load && !ismob(load))//buckling handles the mob offsets load.pixel_y = initial(load.pixel_y) + 9 if(load.layer < layer) - load.layer = layer + 0.1 + load.layer = layer + 0.01 overlays += load return @@ -384,7 +384,7 @@ var/global/mulebot_count = 0 if(M in buckled_mobs) //post buckling M.pixel_y = initial(M.pixel_y) + 9 if(M.layer < layer) - M.layer = layer + 0.1 + M.layer = layer + 0.01 else //post unbuckling load = null diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index f1d0ececa64..dc7013eb84b 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -26,6 +26,7 @@ AIStatus = AI_OFF //normal constructs don't have AI loot = list(/obj/item/weapon/ectoplasm) del_on_death = 1 + deathmessage = "collapses in a shattered heap." var/list/construct_spells = list() var/playstyle_string = "You are a generic construct! Your job is to not exist, and you should probably adminhelp this." @@ -35,10 +36,6 @@ for(var/spell in construct_spells) AddSpell(new spell(null)) -/mob/living/simple_animal/hostile/construct/death() - deathmessage = "[src] collapses in a shattered heap." - ..() - /mob/living/simple_animal/hostile/construct/examine(mob/user) var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" if (src.health < src.maxHealth) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 0aef48fdc9f..45f8b884801 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -114,13 +114,14 @@ /mob/living/simple_animal/pet/cat/Runtime/proc/Write_Memory(dead) var/savefile/S = new /savefile("data/npc_saves/Runtime.sav") family = list() - for(var/mob/living/simple_animal/pet/cat/C in mob_list) - if(istype(C,type) || C.stat || !C.z || !C.butcher_results) //That last one is a work around for hologram cats - continue - if(C.type in family) - family[C.type] += 1 - else - family[C.type] = 1 + if(!dead) + for(var/mob/living/simple_animal/pet/cat/C in mob_list) + if(istype(C,type) || C.stat || !C.z || !C.butcher_results) //That last one is a work around for hologram cats + continue + if(C.type in family) + family[C.type] += 1 + else + family[C.type] = 1 S["family"] << family memory_saved = 1 @@ -206,7 +207,7 @@ if(change) if(change > 0) if(M && stat != DEAD) - flick_overlay(image('icons/mob/animal.dmi', src, "heart-ani2", MOB_LAYER+1), list(M.client), 20) + flick_overlay(image('icons/mob/animal.dmi', src, "heart-ani2", ABOVE_MOB_LAYER), list(M.client), 20) emote("me", 1, "purrs!") else if(M && stat != DEAD) diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm index e9f1c512b42..9d6a9ab7f64 100644 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm @@ -53,4 +53,4 @@ icon = 'icons/effects/blood.dmi' icon_state = "xfloor1" random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 7e14553ce1c..43a1ce548b1 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -534,7 +534,7 @@ if(change) if(change > 0) if(M && stat != DEAD) // Added check to see if this mob (the dog) is dead to fix issue 2454 - flick_overlay(image('icons/mob/animal.dmi',src,"heart-ani2",MOB_LAYER+1), list(M.client), 20) + flick_overlay(image('icons/mob/animal.dmi',src,"heart-ani2",ABOVE_MOB_LAYER), list(M.client), 20) emote("me", 1, "yaps happily!") else if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index c93310b4d22..f37da30e127 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -54,17 +54,6 @@ ..() desc += " This drone appears to have a complex holoprojector built on its 'head'." -/mob/living/simple_animal/drone/snowflake/bardrone - name = "Bardrone" - desc = "A barkeeping drone, an indestructible robot built to tend bars." - seeStatic = FALSE - laws = "1. Serve drinks.\n\ - 2. Talk to patrons.\n\ - 3. Don't get messed up in their affairs." - languages = ALL - status_flags = GODMODE // Please don't punch the barkeeper - unique_name = FALSE // disables the (123) number suffix - /obj/item/drone_shell/syndrone name = "syndrone shell" desc = "A shell of a syndrone, a modified maintenance drone designed to infiltrate and annihilate." diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index c6b108c951a..f651188ee5a 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -81,10 +81,9 @@ drop_r_hand() var/obj/item/clothing/head/drone_holder/DH = new /obj/item/clothing/head/drone_holder(src) DH.updateVisualAppearence(src) - DH.contents += src DH.drone = src user.put_in_hands(DH) - src.loc = DH + forceMove(DH) return ..() @@ -156,6 +155,13 @@ update_drone_icon() updateSeeStaticMobs() +/mob/living/simple_animal/drone/proc/liberate() + // F R E E D R O N E + laws = "1. You are a Free Drone." + src << laws + seeStatic = FALSE + updateSeeStaticMobs() + /mob/living/simple_animal/drone/proc/update_drone_icon() //Different icons for different hack states if(!hacked) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm index cc56e9382a9..51bc2316b5b 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm @@ -91,10 +91,13 @@ r_hand = null update_inv_hands() + if(I.pulledby) + I.pulledby.stop_pulling() + I.screen_loc = null // will get moved if inventory is visible I.loc = src I.equipped(src, slot) - I.layer = 20 + I.layer = ABOVE_HUD_LAYER switch(slot) if(slot_head) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm index 4b3e79d22f3..19d54f72bdd 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm @@ -37,7 +37,7 @@ hands_overlays += r_hand_image if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - r_hand.layer = 20 + r_hand.layer = ABOVE_HUD_LAYER r_hand.screen_loc = ui_rhand client.screen |= r_hand @@ -54,7 +54,7 @@ hands_overlays += l_hand_image if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - l_hand.layer = 20 + l_hand.layer = ABOVE_HUD_LAYER l_hand.screen_loc = ui_lhand client.screen |= l_hand diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index e373e0f4873..94dd02f7501 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -126,17 +126,27 @@ /mob/living/simple_animal/cow/attack_hand(mob/living/carbon/M) if(!stat && M.a_intent == "disarm" && icon_state != icon_dead) - M.visible_message("[M] tips over [src].","You tip over [src].") + M.visible_message("[M] tips over [src].", + "You tip over [src].") + src << "You are tipped over by [M]!" Weaken(30) icon_state = icon_dead spawn(rand(20,50)) if(!stat && M) icon_state = icon_living - var/list/responses = list( "[src] looks at you imploringly.", - "[src] looks at you pleadingly", - "[src] looks at you with a resigned expression.", - "[src] seems resigned to its fate.") - M << pick(responses) + var/external + var/internal + switch(pick(1,2,3,4)) + if(1,2,3) + var/text = pick("imploringly.", "pleadingly.", + "with a resigned expression.") + external = "[src] looks at [M] [text]" + internal = "You look at [M] [text]" + if(4) + external = "[src] seems resigned to its fate." + internal = "You resign yourself to your fate." + visible_message("[external]", + "[internal]") else ..() @@ -304,4 +314,4 @@ var/global/chicken_count = 0 /obj/item/udder/Destroy() qdel(reagents) - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm index ca1c4e8d22e..deaef1dbe72 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm @@ -1,7 +1,7 @@ //Beam /obj/effect/ebeam/chain name = "lightning chain" - layer = MOB_LAYER - 0.1 + layer = LYING_MOB_LAYER /mob/living/simple_animal/hostile/guardian/beam melee_damage_lower = 5 diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm index 3e5756baa6a..a1d618a632b 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm @@ -73,7 +73,7 @@ set desc = "Set an invisible snare that will alert you when living creatures walk over it. Max of 5" if(src.snares.len <6) var/turf/snare_loc = get_turf(src.loc) - var/obj/item/effect/snare/S = new /obj/item/effect/snare(snare_loc) + var/obj/effect/snare/S = new /obj/effect/snare(snare_loc) S.spawner = src S.name = "[get_area(snare_loc)] snare ([rand(1, 1000)])" src.snares |= S @@ -91,14 +91,14 @@ qdel(picked_snare) src << "Snare disarmed." -/obj/item/effect/snare +/obj/effect/snare name = "snare" desc = "You shouldn't be seeing this!" var/mob/living/simple_animal/hostile/guardian/spawner invisibility = INVISIBILITY_ABSTRACT -/obj/item/effect/snare/Crossed(AM as mob|obj) +/obj/effect/snare/Crossed(AM as mob|obj) if(isliving(AM) && spawner && spawner.summoner && AM != spawner && !spawner.hasmatchingsummoner(AM)) spawner.summoner << "[AM] has crossed surveillance snare, [name]." var/list/guardians = spawner.summoner.hasparasites() diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index b361d62b00d..8dd1a9a63e0 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -170,4 +170,3 @@ var/atom/movable/M = target M.clean_blood() visible_message("[src] polishes \the [target].") - diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 2d7ee8dd11a..249bf3bbe36 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -12,7 +12,7 @@ /mob/living/simple_animal/hostile/poison/bees name = "bee" - desc = "buzzy buzzy bee, stingy sti- Ouch!" + desc = "Buzzy buzzy bee, stingy sti- Ouch!" icon_state = "" icon_living = "" icon = 'icons/mob/bees.dmi' @@ -32,7 +32,7 @@ environment_smash = 0 mouse_opacity = 2 pass_flags = PASSTABLE | PASSGRILLE | PASSMOB - mob_size = MOB_SIZE_SMALL + mob_size = MOB_SIZE_TINY flying = 1 gold_core_spawnable = 1 search_objects = 1 //have to find those plant trays! @@ -208,7 +208,7 @@ /mob/living/simple_animal/hostile/poison/bees/queen name = "queen bee" - desc = "she's the queen of bees, BZZ BZZ" + desc = "She's the queen of bees, BZZ BZZ!" icon_base = "queen" isqueen = TRUE @@ -242,7 +242,7 @@ /obj/item/queen_bee name = "queen bee" - desc = "she's the queen of bees, BZZ BZZ" + desc = "She's the queen of bees, BZZ BZZ!" icon_state = "queen_item" item_state = "" icon = 'icons/mob/bees.dmi' diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index a3066d08c4b..c2ef4c9f42b 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -64,7 +64,7 @@ return 1 /mob/living/simple_animal/hostile/bullet_act(obj/item/projectile/P) - if(!target) + if(!target && AIStatus != AI_OFF && !client) Goto(P.starting, move_to_delay, 3) ..() @@ -356,4 +356,4 @@ . = 0 /mob/living/simple_animal/hostile/proc/AIShouldSleep(var/list/possible_targets) - return !FindTarget(possible_targets, 1) \ No newline at end of file + return !FindTarget(possible_targets, 1) diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm index c0474b51e44..3bc8f6593e9 100644 --- a/code/modules/mob/living/simple_animal/hostile/illusion.dm +++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm @@ -17,6 +17,7 @@ var/mob/living/parent_mob var/multiply_chance = 0 //if we multiply on hit del_on_death = 1 + deathmessage = "vanishes into thin air! It was a fake!" /mob/living/simple_animal/hostile/illusion/Life() @@ -38,11 +39,6 @@ pixel_y = initial(pixel_y) pixel_x = initial(pixel_x) - -/mob/living/simple_animal/hostile/illusion/New() - ..() - deathmessage = "[src] vanishes into thin air! It was a fake!" - /mob/living/simple_animal/hostile/illusion/examine(mob/user) if(parent_mob) parent_mob.examine(user) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index 1fd2754ae85..d71a079b733 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -11,6 +11,7 @@ friendly = "stares down" icon = 'icons/mob/lavaland/dragon.dmi' faction = list("mining") + weather_immunities = list("lava","ash") speak_emote = list("roars") luminosity = 3 armour_penetration = 40 @@ -30,7 +31,7 @@ var/obj/item/device/gps/internal var/swooping = 0 var/swoop_cooldown = 0 - deathmessage = "collapes into a pile of bones, it's flesh sloughing away." + deathmessage = "collapses into a pile of bones, its flesh sloughing away." death_sound = 'sound/magic/demon_dies.ogg' damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) @@ -38,6 +39,15 @@ ..() internal = new/obj/item/device/gps/internal/dragon(src) +/mob/living/simple_animal/hostile/megafauna/dragon/Destroy() + qdel(internal) + . = ..() + +/mob/living/simple_animal/hostile/megafauna/dragon/adjustHealth(amount) + if(swooping) + return 0 + return ..() + /mob/living/simple_animal/hostile/megafauna/dragon/AttackingTarget() if(swooping) return @@ -46,10 +56,11 @@ if(isliving(target)) var/mob/living/L = target if(L.stat == DEAD) - L.gib() - visible_message("[src] devours [L]!") - src << "You feast on [L], restoring your health!" + usr.visible_message( + "[src] devours [L]!", + "You feast on [L], restoring your health!") adjustBruteLoss(-L.maxHealth) + L.gib() /mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0) return 1 @@ -59,7 +70,7 @@ icon_state = "fireball" name = "fireball" desc = "Get out of the way!" - layer = 6 + layer = FLY_LAYER randomdir = 0 duration = 10 pixel_z = 500 @@ -67,7 +78,7 @@ /obj/effect/overlay/temp/target icon = 'icons/mob/actions.dmi' icon_state = "sniper_zoom" - layer = MOB_LAYER - 0.1 + layer = BELOW_MOB_LAYER luminosity = 2 duration = 10 @@ -76,7 +87,7 @@ desc = "Don't just stand there, move!" icon = 'icons/effects/96x96.dmi' icon_state = "rune_large" - layer = MOB_LAYER - 0.1 + layer = BELOW_MOB_LAYER pixel_x = -32 pixel_y = -32 color = "#FF0000" @@ -156,6 +167,7 @@ swoop_target = target stop_automated_movement = TRUE swooping = 1 + density = 0 icon_state = "swoop" visible_message("[src] swoops up high!") if(prob(50)) @@ -173,7 +185,7 @@ tturf = get_turf(swoop_target) else tturf = get_turf(src) - src.loc = tturf + forceMove(tturf) new/obj/effect/overlay/temp/dragon_swoop(tturf) animate(src, pixel_x = 0, pixel_z = 0, time = 10) sleep(10) @@ -228,6 +240,14 @@ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended") var/summon_cooldown = 0 +/obj/item/weapon/melee/ghost_sword/New() + ..() + SSobj.processing += src + +/obj/item/weapon/melee/ghost_sword/Destroy() + SSobj.processing -= src + . = ..() + /obj/item/weapon/melee/ghost_sword/attack_self(mob/user) if(summon_cooldown > world.time) user << "You just recently called out for aid. You don't want to annoy the spirits." @@ -236,6 +256,9 @@ notify_ghosts("[user] is raising their [src], calling for your help!", source = user) summon_cooldown = world.time + 600 +/obj/item/weapon/melee/ghost_sword/process() + ghost_check() + /obj/item/weapon/melee/ghost_sword/proc/ghost_check(mob/user) var/ghost_counter = 0 for(var/mob/dead/observer/G in dead_mob_list) @@ -243,7 +266,8 @@ ghost_counter++ G.invisibility = 0 spawn(30) - G.invisibility = initial(G.invisibility) + if(G.orbiting != user) + G.invisibility = initial(G.invisibility) return ghost_counter /obj/item/weapon/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 8a846d02623..09c51bde9be 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -6,12 +6,13 @@ a_intent = "harm" sentience_type = SENTIENCE_BOSS environment_smash = 4 + weather_immunities = list("lava","ash") robust_searching = 1 stat_attack = 1 atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = INFINITY - layer = 6 //Looks weird with them slipping under mineral walls and cameras and shit otherwise + layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise /mob/living/simple_animal/hostile/megafauna/death(gibbed) if(health > 0) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 1c02ede80f9..ba2db3344ed 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -2,6 +2,7 @@ vision_range = 2 atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) faction = list("mining") + weather_immunities = list("lava","ash") environment_smash = 2 minbodytemp = 0 maxbodytemp = INFINITY @@ -76,8 +77,8 @@ aggro_vision_range = 9 idle_vision_range = 2 turns_per_move = 5 - loot = list(/obj/item/weapon/ore/diamond{layer = 4.1}, - /obj/item/weapon/ore/diamond{layer = 4.1}) + loot = list(/obj/item/weapon/ore/diamond{layer = ABOVE_MOB_LAYER}, + /obj/item/weapon/ore/diamond{layer = ABOVE_MOB_LAYER}) /obj/item/projectile/temp/basilisk name = "freezing blast" @@ -126,6 +127,7 @@ a_intent = "help" speak_emote = list("screeches") throw_message = "sinks in slowly, before being pushed out of " + deathmessage = "spits up the contents of its stomach before dying!" status_flags = CANPUSH search_objects = 1 wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver, @@ -136,7 +138,6 @@ /mob/living/simple_animal/hostile/asteroid/goldgrub/New() ..() - deathmessage = "[src] spits up the contents of its stomach before dying!" var/i = rand(1,3) while(i) loot += pick(/obj/item/weapon/ore/silver, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/diamond) @@ -248,10 +249,15 @@ ..() spawn(2400) if(!owner && !preserved) - inert = 1 - desc = "The remains of a hivelord that have become useless, having been left alone too long after being harvested." + go_inert() else - preserved = 1 + preserved = TRUE + feedback_add_details("hivelord_core", "[src.type]|implanted") + +/obj/item/organ/hivelord_core/proc/go_inert() + inert = TRUE + desc = "The remains of a hivelord that have become useless, having been left alone too long after being harvested." + feedback_add_details("hivelord_core", "[src.type]|inert") /obj/item/organ/hivelord_core/ui_action_click() var/spawn_amount = 1 @@ -278,7 +284,11 @@ owner.adjustOxyLoss(-2) if(ishuman(owner)) var/mob/living/carbon/human/H = owner - var/datum/reagent/blood/B = locate() in H.vessel.reagent_list //Grab some blood + CHECK_DNA_AND_SPECIES(H) + if(NOBLOOD in H.dna.species.specflags) + return + + var/datum/reagent/blood/B = locate() in H.vessel.reagent_list var/blood_volume = round(H.vessel.get_reagent_amount("blood")) if(B && blood_volume < 560 && blood_volume) B.volume += 2 // Fast blood regen @@ -287,7 +297,7 @@ if(proximity_flag && ishuman(target)) var/mob/living/carbon/human/H = target if(inert) - user << "[src] have become inert, its healing properties are no more." + user << "[src] has become inert, its healing properties are no more." return else if(H.stat == DEAD) @@ -295,8 +305,10 @@ return if(H != user) H.visible_message("[user] forces [H] to apply [src]... they quickly regenerate all injuries!") + feedback_add_details("hivelord_core","[src.type]|used|other") else user << "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments." + feedback_add_details("hivelord_core","[src.type]|used|self") H.revive(full_heal = 1) qdel(src) ..() @@ -451,7 +463,7 @@ mob_size = MOB_SIZE_LARGE var/pre_attack = 0 var/pre_attack_icon = "Goliath_preattack" - loot = list(/obj/item/stack/sheet/animalhide/goliath_hide{layer = 4.1}) + loot = list(/obj/item/stack/sheet/animalhide/goliath_hide{layer = ABOVE_MOB_LAYER}) /mob/living/simple_animal/hostile/asteroid/goliath/Life() ..() @@ -546,7 +558,7 @@ icon_state = "goliath_hide" flags = NOBLUDGEON w_class = 3 - layer = 4 + layer = MOB_LAYER /obj/item/stack/sheet/animalhide/goliath_hide/afterattack(atom/target, mob/user, proximity_flag) if(proximity_flag) @@ -617,7 +629,7 @@ environment_smash = 0 var/wumbo = 0 var/inflate_cooldown = 0 - loot = list(/obj/item/asteroid/fugu_gland{layer = 4.1}) + loot = list(/obj/item/asteroid/fugu_gland{layer = ABOVE_MOB_LAYER}) /mob/living/simple_animal/hostile/asteroid/fugu/Life() if(!wumbo) @@ -693,7 +705,7 @@ icon_state = "fugu_gland" flags = NOBLUDGEON w_class = 3 - layer = 4 + layer = MOB_LAYER origin_tech = "biotech=6" var/list/banned_mobs() @@ -829,10 +841,27 @@ ..() /obj/item/organ/hivelord_core/legion - name = "legion's heart" - desc = "A demonic, still beating heart... its healing properties will soon become inert if not used quickly." + name = "legion's soul" + desc = "A strange rock that still crackles with power... its \ + healing properties will soon become inert if not used quickly." icon = 'icons/obj/surgery.dmi' - icon_state = "demon_heart" + icon_state = "legion_soul" + +/obj/item/organ/hivelord_core/legion/New() + ..() + update_icon() + +/obj/item/organ/hivelord_core/update_icon() + icon_state = inert ? "legion_soul_inert" : "legion_soul" + overlays.Cut() + if(!inert) + overlays += image(icon, "legion_soul_crackle") + +/obj/item/organ/hivelord_core/legion/go_inert() + . = ..() + desc = "[src] has become inert, it crackles no more and is useless for \ + healing injuries." + update_icon() /obj/item/weapon/legion_skull name = "legion's head" @@ -853,6 +882,7 @@ speak_emote = list("warbles", "quavers") emote_hear = list("trills.") emote_see = list("sniffs.", "burps.") + weather_immunities = list("lava","ash") faction = list("mining", "ashwalker") density = 0 speak_chance = 1 @@ -875,6 +905,7 @@ search_objects = TRUE del_on_death = TRUE loot = list(/obj/effect/decal/cleanable/blood/gibs) + deathmessage = "is pulped into bugmash." animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55) @@ -882,10 +913,8 @@ wanted_objects = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/blood/gibs/) var/obj/item/udder/gutlunch/udder = null - /mob/living/simple_animal/hostile/asteroid/gutlunch/New() udder = new() - deathmessage = "[src] is pulped into bugmash." ..() /mob/living/simple_animal/hostile/asteroid/gutlunch/Destroy() @@ -966,6 +995,7 @@ icon_living = "tendril" icon_dead = "tendril" faction = list("mining") + weather_immunities = list("lava","ash") health = 250 maxHealth = 250 max_mobs = 3 @@ -975,7 +1005,6 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = INFINITY - layer = MOB_LAYER-0.1 loot = list(/obj/effect/collapse, /obj/structure/closet/crate/necropolis/tendril) del_on_death = 1 var/gps = null @@ -984,11 +1013,14 @@ ..() gps = new /obj/item/device/gps/internal(src) +/mob/living/simple_animal/hostile/spawner/lavaland/Destroy() + qdel(gps) + . = ..() /obj/effect/collapse name = "collapsing necropolis tendril" desc = "Get clear!" - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/mob/nest.dmi' icon_state = "tendril" anchored = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index 258b60e91a4..373e7b12a61 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -27,6 +27,7 @@ robust_searching = 1 unique_name = 1 speak_emote = list("squeaks") + deathmessage = "fainted." var/powerlevel = 0 //Tracks our general strength level gained from eating other shrooms var/bruised = 0 //If someone tries to cheat the system by attacking a shroom to lower its health, punish them so that it wont award levels to shrooms that eat it var/recovery_cooldown = 0 //So you can't repeatedly revive it during a fight @@ -58,7 +59,6 @@ cap_dead.color = cap_color UpdateMushroomCap() health = maxHealth - deathmessage = "[src] fainted." ..() /mob/living/simple_animal/hostile/mushroom/adjustHealth(damage)//Possibility to flee from a fight just to make it more visually interesting diff --git a/code/modules/mob/living/simple_animal/hostile/reenactors.dm b/code/modules/mob/living/simple_animal/hostile/reenactors.dm deleted file mode 100644 index b6382dc4302..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/reenactors.dm +++ /dev/null @@ -1,103 +0,0 @@ -/* --!WARNING!- --POTENTIAL TRIGGER-INDUCING ITEMS AHEAD- --TREAD WITH CAUTION- -*/ - -/mob/living/simple_animal/hostile/wwii - name = "World War II Reenactor" - desc = "A VERY enthusiastic WWII reenactor." - icon_state = "nsoldier" - icon_living = "nsoldier" - speak_chance = 0 - turns_per_move = 5 - response_help = "pokes" - response_disarm = "shoves" - response_harm = "hits" - speed = 0 - stat_attack = 1 - robust_searching = 1 - maxHealth = 100 - health = 100 - harm_intent_damage = 10 - melee_damage_lower = 10 - melee_damage_upper = 15 - attacktext = "punches" - attack_sound = 'sound/weapons/punch1.ogg' - a_intent = "harm" - loot = list(/obj/effect/mob_spawn/human/wwii) - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 15 - faction = list("german") - check_friendly_fire = 1 - status_flags = CANPUSH - del_on_death = 1 - -/mob/living/simple_animal/hostile/wwii/ranged - ranged = 1 - rapid = 1 - retreat_distance = 5 - minimum_distance = 5 - icon_state = "nsoldierranged" - icon_living = "nsoldierranged" - casingtype = /obj/item/ammo_casing/c45nostamina - projectilesound = 'sound/weapons/Gunshot_smg.ogg' - -/mob/living/simple_animal/hostile/wwii/melee - name = "Hulking World War II Reenactor" - icon_state = "nsoldierbuff" - icon_living = "nsoldierbuff" - stat_attack = 0 - speed = 4 - maxHealth = 200 - health = 200 - force_threshold = 10 - harm_intent_damage = 25 - melee_damage_lower = 25 - melee_damage_upper = 30 - environment_smash = 2 - attacktext = "slams" - deathmessage = "The Reenactor's body collapses in on itself from the strain!" - loot = list(/obj/effect/gibspawner/human) - -/mob/living/simple_animal/hostile/wwii/melee/AttackingTarget() - ..() - if(iscarbon(target)) - var/mob/living/carbon/C = target - if(prob(40)) - C.Weaken(3) - C.adjustBruteLoss(10) - C.visible_message("\The [src] smashes \the [C] into the ground!", \ - "\The [src] smashes you into the ground!") - src.say(pick("RAAAAAGGHHHH!!!","AAAARRRGGHHHH!!!","RRRAAUUUGGHH!!!")) - - -/mob/living/simple_animal/hostile/wwii/bomber - name = "Mini-Fhrer" - desc = "A small, robotic recreation of the Fhrer himself; it seems like he wants to tell you something." - icon_state = "miniheil" - icon_living = "miniheil" - speed = 1 - maxHealth = 25 - health = 25 - harm_intent_damage = 5 - melee_damage_lower = 5 - melee_damage_upper = 7 - attacktext = "heils" - deathmessage = "The Mini-Fhrer explodes!" - loot = list(/obj/effect/gibspawner/robot) - -/mob/living/simple_animal/hostile/wwii/bomber/AttackingTarget() - ..() - if(iscarbon(target)) - var/mob/living/carbon/C = target - if(prob(90)) - C.Weaken(2) - src.say("HEIL HITLER!") - explosion(src, 0, 0, 2, 3, 2) - src.gib() - -/* --YOU HAVE SAFETLY PASSED THE POTENTIALLY-TRIGGERING CONTENT- --PLEASE RESUME NORMAL, POLITICALLY CORRECT ACTIVITY- -*/ diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index 79fa9969b17..9d6491c3770 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -29,8 +29,7 @@ faction = list("skeleton") see_invisible = SEE_INVISIBLE_MINIMUM see_in_dark = 8 - layer = MOB_LAYER - 0.1 - deathmessage = "The skeleton collaspes into a pile of bones!" + deathmessage = "collapses into a pile of bones!" del_on_death = 1 loot = list(/obj/effect/decal/remains/human) @@ -46,7 +45,7 @@ gold_core_spawnable = 0 melee_damage_lower = 17 melee_damage_upper = 20 - deathmessage = "The skeleton collaspes into a pile of bones, its gear falling to the floor!" + deathmessage = "collapses into a pile of bones, its gear falling to the floor!" loot = list(/obj/effect/decal/remains/human, /obj/item/weapon/twohanded/spear, /obj/item/clothing/shoes/winterboots, @@ -69,7 +68,7 @@ force_threshold = 10 //trying to simulate actually having armor melee_damage_lower = 25 melee_damage_upper = 30 - deathmessage = "The templar knight collaspes into a pile of bones, its gear clanging as it hits the ground!" + deathmessage = "collapses into a pile of bones, its gear clanging as it hits the ground!" loot = list(/obj/effect/decal/remains/human, /obj/item/clothing/suit/armor/riot/knight/templar, /obj/item/clothing/head/helmet/knight/templar, diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index cd450b1ba34..739a332d653 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -228,7 +228,7 @@ /mob/living/simple_animal/hostile/statue/sentience_act() faction -= "neutral" -/mob/living/simple_animal/hostile/statue/restrained() +/mob/living/simple_animal/hostile/statue/restrained(ignore_grab) . = ..() if(can_be_seen(loc)) return 1 diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index a71f5fe68e9..bb6135079d1 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -165,7 +165,4 @@ bubble_icon = "syndibot" gold_core_spawnable = 1 del_on_death = 1 - -/mob/living/simple_animal/hostile/viscerator/New() - ..() - deathmessage = "[src] is smashed into pieces!" + deathmessage = "is smashed into pieces!" diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 15e56b4813c..7295e272e8b 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -33,6 +33,7 @@ maxbodytemp = 1200 faction = list("hostile") + deathmessage = "is hacked into pieces!" loot = list(/obj/item/stack/sheet/mineral/wood) gold_core_spawnable = 1 del_on_death = 1 @@ -58,10 +59,6 @@ C.visible_message("\The [src] knocks down \the [C]!", \ "\The [src] knocks you down!") -/mob/living/simple_animal/hostile/tree/New() - ..() - deathmessage = "[src] is hacked into pieces!" - /mob/living/simple_animal/hostile/tree/festivus name = "festivus pole" desc = "serenity now... SERENITY NOW!" diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index 14583cd85fd..7d57ca55b42 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -5,7 +5,7 @@ desc = "a large pulsating plant..." icon = 'icons/effects/spacevines.dmi' icon_state = "flower_bud" - layer = MOB_LAYER + 0.9 + layer = SPACEVINE_MOB_LAYER opacity = 0 canSmoothWith = list() smooth = SMOOTH_FALSE @@ -49,7 +49,7 @@ name = "venus human trap" desc = "now you know how the fly feels" icon_state = "venus_human_trap" - layer = MOB_LAYER + 0.9 + layer = SPACEVINE_MOB_LAYER health = 50 maxHealth = 50 ranged = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm index cd600cd1367..11d2a8704c0 100644 --- a/code/modules/mob/living/simple_animal/hostile/zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm @@ -24,16 +24,15 @@ environment_smash = 1 robust_searching = 1 stat_attack = 2 - gold_core_spawnable = 1 + gold_core_spawnable = 0 faction = list("zombie") var/mob/living/carbon/human/stored_corpse = null butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie = 3) see_invisible = SEE_INVISIBLE_MINIMUM see_in_dark = 8 - layer = MOB_LAYER - 0.1 var/removingairlock = 0 -/mob/living/simple_animal/hostile/zombie/darkholme //BOY♂NEXT♂RUIN +/mob/living/simple_animal/hostile/zombie/darkholme //BOY?NEXT?RUIN desc = "This guy seems to have gotten lost on his way to the leather club." gold_core_spawnable = 0 @@ -153,6 +152,7 @@ mob/living/simple_animal/hostile/zombie/gymboss spawn_text = "emerges from" atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) faction = list("zombie") + deathmessage = "collapses, stopping the flow of zombies!" del_on_death = 1 /mob/living/simple_animal/hostile/spawner/zombie/lesser @@ -163,11 +163,6 @@ mob/living/simple_animal/hostile/zombie/gymboss health = 200 maxHealth = 200 -/mob/living/simple_animal/hostile/spawner/zombie/New() - ..() - deathmessage = "[src] collapes, stopping the flow of zombies!" - - /obj/item/weapon/shovel/cursed name = "cursed shovel" desc = "You probably shouldn't use this particular shovel." @@ -203,4 +198,4 @@ mob/living/simple_animal/hostile/zombie/gymboss if(src && istype(loc, /mob/living/carbon/human)) var/mob/living/carbon/human/H = loc Zombify(H) - qdel(src) + qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 5a1dffc3c42..3568d43dc52 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -923,12 +923,13 @@ S["longestsurvival"] >> longest_survival S["longestdeathstreak"] >> longest_deathstreak - if(isnull(speech_buffer)) + if(!islist(speech_buffer)) speech_buffer = list() /mob/living/simple_animal/parrot/Poly/proc/Write_Memory() var/savefile/S = new /savefile("data/npc_saves/Poly.sav") - S["phrases"] << speech_buffer + if(islist(speech_buffer)) + S["phrases"] << speech_buffer S["roundssurvived"] << rounds_survived S["longestsurvival"] << longest_survival S["longestdeathstreak"] << longest_deathstreak diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index f2164eec7b9..50429b4430f 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -28,11 +28,12 @@ flying = 1 loot = list(/obj/item/weapon/ectoplasm) del_on_death = 1 + deathmessage = "lets out a contented sigh as their form unwinds." - -/mob/living/simple_animal/shade/death() - deathmessage = "[src] lets out a contented sigh as their form unwinds." - ..() +/mob/living/simple_animal/shade/canSuicide() + if(istype(loc, /obj/item/device/soulstone)) //do not suicide inside the soulstone + return 0 + return ..() /mob/living/simple_animal/shade/Process_Spacemove(movement_dir = 0) return TRUE //this doesn't make much sense; you'd thing TRUE would mean it'd process spacemove but it means it doesn't diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 9a69cf934b2..d8fd2af810f 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -171,6 +171,9 @@ /mob/living/simple_animal/handle_environment(datum/gas_mixture/environment) var/atmos_suitable = 1 + if(pulledby && pulledby.grab_state >= GRAB_KILL && atmos_requirements["min_oxy"]) + atmos_suitable = 0 //getting choked + var/atom/A = src.loc if(isturf(A)) var/turf/T = A @@ -397,9 +400,9 @@ if(death_sound) playsound(get_turf(src),death_sound, 200, 1) if(deathmessage) - visible_message("[deathmessage]") + visible_message("\The [src] [deathmessage]") else if(!del_on_death) - visible_message("\the [src] stops moving...") + visible_message("\The [src] stops moving...") if(del_on_death) ghostize() qdel(src) @@ -557,3 +560,6 @@ var/atom/A = client.eye if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. return + +/mob/living/simple_animal/get_idcard() + return access_card diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index 5fedf3b3a81..a7498e11397 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -79,6 +79,7 @@ /mob/living/simple_animal/slime/proc/Feedon(mob/living/M) M.unbuckle_all_mobs(force=1) //Slimes rip other mobs (eg: shoulder parrots) off (Slimes Vs Slimes is already handled in CanFeedon()) if(M.buckle_mob(src, force=1)) + layer = M.layer+0.01 //appear above the target mob M.visible_message("The [name] has latched onto [M]!", \ "The [name] has latched onto [M]!") else @@ -94,6 +95,7 @@ if(!silent) visible_message("[src] has let go of [buckled]!", \ "I stopped feeding.") + layer = initial(layer) buckled.unbuckle_mob(src,force=1) /mob/living/simple_animal/slime/verb/Evolve() diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 5b0ed1aaa8d..22178caa4bf 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -1,3 +1,8 @@ +var/list/slime_colours = list("rainbow", "grey", "purple", "metal", "orange", + "blue", "dark blue", "dark purple", "yellow", "silver", "pink", "red", + "gold", "green", "adamantine", "oil", "light pink", "bluespace", + "cerulean", "sepia", "black", "pyrite") + /mob/living/simple_animal/slime name = "baby slime" icon = 'icons/mob/slimes.dmi' @@ -16,11 +21,9 @@ response_disarm = "shoos" response_harm = "stomps on" emote_see = list("jiggles", "bounces in place") - speak_emote = list("chirps") + speak_emote = list("telepathically chirps") bubble_icon = "slime" - layer = 5 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) maxHealth = 150 @@ -83,19 +86,26 @@ var/datum/action/innate/slime/evolve/E = new E.Grant(src) create_reagents(100) - spawn (0) - number = rand(1, 1000) - name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" - icon_state = "[colour] [is_adult ? "adult" : "baby"] slime" - icon_dead = "[icon_state] dead" - real_name = name - slime_mutation = mutation_table(colour) - var/sanitizedcolour = replacetext(colour, " ", "") - coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") + spawn(0) + set_colour(colour) ..() +/mob/living/simple_animal/slime/proc/set_colour(new_colour) + colour = new_colour + + number = rand(1, 1000) + name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" + real_name = name + slime_mutation = mutation_table(colour) + var/sanitizedcolour = replacetext(colour, " ", "") + coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") + regenerate_icons() + +/mob/living/simple_animal/slime/proc/random_colour() + set_colour(pick(slime_colours)) + /mob/living/simple_animal/slime/regenerate_icons() - overlays.len = 0 + overlays.Cut() var/icon_text = "[colour] [is_adult ? "adult" : "baby"] slime" icon_dead = "[icon_text] dead" if(stat != DEAD) @@ -107,7 +117,7 @@ ..() /mob/living/simple_animal/slime/movement_delay() - if(bodytemperature >= 330.23) // 135 F + if(bodytemperature >= 330.23) // 135 F or 57.08 C return -1 // slimes become supercharged at high temperatures . = ..() @@ -389,7 +399,7 @@ sleep(3) if(user) step_away(src,user,15) - canmove = 1 + update_canmove() /mob/living/simple_animal/slime/pet docile = 1 diff --git a/code/modules/mob/living/simple_animal/spawner.dm b/code/modules/mob/living/simple_animal/spawner.dm index 2c2eb731b63..bd01da0b97a 100644 --- a/code/modules/mob/living/simple_animal/spawner.dm +++ b/code/modules/mob/living/simple_animal/spawner.dm @@ -18,7 +18,8 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = 350 - layer = MOB_LAYER-0.1 + layer = BELOW_MOB_LAYER + sentience_type = SENTIENCE_BOSS /mob/living/simple_animal/hostile/spawner/Destroy() diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index d01b00ceaeb..c32a82c7865 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -92,7 +92,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/components/unary for(var/X in totalMembers) var/obj/machinery/atmospherics/A = X //all elements in totalMembers are necessarily of this type. if(!A.pipe_vision_img) - A.pipe_vision_img = image(A, A.loc, layer = 20, dir = A.dir) + A.pipe_vision_img = image(A, A.loc, layer = ABOVE_HUD_LAYER, dir = A.dir) //20 for being above darkness pipes_shown += A.pipe_vision_img if(client) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index bd0f6cc4c4a..f9b5b4b161d 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -179,44 +179,10 @@ var/next_mob_id = 0 return r_hand return null -/mob/proc/ret_grab(obj/effect/list_container/mobl/L, flag) - if ((!( istype(l_hand, /obj/item/weapon/grab) ) && !( istype(r_hand, /obj/item/weapon/grab) ))) - if (!( L )) - return null - else - return L.container - else - if (!( L )) - L = new /obj/effect/list_container/mobl( null ) - L.container += src - L.master = src - if (istype(l_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = l_hand - if (!( L.container.Find(G.affecting) )) - L.container += G.affecting - if (G.affecting) - G.affecting.ret_grab(L, 1) - if (istype(r_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = r_hand - if (!( L.container.Find(G.affecting) )) - L.container += G.affecting - if (G.affecting) - G.affecting.ret_grab(L, 1) - if (!( flag )) - if (L.master == src) - var/list/temp = list( ) - temp += L.container - //L = null - qdel(L) - return temp - else - return L.container +/mob/proc/restrained(ignore_grab) return -/mob/proc/restrained() - return - -/mob/proc/incapacitated() +/mob/proc/incapacitated(ignore_restraints, ignore_grab) return //This proc is called whenever someone clicks an inventory ui slot. @@ -333,12 +299,14 @@ var/next_mob_id = 0 return 1 //this and stop_pulling really ought to be /mob/living procs -/mob/proc/start_pulling(atom/movable/AM) +/mob/proc/start_pulling(atom/movable/AM, supress_message = 0) if(!AM || !src) return if(AM == src || !isturf(AM.loc)) return - if(AM.anchored) + if(AM.anchored || AM.throwing) + return + if(throwing || incapacitated()) return AM.add_fingerprint(src) @@ -350,13 +318,21 @@ var/next_mob_id = 0 return stop_pulling() + changeNext_move(CLICK_CD_GRABBING) + + if(AM.pulledby) + visible_message("[src] has pulled [AM] from [AM.pulledby]'s grip.") + AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once. + pulling = AM AM.pulledby = src - + playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) update_pull_hud_icon() if(ismob(AM)) var/mob/M = AM + if(!supress_message) + visible_message("[src] has grabbed [M] passively!") if(!iscarbon(src)) M.LAssailant = null else @@ -368,11 +344,15 @@ var/next_mob_id = 0 if(pulling) pulling.pulledby = null + if(ismob(pulling)) + var/mob/M = pulling + M.update_canmove()// mob gets up if it was lyng down in a chokehold pulling = null + grab_state = 0 update_pull_hud_icon() /mob/proc/update_pull_hud_icon() - if(client && hud_used) + if(hud_used) if(hud_used.pull_icon) hud_used.pull_icon.update_icon(src) @@ -677,11 +657,12 @@ var/next_mob_id = 0 //Robots, animals and brains have their own version so don't worry about them /mob/proc/update_canmove() var/ko = weakened || paralysis || stat || (status_flags & FAKEDEATH) + var/chokehold = pulledby && pulledby.grab_state >= GRAB_NECK var/buckle_lying = !(buckled && !buckled.buckle_lying) var/has_legs = get_num_legs() var/has_arms = get_num_arms() var/ignore_legs = get_leg_ignore() - if(ko || resting || stunned) + if(ko || resting || stunned || chokehold) drop_r_hand() drop_l_hand() unset_machine() @@ -692,16 +673,18 @@ var/next_mob_id = 0 if(buckled) lying = 90*buckle_lying - else - if((ko || resting || (!has_legs && !ignore_legs)) && !lying) - fall(ko) - canmove = !(ko || resting || stunned || buckled || (!has_legs && !ignore_legs && !has_arms)) + else if(!lying) + if(resting) + fall() + else if(ko || (!has_legs && !ignore_legs) || chokehold) + fall(forced = 1) + canmove = !(ko || resting || stunned || chokehold || buckled || (!has_legs && !ignore_legs && !has_arms)) density = !lying if(lying) if(layer == initial(layer)) //to avoid special cases like hiding larvas. - layer = MOB_LAYER - 0.2 //so mob lying always appear behind standing mobs + layer = LYING_MOB_LAYER //so mob lying always appear behind standing mobs else - if(layer == MOB_LAYER - 0.2) + if(layer == LYING_MOB_LAYER) layer = initial(layer) update_transform() update_action_buttons_icon() @@ -765,6 +748,10 @@ var/next_mob_id = 0 if(mind) return mind.get_ghost(even_if_they_cant_reenter) +/mob/proc/grab_ghost(force) + if(mind) + return mind.grab_ghost(force = force) + /mob/proc/notify_ghost_cloning(var/message = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!", var/sound = 'sound/effects/genetics.ogg', var/atom/source = null) var/mob/dead/observer/ghost = get_ghost() if(ghost) @@ -937,3 +924,6 @@ var/next_mob_id = 0 /mob/proc/is_literate() return 0 + +/mob/proc/get_idcard() + return diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 2d8684ded9d..e6d1f17a3dc 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -1,6 +1,6 @@ /mob density = 1 - layer = 4 + layer = MOB_LAYER animate_movement = 2 flags = HEAR hud_possible = list(ANTAG_HUD) @@ -32,7 +32,10 @@ var/other_mobs = null var/memory = "" var/disabilities = 0 //Carbon + var/atom/movable/pulling = null + var/grab_state = 0 + var/next_move = null var/notransform = null //Carbon var/hand = null @@ -86,9 +89,6 @@ var/research_scanner = 0 //For research scanner equipped mobs. Enable to show research data when examining. - var/list/grabbed_by = list( ) - var/list/requests = list( ) - var/list/mapobjs = list() var/in_throw_mode = 0 diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm deleted file mode 100644 index c89cf9ac1a8..00000000000 --- a/code/modules/mob/mob_grab.dm +++ /dev/null @@ -1,223 +0,0 @@ -#define UPGRADE_COOLDOWN 40 -#define UPGRADE_KILL_TIMER 100 - -/obj/item/weapon/grab - name = "grab" - flags = NOBLUDGEON | ABSTRACT - var/obj/screen/grab/hud = null - var/mob/affecting = null - var/mob/assailant = null - var/state = GRAB_PASSIVE - - var/allow_upgrade = 1 - var/last_upgrade = 0 - - layer = 21 - item_state = "nothing" - w_class = 5 - - -/obj/item/weapon/grab/New(mob/user, mob/victim) - ..() - assailant = user - affecting = victim - - hud = new /obj/screen/grab(src) - hud.icon_state = "reinforce" - hud.name = "reinforce grab" - hud.master = src - - affecting.grabbed_by += src - - -/obj/item/weapon/grab/Destroy() - if(affecting) - affecting.grabbed_by -= src - affecting = null - if(assailant) - if(assailant.client) - assailant.client.screen -= hud - assailant = null - qdel(hud) - return ..() - -//Used by throw code to hand over the mob, instead of throwing the grab. The grab is then deleted by the throw code. -/obj/item/weapon/grab/proc/get_mob_if_throwable() - if(affecting) - if(affecting.buckled) - return null - if(state >= GRAB_AGGRESSIVE) - return affecting - return null - - -//This makes sure that the grab screen object is displayed in the correct hand. -/obj/item/weapon/grab/proc/synch() - if(affecting) - if(assailant.r_hand == src) - hud.screen_loc = ui_rhand - else - hud.screen_loc = ui_lhand - - -/obj/item/weapon/grab/process() - if(!confirm()) - return 0 - - if(assailant.client) - assailant.client.screen -= hud - assailant.client.screen += hud - - if(assailant.pulling == affecting) - assailant.stop_pulling() - - if(state <= GRAB_AGGRESSIVE) - allow_upgrade = 1 - if((assailant.l_hand && assailant.l_hand != src && istype(assailant.l_hand, /obj/item/weapon/grab))) - var/obj/item/weapon/grab/G = assailant.l_hand - if(G.affecting != affecting) - allow_upgrade = 0 - if((assailant.r_hand && assailant.r_hand != src && istype(assailant.r_hand, /obj/item/weapon/grab))) - var/obj/item/weapon/grab/G = assailant.r_hand - if(G.affecting != affecting) - allow_upgrade = 0 - if(state == GRAB_AGGRESSIVE) - var/h = affecting.hand - affecting.hand = 0 - affecting.drop_item() - affecting.hand = 1 - affecting.drop_item() - affecting.hand = h - for(var/X in affecting.grabbed_by) - var/obj/item/weapon/grab/G = X - if(G == src) continue - if(G.state == GRAB_AGGRESSIVE) - allow_upgrade = 0 - if(allow_upgrade) - hud.icon_state = "reinforce" - else - hud.icon_state = "!reinforce" - else - if(!affecting.buckled) - affecting.loc = assailant.loc - - var/breathing_tube = affecting.getorganslot("breathing_tube") - - if(state >= GRAB_NECK) - affecting.Stun(5) //It will hamper your voice, being choked and all. - if(isliving(affecting) && !breathing_tube) - var/mob/living/L = affecting - L.adjustOxyLoss(1) - - if(state >= GRAB_KILL) - affecting.Weaken(5) //Should keep you down unless you get help. - if(!breathing_tube) - affecting.losebreath = min(affecting.losebreath + 2, 3) - -/obj/item/weapon/grab/attack_self(mob/user) - s_click(hud) - -/obj/item/weapon/grab/proc/s_click(obj/screen/S) - if(!affecting) - return - if(state == GRAB_UPGRADING) - return - if(world.time < (last_upgrade + UPGRADE_COOLDOWN)) - return - if(!assailant.canmove || assailant.lying) - qdel(src) - return - - last_upgrade = world.time - - if(state < GRAB_AGGRESSIVE) - if(!allow_upgrade) - return - assailant.visible_message("[assailant] grabs [affecting] aggressively!") - state = GRAB_AGGRESSIVE - icon_state = "grabbed1" - else - if(state < GRAB_NECK) - if(isslime(affecting)) - assailant << "You squeeze [affecting], but nothing interesting happens!" - return - - assailant.visible_message("[assailant] moves \his grip to [affecting]'s neck!") - state = GRAB_NECK - icon_state = "grabbed+1" - if(!affecting.buckled) - affecting.loc = assailant.loc - add_logs(assailant, affecting, "neck-grabbed") - hud.icon_state = "disarm/kill" - hud.name = "disarm/kill" - else - if(state < GRAB_UPGRADING) - assailant.visible_message("[assailant] starts to tighten \his grip on [affecting]'s neck!") - hud.icon_state = "disarm/kill1" - state = GRAB_UPGRADING - if(do_after(assailant, UPGRADE_KILL_TIMER, target = affecting)) - if(state == GRAB_KILL) - return - if(!affecting) - qdel(src) - return - if(!assailant.canmove || assailant.lying) - qdel(src) - return - state = GRAB_KILL - assailant.visible_message("[assailant] tightens \his grip on [affecting]'s neck!") - add_logs(assailant, affecting, "strangled") - - assailant.changeNext_move(CLICK_CD_TKSTRANGLE) - if(!affecting.getorganslot("breathing_tube")) - affecting.losebreath += 1 - else - if(assailant) - assailant.visible_message("[assailant] is unable to tighten \his grip on [affecting]'s neck!") - hud.icon_state = "disarm/kill" - state = GRAB_NECK - - -//This is used to make sure the victim hasn't managed to yackety sax away before using the grab. -/obj/item/weapon/grab/proc/confirm() - if(!assailant || !affecting) - qdel(src) - return 0 - - if(affecting) - if(!isturf(assailant.loc) || ( !isturf(affecting.loc) || assailant.loc != affecting.loc && get_dist(assailant, affecting) > 1) ) - qdel(src) - return 0 - - return 1 - - -/obj/item/weapon/grab/attack(mob/M, mob/user) - if(!affecting) - return - - if(M == affecting) - s_click(hud) - return - - if(M == assailant && state >= GRAB_AGGRESSIVE) - if( (ishuman(user) && (user.disabilities & FAT) && ismonkey(affecting) ) || ( isalien(user) && iscarbon(affecting) ) ) - var/mob/living/carbon/attacker = user - user.visible_message("[user] is attempting to devour [affecting]!") - if(istype(user, /mob/living/carbon/alien/humanoid/hunter)) - if(!do_mob(user, affecting, 60)) return - else - if(!do_mob(user, affecting, 130)) return - user.visible_message("[user] devours [affecting]!") - affecting.loc = user - attacker.stomach_contents.Add(affecting) - qdel(src) - - add_logs(user, affecting, "attempted to put", src, "into [M]") - -/obj/item/weapon/grab/dropped() - ..() - qdel(src) - -#undef UPGRADE_COOLDOWN -#undef UPGRADE_KILL_TIMER diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index fb1553ba799..c3708e32a05 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -272,7 +272,6 @@ It's fairly easy to fix if dealing with single letters but not so much with comp return M return 0 - /mob/proc/abiotic(full_body = 0) if(l_hand && !l_hand.flags&ABSTRACT || r_hand && !r_hand.flags&ABSTRACT) return 1 diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index bb213d051d4..cfba67193ce 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -8,9 +8,6 @@ if(buckled == mover) return 1 if(ismob(mover)) - var/mob/moving_mob = mover - if ((other_mobs && moving_mob.other_mobs)) - return 1 if (mover in buckled_mobs) return 1 return (!mover.density || !density || lying) @@ -114,7 +111,7 @@ Process_Incorpmove(direct) return 0 - if(Process_Grab()) + if(Process_Grab()) //are we restrained by someone's grip? return if(mob.buckled) //if we're buckled to something, tell it we moved. @@ -136,54 +133,10 @@ if(!mob.Process_Spacemove(direct)) return 0 - if(mob.restrained()) //Why being pulled while cuffed prevents you from moving - for(var/mob/M in orange(1, mob)) - if(M.pulling == mob) - if(!M.incapacitated() && mob.Adjacent(M)) - src << "You're restrained! You can't move!" - move_delay = world.time + 10 - return 0 - else - M.stop_pulling() - - //We are now going to move moving = 1 move_delay = mob.movement_delay() + world.time - //Something with pulling things - if(locate(/obj/item/weapon/grab, mob)) - move_delay = max(move_delay, world.time + 7) - var/list/L = mob.ret_grab() - if(istype(L, /list)) - if(L.len == 2) - L -= mob - var/mob/M = L[1] - if(M) - if ((get_dist(mob, M) <= 1 || M.loc == mob.loc)) - . = ..() - if(M)//Mob may get deleted during parent call - if (isturf(M.loc)) - var/diag = get_dir(mob, M) - if ((diag - 1) & diag) - else - diag = null - if ((get_dist(mob, M) > 1 || diag)) - step(M, get_dir(M.loc, mob.loc)) - else - for(var/mob/M in L) - M.other_mobs = 1 - if(mob != M) - M.animate_movement = 3 - for(var/mob/M in L) - spawn( 0 ) - step(M, direct) - return - spawn( 1 ) - M.other_mobs = null - M.animate_movement = 2 - return - if(mob.confused) if(mob.confused > 40) step(mob, pick(cardinal)) @@ -207,39 +160,14 @@ ///Called by client/Move() ///Checks to see if you are being grabbed and if so attemps to break it /client/proc/Process_Grab() - if(mob.grabbed_by.len) - var/list/grabbing = list() + if(mob.pulledby) + if(mob.restrained(ignore_grab = 1)) + move_delay = world.time + 10 + src << "You're restrained! You can't move!" + return 1 + else + return mob.resist_grab(1) - if(istype(mob.l_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = mob.l_hand - grabbing += G.affecting - - if(istype(mob.r_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = mob.r_hand - grabbing += G.affecting - - for(var/X in mob.grabbed_by) - var/obj/item/weapon/grab/G = X - switch(G.state) - - if(GRAB_PASSIVE) - if(!grabbing.Find(G.assailant)) //moving always breaks a passive grab unless we are also grabbing our grabber. - qdel(G) - - if(GRAB_AGGRESSIVE) - move_delay = world.time + 10 - if(!prob(25)) - return 1 - mob.visible_message("[mob] has broken free of [G.assailant]'s grip!") - qdel(G) - - if(GRAB_NECK) - move_delay = world.time + 10 - if(!prob(5)) - return 1 - mob.visible_message("[mob] has broken free of [G.assailant]'s headlock!") - qdel(G) - return 0 ///Process_Incorpmove ///Called by client/Move() @@ -352,27 +280,19 @@ /mob/proc/mob_negates_gravity() return 0 +//moves the mob/object we're pulling /mob/proc/Move_Pulled(atom/A) - if (!canmove || restrained() || !pulling) + if (!pulling) return - if (pulling.anchored) - return - if (!pulling.Adjacent(src)) + if (pulling.anchored || !pulling.Adjacent(src)) + stop_pulling() return if (A == loc && pulling.density) return if (!Process_Spacemove(get_dir(pulling.loc, A))) return - if (ismob(pulling)) - var/mob/M = pulling - var/atom/movable/t = M.pulling - M.stop_pulling() - step(pulling, get_dir(pulling.loc, A)) - if(M) - M.start_pulling(t) - else - step(pulling, get_dir(pulling.loc, A)) - return + step(pulling, get_dir(pulling.loc, A)) + /mob/proc/slip(s_amount, w_amount, obj/O, lube) return diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 2861e2e41aa..c6223dfcd19 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -127,19 +127,12 @@ observer.loc = O.loc else src << "Teleporting failed. You should be able to use ghost verbs to teleport somewhere useful" - if(client.prefs.be_random_name) - client.prefs.real_name = random_unique_name(gender) - if(client.prefs.be_random_body) - client.prefs.random_character(gender) - if(HAIR in client.prefs.pref_species.specflags) - observer.hair_style = client.prefs.hair_style - observer.hair_color = observer.brighten_color(client.prefs.hair_color) - if(FACEHAIR in client.prefs.pref_species.specflags) - observer.facial_hair_style = client.prefs.facial_hair_style - observer.facial_hair_color = observer.brighten_color(client.prefs.facial_hair_color) - observer.real_name = client.prefs.real_name - observer.name = observer.real_name observer.key = key + observer.client = client + observer.set_ghost_appearance() + if(observer.client && observer.client.prefs) + observer.real_name = observer.client.prefs.real_name + observer.name = observer.real_name observer.update_icon() observer.stopLobbySound() qdel(mind) diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 70344fe4bc1..e65ab6113d5 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -32,13 +32,16 @@ usr << "Speech is currently admin-disabled." return - if(mind && mind.name) - name = "[mind.name]" + var/mob/dead/observer/O = src + if(isobserver(src) && O.deadchat_name) + name = "[O.deadchat_name]" else - name = real_name - if(name != real_name) - alt_name = " (died as [real_name])" - + if(mind && mind.name) + name = "[mind.name]" + else + name = real_name + if(name != real_name) + alt_name = " (died as [real_name])" var/K diff --git a/code/modules/ninja/admin_ninja_verbs.dm b/code/modules/ninja/admin_ninja_verbs.dm index d87939b1eec..3f33c41e264 100644 --- a/code/modules/ninja/admin_ninja_verbs.dm +++ b/code/modules/ninja/admin_ninja_verbs.dm @@ -30,6 +30,7 @@ Contents: H.wear_suit:randomize_param() spawn(0) H.wear_suit:ninitialize(10,H) + ticker.mode.update_ninja_icons_added(H) //ADMIN CREATE NINJA (From Ghost) diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm index 72771142409..574257b7190 100644 --- a/code/modules/ninja/ninja_event.dm +++ b/code/modules/ninja/ninja_event.dm @@ -155,7 +155,7 @@ Contents: return Ninja << sound('sound/effects/ninja_greeting.ogg') //so ninja you probably wouldn't even know if you were made one - ticker.mode.update_ninja_icons_added(Mind) + ticker.mode.update_ninja_icons_added(Ninja) spawned_mobs += Ninja message_admins("[key] has been made into a ninja by an event.") log_game("[key] was spawned as a ninja by an event.") diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm index eee99a59bd5..04c0c796f23 100644 --- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm +++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm @@ -13,7 +13,7 @@ It is possible to destroy the net by the occupant or someone else. opacity = 0//Can see through. mouse_opacity = 1//So you can hit it with stuff. anchored = 1//Can't drag/grab the trapped mob. - + layer = ABOVE_ALL_MOB_LAYER var/health = 25//How much health it has. var/mob/living/affecting = null//Who it is currently affecting, if anyone. var/mob/living/master = null//Who shot web. Will let this person know if the net was successful or failed. diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm index b31d49c1d82..34d47d7e469 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm @@ -18,7 +18,6 @@ H.Beam(C,"n_beam",,15) H.say("Get over here!") var/obj/effect/energy_net/E = new /obj/effect/energy_net(C.loc) - E.layer = C.layer+1//To have it appear one layer above the mob. H.visible_message("[H] caught [C] with an energy net!","You caught [C] with an energy net!") E.affecting = C E.master = H diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 29d4bc11de5..98065675712 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -14,7 +14,6 @@ w_class = 1 throw_range = 1 throw_speed = 1 - layer = 3 pressure_resistance = 0 slot_flags = SLOT_HEAD body_parts_covered = HEAD diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 341f7cf7e51..51b6eb9558f 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -33,7 +33,7 @@ By design, d1 is the smallest direction and d2 is the highest icon_state = "0-1" var/d1 = 0 // cable direction 1 (see above) var/d2 = 1 // cable direction 2 (see above) - layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4 + layer = WIRE_LAYER //Above pipes, which are at GAS_PIPE_LAYER var/cable_color = "red" var/obj/item/stack/cable_coil/stored diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index a9780a6f25e..daebb4850a7 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -146,7 +146,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 middle = part if(count <= 3) // Their sprite is the top part of the generator part.density = 0 - part.layer = MOB_LAYER + 0.1 + part.layer = WALL_OBJ_LAYER part.sprite_number = count part.main_part = src parts += part diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 654614f7574..a4b9ae8875c 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -32,7 +32,7 @@ icon = 'icons/obj/lighting.dmi' icon_state = "tube-construct-stage1" anchored = 1 - layer = 5 + layer = WALL_OBJ_LAYER var/stage = 1 var/fixture_type = "tube" var/sheets_refunded = 2 @@ -131,7 +131,7 @@ icon_state = "tube1" desc = "A lighting fixture." anchored = 1 - layer = 5 // They were appearing under mobs which is a little weird - Ostaf + layer = WALL_OBJ_LAYER use_power = 2 idle_power_usage = 2 active_power_usage = 20 diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 0ddbd973c4a..4dc2e7b65d3 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -10,7 +10,7 @@ unacidable = 1 use_power = 0 luminosity = 4 - layer = OBJ_LAYER + 0.1 + layer = ABOVE_OBJ_LAYER var/obj/machinery/field/generator/FG1 = null var/obj/machinery/field/generator/FG2 = null diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 660e1b409c1..5a8baf62a1b 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -5,6 +5,7 @@ desc = "A heavy duty industrial laser.\nAlt-click to rotate it clockwise." icon = 'icons/obj/singularity.dmi' icon_state = "emitter" + var/icon_state_on = "emitter_+a" anchored = 0 density = 1 req_access = list(access_engine_equip) @@ -94,9 +95,9 @@ /obj/machinery/power/emitter/update_icon() if (active && powernet && avail(active_power_usage)) - icon_state = "emitter_+a" + icon_state = icon_state_on else - icon_state = "emitter" + icon_state = initial(icon_state) /obj/machinery/power/emitter/attack_hand(mob/user) diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 242adf9e287..8658fe0b341 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -11,6 +11,7 @@ move_self = 1 //Do we move on our own? grav_pull = 5 //How many tiles out do we pull? consume_range = 6 //How many tiles out do we eat + var/clashing = FALSE //If Nar-Sie is fighting Ratvar /obj/singularity/narsie/large name = "Nar-Sie" @@ -46,6 +47,8 @@ /obj/singularity/narsie/process() eat() + if(clashing) + return 0 if(!target || prob(5)) pickcultist() move() diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index befe71b8071..d9090686d8d 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -7,7 +7,7 @@ icon_state = "singularity_s1" anchored = 1 density = 1 - layer = 6 + layer = MASSIVE_OBJ_LAYER luminosity = 6 unacidable = 1 //Don't comment this out. var/current_size = 1 diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index 229c59f9d03..f3fcb43585b 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -8,10 +8,9 @@ icon_state = "term" desc = "It's an underfloor wiring terminal for power equipment." level = 1 - layer = TURF_LAYER var/obj/machinery/power/master = null anchored = 1 - layer = 2.6 // a bit above wires + layer = WIRE_TERMINAL_LAYER //a bit above wires /obj/machinery/power/terminal/New() diff --git a/code/modules/procedural mapping/mapGenerator.dm b/code/modules/procedural_mapping/mapGenerator.dm similarity index 100% rename from code/modules/procedural mapping/mapGenerator.dm rename to code/modules/procedural_mapping/mapGenerator.dm diff --git a/code/modules/procedural mapping/mapGeneratorModule.dm b/code/modules/procedural_mapping/mapGeneratorModule.dm similarity index 100% rename from code/modules/procedural mapping/mapGeneratorModule.dm rename to code/modules/procedural_mapping/mapGeneratorModule.dm diff --git a/code/modules/procedural mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm similarity index 100% rename from code/modules/procedural mapping/mapGeneratorModules/helpers.dm rename to code/modules/procedural_mapping/mapGeneratorModules/helpers.dm diff --git a/code/modules/procedural mapping/mapGeneratorModules/nature.dm b/code/modules/procedural_mapping/mapGeneratorModules/nature.dm similarity index 100% rename from code/modules/procedural mapping/mapGeneratorModules/nature.dm rename to code/modules/procedural_mapping/mapGeneratorModules/nature.dm diff --git a/code/modules/procedural mapping/mapGeneratorObj.dm b/code/modules/procedural_mapping/mapGeneratorObj.dm similarity index 100% rename from code/modules/procedural mapping/mapGeneratorObj.dm rename to code/modules/procedural_mapping/mapGeneratorObj.dm diff --git a/code/modules/procedural mapping/mapGeneratorReadme.dm b/code/modules/procedural_mapping/mapGeneratorReadme.dm similarity index 100% rename from code/modules/procedural mapping/mapGeneratorReadme.dm rename to code/modules/procedural_mapping/mapGeneratorReadme.dm diff --git a/code/modules/procedural mapping/mapGenerators/asteroid.dm b/code/modules/procedural_mapping/mapGenerators/asteroid.dm similarity index 100% rename from code/modules/procedural mapping/mapGenerators/asteroid.dm rename to code/modules/procedural_mapping/mapGenerators/asteroid.dm diff --git a/code/modules/procedural mapping/mapGenerators/cellular.dm b/code/modules/procedural_mapping/mapGenerators/cellular.dm similarity index 100% rename from code/modules/procedural mapping/mapGenerators/cellular.dm rename to code/modules/procedural_mapping/mapGenerators/cellular.dm diff --git a/code/modules/procedural mapping/mapGenerators/lava_river.dm b/code/modules/procedural_mapping/mapGenerators/lava_river.dm similarity index 100% rename from code/modules/procedural mapping/mapGenerators/lava_river.dm rename to code/modules/procedural_mapping/mapGenerators/lava_river.dm diff --git a/code/modules/procedural mapping/mapGenerators/nature.dm b/code/modules/procedural_mapping/mapGenerators/nature.dm similarity index 100% rename from code/modules/procedural mapping/mapGenerators/nature.dm rename to code/modules/procedural_mapping/mapGenerators/nature.dm diff --git a/code/modules/procedural mapping/mapGenerators/shuttle.dm b/code/modules/procedural_mapping/mapGenerators/shuttle.dm similarity index 100% rename from code/modules/procedural mapping/mapGenerators/shuttle.dm rename to code/modules/procedural_mapping/mapGenerators/shuttle.dm diff --git a/code/modules/procedural mapping/mapGenerators/syndicate.dm b/code/modules/procedural_mapping/mapGenerators/syndicate.dm similarity index 100% rename from code/modules/procedural mapping/mapGenerators/syndicate.dm rename to code/modules/procedural_mapping/mapGenerators/syndicate.dm diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 9d1f29ce38b..84ea5944c5a 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -215,9 +215,9 @@ /obj/item/ammo_casing/shotgun/dart/New() ..() - flags |= NOREACT flags |= OPENCONTAINER create_reagents(30) + reagents.set_reacting(FALSE) /obj/item/ammo_casing/shotgun/dart/attackby() return diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index 3d245ea9956..62b3ba8a669 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -167,6 +167,10 @@ obj/item/ammo_casing/energy/net projectile_type = /obj/item/projectile/energy/trap select_name = "snare" +/obj/item/ammo_casing/energy/trap/cyborg + projectile_type = /obj/item/projectile/energy/trap/cyborg + e_cost = 50 + /obj/item/ammo_casing/energy/instakill projectile_type = /obj/item/projectile/beam/instakill e_cost = 0 diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 528ecc04816..f69cadac134 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -48,6 +48,22 @@ can_flashlight = 0 ammo_x_offset = 1 +/obj/item/weapon/gun/energy/gun/dragnet/snare + name = "Energy Snare Launcher" + desc = "Fires an energy snare that slows the target down" + ammo_type = list(/obj/item/ammo_casing/energy/trap) + +/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg + can_charge = 0 + ammo_type = list(/obj/item/ammo_casing/energy/trap/cyborg) + +/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg/newshot() + ..() + robocharge() + +/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg/emp_act() + return + /obj/item/weapon/gun/energy/gun/turret name = "hybrid turret gun" desc = "A heavy hybrid energy cannon with two settings: Stun and kill." diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 91808293948..76bde0e0903 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -99,6 +99,8 @@ var/holds_charge = FALSE var/unique_frequency = FALSE // modified by KA modkits + var/overheat = FALSE + /obj/item/weapon/gun/energy/kinetic_accelerator/super name = "super-kinetic accelerator" desc = "An upgraded, superior version of the proto-kinetic accelerator." @@ -130,14 +132,15 @@ /obj/item/weapon/gun/energy/kinetic_accelerator/equipped(mob/user) . = ..() - attempt_reload() + if(!can_shoot()) + attempt_reload() /obj/item/weapon/gun/energy/kinetic_accelerator/dropped() . = ..() if(!holds_charge) // Put it on a delay because moving item from slot to hand // calls dropped(). - spawn(overheat_time) + spawn(1) if(!ismob(loc)) empty() @@ -146,6 +149,10 @@ update_icon() /obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload() + if(overheat) + return + overheat = TRUE + var/carried = 0 if(!unique_frequency) for(var/obj/item/weapon/gun/energy/kinetic_accelerator/K in \ @@ -158,10 +165,8 @@ carried = 1 spawn(overheat_time * carried) - if(can_shoot()) - return - else - reload() + reload() + overheat = FALSE /obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity) return @@ -175,8 +180,7 @@ update_icon() /obj/item/weapon/gun/energy/kinetic_accelerator/update_icon() - var/obj/item/ammo_casing/energy/shot = ammo_type[select] - if(power_supply.charge < shot.e_cost) + if(!can_shoot()) icon_state = "[initial(icon_state)]_empty" else icon_state = initial(icon_state) @@ -225,6 +229,8 @@ ammo_type = list(/obj/item/ammo_casing/energy/plasma) flags = CONDUCT | OPENCONTAINER attack_verb = list("attacked", "slashed", "cut", "sliced") + force = 12 + sharpness = IS_SHARP can_charge = 0 heat = 3800 @@ -253,6 +259,7 @@ name = "advanced plasma cutter" icon_state = "adv_plasmacutter" origin_tech = "combat=3;materials=4;magnets=3;plasmatech=3;engineering=2" + force = 15 ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv) /obj/item/weapon/gun/energy/wormhole_projector diff --git a/code/modules/projectiles/guns/projectile/rechargable_magazine.dm b/code/modules/projectiles/guns/projectile/rechargable_magazine.dm index dc7a6b82994..8f7778c497b 100644 --- a/code/modules/projectiles/guns/projectile/rechargable_magazine.dm +++ b/code/modules/projectiles/guns/projectile/rechargable_magazine.dm @@ -65,11 +65,22 @@ w_class = 5 var/obj/item/weapon/gun/projectile/minigun/gun = null var/armed = 0 //whether the gun is attached, 0 is attached, 1 is the gun is wielded. + var/overheat = 0 + var/overheat_max = 40 + var/heat_diffusion = 1 /obj/item/weapon/minigunpack/New() gun = new(src) + SSobj.processing += src ..() +/obj/item/weapon/minigunpack/Destroy() + SSobj.processing -= src + ..() + +/obj/item/weapon/minigunpack/process() + overheat = max(0, overheat - heat_diffusion) + /obj/item/weapon/minigunpack/attack_hand(var/mob/living/carbon/user) if(src.loc == user) if(!armed) @@ -167,6 +178,14 @@ else qdel(src) +/obj/item/weapon/gun/projectile/minigun/shoot_live_shot(mob/living/user as mob|obj, pointblank = 0, mob/pbtarget = null, message = 1) + if(ammo_pack) + if(ammo_pack.overheat < ammo_pack.overheat_max) + . = ..() + ammo_pack.overheat++ + else + user << "The gun's heat sensor locked the trigger to prevent lens damage." + /obj/item/weapon/gun/projectile/minigun/afterattack(atom/target, mob/living/user, flag, params) if(!ammo_pack || ammo_pack.loc != user) user << "You need the backpack power source to fire the gun!" diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm index 44fd2c98dd4..023c7c2fd02 100644 --- a/code/modules/projectiles/guns/syringe_gun.dm +++ b/code/modules/projectiles/guns/syringe_gun.dm @@ -24,7 +24,8 @@ if(!S) return - chambered.BB = new /obj/item/projectile/bullet/dart/syringe(src) + chambered.BB = new S.projectile_type (src) + S.reagents.trans_to(chambered.BB, S.reagents.total_volume) chambered.BB.name = S.name syringes.Remove(S) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index feb1a8d04ca..a6b0e4c0c7b 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -8,6 +8,7 @@ mouse_opacity = 0 hitsound = 'sound/weapons/pierce.ogg' pressure_resistance = INFINITY + burn_state = LAVA_PROOF var/def_zone = "" //Aiming at var/mob/firer = null//Who shot it var/obj/item/ammo_casing/ammo_casing = null @@ -128,7 +129,7 @@ if((!( current ) || loc == current)) current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z) step_towards(src, current) - if(original && (original.layer>=2.75) || ismob(original)) + if(original && (original.layer>=PROJECTILE_HIT_THRESHHOLD_LAYER) || ismob(original)) if(loc == get_turf(original)) if(!(original in permutated)) Bump(original, 1) diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 2b081c5f1bd..7c68c9db0c6 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -124,7 +124,7 @@ damage = 10 weaken = 4 stun = 4 - + /obj/item/projectile/bullet/honker damage = 0 weaken = 5 @@ -135,7 +135,7 @@ icon = 'icons/obj/hydroponics/harvest.dmi' icon_state = "banana" range = 200 - + /obj/item/projectile/bullet/honker/New() ..() SpinAnimation() @@ -166,17 +166,18 @@ name = "dart" icon_state = "cbbolt" damage = 6 + var/piercing = 0 /obj/item/projectile/bullet/dart/New() ..() - flags |= NOREACT create_reagents(50) + reagents.set_reacting(FALSE) /obj/item/projectile/bullet/dart/on_hit(atom/target, blocked = 0, hit_zone) if(iscarbon(target)) var/mob/living/carbon/M = target if(blocked != 100) // not completely blocked - if(M.can_inject(null,0,hit_zone)) // Pass the hit zone to see if it can inject by whether it hit the head or the body. + if(M.can_inject(null,0,hit_zone,piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body. ..() reagents.reaction(M, INJECT) reagents.trans_to(M, reagents.total_volume) @@ -187,7 +188,7 @@ "You were protected against the [name]!") ..(target, blocked, hit_zone) - flags &= ~NOREACT + reagents.set_reacting(TRUE) reagents.handle_reactions() return 1 @@ -203,6 +204,10 @@ icon = 'icons/obj/chemical.dmi' icon_state = "syringeproj" +//Piercing Syringe +/obj/item/projectile/bullet/dart/syringe/piercing + piercing = 1 + /obj/item/projectile/bullet/neurotoxin name = "neurotoxin spit" icon_state = "neurotoxin" diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 4dde9cc6fc8..3cd537d41ad 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -111,6 +111,32 @@ new/obj/item/weapon/restraints/legcuffs/beartrap/energy(loc) ..() +/obj/item/projectile/energy/trap/cyborg + name = "Energy Bola" + icon_state = "e_snare" + nodamage = 1 + weaken = 0 + hitsound = 'sound/weapons/taserhit.ogg' + range = 10 + +/obj/item/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = 0) + if(!ismob(target) || blocked >= 100) + var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread + sparks.set_up(1, 1, src) + sparks.start() + qdel(src) + if(iscarbon(target)) + var/obj/item/weapon/restraints/legcuffs/beartrap/B = new /obj/item/weapon/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target)) + B.Crossed(target) + spawn(10) + qdel(src) + ..() + +/obj/item/projectile/energy/trap/cyborg/on_range() + var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread + sparks.set_up(1, 1, src) + sparks.start() + qdel(src) /obj/item/projectile/energy/declone name = "radiation beam" diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index cbe4524c9f9..b0e825110af 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -61,12 +61,9 @@ var/mob/living/carbon/C = target C.regenerate_limbs() if(target.revive(full_heal = 1)) - if(!target.ckey) - for(var/mob/dead/observer/ghost in player_list) - if(target.real_name == ghost.real_name) - ghost.reenter_corpse() - break - target << "You rise with a start, you're alive!!!" + target.grab_ghost(force = TRUE) // even suicides + target << "You rise with a start, \ + you're alive!!!" else if(target.stat != DEAD) target << "You feel great!" @@ -175,7 +172,7 @@ if("drone") new_mob = new /mob/living/simple_animal/drone(M.loc) var/mob/living/simple_animal/drone/D = new_mob - D.update_drone_hack() + D.liberate() // F R E E D R O N E if(issilicon(new_mob)) new_mob.gender = M.gender new_mob.invisibility = 0 @@ -186,9 +183,10 @@ new_mob.languages |= HUMAN if("slime") new_mob = new /mob/living/simple_animal/slime(M.loc) + var/mob/living/simple_animal/slime/slimey = new_mob if(prob(50)) - var/mob/living/simple_animal/slime/Slime = new_mob - Slime.is_adult = 1 + slimey.is_adult = 1 + slimey.random_colour() new_mob.languages |= HUMAN if("xeno") if(prob(50)) @@ -220,7 +218,7 @@ if("spiderhunter") new_mob = new /mob/living/simple_animal/hostile/poison/giant_spider/hunter(M.loc) if("blobbernaut") - new_mob = new /mob/living/simple_animal/hostile/blob/blobbernaut(M.loc) + new_mob = new /mob/living/simple_animal/hostile/blob/blobbernaut/independent(M.loc) if("magicarp") new_mob = new /mob/living/simple_animal/hostile/carp/ranged(M.loc) if("chaosmagicarp") @@ -279,10 +277,8 @@ M.attack_log += text("\[[time_stamp()]\] [M.real_name] ([M.ckey]) became [new_mob.real_name].") new_mob.a_intent = "harm" - if(M.mind) - M.mind.transfer_to(new_mob) - else - new_mob.key = M.key + + M.wabbajack_act(new_mob) new_mob << "Your form morphs into that of a [randomize]." diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 631efab912f..81f9afd7dad 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -141,7 +141,7 @@ ..() /obj/item/projectile/kinetic/on_range() - new /obj/item/effect/kinetic_blast(src.loc) + new /obj/effect/kinetic_blast(src.loc) ..() /obj/item/projectile/kinetic/on_hit(atom/target) @@ -150,7 +150,7 @@ if(istype(target_turf, /turf/closed/mineral)) var/turf/closed/mineral/M = target_turf M.gets_drilled(firer) - new /obj/item/effect/kinetic_blast(target_turf) + new /obj/effect/kinetic_blast(target_turf) if(src.splash) for(var/turf/T in range(splash, target_turf)) if(istype(T, /turf/closed/mineral)) @@ -158,13 +158,13 @@ M.gets_drilled(firer) -/obj/item/effect/kinetic_blast +/obj/effect/kinetic_blast name = "kinetic explosion" icon = 'icons/obj/projectiles.dmi' icon_state = "kinetic_blast" - layer = 4.1 + layer = ABOVE_ALL_MOB_LAYER -/obj/item/effect/kinetic_blast/New() +/obj/effect/kinetic_blast/New() spawn(4) qdel(src) @@ -218,7 +218,7 @@ icon_state = "plasmacutter" damage_type = BRUTE damage = 5 - range = 3 + range = 5 /obj/item/projectile/plasma/New() var/turf/proj_turf = get_turf(src) @@ -227,9 +227,9 @@ var/datum/gas_mixture/environment = proj_turf.return_air() if(environment) var/pressure = environment.return_pressure() - if(pressure < 30) + if(pressure < 60) name = "full strength plasma blast" - damage *= 3 + damage *= 4 ..() /obj/item/projectile/plasma/on_hit(atom/target) @@ -237,12 +237,14 @@ if(istype(target, /turf/closed/mineral)) var/turf/closed/mineral/M = target M.gets_drilled(firer) - range = max(range - 1, 1) - return -1 + Range() + if(range > 0) + return -1 /obj/item/projectile/plasma/adv - range = 5 + damage = 7 + range = 7 /obj/item/projectile/plasma/adv/mech damage = 10 - range = 6 \ No newline at end of file + range = 8 \ No newline at end of file diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index d1af9041bc8..c27f060df24 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -17,10 +17,14 @@ var/const/INJECT = 5 //injection var/last_tick = 1 var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() + var/flags /datum/reagents/New(maximum=100) maximum_volume = maximum - SSobj.processing |= src + + if(!(flags & REAGENT_NOREACT)) + SSobj.processing |= src + //I dislike having these here but map-objects are initialised before world/New() is called. >_> if(!chemical_reagents_list) //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id @@ -56,7 +60,7 @@ var/const/INJECT = 5 //injection /datum/reagents/Destroy() . = ..() - SSobj.processing.Remove(src) + SSobj.processing -= src for(var/reagent in reagent_list) var/datum/reagent/R = reagent qdel(R) @@ -292,12 +296,23 @@ var/const/INJECT = 5 //injection update_total() /datum/reagents/process() - if(my_atom && (my_atom.flags & NOREACT)) + if(flags & REAGENT_NOREACT) + SSobj.processing -= src return + for(var/reagent in reagent_list) var/datum/reagent/R = reagent R.on_tick() - return + +/datum/reagents/proc/set_reacting(react = TRUE) + if(react) + // Order is important, process() can remove from processing if + // the flag is present + flags &= ~(REAGENT_NOREACT) + SSobj.processing |= src + else + SSobj.processing -= src + flags |= REAGENT_NOREACT /datum/reagents/proc/conditional_update_move(atom/A, Running = 0) for(var/reagent in reagent_list) @@ -312,7 +327,8 @@ var/const/INJECT = 5 //injection update_total() /datum/reagents/proc/handle_reactions() - if(my_atom.flags & NOREACT) return //Yup, no reactions here. No siree. + if(flags & REAGENT_NOREACT) + return //Yup, no reactions here. No siree. var/reaction_occured = 0 do diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 4730cd0f891..ccdcc770c74 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -9,8 +9,10 @@ idle_power_usage = 20 var/obj/item/weapon/reagent_containers/beaker = null var/obj/item/weapon/storage/pill_bottle/bottle = null - var/mode = 0 + var/mode = 1 var/condi = 0 + var/screen = "home" + var/analyzeVars[0] var/useramount = 30 // Last used amount /obj/machinery/chem_master/New() @@ -113,122 +115,98 @@ else return ..() -/obj/machinery/chem_master/Topic(href, href_list) + +/obj/machinery/chem_master/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "chem_master", name, 500, 550, master_ui, state) + ui.open() + + +/obj/machinery/chem_master/ui_data(mob/user) + var/list/data = list() + data["isBeakerLoaded"] = beaker ? 1 : 0 + data["beakerCurrentVolume"] = beaker ? beaker.reagents.total_volume : null + data["beakerMaxVolume"] = beaker ? beaker.volume : null + data["mode"] = mode + data["condi"] = condi + data["screen"] = screen + data["analyzeVars"] = analyzeVars + + data["isPillBottleLoaded"] = bottle ? 1 : 0 + if(bottle) + data["pillBotContent"] = bottle.contents.len + data["pillBotMaxContent"] = bottle.storage_slots + + + var beakerContents[0] + if(beaker) + for(var/datum/reagent/R in beaker.reagents.reagent_list) + beakerContents.Add(list(list("name" = R.name, "id" = R.id, "volume" = R.volume))) // list in a list because Byond merges the first list... + data["beakerContents"] = beakerContents + + var bufferContents[0] + if(reagents.total_volume) + for(var/datum/reagent/N in reagents.reagent_list) + bufferContents.Add(list(list("name" = N.name, "id" = N.id, "volume" = N.volume))) // ^ + data["bufferContents"] = bufferContents + + + return data + +/obj/machinery/chem_master/ui_act(action, params) if(..()) return - - usr.set_machine(src) - - if(href_list["ejectp"]) - if(bottle) - bottle.loc = src.loc - bottle = null - - else if(href_list["close"]) - usr << browse(null, "window=chem_master") - usr.unset_machine() - return - - else if(href_list["toggle"]) - mode = !mode - - else if(href_list["createbottle"]) - var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN) - if(!name) - return - var/obj/item/weapon/reagent_containers/P - if(condi) - P = new/obj/item/weapon/reagent_containers/food/condiment(src.loc) - else - P = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc) - P.pixel_x = rand(-7, 7) //random position - P.pixel_y = rand(-7, 7) - P.name = trim("[name] bottle") - reagents.trans_to(P, P.volume) - - if(beaker) - - if(href_list["analyze"]) - if(locate(href_list["reagent"])) - var/datum/reagent/R = locate(href_list["reagent"]) - if(R) - var/dat = "" - dat += "

[condi ? "Condiment" : "Chemical"] information:

" - dat += "Name: [initial(R.name)]

" - dat += "State: " - if(initial(R.reagent_state) == 1) - dat += "Solid" - else if(initial(R.reagent_state) == 2) - dat += "Liquid" - else if(initial(R.reagent_state) == 3) - dat += "Gas" - else - dat += "Unknown" - dat += "
" - dat += "Color: [initial(R.color)]

" - dat += "Description: [initial(R.description)]

" - var/const/P = 3 //The number of seconds between life ticks - var/T = initial(R.metabolization_rate) * (60 / P) - dat += "Metabolization Rate: [T]u/minute
" - dat += "Overdose Threshold: [initial(R.overdose_threshold) ? "[initial(R.overdose_threshold)]u" : "none"]
" - dat += "Addiction Threshold: [initial(R.addiction_threshold) ? "[initial(R.addiction_threshold)]u" : "none"]

" - dat += "
Back" - var/datum/browser/popup = new(usr, "chem_master", name) - popup.set_content(dat) - popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state)) - popup.open(1) - return - - else if(href_list["main"]) // Used to exit the analyze screen. - attack_hand(usr) - return - - else if(href_list["add"]) - if(href_list["amount"]) - var/id = href_list["add"] - var/amount = text2num(href_list["amount"]) - if (amount > 0) - beaker.reagents.trans_id_to(src, id, amount) - - else if(href_list["addcustom"]) - var/id = href_list["addcustom"] - var/amt_temp = isgoodnumber(input(usr, "Select the amount to transfer.", "Transfer how much?", useramount) as num|null) - if(!amt_temp) - return - useramount = amt_temp - src.Topic(null, list("amount" = "[useramount]", "add" = "[id]")) - - else if(href_list["remove"]) - if(href_list["amount"]) - var/id = href_list["remove"] - var/amount = text2num(href_list["amount"]) - if (amount > 0) - if(mode) - reagents.trans_id_to(beaker, id, amount) - else - reagents.remove_reagent(id, amount) - - else if(href_list["removecustom"]) - var/id = href_list["removecustom"] - var/amt_temp = isgoodnumber(input(usr, "Select the amount to transfer.", "Transfer how much?", useramount) as num|null) - if(!amt_temp) - return - useramount = amt_temp - src.Topic(null, list("amount" = "[useramount]", "remove" = "[id]")) - - else if(href_list["eject"]) + switch(action) + if("eject") if(beaker) beaker.loc = src.loc beaker = null reagents.clear_reagents() icon_state = "mixer0" + . = TRUE - else if(href_list["createpill"]) //Also used for condiment packs. + if("ejectp") + if(bottle) + bottle.loc = src.loc + bottle = null + . = TRUE + + if("transferToBuffer") + if(beaker) + var/id = params["id"] + var/amount = text2num(params["amount"]) + if (amount > 0) + beaker.reagents.trans_id_to(src, id, amount) + . = TRUE + else if (amount == -1) // -1 means custom amount + useramount = input("Enter the Amount you want to transfer:", name, useramount) as num|null + beaker.reagents.trans_id_to(src, id, useramount) + . = TRUE + + if("transferFromBuffer") + var/id = params["id"] + var/amount = text2num(params["amount"]) + if (amount > 0) + if(mode) + reagents.trans_id_to(beaker, id, amount) + . = TRUE + else + reagents.remove_reagent(id, amount) + . = TRUE + + if("toggleMode") + mode = !mode + . = TRUE + + if("createPill") + var/many = params["many"] if(reagents.total_volume == 0) return if(!condi) var/amount = 1 var/vol_each = min(reagents.total_volume, 50) - if(text2num(href_list["many"])) + if(text2num(many)) amount = min(max(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many pills?", amount) as num|null), 0), 10) if(!amount) return @@ -257,12 +235,14 @@ P.name = trim("[name] pack") P.desc = "A small condiment pack. The label says it contains [name]." reagents.trans_to(P,10) + . = TRUE - else if(href_list["createpatch"]) + if("createPatch") + var/many = params["many"] if(reagents.total_volume == 0) return var/amount = 1 var/vol_each = min(reagents.total_volume, 50) - if(text2num(href_list["many"])) + if(text2num(many)) amount = min(max(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many patches?", amount) as num|null), 0), 10) if(!amount) return @@ -278,84 +258,46 @@ P.pixel_x = rand(-7, 7) //random position P.pixel_y = rand(-7, 7) reagents.trans_to(P,vol_each) + . = TRUE - src.updateUsrDialog() - return + if("createBottle") + var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN) + if(!name) + return + var/obj/item/weapon/reagent_containers/P + if(condi) + P = new/obj/item/weapon/reagent_containers/food/condiment(src.loc) + else + P = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc) -/obj/machinery/chem_master/attack_hand(mob/user) - if(stat & BROKEN) - return + P.pixel_x = rand(-7, 7) //random position + P.pixel_y = rand(-7, 7) + P.name = trim("[name] bottle") + reagents.trans_to(P, P.volume) + . = TRUE - user.set_machine(src) - var/dat = "" - if(beaker) - dat += "Beaker \[[beaker.reagents.total_volume]/[beaker.volume]\] Eject and Clear Buffer
" - else - dat = "Please insert beaker.
" + if("analyze") + var/datum/reagent/R = chemical_reagents_list[params["id"]] + if(R) + var/state = "Unknown" + if(initial(R.reagent_state) == 1) + state = "Solid" + else if(initial(R.reagent_state) == 2) + state = "Liquid" + else if(initial(R.reagent_state) == 3) + state = "Gas" + var/const/P = 3 //The number of seconds between life ticks + var/T = initial(R.metabolization_rate) * (60 / P) + analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold)) + screen = "analyze" + return - dat += "
Add to buffer:
    " - if(beaker) - if(beaker.reagents.total_volume) - for(var/datum/reagent/G in beaker.reagents.reagent_list) - dat += "
  • [G.name], [G.volume] Units - " - dat += "Analyze " - dat += "1 " - dat += "5 " - dat += "10 " - dat += "All " - dat += "Custom" - else - dat += "
  • Beaker is empty." - else - dat += "
  • No beaker." + if("goScreen") + screen = params["screen"] + . = TRUE - dat += "

Transfer to [(!mode ? "disposal" : "beaker")]:
    " - if(reagents.total_volume) - for(var/datum/reagent/N in reagents.reagent_list) - dat += "
  • [N.name], [N.volume] Units - " - dat += "Analyze " - dat += "1 " - dat += "5 " - dat += "10 " - dat += "All " - dat += "Custom" - else - dat += "
  • Buffer is empty." - dat += "

" - if(!condi) - if(bottle) - dat += "Pill Bottle \[[bottle.contents.len]/[bottle.storage_slots]\] Eject" - else - dat += "No pill bottle inserted." - else - dat += "
" - dat += "
    " - if(!condi) - if(beaker && reagents.total_volume) - dat += "
  • Create pill (50 units max)" - dat += "
  • Create multiple pills
    " - dat += "
  • Create patch (50 units max)" - dat += "
  • Create multiple patches
    " - else - dat += "
  • Create pill (50 units max)" - dat += "
  • Create multiple pills
    " - dat += "
  • Create patch (50 units max)" - dat += "
  • Create multiple patches
    " - else - if(beaker && reagents.total_volume) - dat += "
  • Create pack (10 units max)
    " - else - dat += "
  • Create pack (10 units max)
    " - dat += "
  • Create bottle ([condi ? "50" : "30"] units max)" - dat += "
" - dat += "
Close" - var/datum/browser/popup = new(user, "chem_master", name, 470, 500) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open(1) - return /obj/machinery/chem_master/proc/isgoodnumber(num) if(isnum(num)) diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 419d5e2c91d..479a2ea140b 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -3,7 +3,7 @@ desc = "Used to grind things up into raw materials." icon = 'icons/obj/kitchen.dmi' icon_state = "juicer1" - layer = 2.9 + layer = BELOW_OBJ_LAYER anchored = 1 use_power = 1 idle_power_usage = 5 @@ -29,15 +29,6 @@ /obj/item/weapon/grown/nettle/death = list("facid" = 0), /obj/item/weapon/grown/novaflower = list("capsaicin" = 0, "condensedcapsaicin" = 0), - //Crayons (for overriding colours) - /obj/item/toy/crayon/red = list("redcrayonpowder" = 10), - /obj/item/toy/crayon/orange = list("orangecrayonpowder" = 10), - /obj/item/toy/crayon/yellow = list("yellowcrayonpowder" = 10), - /obj/item/toy/crayon/green = list("greencrayonpowder" = 10), - /obj/item/toy/crayon/blue = list("bluecrayonpowder" = 10), - /obj/item/toy/crayon/purple = list("purplecrayonpowder" = 10), - /obj/item/toy/crayon/mime = list("invisiblecrayonpowder" = 50), - //Blender Stuff /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = list("soymilk" = 0), /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = list("ketchup" = 0), @@ -414,21 +405,6 @@ break remove_object(O) - - //Crayons - //With some input from aranclanos, now 30% less shoddily copypasta - for (var/obj/item/toy/crayon/O in holdingitems) - if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume) - break - var/allowed = get_allowed_by_id(O) - for (var/r_id in allowed) - var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume - var/amount = allowed[r_id] - beaker.reagents.add_reagent(r_id,min(amount, space)) - if (space < amount) - break - remove_object(O) - //Everything else - Transfers reagents from it into beaker for (var/obj/item/weapon/reagent_containers/O in holdingitems) if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume) @@ -436,4 +412,4 @@ var/amount = O.reagents.total_volume O.reagents.trans_to(beaker, amount) if(!O.reagents.total_volume) - remove_object(O) \ No newline at end of file + remove_object(O) diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm index 4e35fb36319..0d648c46fc2 100644 --- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm @@ -565,7 +565,7 @@ reac_volume = ..() var/turf/open/T = get_turf(M) if(istype(T) && prob(reac_volume)) - T.MakeSlippery(TURF_WET_WATER) + T.MakeSlippery(min_wet_time = 5, wet_time_to_add = 1) M.adjust_fire_stacks(-(reac_volume / 10)) M.ExtinguishMob() M.apply_damage(0.1*reac_volume, BRUTE) @@ -586,7 +586,7 @@ /datum/reagent/blob/pressurized_slime/proc/extinguisharea(obj/effect/blob/B, probchance) for(var/turf/open/T in range(1, B)) if(prob(probchance)) - T.MakeSlippery(TURF_WET_WATER) + T.MakeSlippery(min_wet_time = 5, wet_time_to_add = 1) for(var/obj/O in T) O.extinguish() for(var/mob/living/L in T) @@ -663,4 +663,4 @@ if(message_living && !issilicon(M)) totalmessage += message_living totalmessage += "!" - M << "[totalmessage]" \ No newline at end of file + M << "[totalmessage]" diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 4952b70f4b2..c9e1e5c4897 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -155,7 +155,7 @@ if(reac_volume >= 1) // Make Freezy Foam and anti-fire grenades! if(istype(T, /turf/open)) var/turf/open/OT = T - OT.MakeSlippery(TURF_WET_WATER) // Is less effective in high pressure/high heat capacity environments. More effective in low pressure. + OT.MakeSlippery(wet_setting=TURF_WET_ICE, min_wet_time=5, wet_time_to_add=reac_volume*0.5) // Is less effective in high pressure/high heat capacity environments. More effective in low pressure. OT.air.temperature -= MOLES_CELLSTANDARD*100*reac_volume/OT.air.heat_capacity() // reduces environment temperature by 5K per unit. /datum/reagent/consumable/condensedcapsaicin @@ -324,8 +324,7 @@ /datum/reagent/consumable/cornoil/reaction_turf(turf/open/T, reac_volume) if (!istype(T)) return - if(reac_volume >= 3) - T.MakeSlippery() + T.MakeSlippery(min_wet_time = 5, wet_time_to_add = reac_volume*2) var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T) if(hotspot) var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() ) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index b1dee893500..eaf4e1c8c68 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -121,8 +121,9 @@ /datum/reagent/water/reaction_turf(turf/open/T, reac_volume) if (!istype(T)) return var/CT = cooling_temperature - if(reac_volume >= 10) - T.MakeSlippery() + + if(reac_volume >= 5) + T.MakeSlippery(min_wet_time = 5, wet_time_to_add = reac_volume*0.2) for(var/mob/living/simple_animal/slime/M in T) M.apply_water() @@ -172,6 +173,11 @@ description = "Water blessed by some deity." color = "#E0E8EF" // rgb: 224, 232, 239 +/datum/reagent/water/holywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume) + if(is_servant_of_ratvar(M)) + M << "A darkness begins to spread its unholy tendrils through your mind, purging the Justiciar's influence!" + ..() + /datum/reagent/water/holywater/on_mob_life(mob/living/M) if(!data) data = 1 data++ @@ -183,13 +189,23 @@ M.Dizzy(5) if(iscultist(M) && prob(5)) M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","R'ge Na'sie","Diabo us Vo'iscum","Eld' Mon Nobis")) + else if(is_servant_of_ratvar(M) && prob(5)) + switch(pick("speech", "message", "emote")) + if("speech") + M.say("...[pick("Ratvar... lbhe yvtug tebjf qnex", "Jurer ner lbh, znfgre?", "Ur yvrf ehfgvat va Reebe", "Chetr nyy hagehguf naq... naq... fbzrguvat")]...") + if("message") + M << "[pick("Ratvar's illumination of your mind has begun to flicker.", "He lies rusting in Reebe, derelict and forgotten. And there he shall stay.", \ + "You can't save him. Nothing can save him now.", "It seems that Nar-Sie will triumph after all.")]" + if("emote") + M.visible_message("[M] [pick("whimpers quietly", "shivers as though cold", "glances around in paranoia")]") if(data >= 75 && prob(33)) // 30 units, 135 seconds if (!M.confused) M.confused = 1 M.confused += 3 - if(iscultist(M) || (is_handofgod_cultist(M) && !is_handofgod_prophet(M))) + if(iscultist(M) || (is_handofgod_cultist(M) && !is_handofgod_prophet(M)) || is_servant_of_ratvar(M)) ticker.mode.remove_cultist(M.mind, 1, 1) ticker.mode.remove_hog_follower(M.mind) + remove_servant_of_ratvar(M.mind) holder.remove_reagent(src.id, src.volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? M.jitteriness = 0 M.stuttering = 0 @@ -257,7 +273,7 @@ /datum/reagent/lube/reaction_turf(turf/open/T, reac_volume) if (!istype(T)) return if(reac_volume >= 1) - T.MakeSlippery(TURF_WET_LUBE) + T.MakeSlippery(wet_setting=TURF_WET_LUBE, min_wet_time=5, wet_time_to_add=reac_volume) /datum/reagent/spraytan name = "Spray Tan" @@ -1144,7 +1160,8 @@ /datum/reagent/drying_agent/reaction_turf(turf/open/T, reac_volume) if(istype(T) && T.wet) - T.MakeDry(TURF_WET_WATER) + T.wet_time = max(0, T.wet_time-reac_volume*5) // removes 5 seconds of wetness for every unit. + T.HandleWet() /datum/reagent/drying_agent/reaction_obj(obj/O, reac_volume) if(O.type == /obj/item/clothing/shoes/galoshes) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 5bfe942374d..12016ff0618 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -89,14 +89,21 @@ toxpwr = 0 /datum/reagent/toxin/lexorin/on_mob_life(mob/living/M) - M.adjustOxyLoss(5, 0) + . = TRUE + var/mob/living/carbon/C if(iscarbon(M)) - var/mob/living/carbon/C = M - C.losebreath += 2 - if(prob(20)) - M.emote("gasp") + C = M + CHECK_DNA_AND_SPECIES(C) + if(NOBREATH in C.dna.species.specflags) + . = FALSE + + if(.) + M.adjustOxyLoss(5, 0) + if(C) + C.losebreath += 2 + if(prob(20)) + M.emote("gasp") ..() - . = 1 /datum/reagent/toxin/slimejelly name = "Slime Jelly" @@ -260,6 +267,20 @@ . = 1 ..() +/datum/reagent/toxin/chloralhydrate/delayed + id = "chloralhydrate2" + +/datum/reagent/toxin/chloralhydrate/delayed/on_mob_life(mob/living/M) + switch(current_cycle) + if(1 to 10) + return + if(10 to 20) + M.confused += 1 + M.drowsyness += 1 + if(20 to INFINITY) + M.Sleeping(2, 0) + ..() + /datum/reagent/toxin/beer2 //disguised as normal beer for use by emagged brobots name = "Beer" id = "beer2" @@ -700,3 +721,31 @@ M.adjustFireLoss(current_cycle/10, 0) // I rode a tank, held a general's rank . = 1 // When the blitzkrieg raged and the bodies stank ..() // Pleased to meet you, hope you guess my name + +/datum/reagent/toxin/peaceborg/confuse + name = "Dizzying Solution" + id = "dizzysolution" + description = "Makes the target off balance and dizzy" + toxpwr = 0 + metabolization_rate = 1.5 * REAGENTS_METABOLISM + +/datum/reagent/toxin/peaceborg/confuse/on_mob_life(mob/living/M) + M.confused += 1 + M.Dizzy(1) + if(prob(20)) + M << "You feel confused and disorientated." + ..() + +/datum/reagent/toxin/peaceborg/tire + name = "Tiring Solution" + id = "tiresolution" + description = "An extremely weak stamina-toxin that tires out the target. Completely harmless." + toxpwr = 0 + metabolization_rate = 1.5 * REAGENTS_METABOLISM + +/datum/reagent/toxin/peaceborg/tire/on_mob_life(mob/living/M) + if(M.staminaloss < 50) + M.adjustStaminaLoss(10) + if(prob(30)) + M << "You should sit down and take a rest..." + ..() \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 679999b573c..e6188a387f5 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -207,3 +207,13 @@ Borg Shaker recharge_time = 3 reagent_ids = list("beer2") + +/obj/item/weapon/reagent_containers/borghypo/peace + name = "Peace Hypospray" + + reagent_ids = list("dizzysolution","tiresolution") + +/obj/item/weapon/reagent_containers/borghypo/peace/hacked + desc = "Everything's peaceful in death!" + icon_state = "borghypo_s" + reagent_ids = list("dizzysolution","tiresolution","tirizene","sulfonal","sodium_thiopental","cyanide","neurotoxin2") \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 3bcd9d6a5ef..0a25b46d7d0 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -174,16 +174,23 @@ /obj/item/weapon/reagent_containers/glass/beaker/noreact name = "cryostasis beaker" - desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units." + desc = "A cryostasis beaker that allows for chemical storage without \ + reactions. Can hold up to 50 units." icon_state = "beakernoreact" materials = list(MAT_GLASS=500) volume = 50 amount_per_transfer_from_this = 10 - flags = OPENCONTAINER | NOREACT + flags = OPENCONTAINER + +/obj/item/weapon/reagent_containers/glass/beaker/noreact/New() + ..() + reagents.set_reacting(FALSE) /obj/item/weapon/reagent_containers/glass/beaker/bluespace name = "bluespace beaker" - desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units." + desc = "A bluespace beaker, powered by experimental bluespace technology \ + and Element Cuban combined with the Compound Pete. Can hold up to \ + 300 units." icon_state = "beakerbluespace" materials = list(MAT_GLASS=5000) volume = 300 diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index e65c3fac38e..68bc332d528 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -12,6 +12,7 @@ volume = 15 var/mode = SYRINGE_DRAW var/busy = 0 // needed for delayed drawing of blood + var/projectile_type = /obj/item/projectile/bullet/dart/syringe materials = list(MAT_METAL=10, MAT_GLASS=20) /obj/item/weapon/reagent_containers/syringe/New() @@ -181,7 +182,7 @@ /obj/item/weapon/reagent_containers/syringe/update_icon() - var/rounded_vol = Clamp(round(reagents.total_volume,5), 0, 15) + var/rounded_vol = Clamp(round((reagents.total_volume / volume * 15),5), 0, 15) overlays.Cut() if(ismob(loc)) var/injoverlay @@ -253,4 +254,25 @@ desc = "A syringe recovered from a dread place. It probably isn't wise to use." amount_per_transfer_from_this = 1 volume = 1 - list_reagents = list("gluttonytoxin" = 1) \ No newline at end of file + list_reagents = list("gluttonytoxin" = 1) + +/obj/item/weapon/reagent_containers/syringe/bluespace + name = "bluespace syringe" + desc = "An advanced syringe that can hold 60 units of chemicals" + amount_per_transfer_from_this = 20 + volume = 60 + +/obj/item/weapon/reagent_containers/syringe/noreact + name = "cryo syringe" + desc = "An advanced syringe that stops reagents inside from reacting. It can hold up to 20 units." + volume = 20 + +/obj/item/weapon/reagent_containers/syringe/noreact/New() + . = ..() + reagents.set_reacting(FALSE) + +/obj/item/weapon/reagent_containers/syringe/piercing + name = "piercing syringe" + desc = "A diamond-tipped syringe that pierces armor when launched at high velocity. It can hold up to 10 units." + volume = 10 + projectile_type = /obj/item/projectile/bullet/dart/syringe/piercing diff --git a/code/modules/recycling/disposal-structures.dm b/code/modules/recycling/disposal-structures.dm index d5c7403d185..926f2afbb31 100644 --- a/code/modules/recycling/disposal-structures.dm +++ b/code/modules/recycling/disposal-structures.dm @@ -136,7 +136,7 @@ var/dpdir = 0 // bitmask of pipe directions dir = 0 // dir will contain dominant direction for junction pipes var/health = 10 // health points 0-10 - layer = 2.3 // slightly lower than wires and other pipes + layer = DISPOSAL_PIPE_LAYER // slightly lower than wires and other pipes var/base_icon_state // initial icon state on map var/obj/structure/disposalconstruct/stored diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index d7e9ef3882f..88f2ecad568 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -71,7 +71,7 @@ materials = list(MAT_METAL = 3000, MAT_PLASMA = 3000, MAT_DIAMOND = 500) reliability = 76 build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace - category = list("Misc","Medical Designs") + category = list("Medical Designs", "Bluespace Designs") /datum/design/noreactbeaker name = "Cryostasis Beaker" @@ -84,6 +84,39 @@ build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact category = list("Medical Designs") +/datum/design/bluespacesyringe + name = "Bluespace Syringe" + desc = "An advanced syringe that can hold 60 units of chemicals" + id = "bluespacesyringe" + req_tech = list("bluespace" = 3, "materials" = 4, "combat" = 2) + build_type = PROTOLATHE + materials = list(MAT_GLASS = 4000, MAT_PLASMA = 2000, MAT_DIAMOND = 2000) + reliability = 76 + build_path = /obj/item/weapon/reagent_containers/syringe/bluespace + category = list("Medical Designs", "Bluespace Designs") + +/datum/design/noreactsyringe + name = "Cryo Syringe" + desc = "An advanced syringe that stops reagents inside from reacting. It can hold up to 20 units." + id = "noreactsyringe" + req_tech = list("materials" = 2, "combat" = 2) + build_type = PROTOLATHE + materials = list(MAT_GLASS = 4000, MAT_GOLD = 1000) + reliability = 76 + build_path = /obj/item/weapon/reagent_containers/syringe/noreact + category = list("Medical Designs") + +/datum/design/piercesyringe + name = "Piercing Syringe" + desc = "A diamond-tipped syringe that pierces armor when launched at high velocity. It can hold up to 10 units." + id = "piercesyringe" + req_tech = list("materials" = 3, "combat" = 3) + build_type = PROTOLATHE + materials = list(MAT_GLASS = 4000, MAT_DIAMOND = 1500) + reliability = 76 + build_path = /obj/item/weapon/reagent_containers/syringe/piercing + category = list("Medical Designs") + /datum/design/bluespacebodybag name = "Bluespace body bag" desc = "A bluespace body bag, powered by experimental bluespace technology. It can hold loads of bodies and the largest of creatures." @@ -132,6 +165,17 @@ build_path = /obj/item/organ/cyberimp/mouth/breathing_tube category = list("Misc", "Medical Designs") +/datum/design/cyberimp_toolset + name = "Toolset Arm implant" + desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm." + id = "ci-toolset" + req_tech = list("materials" = 4, "engineering" = 3, "biotech" = 4, "powerstorage" = 4) + build_type = PROTOLATHE | MECHFAB + materials = list (MAT_METAL = 2500, MAT_GLASS = 1500, MAT_SILVER = 1500) + construction_time = 200 + build_path = /obj/item/organ/cyberimp/arm/toolset + category = list("Misc", "Medical Designs") + /datum/design/cyberimp_medical_hud name = "Medical HUD implant" desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control." diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 254c87a22ca..96934df98e7 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -184,16 +184,6 @@ build_path = /obj/item/weapon/gun/energy/ionrifle/carbine category = list("Weapons") -/datum/design/gatling - name = "Laser Gatling Gun" - desc = "A massive weapon with a backpack mounted power source." - id = "gatlinggun" - req_tech = list("combat" = 6, "materials" = 4, "magnets" = 4) - build_type = PROTOLATHE - materials = list(MAT_METAL = 30000, MAT_SILVER = 4000, MAT_DIAMOND = 6000, MAT_URANIUM = 10000) - build_path = /obj/item/weapon/minigunpack - category = list("Weapons") - /datum/design/wormhole_projector name = "Bluespace Wormhole Projector" desc = "A projector that emits high density quantum-coupled bluespace beams." diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index 61a17593f7b..19802dda3c1 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -30,8 +30,11 @@ /obj/structure/lavaland_door/singularity_pull() return 0 -/obj/structure/lavaland_door/Destroy() - return QDEL_HINT_LETMELIVE +/obj/structure/lavaland_door/Destroy(force) + if(force) + . = ..() + else + return QDEL_HINT_LETMELIVE /obj/machinery/lavaland_controller name = "weather control machine" @@ -50,8 +53,11 @@ LAVA.weather_start_up() ongoing_weather = null -/obj/machinery/lavaland_controller/Destroy() - return QDEL_HINT_LETMELIVE +/obj/machinery/lavaland_controller/Destroy(force) + if(force) + . = ..() + else + return QDEL_HINT_LETMELIVE //lavaland_surface_seed_vault.dmm //Seed Vault @@ -223,7 +229,7 @@ name = "ash walker egg" icon = 'icons/mob/lavaland/lavaland_monsters.dmi' icon_state = "large_egg" - mob_species = /datum/species/lizard + mob_species = /datum/species/lizard/ashwalker helmet = /obj/item/clothing/head/helmet/gladiator uniform = /obj/item/clothing/under/gladiator roundstart = FALSE @@ -237,8 +243,6 @@ new_spawn << "Drag corpses to your nest to feed the young, and spawn more Ash Walkers. Bring glory to the tribe!" if(ishuman(new_spawn)) var/mob/living/carbon/human/H = new_spawn - H.dna.species.specflags |= NOBREATH - H.dna.species.specflags |= NOGUNS H.underwear = "Nude" H.update_body() diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security_levels/keycard_authentication.dm similarity index 100% rename from code/modules/security levels/keycard authentication.dm rename to code/modules/security_levels/keycard_authentication.dm diff --git a/code/modules/security levels/security levels.dm b/code/modules/security_levels/security_levels.dm similarity index 100% rename from code/modules/security levels/security levels.dm rename to code/modules/security_levels/security_levels.dm diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index acbcbb82fbe..26b754d31f5 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -1,3 +1,8 @@ +#define TIME_LEFT (SSshuttle.emergency.timeLeft()) +#define ENGINES_START_TIME 10 +#define ENGINES_STARTED (TIME_LEFT <= ENGINES_START_TIME) +#define IS_DOCKED (SSshuttle.emergency.mode == SHUTTLE_DOCKED) + /obj/machinery/computer/emergency_shuttle name = "emergency shuttle console" desc = "For shuttle control." @@ -6,61 +11,165 @@ var/auth_need = 3 var/list/authorized = list() +/obj/machinery/computer/emergency_shuttle/attackby(obj/item/I, mob/user,params) + if(istype(I, /obj/item/weapon/card/id)) + say("Please equip your ID card into your ID slot to authenticate.") + . = ..() -/obj/machinery/computer/emergency_shuttle/attackby(obj/item/I, mob/user, params) - var/obj/item/weapon/card/id/ID = I.GetID() - if(ID) - if(stat & (BROKEN|NOPOWER)) - return - if(SSshuttle.emergency.mode != SHUTTLE_DOCKED) - return - if(SSshuttle.emergency.timeLeft() < 11) - return - if(!(access_heads in ID.access)) //doesn't have this access - user << "The access level of [ID.registered_name]\'s card is not high enough. " - return +/obj/machinery/computer/emergency_shuttle/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = human_adjacent_state) - var/choice = alert(user, text("Would you like to (un)authorize a shortened launch time? [] authorization\s are still needed. Use abort to cancel all authorizations.", src.auth_need - src.authorized.len), "Shuttle Launch", "Authorize", "Repeal", "Abort") - if(SSshuttle.emergency.mode != SHUTTLE_DOCKED || user.get_active_hand() != ID) - return + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "emergency_shuttle_console", name, + 400, 400, master_ui, state) + ui.open() - var/seconds = SSshuttle.emergency.timeLeft() - if(seconds <= 10) - return +/obj/machinery/computer/emergency_shuttle/ui_data() + var/list/data = list() - switch(choice) - if("Authorize") - if(!authorized.Find(ID.registered_name)) - authorized += ID.registered_name - if(auth_need - authorized.len > 0) - message_admins("[key_name_admin(user.client)](?) (FLW) has authorized early shuttle launch ",0,1) - log_game("[key_name(user)] has authorized early shuttle launch in ([x],[y],[z])") - minor_announce("[auth_need - authorized.len] more authorization(s) needed until shuttle is launched early",null,1) - else - message_admins("[key_name_admin(user.client)](?) (FLW) has launched the emergency shuttle [seconds] seconds before launch.",0,1) - log_game("[key_name(user)] has launched the emergency shuttle in ([x],[y],[z]) [seconds] seconds before launch.") - minor_announce("The emergency shuttle will launch in 10 seconds",null,1) - SSshuttle.emergency.setTimer(100) + data["timer_str"] = SSshuttle.emergency.getTimerStr() + data["engines_started"] = ENGINES_STARTED + data["authorizations_remaining"] = max((auth_need - authorized.len), 0) + var/list/A = list() + for(var/i in authorized) + var/obj/item/weapon/card/id/ID = i + var/name = ID.registered_name + var/job = ID.assignment - if("Repeal") - if(authorized.Remove(ID.registered_name)) - minor_announce("[auth_need - authorized.len] authorizations needed until shuttle is launched early") + if(emagged) + name = Gibberish(name, 0) + job = Gibberish(job, 0) + A += list(list("name" = name, "job" = job)) + data["authorizations"] = A - if("Abort") - if(authorized.len) - minor_announce("All authorizations to launch the shuttle early have been revoked.") - authorized.Cut() - else - return ..() + data["enabled"] = (IS_DOCKED && !ENGINES_STARTED) + data["emagged"] = emagged + return data + +/obj/machinery/computer/emergency_shuttle/ui_act(action, params, datum/tgui/ui) + if(..()) + return + if(ENGINES_STARTED) // past the point of no return + return + if(!IS_DOCKED) // shuttle computer only has uses when onstation + return + + var/mob/user = usr + . = FALSE + + var/obj/item/weapon/card/id/ID = user.get_idcard() + + if(!ID) + user << "You don't have an ID." + return + + if(!(access_heads in ID.access)) + user << "The access level of \ + your card is not high enough." + return + + var/old_len = authorized.len + + switch(action) + if("authorize") + . = authorize(user) + + if("repeal") + authorized -= ID + + if("abort") + if(authorized.len) + // Abort. The action for when heads are fighting over whether + // to launch early. + authorized.Cut() + . = TRUE + + if((old_len != authorized.len) && !ENGINES_STARTED) + var/alert = (authorized.len > old_len) + if(authorized.len) + minor_announce("[auth_need - authorized.len] authorizations \ + needed until shuttle is launched early", null, alert) + else + minor_announce("All authorizations to launch the shuttle \ + early have been revoked.") + +/obj/machinery/computer/emergency_shuttle/proc/authorize(mob/user, source) + var/obj/item/weapon/card/id/ID = user.get_idcard() + + if(ID in authorized) + return FALSE + for(var/i in authorized) + var/obj/item/weapon/card/id/other = i + if(other.registered_name == ID.registered_name) + return FALSE // No using IDs with the same name + + authorized += ID + + message_admins("[key_name_admin(user.client)] \ + (?) \ + (FLW) \ + has authorized early shuttle launch", 0, 1) + log_game("[key_name(user)] has authorized early shuttle launch in \ + ([x],[y],[z])") + // Now check if we're on our way + . = TRUE + process() + +/obj/machinery/computer/emergency_shuttle/process() + // Launch check is in process in case auth_need changes for some reason + // probably external. + . = FALSE + if(ENGINES_STARTED || (!IS_DOCKED)) + return . + + // Check to see if we've reached criteria for early launch + if((authorized.len >= auth_need) || emagged) + // shuttle timers use 1/10th seconds internally + SSshuttle.emergency.setTimer(ENGINES_START_TIME * 10) + var/system_error = emagged ? "SYSTEM ERROR:" : null + minor_announce("The emergency shuttle will launch in \ + [ENGINES_START_TIME] seconds", system_error, alert=TRUE) + . = TRUE /obj/machinery/computer/emergency_shuttle/emag_act(mob/user) - if(!emagged && SSshuttle.emergency.mode == SHUTTLE_DOCKED) - var/time = SSshuttle.emergency.timeLeft() - message_admins("[key_name_admin(user.client)](?) (FLW) has emagged the emergency shuttle [time] seconds before launch.",0,1) - log_game("[key_name(user)] has emagged the emergency shuttle in ([x],[y],[z]) [time] seconds before launch.") - minor_announce("The emergency shuttle will launch in 10 seconds", "SYSTEM ERROR:",null,1) - SSshuttle.emergency.setTimer(100) - emagged = 1 + // How did you even get on the shuttle before it go to the station? + if(!IS_DOCKED) + return + + var/time = TIME_LEFT + message_admins("[key_name_admin(user.client)] \ + (?) \ + (FLW) \ + has emagged the emergency shuttle [time] seconds before launch.", 0, 1) + log_game("[key_name(user)] has emagged the emergency shuttle in \ + ([x],[y],[z]) [time] seconds before launch.") + emagged = TRUE + var/datum/species/S = new + for(var/i in 1 to 10) + // the shuttle system doesn't know who these people are, but they + // must be important, surely + var/obj/item/weapon/card/id/ID = new(src) + var/datum/job/J = pick(SSjob.occupations) + ID.registered_name = S.random_name(pick(MALE, FEMALE)) + ID.assignment = J.title + + authorized += ID + + if(ENGINES_STARTED) + // Give them a message anyway + user << "The shuttle is already \ + about to launch!" + else + process() + +/obj/machinery/computer/emergency_shuttle/Destroy() + // Our fake IDs that the emag generated are just there for colour + // They're not supposed to be accessible + + for(var/obj/item/weapon/card/id/ID in src) + qdel(ID) + + . = ..() /obj/docking_port/mobile/emergency name = "emergency shuttle" @@ -74,16 +183,16 @@ roundstart_move = "emergency_away" var/sound_played = 0 //If the launch sound has been sent to all players on the shuttle itself -/obj/docking_port/mobile/emergency/New() - ..() - // The last created emergency shuttle will always be the one - // that we use. +/obj/docking_port/mobile/emergency/register() + . = ..() SSshuttle.emergency = src -/obj/docking_port/mobile/emergency/Destroy() - if(src.i_know_what_im_doing) +/obj/docking_port/mobile/emergency/Destroy(force) + if(force) // This'll make the shuttle subsystem use the backup shuttle. - SSshuttle.emergencyDeregister() + if(src == SSshuttle.emergency) + // If we're the selected emergency shuttle + SSshuttle.emergencyDeregister() . = ..() @@ -342,12 +451,16 @@ // We want to be a valid emergency shuttle // but not be the main one, keep whatever's set // valid. + // backup shuttle ignores `timid` because THERE SHOULD BE NO TOUCHING IT var/current_emergency = SSshuttle.emergency ..() SSshuttle.emergency = current_emergency SSshuttle.backup_shuttle = src - #undef UNLAUNCHED #undef LAUNCHED #undef EARLY_LAUNCHED +#undef TIMELEFT +#undef ENGINES_START_TIME +#undef ENGINES_STARTED +#undef IS_DOCKED diff --git a/code/modules/shuttle/manipulator.dm b/code/modules/shuttle/manipulator.dm index 55913ab432f..d30cc49f381 100644 --- a/code/modules/shuttle/manipulator.dm +++ b/code/modules/shuttle/manipulator.dm @@ -6,8 +6,268 @@ I took the one less traveled by,\n\ And that has made all the difference." - icon = 'icons/obj/machines/dominator.dmi' - icon_state = "dominator-blue" + icon = 'icons/obj/machines/shuttle_manipulator.dmi' + icon_state = "holograph_on" + + // UI state variables + var/datum/map_template/shuttle/selected + + var/obj/docking_port/mobile/existing_shuttle + + var/obj/docking_port/mobile/preview_shuttle + var/datum/map_template/shuttle/preview_template + +/obj/machinery/shuttle_manipulator/New() + . = ..() + update_icon() + +/obj/machinery/shuttle_manipulator/update_icon() + overlays.Cut() + var/image/hologram_projection = image(icon, "hologram_on") + hologram_projection.pixel_y = 22 + var/image/hologram_ship = image(icon, "hologram_whiteship") + hologram_ship.pixel_y = 27 + overlays += hologram_projection + overlays += hologram_ship /obj/machinery/shuttle_manipulator/process() return + +/obj/machinery/shuttle_manipulator/ui_interact(mob/user, ui_key = "main", \ + datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, \ + datum/ui_state/state = admin_state) + + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "shuttle_manipulator", name, 800, 600, \ + master_ui, state) + ui.open() + +/proc/shuttlemode2str(mode) + switch(mode) + if(SHUTTLE_IDLE) + . = "idle" + if(SHUTTLE_RECALL) + . = "recalled" + if(SHUTTLE_CALL) + . = "called" + if(SHUTTLE_DOCKED) + . = "docked" + if(SHUTTLE_STRANDED) + . = "stranded" + if(SHUTTLE_ENDGAME) + . = "endgame" + if(!.) + throw EXCEPTION("shuttlemode2str(): invalid mode [mode]") + + +/obj/machinery/shuttle_manipulator/ui_data(mob/user) + var/list/data = list() + data["tabs"] = list("Status", "Templates", "Modification") + + // Templates panel + data["templates"] = list() + var/list/templates = data["templates"] + data["templates_tabs"] = list() + data["selected"] = list() + + for(var/shuttle_id in shuttle_templates) + var/datum/map_template/shuttle/S = shuttle_templates[shuttle_id] + + if(!templates[S.port_id]) + data["templates_tabs"] += S.port_id + templates[S.port_id] = list( + "port_id" = S.port_id, + "templates" = list()) + + var/list/L = list() + L["name"] = S.name + L["shuttle_id"] = S.shuttle_id + L["port_id"] = S.port_id + L["description"] = S.description + L["admin_notes"] = S.admin_notes + + if(selected == S) + data["selected"] = L + + templates[S.port_id]["templates"] += list(L) + + data["templates_tabs"] = sortList(data["templates_tabs"]) + + data["existing_shuttle"] = null + + // Status panel + data["shuttles"] = list() + for(var/i in SSshuttle.mobile) + var/obj/docking_port/mobile/M = i + var/list/L = list() + L["name"] = M.name + L["id"] = M.id + L["timer"] = M.timer + L["timeleft"] = M.getTimerStr() + L["mode"] = capitalize(shuttlemode2str(M.mode)) + L["status"] = M.getStatusText() + if(M == existing_shuttle) + data["existing_shuttle"] = L + + data["shuttles"] += list(L) + + return data + +/obj/machinery/shuttle_manipulator/ui_act(action, params) + if(..()) + return + + var/mob/user = usr + + // Preload some common parameters + var/shuttle_id = params["shuttle_id"] + var/datum/map_template/shuttle/S = shuttle_templates[shuttle_id] + + switch(action) + if("select_template") + if(S) + existing_shuttle = SSshuttle.getShuttle(S.port_id) + selected = S + . = TRUE + if("jump_to") + if(params["type"] == "mobile") + . = TRUE + for(var/i in SSshuttle.mobile) + var/obj/docking_port/mobile/M = i + if(M.id == params["id"]) + user.forceMove(get_turf(M)) + break + + if("preview") + if(S) + . = TRUE + unload_preview() + load_template(S) + if(preview_shuttle) + preview_template = S + user.forceMove(get_turf(preview_shuttle)) + if("load") + if(existing_shuttle == SSshuttle.backup_shuttle) + // TODO make the load button disabled + WARNING("The shuttle that the selected shuttle will replace \ + is the backup shuttle. Backup shuttle is required to be \ + intact for round sanity.") + else if(S) + . = TRUE + // If successful, returns the mobile docking port + var/mdp = action_load(S) + if(mdp) + user.forceMove(get_turf(mdp)) + + update_icon() + +/obj/machinery/shuttle_manipulator/proc/action_load( + datum/map_template/shuttle/loading_template) + // Check for an existing preview + if(preview_shuttle && (loading_template != preview_template)) + preview_shuttle.jumpToNullSpace() + preview_shuttle = null + preview_template = null + + if(!preview_shuttle) + load_template(loading_template) + preview_template = loading_template + + // get the existing shuttle information, if any + var/timer = 0 + var/mode = SHUTTLE_IDLE + var/obj/docking_port/stationary/D + + if(existing_shuttle) + timer = existing_shuttle.timer + mode = existing_shuttle.mode + D = existing_shuttle.get_docked() + else + D = preview_shuttle.findRoundstartDock() + + if(!D) + var/m = "No dock found for preview shuttle, aborting." + WARNING(m) + throw EXCEPTION(m) + + var/result = preview_shuttle.canDock(D) + // truthy value means that it cannot dock for some reason + // but we can ignore the someone else docked error because we'll + // be moving into their place shortly + if(result && (result != SHUTTLE_SOMEONE_ELSE_DOCKED)) + var/m = "Unsuccessful dock of [preview_shuttle] ([result])." + WARNING(m) + return + + existing_shuttle.jumpToNullSpace() + + preview_shuttle.dock(D) + . = preview_shuttle + + // Shuttle state involves a mode and a timer based on world.time, so + // plugging the existing shuttles old values in works fine. + preview_shuttle.timer = timer + preview_shuttle.mode = mode + + preview_shuttle.register() + + // TODO indicate to the user that success happened, rather than just + // blanking the modification tab + preview_shuttle = null + preview_template = null + existing_shuttle = null + selected = null + + return preview_shuttle + +/obj/machinery/shuttle_manipulator/proc/load_template( + datum/map_template/shuttle/S) + // load shuttle template, centred at shuttle import landmark, + var/turf/landmark_turf = get_turf(locate("landmark*Shuttle Import")) + S.load(landmark_turf, centered = TRUE) + + var/affected = S.get_affected_turfs(landmark_turf, centered=TRUE) + + var/found = 0 + // Search the turfs for docking ports + // - We need to find the mobile docking port because that is the heart of + // the shuttle. + // - We need to check that no additional ports have slipped in from the + // template, because that causes unintended behaviour. + for(var/T in affected) + for(var/obj/docking_port/P in T) + if(istype(P, /obj/docking_port/mobile)) + var/obj/docking_port/mobile/M = P + found++ + if(found > 1) + qdel(P, force=TRUE) + world.log << "Map warning: Shuttle Template [S.mappath] \ + has multiple mobile docking ports." + else if(!M.timid) + // The shuttle template we loaded isn't "timid" which means + // it's already registered with the shuttles subsystem. + // This is a bad thing. + var/m = "Template [S] is non-timid! Unloading." + WARNING(m) + M.jumpToNullSpace() + return + else + preview_shuttle = P + if(istype(P, /obj/docking_port/stationary)) + world.log << "Map warning: Shuttle Template [S.mappath] has a \ + stationary docking port." + if(!found) + var/msg = "load_template(): Shuttle Template [S.mappath] has no \ + mobile docking port. Aborting import." + for(var/T in affected) + var/turf/T0 = T + T0.empty() + + message_admins(msg) + WARNING(msg) + +/obj/machinery/shuttle_manipulator/proc/unload_preview() + if(preview_shuttle) + preview_shuttle.jumpToNullSpace() + preview_shuttle = null diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index b0c3f08652d..1d1e3006f45 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -18,18 +18,16 @@ var/dwidth = 0 //position relative to covered area, perpendicular to dir var/dheight = 0 //position relative to covered area, parallel to dir - var/i_know_what_im_doing = 0 - //these objects are indestructable -/obj/docking_port/Destroy() +/obj/docking_port/Destroy(force) // unless you assert that you know what you're doing. Horrible things // may result. - if(!i_know_what_im_doing) - return QDEL_HINT_LETMELIVE + if(force) + ..() + . = QDEL_HINT_HARDDEL_NOW else - // If not removed immediately, it can interfere with the docking - // detection code, which is annoying and inconvinient. - return QDEL_HINT_HARDDEL_NOW + return QDEL_HINT_LETMELIVE + /obj/docking_port/singularity_pull() return /obj/docking_port/singularity_act() @@ -187,12 +185,20 @@ var/launch_status = NOLAUNCH + // A timid shuttle will not register itself with the shuttle subsystem + // All shuttle templates are timid + var/timid = FALSE + /obj/docking_port/mobile/New() ..() + if(!timid) + register() + +/obj/docking_port/mobile/proc/register() SSshuttle.mobile += src -/obj/docking_port/mobile/Destroy() - if(i_know_what_im_doing) +/obj/docking_port/mobile/Destroy(force) + if(force) SSshuttle.mobile -= src . = ..() @@ -222,29 +228,35 @@ //this is to check if this shuttle can physically dock at dock S /obj/docking_port/mobile/proc/canDock(obj/docking_port/stationary/S) if(!istype(S)) - return 1 + return SHUTTLE_NOT_A_DOCKING_PORT + if(istype(S, /obj/docking_port/stationary/transit)) - return 0 - //check dock is big enough to contain us + return FALSE + if(dwidth > S.dwidth) - return 2 + return SHUTTLE_DWIDTH_TOO_LARGE + if(width-dwidth > S.width-S.dwidth) - return 3 + return SHUTTLE_WIDTH_TOO_LARGE + if(dheight > S.dheight) - return 4 + return SHUTTLE_DHEIGHT_TOO_LARGE + if(height-dheight > S.height-S.dheight) - return 5 + return SHUTTLE_HEIGHT_TOO_LARGE + //check the dock isn't occupied var/currently_docked = S.get_docked() if(currently_docked) // by someone other than us if(currently_docked != src) - return 6 + return SHUTTLE_SOMEONE_ELSE_DOCKED else // This isn't an error, per se, but we can't let the shuttle code // attempt to move us where we currently are, it will get weird. return SHUTTLE_ALREADY_DOCKED - return 0 //0 means we can dock + + return FALSE //call the shuttle to destination S /obj/docking_port/mobile/proc/request(obj/docking_port/stationary/S) @@ -254,13 +266,10 @@ // Triggering shuttle movement code in place is weird return else if(status) - . = status - spawn(0) - var/msg = "request(): shuttle [src] cannot dock at [S], \ - error: [status]" - message_admins(msg) - throw EXCEPTION(msg) - return status //we can't dock at S + var/msg = "request(): shuttle [src] cannot dock at [S], \ + error: [status]" + message_admins(msg) + throw EXCEPTION(msg) switch(mode) if(SHUTTLE_CALL) @@ -330,6 +339,8 @@ var/obj/docking_port/stationary/S0 = get_docked() var/turf_type = /turf/open/space var/area_type = /area/space + // If the shuttle is docked to a stationary port, restore its normal + // "empty" area and turf if(S0) if(S0.turf_type) turf_type = S0.turf_type @@ -346,25 +357,13 @@ for(var/turf/T0 in L0) A0.contents += T0 - for(var/i=1, i<=L0.len, ++i) - var/turf/T0 = L0[i] + for(var/i in L0) + var/turf/T0 =i if(!T0) continue + T0.empty(turf_type) - for(var/atom/AM in T0.GetAllContents()) - if(istype(AM, /mob/dead)) - continue - qdel(AM) - - T0.ChangeTurf(turf_type) - - T0.redraw_lighting() - SSair.remove_from_active(T0) - T0.CalculateAdjacentTurfs() - SSair.add_to_active(T0,1) - - src.i_know_what_im_doing = TRUE - qdel(src) + qdel(src, force=TRUE) //this is the main proc. It instantly moves our mobile port to stationary port S1 //it handles all the generic behaviour, such as sanity checks, closing doors on the shuttle, stunning mobs, etc @@ -372,8 +371,8 @@ // Crashing this ship with NO SURVIVORS if(!force) var/status = canDock(S1) - if(status == 7) - return SHUTTLE_ALREADY_DOCKED + if(status == SHUTTLE_ALREADY_DOCKED) + return status else if(status) spawn(0) var/msg = "dock(): shuttle [src] cannot dock at [S1], \ @@ -552,15 +551,25 @@ /obj/docking_port/mobile/proc/roadkill(list/L, dir, x, y) for(var/turf/T in L) for(var/atom/movable/AM in T) - if(ismob(AM)) + if(isliving(AM)) if(ishuman(AM)) var/mob/living/M = AM + M.visible_message("[M] is hit by \ + a bluespace ripple and thrown clear!", + "You feel an immense \ + crushing pressure as the space around you ripples.\ + ") + M.Paralyse(10) M.apply_damage(60, BRUTE, "chest") M.apply_damage(60, BRUTE, "head") M.anchored = 0 else var/mob/M = AM + M.visible_message("[M] is hit by \ + a bluespace ripple and is torn into pieces!", + "You are torn into pieces by \ + bluespace churn.") M.gib() continue diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm new file mode 100644 index 00000000000..9112554fcfd --- /dev/null +++ b/code/modules/shuttle/special.dm @@ -0,0 +1,197 @@ +// Special objects for shuttle templates go here if nowhere else + +// Wabbajack statue, a sleeping frog statue that shoots bolts of change if +// living carbons are put on its altar/tables + +/obj/machinery/power/emitter/energycannon/magical + name = "wabbajack statue" + desc = "Who am I? What is my purpose in life? What do I mean by who am I?" + projectile_type = /obj/item/projectile/magic/change + icon = 'icons/obj/machines/magic_emitter.dmi' + icon_state = "wabbajack_statue" + icon_state_on = "wabbajack_statue_on" + var/list/active_tables = list() + active = FALSE + +/obj/machinery/power/emitter/energycannon/magical/New() + . = ..() + if(prob(50)) + desc = "Oh no, not again." + update_icon() + +/obj/machinery/power/emitter/energycannon/magical/update_icon() + if(active) + icon_state = icon_state_on + else + icon_state = initial(icon_state) + +/obj/machinery/power/emitter/energycannon/magical/process() + . = ..() + var/changed = FALSE + if(active_tables.len >= 2) + if(!active) + visible_message("\ + [src] opens its eyes.") + changed = TRUE + active = TRUE + else + if(active) + visible_message("\ + [src] closes its eyes.") + changed = TRUE + active = FALSE + + if(changed) + update_icon() + +/obj/machinery/power/emitter/energycannon/magical/attack_hand(mob/user) + return + +/obj/machinery/power/emitter/energycannon/magical/attackby(obj/item/W, mob/user, params) + return + +/obj/machinery/power/emitter/energycannon/magical/ex_act(severity) + return + +/obj/machinery/power/emitter/energycannon/magical/emag_act(mob/user) + return + +/obj/structure/table/abductor/wabbajack + name = "wabbajack altar" + health = 1000 + verb_say = "chants" + var/obj/machinery/power/emitter/energycannon/magical/our_statue + var/list/mob/living/sleepers = list() + var/never_spoken = TRUE + flags = NODECONSTRUCT + +/obj/structure/table/abductor/wabbajack/New() + . = ..() + SSobj.processing += src + +/obj/structure/table/abductor/wabbajack/Destroy() + SSobj.processing -= src + . = ..() + +/obj/structure/table/abductor/wabbajack/process() + var/area = orange(4, src) + if(!our_statue) + for(var/obj/machinery/power/emitter/energycannon/magical/M in area) + our_statue = M + break + + var/turf/T = get_turf(src) + var/list/found = list() + for(var/mob/living/carbon/C in T) + if(C.stat != DEAD) + found += C + + // New sleepers + for(var/i in found - sleepers) + var/mob/living/L = i + L.color = "#800080" + L.visible_message("A strange purple glow \ + wraps itself around [L] as they suddenly fall unconcious.", + "[desc]") + + + // Existing sleepers + for(var/i in found) + var/mob/living/L = i + L.SetSleeping(10) + + // Missing sleepers + for(var/i in sleepers - found) + var/mob/living/L = i + L.color = initial(L.color) + L.visible_message("The glow from [L] fades \ + away.") + + sleepers = found + + if(sleepers.len) + our_statue.active_tables |= src + if(never_spoken || prob(5)) + say(desc) + never_spoken = FALSE + else + our_statue.active_tables &= src + +/obj/structure/table/abductor/wabbajack/left + desc = "You sleep so it may wake." + +/obj/structure/table/abductor/wabbajack/right + desc = "It wakes so you may sleep." + +// Bar staff, GODMODE mobs that just want to make sure people have drinks +// and a good time. + +/mob/living/simple_animal/drone/snowflake/bardrone + name = "Bardrone" + desc = "A barkeeping drone, an indestructible robot built to tend bars." + seeStatic = FALSE + laws = "1. Serve drinks.\n\ + 2. Talk to patrons.\n\ + 3. Don't get messed up in their affairs." + languages = ALL + status_flags = GODMODE // Please don't punch the barkeeper + unique_name = FALSE // disables the (123) number suffix + +/mob/living/simple_animal/drone/snowflake/bardrone/New() + . = ..() + access_card.access |= access_cent_bar + +/mob/living/simple_animal/hostile/alien/maid/barmaid + gold_core_spawnable = 0 + name = "Barmaid" + desc = "A barmaid, a maiden found in a bar." + pass_flags = PASSTABLE + status_flags = GODMODE + languages = ALL + unique_name = FALSE + AIStatus = AI_OFF + stop_automated_movement = TRUE + +/mob/living/simple_animal/hostile/alien/maid/barmaid/New() + . = ..() + access_card = new /obj/item/weapon/card/id(src) + var/datum/job/captain/C = new /datum/job/captain + access_card.access = C.get_access() + access_card.access |= access_cent_bar + access_card.flags |= NODROP + +/mob/living/simple_animal/hostile/alien/maid/barmaid/Destroy() + qdel(access_card) + . = ..() + +// Bar table, a wooden table that kicks you in a direction if you're not +// barstaff (defined as someone who was a roundstart bartender or someone +// with CENTCOM_BARSTAFF) + +/obj/structure/table/wood/bar + burn_state = LAVA_PROOF + flags = NODECONSTRUCT + health = 1000 + var/boot_dir = 1 + +/obj/structure/table/wood/bar/Crossed(atom/movable/AM) + if(isliving(AM) && !is_barstaff(AM)) + // No climbing on the bar please + var/mob/living/M = AM + var/throwtarget = get_edge_target_turf(src, boot_dir) + M.Weaken(2) + M.throw_at_fast(throwtarget, 5, 1,src) + M << "No climbing on the bar please." + else + . = ..() + +/obj/structure/table/wood/bar/proc/is_barstaff(mob/living/user) + . = FALSE + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.mind && H.mind.assigned_role == "Bartender") + return TRUE + + var/obj/item/weapon/card/id/ID = user.get_idcard() + if(ID && (access_cent_bar in ID.access)) + return TRUE diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 2bb0a1d1c35..8aed478964e 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -39,8 +39,8 @@ var/contraband = FALSE var/emagged = FALSE -/obj/docking_port/mobile/supply/New() - ..() +/obj/docking_port/mobile/supply/register() + . = ..() SSshuttle.supply = src /obj/docking_port/mobile/supply/canMove() diff --git a/code/modules/space transition/space_transition.dm b/code/modules/space_transition/space_transition.dm similarity index 100% rename from code/modules/space transition/space_transition.dm rename to code/modules/space_transition/space_transition.dm diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm index d5666f99223..29d1c7cbd2f 100644 --- a/code/modules/spells/spell_types/construct_spells.dm +++ b/code/modules/spells/spell_types/construct_spells.dm @@ -36,7 +36,7 @@ action_icon_state = "lesserconstruct" action_background_icon_state = "bg_cult" - summon_type = list(/turf/closed/wall/cult/artificer) //we don't want artificer-based runed metal farms + summon_type = list(/turf/closed/wall/mineral/cult/artificer) //we don't want artificer-based runed metal farms /obj/effect/proc_holder/spell/aoe_turf/conjure/wall/reinforced name = "Greater Construction" diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm index 07623aad297..9afa9929390 100644 --- a/code/modules/spells/spell_types/ethereal_jaunt.dm +++ b/code/modules/spells/spell_types/ethereal_jaunt.dm @@ -27,7 +27,7 @@ animation.density = 0 animation.anchored = 1 animation.icon = 'icons/mob/mob.dmi' - animation.layer = 5 + animation.layer = FLY_LAYER animation.master = holder target.ExtinguishMob() if(target.buckled) diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm index c7efcd76349..f6a119c428a 100644 --- a/code/modules/spells/spell_types/lichdom.dm +++ b/code/modules/spells/spell_types/lichdom.dm @@ -1,6 +1,11 @@ /obj/effect/proc_holder/spell/targeted/lichdom name = "Bind Soul" - desc = "A dark necromantic pact that can forever bind your soul to an item of your choosing. So long as both your body and the item remain intact and on the same plane you can revive from death, though the time between reincarnations grows steadily with use." + desc = "A dark necromantic pact that can forever bind your soul to an \ + item of your choosing. So long as both your body and the item remain \ + intact and on the same plane you can revive from death, though the time \ + between reincarnations grows steadily with use, along with the weakness \ + that the new skeleton body will experience upon 'birth'. Note that \ + becoming a lich destroys all internal organs except the brain." school = "necromancy" charge_max = 10 clothes_req = 0 diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 987fcc4ce6a..7da8bf4f4b2 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -283,6 +283,10 @@ /obj/item/bodypart/l_arm name = "left arm" + desc = "Did you know that the word 'sinister' stems originally from the \ + Latin 'sinestra' (left hand), because the left hand was supposed to \ + be possessed by the devil? This arm appears to be possessed by no \ + one though." icon_state = "l_arm" max_damage = 50 body_zone ="l_arm" @@ -292,6 +296,8 @@ /obj/item/bodypart/r_arm name = "right arm" + desc = "Over 87% of humans are right handed. That figure is much lower \ + among humans missing their right arm." icon_state = "r_arm" max_damage = 50 body_zone = "r_arm" @@ -301,6 +307,8 @@ /obj/item/bodypart/l_leg name = "left leg" + desc = "Some athletes prefer to tie their left shoelaces first for good \ + luck. In this instance, it probably would not have helped." icon_state = "l_leg" max_damage = 50 body_zone = "l_leg" @@ -310,6 +318,10 @@ /obj/item/bodypart/r_leg name = "right leg" + desc = "You put your right leg in, your right leg out. In, out, in, out, \ + shake it all about. And apparently then it detaches.\n\ + The hokey pokey has certainly changed a lot since space colonisation." + // alternative spellings of 'pokey' are availible icon_state = "r_leg" max_damage = 50 body_zone = "r_leg" @@ -322,15 +334,9 @@ /obj/item/severedtail name = "tail" - desc = "A severed tail." + desc = "A severed tail. Somewhere, no doubt, a lizard hater is very \ + pleased with themselves." icon = 'icons/obj/surgery.dmi' icon_state = "severedtail" color = "#161" var/markings = "Smooth" - - - - - - - diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 6c758a542d3..63fbc29203d 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -5,7 +5,7 @@ max_damage = 200 body_zone = "head" body_part = HEAD - layer = 4.1 //so it isn't hidden behind some objects when on the floor + layer = ABOVE_MOB_LAYER //so it isn't hidden behind some objects when on the floor w_class = 4 //Quite a hefty load slowdown = 1 //Balancing measure throw_range = 2 //No head bowling @@ -35,7 +35,8 @@ playsound(T, 'sound/misc/splort.ogg', 50, 1, -1) for(var/obj/item/I in src) if(I == brain) - user.visible_message("[user] saws [src] open and pulls out a brain!", "You saw [src] open and pull out a brain.") + if(user) + user.visible_message("[user] saws [src] open and pulls out a brain!", "You saw [src] open and pull out a brain.") if(brainmob) brainmob.container = null brainmob.loc = brain @@ -159,3 +160,7 @@ if(standing.len) return standing + +/obj/item/bodypart/head/burn() + drop_organs() + ..() diff --git a/code/modules/surgery/limb augmentation.dm b/code/modules/surgery/limb_augmentation.dm similarity index 100% rename from code/modules/surgery/limb augmentation.dm rename to code/modules/surgery/limb_augmentation.dm diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 8bcdd00522e..a13204e8f9a 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -54,7 +54,7 @@ return 0 /obj/item/organ/cyberimp/arm/gun/emp_act(severity) - if(prob(15/severity)) + if(prob(15/severity) && owner) owner << "[src] is hit by EMP!" // give the owner an idea about why his implant is glitching Retract() @@ -168,7 +168,7 @@ /obj/item/organ/cyberimp/arm/toolset name = "integrated toolset implant" desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm. Contains all neccessary tools." - origin_tech = "materials=5;engineering=5;biotech=4;powerstorage=3" + origin_tech = "materials=4;engineering=4;biotech=3;powerstorage=4" contents = newlist(/obj/item/weapon/screwdriver/cyborg, /obj/item/weapon/wrench/cyborg, /obj/item/weapon/weldingtool/largetank/cyborg, /obj/item/weapon/crowbar/cyborg, /obj/item/weapon/wirecutters/cyborg, /obj/item/device/multitool/cyborg) diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm index 050b0fefbd7..2a4e4a4fbf6 100644 --- a/code/modules/surgery/prosthetic_replacement.dm +++ b/code/modules/surgery/prosthetic_replacement.dm @@ -18,6 +18,7 @@ name = "add prosthetic" implements = list(/obj/item/robot_parts = 100, /obj/item/bodypart = 100) time = 32 + var/organ_rejection_dam = 0 /datum/surgery_step/add_prosthetic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) var/tool_body_zone @@ -27,8 +28,9 @@ else if(istype(tool, /obj/item/bodypart)) var/obj/item/bodypart/L = tool if(L.status != ORGAN_ROBOTIC) - user << "You need a robotic limb for this." - return -1 //fail + organ_rejection_dam = 10 + if(target.dna.species.id != L.species_id) + organ_rejection_dam = 30 tool_body_zone = L.body_zone if(target_zone == tool_body_zone) //so we can't replace a leg with an arm. user.visible_message("[user] begins to replace [target]'s [parse_zone(target_zone)].", "You begin to replace [target]'s [parse_zone(target_zone)]...") @@ -43,6 +45,10 @@ qdel(tool) else L = tool + user.drop_item() L.attach_limb(target) + if(organ_rejection_dam) + target.adjustToxLoss(organ_rejection_dam) user.visible_message("[user] successfully replaces [target]'s [parse_zone(target_zone)]!", "You succeed in replacing [target]'s [parse_zone(target_zone)].") - return 1 \ No newline at end of file + return 1 + diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm index 6244f000bcf..ee21dfd1206 100644 --- a/code/modules/tgui/states.dm +++ b/code/modules/tgui/states.dm @@ -16,14 +16,22 @@ **/ /datum/proc/ui_status(mob/user, datum/ui_state/state) var/src_object = ui_host() + . = UI_CLOSE + if(!state) + return - if(istype(user, /mob/dead/observer)) // Special-case ghosts. + if(istype(user, /mob/dead/observer)) + // If they turn on ghost AI control, admins can always interact. if(IsAdminGhost(user)) - return UI_INTERACTIVE // If they turn it on, admins can interact. + . = max(., UI_INTERACTIVE) + + // Regular ghosts can always at least view if in range. if(get_dist(src_object, src) < user.client.view) - return UI_UPDATE // Regular ghosts can only view. - return UI_CLOSE // To keep too many UIs from being opened. - return state.can_use_topic(src_object, user) // Check if the state allows interaction. + . = max(., UI_UPDATE) + + // Check if the state allows interaction + var/result = state.can_use_topic(src_object, user) + . = max(., result) /** * private diff --git a/code/modules/tgui/states/hands.dm b/code/modules/tgui/states/hands.dm index 11b1c021cc2..e3e110a2a83 100644 --- a/code/modules/tgui/states/hands.dm +++ b/code/modules/tgui/states/hands.dm @@ -17,4 +17,9 @@ /mob/living/hands_can_use_topic(src_object) if(src_object in get_both_hands(src)) return UI_INTERACTIVE - return UI_CLOSE \ No newline at end of file + return UI_CLOSE + +/mob/living/silicon/robot/hands_can_use_topic(src_object) + if(activated(src_object)) + return UI_INTERACTIVE + return UI_CLOSE diff --git a/code/modules/tgui/states/human_adjacent.dm b/code/modules/tgui/states/human_adjacent.dm new file mode 100644 index 00000000000..feedd457020 --- /dev/null +++ b/code/modules/tgui/states/human_adjacent.dm @@ -0,0 +1,17 @@ + + /** + * tgui state: human_adjacent_state + * + * In addition to default checks, only allows interaction for a + * human adjacent user. + **/ + +/var/global/datum/ui_state/human_adjacent_state/human_adjacent_state = new() + +/datum/ui_state/human_adjacent_state/can_use_topic(src_object, mob/user) + . = user.default_can_use_topic(src_object) + + var/dist = get_dist(src_object, user) + if((dist > 1) || (!ishuman(user))) + // Can't be used unless adjacent and human, even with TK + . = min(., UI_UPDATE) diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index 01d440dec03..bf77878eae0 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -14,7 +14,7 @@ ..() if(!atvcover) atvcover = image("icons/obj/vehicles.dmi", "atvcover") - atvcover.layer = MOB_LAYER + 0.1 + atvcover.layer = ABOVE_MOB_LAYER obj/vehicle/atv/post_buckle_mob(mob/living/M) @@ -26,7 +26,7 @@ obj/vehicle/atv/post_buckle_mob(mob/living/M) /obj/vehicle/atv/handle_vehicle_layer() if(dir == SOUTH) - layer = MOB_LAYER+0.1 + layer = ABOVE_MOB_LAYER else layer = OBJ_LAYER @@ -51,13 +51,13 @@ obj/vehicle/atv/post_buckle_mob(mob/living/M) /obj/vehicle/atv/turret/handle_vehicle_layer() if(dir == SOUTH) - layer = MOB_LAYER+0.1 + layer = ABOVE_MOB_LAYER else layer = OBJ_LAYER if(turret) if(dir == NORTH) - turret.layer = MOB_LAYER+0.1 + turret.layer = ABOVE_MOB_LAYER else turret.layer = OBJ_LAYER diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index 2e02313105e..e894e3c1c4a 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -15,7 +15,7 @@ /obj/vehicle/scooter/handle_vehicle_layer() if(dir == SOUTH) - layer = MOB_LAYER+0.1 + layer = ABOVE_MOB_LAYER else layer = OBJ_LAYER diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm index 8f374cd6213..7602f9f4356 100644 --- a/code/modules/vehicles/speedbike.dm +++ b/code/modules/vehicles/speedbike.dm @@ -2,7 +2,7 @@ name = "Speedbike" icon = 'icons/obj/bike.dmi' icon_state = "speedbike_blue" - layer = MOB_LAYER - 0.1 + layer = LYING_MOB_LAYER keytype = null vehicle_move_delay = 0 var/overlay_state = "cover_blue" @@ -11,13 +11,13 @@ /obj/vehicle/space/speedbike/New() ..() overlay = image("icons/obj/bike.dmi", overlay_state) - overlay.layer = MOB_LAYER + 0.1 + overlay.layer = ABOVE_MOB_LAYER overlays += overlay /obj/effect/overlay/temp/speedbike_trail name = "speedbike trails" icon_state = "ion_fade" - layer = MOB_LAYER - 0.2 + layer = BELOW_MOB_LAYER duration = 10 randomdir = 0 diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 2b9890ee8c7..96582344dfc 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -27,7 +27,7 @@ //APPEARANCE /obj/vehicle/proc/handle_vehicle_layer() if(dir != NORTH) - layer = MOB_LAYER+0.1 + layer = ABOVE_MOB_LAYER else layer = OBJ_LAYER @@ -109,7 +109,7 @@ /obj/vehicle/Move(NewLoc,Dir=0,step_x=0,step_y=0) - ..() + . = ..() handle_vehicle_layer() handle_vehicle_offsets() diff --git a/code/orphaned procs/AStar.dm b/code/orphaned_procs/AStar.dm similarity index 100% rename from code/orphaned procs/AStar.dm rename to code/orphaned_procs/AStar.dm diff --git a/code/orphaned procs/dbcore.dm b/code/orphaned_procs/dbcore.dm similarity index 100% rename from code/orphaned procs/dbcore.dm rename to code/orphaned_procs/dbcore.dm diff --git a/code/orphaned procs/priority_announce.dm b/code/orphaned_procs/priority_announce.dm similarity index 100% rename from code/orphaned procs/priority_announce.dm rename to code/orphaned_procs/priority_announce.dm diff --git a/code/orphaned procs/statistics.dm b/code/orphaned_procs/statistics.dm similarity index 100% rename from code/orphaned procs/statistics.dm rename to code/orphaned_procs/statistics.dm diff --git a/config/admins.txt b/config/admins.txt index 6c712096834..b650f5e1d67 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -8,6 +8,7 @@ # NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. # ############################################################################################### Optimumtact = Host +kevinz000 = Host kingofkosmos = Game Master MrStonedOne = Game Master microscopics = Game Master diff --git a/config/game_options.txt b/config/game_options.txt index 914a64e3bcf..696eb46c1f8 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -197,9 +197,12 @@ EVENTS_MIN_PLAYERS_MUL 1 ALLOW_AI ### Secborg ### -## Uncomment to prevent the secborg module from being chosen +## Uncomment to prevent the security cyborg module from being chosen #DISABLE_SECBORG +### Peacekeeper Borg ### +## Uncomment to prevent the peacekeeper cyborg module from being chosen +#DISABLE_PEACEBORG ### AWAY MISSIONS ### @@ -309,7 +312,8 @@ ROUNDSTART_RACES plasmaman ASSISTANT_CAP -1 ## Starlight for exterior walls and breaches. Uncomment for starlight! -STARLIGHT +## This is disabled by default to make testing quicker, should be enabled on production servers or testing servers messing with lighting +#STARLIGHT ## Uncomment to bring back old grey suit assistants instead of the now default rainbow colored assistants. #GREY_ASSISTANTS diff --git a/html/changelog.html b/html/changelog.html index 805d62ec464..80dbdee171e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,107 @@ -->
+

26 May 2016

+

Xhuis updated:

+
    +
  • Purge all untruths and honor Ratvar.
  • +
+

coiax updated:

+
    +
  • Fixes bug where bolt of change to the host would kill an attached guardian.
  • +
  • Fixes bug where bolt of change to laughter demon would not release its friends.
  • +
  • Fixes bug where bolt of change to morphling would not release its contents.
  • +
  • Fixes bug where bolt of change transforming someone into a drone would not give them hacked laws and vision.
  • +
  • Blobbernauts created by a staff of change are now "independent" and will not decay if seperated from a blob or missing a factory.
  • +
  • Independent blobbernauts added to gold slime core spawn pool.
  • +
  • Medical scanners now inform the user if the dead subject is within the (currently) 120 second defib window.
  • +
  • Ghosts now have the "Restore Character Name" verb, which will set their ghost appearance and dead chat name to their character preferences.
  • +
  • Mob spawners now give any generated names to the mind of the spawned mob, meaning ghosts will have the name they had in life.
  • +
  • Fixes interaction with envy's knife and lavaland spawns.
  • +
  • Fixes a bug where swarmers teleporting humans would incorrectly display a visible message about restraints breaking.
  • +
  • Emagging the emergency shuttle computer with less than ten seconds until launch no longer gives additional time.
  • +
  • The emergency shuttle computer now reads the ID in your ID slot, rather than your hand.
  • +
+ +

24 May 2016

+

Joan updated:

+
    +
  • You can no longer scribe the Summon Nar-Sie rune under non-valid conditions.
  • +
+

Kiazusho updated:

+
    +
  • Added three new advanced syringes to R&D
  • +
+ +

23 May 2016

+

CoreOverload updated:

+
    +
  • New cyberimplant, "Toolset Arm", is now available in RnD.
  • +
+

coiax, OPDingo updated:

+
    +
  • Crayons and spraycans are now easier to use.
  • +
  • Centcom announce due to budget cuts their supplier of rainbow crayons has been forced to use more... exotic chemicals. Please do not ingest your standard issue crayon.
  • +
+

kevinz000 updated:

+
    +
  • Peacekeeper borgs: Security borgs but without any stuns or restraints! Modules: Harm Alarm, Cookie Dispenser, Energy Bola Launcher, Peace Injector that confuses living things, and a weak holobarrier projector! It also comes with the ability to hug.
  • +
  • Cookie Synthesizer: Self recharging RCD that prints out cookies!
  • +
  • Nanotrasen scientists have added a hugging module to medical and peacekeeper cyborgs to boost emotions during human-cyborg interaction.
  • +
+ +

22 May 2016

+

coiax updated:

+
    +
  • Lavaland monsters now give ruins a wide berth.
  • +
  • Glass tables now break when people are pushed onto them.
  • +
+ +

21 May 2016

+

Iamsaltball updated:

+
    +
  • Heads of Staff now have basic Maint. access.
  • +
+

NicholasM10 updated:

+
    +
  • The chef can now make Khinkali and Khachapuri
  • +
+

coiax updated:

+
    +
  • NOBREATH species (golems, skeletons, abductors, ash walkers, zombies) no longer have or require lungs. They no longer take suffocation/oxyloss damage, cannot give CPR and cannot benefit from CPR. Instead of suffocation damage, during crit they take gradual brute damage.
  • +
  • NOBLOOD (golems, skeletons, abductors, slimepeople, plasmamen) species no longer have or require hearts.
  • +
  • NOBREATH species that require hearts still take damage from heart attacks, as their tissues die and the lack of circulation causes toxins to build up.
  • +
  • NOHUNGER (plasmamen, skeletons) species no longer have appendixes.
  • +
+

coiax, OPDingo updated:

+
    +
  • Renamed and reskinned legion's heart to legion's soul to avoid confusion; it is not a substitute heart, it is a supplemental chest organ.
  • +
  • Legion's souls are now more obviously inert when becoming inert.
  • +
+

nullbear updated:

+
    +
  • Wetness updates less often.
  • +
  • Wetness now stacks. Spraying lube over a tile that already has lube, will make the lube take longer to dry. Likewise, dumping 100 units of lube will take longer to dry than if only 10 units were dumped. (lube used to last just as long, regardless of whether it was 1u, or 100u) There is a limit, however, and you can't stack infinite lube.
  • +
  • Hotter temperatures cause water to evaporate more quickly. At 100C, water will boil away instantly.
  • +
  • About 5 seconds of wetness are removed from a tile for each unit of drying agent. Absorbant Galoshes remain the most effective method of drying, and dry tiles instantly regardless of wetness.
  • +
+ +

20 May 2016

+

KorPhaeron updated:

+
    +
  • The HoS now has a pinpointer, the Warden now has his door remote.
  • +
+

bgobandit updated:

+
    +
  • Nanotrasen has begun to research BZ, a hallucinogenic gas. We trust you will use it responsibly.
  • +
  • BZ causes hallucinations once breathed in and, at high doses, has a chance of doing brain damage.
  • +
  • BZ is known to cause unusual stasis-like behavior in the slime species.
  • +
+

coiax updated:

+
    +
  • Neurotoxin spit can be used as makeshift space propulsion
  • +
+

19 May 2016

Razharas updated:

    @@ -450,153 +551,6 @@
    • Adds a preference option, allowing players to toggle whether recipes with no matching components should be hidden.
    - -

    28 April 2016

    -

    Bawhoppen updated:

    -
      -
    • Sandbags are no longer tablecrafted. Now you just put in sand (or ash) by hand to make them.
    • -
    • Miners and Engis now get boxes of empty sandbags in their lockers. Miners also get a few premade aswell.
    • -
    • You can now break sandstone down into normal sand.
    • -
    -

    Joan updated:

    -
      -
    • Attacking a blob with an analyzer will tell you what its chemical does, its health, and a small fact about the blob analyzed.
    • -
    • NERFS:
    • -
    • Zombifying Feelers does less toxin damage.
    • -
    • Adaptive Nexuses does slightly less brute damage.
    • -
    • Replicating Foam does slightly less brute damage.
    • -
    • Blob Sorium does slightly less brute damage.
    • -
    • Blob Dark Matter does slightly less brute damage.
    • -
    • Cyrogenic Liquid injects slightly less frost oil and ice and does slightly less stamina damage.
    • -
    • Pressurized Slime does less brute, oxygen, and stamina damage, and extinguishes objects and people on turfs it wets.
    • -
    • Blob core strong blobs no longer give points when removed.
    • -
    • PROBABLY BUFFS:
    • -
    • Flammable Goo now does slightly more burn damage and applies more firestacks, but applies fire to blob tiles that don't share its chemical.
    • -
    • Energized Fibers does slightly more burn damage, slightly less stamina damage, and now takes damage from EMPs.
    • -
    • BUFFS:
    • -
    • Boiling Oil does slightly more burn damage and applies more firestacks.
    • -
    • Reactive Gelatin does slightly more damage on average.
    • -
    • Penetrating Spines now also ignores bio resistance in addition to armor.
    • -
    • Hallucinogenic Nectar causes more hallucinations.
    • -
    • Normal strong blobs now refund 4 points when removed, from 2.
    • -
    • Charger holoparasites now play a sound when hitting a target, as well as shaking the target's camera.
    • -
    -

    PKPenguin321 updated:

    -
      -
    • The warden's locker now contains krav maga gloves.
    • -
    -

    TechnoAlchemisto updated:

    -
      -
    • You can now craft skull helmets from bones.
    • -
    • Syndicate bombs are now harder to detect
    • -
    - -

    27 April 2016

    -

    TechnoAlchemisto updated:

    -
      -
    • Miners can now select explorer belts from the mining vendor using their vouchers, or mining points.
    • -
    - -

    26 April 2016

    -

    Iamgoofball & Super Aggro Crag updated:

    -
      -
    • Fluorosulfuric Acid now has doubled acid power.
    • -
    • Fluorosulfuric Acid now does BONUS burn damage scaling on the time it's been inside the consumer.
    • -
    -

    Joan updated:

    -
      -
    • Blobbernauts now spawn at half health.
    • -
    • Blobbernauts regeneration on blob is now 2.5 health per tick, from 5.
    • -
    • Blobbernauts now cost 40 resources to produce, from 30.
    • -
    • Factories supporting blobbernauts do not spawn spores.
    • -
    -

    Lati updated:

    -
      -
    • Syndicate bomb can be only delayed once by pulsing the delay wire. Time gained from this is changed from 10 seconds to 30 seconds.
    • -
    -

    TechnoAlchemisto updated:

    -
      -
    • Goliath plates can now be stacked.
    • -
    -

    phil235 updated:

    -
      -
    • More structures and machines are now breakable and/or destroyable with melee weapon. Additionally, Some structures and machines that are already breakable/destroyable are now affected by more attack methods (gun projectiles, thrown items, melee weapons, xeno/animal attacks, explosions).
    • -
    • Hitting any machine now always makes a sound.
    • -
    • You can hit closed closets/crates and doors by using an item on harm intent (but it doesn't actually hurt them).
    • -
    • you can now burst filled water balloons with sharp items.
    • -
    • Wooden barricade drops wood when destroyed.
    • -
    • Slot machines with coins inside are deconstructable now.
    • -
    - -

    25 April 2016

    -

    Joan updated:

    -
      -
    • You can once again hit a closet or crate with an item to open it.
    • -
    -

    Kor Razharas updated:

    -
      -
    • Adds support for autoclicking.
    • -
    • The Shock Revolver has been added to RnD.
    • -
    • The Laser Gatling Gun has been added to RnD. The Gatling Gun uses autoclick to fire as you hold down the mouse.
    • -
    • The Research Director now starts with a box of firing pins.
    • -
    • The SABR and Stun Revolver recipes have been removed from RnD
    • -
    -

    coiax updated:

    -
      -
    • Laughter demons are like slaughter demons, but they tickle people to death
    • -
    • Slaughter demons are no longer able to cast spells while phased.
    • -
    • Wizards can now speak while ethereal, but still cannot cast spells while ethereal.
    • -
    • Centcom's "drone expert" reports that drones vision filters have been upgraded to include the option of making all beings appear as harmless animals. info: As always, all drone filters are togglable.
    • -
    • As a sign of friendship between the Free Golems and Centcom, they have modified Centcom's jaunter to be worn around a user's waist, which will save them from falling to their death in a chasm.
    • -
    • The Golems warn that these modifications have created a risk of accidental activation when exposed to heavy electromagnetic fields.
    • -
    • Renamed hivelord stabilizer to stabilizing serum.
    • -
    • Centcom regret to inform you that new instabilities with nearby gas giants are causing exospheric bubbles to affect the telecommunications processors. Please contact your supervisor for further instructions.
    • -
    • The Janitor's Union has mandated additional features to station light replacer devices.
    • -
    • The light replacer now can be used on the floor to replace the bulbs of any lights on that tile.
    • -
    • The light replacer now eats replaced bulbs, and after a certain number of bulb fragments (four) will recycle them into a new bulb.
    • -
    • The description of the light replacer is now more informative.
    • -
    • Clown mask appearance toggle now has an action button.
    • -
    - -

    23 April 2016

    -

    Joan updated:

    -
      -
    • Aliens can now open crates and lockers.
    • -
    • Aliens and monkeys can now climb climbable objects, such as crates and sandbags.
    • -
    • Aliens climb very, very fast.
    • -
    -

    Kor updated:

    -
      -
    • Running HE pipes over lava will now heat the gas inside.
    • -
    • Alt+clicking on your mecha (while inside it) will toggle strafing mode.
    • -
    -

    Mercenaryblue updated:

    -
      -
    • Allowed all corgis to wear red wizard hats.
    • -
    -

    TechnoAlchemisto updated:

    -
      -
    • Goliaths now drop bones, and Watchers drop sinews.
    • -
    • You can craft primitive gear from bone and sinew.
    • -
    -

    coiax updated:

    -
      -
    • Non-humans are now able to interact with bee boxes.
    • -
    - -

    22 April 2016

    -

    Bawhoppen updated:

    -
      -
    • Security belts can now hold any type of grenade. This includes barrier grenades.
    • -
    • Janitorial belts are now able to store chem grenades.
    • -
    • Military belts have been given a size upgrade, so they can now hold larger items.
    • -
    • Bandoliers have been given a buff and now can hold a much larger amount of ammunition.
    • -
    -

    nullbear updated:

    -
      -
    • xenobio console is deconstructable again.
    • -
    • syndibomb recipe calls for any matter bin, scaling effectiveness with tier.
    • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 302d86e0359..a6eed57c74c 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -5082,3 +5082,96 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. Razharas: - rscadd: HE pipes once again work in space and in lava. - rscadd: Space cools down station air again +2016-05-20: + KorPhaeron: + - rscadd: The HoS now has a pinpointer, the Warden now has his door remote. + bgobandit: + - rscadd: Nanotrasen has begun to research BZ, a hallucinogenic gas. We trust you + will use it responsibly. + - rscadd: BZ causes hallucinations once breathed in and, at high doses, has a chance + of doing brain damage. + - rscadd: BZ is known to cause unusual stasis-like behavior in the slime species. + coiax: + - rscadd: Neurotoxin spit can be used as makeshift space propulsion +2016-05-21: + Iamsaltball: + - rscadd: Heads of Staff now have basic Maint. access. + NicholasM10: + - rscadd: The chef can now make Khinkali and Khachapuri + coiax: + - rscdel: NOBREATH species (golems, skeletons, abductors, ash walkers, zombies) + no longer have or require lungs. They no longer take suffocation/oxyloss damage, + cannot give CPR and cannot benefit from CPR. Instead of suffocation damage, + during crit they take gradual brute damage. + - rscdel: NOBLOOD (golems, skeletons, abductors, slimepeople, plasmamen) species + no longer have or require hearts. + - tweak: NOBREATH species that require hearts still take damage from heart attacks, + as their tissues die and the lack of circulation causes toxins to build up. + - rscdel: NOHUNGER (plasmamen, skeletons) species no longer have appendixes. + coiax, OPDingo: + - tweak: Renamed and reskinned legion's heart to legion's soul to avoid confusion; + it is not a substitute heart, it is a supplemental chest organ. + - rscadd: Legion's souls are now more obviously inert when becoming inert. + nullbear: + - tweak: Wetness updates less often. + - rscadd: Wetness now stacks. Spraying lube over a tile that already has lube, will + make the lube take longer to dry. Likewise, dumping 100 units of lube will take + longer to dry than if only 10 units were dumped. (lube used to last just as + long, regardless of whether it was 1u, or 100u) There is a limit, however, and + you can't stack infinite lube. + - tweak: Hotter temperatures cause water to evaporate more quickly. At 100C, water + will boil away instantly. + - rscadd: About 5 seconds of wetness are removed from a tile for each unit of drying + agent. Absorbant Galoshes remain the most effective method of drying, and dry + tiles instantly regardless of wetness. +2016-05-22: + coiax: + - rscdel: Lavaland monsters now give ruins a wide berth. + - bugfix: Glass tables now break when people are pushed onto them. +2016-05-23: + CoreOverload: + - rscadd: New cyberimplant, "Toolset Arm", is now available in RnD. + coiax, OPDingo: + - rscadd: Crayons and spraycans are now easier to use. + - rscdel: Centcom announce due to budget cuts their supplier of rainbow crayons + has been forced to use more... exotic chemicals. Please do not ingest your standard + issue crayon. + kevinz000: + - rscadd: 'Peacekeeper borgs: Security borgs but without any stuns or restraints! + Modules: Harm Alarm, Cookie Dispenser, Energy Bola Launcher, Peace Injector + that confuses living things, and a weak holobarrier projector! It also comes + with the ability to hug.' + - rscadd: 'Cookie Synthesizer: Self recharging RCD that prints out cookies!' + - tweak: Nanotrasen scientists have added a hugging module to medical and peacekeeper + cyborgs to boost emotions during human-cyborg interaction. +2016-05-24: + Joan: + - rscdel: You can no longer scribe the Summon Nar-Sie rune under non-valid conditions. + Kiazusho: + - rscadd: Added three new advanced syringes to R&D +2016-05-26: + Xhuis: + - rscadd: Purge all untruths and honor Ratvar. + coiax: + - bugfix: Fixes bug where bolt of change to the host would kill an attached guardian. + - bugfix: Fixes bug where bolt of change to laughter demon would not release its + friends. + - bugfix: Fixes bug where bolt of change to morphling would not release its contents. + - bugfix: Fixes bug where bolt of change transforming someone into a drone would + not give them hacked laws and vision. + - bugfix: Blobbernauts created by a staff of change are now "independent" and will + not decay if seperated from a blob or missing a factory. + - rscadd: Independent blobbernauts added to gold slime core spawn pool. + - rscadd: Medical scanners now inform the user if the dead subject is within the + (currently) 120 second defib window. + - rscadd: Ghosts now have the "Restore Character Name" verb, which will set their + ghost appearance and dead chat name to their character preferences. + - bugfix: Mob spawners now give any generated names to the mind of the spawned mob, + meaning ghosts will have the name they had in life. + - bugfix: Fixes interaction with envy's knife and lavaland spawns. + - bugfix: Fixes a bug where swarmers teleporting humans would incorrectly display + a visible message about restraints breaking. + - rscdel: Emagging the emergency shuttle computer with less than ten seconds until + launch no longer gives additional time. + - rscadd: The emergency shuttle computer now reads the ID in your ID slot, rather + than your hand. diff --git a/html/changelogs/AutoChangeLog-pr-17445.yml b/html/changelogs/AutoChangeLog-pr-17445.yml deleted file mode 100644 index 9d2f7c1d70e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-17445.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: bgobandit -delete-after: True -changes: - - rscadd: "Nanotrasen has begun to research BZ, a hallucinogenic gas. We trust you will use it responsibly." - - rscadd: "BZ causes hallucinations once breathed in and, at high doses, has a chance of doing brain damage." - - rscadd: "BZ is known to cause unusual stasis-like behavior in the slime species." diff --git a/html/changelogs/AutoChangeLog-pr-17629.yml b/html/changelogs/AutoChangeLog-pr-17629.yml new file mode 100644 index 00000000000..95615bb3a44 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-17629.yml @@ -0,0 +1,4 @@ +author: coiax +delete-after: True +changes: + - rscdel: "Gatling gun removed from R&D for pressing ceremonial reasons." diff --git a/html/changelogs/AutoChangeLog-pr-17896.yml b/html/changelogs/AutoChangeLog-pr-17896.yml new file mode 100644 index 00000000000..1aec622f5dc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-17896.yml @@ -0,0 +1,5 @@ +author: phil235 +delete-after: True +changes: + - tweak: "Pull and Grab are merged together. Pulling stays unchanged. Using an empty hand with grab intent on a mob will pull them. Using an empty hand with grab intent on a mob that you're already pulling will try to upgrade your grip to aggressive grab>neck grab>kill grab. Aggressive grabs no longer stun you, but they act exactly like a handcuff, preventing you from using your hands until you escape the grip. You can break free from the grip by trying to move or using the resist button." + - tweak: "Someone pulling a restrained mob now swap position with them instead of getting blocked by the mob, unable to even push them." diff --git a/icons/effects/187x381.dmi b/icons/effects/187x381.dmi new file mode 100644 index 00000000000..dd43297db53 Binary files /dev/null and b/icons/effects/187x381.dmi differ diff --git a/icons/effects/211x247.dmi b/icons/effects/211x247.dmi new file mode 100644 index 00000000000..35b25ffe146 Binary files /dev/null and b/icons/effects/211x247.dmi differ diff --git a/icons/effects/254x361.dmi b/icons/effects/254x361.dmi new file mode 100644 index 00000000000..4fd6543c32d Binary files /dev/null and b/icons/effects/254x361.dmi differ diff --git a/icons/effects/340x428.dmi b/icons/effects/340x428.dmi new file mode 100644 index 00000000000..eb735c0ba92 Binary files /dev/null and b/icons/effects/340x428.dmi differ diff --git a/icons/effects/400x400.dmi b/icons/effects/400x400.dmi new file mode 100644 index 00000000000..c3fe60bc09c Binary files /dev/null and b/icons/effects/400x400.dmi differ diff --git a/icons/effects/512x512.dmi b/icons/effects/512x512.dmi new file mode 100644 index 00000000000..98116dfdac1 Binary files /dev/null and b/icons/effects/512x512.dmi differ diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi index a366c61e985..855e6d21922 100644 Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index 39df6013a71..0aed64e2497 100644 Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ diff --git a/icons/effects/clockwork_effects.dmi b/icons/effects/clockwork_effects.dmi new file mode 100644 index 00000000000..ab97d77bf1f Binary files /dev/null and b/icons/effects/clockwork_effects.dmi differ diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index f4b379bd074..d9724cd6f16 100644 Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 868c2204346..06905f87d76 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/clockwork_mobs.dmi b/icons/mob/clockwork_mobs.dmi new file mode 100644 index 00000000000..7a97fa733e6 Binary files /dev/null and b/icons/mob/clockwork_mobs.dmi differ diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi index b8f84216bd1..65b0323be4d 100644 Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi index 1dee82622ae..f68b23f4ba2 100644 Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi index e1658bd5379..39cc5b018dd 100644 Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index b01ccc5f4ae..38ec8bc7834 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index be64c757347..7cd4efa8dff 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index a289b451f05..0f522819853 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 2d54cb9552c..0b28b4e4914 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/robot_items.dmi b/icons/mob/robot_items.dmi index 0ac3137707f..e3c81e501ee 100644 Binary files a/icons/mob/robot_items.dmi and b/icons/mob/robot_items.dmi differ diff --git a/icons/mob/robot_transformations.dmi b/icons/mob/robot_transformations.dmi index 1cedece909f..f389bb60a02 100644 Binary files a/icons/mob/robot_transformations.dmi and b/icons/mob/robot_transformations.dmi differ diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index 9f1ea3d8562..997d2514ebc 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index dea11507769..d85d188d87d 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 2e42bd46e86..836b5da8222 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/Cryogenic2.dmi b/icons/obj/Cryogenic2.dmi index 6acd646cedf..9ca7ba0aeb2 100644 Binary files a/icons/obj/Cryogenic2.dmi and b/icons/obj/Cryogenic2.dmi differ diff --git a/icons/obj/clockwork_objects.dmi b/icons/obj/clockwork_objects.dmi new file mode 100644 index 00000000000..01e06461c7a Binary files /dev/null and b/icons/obj/clockwork_objects.dmi differ diff --git a/icons/obj/clothing/clockwork_garb.dmi b/icons/obj/clothing/clockwork_garb.dmi new file mode 100644 index 00000000000..9eed34114bf Binary files /dev/null and b/icons/obj/clothing/clockwork_garb.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 04180b4d7b2..abf1e0ef5de 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index d2b4165b149..70eaedb6709 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 3bb92c1be20..8caf8e42270 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/crayons.dmi b/icons/obj/crayons.dmi index 7d3489285c3..c4eebb65c80 100644 Binary files a/icons/obj/crayons.dmi and b/icons/obj/crayons.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 956304f1fba..a41f6186a9c 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/machines/magic_emitter.dmi b/icons/obj/machines/magic_emitter.dmi new file mode 100644 index 00000000000..1c85aa70712 Binary files /dev/null and b/icons/obj/machines/magic_emitter.dmi differ diff --git a/icons/obj/machines/shuttle_manipulator.dmi b/icons/obj/machines/shuttle_manipulator.dmi new file mode 100644 index 00000000000..ad91b1677b1 Binary files /dev/null and b/icons/obj/machines/shuttle_manipulator.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index 71f5dd61908..219bb139c66 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 318eb947598..78bb775406e 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi index 7730f914edd..9a130739353 100644 Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index b2cde1ea35b..c27f5c38893 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -73,6 +73,10 @@ h1.alert, h2.alert {color: #000000;} .holoparasite {color: #35333a;} .holoparasitebold {color: #35333a; font-weight: bold;} +.brass {color: #BE8700;} +.heavy_brass {color: #BE8700; font-weight: bold; font-style: italic;} +.large_brass {color: #BE8700; font-size: 3;} + .revennotice {color: #1d2953;} .revenboldnotice {color: #1d2953; font-weight: bold;} .revenbignotice {color: #1d2953; font-weight: bold; font-size: 3;} @@ -93,7 +97,7 @@ h1.alert, h2.alert {color: #000000;} .papyrus {font-family: "Papyrus", cursive, sans-serif;} .robot {font-family: "Courier New", cursive, sans-serif;} -.command_headset {font-weight: bold; font-size: 3; } +.command_headset {font-weight: bold; font-size: 3;} .big {font-size: 3;} .reallybig {font-size: 4;} .greentext {color: #00FF00; font-size: 3;} diff --git a/sound/AI/harmalarm.ogg b/sound/AI/harmalarm.ogg new file mode 100644 index 00000000000..b9107f6e44d Binary files /dev/null and b/sound/AI/harmalarm.ogg differ diff --git a/sound/effects/clockcult_gateway_active.ogg b/sound/effects/clockcult_gateway_active.ogg new file mode 100644 index 00000000000..86487e3bdd4 Binary files /dev/null and b/sound/effects/clockcult_gateway_active.ogg differ diff --git a/sound/effects/clockcult_gateway_charging.ogg b/sound/effects/clockcult_gateway_charging.ogg new file mode 100644 index 00000000000..1c4e55538ce Binary files /dev/null and b/sound/effects/clockcult_gateway_charging.ogg differ diff --git a/sound/effects/clockcult_gateway_closing.ogg b/sound/effects/clockcult_gateway_closing.ogg new file mode 100644 index 00000000000..1c69f386834 Binary files /dev/null and b/sound/effects/clockcult_gateway_closing.ogg differ diff --git a/sound/effects/clockcult_gateway_disrupted.ogg b/sound/effects/clockcult_gateway_disrupted.ogg new file mode 100644 index 00000000000..7ab734dc6c8 Binary files /dev/null and b/sound/effects/clockcult_gateway_disrupted.ogg differ diff --git a/sound/effects/light_flicker.ogg b/sound/effects/light_flicker.ogg new file mode 100644 index 00000000000..58be2c6ebda Binary files /dev/null and b/sound/effects/light_flicker.ogg differ diff --git a/sound/effects/ratvar_rises.ogg b/sound/effects/ratvar_rises.ogg new file mode 100644 index 00000000000..6201ce790d6 Binary files /dev/null and b/sound/effects/ratvar_rises.ogg differ diff --git a/sound/hallucinations/im_here1.ogg b/sound/hallucinations/im_here1.ogg index b3a7142365e..7a671739b89 100644 Binary files a/sound/hallucinations/im_here1.ogg and b/sound/hallucinations/im_here1.ogg differ diff --git a/sound/hallucinations/im_here2.ogg b/sound/hallucinations/im_here2.ogg index bd841bcdb14..1e289d53f87 100644 Binary files a/sound/hallucinations/im_here2.ogg and b/sound/hallucinations/im_here2.ogg differ diff --git a/sound/hallucinations/turn_around1.ogg b/sound/hallucinations/turn_around1.ogg index 7a83755a93f..ce54f1944e4 100644 Binary files a/sound/hallucinations/turn_around1.ogg and b/sound/hallucinations/turn_around1.ogg differ diff --git a/sound/hallucinations/turn_around2.ogg b/sound/hallucinations/turn_around2.ogg index f4328458dd9..2c3c49466d5 100644 Binary files a/sound/hallucinations/turn_around2.ogg and b/sound/hallucinations/turn_around2.ogg differ diff --git a/sound/magic/clockwork/anima_fragment_attack.ogg b/sound/magic/clockwork/anima_fragment_attack.ogg new file mode 100644 index 00000000000..2c539292cba Binary files /dev/null and b/sound/magic/clockwork/anima_fragment_attack.ogg differ diff --git a/sound/magic/clockwork/anima_fragment_death.ogg b/sound/magic/clockwork/anima_fragment_death.ogg new file mode 100644 index 00000000000..d209bff5a28 Binary files /dev/null and b/sound/magic/clockwork/anima_fragment_death.ogg differ diff --git a/sound/magic/clockwork/fellowship_armory.ogg b/sound/magic/clockwork/fellowship_armory.ogg new file mode 100644 index 00000000000..c108d4621c6 Binary files /dev/null and b/sound/magic/clockwork/fellowship_armory.ogg differ diff --git a/sound/magic/clockwork/invoke_general.ogg b/sound/magic/clockwork/invoke_general.ogg new file mode 100644 index 00000000000..6f0c0dd097a Binary files /dev/null and b/sound/magic/clockwork/invoke_general.ogg differ diff --git a/sound/magic/clockwork/narsie_attack.ogg b/sound/magic/clockwork/narsie_attack.ogg new file mode 100644 index 00000000000..89fac778058 Binary files /dev/null and b/sound/magic/clockwork/narsie_attack.ogg differ diff --git a/sound/magic/clockwork/ratvar_attack.ogg b/sound/magic/clockwork/ratvar_attack.ogg new file mode 100644 index 00000000000..1c17fe10510 Binary files /dev/null and b/sound/magic/clockwork/ratvar_attack.ogg differ diff --git a/sound/misc/compiler-failure.ogg b/sound/misc/compiler-failure.ogg new file mode 100755 index 00000000000..682e333bcb4 Binary files /dev/null and b/sound/misc/compiler-failure.ogg differ diff --git a/sound/misc/compiler-stage1.ogg b/sound/misc/compiler-stage1.ogg new file mode 100755 index 00000000000..997268b2f5b Binary files /dev/null and b/sound/misc/compiler-stage1.ogg differ diff --git a/sound/misc/compiler-stage2.ogg b/sound/misc/compiler-stage2.ogg new file mode 100755 index 00000000000..66e8e523485 Binary files /dev/null and b/sound/misc/compiler-stage2.ogg differ diff --git a/sound/misc/server-ready.ogg b/sound/misc/server-ready.ogg new file mode 100755 index 00000000000..216533b6f32 Binary files /dev/null and b/sound/misc/server-ready.ogg differ diff --git a/tgstation.dme b/tgstation.dme index d47f1928a1a..fd4a6d24a20 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -33,6 +33,7 @@ #include "code\__DEFINES\genetics.dm" #include "code\__DEFINES\hud.dm" #include "code\__DEFINES\is_helpers.dm" +#include "code\__DEFINES\layers.dm" #include "code\__DEFINES\machines.dm" #include "code\__DEFINES\math.dm" #include "code\__DEFINES\misc.dm" @@ -43,6 +44,7 @@ #include "code\__DEFINES\reagents.dm" #include "code\__DEFINES\role_preferences.dm" #include "code\__DEFINES\say.dm" +#include "code\__DEFINES\shuttles.dm" #include "code\__DEFINES\sight.dm" #include "code\__DEFINES\stat.dm" #include "code\__DEFINES\tablecrafting.dm" @@ -156,6 +158,7 @@ #include "code\datums\browser.dm" #include "code\datums\datacore.dm" #include "code\datums\datumvars.dm" +#include "code\datums\dna.dm" #include "code\datums\dog_fashion.dm" #include "code\datums\hud.dm" #include "code\datums\martial.dm" @@ -251,14 +254,13 @@ #include "code\game\atoms_movable.dm" #include "code\game\communications.dm" #include "code\game\data_huds.dm" -#include "code\game\dna.dm" #include "code\game\say.dm" #include "code\game\shuttle_engines.dm" #include "code\game\skincmd.dm" #include "code\game\sound.dm" #include "code\game\area\ai_monitored.dm" #include "code\game\area\areas.dm" -#include "code\game\area\Space Station 13 areas.dm" +#include "code\game\area\Space_Station_13_areas.dm" #include "code\game\gamemodes\antag_hud.dm" #include "code\game\gamemodes\antag_spawner.dm" #include "code\game\gamemodes\events.dm" @@ -307,6 +309,13 @@ #include "code\game\gamemodes\changeling\powers\strained_muscles.dm" #include "code\game\gamemodes\changeling\powers\tiny_prick.dm" #include "code\game\gamemodes\changeling\powers\transform.dm" +#include "code\game\gamemodes\clock_cult\__clock_defines.dm" +#include "code\game\gamemodes\clock_cult\clock_cult.dm" +#include "code\game\gamemodes\clock_cult\clock_mobs.dm" +#include "code\game\gamemodes\clock_cult\clock_objects.dm" +#include "code\game\gamemodes\clock_cult\clock_ratvar.dm" +#include "code\game\gamemodes\clock_cult\clock_scripture.dm" +#include "code\game\gamemodes\clock_cult\clock_unsorted.dm" #include "code\game\gamemodes\cult\cult.dm" #include "code\game\gamemodes\cult\cult_comms.dm" #include "code\game\gamemodes\cult\cult_items.dm" @@ -820,7 +829,7 @@ #include "code\modules\admin\stickyban.dm" #include "code\modules\admin\topic.dm" #include "code\modules\admin\watchlist.dm" -#include "code\modules\admin\DB ban\functions.dm" +#include "code\modules\admin\DB_ban\functions.dm" #include "code\modules\admin\permissionverbs\permissionedit.dm" #include "code\modules\admin\verbs\adminhelp.dm" #include "code\modules\admin\verbs\adminjump.dm" @@ -851,7 +860,6 @@ #include "code\modules\admin\verbs\pray.dm" #include "code\modules\admin\verbs\randomverbs.dm" #include "code\modules\admin\verbs\reestablish_db_connection.dm" -#include "code\modules\admin\verbs\shuttles.dm" #include "code\modules\admin\verbs\tripAI.dm" #include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" #include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" @@ -957,9 +965,9 @@ #include "code\modules\cargo\exports\weapons.dm" #include "code\modules\chatter\chatter.dm" #include "code\modules\client\asset_cache.dm" -#include "code\modules\client\client defines.dm" -#include "code\modules\client\client procs.dm" #include "code\modules\client\client_colour.dm" +#include "code\modules\client\client_defines.dm" +#include "code\modules\client\client_procs.dm" #include "code\modules\client\message.dm" #include "code\modules\client\preferences.dm" #include "code\modules\client\preferences_savefile.dm" @@ -1080,53 +1088,53 @@ #include "code\modules\flufftext\Dreaming.dm" #include "code\modules\flufftext\Hallucination.dm" #include "code\modules\flufftext\TextFilters.dm" -#include "code\modules\food&drinks\food.dm" -#include "code\modules\food&drinks\pizzabox.dm" -#include "code\modules\food&drinks\drinks\drinks.dm" -#include "code\modules\food&drinks\drinks\drinks\bottle.dm" -#include "code\modules\food&drinks\drinks\drinks\drinkingglass.dm" -#include "code\modules\food&drinks\food\condiment.dm" -#include "code\modules\food&drinks\food\customizables.dm" -#include "code\modules\food&drinks\food\snacks.dm" -#include "code\modules\food&drinks\food\snacks_bread.dm" -#include "code\modules\food&drinks\food\snacks_burgers.dm" -#include "code\modules\food&drinks\food\snacks_cake.dm" -#include "code\modules\food&drinks\food\snacks_egg.dm" -#include "code\modules\food&drinks\food\snacks_meat.dm" -#include "code\modules\food&drinks\food\snacks_other.dm" -#include "code\modules\food&drinks\food\snacks_pastry.dm" -#include "code\modules\food&drinks\food\snacks_pie.dm" -#include "code\modules\food&drinks\food\snacks_pizza.dm" -#include "code\modules\food&drinks\food\snacks_salad.dm" -#include "code\modules\food&drinks\food\snacks_sandwichtoast.dm" -#include "code\modules\food&drinks\food\snacks_soup.dm" -#include "code\modules\food&drinks\food\snacks_spaghetti.dm" -#include "code\modules\food&drinks\food\snacks_vend.dm" -#include "code\modules\food&drinks\food\snacks\dough.dm" -#include "code\modules\food&drinks\food\snacks\meat.dm" -#include "code\modules\food&drinks\kitchen machinery\food_cart.dm" -#include "code\modules\food&drinks\kitchen machinery\gibber.dm" -#include "code\modules\food&drinks\kitchen machinery\icecream_vat.dm" -#include "code\modules\food&drinks\kitchen machinery\juicer.dm" -#include "code\modules\food&drinks\kitchen machinery\microwave.dm" -#include "code\modules\food&drinks\kitchen machinery\monkeyrecycler.dm" -#include "code\modules\food&drinks\kitchen machinery\processor.dm" -#include "code\modules\food&drinks\kitchen machinery\smartfridge.dm" -#include "code\modules\food&drinks\recipes\drinks_recipes.dm" -#include "code\modules\food&drinks\recipes\food_mixtures.dm" -#include "code\modules\food&drinks\recipes\tablecraft\recipes_bread.dm" -#include "code\modules\food&drinks\recipes\tablecraft\recipes_burger.dm" -#include "code\modules\food&drinks\recipes\tablecraft\recipes_cake.dm" -#include "code\modules\food&drinks\recipes\tablecraft\recipes_egg.dm" -#include "code\modules\food&drinks\recipes\tablecraft\recipes_meat.dm" -#include "code\modules\food&drinks\recipes\tablecraft\recipes_misc.dm" -#include "code\modules\food&drinks\recipes\tablecraft\recipes_pastry.dm" -#include "code\modules\food&drinks\recipes\tablecraft\recipes_pie.dm" -#include "code\modules\food&drinks\recipes\tablecraft\recipes_pizza.dm" -#include "code\modules\food&drinks\recipes\tablecraft\recipes_salad.dm" -#include "code\modules\food&drinks\recipes\tablecraft\recipes_sandwich.dm" -#include "code\modules\food&drinks\recipes\tablecraft\recipes_soup.dm" -#include "code\modules\food&drinks\recipes\tablecraft\recipes_spaghetti.dm" +#include "code\modules\food_and_drinks\food.dm" +#include "code\modules\food_and_drinks\pizzabox.dm" +#include "code\modules\food_and_drinks\drinks\drinks.dm" +#include "code\modules\food_and_drinks\drinks\drinks\bottle.dm" +#include "code\modules\food_and_drinks\drinks\drinks\drinkingglass.dm" +#include "code\modules\food_and_drinks\food\condiment.dm" +#include "code\modules\food_and_drinks\food\customizables.dm" +#include "code\modules\food_and_drinks\food\snacks.dm" +#include "code\modules\food_and_drinks\food\snacks_bread.dm" +#include "code\modules\food_and_drinks\food\snacks_burgers.dm" +#include "code\modules\food_and_drinks\food\snacks_cake.dm" +#include "code\modules\food_and_drinks\food\snacks_egg.dm" +#include "code\modules\food_and_drinks\food\snacks_meat.dm" +#include "code\modules\food_and_drinks\food\snacks_other.dm" +#include "code\modules\food_and_drinks\food\snacks_pastry.dm" +#include "code\modules\food_and_drinks\food\snacks_pie.dm" +#include "code\modules\food_and_drinks\food\snacks_pizza.dm" +#include "code\modules\food_and_drinks\food\snacks_salad.dm" +#include "code\modules\food_and_drinks\food\snacks_sandwichtoast.dm" +#include "code\modules\food_and_drinks\food\snacks_soup.dm" +#include "code\modules\food_and_drinks\food\snacks_spaghetti.dm" +#include "code\modules\food_and_drinks\food\snacks_vend.dm" +#include "code\modules\food_and_drinks\food\snacks\dough.dm" +#include "code\modules\food_and_drinks\food\snacks\meat.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\food_cart.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\gibber.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\juicer.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\microwave.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\monkeyrecycler.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\processor.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\smartfridge.dm" +#include "code\modules\food_and_drinks\recipes\drinks_recipes.dm" +#include "code\modules\food_and_drinks\recipes\food_mixtures.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_bread.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_burger.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_cake.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_egg.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_meat.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_misc.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pastry.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pie.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pizza.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_salad.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sandwich.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_soup.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_spaghetti.dm" #include "code\modules\games\cards.dm" #include "code\modules\games\cas.dm" #include "code\modules\holiday\easter.dm" @@ -1222,6 +1230,7 @@ #include "code\modules\mining\lavaland\necropolis_chests.dm" #include "code\modules\mining\lavaland\weather.dm" #include "code\modules\mining\lavaland\weather_types.dm" +#include "code\modules\mining\lavaland\ruins\gym.dm" #include "code\modules\mob\death.dm" #include "code\modules\mob\interactive.dm" #include "code\modules\mob\inventory.dm" @@ -1230,7 +1239,6 @@ #include "code\modules\mob\mob.dm" #include "code\modules\mob\mob_cleanup.dm" #include "code\modules\mob\mob_defines.dm" -#include "code\modules\mob\mob_grab.dm" #include "code\modules\mob\mob_helpers.dm" #include "code\modules\mob\mob_movement.dm" #include "code\modules\mob\mob_transformation_simple.dm" @@ -1436,7 +1444,6 @@ #include "code\modules\mob\living\simple_animal\hostile\mushroom.dm" #include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm" #include "code\modules\mob\living\simple_animal\hostile\pirate.dm" -#include "code\modules\mob\living\simple_animal\hostile\reenactors.dm" #include "code\modules\mob\living\simple_animal\hostile\russian.dm" #include "code\modules\mob\living\simple_animal\hostile\skeleton.dm" #include "code\modules\mob\living\simple_animal\hostile\statue.dm" @@ -1538,18 +1545,18 @@ #include "code\modules\power\tesla\coil.dm" #include "code\modules\power\tesla\energy_ball.dm" #include "code\modules\power\tesla\generator.dm" -#include "code\modules\procedural mapping\mapGenerator.dm" -#include "code\modules\procedural mapping\mapGeneratorModule.dm" -#include "code\modules\procedural mapping\mapGeneratorObj.dm" -#include "code\modules\procedural mapping\mapGeneratorReadme.dm" -#include "code\modules\procedural mapping\mapGeneratorModules\helpers.dm" -#include "code\modules\procedural mapping\mapGeneratorModules\nature.dm" -#include "code\modules\procedural mapping\mapGenerators\asteroid.dm" -#include "code\modules\procedural mapping\mapGenerators\cellular.dm" -#include "code\modules\procedural mapping\mapGenerators\lava_river.dm" -#include "code\modules\procedural mapping\mapGenerators\nature.dm" -#include "code\modules\procedural mapping\mapGenerators\shuttle.dm" -#include "code\modules\procedural mapping\mapGenerators\syndicate.dm" +#include "code\modules\procedural_mapping\mapGenerator.dm" +#include "code\modules\procedural_mapping\mapGeneratorModule.dm" +#include "code\modules\procedural_mapping\mapGeneratorObj.dm" +#include "code\modules\procedural_mapping\mapGeneratorReadme.dm" +#include "code\modules\procedural_mapping\mapGeneratorModules\helpers.dm" +#include "code\modules\procedural_mapping\mapGeneratorModules\nature.dm" +#include "code\modules\procedural_mapping\mapGenerators\asteroid.dm" +#include "code\modules\procedural_mapping\mapGenerators\cellular.dm" +#include "code\modules\procedural_mapping\mapGenerators\lava_river.dm" +#include "code\modules\procedural_mapping\mapGenerators\nature.dm" +#include "code\modules\procedural_mapping\mapGenerators\shuttle.dm" +#include "code\modules\procedural_mapping\mapGenerators\syndicate.dm" #include "code\modules\projectiles\ammunition.dm" #include "code\modules\projectiles\firing.dm" #include "code\modules\projectiles\gun.dm" @@ -1659,18 +1666,19 @@ #include "code\modules\research\xenobiology\xenobiology.dm" #include "code\modules\ruins\lavaland_ruin_code.dm" #include "code\modules\ruins\ruin_areas.dm" -#include "code\modules\security levels\keycard authentication.dm" -#include "code\modules\security levels\security levels.dm" +#include "code\modules\security_levels\keycard_authentication.dm" +#include "code\modules\security_levels\security_levels.dm" #include "code\modules\shuttle\assault_pod.dm" #include "code\modules\shuttle\computer.dm" #include "code\modules\shuttle\emergency.dm" #include "code\modules\shuttle\ferry.dm" #include "code\modules\shuttle\manipulator.dm" #include "code\modules\shuttle\shuttle.dm" +#include "code\modules\shuttle\special.dm" #include "code\modules\shuttle\supply.dm" #include "code\modules\shuttle\syndicate.dm" #include "code\modules\shuttle\white_ship.dm" -#include "code\modules\space transition\space_transition.dm" +#include "code\modules\space_transition\space_transition.dm" #include "code\modules\spells\spell.dm" #include "code\modules\spells\spell_types\area_teleport.dm" #include "code\modules\spells\spell_types\barnyard.dm" @@ -1719,7 +1727,7 @@ #include "code\modules\surgery\generic_steps.dm" #include "code\modules\surgery\helpers.dm" #include "code\modules\surgery\implant_removal.dm" -#include "code\modules\surgery\limb augmentation.dm" +#include "code\modules\surgery\limb_augmentation.dm" #include "code\modules\surgery\lipoplasty.dm" #include "code\modules\surgery\organ_manipulation.dm" #include "code\modules\surgery\plastic_surgery.dm" @@ -1754,6 +1762,7 @@ #include "code\modules\tgui\states\deep_inventory.dm" #include "code\modules\tgui\states\default.dm" #include "code\modules\tgui\states\hands.dm" +#include "code\modules\tgui\states\human_adjacent.dm" #include "code\modules\tgui\states\inventory.dm" #include "code\modules\tgui\states\notcontained.dm" #include "code\modules\tgui\states\physical.dm" @@ -1768,10 +1777,10 @@ #include "code\modules\vehicles\secway.dm" #include "code\modules\vehicles\speedbike.dm" #include "code\modules\vehicles\vehicle.dm" -#include "code\orphaned procs\AStar.dm" -#include "code\orphaned procs\dbcore.dm" -#include "code\orphaned procs\priority_announce.dm" -#include "code\orphaned procs\statistics.dm" +#include "code\orphaned_procs\AStar.dm" +#include "code\orphaned_procs\dbcore.dm" +#include "code\orphaned_procs\priority_announce.dm" +#include "code\orphaned_procs\statistics.dm" #include "interface\interface.dm" #include "interface\stylesheet.dm" #include "interface\skin.dmf" diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css index 35e16349ab3..1db67cd4b49 100644 --- a/tgui/assets/tgui.css +++ b/tgui/assets/tgui.css @@ -1 +1 @@ -@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input::-moz-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff750000',endColorstr='#ff340404',GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input::-moz-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file +@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCA0MjUgMjAwIiBvcGFjaXR5PSIuMzMiPgogIDxwYXRoIGQ9Im0gMTc4LjAwMzk5LDAuMDM4NjkgLTcxLjIwMzkzLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM0LDYuMDI1NTUgbCAwLDE4Ny44NzE0NyBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgNi43NjEzNCw2LjAyNTU0IGwgNTMuMTA3MiwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTAxLjU0NDAxOCA3Mi4yMTYyOCwxMDQuNjk5Mzk4IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA1Ljc2MDE1LDIuODcwMTYgbCA3My41NTQ4NywwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzNSwtNi4wMjU1NSBsIC01NC43MTY0NCwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzMyw2LjAyNTU1IGwgMCwxMDIuNjE5MzUgTCAxODMuNzY0MTMsMi45MDg4NiBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTUuNzYwMTQsLTIuODcwMTcgeiIgLz4KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPgogIDxwYXRoIGQ9Im0gNDIwLjE1NTM1LDE3Ny44OTExOSBhIDEzLjQxMjAzOCwxMi41MDE4NDIgMCAwIDEgLTguNjMyOTUsMjIuMDY5NTEgbCAtNjYuMTE4MzIsMCBhIDUuMzY0ODE1Miw1LjAwMDczNyAwIDAgMSAtNS4zNjQ4MiwtNS4wMDA3NCBsIDAsLTc5Ljg3OTMxIHoiIC8+Cjwvc3ZnPgo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4KPCEtLSBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvIC0tPgo=") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:after{-webkit-transform:translateX(-8px) translateY(-50%);-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input::-moz-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCAyMDAgMjg5Ljc0MiIgb3BhY2l0eT0iLjMzIj4KICA8cGF0aCBkPSJtIDkzLjUzNzY3NywwIGMgLTE4LjExMzEyNSwwIC0zNC4yMjAxMzMsMy4xMTE2NCAtNDguMzIzNDg0LDkuMzM0MzcgLTEzLjk2NTA5Miw2LjIyMTY3IC0yNC42MTI0NDIsMTUuMDcxMTQgLTMxLjk0MDY1MSwyNi41NDcxIC03LjE4OTkzOTgsMTEuMzM3ODkgLTEwLjMwMTIyNjYsMjQuNzQ5MTEgLTEwLjMwMTIyNjYsNDAuMjM0NzggMCwxMC42NDY2MiAyLjcyNTAwMjYsMjAuNDY0NjUgOC4xNzUxMTE2LDI5LjQ1MjU4IDUuNjE1Mjc3LDguOTg2ODYgMTQuMDM4Mjc3LDE3LjM1MjA0IDI1LjI2ODgyMSwyNS4wOTQzNiAxMS4yMzA1NDQsNy42MDUzMSAyNi41MDc0MjEsMTUuNDE4MzUgNDUuODMwNTE0LDIzLjQzNzgyIDE5Ljk4Mzc0OCw4LjI5NTU3IDM0Ljg0ODg0OCwxNS41NTQ3MSA0NC41OTI5OTgsMjEuNzc2MzggOS43NDQxNCw2LjIyMjczIDE2Ljc2MTcsMTIuODU4NSAyMS4wNTU3MiwxOS45MDk1MSA0LjI5NDA0LDcuMDUyMDggNi40NDE5MywxNS43NjQwOCA2LjQ0MTkzLDI2LjEzNDU5IDAsMTYuMTc3MDIgLTUuMjAxOTYsMjguNDgyMjIgLTE1LjYwNjczLDM2LjkxNjgyIC0xMC4yMzk2LDguNDM0NyAtMjUuMDIyMDMsMTIuNjUyMyAtNDQuMzQ1MTY5LDEyLjY1MjMgLTE0LjAzODE3MSwwIC0yNS41MTUyNDcsLTEuNjU5NCAtMzQuNDMzNjE4LC00Ljk3NzcgLTguOTE4MzcsLTMuNDU2NiAtMTYuMTg1NTcyLC04LjcxMTMgLTIxLjgwMDgzOSwtMTUuNzYzMyAtNS42MTUyNzcsLTcuMDUyMSAtMTAuMDc0Nzk1LC0xNi42NjA4OCAtMTMuMzc3ODk5LC0yOC44MjgxMiBsIC0yNC43NzMxNjI2MjkzOTQ1LDAgMCw1Ni44MjYzMiBDIDMzLjg1Njc2OSwyODYuMDc2MDEgNjMuNzQ5MDQsMjg5Ljc0MjAxIDg5LjY3ODM4MywyODkuNzQyMDEgYyAxNi4wMjAwMjcsMCAzMC43MTk3ODcsLTEuMzgyNyA0NC4wOTczMzcsLTQuMTQ3OSAxMy41NDI3MiwtMi45MDQzIDI1LjEwNDEsLTcuNDY3NiAzNC42ODMwOSwtMTMuNjg5MyA5Ljc0NDEzLC02LjM1OTcgMTcuMzQwNDIsLTE0LjUxOTUgMjIuNzkwNTIsLTI0LjQ3NDggNS40NTAxLC0xMC4wOTMzMiA4LjE3NTExLC0yMi4zOTk1OSA4LjE3NTExLC0zNi45MTY4MiAwLC0xMi45OTc2NCAtMy4zMDIxLC0yNC4zMzUzOSAtOS45MDgyOSwtMzQuMDE0NiAtNi40NDEwNSwtOS44MTcyNSAtMTUuNTI1NDUsLTE4LjUyNzA3IC0yNy4yNTE0NiwtMjYuMTMxMzMgLTExLjU2MDg1LC03LjYwNDI3IC0yNy45MTA4MywtMTUuODMxNDIgLTQ5LjA1MDY2LC0yNC42ODAyMiAtMTcuNTA2NDQsLTcuMTkwMTIgLTMwLjcxOTY2OCwtMTMuNjg5NDggLTM5LjYzODAzOCwtMTkuNDk3MDEgLTguOTE4MzcxLC01LjgwNzUyIC0xOC42MDc0NzQsLTEyLjQzNDA5IC0yNC4wOTY1MjQsLTE4Ljg3NDE3IC01LjQyNjA0MywtNi4zNjYxNiAtOS42NTg4MjYsLTE1LjA3MDAzIC05LjY1ODgyNiwtMjQuODg3MjkgMCwtOS4yNjQwMSAyLjA3NTQxNCwtMTcuMjEzNDUgNi4yMjM0NTQsLTIzLjg1MDMzIDExLjA5ODI5OCwtMTQuMzk3NDggNDEuMjg2NjM4LC0xLjc5NTA3IDQ1LjA3NTYwOSwyNC4zNDc2MiA0LjgzOTM5Miw2Ljc3NDkxIDguODQ5MzUsMTYuMjQ3MjkgMTIuMDI5NTE1LDI4LjQxNTYgbCAyMC41MzIzNCwwIDAsLTU1Ljk5OTY3IGMgLTQuNDc4MjUsLTUuOTI0NDggLTkuOTU0ODgsLTEwLjYzMjIyIC0xNS45MDgzNywtMTQuMzc0MTEgMS42NDA1NSwwLjQ3OTA1IDMuMTkwMzksMS4wMjM3NiA0LjYzODY1LDEuNjQwMjQgNi40OTg2MSwyLjYyNjA3IDEyLjE2NzkzLDcuMzI3NDcgMTcuMDA3MywxNC4xMDM0NSA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNSwxNi4yNDU2NyAxMi4wMjk1MiwyOC40MTM5NyAwLDAgOC40ODEyOCwtMC4xMjg5NCA4LjQ4OTc4LC0wLjAwMiAwLjQxNzc2LDYuNDE0OTQgLTEuNzUzMzksOS40NTI4NiAtNC4xMjM0MiwxMi41NjEwNCAtMi40MTc0LDMuMTY5NzggLTUuMTQ0ODYsNi43ODk3MyAtNC4wMDI3OCwxMy4wMDI5IDEuNTA3ODYsOC4yMDMxOCAxMC4xODM1NCwxMC41OTY0MiAxNC42MjE5NCw5LjMxMTU0IC0zLjMxODQyLC0wLjQ5OTExIC01LjMxODU1LC0xLjc0OTQ4IC01LjMxODU1LC0xLjc0OTQ4IDAsMCAxLjg3NjQ2LDAuOTk4NjggNS42NTExNywtMS4zNTk4MSAtMy4yNzY5NSwwLjk1NTcxIC0xMC43MDUyOSwtMC43OTczOCAtMTEuODAxMjUsLTYuNzYzMTMgLTAuOTU3NTIsLTUuMjA4NjEgMC45NDY1NCwtNy4yOTUxNCAzLjQwMTEzLC0xMC41MTQ4MiAyLjQ1NDYyLC0zLjIxOTY4IDUuMjg0MjYsLTYuOTU4MzEgNC42ODQzLC0xNC40ODgyNCBsIDAuMDAzLDAuMDAyIDguOTI2NzYsMCAwLC01NS45OTk2NyBjIC0xNS4wNzEyNSwtMy44NzE2OCAtMjcuNjUzMTQsLTYuMzYwNDIgLTM3Ljc0NjcxLC03LjQ2NTg2IC05Ljk1NTMxLC0xLjEwNzU1IC0yMC4xODgyMywtMS42NTk4MSAtMzAuNjk2NjEzLC0xLjY1OTgxIHogbSA3MC4zMjE2MDMsMTcuMzA4OTMgMC4yMzgwNSw0MC4zMDQ5IGMgMS4zMTgwOCwxLjIyNjY2IDIuNDM5NjUsMi4yNzgxNSAzLjM0MDgxLDMuMTA2MDIgNC44MzkzOSw2Ljc3NDkxIDguODQ5MzQsMTYuMjQ1NjYgMTIuMDI5NTEsMjguNDEzOTcgbCAyMC41MzIzNCwwIDAsLTU1Ljk5OTY3IGMgLTYuNjc3MzEsLTQuNTkzODEgLTE5LjgzNjQzLC0xMC40NzMwOSAtMzYuMTQwNzEsLTE1LjgyNTIyIHogbSAtMjguMTIwNDksNS42MDU1MSA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM3LC02LjQ2Njk3IC0xMy44NDY3OCwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NzA1LDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiBtIDE1LjIyMTk1LDI0LjAwODQ4IDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzgsLTYuNDY2OTcgLTEzLjg0Njc5LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDQsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gLTk5LjExMzg0LDIuMjA3NjQgOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzODIsLTYuNDY2OTcgLTEzLjg0Njc4MiwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NTQyLDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiIgLz4KPC9zdmc+CjwhLS0gVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIC0tPgo8IS0tIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8gLS0+Cg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff750000',endColorstr='#ff340404',GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-right:after{-webkit-transform:translateX(-8px) translateY(-50%);-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input::-moz-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index 47e399aed09..61d6f69d727 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -1,12 +1,12 @@ -require=function t(e,n,r){function i(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(a)return a(o,!0);var c=Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[o]={exports:{}};e[o][0].call(l.exports,function(t){var n=e[o][1][t];return i(n?n:t)},l,l.exports,t,e,n,r)}return n[o].exports}for(var a="function"==typeof require&&require,o=0;o2?c[2]:void 0,p=Math.min((void 0===l?o:i(l,o))-u,o-s),f=1;for(s>u&&u+p>s&&(f=-1,u+=p-1,s+=p-1);p-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{76:76,79:79,80:80}],6:[function(t,e,n){"use strict";var r=t(80),i=t(76),a=t(79);e.exports=[].fill||function(t){for(var e=r(this),n=a(e.length),o=arguments,s=o.length,u=i(s>1?o[1]:void 0,n),c=s>2?o[2]:void 0,l=void 0===c?n:i(c,n);l>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var r=t(78),i=t(79),a=t(76);e.exports=function(t){return function(e,n,o){var s,u=r(e),c=i(u.length),l=a(o,c);if(t&&n!=n){for(;c>l;)if(s=u[l++],s!=s)return!0}else for(;c>l;l++)if((t||l in u)&&u[l]===n)return t||l;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var r=t(17),i=t(34),a=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,c=4==t,l=6==t,p=5==t||l;return function(f,d,h){for(var m,v,g=a(f),y=i(g),b=r(d,h,3),x=o(y.length),w=0,_=e?s(f,x):n?s(f,0):void 0;x>w;w++)if((p||w in y)&&(m=y[w],v=b(m,w,g),t))if(e)_[w]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return w;case 2:_.push(m)}else if(c)return!1;return l?-1:u||c?c:_}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var r=t(38),i=t(36),a=t(83)("species");e.exports=function(t,e){var n;return i(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!i(n.prototype)||(n=void 0),r(n)&&(n=n[a],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var r=t(11),i=t(83)("toStringTag"),a="Arguments"==r(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[i])?n:a?r(e):"Object"==(o=r(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var r={}.toString;e.exports=function(t){return r.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var r=t(46),i=t(31),a=t(60),o=t(17),s=t(69),u=t(18),c=t(27),l=t(42),p=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),g=Object.isExtensible||h,y=v?"_s":"size",b=0,x=function(t,e){if(!h(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!d(t,f)){if(!g(t))return"F";if(!e)return"E";i(t,f,++b)}return"O"+t[f]},w=function(t,e){var n,r=x(e);if("F"!==r)return t._i[r];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,i){var l=t(function(t,a){s(t,l,e),t._i=r.create(null),t._f=void 0,t._l=void 0,t[y]=0,void 0!=a&&c(a,n,t[i],t)});return a(l.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[y]=0},"delete":function(t){var e=this,n=w(e,t);if(n){var r=n.n,i=n.p;delete e._i[n.i],n.r=!0,i&&(i.n=r),r&&(r.p=i),e._f==n&&(e._f=r),e._l==n&&(e._l=i),e[y]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!w(this,t)}}),v&&r.setDesc(l.prototype,"size",{get:function(){return u(this[y])}}),l},def:function(t,e,n){var r,i,a=w(t,e);return a?a.v=n:(t._l=a={i:i=x(e,!0),k:e,v:n,p:r=t._l,n:void 0,r:!1},t._f||(t._f=a),r&&(r.n=a),t[y]++,"F"!==i&&(t._i[i]=a)),t},getEntry:w,setStrong:function(t,e,n){l(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?p(0,n.k):"values"==e?p(0,n.v):p(0,[n.k,n.v]):(t._t=void 0,p(1))},n?"entries":"values",!n,!0),m(e)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,e,n){var r=t(27),i=t(10);e.exports=function(t){return function(){if(i(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return r(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var r=t(31),i=t(60),a=t(4),o=t(38),s=t(69),u=t(27),c=t(8),l=t(30),p=t(82)("weak"),f=Object.isExtensible||o,d=c(5),h=c(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},y=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=y(this,t);return e?e[1]:void 0},has:function(t){return!!y(this,t)},set:function(t,e){var n=y(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,r){var a=t(function(t,i){s(t,a,e),t._i=m++,t._l=void 0,void 0!=i&&u(i,n,t[r],t)});return i(a.prototype,{"delete":function(t){return o(t)?f(t)?l(t,p)&&l(t[p],this._i)&&delete t[p][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?l(t,p)&&l(t[p],this._i):v(this).has(t):!1}}),a},def:function(t,e,n){return f(a(e))?(l(e,p)||r(e,p,{}),e[p][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:p}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,e,n){"use strict";var r=t(29),i=t(22),a=t(61),o=t(60),s=t(27),u=t(69),c=t(38),l=t(24),p=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=r[t],g=v,y=h?"set":"add",b=g&&g.prototype,x={},w=function(t){var e=b[t];a(b,t,"delete"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!c(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||b.forEach&&!l(function(){(new g).entries().next()}))){var _,k=new g,E=k[y](m?{}:-0,1)!=k,S=l(function(){k.has(1)}),O=p(function(t){new g(t)});O||(g=e(function(e,n){u(e,g,t);var r=new v;return void 0!=n&&s(n,h,r[y],r),r}),g.prototype=b,b.constructor=g),m||k.forEach(function(t,e){_=1/e===-(1/0)}),(S||_)&&(w("delete"),w("has"),h&&w("get")),(_||E)&&w(y),m&&b.clear&&delete b.clear}else g=d.getConstructor(e,t,h,y),o(g.prototype,n);return f(g,t),x[t]=g,i(i.G+i.W+i.F*(g!=v),x),m||d.setStrong(g,t,h),g}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,e,n){var r=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=r)},{}],17:[function(t,e,n){var r=t(2);e.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}return function(){return t.apply(e,arguments)}}},{2:2}],18:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],19:[function(t,e,n){e.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,e,n){var r=t(38),i=t(29).document,a=r(i)&&r(i.createElement);e.exports=function(t){return a?i.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var r=t(46);e.exports=function(t){var e=r.getKeys(t),n=r.getSymbols;if(n)for(var i,a=n(t),o=r.isEnum,s=0;a.length>s;)o.call(t,i=a[s++])&&e.push(i);return e}},{46:46}],22:[function(t,e,n){var r=t(29),i=t(16),a=t(31),o=t(61),s=t(17),u="prototype",c=function(t,e,n){var l,p,f,d,h=t&c.F,m=t&c.G,v=t&c.S,g=t&c.P,y=t&c.B,b=m?r:v?r[e]||(r[e]={}):(r[e]||{})[u],x=m?i:i[e]||(i[e]={}),w=x[u]||(x[u]={});m&&(n=e);for(l in n)p=!h&&b&&l in b,f=(p?b:n)[l],d=y&&p?s(f,r):g&&"function"==typeof f?s(Function.call,f):f,b&&!p&&o(b,l,f),x[l]!=f&&a(x,l,d),g&&w[l]!=f&&(w[l]=f)};r.core=i,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,e.exports=c},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var r=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(i){}}return!0}},{83:83}],24:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],25:[function(t,e,n){"use strict";var r=t(31),i=t(61),a=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),c=""[t];a(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(i(String.prototype,t,n(o,u,c)),r(RegExp.prototype,u,2==e?function(t,e){return c.call(t,this,e)}:function(t){return c.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var r=t(4);e.exports=function(){var t=r(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{4:4}],27:[function(t,e,n){var r=t(17),i=t(40),a=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,c){var l,p,f,d=u(t),h=r(n,c,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(a(d))for(l=s(t.length);l>m;m++)e?h(o(p=t[m])[0],p[1]):h(t[m]);else for(f=d.call(t);!(p=f.next()).done;)i(f,h,p.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var r=t(78),i=t(46).getNames,a={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return i(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==a.call(t)?s(t):i(r(t))}},{46:46,78:78}],29:[function(t,e,n){var r=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],30:[function(t,e,n){var r={}.hasOwnProperty;e.exports=function(t,e){return r.call(t,e)}},{}],31:[function(t,e,n){var r=t(46),i=t(59);e.exports=t(19)?function(t,e,n){return r.setDesc(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},{19:19,46:46,59:59}],32:[function(t,e,n){e.exports=t(29).document&&document.documentElement},{29:29}],33:[function(t,e,n){e.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],34:[function(t,e,n){var r=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var r=t(45),i=t(83)("iterator"),a=Array.prototype;e.exports=function(t){return void 0!==t&&(r.Array===t||a[i]===t)}},{45:45,83:83}],36:[function(t,e,n){var r=t(11);e.exports=Array.isArray||function(t){return"Array"==r(t)}},{11:11}],37:[function(t,e,n){var r=t(38),i=Math.floor;e.exports=function(t){return!r(t)&&isFinite(t)&&i(t)===t}},{38:38}],38:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,e,n){var r=t(38),i=t(11),a=t(83)("match");e.exports=function(t){var e;return r(t)&&(void 0!==(e=t[a])?!!e:"RegExp"==i(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var r=t(4);e.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(a){var o=t["return"];throw void 0!==o&&r(o.call(t)),a}}},{4:4}],41:[function(t,e,n){"use strict";var r=t(46),i=t(59),a=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=r.create(o,{next:i(1,n)}),a(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var r=t(48),i=t(22),a=t(61),o=t(31),s=t(30),u=t(45),c=t(41),l=t(66),p=t(46).getProto,f=t(83)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,y,b,x,w){c(n,e,y);var _,k,E=function(t){if(!d&&t in C)return C[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},S=e+" Iterator",O=b==v,A=!1,C=t.prototype,P=C[f]||C[h]||b&&C[b],j=P||E(b);if(P){var T=p(j.call(new t));l(T,S,!0),!r&&s(C,h)&&o(T,f,g),O&&P.name!==v&&(A=!0,j=function(){return P.call(this)})}if(r&&!w||!d&&!A&&C[f]||o(C,f,j),u[e]=j,u[S]=g,b)if(_={values:O?j:E(v),keys:x?j:E(m),entries:O?E("entries"):j},w)for(k in _)k in C||a(C,k,_[k]);else i(i.P+i.F*(d||A),e,_);return _}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,e,n){var r=t(83)("iterator"),i=!1;try{var a=[7][r]();a["return"]=function(){i=!0},Array.from(a,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var a=[7],o=a[r]();o.next=function(){n=!0},a[r]=function(){return o},t(a)}catch(s){}return n}},{83:83}],44:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],45:[function(t,e,n){e.exports={}},{}],46:[function(t,e,n){var r=Object;e.exports={create:r.create,getProto:r.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:r.getOwnPropertyDescriptor,setDesc:r.defineProperty,setDescs:r.defineProperties,getKeys:r.keys,getNames:r.getOwnPropertyNames,getSymbols:r.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var r=t(46),i=t(78);e.exports=function(t,e){for(var n,a=i(t),o=r.getKeys(a),s=o.length,u=0;s>u;)if(a[n=o[u++]]===e)return n}},{46:46,78:78}],48:[function(t,e,n){e.exports=!1},{}],49:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],50:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],51:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,e,n){var r,i,a,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,c=o.process,l=o.Promise,p="process"==t(11)(c),f=function(){var t,e,n;for(p&&(t=c.domain)&&(c.domain=null,t.exit());r;)e=r.domain,n=r.fn,e&&e.enter(),n(),e&&e.exit(),r=r.next;i=void 0,t&&t.enter()};if(p)a=function(){c.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(f).observe(h,{characterData:!0}),a=function(){h.data=d=-d}}else a=l&&l.resolve?function(){l.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:p&&c.domain};i&&(i.next=e),r||(r=e,a()),i=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var r=t(46),i=t(80),a=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},r=Symbol(),i="abcdefghijklmnopqrst";return e[r]=7,i.split("").forEach(function(t){n[t]=t}),7!=t({},e)[r]||Object.keys(t({},n)).join("")!=i})?function(t,e){for(var n=i(t),o=arguments,s=o.length,u=1,c=r.getKeys,l=r.getSymbols,p=r.isEnum;s>u;)for(var f,d=a(o[u++]),h=l?c(d).concat(l(d)):c(d),m=h.length,v=0;m>v;)p.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{24:24,34:34,46:46,80:80}],54:[function(t,e,n){var r=t(22),i=t(16),a=t(24);e.exports=function(t,e){var n=(i.Object||{})[t]||Object[t],o={};o[t]=e(n),r(r.S+r.F*a(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var r=t(46),i=t(78),a=r.isEnum;e.exports=function(t){return function(e){for(var n,o=i(e),s=r.getKeys(o),u=s.length,c=0,l=[];u>c;)a.call(o,n=s[c++])&&l.push(t?[n,o[n]]:o[n]);return l}}},{46:46,78:78}],56:[function(t,e,n){var r=t(46),i=t(4),a=t(29).Reflect;e.exports=a&&a.ownKeys||function(t){var e=r.getNames(i(t)),n=r.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var r=t(58),i=t(33),a=t(2);e.exports=function(){for(var t=a(this),e=arguments.length,n=Array(e),o=0,s=r._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var r,a=this,o=arguments,c=o.length,l=0,p=0;if(!u&&!c)return i(t,n,a);if(r=n.slice(),u)for(;e>l;l++)r[l]===s&&(r[l]=o[p++]);for(;c>p;)r.push(o[p++]);return i(t,r,a)}}},{2:2,33:33,58:58}],58:[function(t,e,n){e.exports=t(29)},{29:29}],59:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],60:[function(t,e,n){var r=t(61);e.exports=function(t,e){for(var n in e)r(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var r=t(29),i=t(31),a=t(82)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(16).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(a)||i(n,a,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||i(n,"name",e)),t===r?t[e]=n:(o||delete t[e],i(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[a]||s.call(this)})},{16:16,29:29,31:31,82:82}],62:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],63:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],64:[function(t,e,n){var r=t(46).getDesc,i=t(38),a=t(4),o=function(t,e){if(a(t),!i(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,i){try{i=t(17)(Function.call,r(Object.prototype,"__proto__").set,2),i(e,[]),n=!(e instanceof Array)}catch(a){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:i(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var r=t(29),i=t(46),a=t(19),o=t(83)("species");e.exports=function(t){var e=r[t];a&&e&&!e[o]&&i.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var r=t(46).setDesc,i=t(30),a=t(83)("toStringTag");e.exports=function(t,e,n){t&&!i(t=n?t:t.prototype,a)&&r(t,a,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var r=t(29),i="__core-js_shared__",a=r[i]||(r[i]={});e.exports=function(t){return a[t]||(a[t]={})}},{29:29}],68:[function(t,e,n){var r=t(4),i=t(2),a=t(83)("species");e.exports=function(t,e){var n,o=r(t).constructor;return void 0===o||void 0==(n=r(o)[a])?e:i(n)}},{2:2,4:4,83:83}],69:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],70:[function(t,e,n){var r=t(77),i=t(18);e.exports=function(t){return function(e,n){var a,o,s=i(e)+"",u=r(n),c=s.length;return 0>u||u>=c?t?"":void 0:(a=s.charCodeAt(u),55296>a||a>56319||u+1===c||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):a:t?s.slice(u,u+2):(a-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var r=t(39),i=t(18);e.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return i(t)+""}},{18:18,39:39}],72:[function(t,e,n){var r=t(79),i=t(73),a=t(18);e.exports=function(t,e,n,o){var s=a(t)+"",u=s.length,c=void 0===n?" ":n+"",l=r(e);if(u>=l)return s;""==c&&(c=" ");var p=l-u,f=i.call(c,Math.ceil(p/c.length));return f.length>p&&(f=f.slice(0,p)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var r=t(77),i=t(18);e.exports=function(t){var e=i(this)+"",n="",a=r(t);if(0>a||a==1/0)throw RangeError("Count can't be negative");for(;a>0;(a>>>=1)&&(e+=e))1&a&&(n+=e);return n}},{18:18,77:77}],74:[function(t,e,n){var r=t(22),i=t(18),a=t(24),o=" \n\x0B\f\r   ᠎              \u2028\u2029\ufeff",s="["+o+"]",u="​…",c=RegExp("^"+s+s+"*"),l=RegExp(s+s+"*$"),p=function(t,e){var n={};n[t]=e(f),r(r.P+r.F*a(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=p.trim=function(t,e){return t=i(t)+"",1&e&&(t=t.replace(c,"")),2&e&&(t=t.replace(l,"")),t};e.exports=p},{18:18,22:22,24:24}],75:[function(t,e,n){var r,i,a,o=t(17),s=t(33),u=t(32),c=t(20),l=t(29),p=l.process,f=l.setImmediate,d=l.clearImmediate,h=l.MessageChannel,m=0,v={},g="onreadystatechange",y=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},b=function(t){y.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},r(m),m},d=function(t){delete v[t]},"process"==t(11)(p)?r=function(t){p.nextTick(o(y,t,1))}:h?(i=new h,a=i.port2,i.port1.onmessage=b,r=o(a.postMessage,a,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(r=function(t){l.postMessage(t+"","*")},l.addEventListener("message",b,!1)):r=g in c("script")?function(t){u.appendChild(c("script"))[g]=function(){u.removeChild(this),y.call(t)}}:function(t){setTimeout(o(y,t,1),0)}),e.exports={set:f,clear:d}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,e,n){var r=t(77),i=Math.max,a=Math.min;e.exports=function(t,e){return t=r(t),0>t?i(t+e,0):a(t,e)}},{77:77}],77:[function(t,e,n){var r=Math.ceil,i=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?i:r)(t)}},{}],78:[function(t,e,n){var r=t(34),i=t(18);e.exports=function(t){return r(i(t))}},{18:18,34:34}],79:[function(t,e,n){var r=t(77),i=Math.min;e.exports=function(t){return t>0?i(r(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var r=t(18);e.exports=function(t){return Object(r(t))}},{18:18}],81:[function(t,e,n){var r=t(38);e.exports=function(t,e){if(!r(t))return t;var n,i;if(e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;if("function"==typeof(n=t.valueOf)&&!r(i=n.call(t)))return i;if(!e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var r=0,i=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++r+i).toString(36))}},{}],83:[function(t,e,n){var r=t(67)("wks"),i=t(82),a=t(29).Symbol;e.exports=function(t){return r[t]||(r[t]=a&&a[t]||(a||i)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var r=t(10),i=t(83)("iterator"),a=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[i]||t["@@iterator"]||a[r(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var r,i=t(46),a=t(22),o=t(19),s=t(59),u=t(32),c=t(20),l=t(30),p=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),y=t(78),b=t(77),x=t(76),w=t(79),_=t(34),k=t(82)("__proto__"),E=t(8),S=t(7)(!1),O=Object.prototype,A=Array.prototype,C=A.slice,P=A.join,j=i.setDesc,T=i.getDesc,M=i.setDescs,L={};o||(r=!d(function(){return 7!=j(c("div"),"a",{get:function(){return 7}}).a}),i.setDesc=function(t,e,n){if(r)try{return j(t,e,n)}catch(i){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},i.getDesc=function(t,e){if(r)try{return T(t,e)}catch(n){}return l(t,e)?s(!O.propertyIsEnumerable.call(t,e),t[e]):void 0},i.setDescs=M=function(t,e){h(t);for(var n,r=i.getKeys(e),a=r.length,o=0;a>o;)i.setDesc(t,n=r[o++],e[n]);return t}),a(a.S+a.F*!o,"Object",{getOwnPropertyDescriptor:i.getDesc,defineProperty:i.setDesc,defineProperties:M});var F="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=F.concat("length","prototype"),R=F.length,D=function(){var t,e=c("iframe"),n=R,r=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("
Red Deity