Files
Aurora.3/code/_onclick/ai.dm
Jiří Barouš e005dc9889 Adds new mechanics to AI/stationbound control of airlocks - allows AIs to bolt airlocks again, sort of (#10310)
* Refactors airlock wire messages

Makes it more straightforward to see that all the lights are off (i.e.
no power). Also differentiates between showing bolt status when the
indicators are on vs. off, as one is just a simple visual check while
the other would supposedly require a more close-up inspection.

It also makes it much easier to modify the conditions and text however
needed instead of using a bunch of ternaries for everything.

Additionally index_to_type uses the proper constants instead of
hardcoded numbers.

* Lights up the airlock indicator lights

Also does minor refactor of the wires file.

* Adds mechanics to toggle if AIs can bolt doors using AI control wire

* Moves most AI "welcome text" to a separate pop-up window and adds it as a verb

Also adds list of channels to the Radio-Settings verb.

* Moves Initialize, Destroy to beginning, merges the two Initializes

* Adds explicit override for admins and malfs, this allows them to (un)bolt stealthily should they choose to do so

Also adds name and area of the airlock to the UI and refactors it some.

* More better.
2020-10-31 21:08:46 +01:00

189 lines
4.6 KiB
Plaintext

/*
AI ClickOn()
Note currently ai restrained() returns 0 in all cases,
therefore restrained code has been removed
The AI can double click to move the camera (this was already true but is cleaner),
or double click a mob to track them.
Note that AI have no need for the adjacency proc, and so this proc is a lot cleaner.
*/
/mob/living/silicon/ai/DblClickOn(var/atom/A, params)
if(client.buildmode) // comes after object.Click to allow buildmode gui objects to be clicked
build_click(src, client.buildmode, params, A)
return
if(control_disabled || stat) return
if(ismob(A))
ai_actual_track(A)
else
A.move_camera_by_click()
/mob/living/silicon/ai/ClickOn(var/atom/A, params)
if(world.time <= next_click)
return
next_click = world.time + 1
if(client.buildmode) // comes after object.Click to allow buildmode gui objects to be clicked
build_click(src, client.buildmode, params, A)
return
if(stat)
return
var/list/modifiers = params2list(params)
if(modifiers["shift"] && modifiers["ctrl"])
CtrlShiftClickOn(A)
return
if(modifiers["middle"])
MiddleClickOn(A)
return
if(modifiers["shift"])
ShiftClickOn(A)
return
if(modifiers["alt"]) // alt and alt-gr (rightalt)
AltClickOn(A)
return
if(modifiers["ctrl"])
CtrlClickOn(A)
return
if(control_disabled || !canClick())
return
if(multitool_mode && isobj(A))
var/obj/O = A
var/datum/component/multitool/MT = O.GetComponent(/datum/component/multitool)
if(MT)
MT.interact(ai_multi, src)
return
if(ai_camera.in_camera_mode)
ai_camera.camera_mode_off()
ai_camera.captureimage(A, usr)
return
/*
AI restrained() currently does nothing
if(restrained())
RestrainedClickOn(A)
else
*/
A.add_hiddenprint(src)
A.attack_ai(src)
/*
AI has no need for the UnarmedAttack() and RangedAttack() procs,
because the AI code is not generic; attack_ai() is used instead.
The below is only really for safety, or you can alter the way
it functions and re-insert it above.
*/
/mob/living/silicon/ai/UnarmedAttack(atom/A)
A.attack_ai(src)
/mob/living/silicon/ai/RangedAttack(atom/A)
A.attack_ai(src)
/atom/proc/attack_ai(mob/user as mob)
return
/*
Since the AI handles shift, ctrl, and alt-click differently
than anything else in the game, atoms have separate procs
for AI shift, ctrl, and alt clicking.
*/
/mob/living/silicon/ai/ShiftClickOn(var/atom/A)
if(!control_disabled && A.AIShiftClick(src))
return
..()
/mob/living/silicon/ai/CtrlClickOn(var/atom/A)
if(!control_disabled && A.AICtrlClick(src))
return
..()
/mob/living/silicon/ai/AltClickOn(var/atom/A)
if(!control_disabled && A.AIAltClick(src))
return
/mob/living/silicon/ai/MiddleClickOn(var/atom/A)
if(!control_disabled && A.AIMiddleClick(src))
return
..()
/*
The following criminally helpful code is just the previous code cleaned up;
I have no idea why it was in atoms.dm instead of respective files.
*/
/atom/proc/AICtrlShiftClick()
return
/atom/proc/AIShiftClick()
return
/obj/machinery/door/airlock/AIShiftClick() // Opens and closes doors!
if(density)
Topic(src, list("command"="open", "activate" = "1"))
else
Topic(src, list("command"="open", "activate" = "0"))
return 1
/atom/proc/AICtrlClick(mob/user)
return
/obj/machinery/door/airlock/AICtrlClick(mob/user) // Bolts doors
var/command = player_is_antag(user.mind) ? "bolts_override" : "bolts"
if(locked)
Topic(src, list("command"=command, "activate" = "0"))
else
Topic(src, list("command"=command, "activate" = "1"))
return 1
/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs.
Topic(src, list("breaker"="1"))
return 1
/obj/machinery/turretid/AICtrlClick() //turns off/on Turrets
Topic(src, list("command"="enable", "value"="[!enabled]"))
return 1
/atom/proc/AIAltClick(var/atom/A)
return AltClick(A)
/obj/machinery/door/airlock/AIAltClick() // Electrifies doors.
if(!electrified_until)
// permanent shock
Topic(src, list("command"="electrify_permanently", "activate" = "1"))
else
// disable/6 is not in Topic; disable/5 disables both temporary and permanent shock
Topic(src, list("command"="electrify_permanently", "activate" = "0"))
return 1
/obj/machinery/turretid/AIAltClick() //toggles lethal on turrets
Topic(src, list("command"="lethal", "value"="[!lethal]"))
return 1
/atom/proc/AIMiddleClick(var/mob/living/silicon/user)
return 0
/obj/machinery/door/airlock/AIMiddleClick() // Toggles door bolt lights.
if(..())
return
if(!src.lights)
Topic(src, list("command"="lights", "activate" = "1"))
else
Topic(src, list("command"="lights", "activate" = "0"))
return 1
//
// Override AdjacentQuick for AltClicking
//
/mob/living/silicon/ai/TurfAdjacent(var/turf/T)
return (cameranet && cameranet.is_turf_visible(T))