Component File /Utils/AgentPlayer.cs (C#)
using System;  
using System.Collections;  
using System.Drawing;  
  
namespace YariSoft.Utils  
{  
    [Serializable]  
    public struct AgentOperation  
    {  
        public enum OperationTypeEnum { Animation, Speak, MoveTo };  
  
        public OperationTypeEnum    OperationType;  
        public object                Action;  
  
        #region Constructor/Destructor  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="blue">public</font> AgentOperation ( OperationTypeEnum OperationType, <font color="blue">object</font> Action )&nbsp;&nbsp;
        {  
            this.OperationType    = OperationType;  
            this.Action            = Action;  
        }  
        #endregion  
    }  
  
    [Serializable]  
    public class AgentMovie  
    {  
        public ArrayList Operations;  
        public string     Name;  
  
        #region Constructor/Destructor  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="blue">public</font> AgentMovie ( <font color="blue">string</font> Name )&nbsp;&nbsp;
        {  
            this.Operations = new ArrayList();  
            this.Name = Name;  
        }  
        #endregion  
  
        #region Public functions  
        public void AddOperation ( AgentOperation Opeartion )  
        {  
            this.Operations.Add( Opeartion );  
        }  
        #endregion  
    }  
  
    [Serializable]  
    public class AgentPlayer  
    {  
        public enum MovieTypeEnum { Start, Stop, Error, Question, Busy, DefPosition };  
  
        public Hashtable    Movies = null;  
        [NonSerialized()]  
        public string FileName        = defaultFileName;  
        [NonSerialized()]  
        public bool   HasChanges    = false;  
  
        #region Local variables  
        [NonSerialized()]  
        private    Random generator    = null;  
        private const string defaultFileName  
                                    = "Untitled.amv";  
        #endregion  
  
        #region Constructor/Destructor  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="blue">public</font> AgentPlayer ()&nbsp;&nbsp;
        {  
            this.Movies = new Hashtable();  
            for(int i = (int)MovieTypeEnum.Start; i <= (int)MovieTypeEnum.Busy; i++ ){  
                ArrayList agentMovies = new ArrayList ();  
                this.Movies.Add ( ( MovieTypeEnum )i, agentMovies );  
            }  
            this.generator = new Random();  
        }  
        #endregion  
  
        #region Public functions  
        public void AddMovie ( AgentMovie Movie, MovieTypeEnum MovieType )  
        {  
            ArrayList agentMovies = ( ArrayList )this.Movies[ MovieType ];  
            if( agentMovies != null ){  
                agentMovies.Add( Movie );  
            }  
        }  
  
        public void Play ( MovieTypeEnum MovieType, AgentServerObjects.IAgentCharacter Character )  
        {  
            if( Character == null ){  
                return;  
            }  
  
            AgentMovie movie = this.GetMovie( MovieType );  
            if( movie != null ){  
                this.Play( movie, Character );  
            }  
        }  
  
        public void Play ( AgentMovie Movie, AgentServerObjects.IAgentCharacter Character )  
        {  
            if( Movie == null ){  
                return;  
            }  
  
            try{  
                int pdwReqID;  
                Character.StopAll( 0xFFFFFFF );  
                foreach( AgentOperation operation in Movie.Operations ){  
                    switch( operation.OperationType ){  
                        case AgentOperation.OperationTypeEnum.Animation:  
                            Character.Play( ( string )operation.Action, out pdwReqID );  
                            break;  
                        case AgentOperation.OperationTypeEnum.Speak:  
                            Character.Speak( ( string )operation.Action, null, out pdwReqID );  
                            break;  
                        case AgentOperation.OperationTypeEnum.MoveTo:  
                            Point curPoint = ( Point )operation.Action;  
                            Character.MoveTo( (short)( curPoint.X ), (short)(curPoint.Y), 1, out pdwReqID);  
                            break;  
                    }  
                }  
            }catch{  
            }  
        }  
  
        public bool SaveToFile()  
        {  
            bool showDiaolg = false;  
            if( this.FileName == defaultFileName ){  
                showDiaolg = true;  
            }  
  
            if( YariSoft.Utils.ConfigFile.SaveToFile( ref this.FileName, this, showDiaolg ) ){  
                this.HasChanges = false;  
            }  
            return ! this.HasChanges;  
        }  
  
        public bool SaveAsToFile()  
        {  
            if( YariSoft.Utils.ConfigFile.SaveToFile( ref this.FileName, this, true ) ){  
                this.HasChanges = false;  
            }  
            return ! this.HasChanges;  
        }  
  
        public static AgentPlayer LoadFromFile( string FileName )  
        {  
            AgentPlayer result = ( AgentPlayer )YariSoft.Utils.ConfigFile.LoadFromFile( ref FileName, false );  
            if( result == null ){  
                result = new AgentPlayer();  
            } else {  
                result.FileName = FileName;  
                result.generator = new Random();  
            }  
            return result;  
        }  
        #endregion  
  
        #region Private functions  
        private AgentMovie GetMovie ( MovieTypeEnum MovieType )  
        {  
            ArrayList agentMovies = (ArrayList)this.Movies[ MovieType ];  
            if( agentMovies == null ){  
                return null;  
            }  
  
            if( agentMovies.Count == 0 ){  
                return null;  
            }  
              
            return ( AgentMovie )agentMovies[ this.generator.Next( agentMovies.Count ) ];  
        }  
        #endregion  
    }  
}