diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 6bcaeab29ed..59055650072 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -15884,11 +15884,8 @@ /turf/open/floor/plasteel, /area/tdome/tdomeadmin) "Jq" = ( -/obj/machinery/camera{ - c_tag = "Arena"; - network = list("thunder"); - pixel_x = 10; - resistance_flags = 64 +/obj/machinery/camera/motion/thunderdome{ + pixel_x = 10 }, /turf/open/floor/circuit/green, /area/tdome/arena) diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index 6c134417bb3..6fdfa6421e6 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -75,3 +75,38 @@ if (!area_motion) if(isliving(AM)) newTarget(AM) + +/obj/machinery/camera/motion/thunderdome + name = "entertainment camera" + network = list("thunder") + c_tag = "Arena" + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF | FREEZE_PROOF + +/obj/machinery/camera/motion/thunderdome/Initialize() + . = ..() + proximity_monitor.SetRange(7) + +/obj/machinery/camera/motion/thunderdome/HasProximity(atom/movable/AM as mob|obj) + if (!isliving(AM) || get_area(AM) != get_area(src)) + return + localMotionTargets |= WEAKREF(AM) + if (!detectTime) + for(var/obj/machinery/computer/security/telescreen/entertainment/TV in GLOB.machines) + TV.notify(TRUE) + detectTime = world.time + 30 SECONDS + +/obj/machinery/camera/motion/thunderdome/process() + if (!detectTime) + return + + for (var/datum/weakref/targetref in localMotionTargets) + var/mob/target = targetref.resolve() + if(QDELETED(target) || target.stat == DEAD || get_dist(src, target) > 7 || get_area(src) != get_area(target)) + localMotionTargets -= targetref + + if (localMotionTargets.len) + detectTime = world.time + 30 SECONDS + else if (world.time > detectTime) + detectTime = 0 + for(var/obj/machinery/computer/security/telescreen/entertainment/TV in GLOB.machines) + TV.notify(FALSE) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 20c69f3edd2..013a9501c0b 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -4,11 +4,12 @@ icon_screen = "cameras" icon_keyboard = "security_key" circuit = /obj/item/circuitboard/computer/security + light_color = LIGHT_COLOR_RED + var/last_pic = 1 var/list/network = list("ss13") var/list/watchers = list() //who's using the console, associated with the camera they're on. - - light_color = LIGHT_COLOR_RED + var/long_ranged = FALSE /obj/machinery/computer/security/Initialize() . = ..() @@ -30,14 +31,14 @@ if(!C.can_use()) user.unset_machine() return - if(!issilicon(user)) - if(!Adjacent(user)) - user.unset_machine() - return - else if(iscyborg(user)) + if(iscyborg(user) || long_ranged) var/list/viewing = viewers(src) if(!viewing.Find(user)) user.unset_machine() + return + if(!issilicon(user) && !Adjacent(user)) + user.unset_machine() + return /obj/machinery/computer/security/on_unset_machine(mob/user) watchers.Remove(user) @@ -49,10 +50,7 @@ M.unset_machine() //to properly reset the view of the users if the console is deleted. return ..() -/obj/machinery/computer/security/attack_hand(mob/user) - . = ..() - if(.) - return +/obj/machinery/computer/security/interact(mob/user) if(stat) return if (!network) @@ -101,13 +99,12 @@ var/camera_fail = 0 if(!C.can_use() || user.machine != src || user.eye_blind || user.incapacitated()) camera_fail = 1 - else if(iscyborg(user)) + else if(iscyborg(user) || long_ranged) var/list/viewing = viewers(src) if(!viewing.Find(user)) camera_fail = 1 - else if(!issilicon(user)) - if(!Adjacent(user)) - camera_fail = 1 + else if(!issilicon(user) && !Adjacent(user)) + camera_fail = 1 if(camera_fail) user.unset_machine() @@ -219,8 +216,33 @@ name = "entertainment monitor" desc = "Damn, they better have the /tg/ channel on these things." icon = 'icons/obj/status_display.dmi' - icon_state = "entertainment" + icon_state = "entertainment_blank" network = list("thunder") + density = FALSE + circuit = null + long_ranged = TRUE + interaction_flags_atom = NONE // interact() is called by BigClick() + var/icon_state_off = "entertainment_blank" + var/icon_state_on = "entertainment" + +/obj/machinery/computer/security/telescreen/entertainment/Initialize() + . = ..() + AddComponent(/datum/component/redirect, list(COMSIG_CLICK = CALLBACK(src, .proc/BigClick))) + +// Bypass clickchain to allow humans to use the telescreen from a distance +/obj/machinery/computer/security/telescreen/entertainment/proc/BigClick() + interact(usr) + +/obj/machinery/computer/security/telescreen/entertainment/proc/notify(on) + if(on && icon_state == icon_state_off) + say(pick( + "Feats of bravery live now at the thunderdome!", + "Two enter, one leaves! Tune in now!", + "Violence like you've never seen it before!", + "Spears! Camera! Action! LIVE NOW!")) + icon_state = icon_state_on + else + icon_state = icon_state_off /obj/machinery/computer/security/telescreen/rd name = "\improper Research Director's telescreen" diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index e038fec348e..7229c35945e 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -131,7 +131,7 @@ for(var/mob/living/mob in thunderdome) qdel(mob) //Clear mobs for(var/obj/obj in thunderdome) - if(!istype(obj, /obj/machinery/camera)) + if(!istype(obj, /obj/machinery/camera) && !istype(obj, /obj/effect/abstract/proximity_checker)) qdel(obj) //Clear objects var/area/template = GLOB.areas_by_type[/area/tdome/arena_source] diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index e95107cb1e5..0480eb12cdc 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -477,7 +477,7 @@ Since Ramadan is an entire month that lasts 29.5 days on average, the start and /datum/holiday/xmas/proc/roundstart_celebrate() for(var/obj/machinery/computer/security/telescreen/entertainment/Monitor in GLOB.machines) - Monitor.icon_state = "entertainment_xmas" + Monitor.icon_state_on = "entertainment_xmas" for(var/mob/living/simple_animal/pet/dog/corgi/Ian/Ian in GLOB.mob_living_list) Ian.place_on_head(new /obj/item/clothing/head/helmet/space/santahat(Ian)) diff --git a/icons/obj/status_display.dmi b/icons/obj/status_display.dmi index 68082395d07..7bfcfd09da0 100644 Binary files a/icons/obj/status_display.dmi and b/icons/obj/status_display.dmi differ