public Quest(QuestGoalType goal, int typeId, int goalNum, int rewardCoins)
 {
     GoalType    = goal;
     TypeId      = typeId;
     GoalNumber  = goalNum;
     RewardCoins = rewardCoins;
 }
        public static Quest Random(User user)
        {
            QuestGoalType goalType   = Enum.GetValues(typeof(QuestGoalType)).Cast <QuestGoalType>().ToList().Random();
            int           numGoal    = 0;
            int           coinReward = 0;
            int           typeId     = 0;

            switch (goalType)
            {
            case QuestGoalType.BeatLevels:
                numGoal    = Utilities.Rand.Next(LEVELCOMPLETE_MIN, LEVELCOMPLETE_MAX + 1);
                coinReward = (int)(numGoal * LEVELCOMPLETE_COINS);
                break;

            case QuestGoalType.BuyMaterials:
                numGoal = Utilities.Rand.Next(BUYMATERIAL_MIN / GOAL_NUM_FACTOR,
                                              BUYMATERIAL_MAX / GOAL_NUM_FACTOR + 1) * GOAL_NUM_FACTOR;
                coinReward = (int)(numGoal * MATERIALBUY_COINS);
                int materials = Enum.GetValues(typeof(Material)).Cast <Material>().Count();
                typeId = Utilities.Rand.Next(0, materials);
                break;

            case QuestGoalType.CraftProjectiles:
                numGoal = Utilities.Rand.Next(PROJCRAFT_MIN / GOAL_NUM_FACTOR,
                                              PROJCRAFT_MAX / GOAL_NUM_FACTOR + 1) * GOAL_NUM_FACTOR;
                coinReward = (int)(numGoal * PROJCRAFT_COINS);
                List <ProjectileType> allProjectiles = GameInfo.ProjectilesAllowed;
                ProjectileType        type           = allProjectiles
                                                       .Where(x => GameInfo.CanSee(user, x))
                                                       .ToList()
                                                       .Exclude(ProjectileType.None)
                                                       .Random();
                typeId = Utilities.Rand.Next(0, allProjectiles.IndexOf(type));
                break;

            case QuestGoalType.FireProjectiles:
                numGoal = Utilities.Rand.Next(PROJFIRE_MIN / GOAL_NUM_FACTOR,
                                              PROJFIRE_MAX / GOAL_NUM_FACTOR + 1) * GOAL_NUM_FACTOR;
                coinReward     = (int)(numGoal * PROJFIRE_COINS);
                allProjectiles = GameInfo.ProjectilesAllowed;
                type           = allProjectiles
                                 .Where(x => GameInfo.CanSee(user, x))
                                 .ToList()
                                 .Exclude(ProjectileType.None)
                                 .Random();
                typeId = Utilities.Rand.Next(0, allProjectiles.IndexOf(type));
                break;

            case QuestGoalType.KillAliens:
                numGoal = Utilities.Rand.Next(ALIENKILL_MIN / GOAL_NUM_FACTOR,
                                              ALIENKILL_MAX / GOAL_NUM_FACTOR + 1) * GOAL_NUM_FACTOR;
                coinReward = (int)(numGoal * ALIENKILL_COINS);
                List <BasicAlienTypes> allAliens = Enum.GetValues(typeof(BasicAlienTypes)).Cast <BasicAlienTypes>().ToList();
                BasicAlienTypes        alienType = allAliens
                                                   .Where(x => GameInfo.CanSee(user, x))
                                                   .ToList()
                                                   .Exclude(BasicAlienTypes.Boss)
                                                   .Random();
                typeId = Utilities.Rand.Next(0, allAliens.IndexOf(alienType));
                break;

            case QuestGoalType.ObtainCoins:
                numGoal = Utilities.Rand.Next(COINGET_MIN / GOAL_NUM_FACTOR,
                                              COINGET_MAX / GOAL_NUM_FACTOR + 1) * GOAL_NUM_FACTOR;
                coinReward = (int)(numGoal * COINGET_COINS);
                break;

            case QuestGoalType.SpendCoins:
                numGoal = Utilities.Rand.Next(COINSPEND_MIN / GOAL_NUM_FACTOR,
                                              COINSPEND_MAX / GOAL_NUM_FACTOR + 1) * GOAL_NUM_FACTOR;
                coinReward = (int)(numGoal * COINSPEND_COINS);
                break;
            }
            return(new Quest(goalType, typeId, numGoal, coinReward));
        }