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"