Category Archives: Open AIM

Making games more fun with artificial stupidity

If one buys into Daniel Dennett’s proposed use of “the intentional stance” to generate explanations and predictions of human behavior (say, in an AI program that observes a person and tries to find ways of helping), then accounting for human error is a tough problem (because the stance assumes rationality and errors aren’t rational). That’s one reason I’m interested in errors.

Game AI faces a similar problem in that some games like chess and pool/billiards allow a computer player to make very good predictions many steps ahead, often beyond the ability of human players. Such near-optimal skill makes the computer players not much fun. One has to find ways of making the computers appear to play at a similar level of skill as whatever human they play against.

I just came across a very interesting article on the topic of how to make computer players have plausibly non-optimal skills. Here’s a good summarizing quote:

In order to provide an exciting and dynamic game, the AI needs to manipulate the gameplay to create situations that the player can exploit.

In pool this could mean, instead of blindly taking a shot and not caring where the cue ball ends up, the AI should deliberately fail to pot the ball and ensure that the cue ball ends up in a place where the player can make a good shot.

An interesting anecdote from the article is that the author created a pool-playing program that understood the physics of the simulated table and balls so well that it could unfailingly knock any ball it wanted to into a pocket. The program didn’t make any attempt to have the cue ball stop at a particular position after the target ball was pocketed, however. Yet naive human players interpreted the computer’s plays as trying to optimize the final position of the cue ball, apparently because they projected human abilities onto the program, and humans cannot unfailingly pocket any ball but seemingly are pretty good at having the cue ball stop where they want.

Read more

How to set locale in OpenAIM

For one-time change of locale:

Use commandline flag ‘-l’ (“el”); for example, c> .accbuddy.exe -l zh-cn:cn

For a persistent change:

  1. Signon to accbuddy
  2. Type :h
  3. In the returned list, locate the command that sets preferences
  4. Set the locale preference
  5. Sign off
  6. Signon with the same userid

How to use the OpenAIM test client accbuddy.exe

Accbuddy.exe is a no-frills client distributed by the AIMcc team as part of their SDK, to help with debugging.

1) Locate accbuddy.exe in your AIMcc SDK dirs (e.g., mine is in aimcc1.2.1.1281distdebug)

2) Download the following MS debug-support DLLs into that same dir:

https://www.cm.aol.com/viewcvs/clientdev/viewcvs.cgi/sdks/microsoft/vc6/bin/debug/MSVCRTD.DLL

https://www.cm.aol.com/viewcvs/clientdev/viewcvs.cgi/sdks/microsoft/vc71/bin/debug/msvcr71d.dll

https://www.cm.aol.com/viewcvs/clientdev/viewcvs.cgi/sdks/microsoft/vc71/bin/debug/msvcp71d.dll

3) Double-click accbuddy.exe and enter your login when prompted.

4) Type :h for a list of commands, or :q to quit

5) View the trace file by doing Start|Run and entering %temp%.  Locate the xprt* file, representing the xprt library’s portion of the session.  (I believe there should also be a trace.txt file representing the AIMcc portion of the session, but I don’t see one.)

Here are all the commands:

:h     {cmd}         get (this) list of commands
:q                   log out and quit
:sid   key           enter SecurID key

=== Session ===
s:a    {message}     sets away message
s:c                  confirm account
s:d    {prop} {v}    display info about the current session
s:l                  list current sessions
s:sp   prop value    set a session property
s:ca   cap           add a custom capability
s:cr   cap           remove a custom capability
s:w    {name}        switch to a different session

=== per-session bart items ===
s:gb   {type}        get one of your bart items
s:gbo  {type}        get one of your bart items as an object
s:sbf  file {type}   set/upload a bart item from a file
s:sbt  text {type}   set a bart item with text
s:sbi  bartid {type} set a bart item from its bartid string
s:sbu  user {type}   set a bart item copied from another user
s:sbx  {type}        remove a bart item

=== Buddy List ===
:w                   show currently logged in buddies
b:a    buddy group   add a buddy to the specified group
b:r    buddy group   remove a buddy from your list
b:l    {group}       list buddies on your list
b:lf   {num}         list MFU buddies
b:f    buddy {group} find a buddy
b:m    from to fromGp {toGp} move a buddy
g:a    group         add a new group
g:r    group         remove group and all buddies inside
g:d    group {prop} {v} dumps group props
g:l                  list all the groups
g:m    from to       move a group
g:rn   old new       rename a group
b:ta   buddy         add a temp buddy (cannot be in buddy list)
b:tr   buddy         remove a temp buddy
b:d    {prop} {v}    dumps buddy list props
b:ynr                list buddies with unknown state

=== User info ===
i:d    user {prop} {v} dumps user props
i:g    user {prop} {v} gets user info, async
i:gb   user {type}   get/download a user’s bart item
i:gbo  user {type}   get/download a user’s bart item as an object
i:e    email {…}   lookup users by email address
d:s    query {type}  search on e-mail address for screen names
d:l                  asks LOST to guess where client is
u:r    user {reason} report a user (aka warn them)
u:rn   user {reason} report a user (and notify AOL)
u:sp   user prop {val} set a user property
u:ig   user          ignore a user
u:unig user          unignore a user
u:bl   user          block a user
u:unbl user          unblock a user

=== IM/Chat ===
im:ni  user          new std im session
im:nd  user          new direct im session
im:nc  room          new chat session
im:i   user {msg}    invite a user
im:e   user          eject a user
im:p   type          propose im session type change
im:a                 accept incoming proposal
im:r   {reason}      reject incoming proposal
im:c   {invitee}     cancel outgoing proposal
im:q                 end im session
im:d   {prop} {v}    dump im session properties
im:s   msg           send specified im
im:sm  type msg {f}  send specified im and MIME type w/optional flags
im:st  state         set input state
im:at  text          append text to outgoing IM
im:ab  bartid type   append a bart item to the outgoing IM
im:af  file          append embed file/dir to outgoing DIM
im:s!                send accumulated IM/DIM
im:sr                stop receiving DIM embeds
im:ss                stop sending DIM embeds
im:l                 list all im sessions
im:w   num           switch to the specified im session
im:cp  personality   change personality to send in IM
im:ex  {value}       display incoming IMs in viewer
im:rs                requested stored IM summaries
im:ds  {id}          deliver stored IM(s)
im:xs  {id}          delete stored IM(s)
.      msg           shorthand for im:s

=== File Xfer ===
fx:n   user file     send a file or folder
fx:a                 accept incoming proposal
fx:r   {reason}      reject incoming proposal
fx:q                 end file xfer session
fx:d   {prop} {v}    dump a file xfer session
fx:rc  {action} {path} resolve a file xfer collision

=== File Sharing ===
fs:n   user          request a shared file listing
fs:a                 accept incoming proposal
fs:r   {reason}      reject incoming proposal
fs:q                 end file sharing session
fs:c   index         change into a different folder
fs:x   index         request a file or folder
fs:d   {prop} {v}    dump a sharing session
fs:di  {prop} {v}    dump current sharing item

=== A/V ===
av:na  user          start an audio session
av:nv  user          start a video session
av:nca {tbd}         start a multiparty audio session
av:ncv {tbd}         start a multiparty video session
av:i   user {msg}    invite a user
av:e   user          eject a user
av:a                 accept incoming proposal
av:r   {reason}      reject incoming proposal
av:c   {invitee}     cancel outgoing proposal
av:q                 end an a/v session
av:d   {prop} {v}    dump an a/v session
av:h   {hold}        hold an a/v session
av:t   key           play DTMF tone in session
av:l                 list all av sessions
av:w   num           switch to the specified av session
av:dm  {prop} {v}    dump a/v manager
av:m   {mute}        mutes outgoing audio

=== Share Buddies ===
sb:ng  user group    share a buddy group
sb:nu  user buddy    share a single user
sb:a                 accept incoming proposal
sb:r   {reason}      reject incoming proposal
sb:q                 end share buddies session

=== Custom Sessions ===
cs:np  guid {user}   start a custom offer-answer session
cs:ns  guid {user}   start a custom stream session
cs:nm  guid {user}   start a custom message session
cs:s   data          send data
cs:i   user {msg}    invite a user
cs:e   user          eject a user
cs:a                 accept incoming proposal
cs:r   {reason}      reject incoming proposal
cs:q                 end custom session
cs:d   {prop} {v}    dump an custom session
cs:l                 list all custom sessions
cs:w   num           switch to the specified custom session

=== Security ===
sec:i  file passwd   imports cert(s)
sec:r                clear cert db & invalidate certs
sec:l                lists known certs
sec:e  file filePwd tknPwd export cert(s)

=== Preferences ===
p:g    spec          get a preference value
p:G    spec          request a preference value
p:s    spec val      set a preference value
p:sbf  file {type}   set/upload a bart item from a file
p:sbt  text {type}   set a bart item with text
p:sbi  bartid {type} set a bart item from its bartid string
p:sbu  user {type}   set a bart item copied from another user
p:sbx  {type}        remove a bart item
p:c    {spec}        count prefs under spec
p:d    {spec}        display all prefs under spec
p:dd   {spec}        display all prefs under spec without giving up
p:r    spec          reset a preference
p:i    file          import preferences from a file & merge
p:e    file          export preferences to a file

=== Plugins ===
pl:l                 list installed plugins
pl:x   uuid cmd {names} execute plugin command

=== Smileys ===
sm:s   bartid        print info about a smiley set
sm:n   bartid n      print info about one smiley from a set
sm:f   bartid text   print info about the smiley that matches ‘text’

=== Other ===
o:gbi  bartid type   get a bart item by id&type
o:gbio bartid type   get a bart item by id&type as an object
o:sim  addr msg      send an email inviting someone to sign up with AIM
o:srv  service       send a request for an external service
o:url  url           download a URL using URLMON
o:urlv url           display a URL in a separate dialog
o:x    path          convert input file to xhtml
o:link               link active AV and IM (chat) sessions
o:v                  show the current version

NOTE: Whitespace must be double quoted.
NOTE: Double quotes must be escaped with a forward slash: “.

Avoid signin delay for audio and video checks when using AIMcc in a server context

If you’re using the Open AIM libraries (aka AIMcc) and your client doesn’t provide audio or video messaging capability, then you can speed up sign on by telling AIMcc not to try to enumerate all AV devices that are present when it signs on a user.  Do this:

oAccSession.Prefs.SetValue(“aimcc.av.enumDevices”, 0);

oAccSession.Prefs.SetValue(“aimcc.av.audio.permissions.buddies”, AccPermissions.AccPermissions_RejectAll);
oAccSession.Prefs.SetValue(“aimcc.av.audio.permissions.nonBuddies”, AccPermissions.AccPermissions_RejectAll);
oAccSession.Prefs.SetValue(“aimcc.av.video.permissions.buddies”, AccPermissions.AccPermissions_RejectAll);
oAccSession.Prefs.SetValue(“aimcc.av.video.permissions.nonBuddies”, AccPermissions.AccPermissions_RejectAll);