mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 18:22:39 +00:00
Port over AI Opening Doors from Paradise
This makes an [OPEN] link appear on all radio messages the AI hears (to the right of the follow link). When clicked, it allows the AI to open the door nearest to the speaker (or, if it is a voice changer, the door nearest to the poor sap who had his voice stolen). AI, Open This Door!
This commit is contained in:
@@ -152,11 +152,11 @@
|
||||
cameraFollow = null
|
||||
|
||||
/mob/living/silicon/ai/proc/ai_actual_track(mob/living/target as mob)
|
||||
if(!istype(target)) return
|
||||
if(!istype(target)) return FALSE
|
||||
var/mob/living/silicon/ai/U = usr
|
||||
|
||||
if(target == U.cameraFollow)
|
||||
return
|
||||
return TRUE
|
||||
|
||||
if(U.cameraFollow)
|
||||
U.ai_cancel_tracking()
|
||||
@@ -185,6 +185,8 @@
|
||||
return
|
||||
sleep(10)
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/camera/attack_ai(var/mob/living/silicon/ai/user as mob)
|
||||
if (!istype(user))
|
||||
return
|
||||
|
||||
@@ -483,6 +483,19 @@ var/list/ai_verbs_default = list(
|
||||
else
|
||||
to_chat(src, "<font color='red'>System error. Cannot locate [html_decode(href_list["trackname"])].</font>")
|
||||
return
|
||||
|
||||
if(href_list["trackbot"])
|
||||
var/mob/living/bot/target = locate(href_list["trackbot"]) in mob_list
|
||||
if(target)
|
||||
ai_actual_track(target)
|
||||
else
|
||||
to_chat(src, "<span class='warning'>Target is not on or near any active cameras on the station.</span>")
|
||||
return
|
||||
|
||||
if(href_list["open"])
|
||||
var/mob/target = locate(href_list["open"]) in mob_list
|
||||
if(target)
|
||||
open_nearest_door(target)
|
||||
|
||||
return
|
||||
|
||||
@@ -825,6 +838,39 @@ var/list/ai_verbs_default = list(
|
||||
/mob/living/silicon/ai/proc/is_in_chassis()
|
||||
return istype(loc, /turf)
|
||||
|
||||
/mob/living/silicon/ai/proc/open_nearest_door(mob/living/target) // Rykka ports AI opening doors
|
||||
if(!istype(target))
|
||||
return
|
||||
|
||||
if(target && ai_actual_track(target))
|
||||
var/obj/machinery/door/airlock/A = null
|
||||
|
||||
var/dist = -1
|
||||
for(var/obj/machinery/door/airlock/D in range(3, target))
|
||||
if(!D.density)
|
||||
continue
|
||||
|
||||
var/curr_dist = get_dist(D, target)
|
||||
|
||||
if(dist < 0)
|
||||
dist = curr_dist
|
||||
A = D
|
||||
else if(dist > curr_dist)
|
||||
dist = curr_dist
|
||||
A = D
|
||||
|
||||
if(istype(A))
|
||||
switch(alert(src, "Do you want to open \the [A] for [target]?", "Doorknob_v2a.exe", "Yes", "No"))
|
||||
if("Yes")
|
||||
A.AIShiftClick()
|
||||
to_chat(src, "<span class='notice'>You open \the [A] for [target].</span>")
|
||||
else
|
||||
to_chat(src, "<span class='warning'>You deny the request.</span>")
|
||||
else
|
||||
to_chat(src, "<span class='warning'>Unable to locate an airlock near [target].</span>")
|
||||
|
||||
else
|
||||
to_chat(src, "<span class='warning'>Target is not on or near any active cameras on the station.</span>")
|
||||
|
||||
/mob/living/silicon/ai/ex_act(var/severity)
|
||||
if(severity == 1.0)
|
||||
@@ -906,15 +952,20 @@ var/list/ai_verbs_default = list(
|
||||
jobname = "Unknown"
|
||||
|
||||
var/track = ""
|
||||
if(changed_voice)
|
||||
if(impersonating)
|
||||
if(changed_voice) // They have a fake name
|
||||
if(impersonating) // And we found a mob with that name above, track them instead
|
||||
track = "<a href='byond://?src=\ref[src];trackname=[html_encode(speaker_name)];track=\ref[impersonating]'>[speaker_name] ([jobname])</a>"
|
||||
else
|
||||
track += "<a href='byond://?src=\ref[src];trackname=[html_encode(speaker_name)];open=\ref[impersonating]'>\[OPEN\]</a>" // Rykka ports AI opening doors
|
||||
else // We couldn't find a mob with their fake name, don't track at all
|
||||
track = "[speaker_name] ([jobname])"
|
||||
else
|
||||
track = "<a href='byond://?src=\ref[src];trackname=[html_encode(speaker_name)];track=\ref[speaker]'>[speaker_name] ([jobname])</a>"
|
||||
else // Not faking their name
|
||||
if(istype(speaker, /mob/living/bot)) // It's a bot, and no fake name! (That'd be kinda weird.) :p
|
||||
track = "<a href='byond://?src=\ref[src];trackbot=\ref[speaker]'>[speaker_name] ([jobname])</a>"
|
||||
else // It's not a bot, and no fake name!
|
||||
track = "<a href='byond://?src=\ref[src];trackname=[html_encode(speaker_name)];track=\ref[speaker]'>[speaker_name] ([jobname])</a>"
|
||||
track += "<a href='byond://?src=\ref[src];trackname=[html_encode(speaker_name)];open=\ref[speaker]'>\[OPEN\]</a>" // Rykka ports AI opening doors
|
||||
|
||||
return track
|
||||
return track // Feed variable back to AI
|
||||
|
||||
/mob/living/silicon/ai/proc/relay_speech(mob/living/M, list/message_pieces, verb)
|
||||
var/message = combine_message(message_pieces, verb, M)
|
||||
|
||||
Reference in New Issue
Block a user