diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index ea32469226c..e07c6e7d595 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -226,7 +226,7 @@ Possible to do for anyone motivated enough:
/obj/machinery/hologram/holopad/attack_ai(mob/living/silicon/user)
if(!istype(user))
return
-
+
if(!ai_can_interact(user))
return
@@ -259,7 +259,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
text = speaking.scramble(text)
else
text = stars(text)
-
+
//This communication is imperfect because the holopad "filters" voices and is only designed to connect to the master only.
var/rendered
if(speaking)
@@ -374,7 +374,8 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
/obj/machinery/hologram/holopad/proc/move_hologram(mob/living/silicon/ai/user)
if(LAZYISIN(active_holograms, user))
- step_to(active_holograms[user], user.eyeobj) // So it turns.
+ if(!user.facing_dir)
+ step_to(active_holograms[user], user.eyeobj) // So it turns.
var/obj/effect/overlay/H = active_holograms[user]
H.forceMove(get_turf(user.eyeobj))
active_holograms[user] = H
diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css
index ae7d19113cb..a64212021d2 100644
--- a/code/modules/goonchat/browserassets/css/browserOutput.css
+++ b/code/modules/goonchat/browserassets/css/browserOutput.css
@@ -63,6 +63,7 @@ a {color: #397ea5;}
a.visited {color: #7c00e6;}
a:visited {color: #7c00e6;}
a.popt {text-decoration: none;}
+.ai_tracking, .ai_tracking:link, .ai_tracking:visited, .ai_tracking:active, .ai_tracking:hover {color: #397ea5;}
/*****************************************
*
diff --git a/code/modules/goonchat/browserassets/css/browserOutput_white.css b/code/modules/goonchat/browserassets/css/browserOutput_white.css
index e2933fb6b1d..8e9367ca81d 100644
--- a/code/modules/goonchat/browserassets/css/browserOutput_white.css
+++ b/code/modules/goonchat/browserassets/css/browserOutput_white.css
@@ -60,6 +60,7 @@ a {color: #0000ff;}
a.visited {color: #ff00ff;}
a:visited {color: #ff00ff;}
a.popt {text-decoration: none;}
+.ai_tracking, .ai_tracking:link, .ai_tracking:visited, .ai_tracking:active, .ai_tracking:hover {color: #0000ff;}
/*****************************************
*
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index d04a903132c..8a13592f22c 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -220,11 +220,11 @@
if(changed_voice)
if(impersonating)
- track = "[speaker_name] ([jobname])"
+ track = "[speaker_name] ([jobname])"
else
track = "[speaker_name] ([jobname])"
else
- track = "[speaker_name] ([jobname])"
+ track = "[speaker_name] ([jobname])"
if(istype(src, /mob/abstract/observer))
if(speaker != null)
diff --git a/code/modules/mob/living/silicon/ai/ai_movement.dm b/code/modules/mob/living/silicon/ai/ai_movement.dm
index 687505b9f2f..f45c7f85310 100644
--- a/code/modules/mob/living/silicon/ai/ai_movement.dm
+++ b/code/modules/mob/living/silicon/ai/ai_movement.dm
@@ -3,4 +3,10 @@
/mob/living/silicon/ai/fall_impact(levels_fallen, stopped_early = FALSE, var/damage_mod = 1)
if(!anchored)
- . = ..()
\ No newline at end of file
+ return ..()
+
+/mob/living/silicon/ai/facedir(var/ndir)
+ . = ..()
+ if(holo?.active_holograms[src])
+ var/obj/effect/overlay/hologram/H = holo.active_holograms[src]
+ H.dir = ndir
diff --git a/html/changelogs/geeves-ai_stuff.yml b/html/changelogs/geeves-ai_stuff.yml
new file mode 100644
index 00000000000..a78d80b6cd1
--- /dev/null
+++ b/html/changelogs/geeves-ai_stuff.yml
@@ -0,0 +1,8 @@
+author: Geeves
+
+delete-after: True
+
+changes:
+ - rscadd: "AI can now lock their hologram's facing direction with the face-direction macro."
+ - rscadd: "AI can now change their hologram's facing direction with the northface,southface,eastface,westface macros."
+ - tweak: "AI clicking on people's names to track them will no longer turn the link purple."