private TurnActionComponent SafeGetAction(DynValue value, string excMsgHeader)
 {
     if (value.Type == DataType.UserData)
     {
         Mods.Lua.TurnActionComponent luaComp = value.UserData.Object as Mods.Lua.TurnActionComponent;
         if (luaComp != null)
         {
             return(TranslateTurnActionComp(luaComp, excMsgHeader));
         }
         else
         {
             throw new BadActionException(excMsgHeader + " UserData cannot be coerced into TurnActionComponent");
         }
     }
     else
     {
         throw new BadActionException(excMsgHeader + " Expected UserData type");
     }
 }
        private TurnActionComponent TranslateTurnActionComp(Mods.Lua.TurnActionComponent luaComp, string excMsgHeader)
        {
            TurnActionComponent logicComp = new TurnActionComponent();

            switch (luaComp.Type.ToUpperInvariant())
            {
            case "MOVE":
                logicComp.type   = TurnActionComponentType.MovePiece;
                logicComp.actor  = ToBoardPosition(luaComp.ActorX, luaComp.ActorY, excMsgHeader, "start");
                logicComp.target = ToBoardPosition(luaComp.TargetX, luaComp.TargetY, excMsgHeader, "target");
                if (logicComp.actor == logicComp.target)
                {
                    throw new BadActionException(excMsgHeader + " Start and target positions are equal");
                }
                return(logicComp);

            case "CAPTURE":
                logicComp.type   = TurnActionComponentType.CapturePiece;
                logicComp.target = ToBoardPosition(luaComp.TargetX, luaComp.TargetY, excMsgHeader, "target");
                return(logicComp);

            case "PROMOTION":
            case "PROMOTE":
                logicComp.type           = TurnActionComponentType.PromotePiece;
                logicComp.actor          = ToBoardPosition(luaComp.ActorX, luaComp.ActorY, excMsgHeader, "promoted");
                logicComp.promotionIndex = db.PieceNameToIndex(luaComp.PromotionPiece);
                if (logicComp.promotionIndex < 0)
                {
                    throw new BadActionException(excMsgHeader + " Nonexistent piece given for promotion");
                }
                return(logicComp);

            default:
                throw new BadActionException(string.Format("{0} Invalid action type \"{1}\"", excMsgHeader, luaComp.Type));
            }
        }