Merge pull request #7897 from Rykka-Stormheart/shep-dev-ai-open-this-door

Port over AI Opening Doors from Paradise
This commit is contained in:
Aronai Sieyes
2020-05-16 11:45:15 -04:00
committed by GitHub
2 changed files with 61 additions and 8 deletions

View File

@@ -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

View File

@@ -484,6 +484,19 @@ var/list/ai_verbs_default = list(
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
/mob/living/silicon/ai/proc/camera_visibility(mob/observer/eye/aiEye/moved_eye)
@@ -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
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)