Files
Polaris/code/game/area/ai_monitored.dm

87 lines
2.7 KiB
Plaintext

/area/ai_monitored
name = "AI Monitored Area"
var/obj/machinery/camera/motion/motioncamera = null
/area/ai_monitored/New()
..()
// locate and store the motioncamera
spawn (20) // spawn on a delay to let turfs/objs load
for (var/obj/machinery/camera/motion/M in src)
motioncamera = M
return
return
/area/ai_monitored/Entered(atom/movable/O)
..()
if (istype(O, /mob) && motioncamera)
motioncamera.newTarget(O)
/area/ai_monitored/Exited(atom/movable/O)
if (istype(O, /mob) && motioncamera)
motioncamera.lostTarget(O)
/obj/machinery/camera/motion
name = "Motion Security Camera"
var/list/motionTargets = list()
var/detectTime = 0
var/locked = 1
/obj/machinery/camera/motion/process()
// motion camera event loop
if (detectTime > 0)
var/elapsed = world.time - detectTime
if (elapsed > 300)
triggerAlarm()
else if (detectTime == -1)
for (var/mob/target in motionTargets)
if (target.stat == 2) lostTarget(target)
/obj/machinery/camera/motion/proc/newTarget(var/mob/target)
if (istype(target, /mob/living/silicon/ai)) return 0
if (detectTime == 0)
detectTime = world.time // start the clock
if (!(target in motionTargets))
motionTargets += target
return 1
/obj/machinery/camera/motion/proc/lostTarget(var/mob/target)
if (target in motionTargets)
motionTargets -= target
if (motionTargets.len == 0)
cancelAlarm()
/obj/machinery/camera/motion/proc/cancelAlarm()
if (detectTime == -1)
for (var/mob/living/silicon/aiPlayer in world)
if (status) aiPlayer.cancelAlarm("Motion", src.loc.loc)
detectTime = 0
return 1
/obj/machinery/camera/motion/proc/triggerAlarm()
if (!detectTime) return 0
for (var/mob/living/silicon/aiPlayer in world)
if (status) aiPlayer.triggerAlarm("Motion", src.loc.loc, src)
detectTime = -1
return 1
/obj/machinery/camera/motion/attackby(W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/wirecutters) && locked == 1) return
if (istype(W, /obj/item/weapon/screwdriver))
var/turf/T = user.loc
user << text("\blue []ing the access hatch... (this is a long process)", (locked) ? "Open" : "Clos")
sleep(100)
if ((user.loc == T && user.equipped() == W && !( user.stat )))
src.locked ^= 1
user << text("\blue The access hatch is now [].", (locked) ? "closed" : "open")
..() // call the parent to (de|re)activate
if (istype(W, /obj/item/weapon/wirecutters)) // now handle alarm on/off...
if (status) // ok we've just been reconnected... send an alarm!
detectTime = world.time - 301
triggerAlarm()
else
for (var/mob/living/silicon/aiPlayer in world) // manually cancel, to not disturb internal state
aiPlayer.cancelAlarm("Motion", src.loc.loc)