diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index bb372563cf..7693ea16a2 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" = (
@@ -5666,6 +5667,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"akw" = (
@@ -5845,10 +5849,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";
@@ -6108,7 +6115,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,
@@ -6142,25 +6149,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)
@@ -6180,16 +6173,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" = (
@@ -6272,6 +6260,9 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"alB" = (
@@ -6572,9 +6563,6 @@
/turf/open/floor/engine,
/area/science/xenobiology)
"amm" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
/obj/structure/cable{
icon_state = "0-4"
},
@@ -6609,6 +6597,9 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"amq" = (
@@ -6661,9 +6652,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)
@@ -6763,6 +6751,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" = (
@@ -6853,25 +6847,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{
@@ -7271,9 +7255,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" = (
@@ -7281,9 +7267,6 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
/turf/open/floor/plasteel,
/area/security/brig)
"anR" = (
@@ -7514,14 +7497,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)
@@ -7755,13 +7737,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" = (
@@ -7780,6 +7762,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" = (
@@ -7933,6 +7918,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" = (
@@ -8052,6 +8043,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" = (
@@ -8133,9 +8130,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
},
@@ -8158,14 +8152,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)
@@ -8181,20 +8180,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
@@ -8406,13 +8391,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" = (
@@ -8858,6 +8841,9 @@
c_tag = "Brig Control";
dir = 1
},
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
"arz" = (
@@ -52616,9 +52602,6 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
/turf/open/floor/plasteel,
/area/security/brig)
"cLS" = (
@@ -53521,9 +53504,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{
@@ -53583,9 +53574,6 @@
/turf/open/space,
/area/space/nearstation)
"dCV" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
/obj/effect/turf_decal/tile/red{
dir = 1
},
@@ -54994,11 +54982,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" = (
@@ -56342,15 +56330,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" = (
@@ -56869,9 +56857,6 @@
/turf/open/floor/plasteel,
/area/security/brig)
"laq" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
/obj/structure/cable{
icon_state = "2-4"
},
@@ -57160,7 +57145,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"
},
@@ -58195,9 +58180,6 @@
/area/hallway/primary/central)
"ovv" = (
/obj/structure/table,
-/obj/structure/cable{
- icon_state = "0-2"
- },
/obj/effect/turf_decal/tile/red{
dir = 1
},
@@ -58540,9 +58522,6 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
-/obj/structure/cable{
- icon_state = "2-4"
- },
/obj/effect/turf_decal/tile/red{
dir = 1
},
@@ -58671,9 +58650,6 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
-/obj/structure/cable{
- icon_state = "2-8"
- },
/obj/effect/turf_decal/tile/red{
dir = 1
},
@@ -58681,7 +58657,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)
@@ -58809,9 +58788,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
@@ -59498,9 +59474,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
},
@@ -59544,20 +59517,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,
@@ -59764,9 +59723,6 @@
},
/area/crew_quarters/fitness)
"seP" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
/obj/structure/cable{
icon_state = "0-8"
},
@@ -61092,6 +61048,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" = (
@@ -61332,13 +61291,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" = (
@@ -88087,7 +88046,7 @@ aaa
aaa
aag
aaa
-aak
+aam
aap
saX
aaD
@@ -88344,7 +88303,7 @@ aaa
aaa
aag
aaf
-aaj
+aai
aao
aax
aaC
@@ -88370,7 +88329,7 @@ alz
cZe
alg
plS
-dyE
+afM
pQr
aou
aqC
@@ -88601,7 +88560,7 @@ aaa
aaa
aag
aaa
-aal
+aam
aar
uGI
aaF
@@ -88858,7 +88817,7 @@ aaa
aaa
aag
aaf
-aaj
+aai
aaq
dyS
aaE
@@ -88883,10 +88842,10 @@ agj
agM
sAk
akp
-akQ
+agj
amB
amn
-amS
+aiX
anz
anz
aov
@@ -89115,8 +89074,8 @@ aaa
aaa
aag
aaa
-aal
-aat
+aam
+aaj
aat
aat
aat
@@ -89143,7 +89102,7 @@ akM
amm
gyr
anM
-rJv
+xal
aqC
anz
aox
@@ -89372,7 +89331,7 @@ aaa
aaa
aag
aaf
-aaj
+aai
aas
aat
aat
@@ -89395,12 +89354,12 @@ akU
afM
lBz
alA
-ene
-alg
+alt
+amS
kbm
-dyE
+afM
cKC
-seP
+dyE
aqC
anR
aow
@@ -89630,7 +89589,7 @@ aaa
aag
aaa
aam
-aav
+akQ
aav
aav
aav
@@ -89657,7 +89616,7 @@ akT
gNE
gLz
anB
-amR
+seP
aqC
anz
aov
@@ -89911,10 +89870,10 @@ fxx
ako
ene
amj
-akQ
+agj
amB
amn
-amS
+aiX
anz
anz
aov
@@ -90171,7 +90130,7 @@ amk
amm
gyr
mos
-rJv
+xal
aqC
anz
aov
@@ -90424,11 +90383,11 @@ akF
aiy
akv
uXt
-alg
+amS
pAK
-dyE
+afM
anQ
-seP
+dyE
aqC
anz
aov
@@ -90685,7 +90644,7 @@ akT
amx
any
arD
-amR
+seP
aqC
anz
aov
@@ -90939,10 +90898,10 @@ ajc
akz
ene
als
-akQ
-amB
+agj
+apT
amn
-amS
+aiX
aqD
anz
aov
@@ -91196,7 +91155,7 @@ ajc
akz
ene
alg
-alt
+alw
amp
aot
apR
@@ -91455,7 +91414,7 @@ itD
alg
vyK
amI
-alg
+amS
alv
aqE
anS
@@ -91970,7 +91929,7 @@ agn
agn
amN
aoZ
-apT
+agn
anw
anz
cXU
@@ -92227,7 +92186,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/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index c6484b051c..056902801f 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -18,7 +18,7 @@
var/mode = HEATER_MODE_STANDBY
var/setMode = "auto" // Anything other than "heat" or "cool" is considered auto.
var/targetTemperature = T20C
- var/heatingPower = 40000
+ var/heatingPower = 10000
var/efficiency = 20000
var/temperatureTolerance = 1
var/settableTemperatureMedian = 30 + T0C
@@ -74,46 +74,55 @@
if(cell && cell.charge > 0)
var/turf/L = loc
- if(!istype(L))
- if(mode != HEATER_MODE_STANDBY)
- mode = HEATER_MODE_STANDBY
- update_icon()
- return
+ PerformHeating(L)
- var/datum/gas_mixture/env = L.return_air()
+ for(var/direction in GLOB.alldirs)
+ L=get_step(src,direction)
+ if(!locate(/turf/closed) in L) // we don't want to heat walls and cause jank
+ PerformHeating(L)
- var/newMode = HEATER_MODE_STANDBY
- if(setMode != HEATER_MODE_COOL && env.return_temperature() < targetTemperature - temperatureTolerance)
- newMode = HEATER_MODE_HEAT
- else if(setMode != HEATER_MODE_HEAT && env.return_temperature() > targetTemperature + temperatureTolerance)
- newMode = HEATER_MODE_COOL
-
- if(mode != newMode)
- mode = newMode
- update_icon()
-
- if(mode == HEATER_MODE_STANDBY)
- return
-
- var/heat_capacity = env.heat_capacity()
- var/requiredPower = abs(env.return_temperature() - targetTemperature) * heat_capacity
- requiredPower = min(requiredPower, heatingPower)
-
- if(requiredPower < 1)
- return
-
- var/deltaTemperature = requiredPower / heat_capacity
- if(mode == HEATER_MODE_COOL)
- deltaTemperature *= -1
- if(deltaTemperature)
- env.set_temperature(env.return_temperature() + deltaTemperature)
- air_update_turf()
- cell.use(requiredPower / efficiency)
else
on = FALSE
update_icon()
return PROCESS_KILL
+/obj/machinery/space_heater/proc/PerformHeating(turf/L)
+ if(!istype(L))
+ if(mode != HEATER_MODE_STANDBY)
+ mode = HEATER_MODE_STANDBY
+ update_icon()
+ return
+
+ var/datum/gas_mixture/env = L.return_air()
+
+ var/newMode = HEATER_MODE_STANDBY
+ if(setMode != HEATER_MODE_COOL && env.return_temperature() < targetTemperature - temperatureTolerance)
+ newMode = HEATER_MODE_HEAT
+ else if(setMode != HEATER_MODE_HEAT && env.return_temperature() > targetTemperature + temperatureTolerance)
+ newMode = HEATER_MODE_COOL
+
+ if(mode != newMode)
+ mode = newMode
+ update_icon()
+
+ if(mode == HEATER_MODE_STANDBY)
+ return
+
+ var/heat_capacity = env.heat_capacity()
+ var/requiredPower = abs(env.return_temperature() - targetTemperature) * heat_capacity
+ requiredPower = min(requiredPower, heatingPower)
+
+ if(requiredPower < 1)
+ return
+
+ var/deltaTemperature = requiredPower / heat_capacity
+ if(mode == HEATER_MODE_COOL)
+ deltaTemperature *= -1
+ if(deltaTemperature)
+ env.set_temperature(env.return_temperature() + deltaTemperature)
+ air_update_turf()
+ cell.use(requiredPower / efficiency)
+
/obj/machinery/space_heater/RefreshParts()
var/laser = 2
var/cap = 1
@@ -122,7 +131,7 @@
for(var/obj/item/stock_parts/capacitor/M in component_parts)
cap += M.rating
- heatingPower = laser * 40000
+ heatingPower = laser * 10000
settableTemperatureRange = cap * 30
efficiency = (cap + 1) * 10000
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 9493d11792..dc53f9487f 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -380,6 +380,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/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index ae045dbd26..012515d0e9 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -9,6 +9,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
real_name = "Guardian Spirit"
desc = "A mysterious being that stands by its charge, ever vigilant."
speak_emote = list("hisses")
+ rad_flags = RAD_NO_CONTAMINATE | RAD_PROTECT_CONTENTS
gender = NEUTER
mob_biotypes = NONE
bubble_icon = "guardian"
diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index 658d7e5874..c5c53dc876 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-13867.yml b/html/changelogs/AutoChangeLog-pr-13867.yml
new file mode 100644
index 0000000000..dd1e44e64c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13867.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - balance: "Zeolites now only generate 1/5 the heat when reacting and don't require a catalyst."
diff --git a/html/changelogs/AutoChangeLog-pr-13885.yml b/html/changelogs/AutoChangeLog-pr-13885.yml
new file mode 100644
index 0000000000..88c23d30f1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13885.yml
@@ -0,0 +1,4 @@
+author: "raspy-on-osu"
+delete-after: True
+changes:
+ - tweak: "space heater heating range and power"
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/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index bbecd2f6f4..21f525088c 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -593,7 +593,6 @@
id = /datum/reagent/fermi/zeolites
results = list(/datum/reagent/fermi/zeolites = 5) //We make a lot! - But it's now somewhat dangerous, and needs a bit of gold to catalyze the reaction
required_reagents = list(/datum/reagent/medicine/potass_iodide = 1, /datum/reagent/aluminium = 1, /datum/reagent/silicon = 1, /datum/reagent/oxygen = 1)
- required_catalysts = list(/datum/reagent/gold = 5)
//FermiChem vars:
OptimalTempMin = 500
OptimalTempMax = 750
@@ -604,7 +603,7 @@
//CatalystFact = 0
CurveSharpT = 1.5
CurveSharppH = 3
- ThermicConstant = 5
+ ThermicConstant = 1
HIonRelease = -0.15
RateUpLim = 4
PurityMin = 0.5 //Good luck!
diff --git a/tgstation.dme b/tgstation.dme
index 07eefc79ef..2b00eb6b98 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -492,6 +492,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"