public CarotADMLCharacter(ADML.Character src, string override_image_filename)
        {
            admlchar = src;

            string srcimage = (override_image_filename!=null)?override_image_filename:src.source;

            //dice up the source image if it hasnt been done yet
            using(Image srcimg = GameEngine.Game.LoadImage(srcimage)) {
                foreach(ADML.View view in src.views.Values) {
                    FrameServer fs = new FrameServer(view);
                    fs.dice(src.tcol, srcimg);
                    view.SetFrameServer(fs);
                }
            }

            tryCreateIdleAnim("l_idle", "l_walk");
            tryCreateIdleAnim("r_idle", "r_walk");
            tryCreateIdleAnim("u_idle", "u_walk");
            tryCreateIdleAnim("d_idle", "d_walk");

            //create the animrecords
            foreach(ADML.Anim anim in admlchar.anims.Values) {
                AnimRecord ar = new AnimRecord();
                ar.admlanim = anim;
                ar.controller = new StandardChrAnimationController(ar.admlanim.str);
                ar.address = int.Parse(ar.admlanim.addr);
                animations[anim.name] = ar;
            }

            //setup the hardcoded animation types
            walkAnims[(int)Directions.w] = findAnim("l_walk");
            walkAnims[(int)Directions.e] = findAnim("r_walk");
            walkAnims[(int)Directions.n] = findAnim("u_walk");
            walkAnims[(int)Directions.s] = findAnim("d_walk");
            idleAnims[(int)Directions.w] = findAnim("l_idle");
            idleAnims[(int)Directions.e] = findAnim("r_idle");
            idleAnims[(int)Directions.n] = findAnim("u_idle");
            idleAnims[(int)Directions.s] = findAnim("d_idle");

            if(walkAnims[(int)Directions.w].admlanim.idle != null)
                idleAnims[(int)Directions.w] = animations["l_idle"];
            if(walkAnims[(int)Directions.e].admlanim.idle != null)
                idleAnims[(int)Directions.e] = animations["r_idle"];
            if(walkAnims[(int)Directions.n].admlanim.idle != null)
                idleAnims[(int)Directions.n] = animations["u_idle"];
            if(walkAnims[(int)Directions.s].admlanim.idle != null)
                idleAnims[(int)Directions.s] = animations["d_idle"];
        }
 public void Command(CharacterCommands command, params object[] args)
 {
     customAnimation = null;
     switch(command) {
         case CharacterCommands.Step:
             state = 1;
             d = (Directions)args[0];
             walkAnims[(int)d].controller.reset();
             return;
         case CharacterCommands.Face:
             //if(state == 1 && d == (Directions)args[0]) { }
             //else
             //state = 0;
             //if(d != (Directions)args[0])
             state = 0;
             if(d != (Directions)args[0]) {
                 d = (Directions)args[0];
                 if(GetCurrentAnimRecord() != null)
                     GetCurrentAnimRecord().controller.reset();
             }
             return;
         case CharacterCommands.Stop: {
                 state = 0;
                 AnimRecord ar = GetCurrentAnimRecord();
                 if(ar != null)
                     ar.controller.reset();
             }
             return;
         case CharacterCommands.Walk:
             if(d == (Directions)args[0] && state == 1) { } else {
                 state = 1;
                 walkAnims[(int)(Directions)args[0]].controller.reset();
                 d = (Directions)args[0];
             }
             return;
         case CharacterCommands.Animate:
             if(animations.TryGetValue((string)args[0], out customAnimation)) {
                 customAnimation.controller.reset();
                 state = 3;
             } else state = 0;
             return;
         default: return;
     }
 }