From d7c6b7f81c4feb7cbb2b9ff0466476adffd917fa Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 13 Oct 2023 02:56:54 +0200 Subject: [PATCH] [MIRROR] Abandoned Domains: Adds two new psyker-oriented virtual domains [MDB IGNORE] (#24303) * Abandoned Domains: Adds two new psyker-oriented virtual domains (#78892) ## About The Pull Request _Really? Bitrunning maps are so simple you could do them with your eyes closed? Hmmmmm..._ This adds two new medium-difficulty virtual domains to the pool -- Crate Chaos and Infected Domain. These two domains take you to neglected corners of the virtual world. These are unstable, bizarre locales that do not support the bitrunning machine's visual display, and must be traversed using echolocation. **_These domains have been designed around you being a psyker, and will turn your bitrunner avatar into a psyker until they leave the domain._** _**Crate Chaos:** Low cost, medium reward._ Sneak into an abandoned virtual domain, where they store all of the loot crates. There's about 40-ish crates in this space, and one of them (RANDOM) is the encrypted cache we're looking for. The crates must be manually inspected, requiring you to drop your weapon for a few moments, but that shouldn't be a problem. There's no hostiles, just a bunch of crates... right? This one has very few shenanigans or threats in it. It's meant to be an introductory experience to interfacing with things as a psyker, and getting the rhythm down for moving between visual pulses. _**Infected Domain:** Medium cost, high reward._ Enter another abandoned virtual domain. This one was sealed off from the digital world after the cyber-police failed to contain a virus that zombified its inhabitants, leaving it to grow unstable and full of holes. Fortunately, you're provided with the single best tool for arming yourself against zombies in any video game, ever -- Your very own Mystery Box. Get armed with (basically) whatever gun you want, and go put those wacky psyker abilities to use against those zombies. This one is a lot meaner. Many chasms, landmines, and zombies. Walk slowly, stay with your fellow bitrunners, and if it's too hard, there's no shame in going back and rolling for a better gun! The domains themselves are VERY simple, since there's little need for decor or particularly complex layouts. The idea is that you should be able to see everything you need to see in a given room/area with a single vision pulse. Here's what one of the maps looks like: ![image](https://github.com/tgstation/tgstation/assets/28870487/fe63adce-aa05-4339-9d19-28ce06a2d31f) Err, uh, I mean... This is what the maps look like:
SPOILERS BEWARE
![image](https://github.com/tgstation/tgstation/assets/28870487/265ecdc5-50f6-4a28-8068-fab08ae1f5e8) ![image](https://github.com/tgstation/tgstation/assets/28870487/0b41da6a-e018-4434-9368-6daee1f97fe9) (You wanna find out if there's something cool under those red lines? Go there yourself!)
These two psyker maps come with their own psyker safehouse too -- The Bathroom. It's gross, the medical supplies are kind of just sitting there on the floor... It looks a little bit better when you're blind, I guess. ![image](https://github.com/tgstation/tgstation/assets/28870487/a10b70bb-5586-4d37-bbb1-a642d8524d54) ## Why It's Good For The Game I like psykers a lot more than I'm willing to admit. Unfortunately, the jankiness of echolocation provides such a disadvantage at times, that any "real" conflict is usually over before the psyker is even aware they're taking damage. Fortunately, the controlled environments that bitrunning maps are perfect for psykers. They give the opportunity to craft an experience around the player being blind, rather than forcing them to play blind through a seeing mans world. These two domains should present players with a unique challenge that is designed around playing as a psyker, with slightly higher-than-usual rewards for their trouble. More importantly -- They're fun! ## Changelog :cl: Rhials add: Two new psyker-oriented virtual domains -- Crate Chaos and Infected Domain. add: Map helper for cyber-police corpse spawn. add: Map helper for swapping the encrypted crate in an area with a random crate from that same area. /:cl: * Abandoned Domains: Adds two new psyker-oriented virtual domains --------- Co-authored-by: Rhials <28870487+Rhials@users.noreply.github.com> --- _maps/safehouses/bathroom.dmm | 155 +++ _maps/virtual_domains/psyker_shuffle.dmm | 1074 +++++++++++++++ _maps/virtual_domains/psyker_zombies.dmm | 1215 +++++++++++++++++ code/modules/bitrunning/objects/landmarks.dm | 38 + .../{antagonists/outfit.dm => outfits.dm} | 14 + .../virtual_domain/domains/psyker_shuffle.dm | 12 + .../virtual_domain/domains/psyker_zombies.dm | 14 + .../bitrunning/virtual_domain/safehouses.dm | 3 + code/modules/mob_spawn/corpses/mob_corpses.dm | 4 + tgstation.dme | 4 +- 10 files changed, 2532 insertions(+), 1 deletion(-) create mode 100644 _maps/safehouses/bathroom.dmm create mode 100644 _maps/virtual_domains/psyker_shuffle.dmm create mode 100644 _maps/virtual_domains/psyker_zombies.dmm rename code/modules/bitrunning/{antagonists/outfit.dm => outfits.dm} (74%) create mode 100644 code/modules/bitrunning/virtual_domain/domains/psyker_shuffle.dm create mode 100644 code/modules/bitrunning/virtual_domain/domains/psyker_zombies.dm diff --git a/_maps/safehouses/bathroom.dmm b/_maps/safehouses/bathroom.dmm new file mode 100644 index 00000000000..62e928ac054 --- /dev/null +++ b/_maps/safehouses/bathroom.dmm @@ -0,0 +1,155 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"c" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"e" = ( +/obj/effect/spawner/structure/window, +/obj/effect/decal/cleanable/blood/splatter/over_window, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"q" = ( +/obj/structure/urinal/directional/west, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"s" = ( +/obj/effect/landmark/bitrunning/cache_goal_turf, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/obj/machinery/light/small/blacklight/directional/east, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"v" = ( +/obj/machinery/light/small/blacklight/directional/east, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/tracks, +/obj/vehicle/ridden/wheelchair, +/obj/effect/spawner/random/medical/injector, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"x" = ( +/obj/structure/railing/corner/end{ + dir = 4 + }, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"y" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/blacklight/directional/west, +/obj/effect/spawner/random/medical/medkit, +/obj/effect/spawner/random/medical/medkit, +/obj/effect/spawner/random/medical/minor_healing, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"z" = ( +/obj/structure/sign/poster/abductor/random/directional/east, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"D" = ( +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"G" = ( +/turf/closed/wall/mineral/silver, +/area/virtual_domain/safehouse) +"J" = ( +/obj/structure/railing, +/obj/effect/landmark/bitrunning/cache_goal_turf, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"M" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/toilet{ + dir = 4 + }, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"N" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"T" = ( +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"V" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"X" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/freezer, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"Z" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/blacklight/directional/west, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) + +(1,1,1) = {" +G +G +G +G +G +G +"} +(2,1,1) = {" +G +Z +M +q +y +G +"} +(3,1,1) = {" +G +c +D +a +T +G +"} +(4,1,1) = {" +X +a +D +D +T +G +"} +(5,1,1) = {" +G +V +x +N +T +G +"} +(6,1,1) = {" +G +s +J +z +v +e +"} +(7,1,1) = {" +G +G +G +G +G +G +"} diff --git a/_maps/virtual_domains/psyker_shuffle.dmm b/_maps/virtual_domains/psyker_shuffle.dmm new file mode 100644 index 00000000000..9c846c650da --- /dev/null +++ b/_maps/virtual_domains/psyker_shuffle.dmm @@ -0,0 +1,1074 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/closet/crate/secure, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"b" = ( +/obj/item/restraints/legcuffs/beartrap/prearmed, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"e" = ( +/obj/item/gun/ballistic/shotgun/lethal, +/obj/structure/closet/crate/preopen, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"h" = ( +/obj/structure/closet/crate/preopen, +/obj/item/gun/ballistic/automatic/mini_uzi, +/obj/item/gun/ballistic/revolver{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/item/gun/ballistic/revolver{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/item/gun/ballistic/revolver{ + pixel_x = 1; + pixel_y = 1 + }, +/obj/item/gun/ballistic/revolver{ + pixel_x = -1; + pixel_y = 5 + }, +/obj/item/gun/ballistic/revolver{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/gun/ballistic/revolver{ + pixel_x = -3 + }, +/obj/item/gun/ballistic/revolver{ + pixel_x = 5; + pixel_y = -2 + }, +/obj/item/gun/ballistic/revolver{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/gun/ballistic/revolver, +/turf/template_noop, +/area/virtual_domain/safehouse) +"k" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) +"m" = ( +/obj/item/toy/gun{ + pixel_y = 3 + }, +/obj/structure/closet/crate/wooden, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"o" = ( +/turf/template_noop, +/area/template_noop) +"q" = ( +/obj/effect/landmark/bitrunning/crate_replacer, +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) +"r" = ( +/mob/living/simple_animal/hostile/mimic, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"s" = ( +/mob/living/simple_animal/hostile/mimic/crate, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"t" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"v" = ( +/obj/structure/closet/crate/hydroponics, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"x" = ( +/obj/item/gun/ballistic/shotgun/lethal, +/obj/item/gun/ballistic/revolver/mateba, +/obj/structure/closet/crate/preopen, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"B" = ( +/turf/template_noop, +/area/ruin/space/has_grav/powered/virtual_domain) +"F" = ( +/obj/structure/closet/crate/internals, +/obj/item/gun/ballistic/revolver/mateba, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"G" = ( +/obj/structure/closet/crate, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"K" = ( +/obj/structure/closet/crate/eva, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"M" = ( +/obj/machinery/door/airlock/abductor, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"N" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"O" = ( +/obj/structure/closet/crate/freezer/surplus_limbs, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"P" = ( +/obj/structure/closet/crate/wooden, +/obj/item/gun/ballistic/revolver/mateba, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"Q" = ( +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"R" = ( +/obj/structure/closet/crate/secure/loot, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"S" = ( +/obj/structure/closet/crate/secure/bitrunning/encrypted, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"U" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"X" = ( +/obj/item/gun/ballistic/shotgun/lethal, +/obj/structure/closet/crate/preopen, +/obj/projectile/bullet/shotgun_frag12, +/obj/projectile/bullet/shotgun_frag12, +/obj/projectile/bullet/shotgun_frag12, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"Y" = ( +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) + +(1,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"} +(2,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"} +(3,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"} +(4,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"} +(5,1,1) = {" +o +o +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +k +o +o +o +o +o +o +o +o +"} +(6,1,1) = {" +o +o +Y +Y +r +Q +Q +Q +Q +Q +Q +Q +Q +Q +a +Y +Y +Y +o +o +o +o +o +o +o +o +"} +(7,1,1) = {" +o +o +Y +Y +Y +K +Q +a +Q +Q +Y +Q +Q +Q +Q +Q +Y +Y +o +o +o +o +o +o +o +o +"} +(8,1,1) = {" +o +o +Y +Y +Y +m +Q +Q +Q +Y +Y +Y +Q +Q +Q +Q +Y +Y +o +o +o +o +o +o +o +o +"} +(9,1,1) = {" +o +o +Y +X +Y +Y +Q +Q +Q +Q +K +Y +Q +r +Y +Q +Y +Y +o +o +o +o +o +o +o +o +"} +(10,1,1) = {" +o +o +Y +b +Q +Y +Y +Q +Q +Q +Q +Q +Q +Y +Y +Q +Q +Y +o +o +o +o +o +o +o +o +"} +(11,1,1) = {" +o +o +Y +Q +Q +Q +Q +Q +Q +Y +Q +Q +Q +Q +Q +Q +Q +Y +o +o +o +o +o +o +o +o +"} +(12,1,1) = {" +o +o +Y +a +Q +b +Q +O +Q +Y +Q +Q +S +Q +Q +Q +Q +Y +o +o +o +o +o +o +o +o +"} +(13,1,1) = {" +o +o +Y +b +Q +Y +Q +Q +Q +Q +Q +Q +Q +Q +Y +Y +Q +Y +Y +Y +Y +Y +Y +Y +Y +o +"} +(14,1,1) = {" +o +o +Y +a +a +Y +Q +Q +Q +Q +Q +Q +Q +Q +Y +Q +Q +Q +t +t +t +t +t +U +Y +Y +"} +(15,1,1) = {" +o +o +Y +Y +Y +Y +Q +G +Q +Y +Y +Y +Q +Q +Q +Q +Q +Q +t +t +t +t +t +t +B +Y +"} +(16,1,1) = {" +o +o +Y +r +Q +Q +Q +Q +Q +Y +Y +Y +a +Q +Q +Q +Q +Q +t +h +t +t +t +t +B +Y +"} +(17,1,1) = {" +o +o +Y +Q +Y +Q +Q +Q +O +Y +Y +Y +a +Q +Q +Q +Q +Q +t +t +t +t +t +t +B +Y +"} +(18,1,1) = {" +o +o +Y +Q +Y +Q +Y +Y +Y +Y +Y +Y +Q +Q +Q +Q +Q +Q +t +t +t +t +t +t +B +Y +"} +(19,1,1) = {" +o +o +Y +Q +Y +Q +Q +P +Y +Y +Q +Q +Q +Q +Y +Y +Q +Q +t +t +t +t +t +t +B +Y +"} +(20,1,1) = {" +o +o +Y +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Y +Q +Q +t +t +t +t +t +N +B +Y +"} +(21,1,1) = {" +o +o +Y +a +Q +Q +Y +Q +Q +Y +Y +Q +Q +R +Q +Q +Q +Y +Y +Y +Y +Y +Y +Y +B +Y +"} +(22,1,1) = {" +o +o +Y +Y +Q +Q +Y +Q +Q +v +Q +Q +Q +Q +Q +Q +Q +Y +o +o +o +o +o +Y +B +Y +"} +(23,1,1) = {" +o +o +o +Y +Y +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Y +o +o +o +o +o +Y +Y +Y +"} +(24,1,1) = {" +o +o +Y +Y +Y +Y +Q +Q +Q +Q +Q +Y +Q +Q +Q +Q +Q +Y +o +o +o +o +o +o +o +o +"} +(25,1,1) = {" +Y +Y +Y +a +Y +Y +Y +Y +Q +Q +Q +Y +Q +Y +Q +Q +Y +Y +o +o +o +o +o +o +o +o +"} +(26,1,1) = {" +Y +a +Q +e +Q +Y +a +Q +Q +Q +Q +Y +Q +Y +Y +a +Y +Y +o +o +o +o +o +o +o +o +"} +(27,1,1) = {" +Y +Q +Q +Q +s +M +Q +Q +Q +Q +Y +Y +Q +Y +Q +Q +Q +Y +Y +o +o +o +o +o +o +o +"} +(28,1,1) = {" +Y +Y +Q +Q +a +Y +Q +a +Q +Q +Q +F +Q +Y +s +Q +Q +a +Y +o +o +o +o +o +o +o +"} +(29,1,1) = {" +Y +Y +Q +Q +Q +Y +Y +Y +Y +Y +Y +Y +Y +Y +Q +K +Q +Q +Y +o +o +o +o +o +o +o +"} +(30,1,1) = {" +Y +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +a +Q +Q +Q +K +Y +o +o +o +o +o +o +o +"} +(31,1,1) = {" +Y +a +Q +s +Y +Y +Y +s +Q +Q +Q +Q +Y +Y +x +Y +Q +Y +Y +o +o +o +o +o +o +o +"} +(32,1,1) = {" +Y +a +Y +Y +Y +o +Y +Y +Q +a +Y +Y +Y +Y +Y +Y +Y +q +o +o +o +o +o +o +o +o +"} +(33,1,1) = {" +Y +Y +Y +o +o +o +o +Y +Y +Y +Y +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"} diff --git a/_maps/virtual_domains/psyker_zombies.dmm b/_maps/virtual_domains/psyker_zombies.dmm new file mode 100644 index 00000000000..339c4e15e4c --- /dev/null +++ b/_maps/virtual_domains/psyker_zombies.dmm @@ -0,0 +1,1215 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) +"b" = ( +/obj/item/pizzabox/bomb/armed, +/obj/structure/rack, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"c" = ( +/obj/structure/sign/warning/directional/west, +/turf/open/chasm/lavaland, +/area/ruin/space/has_grav/powered/virtual_domain) +"h" = ( +/obj/structure/rack, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"i" = ( +/obj/structure/sign/warning/directional/east, +/turf/open/chasm/lavaland, +/area/ruin/space/has_grav/powered/virtual_domain) +"o" = ( +/turf/template_noop, +/area/template_noop) +"p" = ( +/obj/structure/rack, +/obj/item/reagent_containers/cup/glass/bottle/rootbeer{ + pixel_x = 3 + }, +/obj/item/reagent_containers/cup/glass/bottle/rootbeer{ + pixel_x = -3 + }, +/obj/item/reagent_containers/cup/glass/bottle/rootbeer{ + pixel_y = 1 + }, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"r" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"t" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"x" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/abductor, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"A" = ( +/obj/effect/spawner/random/trash/caution_sign, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"B" = ( +/obj/machinery/door/airlock/abductor, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"F" = ( +/obj/structure/mystery_box/guns, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"K" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) +"M" = ( +/obj/effect/mob_spawn/corpse/human/zombie, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"O" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"Q" = ( +/turf/open/chasm/lavaland, +/area/ruin/space/has_grav/powered/virtual_domain) +"R" = ( +/obj/effect/mine/explosive/light, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"T" = ( +/obj/machinery/door/airlock/abductor, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"U" = ( +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"V" = ( +/obj/structure/sign/warning/directional/east, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"W" = ( +/obj/effect/mob_spawn/corpse/human/cyber_police, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"X" = ( +/mob/living/simple_animal/hostile/zombie, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"Y" = ( +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) + +(1,1,1) = {" +o +o +o +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +o +o +o +"} +(2,1,1) = {" +o +o +o +o +o +o +o +o +a +a +a +Y +Y +Y +Y +Y +Y +a +a +o +o +o +o +o +o +o +o +o +"} +(3,1,1) = {" +o +o +a +a +a +a +a +a +a +Y +Y +Y +Y +Y +Y +Y +Y +Y +a +a +K +o +o +o +o +o +o +o +"} +(4,1,1) = {" +o +o +a +W +X +Y +B +Y +Y +Y +Y +R +a +a +X +Y +Y +Y +Y +a +a +o +o +o +o +o +o +o +"} +(5,1,1) = {" +o +o +a +b +b +p +a +R +Y +Y +Y +a +a +a +a +X +Y +Y +Y +Y +a +o +o +o +o +o +o +o +"} +(6,1,1) = {" +o +o +a +a +a +a +a +Y +Y +Y +a +a +Y +Y +a +a +a +a +Y +Y +a +o +o +o +o +o +o +o +"} +(7,1,1) = {" +o +o +a +a +a +a +a +a +Y +Y +a +Y +Y +Y +a +a +a +Y +Y +Y +a +o +o +o +o +o +o +o +"} +(8,1,1) = {" +o +o +a +a +X +Y +Y +Y +Y +Y +a +Y +Y +Y +Y +Y +Y +Y +R +a +a +o +o +o +o +o +o +o +"} +(9,1,1) = {" +o +o +a +a +W +Y +Y +Y +A +Y +a +X +Y +Y +Y +Y +Y +Y +Y +a +o +o +o +o +o +o +o +o +"} +(10,1,1) = {" +o +o +a +a +Y +Q +Q +Q +Q +Y +a +a +Y +Q +Q +Q +Q +Q +Y +a +o +o +o +o +o +o +o +o +"} +(11,1,1) = {" +o +o +a +Y +Y +Q +Q +Q +Q +Y +Y +a +Y +Q +Q +Q +Q +Q +Y +a +o +o +o +o +o +o +o +o +"} +(12,1,1) = {" +o +o +a +Y +Y +Y +Y +Y +Y +Y +Y +a +Y +Y +Y +Y +A +Y +Y +a +o +o +o +o +o +o +o +o +"} +(13,1,1) = {" +o +o +a +Y +Y +Y +a +a +Y +Y +Y +a +Y +a +Y +Y +Y +Y +Y +a +o +o +o +o +o +o +o +o +"} +(14,1,1) = {" +o +o +a +Y +Y +Y +Y +a +Y +Y +a +a +Y +a +Y +Y +Y +Y +Y +a +o +o +o +o +o +o +o +o +"} +(15,1,1) = {" +o +o +a +Y +R +Y +a +a +Y +Y +a +a +Y +a +a +Y +Y +Y +X +a +o +o +o +o +o +o +o +o +"} +(16,1,1) = {" +o +o +a +Y +Y +Y +X +a +Y +Y +X +a +Y +Y +a +Y +a +a +a +a +a +a +a +a +a +a +a +o +"} +(17,1,1) = {" +o +o +a +Y +V +Y +a +a +Y +Y +Y +x +Y +Y +Y +Y +a +h +Y +Y +t +t +t +t +t +O +a +o +"} +(18,1,1) = {" +o +o +a +Y +a +Q +a +a +Y +Y +a +a +X +Y +Y +Y +a +F +Y +Y +t +t +t +t +t +t +a +o +"} +(19,1,1) = {" +o +o +a +Q +Q +Q +a +X +Y +Y +a +a +a +Y +Y +Y +a +Y +Y +Y +t +t +t +t +t +t +a +o +"} +(20,1,1) = {" +o +o +a +Q +Q +Q +a +Y +Y +Y +a +Y +Y +Y +Y +Y +T +Y +Y +Y +t +t +t +t +t +t +a +o +"} +(21,1,1) = {" +o +o +a +a +Q +Q +a +a +Y +Y +a +a +Y +R +Y +Y +a +Y +Y +Y +t +t +t +t +t +t +a +o +"} +(22,1,1) = {" +o +o +a +a +Q +a +a +a +Y +Y +a +a +Y +Y +Y +Y +a +F +Y +Y +t +t +t +t +t +t +a +o +"} +(23,1,1) = {" +o +o +a +a +Q +a +a +a +Y +Y +a +a +a +a +Y +Y +a +h +Y +Y +t +t +t +t +t +r +a +o +"} +(24,1,1) = {" +o +o +a +a +Q +a +a +a +Y +Y +a +a +a +a +a +Y +a +a +a +a +a +a +a +a +a +a +a +o +"} +(25,1,1) = {" +o +o +a +c +Q +a +a +a +T +a +a +a +a +a +a +Y +Y +R +a +a +o +o +o +o +o +o +o +o +"} +(26,1,1) = {" +o +o +a +Q +Q +a +a +W +Y +W +a +a +a +Y +Y +Y +Y +Y +a +o +o +o +o +o +o +o +o +o +"} +(27,1,1) = {" +o +o +a +Y +Y +T +Y +Y +Y +a +a +a +Y +Y +R +Y +Y +a +a +o +o +o +o +o +o +o +o +o +"} +(28,1,1) = {" +o +o +a +Y +X +a +U +X +X +a +X +a +Y +Y +Y +Y +R +a +o +o +o +o +o +o +o +o +o +o +"} +(29,1,1) = {" +o +o +a +Y +a +a +a +a +a +a +Y +Y +Y +Y +a +a +a +a +o +o +o +o +o +o +o +o +o +o +"} +(30,1,1) = {" +o +o +a +Y +Y +R +a +a +R +Y +Y +Y +Y +Y +Y +Y +X +a +o +o +o +o +o +o +o +o +o +o +"} +(31,1,1) = {" +o +o +a +Y +Y +Y +a +Y +Y +Y +a +a +Y +Y +Y +M +a +a +o +o +o +o +o +o +o +o +o +o +"} +(32,1,1) = {" +o +o +a +Y +Y +Y +a +Y +R +a +a +a +a +Y +Y +Y +a +a +a +a +a +o +o +o +o +o +o +o +"} +(33,1,1) = {" +o +o +a +a +R +Y +a +Y +a +a +Y +Y +R +Y +Y +Y +Y +Y +Q +Q +a +o +o +o +o +o +o +o +"} +(34,1,1) = {" +o +o +o +a +Y +Y +Y +Y +Y +Y +Y +a +a +a +Y +M +Y +W +i +Q +a +o +o +o +o +o +o +o +"} +(35,1,1) = {" +o +o +o +a +Y +Y +Y +Y +X +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +"} +(36,1,1) = {" +o +o +o +a +a +a +a +a +a +a +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"} +(37,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"} diff --git a/code/modules/bitrunning/objects/landmarks.dm b/code/modules/bitrunning/objects/landmarks.dm index a4539c7c3da..d727025c928 100644 --- a/code/modules/bitrunning/objects/landmarks.dm +++ b/code/modules/bitrunning/objects/landmarks.dm @@ -63,3 +63,41 @@ /obj/effect/landmark/bitrunning/safehouse_spawn name = "Bitrunning safehouse spawn" icon_state = "safehouse" + +///Swaps the locations of an encrypted crate in the area with another randomly selected crate. +///Randomizes names, so you have to inspect crates manually. +/obj/effect/landmark/bitrunning/crate_replacer + name = "Bitrunning Goal Crate Randomizer" + icon_state = "crate" + +/obj/effect/landmark/bitrunning/crate_replacer/Initialize(mapload) + . = ..() + + #ifndef UNIT_TESTS + var/list/crate_list = list() + var/obj/structure/closet/crate/secure/bitrunning/encrypted/encrypted_crate + var/area/my_area = get_area(src) + + for(var/turf/area_turf as anything in my_area.get_contained_turfs()) + for(var/obj/structure/closet/crate/crate_to_check in area_turf) + if(istype(crate_to_check, /obj/structure/closet/crate/secure/bitrunning/encrypted)) + encrypted_crate = crate_to_check + crate_to_check.desc += span_hypnophrase(" This feels like the crate we're looking for!") + else + crate_list += crate_to_check + crate_to_check.name = "Unidentified Crate" + + if(!encrypted_crate) + stack_trace("Bitrunning Goal Crate Randomizer failed to find an encrypted crate to swap positions for.") + return + if(!length(crate_list)) + stack_trace("Bitrunning Goal Crate Randomizer failed to find any NORMAL crates to swap positions for.") + return + + var/original_location = encrypted_crate.loc + var/obj/structure/closet/crate/selected_crate = pick(crate_list) + + encrypted_crate.abstract_move(selected_crate.loc) + selected_crate.abstract_move(original_location) + + #endif diff --git a/code/modules/bitrunning/antagonists/outfit.dm b/code/modules/bitrunning/outfits.dm similarity index 74% rename from code/modules/bitrunning/antagonists/outfit.dm rename to code/modules/bitrunning/outfits.dm index db57af561f8..27ef8029a18 100644 --- a/code/modules/bitrunning/antagonists/outfit.dm +++ b/code/modules/bitrunning/outfits.dm @@ -41,3 +41,17 @@ officer_uniform.has_sensor = NO_SENSORS officer_uniform.sensor_mode = SENSOR_OFF user.update_suit_sensors() + +/datum/outfit/echolocator + name = "Bitrunning Echolocator" + glasses = /obj/item/clothing/glasses/blindfold + ears = /obj/item/radio/headset/psyker //Navigating without these is horrible. + uniform = /obj/item/clothing/under/abductor + gloves = /obj/item/clothing/gloves/fingerless + shoes = /obj/item/clothing/shoes/jackboots + suit = /obj/item/clothing/suit/jacket/trenchcoat + id = /obj/item/card/id/advanced + +/datum/outfit/echolocator/post_equip(mob/living/carbon/human/user, visualsOnly) + . = ..() + user.psykerize() diff --git a/code/modules/bitrunning/virtual_domain/domains/psyker_shuffle.dm b/code/modules/bitrunning/virtual_domain/domains/psyker_shuffle.dm new file mode 100644 index 00000000000..2ca32bce983 --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/psyker_shuffle.dm @@ -0,0 +1,12 @@ +/datum/lazy_template/virtual_domain/psyker_shuffle + name = "Crate Chaos" + cost = BITRUNNER_COST_LOW + desc = "Sneak into an abandoned corner of the virtual world, where they store all of the crates. \ + Warning -- Virtual domain does not support visual display. This mission must be completed using echolocation." + difficulty = BITRUNNER_DIFFICULTY_MEDIUM + help_text = "Getting used to echolocation may be difficult. Remember to walk slowly, and carefully inspect every crate you come across." + key = "psyker_shuffle" + map_name = "psyker_shuffle" + reward_points = BITRUNNER_REWARD_MEDIUM + safehouse_path = /datum/map_template/safehouse/bathroom + forced_outfit = /datum/outfit/echolocator diff --git a/code/modules/bitrunning/virtual_domain/domains/psyker_zombies.dm b/code/modules/bitrunning/virtual_domain/domains/psyker_zombies.dm new file mode 100644 index 00000000000..6d545f7c652 --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/psyker_zombies.dm @@ -0,0 +1,14 @@ +/datum/lazy_template/virtual_domain/psyker_zombies + name = "Infected Domain" + cost = BITRUNNER_COST_MEDIUM + desc = "Another neglected corner of the virtual world. This one had to be abandoned due to zombie virus. \ + Warning -- Virtual domain does not support visual display. This mission must be completed using echolocation." + difficulty = BITRUNNER_DIFFICULTY_MEDIUM + help_text = "This once-beloved virtual domain has been corrupted by a virus, rendering it unstable, full of holes, and full of ZOMBIES! \ + There should be a Mystery Box nearby to help get you armed. Get armed, and finish what the cyber-police started!" + key = "psyker_zombies" + map_name = "psyker_zombies" + reward_points = BITRUNNER_REWARD_HIGH + safehouse_path = /datum/map_template/safehouse/bathroom + forced_outfit = /datum/outfit/echolocator + extra_loot = list(/obj/item/radio/headset/psyker = 1) //Looks cool, might make your local burdened chaplain happy. diff --git a/code/modules/bitrunning/virtual_domain/safehouses.dm b/code/modules/bitrunning/virtual_domain/safehouses.dm index bb42f690ac7..6504d447f28 100644 --- a/code/modules/bitrunning/virtual_domain/safehouses.dm +++ b/code/modules/bitrunning/virtual_domain/safehouses.dm @@ -46,6 +46,9 @@ /datum/map_template/safehouse/ice filename = "ice.dmm" +/datum/map_template/safehouse/bathroom + filename = "bathroom.dmm" + /** * Your safehouse here * /datum/map_template/safehouse/your_type diff --git a/code/modules/mob_spawn/corpses/mob_corpses.dm b/code/modules/mob_spawn/corpses/mob_corpses.dm index 5dd709bde66..476c3f70a84 100644 --- a/code/modules/mob_spawn/corpses/mob_corpses.dm +++ b/code/modules/mob_spawn/corpses/mob_corpses.dm @@ -350,3 +350,7 @@ /datum/outfit/prey_pod_victim name = "Prey Pod Victim" uniform = /obj/item/clothing/under/rank/rnd/roboticist + +/obj/effect/mob_spawn/corpse/human/cyber_police + name = "Dead Cyber Police" + outfit = /datum/outfit/cyber_police diff --git a/tgstation.dme b/tgstation.dme index 006c2049ec3..ed0326aba5b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3341,9 +3341,9 @@ #include "code\modules\bitrunning\designs.dm" #include "code\modules\bitrunning\event.dm" #include "code\modules\bitrunning\job.dm" +#include "code\modules\bitrunning\outfits.dm" #include "code\modules\bitrunning\turfs.dm" #include "code\modules\bitrunning\antagonists\cyber_police.dm" -#include "code\modules\bitrunning\antagonists\outfit.dm" #include "code\modules\bitrunning\components\avatar_connection.dm" #include "code\modules\bitrunning\components\bitrunning_points.dm" #include "code\modules\bitrunning\components\netpod_healing.dm" @@ -3379,6 +3379,8 @@ #include "code\modules\bitrunning\virtual_domain\domains\legion.dm" #include "code\modules\bitrunning\virtual_domain\domains\pipedream.dm" #include "code\modules\bitrunning\virtual_domain\domains\pirates.dm" +#include "code\modules\bitrunning\virtual_domain\domains\psyker_shuffle.dm" +#include "code\modules\bitrunning\virtual_domain\domains\psyker_zombies.dm" #include "code\modules\bitrunning\virtual_domain\domains\stairs_and_cliffs.dm" #include "code\modules\bitrunning\virtual_domain\domains\syndicate_assault.dm" #include "code\modules\bitrunning\virtual_domain\domains\test_only.dm"