mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-01-01 21:13:47 +00:00
If you look at your PDA window, there should be an option to stick an ID in, like with some computers.
While carrying an ID, a PDA can be used for almost everything an ID can.
While ID scanners can read cards through a PDA, it is difficult to shove a PDA into the ID slot on some computers.
It is possible I missed some functions, but I was quite thorough in my sweep through the code.
In the event of PDA destruction, any inserted ID is ejected unharmed.
It is now possible to stick PDAs in your jumpsuit's ID slot.
Since PDAs are named, you can disguise yourself as someone else using one.
Beepsky/ED-209 can see through a PDA disguise if you stick your real ID in for access.
git-svn-id: http://tgstation13.googlecode.com/svn/trunk@592 316c924e-a436-60f5-8080-3fe189b3f50e
462 lines
17 KiB
Plaintext
462 lines
17 KiB
Plaintext
// The communications computer
|
|
|
|
/obj/machinery/computer/communications/process()
|
|
..()
|
|
if(state != STATE_STATUSDISPLAY)
|
|
src.updateDialog()
|
|
|
|
/obj/machinery/computer/communications/Topic(href, href_list)
|
|
if(..())
|
|
return
|
|
usr.machine = src
|
|
|
|
if(!href_list["operation"])
|
|
return
|
|
switch(href_list["operation"])
|
|
// main interface
|
|
if("main")
|
|
src.state = STATE_DEFAULT
|
|
if("login")
|
|
var/mob/M = usr
|
|
var/obj/item/weapon/card/id/I = M.equipped()
|
|
if (istype(I, /obj/item/device/pda))
|
|
var/obj/item/device/pda/pda = I
|
|
I = pda.id
|
|
if (I && istype(I))
|
|
if(src.check_access(I))
|
|
authenticated = 1
|
|
if(20 in I.access)
|
|
authenticated = 2
|
|
if("logout")
|
|
authenticated = 0
|
|
if("nolockdown")
|
|
disablelockdown(usr)
|
|
post_status("alert", "default")
|
|
if("announce")
|
|
if(src.authenticated==2)
|
|
var/input = input(usr, "Please choose a message to announce to the station crew.", "What?", "")
|
|
if(!input)
|
|
return
|
|
captain_announce(input)
|
|
log_admin("[key_name(usr)] has made a captain announcement: [input]")
|
|
message_admins("[key_name_admin(usr)] has made a captain announcement.", 1)
|
|
if("call-prison")
|
|
call_prison_shuttle(usr)
|
|
if("callshuttle")
|
|
src.state = STATE_DEFAULT
|
|
if(src.authenticated)
|
|
src.state = STATE_CALLSHUTTLE
|
|
if("callshuttle2")
|
|
if(src.authenticated)
|
|
call_shuttle_proc(usr)
|
|
|
|
if(emergency_shuttle.online)
|
|
post_status("shuttle")
|
|
|
|
src.state = STATE_DEFAULT
|
|
if("cancelshuttle")
|
|
src.state = STATE_DEFAULT
|
|
if(src.authenticated)
|
|
src.state = STATE_CANCELSHUTTLE
|
|
if("cancelshuttle2")
|
|
if(src.authenticated)
|
|
cancel_call_proc(usr)
|
|
src.state = STATE_DEFAULT
|
|
if("messagelist")
|
|
src.currmsg = 0
|
|
src.state = STATE_MESSAGELIST
|
|
if("viewmessage")
|
|
src.state = STATE_VIEWMESSAGE
|
|
if (!src.currmsg)
|
|
if(href_list["message-num"])
|
|
src.currmsg = text2num(href_list["message-num"])
|
|
else
|
|
src.state = STATE_MESSAGELIST
|
|
if("delmessage")
|
|
src.state = (src.currmsg) ? STATE_DELMESSAGE : STATE_MESSAGELIST
|
|
if("delmessage2")
|
|
if(src.authenticated)
|
|
if(src.currmsg)
|
|
var/title = src.messagetitle[src.currmsg]
|
|
var/text = src.messagetext[src.currmsg]
|
|
src.messagetitle.Remove(title)
|
|
src.messagetext.Remove(text)
|
|
if(src.currmsg == src.aicurrmsg)
|
|
src.aicurrmsg = 0
|
|
src.currmsg = 0
|
|
src.state = STATE_MESSAGELIST
|
|
else
|
|
src.state = STATE_VIEWMESSAGE
|
|
if("status")
|
|
src.state = STATE_STATUSDISPLAY
|
|
|
|
// Status display stuff
|
|
if("setstat")
|
|
switch(href_list["statdisp"])
|
|
if("message")
|
|
post_status("message", stat_msg1, stat_msg2)
|
|
if("alert")
|
|
post_status("alert", href_list["alert"])
|
|
else
|
|
post_status(href_list["statdisp"])
|
|
|
|
if("setmsg1")
|
|
stat_msg1 = input("Line 1", "Enter Message Text", stat_msg1) as text|null
|
|
src.updateDialog()
|
|
if("setmsg2")
|
|
stat_msg2 = input("Line 2", "Enter Message Text", stat_msg2) as text|null
|
|
src.updateDialog()
|
|
|
|
// AI interface
|
|
if("ai-main")
|
|
src.aicurrmsg = 0
|
|
src.aistate = STATE_DEFAULT
|
|
if("ai-callshuttle")
|
|
src.aistate = STATE_CALLSHUTTLE
|
|
if("ai-callshuttle2")
|
|
call_shuttle_proc(usr)
|
|
src.aistate = STATE_DEFAULT
|
|
if("ai-messagelist")
|
|
src.aicurrmsg = 0
|
|
src.aistate = STATE_MESSAGELIST
|
|
if("ai-viewmessage")
|
|
src.aistate = STATE_VIEWMESSAGE
|
|
if (!src.aicurrmsg)
|
|
if(href_list["message-num"])
|
|
src.aicurrmsg = text2num(href_list["message-num"])
|
|
else
|
|
src.aistate = STATE_MESSAGELIST
|
|
if("ai-delmessage")
|
|
src.aistate = (src.aicurrmsg) ? STATE_DELMESSAGE : STATE_MESSAGELIST
|
|
if("ai-delmessage2")
|
|
if(src.aicurrmsg)
|
|
var/title = src.messagetitle[src.aicurrmsg]
|
|
var/text = src.messagetext[src.aicurrmsg]
|
|
src.messagetitle.Remove(title)
|
|
src.messagetext.Remove(text)
|
|
if(src.currmsg == src.aicurrmsg)
|
|
src.currmsg = 0
|
|
src.aicurrmsg = 0
|
|
src.aistate = STATE_MESSAGELIST
|
|
if("ai-status")
|
|
src.aistate = STATE_STATUSDISPLAY
|
|
src.updateUsrDialog()
|
|
|
|
/proc/disablelockdown(var/mob/usr)
|
|
world << "\red Lockdown cancelled by [usr.name]!"
|
|
|
|
for(var/obj/machinery/firealarm/FA in world) //deactivate firealarms
|
|
spawn( 0 )
|
|
if(FA.lockdownbyai == 1)
|
|
FA.lockdownbyai = 0
|
|
FA.reset()
|
|
for(var/obj/machinery/door/airlock/AL in world) //open airlocks
|
|
spawn ( 0 )
|
|
if(AL.canAIControl() && AL.lockdownbyai == 1)
|
|
AL.open()
|
|
AL.lockdownbyai = 0
|
|
|
|
/obj/machinery/computer/communications/attackby(I as obj, user as mob)
|
|
if(istype(I, /obj/item/weapon/screwdriver))
|
|
playsound(src.loc, 'Screwdriver.ogg', 50, 1)
|
|
if(do_after(user, 20))
|
|
if (src.stat & BROKEN)
|
|
user << "\blue The broken glass falls out."
|
|
var/obj/computerframe/A = new /obj/computerframe( src.loc )
|
|
new /obj/item/weapon/shard( src.loc )
|
|
var/obj/item/weapon/circuitboard/communications/M = new /obj/item/weapon/circuitboard/communications( A )
|
|
for (var/obj/C in src)
|
|
C.loc = src.loc
|
|
A.circuit = M
|
|
A.state = 3
|
|
A.icon_state = "3"
|
|
A.anchored = 1
|
|
del(src)
|
|
else
|
|
user << "\blue You disconnect the monitor."
|
|
var/obj/computerframe/A = new /obj/computerframe( src.loc )
|
|
var/obj/item/weapon/circuitboard/communications/M = new /obj/item/weapon/circuitboard/communications( A )
|
|
for (var/obj/C in src)
|
|
C.loc = src.loc
|
|
A.circuit = M
|
|
A.state = 4
|
|
A.icon_state = "4"
|
|
A.anchored = 1
|
|
del(src)
|
|
else
|
|
src.attack_hand(user)
|
|
return
|
|
|
|
/obj/machinery/computer/communications/attack_ai(var/mob/user as mob)
|
|
return src.attack_hand(user)
|
|
|
|
/obj/machinery/computer/communications/attack_paw(var/mob/user as mob)
|
|
return src.attack_hand(user)
|
|
|
|
/obj/machinery/computer/communications/attack_hand(var/mob/user as mob)
|
|
if(..())
|
|
return
|
|
|
|
user.machine = src
|
|
var/dat = "<head><title>Communications Console</title></head><body>"
|
|
if (emergency_shuttle.online && emergency_shuttle.location==0)
|
|
var/timeleft = emergency_shuttle.timeleft()
|
|
dat += "<B>Emergency shuttle</B>\n<BR>\nETA: [timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)]<BR>"
|
|
|
|
if (istype(user, /mob/living/silicon))
|
|
var/dat2 = src.interact_ai(user) // give the AI a different interact proc to limit its access
|
|
if(dat2)
|
|
dat += dat2
|
|
user << browse(dat, "window=communications;size=400x500")
|
|
onclose(user, "communications")
|
|
return
|
|
|
|
switch(src.state)
|
|
if(STATE_DEFAULT)
|
|
if (src.authenticated)
|
|
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=logout'>Log Out</A> \]"
|
|
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=call-prison'>Send Prison Shutle</A> \]"
|
|
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=nolockdown'>Disable Lockdown</A> \]"
|
|
if (src.authenticated==2)
|
|
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=announce'>Make An Announcement</A> \]"
|
|
if(emergency_shuttle.location==0)
|
|
if (emergency_shuttle.online)
|
|
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=cancelshuttle'>Cancel Shuttle Call</A> \]"
|
|
else
|
|
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=callshuttle'>Call Emergency Shuttle</A> \]"
|
|
|
|
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=status'>Set Status Display</A> \]"
|
|
else
|
|
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=login'>Log In</A> \]"
|
|
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=messagelist'>Message List</A> \]"
|
|
if(STATE_CALLSHUTTLE)
|
|
dat += "Are you sure you want to call the shuttle? \[ <A HREF='?src=\ref[src];operation=callshuttle2'>OK</A> | <A HREF='?src=\ref[src];operation=main'>Cancel</A> \]"
|
|
if(STATE_CANCELSHUTTLE)
|
|
dat += "Are you sure you want to cancel the shuttle? \[ <A HREF='?src=\ref[src];operation=cancelshuttle2'>OK</A> | <A HREF='?src=\ref[src];operation=main'>Cancel</A> \]"
|
|
if(STATE_MESSAGELIST)
|
|
dat += "Messages:"
|
|
for(var/i = 1; i<=src.messagetitle.len; i++)
|
|
dat += "<BR><A HREF='?src=\ref[src];operation=viewmessage;message-num=[i]'>[src.messagetitle[i]]</A>"
|
|
if(STATE_VIEWMESSAGE)
|
|
if (src.currmsg)
|
|
dat += "<B>[src.messagetitle[src.currmsg]]</B><BR><BR>[src.messagetext[src.currmsg]]"
|
|
if (src.authenticated)
|
|
dat += "<BR><BR>\[ <A HREF='?src=\ref[src];operation=delmessage'>Delete \]"
|
|
else
|
|
src.state = STATE_MESSAGELIST
|
|
src.attack_hand(user)
|
|
return
|
|
if(STATE_DELMESSAGE)
|
|
if (src.currmsg)
|
|
dat += "Are you sure you want to delete this message? \[ <A HREF='?src=\ref[src];operation=delmessage2'>OK</A> | <A HREF='?src=\ref[src];operation=viewmessage'>Cancel</A> \]"
|
|
else
|
|
src.state = STATE_MESSAGELIST
|
|
src.attack_hand(user)
|
|
return
|
|
if(STATE_STATUSDISPLAY)
|
|
dat += "Set Status Displays<BR>"
|
|
dat += "\[ <A HREF='?src=\ref[src];operation=setstat;statdisp=blank'>Clear</A> \]<BR>"
|
|
dat += "\[ <A HREF='?src=\ref[src];operation=setstat;statdisp=shuttle'>Shuttle ETA</A> \]<BR>"
|
|
dat += "\[ <A HREF='?src=\ref[src];operation=setstat;statdisp=message'>Message</A> \]"
|
|
dat += "<ul><li> Line 1: <A HREF='?src=\ref[src];operation=setmsg1'>[ stat_msg1 ? stat_msg1 : "(none)"]</A>"
|
|
dat += "<li> Line 2: <A HREF='?src=\ref[src];operation=setmsg2'>[ stat_msg2 ? stat_msg2 : "(none)"]</A></ul><br>"
|
|
dat += "\[ Alert: <A HREF='?src=\ref[src];operation=setstat;statdisp=alert;alert=default'>None</A> |"
|
|
dat += " <A HREF='?src=\ref[src];operation=setstat;statdisp=alert;alert=redalert'>Red Alert</A> |"
|
|
dat += " <A HREF='?src=\ref[src];operation=setstat;statdisp=alert;alert=lockdown'>Lockdown</A> |"
|
|
dat += " <A HREF='?src=\ref[src];operation=setstat;statdisp=alert;alert=biohazard'>Biohazard</A> \]<BR><HR>"
|
|
|
|
|
|
dat += "<BR>\[ [(src.state != STATE_DEFAULT) ? "<A HREF='?src=\ref[src];operation=main'>Main Menu</A> | " : ""]<A HREF='?src=\ref[user];mach_close=communications'>Close</A> \]"
|
|
user << browse(dat, "window=communications;size=400x500")
|
|
onclose(user, "communications")
|
|
|
|
/obj/machinery/computer/communications/proc/interact_ai(var/mob/living/silicon/ai/user as mob)
|
|
var/dat = ""
|
|
switch(src.aistate)
|
|
if(STATE_DEFAULT)
|
|
if(emergency_shuttle.location==0 && !emergency_shuttle.online)
|
|
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=ai-callshuttle'>Call Emergency Shuttle</A> \]"
|
|
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=call-prison'>Send Prison Shutle</A> \]"
|
|
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=ai-messagelist'>Message List</A> \]"
|
|
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=nolockdown'>Disable Lockdown</A> \]"
|
|
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=ai-status'>Set Status Display</A> \]"
|
|
if(STATE_CALLSHUTTLE)
|
|
dat += "Are you sure you want to call the shuttle? \[ <A HREF='?src=\ref[src];operation=ai-callshuttle2'>OK</A> | <A HREF='?src=\ref[src];operation=ai-main'>Cancel</A> \]"
|
|
if(STATE_MESSAGELIST)
|
|
dat += "Messages:"
|
|
for(var/i = 1; i<=src.messagetitle.len; i++)
|
|
dat += "<BR><A HREF='?src=\ref[src];operation=ai-viewmessage;message-num=[i]'>[src.messagetitle[i]]</A>"
|
|
if(STATE_VIEWMESSAGE)
|
|
if (src.aicurrmsg)
|
|
dat += "<B>[src.messagetitle[src.aicurrmsg]]</B><BR><BR>[src.messagetext[src.aicurrmsg]]"
|
|
dat += "<BR><BR>\[ <A HREF='?src=\ref[src];operation=ai-delmessage'>Delete</A> \]"
|
|
else
|
|
src.aistate = STATE_MESSAGELIST
|
|
src.attack_hand(user)
|
|
return null
|
|
if(STATE_DELMESSAGE)
|
|
if(src.aicurrmsg)
|
|
dat += "Are you sure you want to delete this message? \[ <A HREF='?src=\ref[src];operation=ai-delmessage2'>OK</A> | <A HREF='?src=\ref[src];operation=ai-viewmessage'>Cancel</A> \]"
|
|
else
|
|
src.aistate = STATE_MESSAGELIST
|
|
src.attack_hand(user)
|
|
return
|
|
|
|
if(STATE_STATUSDISPLAY)
|
|
dat += "Set Status Displays<BR>"
|
|
dat += "\[ <A HREF='?src=\ref[src];operation=setstat;statdisp=blank'>Clear</A> \]<BR>"
|
|
dat += "\[ <A HREF='?src=\ref[src];operation=setstat;statdisp=shuttle'>Shuttle ETA</A> \]<BR>"
|
|
dat += "\[ <A HREF='?src=\ref[src];operation=setstat;statdisp=message'>Message</A> \]"
|
|
dat += "<ul><li> Line 1: <A HREF='?src=\ref[src];operation=setmsg1'>[ stat_msg1 ? stat_msg1 : "(none)"]</A>"
|
|
dat += "<li> Line 2: <A HREF='?src=\ref[src];operation=setmsg2'>[ stat_msg2 ? stat_msg2 : "(none)"]</A></ul><br>"
|
|
dat += "\[ Alert: <A HREF='?src=\ref[src];operation=setstat;statdisp=alert;alert=default'>None</A> |"
|
|
dat += " <A HREF='?src=\ref[src];operation=setstat;statdisp=alert;alert=redalert'>Red Alert</A> |"
|
|
dat += " <A HREF='?src=\ref[src];operation=setstat;statdisp=alert;alert=lockdown'>Lockdown</A> |"
|
|
dat += " <A HREF='?src=\ref[src];operation=setstat;statdisp=alert;alert=biohazard'>Biohazard</A> \]<BR><HR>"
|
|
|
|
|
|
dat += "<BR>\[ [(src.aistate != STATE_DEFAULT) ? "<A HREF='?src=\ref[src];operation=ai-main'>Main Menu</A> | " : ""]<A HREF='?src=\ref[user];mach_close=communications'>Close</A> \]"
|
|
return dat
|
|
|
|
/mob/living/silicon/ai/proc/ai_call_shuttle()
|
|
set category = "AI Commands"
|
|
set name = "Call Emergency Shuttle"
|
|
if(usr.stat == 2)
|
|
usr << "You can't call the shuttle because you are dead!"
|
|
return
|
|
call_shuttle_proc(src)
|
|
|
|
// hack to display shuttle timer
|
|
if(emergency_shuttle.online)
|
|
var/obj/machinery/computer/communications/C = locate() in world
|
|
if(C)
|
|
C.post_status("shuttle")
|
|
|
|
return
|
|
|
|
/proc/call_prison_shuttle(var/mob/usr)
|
|
if ((!( ticker ) || emergency_shuttle.location == 1))
|
|
return
|
|
if(ticker.mode.name == "blob" || ticker.mode.name == "Corporate Restructuring" || ticker.mode.name == "sandbox")
|
|
usr << "Under directive 7-10, [station_name()] is quarantined until further notice."
|
|
return
|
|
if(ticker.mode.name == "revolution")
|
|
usr << "Centcom will not allow the shuttle to be called, due to the possibility of sabotage by revolutionaries."
|
|
return
|
|
if(ticker.mode.name == "AI malfunction")
|
|
usr << "Centcom will not allow the shuttle to be called."
|
|
return
|
|
for(var/obj/machinery/computer/prison_shuttle/PS in world)
|
|
if(!PS.allowedtocall)
|
|
usr << "\red Centcom will not allow the shuttle to be called"
|
|
return
|
|
if(PS.z == 3)
|
|
usr << "\red Already in transit! Please wait!"
|
|
return
|
|
var/A = locate(/area/shuttle/prison/)
|
|
for(var/mob/M in A)
|
|
M.show_message("\red Launch sequence initiated!")
|
|
spawn(0) shake_camera(M, 10, 1)
|
|
sleep(10)
|
|
|
|
if(PS.z == 2) //This is the laziest proc ever
|
|
for(var/atom/movable/AM as mob|obj in A)
|
|
AM.z = 3
|
|
AM.Move()
|
|
sleep(rand(600,1800))
|
|
for(var/atom/movable/AM as mob|obj in A)
|
|
AM.z = 1
|
|
AM.Move()
|
|
else
|
|
for(var/atom/movable/AM as mob|obj in A)
|
|
AM.z = 3
|
|
AM.Move()
|
|
sleep(rand(600,1800))
|
|
for(var/atom/movable/AM as mob|obj in A)
|
|
AM.z = 2
|
|
AM.Move()
|
|
for(var/mob/M in A)
|
|
M.show_message("\red Prison shuttle has arrived at destination!")
|
|
return
|
|
return
|
|
|
|
|
|
/proc/enable_prison_shuttle(var/mob/user)
|
|
for(var/obj/machinery/computer/prison_shuttle/PS in world)
|
|
PS.allowedtocall = !(PS.allowedtocall)
|
|
|
|
/proc/call_shuttle_proc(var/mob/user)
|
|
if ((!( ticker ) || emergency_shuttle.location))
|
|
return
|
|
|
|
if(world.time < 6000) // Ten minute grace period to let the game get going without lolmetagaming. -- TLE
|
|
user << "Centcomm will not allow the shuttle to be called."
|
|
if(ticker.mode.name == "blob" || ticker.mode.name == "Corporate Restructuring" || ticker.mode.name == "sandbox")
|
|
user << "Under directive 7-10, [station_name()] is quarantined until further notice."
|
|
return
|
|
if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || ticker.mode.name == "confliction")
|
|
user << "Centcom will not allow the shuttle to be called."
|
|
return
|
|
if(ticker.mode.name == "nuclear emergency" && world.time < 6000)
|
|
user << "Centcom will not allow the shuttle to be called."
|
|
return
|
|
|
|
emergency_shuttle.incall()
|
|
world << "\blue <B>Alert: The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.</B>"
|
|
world << sound('shuttlecalled.ogg')
|
|
|
|
return
|
|
|
|
/proc/cancel_call_proc(var/mob/user)
|
|
if ((!( ticker ) || emergency_shuttle.location || emergency_shuttle.direction == 0 || emergency_shuttle.timeleft() < 300))
|
|
return
|
|
if( ticker.mode.name == "blob" )
|
|
return
|
|
|
|
world << "\blue <B>Alert: The shuttle is going back!</B>" //marker4
|
|
world << sound('shuttlerecalled.ogg')
|
|
|
|
emergency_shuttle.recall()
|
|
|
|
return
|
|
|
|
/obj/machinery/computer/communications/proc/post_status(var/command, var/data1, var/data2)
|
|
|
|
var/datum/radio_frequency/frequency = radio_controller.return_frequency(status_display_freq)
|
|
|
|
if(!frequency) return
|
|
|
|
|
|
|
|
var/datum/signal/status_signal = new
|
|
status_signal.source = src
|
|
status_signal.transmission_method = 1
|
|
status_signal.data["command"] = command
|
|
|
|
switch(command)
|
|
if("message")
|
|
status_signal.data["msg1"] = data1
|
|
status_signal.data["msg2"] = data2
|
|
if("alert")
|
|
status_signal.data["picture_state"] = data1
|
|
|
|
frequency.post_signal(src, status_signal)
|
|
|
|
|
|
|
|
/*
|
|
receive_signal(datum/signal/signal)
|
|
|
|
switch(signal.data["command"])
|
|
if("blank")
|
|
mode = 0
|
|
|
|
if("shuttle")
|
|
mode = 1
|
|
|
|
if("message")
|
|
set_message(signal.data["msg1"], signal.data["msg2"])
|
|
|
|
if("alert")
|
|
set_picture(signal.data["picture_state"])
|
|
*/ |