From 1116f150eba7e250c26aa6816ea69852896fd724 Mon Sep 17 00:00:00 2001
From: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
Date: Fri, 21 Jun 2024 19:39:44 -0700
Subject: [PATCH] Bitrunning: Tweaks, QoL and removals (#84125)
## About The Pull Request
See changelog for shortlist
1. **Threat changes.** I was a bit unsatisfied with the rate of antag
spawns. These have been increased considerably. The clamped probability
has been increased from 1-10 to 5-15. The probability increases from 5
to 15 as domains are completed. Generally, in a standard round, the
chance of spawning at least one antag should be around ~50% at 7 domains
completed. Emagging a server doubles this rate.
2. **Map changes.** Starfront saloon was a cool idea on paper: A totally
modular map. However, it looked very uninspired and was so much of a
chore on the map loading system that it prompted players to admin help
how long it took, thinking it was broken. I've removed the map. I have
others I want to implement that don't look so bad.
3. **QoL changes**. Ghost observer experience is improved. Previously,
you could click netpods to view their avatar, and now you can click the
hololadder to return. I've included examine text to show this. The
server's examine text will now also give you clues that it's emagged
(ghost only). The examine text on hololadders has also been improved.
4. **Bitrunning antags.** These were designed as temporary, but they
were everything but. Spawning as one would prevent your revival, which
just isn't a good tradeoff for something that's going to get deleted in
a minute. Now, this system uses temp bodies just like CTF, so you can
return once you're dead. (exception: coming station side)
5. **Maps**: Syndicate assault is still one of my favorites, but there's
cheesy exploits like instantly breaking the display case to lock down
the ship, turning on turrets which are EXTRA lethal, etc. I've added
some pistols to the closets and removed some of these exploits.
6. **Cooldown**: Yes, no one seems to upgrade these ever, and it proved
a poor technique to encourage bitrunners to leave their rooms. I had
other plans to encourage this, not included here, so I think lowering
the cooldown time is beneficial. 3min -> 2min
> [!NOTE]
> File diff: removed a map
## Why It's Good For The Game
Closes #83787
General updates and QoL for bitrunning to keep it fresh. I was quite
disappointed with the scaling of threat, and most players haven't even
seen bitrunning antags except when I admin spawn them. These numbers
aren't hard set in my mind, and could be adjusted.
I generally want bitrunning easier to access and more "temporary" which
is in keeping with its design doc.
## Changelog
:cl:
fix: Bitrunning made more illegal: Increased the rate at which antags
spawn.
fix: "Temporary" bitrunning antagonists and spawners are made actually
temporary. You will return to your original body after death, just like
CTF.
add: Added more examine text for ghosts to bitrunning equipment.
balance: Server cooldown reduced by 1 minute at base level.
add: As an observer, you can now switch views between station and
virtual domain by clicking the hololadder and netpod respectively.
del: Removed the starfront saloon BR map.
fix: Syndicate assault map: Added pistols, reduced exploits.
/:cl:
---
_maps/virtual_domains/starfront_saloon.dmm | 1834 -----------------
_maps/virtual_domains/syndicate_assault.dmm | 32 +-
code/datums/components/temporary_body.dm | 8 +-
.../bitrunning/components/virtual_entity.dm | 6 +-
code/modules/bitrunning/event.dm | 6 +-
code/modules/bitrunning/objects/hololadder.dm | 40 +-
code/modules/bitrunning/objects/netpod.dm | 19 +-
code/modules/bitrunning/server/_parent.dm | 31 +-
.../modules/bitrunning/server/map_handling.dm | 3 +-
.../bitrunning/server/obj_generation.dm | 2 +-
code/modules/bitrunning/server/threats.dm | 36 +-
code/modules/bitrunning/spawners.dm | 8 +-
.../domains/starfront_saloon.dm | 14 -
code/modules/mob_spawn/mob_spawn.dm | 9 +-
strings/tips.txt | 3 +
tgstation.dme | 1 -
16 files changed, 156 insertions(+), 1896 deletions(-)
delete mode 100644 _maps/virtual_domains/starfront_saloon.dmm
delete mode 100644 code/modules/bitrunning/virtual_domain/domains/starfront_saloon.dm
diff --git a/_maps/virtual_domains/starfront_saloon.dmm b/_maps/virtual_domains/starfront_saloon.dmm
deleted file mode 100644
index 277382b6dbb..00000000000
--- a/_maps/virtual_domains/starfront_saloon.dmm
+++ /dev/null
@@ -1,1834 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"ae" = (
-/obj/item/kirbyplants/random,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"cK" = (
-/obj/effect/landmark/bitrunning/mob_segment,
-/turf/template_noop,
-/area/virtual_domain)
-"cU" = (
-/turf/template_noop,
-/area/virtual_domain/safehouse)
-"df" = (
-/obj/effect/spawner/random/vending/snackvend,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"do" = (
-/obj/effect/spawner/random/trash/garbage,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"eU" = (
-/obj/effect/spawner/random/structure/crate,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"gh" = (
-/obj/effect/spawner/random/vending/colavend,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"hz" = (
-/obj/item/clothing/head/cowboy,
-/obj/item/clothing/head/cowboy,
-/obj/item/clothing/head/cowboy,
-/obj/structure/closet,
-/turf/template_noop,
-/area/virtual_domain/safehouse)
-"il" = (
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"it" = (
-/obj/modular_map_root/generic{
- key = "station_medium"
- },
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"iJ" = (
-/obj/machinery/light/directional/south,
-/obj/effect/spawner/random/structure/table,
-/obj/effect/spawner/random/entertainment/plushie,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"iO" = (
-/obj/effect/spawner/random/structure/crate,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"jt" = (
-/obj/item/gun/energy/marksman_revolver{
- pixel_x = 8;
- pixel_y = 4
- },
-/obj/item/gun/energy/marksman_revolver{
- pixel_x = 4
- },
-/obj/item/gun/energy/marksman_revolver{
- pixel_x = -4;
- pixel_y = -4
- },
-/obj/structure/table,
-/turf/template_noop,
-/area/virtual_domain/safehouse)
-"ma" = (
-/obj/machinery/light/directional/south,
-/obj/effect/spawner/random/structure/table,
-/obj/effect/spawner/random/decoration/generic,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"mq" = (
-/obj/effect/baseturf_helper/virtual_domain,
-/turf/closed/indestructible/binary,
-/area/virtual_domain)
-"mu" = (
-/turf/closed/wall,
-/area/virtual_domain)
-"on" = (
-/obj/structure/table/greyscale,
-/obj/machinery/recharger{
- pixel_x = 8;
- pixel_y = 4
- },
-/obj/machinery/recharger{
- pixel_x = -8;
- pixel_y = 4
- },
-/turf/template_noop,
-/area/virtual_domain/safehouse)
-"oR" = (
-/obj/effect/spawner/random/structure/chair_maintenance{
- dir = 8
- },
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"po" = (
-/obj/effect/baseturf_helper/virtual_domain,
-/obj/modular_map_root/safehouse{
- key = "den"
- },
-/turf/template_noop,
-/area/virtual_domain/safehouse)
-"sX" = (
-/obj/effect/spawner/random/decoration/statue,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"uW" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"ve" = (
-/obj/effect/spawner/random/trash/graffiti,
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"wB" = (
-/obj/effect/spawner/random/engineering/tank,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"wK" = (
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"yF" = (
-/obj/machinery/light/directional/south,
-/obj/effect/spawner/random/structure/table,
-/obj/effect/spawner/random/food_or_drink/snack,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"zU" = (
-/obj/machinery/light/directional/south,
-/obj/effect/spawner/random/structure/table,
-/obj/effect/turf_decal/tile/dark_red/half,
-/obj/machinery/recharger{
- pixel_x = 8;
- pixel_y = 4
- },
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Au" = (
-/obj/effect/spawner/random/trash/garbage,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"AF" = (
-/obj/effect/turf_decal/tile/dark_red/half,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Bi" = (
-/obj/effect/spawner/random/structure/chair_maintenance{
- dir = 4
- },
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"BX" = (
-/obj/effect/spawner/random/trash/graffiti,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Ey" = (
-/obj/machinery/light/directional/south,
-/obj/effect/spawner/random/structure/table,
-/obj/effect/spawner/random/decoration/ornament,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"EK" = (
-/obj/effect/spawner/random/structure/chair_maintenance{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt/dust,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Gz" = (
-/obj/effect/spawner/random/structure/crate,
-/obj/effect/turf_decal/tile/dark_red/half,
-/obj/effect/spawner/random/armory/shotgun,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"GY" = (
-/obj/effect/spawner/random/entertainment/arcade,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Ib" = (
-/obj/effect/spawner/random/trash/bin,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Il" = (
-/obj/effect/turf_decal/tile/dark_red/half,
-/obj/effect/decal/cleanable/dirt/dust,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Ix" = (
-/obj/structure/closet,
-/obj/effect/spawner/random/maintenance/three,
-/obj/effect/spawner/random/exotic/antag_gear,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"Ja" = (
-/turf/closed/indestructible/binary,
-/area/virtual_domain)
-"JA" = (
-/obj/effect/spawner/random/structure/crate,
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"KD" = (
-/obj/effect/landmark/bitrunning/cache_spawn,
-/turf/template_noop,
-/area/virtual_domain)
-"KN" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/virtual_domain)
-"Lu" = (
-/obj/structure/table/greyscale,
-/obj/machinery/recharger{
- pixel_x = 8;
- pixel_y = 4
- },
-/obj/machinery/recharger{
- pixel_x = -8;
- pixel_y = 4
- },
-/obj/effect/turf_decal/tile/dark_red/half,
-/obj/machinery/light/directional/south,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"MG" = (
-/obj/effect/spawner/random/trash/graffiti,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"Oq" = (
-/obj/machinery/light/small/directional/south,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Ox" = (
-/obj/structure/closet,
-/obj/effect/spawner/random/maintenance/five,
-/obj/effect/spawner/random/armory/laser_gun,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"OX" = (
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"OZ" = (
-/obj/effect/spawner/random/structure/billboard,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"PE" = (
-/turf/template_noop,
-/area/virtual_domain)
-"Qi" = (
-/obj/modular_map_root/generic{
- key = "station_small"
- },
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"QM" = (
-/obj/modular_map_root/generic{
- key = "station_large"
- },
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"QO" = (
-/obj/machinery/light/directional/east,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Rk" = (
-/obj/effect/spawner/random/trash/graffiti,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Te" = (
-/obj/machinery/light/directional/south,
-/obj/effect/spawner/random/structure/table,
-/obj/effect/spawner/random/engineering/toolbox,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Tn" = (
-/turf/open/space/basic,
-/area/virtual_domain)
-"TM" = (
-/obj/machinery/light/directional/south,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"VX" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Wd" = (
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Wp" = (
-/obj/effect/landmark/bitrunning/mob_segment,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-
-(1,1,1) = {"
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-mq
-"}
-(2,1,1) = {"
-Ja
-il
-il
-il
-il
-mu
-df
-il
-cU
-cU
-cU
-cU
-cU
-po
-il
-OX
-Ja
-"}
-(3,1,1) = {"
-Ja
-mu
-mu
-mu
-mu
-mu
-il
-il
-cU
-jt
-on
-hz
-cU
-cU
-il
-OX
-Ja
-"}
-(4,1,1) = {"
-Ja
-OX
-OX
-OX
-OX
-OX
-Qi
-il
-cU
-cU
-cU
-cU
-cU
-cU
-il
-OX
-Ja
-"}
-(5,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-gh
-il
-cU
-cU
-cU
-cU
-cU
-cU
-il
-OX
-Ja
-"}
-(6,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-il
-il
-cU
-cU
-cU
-cU
-cU
-cU
-il
-OX
-Ja
-"}
-(7,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-il
-il
-cU
-cU
-cU
-cU
-cU
-cU
-il
-OX
-Ja
-"}
-(8,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-il
-il
-cU
-cU
-cU
-cU
-cU
-cU
-il
-il
-Ja
-"}
-(9,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-il
-il
-il
-il
-il
-il
-Ja
-"}
-(10,1,1) = {"
-Ja
-Ix
-OX
-OX
-OX
-OX
-il
-il
-it
-il
-il
-il
-TM
-mu
-KN
-KN
-Ja
-"}
-(11,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-Ib
-il
-il
-il
-ae
-KN
-Tn
-Tn
-Ja
-"}
-(12,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(13,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Il
-KN
-Tn
-Tn
-Ja
-"}
-(14,1,1) = {"
-Ja
-PE
-PE
-PE
-cK
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(15,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(16,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-VX
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(17,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(18,1,1) = {"
-Ja
-Au
-OX
-OX
-OX
-OX
-il
-il
-it
-il
-sX
-il
-iO
-KN
-Tn
-Tn
-Ja
-"}
-(19,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Te
-mu
-Tn
-Tn
-Ja
-"}
-(20,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(21,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-AF
-KN
-Tn
-Tn
-Ja
-"}
-(22,1,1) = {"
-Ja
-PE
-PE
-PE
-cK
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(23,1,1) = {"
-Ja
-PE
-KD
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-Wp
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(24,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(25,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-VX
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(26,1,1) = {"
-Ja
-wB
-OX
-OX
-OX
-OX
-il
-il
-it
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(27,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-Ib
-il
-il
-il
-iJ
-mu
-Tn
-Tn
-Ja
-"}
-(28,1,1) = {"
-Ja
-PE
-KD
-PE
-PE
-PE
-PE
-PE
-il
-uW
-il
-il
-ae
-KN
-Tn
-Tn
-Ja
-"}
-(29,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-oR
-oR
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(30,1,1) = {"
-Ja
-PE
-PE
-PE
-cK
-PE
-PE
-PE
-Oq
-mu
-mu
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(31,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-Bi
-EK
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(32,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(33,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(34,1,1) = {"
-Ja
-wK
-ve
-OX
-OX
-OX
-VX
-il
-it
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(35,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-OZ
-il
-zU
-mu
-Tn
-Tn
-Ja
-"}
-(36,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(37,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-VX
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(38,1,1) = {"
-Ja
-PE
-PE
-PE
-cK
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(39,1,1) = {"
-Ja
-PE
-KD
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(40,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(41,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-uW
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(42,1,1) = {"
-Ja
-Ox
-OX
-OX
-OX
-OX
-il
-il
-it
-uW
-il
-Wp
-Gz
-KN
-Tn
-Tn
-Ja
-"}
-(43,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-uW
-il
-il
-Lu
-mu
-Tn
-Tn
-Ja
-"}
-(44,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-do
-il
-il
-il
-ae
-KN
-Tn
-Tn
-Ja
-"}
-(45,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(46,1,1) = {"
-Ja
-PE
-KD
-PE
-cK
-PE
-PE
-PE
-il
-il
-il
-VX
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(47,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-KD
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(48,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(49,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-Ib
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(50,1,1) = {"
-Ja
-MG
-OX
-OX
-OX
-OX
-VX
-il
-il
-il
-QM
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(51,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-yF
-mu
-Tn
-Tn
-Ja
-"}
-(52,1,1) = {"
-Ja
-PE
-KD
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(53,1,1) = {"
-Ja
-PE
-PE
-cK
-PE
-PE
-KD
-PE
-PE
-PE
-uW
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(54,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-uW
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(55,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(56,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-cK
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(57,1,1) = {"
-Ja
-PE
-KD
-PE
-PE
-PE
-KD
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(58,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-GY
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(59,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(60,1,1) = {"
-Ja
-eU
-OX
-OX
-OX
-OX
-il
-il
-it
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(61,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-Ib
-il
-il
-il
-Ey
-mu
-Tn
-Tn
-Ja
-"}
-(62,1,1) = {"
-Ja
-PE
-PE
-KD
-PE
-PE
-PE
-PE
-do
-il
-il
-VX
-ae
-KN
-Tn
-Tn
-Ja
-"}
-(63,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(64,1,1) = {"
-Ja
-PE
-PE
-PE
-cK
-PE
-PE
-PE
-il
-il
-Wp
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(65,1,1) = {"
-Ja
-PE
-KD
-PE
-PE
-KD
-PE
-PE
-il
-il
-sX
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(66,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(67,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-Rk
-il
-il
-uW
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(68,1,1) = {"
-Ja
-wB
-OX
-OX
-OX
-OX
-VX
-il
-il
-il
-QM
-uW
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(69,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-ma
-mu
-Tn
-Tn
-Ja
-"}
-(70,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(71,1,1) = {"
-Ja
-PE
-PE
-KD
-PE
-PE
-PE
-KD
-PE
-PE
-il
-uW
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(72,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(73,1,1) = {"
-Ja
-PE
-PE
-cK
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(74,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-cK
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(75,1,1) = {"
-Ja
-PE
-KD
-PE
-PE
-PE
-KD
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(76,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(77,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-VX
-BX
-KN
-Tn
-Tn
-Ja
-"}
-(78,1,1) = {"
-Ja
-eU
-JA
-OX
-OX
-OX
-OX
-OX
-OX
-il
-QO
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(79,1,1) = {"
-Ja
-mu
-mu
-mu
-mu
-mu
-mu
-mu
-mu
-mu
-mu
-mu
-mu
-mu
-Tn
-Tn
-Ja
-"}
-(80,1,1) = {"
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-"}
diff --git a/_maps/virtual_domains/syndicate_assault.dmm b/_maps/virtual_domains/syndicate_assault.dmm
index 81bb35a257a..3822d2cc1e0 100644
--- a/_maps/virtual_domains/syndicate_assault.dmm
+++ b/_maps/virtual_domains/syndicate_assault.dmm
@@ -65,6 +65,7 @@
req_access = list("syndicate");
secure = 1
},
+/obj/item/gun/ballistic/automatic/pistol,
/turf/open/floor/mineral/plastitanium/red,
/area/ruin/space/has_grav/powered/virtual_domain)
"cw" = (
@@ -388,6 +389,11 @@
/obj/structure/sign/poster/contraband/syndicate_pistol,
/turf/closed/wall/r_wall/syndicate,
/area/ruin/space/has_grav/powered/virtual_domain)
+"og" = (
+/obj/structure/table/reinforced,
+/obj/item/reagent_containers/cup/glass/trophy/silver_cup,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
"oM" = (
/obj/structure/cable,
/turf/open/floor/mineral/plastitanium,
@@ -498,10 +504,16 @@
/turf/open/floor/mineral/plastitanium/red,
/area/ruin/space/has_grav/powered/virtual_domain)
"sH" = (
-/obj/structure/displaycase{
+/obj/structure/closet/syndicate{
+ anchored = 1;
+ desc = "A basic closet for all your villainous needs.";
+ locked = 1;
+ name = "Closet";
req_access = list("syndicate");
- start_showpiece_type = /obj/item/gun/ballistic/automatic/pistol/deagle/camo
+ secure = 1
},
+/obj/item/ammo_box/c9mm,
+/obj/item/gun/ballistic/automatic/pistol,
/turf/open/floor/mineral/plastitanium/red,
/area/ruin/space/has_grav/powered/virtual_domain)
"sK" = (
@@ -600,6 +612,9 @@
/obj/item/ammo_box/c9mm,
/turf/open/floor/mineral/plastitanium/red,
/area/ruin/space/has_grav/powered/virtual_domain)
+"xS" = (
+/turf/closed/wall/r_wall/syndicate/nodiagonal,
+/area/ruin/space/has_grav/powered/virtual_domain)
"yl" = (
/obj/machinery/door/airlock/grunge{
name = "Captain's Room"
@@ -688,6 +703,7 @@
/obj/item/crowbar/red,
/obj/item/ammo_box/magazine/m9mm_aps,
/obj/item/ammo_box/magazine/m9mm_aps,
+/obj/item/gun/ballistic/automatic/pistol,
/turf/open/floor/carpet/royalblack,
/area/ruin/space/has_grav/powered/virtual_domain)
"Cn" = (
@@ -927,6 +943,7 @@
/obj/item/crowbar/red,
/obj/item/ammo_box/magazine/m9mm,
/obj/item/ammo_box/magazine/m9mm,
+/obj/item/gun/ballistic/automatic/pistol,
/turf/open/floor/mineral/plastitanium,
/area/ruin/space/has_grav/powered/virtual_domain)
"Mm" = (
@@ -1076,6 +1093,7 @@
/obj/item/ammo_box/magazine/m9mm,
/obj/item/ammo_box/magazine/m9mm,
/obj/machinery/light/small/directional/north,
+/obj/item/gun/ballistic/automatic/pistol,
/turf/open/floor/mineral/plastitanium,
/area/ruin/space/has_grav/powered/virtual_domain)
"Sq" = (
@@ -2206,7 +2224,7 @@ qx
qx
qx
ru
-vp
+og
Jg
ru
bh
@@ -2264,7 +2282,7 @@ qx
qx
qx
ru
-sH
+Kz
Kz
yl
bh
@@ -2743,7 +2761,7 @@ ru
ru
ru
ru
-Vk
+ru
qx
qx
qx
@@ -3091,7 +3109,7 @@ uP
ru
hD
ru
-Ig
+xS
qx
qx
qx
@@ -3203,7 +3221,7 @@ tI
Kz
Kz
ct
-xJ
+sH
ru
qx
qx
diff --git a/code/datums/components/temporary_body.dm b/code/datums/components/temporary_body.dm
index 3da289a6d34..28a7000a495 100644
--- a/code/datums/components/temporary_body.dm
+++ b/code/datums/components/temporary_body.dm
@@ -10,17 +10,23 @@
var/datum/weakref/old_mind_ref
///The old body we will be put back into when parent is being deleted.
var/datum/weakref/old_body_ref
+ /// Returns the mind if the parent dies by any means
+ var/delete_on_death = FALSE
-/datum/component/temporary_body/Initialize(datum/mind/old_mind, mob/living/old_body)
+/datum/component/temporary_body/Initialize(datum/mind/old_mind, mob/living/old_body, delete_on_death = FALSE)
if(!isliving(parent) || !isliving(old_body))
return COMPONENT_INCOMPATIBLE
ADD_TRAIT(old_body, TRAIT_MIND_TEMPORARILY_GONE, REF(src))
src.old_mind_ref = WEAKREF(old_mind)
src.old_body_ref = WEAKREF(old_body)
+ src.delete_on_death = delete_on_death
/datum/component/temporary_body/RegisterWithParent()
RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(on_parent_destroy))
+ if(delete_on_death)
+ RegisterSignal(parent, COMSIG_LIVING_DEATH, PROC_REF(on_parent_destroy))
+
/datum/component/temporary_body/UnregisterFromParent()
UnregisterSignal(parent, COMSIG_QDELETING)
diff --git a/code/modules/bitrunning/components/virtual_entity.dm b/code/modules/bitrunning/components/virtual_entity.dm
index 12e5305ba9a..db81f376a80 100644
--- a/code/modules/bitrunning/components/virtual_entity.dm
+++ b/code/modules/bitrunning/components/virtual_entity.dm
@@ -31,6 +31,8 @@
/datum/component/virtual_entity/proc/jailbreak_mobs()
SIGNAL_HANDLER
- to_chat(parent, span_big("You shiver for a moment, then suddenly feel a sense of clarity you haven't felt before. \
- You can go anywhere, do anything! You could leave this simulation right now if you wanted!"))
+ to_chat(parent, span_boldannounce("You shiver for a moment with a sense of clarity you haven't felt before."))
+ to_chat(parent, span_notice("You could go anywhere, do anything! You could leave this simulation right now if you wanted!"))
+ to_chat(parent, span_danger("But be warned, quantum entanglement will interfere with any previous lives."))
+ to_chat(parent, span_notice("You'll have just one chance to go nova, and there's no turning back."))
qdel(src)
diff --git a/code/modules/bitrunning/event.dm b/code/modules/bitrunning/event.dm
index 4cc95f4f057..16190851f37 100644
--- a/code/modules/bitrunning/event.dm
+++ b/code/modules/bitrunning/event.dm
@@ -89,6 +89,10 @@
if(!unlucky_server.validate_mutation_candidates())
return WAITING_FOR_SOMETHING
- spawned_mobs = unlucky_server.setup_glitch(forced_role)
+ var/mob/spawned = unlucky_server.setup_glitch(forced_role)
+ if(isnull(spawned))
+ return WAITING_FOR_SOMETHING
+
+ spawned_mobs += spawned
return SUCCESSFUL_SPAWN
diff --git a/code/modules/bitrunning/objects/hololadder.dm b/code/modules/bitrunning/objects/hololadder.dm
index e592f31382d..3df41a403e7 100644
--- a/code/modules/bitrunning/objects/hololadder.dm
+++ b/code/modules/bitrunning/objects/hololadder.dm
@@ -8,11 +8,37 @@
obj_flags = BLOCK_Z_OUT_DOWN
/// Time req to disconnect properly
var/travel_time = 3 SECONDS
+ /// Uses this to teleport observers back to the origin server
+ var/datum/weakref/server_ref
-/obj/structure/hololadder/Initialize(mapload)
+
+/obj/structure/hololadder/Initialize(mapload, obj/machinery/quantum_server/origin)
. = ..()
RegisterSignal(loc, COMSIG_ATOM_ENTERED, PROC_REF(on_enter))
+ server_ref = WEAKREF(origin)
+ register_context()
+
+
+/obj/structure/hololadder/add_context(atom/source, list/context, obj/item/held_item, mob/user)
+ . = ..()
+
+ context[SCREENTIP_CONTEXT_LMB] = "Disconnect"
+
+
+/obj/structure/hololadder/examine(mob/user)
+ . = ..()
+
+ if(isnull(server_ref.resolve()))
+ . += span_infoplain("It's not connected to anything.")
+ return
+
+ if(isobserver(user))
+ . += span_notice("Left click to view the server that this ladder is connected to.")
+ return
+
+ . += span_infoplain("This ladder is connected to a server. You can click on it or walk over it to disconnect.")
+
/obj/structure/hololadder/attack_hand(mob/user, list/modifiers)
. = ..()
@@ -24,19 +50,29 @@
disconnect(user)
+
+/obj/structure/hololadder/attack_ghost(mob/dead/observer/ghostie)
+ var/our_server = server_ref?.resolve()
+ if(isnull(our_server))
+ return ..()
+
+ ghostie.abstract_move(get_turf(our_server))
+
+
/// If there's a pilot ref- send the disconnect signal
/obj/structure/hololadder/proc/disconnect(mob/user)
if(isnull(user.mind))
return
if(!HAS_TRAIT(user, TRAIT_TEMPORARY_BODY))
- balloon_alert(user, "no connection detected.")
+ balloon_alert(user, "no connection detected")
return
balloon_alert(user, "disconnecting...")
if(do_after(user, travel_time, src))
SEND_SIGNAL(user, COMSIG_BITRUNNER_LADDER_SEVER)
+
/// Helper for times when you dont have hands (gondola??)
/obj/structure/hololadder/proc/on_enter(datum/source, atom/movable/arrived, turf/old_loc)
SIGNAL_HANDLER
diff --git a/code/modules/bitrunning/objects/netpod.dm b/code/modules/bitrunning/objects/netpod.dm
index 98bc96231b3..1d4e905d6e1 100644
--- a/code/modules/bitrunning/objects/netpod.dm
+++ b/code/modules/bitrunning/objects/netpod.dm
@@ -52,17 +52,25 @@
. += span_infoplain("Netpods must be built within 4 tiles of a server.")
return
- . += span_infoplain("Drag yourself into the pod to engage the link.")
- . += span_infoplain("It has limited resuscitation capabilities. Remaining in the pod can heal some injuries.")
- . += span_infoplain("It has a security system that will alert the occupant if it is tampered with.")
+ if(!isobserver(user))
+ . += span_infoplain("Drag yourself into the pod to engage the link.")
+ . += span_infoplain("It has limited resuscitation capabilities. Remaining in the pod can heal some injuries.")
+ . += span_infoplain("It has a security system that will alert the occupant if it is tampered with.")
if(isnull(occupant))
- . += span_notice("It is currently unoccupied.")
+ . += span_infoplain("It's currently unoccupied.")
+ return
+
+ . += span_infoplain("It's currently occupied by [occupant].")
+
+ if(isobserver(user))
+ . += span_notice("As an observer, you can click this netpod to jump to its avatar.")
return
- . += span_notice("It is currently occupied by [occupant].")
. += span_notice("It can be pried open with a crowbar, but its safety mechanisms will alert the occupant.")
+
+
/obj/machinery/netpod/add_context(atom/source, list/context, obj/item/held_item, mob/user)
. = ..()
@@ -74,7 +82,6 @@
context[SCREENTIP_CONTEXT_LMB] = "Pry Open"
return CONTEXTUAL_SCREENTIP_SET
- return CONTEXTUAL_SCREENTIP_SET
/obj/machinery/netpod/update_icon_state()
if(!is_operational)
diff --git a/code/modules/bitrunning/server/_parent.dm b/code/modules/bitrunning/server/_parent.dm
index 113ed6b2126..8a8d2eed913 100644
--- a/code/modules/bitrunning/server/_parent.dm
+++ b/code/modules/bitrunning/server/_parent.dm
@@ -19,7 +19,7 @@
/// Prevents multiple user actions. Handled by loading domains and cooldowns
var/is_ready = TRUE
/// Chance multipled by threat to spawn a glitch
- var/glitch_chance = 0.05
+ var/glitch_chance = 0.2
/// Current plugged in users
var/list/datum/weakref/avatar_connection_refs = list()
/// Cached list of mutable mobs in zone for cybercops
@@ -37,11 +37,13 @@
/// Changes how much info is available on the domain
var/scanner_tier = 1
/// Length of time it takes for the server to cool down after resetting. Here to give runners downtime so their faces don't get stuck like that
- var/server_cooldown_time = 3 MINUTES
+ var/server_cooldown_time = 2 MINUTES
/// Applies bonuses to rewards etc
var/servo_bonus = 0
/// Determines the glitches available to spawn, builds with completion
var/threat = 0
+ /// Maximum rate at which a glitch can spawn
+ var/threat_prob_max = 15
/// The turfs we can place a hololadder on.
var/turf/exit_turfs = list()
/// Determines if we broadcast to entertainment monitors or not
@@ -76,15 +78,18 @@
. += span_infoplain("Can be resource intensive to run. Ensure adequate power supply.")
if(capacitor_coefficient < 1)
- . += span_infoplain("Its coolant capacity reduces cooldown time by [(1 - capacitor_coefficient) * 100]%.")
+ . += span_infoplain("- Its coolant capacity reduces cooldown time by [(1 - capacitor_coefficient) * 100]%.")
if(servo_bonus > 0.2)
- . += span_infoplain("Its manipulation potential is increasing rewards by [servo_bonus]x.")
- . += span_infoplain("Injury from unsafe ejection reduced [servo_bonus * 100]%.")
+ . += span_infoplain("- Its manipulation potential is increasing rewards by [servo_bonus]x.")
+ . += span_infoplain("- Injury from unsafe ejection reduced [servo_bonus * 100]%.")
if(!is_ready)
. += span_notice("It is currently cooling down. Give it a few moments.")
+ if(isobserver(user) && (obj_flags & EMAGGED))
+ . += span_notice("Ominous warning lights are blinking red. This server has been tampered with.")
+
/obj/machinery/quantum_server/emag_act(mob/user, obj/item/card/emag/emag_card)
. = ..()
@@ -92,7 +97,8 @@
return
obj_flags |= EMAGGED
- glitch_chance = 0.09
+ glitch_chance *= 2
+ threat_prob_max *= 2
add_overlay(mutable_appearance('icons/obj/machines/bitrunning.dmi', "emag_overlay"))
balloon_alert(user, "system jailbroken...")
@@ -116,11 +122,14 @@
/obj/machinery/quantum_server/attackby(obj/item/weapon, mob/user, params)
. = ..()
- if(istype(weapon, /obj/item/bitrunning_debug))
- obj_flags |= EMAGGED
- glitch_chance = 0.5
- capacitor_coefficient = 0.01
- points = 100
+
+ if(!istype(weapon, /obj/item/bitrunning_debug))
+ return
+
+ obj_flags |= EMAGGED
+ glitch_chance = 0.5
+ capacitor_coefficient = 0.1
+ points = 100
/obj/machinery/quantum_server/crowbar_act(mob/living/user, obj/item/crowbar)
. = ..()
diff --git a/code/modules/bitrunning/server/map_handling.dm b/code/modules/bitrunning/server/map_handling.dm
index a55de5dbf9d..5bfa7813910 100644
--- a/code/modules/bitrunning/server/map_handling.dm
+++ b/code/modules/bitrunning/server/map_handling.dm
@@ -55,7 +55,8 @@
is_ready = TRUE
- if(prob(clamp((threat * glitch_chance), 1, 10)))
+ var/spawn_chance = clamp((threat * glitch_chance), 5, threat_prob_max)
+ if(prob(spawn_chance))
setup_glitch()
playsound(src, 'sound/machines/terminal_insert_disc.ogg', 30, vary = TRUE)
diff --git a/code/modules/bitrunning/server/obj_generation.dm b/code/modules/bitrunning/server/obj_generation.dm
index 641d906cc59..e8dbd72228c 100644
--- a/code/modules/bitrunning/server/obj_generation.dm
+++ b/code/modules/bitrunning/server/obj_generation.dm
@@ -110,7 +110,7 @@
if(isnull(destination))
return
- var/obj/structure/hololadder/wayout = new(destination)
+ var/obj/structure/hololadder/wayout = new(destination, src)
if(isnull(wayout))
return
diff --git a/code/modules/bitrunning/server/threats.dm b/code/modules/bitrunning/server/threats.dm
index 66a96d9971f..25a891c03b2 100644
--- a/code/modules/bitrunning/server/threats.dm
+++ b/code/modules/bitrunning/server/threats.dm
@@ -71,6 +71,8 @@
var/datum/antagonist/bitrunning_glitch/chosen_role = forced_role || get_antagonist_role()
var/role_name = initial(chosen_role.name)
var/mob/chosen_one = SSpolling.poll_ghosts_for_target(
+ question = "A temporary antagonist role is spawning in the virtual domain.\
+ \nYou will return to your previous body on conclusion.",
check_jobban = ROLE_GLITCH,
poll_time = 20 SECONDS,
checked_target = mutation_target,
@@ -92,26 +94,32 @@
return
var/role_name = initial(chosen_role.name)
- var/mob/living/antag_mob
+
+ var/mob/living/new_mob
switch(role_name)
if(ROLE_NETGUARDIAN)
- antag_mob = new /mob/living/basic/netguardian(mutation_target.loc)
+ new_mob = new /mob/living/basic/netguardian(mutation_target.loc)
else // any other humanoid mob
- antag_mob = new /mob/living/carbon/human(mutation_target.loc)
+ new_mob = new /mob/living/carbon/human(mutation_target.loc)
mutation_target.gib(DROP_ALL_REMAINS)
- antag_mob.key = ghost.key
- var/datum/mind/ghost_mind = antag_mob.mind
- ghost_mind.add_antag_datum(chosen_role)
- ghost_mind.special_role = ROLE_GLITCH
- ghost_mind.set_assigned_role(SSjob.GetJobType(/datum/job/bitrunning_glitch))
+ var/datum/mind/ghost_mind = ghost.mind
+ new_mob.key = ghost.key
- playsound(antag_mob, 'sound/magic/ethereal_exit.ogg', 50, vary = TRUE)
- message_admins("[ADMIN_LOOKUPFLW(antag_mob)] has been made into virtual antagonist by an event.")
- antag_mob.log_message("was spawned as a virtual antagonist by an event.", LOG_GAME)
+ if(ghost_mind?.current)
+ new_mob.AddComponent(/datum/component/temporary_body, ghost_mind, ghost_mind.current, TRUE)
- add_threats(antag_mob)
+ var/datum/mind/antag_mind = new_mob.mind
+ antag_mind.add_antag_datum(chosen_role)
+ antag_mind.special_role = ROLE_GLITCH
+ antag_mind.set_assigned_role(SSjob.GetJobType(/datum/job/bitrunning_glitch))
+
+ playsound(new_mob, 'sound/magic/ethereal_exit.ogg', 50, vary = TRUE)
+ message_admins("[ADMIN_LOOKUPFLW(new_mob)] has been made into virtual antagonist by an event.")
+ new_mob.log_message("was spawned as a virtual antagonist by an event.", LOG_GAME)
+
+ add_threats(new_mob)
/// Oh boy - transports the antag station side
/obj/machinery/quantum_server/proc/station_spawn(mob/living/antag, obj/machinery/byteforge/chosen_forge)
@@ -151,6 +159,10 @@
if(istype(antag_datum))
antag_datum.show_in_roundend = TRUE
+ var/datum/component/temp_body = antag.GetComponent(/datum/component/temporary_body)
+ if(temp_body)
+ qdel(temp_body)
+
do_teleport(antag, get_turf(chosen_forge), forced = TRUE, asoundin = 'sound/magic/ethereal_enter.ogg', asoundout = 'sound/magic/ethereal_exit.ogg', channel = TELEPORT_CHANNEL_QUANTUM)
/// Removes any invalid candidates from the list
diff --git a/code/modules/bitrunning/spawners.dm b/code/modules/bitrunning/spawners.dm
index 4f8aab322ff..5fa889ac655 100644
--- a/code/modules/bitrunning/spawners.dm
+++ b/code/modules/bitrunning/spawners.dm
@@ -3,13 +3,19 @@
prompt_name = "a virtual domain debug entity"
flavour_text = "You probably shouldn't be seeing this, contact a coder!"
you_are_text = "You are NOT supposed to be here. How did you let this happen?"
+ important_text = "You must eliminate any bitrunners from the domain."
+ temp_body = TRUE
/obj/effect/mob_spawn/ghost_role/human/virtual_domain/Initialize(mapload)
. = ..()
notify_ghosts("The [name] has been created. The virtual world calls for aid!", src, "Virtual Insanity!")
/obj/effect/mob_spawn/ghost_role/human/virtual_domain/special(mob/living/spawned_mob, mob/mob_possessor)
- . = ..()
+ var/datum/mind/ghost_mind = mob_possessor.mind
+ if(ghost_mind?.current) // Preserves any previous bodies before making the switch
+ spawned_mob.AddComponent(/datum/component/temporary_body, ghost_mind, ghost_mind.current, TRUE)
+
+ ..()
spawned_mob.mind.add_antag_datum(/datum/antagonist/domain_ghost_actor)
diff --git a/code/modules/bitrunning/virtual_domain/domains/starfront_saloon.dm b/code/modules/bitrunning/virtual_domain/domains/starfront_saloon.dm
deleted file mode 100644
index eae9dabc49e..00000000000
--- a/code/modules/bitrunning/virtual_domain/domains/starfront_saloon.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-/datum/lazy_template/virtual_domain/starfront_saloon
- name = "Starfront Saloon"
- cost = BITRUNNER_COST_MEDIUM
- desc = "Looks like you stepped onto the wrong street, partner. Hope you brought your gunslinging skills."
- difficulty = BITRUNNER_DIFFICULTY_HIGH
- help_text = "One of these rooms has the cache we're looking for. Find it and get out."
- is_modular = TRUE
- key = "starfront_saloon"
- map_name = "starfront_saloon"
- mob_modules = list(
- /datum/modular_mob_segment/syndicate_team,
- /datum/modular_mob_segment/syndicate_elite,
- )
- reward_points = BITRUNNER_REWARD_HIGH
diff --git a/code/modules/mob_spawn/mob_spawn.dm b/code/modules/mob_spawn/mob_spawn.dm
index ad8c7e6a03e..c9130fb706e 100644
--- a/code/modules/mob_spawn/mob_spawn.dm
+++ b/code/modules/mob_spawn/mob_spawn.dm
@@ -139,6 +139,10 @@
/// Typepath indicating the kind of job datum this ghost role will have. PLEASE inherit this with a new job datum, it's not hard. jobs come with policy configs.
var/spawner_job_path = /datum/job/ghost_role
+ /// Whether this offers a temporary body or not. Essentially, you'll be able to reenter your body after using this spawner.
+ var/temp_body = FALSE
+
+
/obj/effect/mob_spawn/ghost_role/Initialize(mapload)
. = ..()
SSpoints_of_interest.make_point_of_interest(src)
@@ -165,7 +169,7 @@
if(prompt_ghost)
var/prompt = "Become [prompt_name]?"
- if(user.can_reenter_corpse && user.mind)
+ if(!temp_body && user.can_reenter_corpse && user.mind)
prompt += " (Warning, You can no longer be revived!)"
var/ghost_role = tgui_alert(usr, prompt, buttons = list("Yes", "No"), timeout = 10 SECONDS)
if(ghost_role != "Yes" || !loc || QDELETED(user))
@@ -213,7 +217,8 @@
user.log_message("became a [prompt_name].", LOG_GAME)
uses -= 1 // Remove a use before trying to spawn to prevent strangeness like the spawner trying to spawn more mobs than it should be able to
- user.mind = null // dissassociate mind, don't let it follow us to the next life
+ if(!temp_body)
+ user.mind = null // dissassociate mind, don't let it follow us to the next life
var/created = create(user)
LAZYREMOVE(ckeys_trying_to_spawn, user_ckey) // We do this AFTER the create() so that we're basically sure that the user won't be in their ghost body anymore, so they can't click on the spawner again.
diff --git a/strings/tips.txt b/strings/tips.txt
index 8cccfe6953b..7d5f9f82ccc 100644
--- a/strings/tips.txt
+++ b/strings/tips.txt
@@ -286,3 +286,6 @@ You'll quickly lose your interest in the game if you play to win and kill. If yo
Some areas of the station use simple nautical directions to indicate their respective locations, like Fore (Front of the ship), Aft (Back), Port (Left side), Starboard (Right), Quarter and Bow (Either sides of Aft and Fore, respectively). You can review these terms on the Notepad App of your PDA.
Modular computers are compatible with integrated circuits, but most of the program-dependent circuits require them to be open/backgrounded to work. To install circuits on stationary consoles, you need to toggle interaction with the frame with right-click first.
You don't need to destroy a Spacecoin machine to make your funds stop draining. Swiping your ID on it will stop the withdrawal.
+As a Bitrunner, upgrading your quantum server will increase rewards and reduce downtime.
+As a Bitrunner, your avatar has a domain info ability which will give you clues to help complete virtual domains.
+Bitrunning is a crime.
diff --git a/tgstation.dme b/tgstation.dme
index 94efbba3082..ce40a5948a3 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3535,7 +3535,6 @@
#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\starfront_saloon.dm"
#include "code\modules\bitrunning\virtual_domain\domains\syndicate_assault.dm"
#include "code\modules\bitrunning\virtual_domain\domains\test_only.dm"
#include "code\modules\bitrunning\virtual_domain\domains\vaporwave.dm"