Я тоже игрался с msagent-ом. Мои наблюдения:
- Поскольку у различных персонажей разные действия, для обработки этой ситуации мне пришлось влепить Switch. А как бы вызывать действия случайным образом (ес-но имеющиеся у конкретного персонажа).
- Даже после Unload-а персонажа, в памяти продолжает висеть процесс AgentSvr.exe, к-рый занимает порядка 25-30Мб ОЗУ - это неприкольно, а убить процесс как-то некрасиво...
- Если агент был запущен из бесконечного цикла, то, пока он не будет Unload-ен, основной цикл стоит на паузе. В связи с этим возник вопрос о возможности реализации многопоточных задач посредстом AutoIt в целом.
Код:

#include <File.au3>
#include <Misc.au3>
$Path=@WindowsDir&"\MSAGENT\CHARS\"
$figures=_FileListToArray($Path,"*.acs",1)
;демонстрация
_msagent("Привет! Это просто тест")
Func _msagent($msg)
If IsArray($figures) Then
$P = $Path & $figures[Random(1,$figures[0],1)]
$fig = StringMid($P,StringInStr($P,'\',0,-1)+1)
$fig = StringLeft($fig,StringInStr($fig,".acs",0,-1)-1)
If FileExists($P) Then
$AgentControl = ObjCreate("Agent.Control.1")
$SinkObject = ObjEvent($AgentControl, "event_")
If Isobj($AgentControl) Then
$AgentControl.Connected = True
$AgentControl.Characters.Load($fig, $P)
With $AgentControl.Characters($fig)
.Show
Switch StringLower($fig)
Case 'offcat'
.Play("Greeting")
.Play("RestPose")
Case 'dot'
.Play("Greeting")
.Play("RestPose")
Case 'f1'
.Play("Greeting")
.Play("RestPose")
Case 'logo'
.Play("Greeting")
.Play("RestPose")
Case 'rocky'
.Play("Greeting")
.Play("RestPose")
Case 'clippit'
.Play("Congratulate")
.Play("RestPose")
Case 'mnature'
.Play("Congratulate")
.Play("RestPose")
Case 'qmark'
.Play("Welcome")
.Play("RestPose")
Case 'angel'
.Play("Halo")
.Play("Glow")
.Play("Glowoff")
Case 'blonde fem a'
.Play("Blink")
.Play("Wink")
.Play("RestPose")
Case 'candy'
.Play("Blink")
.Play("RestPose")
Case 'max'
.Play("Blink")
.Play("RestPose")
Case 'paige'
.Play("Pointleftreturn")
Case 'reaper'
.Play("Smile")
.Play("RestPose")
Case 'scientist'
.Play("Blackboard")
.Play("Entropy")
.Play("RestPose")
Case 'sharky'
;
Case Else
.Play("Greet")
.Play("RestPose")
EndSwitch
While _KeyPressed()=0
.MoveTo(Random(180,@DesktopWidth-180,1), Random(260,@DesktopHeight-260,1))
.Speak($msg)
WEnd
.Hide
.StopAll
Endwith
$AgentControl.Characters.Unload($fig)
EndIf
EndIf
EndIf
EndFunc
Func _KeyPressed()
Local $j
Local $dll = DllOpen("user32.dll")
For $j = 01 to 20
If _IsPressed($j, $dll) Then
DllClose($dll)
Return 1
EndIf
Next
DllClose($dll)
Return 0
EndFunc