diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 6657653377..58bfcfdf03 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -69,35 +69,18 @@
/turf/closed/wall/r_wall,
/area/security/prison)
"aaj" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/closed/wall/r_wall,
-/area/security/prison)
-"aak" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/security/prison)
-"aal" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/security/prison)
"aam" = (
/obj/structure/cable{
icon_state = "0-2"
},
-/obj/structure/cable{
- icon_state = "0-8"
- },
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/security/prison)
@@ -115,11 +98,17 @@
/obj/structure/sign/warning/electricshock{
pixel_y = 32
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/grass,
/area/security/prison)
"aap" = (
/obj/machinery/hydroponics/soil,
/obj/item/seeds/carrot,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
/turf/open/floor/grass,
/area/security/prison)
"aaq" = (
@@ -140,17 +129,29 @@
/obj/structure/sink{
pixel_y = 20
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/security/prison)
"aar" = (
/obj/machinery/hydroponics/soil,
/obj/item/seeds/glowshroom,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/grass,
/area/security/prison)
"aas" = (
/obj/structure/sign/warning/electricshock{
pixel_y = 32
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/security/prison)
"aat" = (
@@ -5668,6 +5669,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"akw" = (
@@ -5847,10 +5851,13 @@
/area/science/xenobiology)
"akQ" = (
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "1-2"
},
-/turf/closed/wall,
-/area/security/brig)
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"akR" = (
/obj/machinery/camera{
c_tag = "Security Office";
@@ -6110,7 +6117,7 @@
"alq" = (
/obj/machinery/door/airlock/security/glass{
name = "Evidence Storage";
- req_access_txt = "4"
+ req_one_access_txt = "4;1"
},
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -6144,25 +6151,11 @@
/turf/open/floor/plasteel,
/area/security/brig)
"alt" = (
-/obj/machinery/door/airlock/security/glass{
- id_tag = "innerbrig";
- name = "Brig";
- req_access_txt = "63"
- },
-/obj/machinery/door/firedoor,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
+/obj/structure/cable{
+ icon_state = "1-2"
},
/turf/open/floor/plasteel,
/area/security/brig)
@@ -6182,16 +6175,11 @@
/area/ai_monitored/nuke_storage)
"alv" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
/obj/machinery/door/poddoor/preopen{
id = "Secure Gate";
name = "brig shutters"
},
+/obj/structure/cable,
/turf/open/floor/plating,
/area/security/brig)
"alw" = (
@@ -6274,6 +6262,9 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"alB" = (
@@ -6574,9 +6565,6 @@
/turf/open/floor/engine,
/area/science/xenobiology)
"amm" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
/obj/structure/cable{
icon_state = "0-4"
},
@@ -6611,6 +6599,9 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"amq" = (
@@ -6663,9 +6654,6 @@
icon_state = "0-8"
},
/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-4"
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/security/brig)
@@ -6765,6 +6753,12 @@
/obj/effect/turf_decal/tile/red{
dir = 1
},
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"amJ" = (
@@ -6855,25 +6849,15 @@
},
/turf/open/floor/plasteel,
/area/science/xenobiology)
-"amR" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "Secure Gate";
- name = "brig shutters"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/security/brig)
"amS" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
},
-/turf/closed/wall/r_wall,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
/area/security/brig)
"amT" = (
/obj/structure/cable{
@@ -7273,9 +7257,11 @@
/obj/structure/cable{
icon_state = "0-4"
},
-/obj/structure/cable,
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
/turf/open/floor/plating,
/area/security/brig)
"anQ" = (
@@ -7283,9 +7269,6 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
/turf/open/floor/plasteel,
/area/security/brig)
"anR" = (
@@ -7516,14 +7499,13 @@
/obj/structure/cable{
icon_state = "0-4"
},
-/obj/structure/cable,
/obj/machinery/door/poddoor/preopen{
id = "Secure Gate";
name = "brig shutters"
},
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
- icon_state = "1-8"
+ icon_state = "0-8"
},
/turf/open/floor/plating,
/area/security/brig)
@@ -7757,13 +7739,13 @@
/area/security/brig)
"aoZ" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-2"
- },
/obj/machinery/door/poddoor/preopen{
id = "Secure Brig Control";
name = "brig shutters"
},
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
/turf/open/floor/plating,
/area/security/warden)
"apa" = (
@@ -7782,6 +7764,9 @@
/area/science/xenobiology)
"apc" = (
/obj/structure/chair/office/dark,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
"apd" = (
@@ -7935,6 +7920,12 @@
pixel_x = 6;
pixel_y = 3
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
"apw" = (
@@ -8054,6 +8045,12 @@
pixel_y = -24;
req_access_txt = "2"
},
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
"apI" = (
@@ -8135,9 +8132,6 @@
req_access_txt = "63"
},
/obj/machinery/door/firedoor,
-/obj/structure/cable{
- icon_state = "4-8"
- },
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
},
@@ -8160,14 +8154,19 @@
/turf/open/floor/plating,
/area/maintenance/fore)
"apT" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "Cell Interior Shutters";
+ name = "brig shutters"
+ },
+/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "0-8"
},
/obj/structure/cable{
- icon_state = "1-8"
+ icon_state = "0-4"
},
-/turf/closed/wall/r_wall,
-/area/security/warden)
+/turf/open/floor/plating,
+/area/security/brig)
"apU" = (
/turf/open/floor/plating,
/area/security/vacantoffice/b)
@@ -8183,20 +8182,6 @@
},
/turf/open/floor/plating,
/area/maintenance/fore)
-"apX" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "Secure Brig Control";
- name = "brig shutters"
- },
-/turf/open/floor/plating,
-/area/security/warden)
"apY" = (
/obj/machinery/light/small{
dir = 1
@@ -8408,13 +8393,11 @@
/area/crew_quarters/fitness/pool)
"aqt" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-8"
- },
/obj/machinery/door/poddoor/preopen{
id = "Secure Brig Control";
name = "brig shutters"
},
+/obj/structure/cable,
/turf/open/floor/plating,
/area/security/warden)
"aqu" = (
@@ -8860,6 +8843,9 @@
c_tag = "Brig Control";
dir = 1
},
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
"arz" = (
@@ -52638,9 +52624,6 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
/turf/open/floor/plasteel,
/area/security/brig)
"cLS" = (
@@ -53544,9 +53527,17 @@
/area/science/circuit)
"dyE" = (
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "0-4"
},
-/turf/open/floor/plasteel,
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/machinery/door/poddoor/preopen{
+ id = "Secure Gate";
+ name = "brig shutters"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
/area/security/brig)
"dyS" = (
/obj/effect/turf_decal/tile/green{
@@ -53606,9 +53597,6 @@
/turf/open/space,
/area/space/nearstation)
"dCV" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
/obj/effect/turf_decal/tile/red{
dir = 1
},
@@ -55018,11 +55006,11 @@
/obj/structure/cable{
icon_state = "0-8"
},
-/obj/structure/cable{
- icon_state = "0-4"
- },
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
/turf/open/floor/plating,
/area/security/brig)
"gOZ" = (
@@ -56367,15 +56355,15 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
-/obj/structure/cable{
- icon_state = "2-4"
- },
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"kcx" = (
@@ -56915,9 +56903,6 @@
/turf/open/floor/plasteel,
/area/security/brig)
"laq" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
/obj/structure/cable{
icon_state = "2-4"
},
@@ -57206,7 +57191,7 @@
/area/maintenance/starboard/aft)
"lZn" = (
/obj/machinery/door/airlock/security/glass{
- id_tag = "innerbrig";
+ id_tag = null;
name = "Brig Infirmary";
req_access_txt = "2"
},
@@ -58253,9 +58238,6 @@
/area/hallway/primary/central)
"ovv" = (
/obj/structure/table,
-/obj/structure/cable{
- icon_state = "0-2"
- },
/obj/effect/turf_decal/tile/red{
dir = 1
},
@@ -58598,9 +58580,6 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
-/obj/structure/cable{
- icon_state = "2-4"
- },
/obj/effect/turf_decal/tile/red{
dir = 1
},
@@ -58729,9 +58708,6 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
-/obj/structure/cable{
- icon_state = "2-8"
- },
/obj/effect/turf_decal/tile/red{
dir = 1
},
@@ -58739,7 +58715,10 @@
dir = 4
},
/obj/structure/cable{
- icon_state = "2-4"
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
},
/turf/open/floor/plasteel,
/area/security/brig)
@@ -58867,9 +58846,6 @@
/turf/open/floor/plating,
/area/crew_quarters/fitness)
"pQr" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/effect/turf_decal/tile/green,
/obj/effect/turf_decal/tile/green{
dir = 8
@@ -59556,9 +59532,6 @@
/area/maintenance/bar)
"rCl" = (
/obj/machinery/door/firedoor,
-/obj/structure/cable{
- icon_state = "4-8"
- },
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
},
@@ -59602,20 +59575,6 @@
},
/turf/open/floor/plating,
/area/crew_quarters/abandoned_gambling_den)
-"rJv" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "Secure Gate";
- name = "brig shutters"
- },
-/turf/open/floor/plating,
-/area/security/brig)
"rJw" = (
/obj/structure/table/glass,
/obj/item/hemostat,
@@ -59822,9 +59781,6 @@
},
/area/crew_quarters/fitness)
"seP" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
/obj/structure/cable{
icon_state = "0-8"
},
@@ -61159,6 +61115,9 @@
/area/maintenance/starboard/aft)
"uXt" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"vae" = (
@@ -61400,13 +61359,13 @@
/area/crew_quarters/dorms)
"vyK" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-8"
- },
/obj/machinery/door/poddoor/preopen{
id = "Secure Gate";
name = "brig shutters"
},
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
/turf/open/floor/plating,
/area/security/brig)
"vzp" = (
@@ -88166,7 +88125,7 @@ aaa
aaa
aag
aaa
-aak
+aam
aap
saX
aaD
@@ -88423,7 +88382,7 @@ aaa
aaa
aag
aaf
-aaj
+aai
aao
aax
aaC
@@ -88449,7 +88408,7 @@ alz
cZe
alg
plS
-dyE
+afM
pQr
aou
aqC
@@ -88680,7 +88639,7 @@ aaa
aaa
aag
aaa
-aal
+aam
aar
uGI
aaF
@@ -88937,7 +88896,7 @@ aaa
aaa
aag
aaf
-aaj
+aai
aaq
dyS
aaE
@@ -88962,10 +88921,10 @@ agj
agM
sAk
akp
-akQ
+agj
amB
amn
-amS
+aiX
anz
anz
aov
@@ -89194,8 +89153,8 @@ aaa
aaa
aag
aaa
-aal
-aat
+aam
+aaj
aat
aat
aat
@@ -89222,7 +89181,7 @@ akM
amm
gyr
anM
-rJv
+xal
aqC
anz
aox
@@ -89451,7 +89410,7 @@ aaa
aaa
aag
aaf
-aaj
+aai
aas
aat
aat
@@ -89474,12 +89433,12 @@ akU
afM
lBz
alA
-ene
-alg
+alt
+amS
kbm
-dyE
+afM
cKC
-seP
+dyE
aqC
anR
aow
@@ -89709,7 +89668,7 @@ aaa
aag
aaa
aam
-aav
+akQ
aav
aav
aav
@@ -89736,7 +89695,7 @@ akT
gNE
gLz
anB
-amR
+seP
aqC
anz
aov
@@ -89990,10 +89949,10 @@ fxx
ako
ene
amj
-akQ
+agj
amB
amn
-amS
+aiX
anz
anz
aov
@@ -90250,7 +90209,7 @@ amk
amm
gyr
mos
-rJv
+xal
aqC
anz
aov
@@ -90503,11 +90462,11 @@ akF
aiy
akv
uXt
-alg
+amS
pAK
-dyE
+afM
anQ
-seP
+dyE
aqC
anz
aov
@@ -90764,7 +90723,7 @@ akT
amx
any
arD
-amR
+seP
aqC
anz
aov
@@ -91018,10 +90977,10 @@ ajc
akz
ene
als
-akQ
-amB
+agj
+apT
amn
-amS
+aiX
aqD
anz
aov
@@ -91275,7 +91234,7 @@ ajc
akz
ene
alg
-alt
+alw
amp
aot
apR
@@ -91534,7 +91493,7 @@ itD
alg
vyK
amI
-alg
+amS
alv
aqE
anS
@@ -92049,7 +92008,7 @@ agn
agn
amN
aoZ
-apT
+agn
anw
anz
cXU
@@ -92306,7 +92265,7 @@ akY
alE
amU
apH
-apX
+aqt
aqC
anz
gfC
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index 51a5fb3ece..a084f2ae34 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -136,11 +136,15 @@
#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand" //from base of atom/attack_hand(): (mob/user)
#define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw" //from base of atom/attack_paw(): (mob/user)
#define COMPONENT_NO_ATTACK_HAND 1 //works on all 3.
+/////////////////
+
//This signal return value bitflags can be found in __DEFINES/misc.dm
#define COMSIG_ATOM_INTERCEPT_Z_FALL "movable_intercept_z_impact" //called for each movable in a turf contents on /turf/zImpact(): (atom/movable/A, levels)
-
-/////////////////
+/// Called from orbit component: (atom/movable/orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation)
+#define COMSIG_ATOM_ORBIT_BEGIN "atom_orbit_begin"
+/// Called from orbit component: (atom/movable/orbiter, refreshing)
+#define COMSIG_ATOM_ORBIT_END "atom_orbit_end"
#define COMSIG_ENTER_AREA "enter_area" //from base of area/Entered(): (/area)
#define COMSIG_EXIT_AREA "exit_area" //from base of area/Exited(): (/area)
@@ -536,3 +540,7 @@
#define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift" //from turf ShiftClickOn(): (/mob)
#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" //from turf AltClickOn(): (/mob)
#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" //from monkey CtrlClickOn(): (/mob)
+
+// twitch plays
+/// Returns direction: (wipe_votes)
+#define COMSIG_TWITCH_PLAYS_MOVEMENT_DATA "twitch_plays_movement_data"
diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm
index 53373de6d7..49b19f767c 100644
--- a/code/datums/components/orbiter.dm
+++ b/code/datums/components/orbiter.dm
@@ -54,6 +54,7 @@
move_react()
/datum/component/orbiter/proc/begin_orbit(atom/movable/orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation)
+ SEND_SIGNAL(parent, COMSIG_ATOM_ORBIT_BEGIN, orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation)
if(orbiter.orbiting)
if(orbiter.orbiting == src)
orbiter.orbiting.end_orbit(orbiter, TRUE)
@@ -87,6 +88,7 @@
/datum/component/orbiter/proc/end_orbit(atom/movable/orbiter, refreshing=FALSE)
if(!orbiters[orbiter])
return
+ SEND_SIGNAL(parent, COMSIG_ATOM_ORBIT_END, orbiter, refreshing)
UnregisterSignal(orbiter, COMSIG_MOVABLE_MOVED)
orbiter.SpinAnimation(0, 0)
if(istype(orbiters[orbiter],/matrix)) //This is ugly.
diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm
index 973ca7463e..03f3820a9b 100644
--- a/code/datums/components/riding.dm
+++ b/code/datums/components/riding.dm
@@ -133,7 +133,7 @@
//KEYS
/datum/component/riding/proc/keycheck(mob/user)
- return !keytype || user.is_holding_item_of_type(keytype)
+ return !keytype || user?.is_holding_item_of_type(keytype)
//BUCKLE HOOKS
/datum/component/riding/proc/restore_position(mob/living/buckled_mob)
@@ -153,7 +153,7 @@
/datum/component/riding/proc/handle_ride(mob/user, direction)
var/atom/movable/AM = parent
- if(user.incapacitated())
+ if(user && user.incapacitated())
Unbuckle(user)
return
if(world.time < last_vehicle_move + ((last_move_diagonal? 2 : 1) * vehicle_move_delay))
diff --git a/code/datums/components/twitch_plays.dm b/code/datums/components/twitch_plays.dm
new file mode 100644
index 0000000000..aadbd58b4b
--- /dev/null
+++ b/code/datums/components/twitch_plays.dm
@@ -0,0 +1,104 @@
+/**
+ * Observers voting on things through orbiting
+ */
+/datum/component/twitch_plays
+ /// Observers
+ var/list/mob/players = list()
+
+/datum/component/twitch_plays/Initialize(...)
+ . = ..()
+ if(!isatom(parent))
+ return COMPONENT_INCOMPATIBLE
+ RegisterSignal(parent, COMSIG_ATOM_ORBIT_BEGIN, .proc/on_start_orbit)
+ RegisterSignal(parent, COMSIG_ATOM_ORBIT_END, .proc/on_end_orbit)
+
+/datum/component/twitch_plays/Destroy(force, silent)
+ for(var/i in players)
+ DetachPlayer(i)
+ return ..()
+
+/datum/component/twitch_plays/proc/on_start_orbit(datum/source, atom/movable/orbiter)
+ if(!isobserver(orbiter))
+ return
+ AttachPlayer(orbiter)
+
+/datum/component/twitch_plays/proc/on_end_orbit(datum/source, atom/movable/orbiter)
+ if(!(orbiter in players))
+ return
+ DetachPlayer(orbiter)
+
+/datum/component/twitch_plays/proc/AttachPlayer(mob/dead/observer)
+ players |= observer
+ RegisterSignal(observer, COMSIG_PARENT_QDELETING, .proc/on_end_orbit)
+
+/datum/component/twitch_plays/proc/DetachPlayer(mob/dead/observer)
+ players -= observer
+ UnregisterSignal(observer, COMSIG_PARENT_QDELETING)
+
+/// Simple movement one
+/datum/component/twitch_plays/simple_movement
+ /// Movement votes by observer
+ var/list/votes = list()
+ /// Allow diagonals
+ var/allow_diagonal = FALSE
+
+/datum/component/twitch_plays/simple_movement/Initialize(...)
+ . = ..()
+ if(. & COMPONENT_INCOMPATIBLE)
+ return
+ RegisterSignal(parent, COMSIG_TWITCH_PLAYS_MOVEMENT_DATA, .proc/fetch_data)
+
+/datum/component/twitch_plays/simple_movement/AttachPlayer(mob/dead/observer)
+ . = ..()
+ RegisterSignal(observer, COMSIG_MOVABLE_PRE_MOVE, .proc/pre_move)
+
+/datum/component/twitch_plays/simple_movement/DetachPlayer(mob/dead/observer)
+ . = ..()
+ UnregisterSignal(observer, COMSIG_MOVABLE_PRE_MOVE)
+
+/datum/component/twitch_plays/simple_movement/proc/pre_move(datum/source, turf/newLoc)
+ if(get_dist(newLoc, parent) > 1) // they're trying to escape orbit
+ return
+ . = COMPONENT_MOVABLE_BLOCK_PRE_MOVE
+ var/dir = get_dir(parent, newLoc)
+ if(!dir)
+ return
+ if(allow_diagonal || !((dir - 1) & dir))
+ votes[source] = dir
+ else // pick one or the other
+ votes[source] = prob(50)? (dir & ~(dir - 1)) : (dir & (dir - 1))
+
+/datum/component/twitch_plays/simple_movement/proc/fetch_data(datum/source, wipe_votes)
+ if(!votes.len)
+ return
+ var/list/total = list(TEXT_NORTH, TEXT_SOUTH, TEXT_EAST, TEXT_WEST)
+ for(var/i in votes)
+ total[num2text(votes[i])] += 1
+ . = text2num(pickweight(total, 0))
+ if(wipe_votes)
+ votes.len = 0
+
+/datum/component/twitch_plays/simple_movement/auto
+ var/move_delay = 2
+ var/last_move = 0
+
+/datum/component/twitch_plays/simple_movement/auto/Initialize(...)
+ if(!ismovable(parent))
+ return COMPONENT_INCOMPATIBLE
+ . = ..()
+ if(. & COMPONENT_INCOMPATIBLE)
+ return
+ START_PROCESSING(SSfastprocess, src)
+
+/datum/component/twitch_plays/simple_movement/auto/Destroy(force, silent)
+ STOP_PROCESSING(SSfastprocess, src)
+ return ..()
+
+/datum/component/twitch_plays/simple_movement/auto/process()
+ var/dir = fetch_data(null, TRUE)
+ if(!dir)
+ return
+ if(world.time < (last_move + move_delay))
+ return
+ last_move = world.time
+ step(parent, dir)
diff --git a/code/game/objects/items/credit_holochip.dm b/code/game/objects/items/credit_holochip.dm
index 21cfd1fbad..b7f7f5f2d1 100644
--- a/code/game/objects/items/credit_holochip.dm
+++ b/code/game/objects/items/credit_holochip.dm
@@ -80,6 +80,17 @@
to_chat(user, "You insert the credits into [src].")
update_icon()
qdel(H)
+ if(istype(I, /obj/item/card/id))
+ var/obj/item/card/id/ID = I
+ if(!ID.registered_account)
+ to_chat(user, "[ID] doesn't have a linked account to deposit into!")
+ return
+ for(var/obj/item/holochip/money in src.loc.contents)
+ ID.attackby(money, user)
+ for(var/obj/item/stack/spacecash/money in src.loc.contents)
+ ID.attackby(money, user)
+ for(var/obj/item/coin/money in src.loc.contents)
+ ID.attackby(money, user)
/obj/item/holochip/AltClick(mob/user)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm
index 954950f5e6..e2036835ce 100644
--- a/code/game/objects/items/stacks/cash.dm
+++ b/code/game/objects/items/stacks/cash.dm
@@ -33,6 +33,20 @@
. = ..()
update_desc()
+/obj/item/stack/spacecash/attackby(obj/item/W, mob/user, params)
+ . = ..()
+ if(istype(W, /obj/item/card/id))
+ var/obj/item/card/id/ID = W
+ if(!ID.registered_account)
+ to_chat(user, "[ID] doesn't have a linked account to deposit into!")
+ return
+ for(var/obj/item/holochip/money in src.loc.contents)
+ ID.attackby(money, user)
+ for(var/obj/item/stack/spacecash/money in src.loc.contents)
+ ID.attackby(money, user)
+ for(var/obj/item/coin/money in src.loc.contents)
+ ID.attackby(money, user)
+
/obj/item/stack/spacecash/c1
icon_state = "spacecash"
singular_name = "one credit bill"
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index 8bc9cc4512..26a3ca1b70 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -397,6 +397,17 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
else
to_chat(user, "You need one length of cable to attach a string to the coin!")
return
+ else if(istype(W, /obj/item/card/id))
+ var/obj/item/card/id/ID = W
+ if(!ID.registered_account)
+ to_chat(user, "[ID] doesn't have a linked account to deposit into!")
+ return
+ for(var/obj/item/holochip/money in src.loc.contents)
+ ID.attackby(money, user)
+ for(var/obj/item/stack/spacecash/money in src.loc.contents)
+ ID.attackby(money, user)
+ for(var/obj/item/coin/money in src.loc.contents)
+ ID.attackby(money, user)
else
..()
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index e824edb419..6f43eb9efd 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -385,6 +385,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/Move(NewLoc, direct)
+ if (SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_MOVE, NewLoc) & COMPONENT_MOVABLE_BLOCK_PRE_MOVE)
+ return
if(updatedir)
setDir(direct)//only update dir if we actually need it, so overlays won't spin on base sprites that don't have directions of their own
var/oldloc = loc
diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index 20fbe186c6..4a77166eea 100644
--- a/code/modules/mob/say_vr.dm
+++ b/code/modules/mob/say_vr.dm
@@ -148,8 +148,8 @@ proc/get_top_level_mob(var/mob/S)
var/safety = 25
for(var/obj/structure/table/T in range(user, 1))
processing |= T
- for(var/i in processing)
- var/obj/structure/table/T = i
+ for(var/i = 1; i <= processing.len; ++i)
+ var/obj/structure/table/T = processing[i]
if(safety-- <= 0)
to_chat(user, "Table scan aborted early, some people might have not received the message (max 25)")
break
diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm
index 7a7886e999..655ca21b93 100644
--- a/code/modules/vehicles/cars/clowncar.dm
+++ b/code/modules/vehicles/cars/clowncar.dm
@@ -18,14 +18,12 @@
. = ..()
initialize_controller_action_type(/datum/action/vehicle/sealed/horn/clowncar, VEHICLE_CONTROL_DRIVE)
-
/obj/vehicle/sealed/car/clowncar/driver_move(mob/user, direction) //Prevent it from moving onto space
if(isspaceturf(get_step(src, direction)))
return FALSE
else
return ..()
-
/obj/vehicle/sealed/car/clowncar/auto_assign_occupant_flags(mob/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -138,3 +136,24 @@
/obj/vehicle/sealed/car/clowncar/proc/StopDroppingOil()
droppingoil = FALSE
+
+/obj/vehicle/sealed/car/clowncar/twitch_plays
+ key_type = null
+
+/obj/vehicle/sealed/car/clowncar/twitch_plays/Initialize()
+ . = ..()
+ AddComponent(/datum/component/twitch_plays/simple_movement)
+ START_PROCESSING(SSfastprocess, src)
+ GLOB.poi_list |= src
+ notify_ghosts("Twitch Plays: Clown Car")
+
+/obj/vehicle/sealed/car/clowncar/twitch_plays/Destroy()
+ STOP_PROCESSING(SSfastprocess, src)
+ GLOB.poi_list -= src
+ return ..()
+
+/obj/vehicle/sealed/car/clowncar/twitch_plays/process()
+ var/dir = SEND_SIGNAL(src, COMSIG_TWITCH_PLAYS_MOVEMENT_DATA, TRUE)
+ if(!dir)
+ return
+ driver_move(null, dir)
diff --git a/html/changelogs/AutoChangeLog-pr-13909.yml b/html/changelogs/AutoChangeLog-pr-13909.yml
new file mode 100644
index 0000000000..e4f0f1e401
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13909.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - rscadd: "Twitch Plays: Clown Car"
diff --git a/html/changelogs/AutoChangeLog-pr-13924.yml b/html/changelogs/AutoChangeLog-pr-13924.yml
new file mode 100644
index 0000000000..71092c567d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13924.yml
@@ -0,0 +1,4 @@
+author: "SandPoot"
+delete-after: True
+changes:
+ - tweak: "You can attack a pile of money on the floor with your id to put it all in quickly."
diff --git a/html/changelogs/AutoChangeLog-pr-13930.yml b/html/changelogs/AutoChangeLog-pr-13930.yml
new file mode 100644
index 0000000000..282f3fa30a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13930.yml
@@ -0,0 +1,4 @@
+author: "MrJWhit"
+delete-after: True
+changes:
+ - tweak: "Small fixes on security on boxstation"
diff --git a/tgstation.dme b/tgstation.dme
index 098e154e70..d97e087443 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -496,6 +496,7 @@
#include "code\datums\components\swarming.dm"
#include "code\datums\components\tackle.dm"
#include "code\datums\components\thermite.dm"
+#include "code\datums\components\twitch_plays.dm"
#include "code\datums\components\twohanded.dm"
#include "code\datums\components\uplink.dm"
#include "code\datums\components\virtual_reality.dm"