public async Task <List <JobTreantNodeViewModel> > GetJobTreeDataAsync(string gender)
        {
            List <JobTreantNodeViewModel> viewModels = new List <JobTreantNodeViewModel>();

            using (FFTContext context = new FFTContext())
            {
                List <Job> jobs = await context.Jobs.Where(m => !m.PspName.Contains("1")).ToListAsync();

                foreach (Job job in jobs)
                {
                    viewModels.Add(new JobTreantNodeViewModel
                    {
                        RequiredGender = job.IsMaleOnly ? "Male" : job.IsFemaleOnly ? "Female" : "",
                        ImagePath      = $"/img/Jobs/{(Enum.GetName(typeof(Enums.Jobs), job.JobId).Contains("Onion") ? "OnionKnight" : Enum.GetName(typeof(Enums.Jobs), job.JobId))}_" +
                                         $"{(job.PspName.Contains("Dancer") ? "Female" : job.PspName.Contains("Bard") ? "Male" : gender)}_Standing.png",
                        JobName              = job.PspName.Contains("Onion") ? "Onion Knight" : job.PspName,
                        IdentifierName       = job.PspName.Contains("Onion") ? "onionknight" : job.PspName.Replace(" ", "").ToLower(),
                        JobPrerequisiteNames = job.Jobprerequisites.Select(m => (m.JobLevelRequiredPsp > -1 ? $"Level {m.JobLevelRequiredPsp} " : "Mastered ") + $"{jobs.Single(c => c.JobId == m.JobRequiredId).PspName}").ToList()
                    });
                }
                ;

                viewModels.Single(m => m.JobName.Contains("Dark")).JobPrerequisiteNames.Add("Crystallize 20 Units");
            }

            return(viewModels);
        }
        public async Task <List <ItemOverviewViewModel> > GetItemSelectionDataAsync(int ItemCategoryId)
        {
            List <ItemOverviewViewModel> items = new List <ItemOverviewViewModel>();

            using (FFTContext context = new FFTContext())
            {
                items.AddRange(await context.Items.Where(m => m.ItemCategoryId == ItemCategoryId).Select(c => new ItemOverviewViewModel
                {
                    ItemID = c.ItemId,
                    EquipmentCategoryID    = c.ItemCategory.EquipmentCategoryId,
                    EquipmentCategoryName  = c.ItemCategory.EquipmentCategoryName.ToLower(),
                    ItemCategoryID         = ItemCategoryId,
                    AccessoryMagicalEvade  = (c.ItemCategoryId == (int)Enums.ItemCategoriesList.Cloak ? c.MagicalEvade ?? 0 : 0).ToString(),
                    AccessoryPhysicalEvade = (c.ItemCategoryId == (int)Enums.ItemCategoriesList.Cloak ? c.PhysicalEvade ?? 0 : 0).ToString(),
                    HPBonus             = (c.HPBonus ?? 0),
                    MPBonus             = (c.MPBonus ?? 0),
                    MoveBonus           = (c.MoveBoost ?? 0),
                    JumpBonus           = (c.JumpBoost ?? 0),
                    SpeedBonus          = (c.SpeedBoost ?? 0),
                    ShieldPhysicalEvade = (c.ItemCategoryId == (int)Enums.ItemCategoriesList.Shield ? c.PhysicalEvade ?? 0 : 0).ToString(),
                    ShieldMagicalEvade  = (c.ItemCategoryId == (int)Enums.ItemCategoriesList.Shield ? c.MagicalEvade ?? 0 : 0).ToString(),
                    PhysicalAttackPower = (c.PhysicalAttackBoost ?? 0).ToString(),
                    MagicalAttackPower  = (c.MagicAttackBoost ?? 0).ToString(),
                    Name        = c.PspName,
                    WeaponPower = (c.AttackPower ?? 0).ToString(),
                    WeaponHit   = (c.HitPercentage ?? 0).ToString(),
                    ImagePath   = (c.ItemCategory.EquipmentCategoryId == (int)Enums.EquipmentCategoriesList.Weapon ? @"/img/Item_Icons/Weapons/" : c.ItemCategory.EquipmentCategoryId > (int)Enums.EquipmentCategoriesList.Weapon &&
                                   c.ItemCategory.EquipmentCategoryId < (int)Enums.EquipmentCategoriesList.Accessory ? @"/img/Item_Icons/Armour/" : @"/img/Item_Icons/Accessories/") + c.IconFileName
                }).ToListAsync());
            }

            return(items);
        }
        public ActionResult GetUnitItemLookupPartial(int jobID, int equipmentCategoryID, bool isFemale)
        {
            List <UnitItemLookupViewModel> items = new List <UnitItemLookupViewModel>();

            using (FFTContext context = new FFTContext())
            {
                if (equipmentCategoryID != (int)EquipmentCategoriesList.Accessory)
                {
                    Job unitJob = context.Jobs.Single(m => m.JobID == jobID);

                    items.AddRange(unitJob.JobItems.Where(m => m.ItemCategory.EquipmentCategoryID == equipmentCategoryID).Select(m => new UnitItemLookupViewModel
                    {
                        ItemCategoryID        = m.ItemCategoryID,
                        ItemCategoryName      = m.ItemCategory.ItemCategoryName,
                        StartingItemImagePath = m.ItemCategory.StartingItemImagePath
                    }));
                }
                else
                {
                    items.AddRange(context.ItemCategories.Where(m => m.EquipmentCategoryID == equipmentCategoryID && (!isFemale ? m.IsFemaleOnly == false : true)).Select(m => new UnitItemLookupViewModel
                    {
                        ItemCategoryID        = m.ItemCategoryID,
                        ItemCategoryName      = m.ItemCategoryName,
                        StartingItemImagePath = m.StartingItemImagePath
                    }));
                }
            }

            return(PartialView("~/Views/Home/_UnitItemLookupPartial.cshtml", items));
        }
        public async Task <List <UnitItemLookupViewModel> > GetUnitItemLookupDataAsync(int JobId, int EquipmentCategoryId, bool isFemale)
        {
            List <UnitItemLookupViewModel> items = new List <UnitItemLookupViewModel>();

            using (FFTContext context = new FFTContext())
            {
                if (EquipmentCategoryId != (int)Enums.EquipmentCategoriesList.Accessory)
                {
                    Job unitJob = await context.Jobs.SingleAsync(m => m.JobId == JobId);

                    items.AddRange(unitJob.Jobitems.Where(m => m.ItemCategory.EquipmentCategoryId == EquipmentCategoryId).Select(m => new UnitItemLookupViewModel
                    {
                        ItemCategoryID        = m.ItemCategoryId,
                        ItemCategoryName      = m.ItemCategory.ItemCategoryName,
                        StartingItemImagePath = m.ItemCategory.StartingItemImagePath
                    }));
                }
                else
                {
                    items.AddRange(await context.ItemCategories.Where(m => m.EquipmentCategoryId == EquipmentCategoryId && (!isFemale ? m.IsFemaleOnly : true)).Select(m => new UnitItemLookupViewModel
                    {
                        ItemCategoryID        = m.ItemCategoryId,
                        ItemCategoryName      = m.ItemCategoryName,
                        StartingItemImagePath = m.StartingItemImagePath
                    }).ToListAsync());
                }
            }

            return(items);
        }
        public ActionResult GetUnitDismissPartial(UnitDismissViewModel unit)
        {
            using (FFTContext context = new FFTContext())
            {
                unit.Quote = context.Quotes.OrderBy(m => Guid.NewGuid()).FirstOrDefault(m => m.Gender == unit.Gender).Text;
            }

            unit.JobName = Enum.GetName(typeof(Jobs), unit.JobID);
            unit.JobName = unit.JobName.Contains("Onion") ? "Onion Knight" : unit.JobName;

            return(PartialView("~/Views/Home/_UnitDismissPartial.cshtml", unit));
        }
        public async Task <ItemDetailsViewModel> GetItemDetailsDataAsync(int ItemId)
        {
            ItemDetailsViewModel itemDetails;

            using (FFTContext context = new FFTContext())
            {
                Item item = await context.Items.SingleAsync(m => m.ItemId == ItemId);

                itemDetails = new ItemDetailsViewModel
                {
                    ItemID                  = item.ItemId,
                    AcquiredViaCatch        = item.AcquiredViaCatch,
                    AcquiredViaInitialEquip = item.AcquiredViaInitialEquip,
                    AcquiredViaLocation     = item.AcquiredViaLocation,
                    AcquiredViaMode         = item.AcquiredViaMode,
                    AcquiredViaPoach        = item.AcquiredViaPoach,
                    AcquiredViaSteal        = item.AcquiredViaSteal,
                    AcquiredViaTreasureHunt = item.AcquiredViaTreasureHunt,
                    AttackPower             = item.AttackPower?.ToString("D3") ?? "0",
                    Cost              = item.Cost,
                    Description       = item.Description,
                    Element           = AttributeCalculatorService.GetElementSVGLocations(item.Element),
                    ElementAbsorbed   = AttributeCalculatorService.GetElementSVGLocations(item.ElementAbsorbed),
                    ElementBoosted    = AttributeCalculatorService.GetElementSVGLocations(item.ElementBoosted),
                    ElementHalved     = AttributeCalculatorService.GetElementSVGLocations(item.ElementHalved),
                    ElementNegated    = AttributeCalculatorService.GetElementSVGLocations(item.ElementNegated),
                    ElementWeakness   = AttributeCalculatorService.GetElementSVGLocations(item.ElementWeakness),
                    EquipStatusEffect = AttributeCalculatorService.GetEffectSVGLocations(item.EquipStatusEffect),
                    HitPercentage     = item.HitPercentage?.ToString("D2") ?? "0",
                    HitStatusEffect   = AttributeCalculatorService.GetEffectSVGLocations(item.HitStatusEffect),
                    HPBonus           = item.HPBonus?.ToString() ?? "0",
                    ImagePath         = (item.ItemCategory.EquipmentCategoryId == (int)Enums.EquipmentCategoriesList.Weapon ? @"/img/Item_Icons/Weapons/" : item.ItemCategory.EquipmentCategoryId > (int)Enums.EquipmentCategoriesList.Weapon &&
                                         item.ItemCategory.EquipmentCategoryId < (int)Enums.EquipmentCategoriesList.Accessory ? @"/img/Item_Icons/Armour/" : @"/img/Item_Icons/Accessories/") + item.IconFileName,
                    ImmuneStatusEffect = AttributeCalculatorService.GetEffectSVGLocations(item.ImmuneStatusEffect),
                    JumpBoost          = item.JumpBoost?.ToString() ?? "0",
                    MagicalEvade       = item.MagicalEvade?.ToString() ?? "0",
                    MagicAttackBoost   = item.MagicAttackBoost?.ToString() ?? "0",
                    MoveBoost          = item.MoveBoost?.ToString() ?? "0",
                    MPBonus            = item.MPBonus?.ToString() ?? "0",
                    Name = item.PspName,
                    PhysicalAttackBoost = item.PhysicalAttackBoost?.ToString() ?? "0",
                    PhysicalEvade       = item.PhysicalEvade?.ToString() ?? "0",
                    RemoveStatusEffect  = AttributeCalculatorService.GetEffectSVGLocations(item.RemoveStatusEffect),
                    SpeedBoost          = item.SpeedBoost?.ToString() ?? "0",
                    SpellEffect         = AttributeCalculatorService.GetEffectSVGLocations(item.SpellEffect),
                    ItemCategoryName    = item.ItemCategory.ItemCategoryName
                };
            }

            return(itemDetails);
        }
        public async Task <UnitDismissViewModel> GetUnitDismissDataAsync(UnitDismissViewModel unit)
        {
            using (FFTContext context = new FFTContext())
            {
                Random random     = new Random();
                int    quoteCount = context.Quotes.Count(m => m.Gender == unit.Gender);
                unit.Quote = await context.Quotes.Skip(random.Next(quoteCount)).Select(m => m.Text).FirstAsync();
            }

            unit.JobName         = Enum.GetName(typeof(Enums.Jobs), unit.JobID);
            unit.JobName         = unit.JobName.Contains("Onion") ? "Onion Knight" : unit.JobName;
            unit.JobPortraitPath = String.Format("/img/Jobs/{0}_{1}_Portrait.png", unit.JobName.Contains("Onion") ? "OnionKnight" : unit.JobName, unit.GenderName);

            return(unit);
        }
        public ActionResult GetItemDetailsPartial(int itemID)
        {
            using (FFTContext context = new FFTContext())
            {
                Item item = context.Items.Single(m => m.ItemID == itemID);
                ItemDetailsViewModel itemDetails = new ItemDetailsViewModel
                {
                    ItemID                  = item.ItemID,
                    AcquiredViaCatch        = item.AcquiredViaCatch,
                    AcquiredViaInitialEquip = item.AcquiredViaInitialEquip,
                    AcquiredViaLocation     = item.AcquiredViaLocation,
                    AcquiredViaMode         = item.AcquiredViaMode,
                    AcquiredViaPoach        = item.AcquiredViaPoach,
                    AcquiredViaSteal        = item.AcquiredViaSteal,
                    AcquiredViaTreasureHunt = item.AcquiredViaTreasureHunt,
                    AttackPower             = item.AttackPower?.ToString("D3") ?? "0",
                    Cost              = item.Cost,
                    Description       = item.Description,
                    Element           = AttributeCalculator.GetElementSVGLocations(item.Element),
                    ElementAbsorbed   = AttributeCalculator.GetElementSVGLocations(item.ElementAbsorbed),
                    ElementBoosted    = AttributeCalculator.GetElementSVGLocations(item.ElementBoosted),
                    ElementHalved     = AttributeCalculator.GetElementSVGLocations(item.ElementHalved),
                    ElementNegated    = AttributeCalculator.GetElementSVGLocations(item.ElementNegated),
                    ElementWeakness   = AttributeCalculator.GetElementSVGLocations(item.ElementWeakness),
                    EquipStatusEffect = AttributeCalculator.GetEffectSVGLocations(item.EquipStatusEffect),
                    HitPercentage     = item.HitPercentage?.ToString("D2") ?? "0",
                    HitStatusEffect   = AttributeCalculator.GetEffectSVGLocations(item.HitStatusEffect),
                    HPBonus           = item.HPBonus?.ToString() ?? "0",
                    ImagePath         = (item.ItemCategory.EquipmentCategoryID == (int)EquipmentCategoriesList.Weapon ? @"/Content/Images/Item_Icons/Weapons/" : item.ItemCategory.EquipmentCategoryID > (int)EquipmentCategoriesList.Weapon &&
                                         item.ItemCategory.EquipmentCategoryID < (int)EquipmentCategoriesList.Accessory ? @"/Content/Images/Item_Icons/Armour/" : @"/Content/Images/Item_Icons/Accessories/") + item.IconFileName,
                    ImmuneStatusEffect = AttributeCalculator.GetEffectSVGLocations(item.ImmuneStatusEffect),
                    JumpBoost          = item.JumpBoost?.ToString() ?? "0",
                    MagicalEvade       = item.MagicalEvade?.ToString() ?? "0",
                    MagicAttackBoost   = item.MagicAttackBoost?.ToString() ?? "0",
                    MoveBoost          = item.MoveBoost?.ToString() ?? "0",
                    MPBonus            = item.MPBonus?.ToString() ?? "0",
                    Name = item.PspName,
                    PhysicalAttackBoost = item.PhysicalAttackBoost?.ToString() ?? "0",
                    PhysicalEvade       = item.PhysicalEvade?.ToString() ?? "0",
                    RemoveStatusEffect  = AttributeCalculator.GetEffectSVGLocations(item.RemoveStatusEffect),
                    SpeedBoost          = item.SpeedBoost?.ToString() ?? "0",
                    SpellEffect         = AttributeCalculator.GetEffectSVGLocations(item.SpellEffect),
                    ItemCategoryName    = item.ItemCategory.ItemCategoryName
                };

                return(PartialView("~/Views/Home/_UnitItemDetailsPartial.cshtml", itemDetails));
            }
        }
        public ActionResult GetJobTreePartial(string gender)
        {
            Dictionary <string, List <JobTreantNodeViewModel> > viewModels = new Dictionary <string, List <JobTreantNodeViewModel> >();

            using (FFTContext context = new FFTContext())
            {
                List <Job> jobs = context.Jobs.ToList();

                foreach (Job job in jobs)
                {
                    viewModels.Add(job.PspName, new List <JobTreantNodeViewModel>
                    {
                        new JobTreantNodeViewModel
                        {
                            RequiredGender = job.IsMaleOnly ? "Male" : job.IsFemaleOnly ? "Female" : "",
                            ImagePath      = $"/Content/Images/Jobs/{(Enum.GetName(typeof(Jobs), job.JobID).Contains("Onion") ? "OnionKnight" : Enum.GetName(typeof(Jobs), job.JobID))}_" +
                                             $"{(job.PspName.Contains("Dancer") ? "Female" : job.PspName.Contains("Bard") ? "Male" : gender)}_Standing.png",
                            JobName = job.PspName,
                            JobPrerequisiteNames = job.JobPrerequisites.Select(m => (m.JobLevelRequiredPsp > -1 ? $"Level {m.JobLevelRequiredPsp} " : "Mastered ") + $"{jobs.Single(c => c.JobID == m.JobRequiredID).PspName}").ToList()
                        }
                    });
                    if (job.JobPrerequisites.Count > 0)
                    {
                        viewModels.Add(job.PspName + "Pre", job.JobPrerequisites.Select(m => new JobTreantNodeViewModel
                        {
                            ImagePath            = $"/Content/Images/Jobs/{(Enum.GetName(typeof(Jobs), m.JobRequiredID).Contains("Onion") ? "OnionKnight" : Enum.GetName(typeof(Jobs), m.JobRequiredID))}_{gender}_Standing.png",
                            JobName              = jobs.Single(c => c.JobID == m.JobRequiredID).PspName,
                            RequiredJobLevelPath = m.JobLevelRequiredPsp > 0 ? $"/Content/Images/number_{m.JobLevelRequiredPsp}.png" : $"/Content/Images/star.png",
                            JobPrerequisiteNames = jobs.Single(c => m.JobRequiredID == c.JobID).JobPrerequisites.Select(x => $"Level {x.JobLevelRequiredPsp} {jobs.Single(v => v.JobID == x.JobRequiredID).PspName}").ToList()
                        }).ToList());
                    }
                }
            }

            return(PartialView("~/Views/Home/_JobTreePartial.cshtml", viewModels));
        }
        public async Task <UnitDetailsViewModel> PopulateNewUnitDataAsync(int JobId, int gender, int position)
        {
            UnitDetailsViewModel unit;
            Item   weaponItem1 = null, weaponItem2 = null, headItem = null, bodyItem = null;
            Random r = new Random();

            using (FFTContext context = new FFTContext())
            {
                Job unitJob = await context.Jobs.SingleAsync(m => m.JobId == JobId);

                int nameCount = context.UnitNames.Count(m => m.Gender == gender);

                unit = new UnitDetailsViewModel
                {
                    Unit = new UnitOverviewViewModel
                    {
                        UnitName = await context.UnitNames.Where(m => m.Gender == gender).Skip(r.Next(nameCount)).Select(m => m.Name).FirstAsync()
                    }
                };

                unit.Unit.JobID        = JobId;
                unit.Unit.JobName      = Enum.GetName(typeof(Enums.Jobs), JobId);
                unit.Unit.Gender       = gender;
                unit.Unit.GenderName   = Enum.GetName(typeof(Enums.Gender), gender);
                unit.Unit.Position     = position;
                unit.Unit.Level        = 1;
                unit.Unit.Experience   = r.Next(0, 99);
                unit.Unit.Brave        = r.Next(40, 70);
                unit.Unit.Faith        = r.Next(40, 70);
                unit.RawHP             = gender == 0 ? r.Next(491520, 524287) : gender == 1 ? r.Next(458752, 491519) : r.Next(573440, 622591);
                unit.RawMP             = gender == 0 ? r.Next(229376, 245759) : gender == 1 ? r.Next(245760, 262143) : r.Next(98304, 147455);
                unit.RawPhysicalAttack = gender == 0 ? 81920 : gender == 1 ? 65536 : r.Next(81920, 98303);
                unit.RawMagicalAttack  = gender == 0 ? 65536 : gender == 1 ? 81920 : r.Next(81920, 98303);
                unit.RawSpeed          = gender == 0 ? 98304 : gender == 1 ? 98304 : 81920;

                List <ItemCategoryViewModel> jobItems = await context.JobItems.Where(m => m.JobId == unit.Unit.JobID).Select(m => new ItemCategoryViewModel
                {
                    EquipmentCategoryID = m.ItemCategory.EquipmentCategoryId,
                    ItemCategoryID      = m.ItemCategoryId
                }).ToListAsync();

                if (jobItems.Any(m => m.EquipmentCategoryID == (int)Enums.EquipmentCategoriesList.Weapon))
                {
                    int randomWeaponID = jobItems.FirstOrDefault(m => m.EquipmentCategoryID == (int)Enums.EquipmentCategoriesList.Weapon).ItemCategoryID;
                    weaponItem1 = jobItems.Any(m => m.EquipmentCategoryID == (int)Enums.EquipmentCategoriesList.Weapon) ? context.Items.FirstOrDefault(m => m.ItemCategoryId ==
                                                                                                                                                       randomWeaponID && m.IsStartingItem) : null;
                    unit.WeaponID = weaponItem1 != null ? weaponItem1.ItemId : 0;
                    unit.ShieldID = JobId == (int)Enums.Jobs.Ninja ? unit.WeaponID : 0;
                }

                if (jobItems.Any(m => m.EquipmentCategoryID == (int)Enums.EquipmentCategoriesList.Shield))
                {
                    int randomShieldID = jobItems.FirstOrDefault(m => m.EquipmentCategoryID == (int)Enums.EquipmentCategoriesList.Shield).ItemCategoryID;
                    weaponItem2 = jobItems.Any(m => m.EquipmentCategoryID == (int)Enums.EquipmentCategoriesList.Shield) ? context.Items.FirstOrDefault(m => m.ItemCategoryId ==
                                                                                                                                                       randomShieldID && m.IsStartingItem) : null;
                    unit.ShieldID = weaponItem2 != null ? weaponItem2.ItemId : 0;
                }

                if (jobItems.Any(m => m.EquipmentCategoryID == (int)Enums.EquipmentCategoriesList.Helmet))
                {
                    int randomHeadID = jobItems.FirstOrDefault(m => m.EquipmentCategoryID == (int)Enums.EquipmentCategoriesList.Helmet).ItemCategoryID;
                    headItem = jobItems.Any(m => m.EquipmentCategoryID == (int)Enums.EquipmentCategoriesList.Helmet) ? context.Items.Where(c => c.ItemCategoryId == randomHeadID)
                               .FirstOrDefault(m => m.IsStartingItem) : null;
                    unit.HeadID = headItem != null ? headItem.ItemId : 0;
                }

                if (jobItems.Any(m => m.EquipmentCategoryID == (int)Enums.EquipmentCategoriesList.Armor))
                {
                    int randomBodyID = jobItems.FirstOrDefault(m => m.EquipmentCategoryID == (int)Enums.EquipmentCategoriesList.Armor).ItemCategoryID;
                    bodyItem = jobItems.Any(m => m.EquipmentCategoryID == (int)Enums.EquipmentCategoriesList.Armor) ? context.Items.FirstOrDefault(m => m.ItemCategoryId ==
                                                                                                                                                   randomBodyID && m.IsStartingItem) : null;
                    unit.BodyID = bodyItem != null ? bodyItem.ItemId : 0;
                }

                unit.Resistances = new UnitResistAndImmunityViewModel();
                unit             = AttributeCalculatorService.CalculateHPAndMP(headItem, bodyItem, unit, unitJob);
                unit             = AttributeCalculatorService.CalculateBasicStats(weaponItem1, weaponItem2, headItem, bodyItem, null, unit, unitJob);
                unit             = AttributeCalculatorService.CalculateEvasionStats(weaponItem2, null, unitJob, unit);
                unit             = AttributeCalculatorService.CalculateResistancesAndImmunities(new List <Item> {
                    weaponItem1, weaponItem2, headItem, bodyItem
                }, unit);
                unit.PrimaryAbilityJobID = unit.Unit.JobID;
                unit.PrimaryAbilityName  = unitJob.AbilitySetPspName;
            }

            return(unit);
        }
        public async Task <List <JobOverviewViewModel> > GetJobSelectionDataAsync(int genderID)
        {
            List <JobOverviewViewModel> viewModels;
            JobOverviewRangeViewModel   rangeViewModel;
            string genderName = Enum.GetName(typeof(Enums.Gender), genderID);

            using (FFTContext context = new FFTContext())
            {
                viewModels = await context.Jobs.Where(m => genderID == 0? !m.IsFemaleOnly : !m.IsMaleOnly).Select(m => new JobOverviewViewModel
                {
                    JobID                             = m.JobId,
                    FileName                          = (m.PspName.Contains("(") ? m.PspName.Remove(m.PspName.IndexOf("(")) : m.PspName).Replace(" ", ""),
                    DisplayName                       = m.PspName,
                    GenderID                          = genderID,
                    Gender                            = genderName,
                    HPMultiplier                      = m.HPMultiplier,
                    HPGrowthConstant                  = m.HPGrowthConstant,
                    HPGrowthConstantLabel             = m.HPGrowthConstant,
                    MPMultiplier                      = m.MPMultiplier,
                    MPGrowthConstant                  = m.MPGrowthConstant,
                    MPGrowthConstantLabel             = m.MPGrowthConstant,
                    SpeedMulitplier                   = m.SpeedMulitplier,
                    SpeedGrowthConstant               = m.SpeedGrowthConstant,
                    SpeedGrowthConstantLabel          = m.SpeedGrowthConstant,
                    PhysicalAttackMultiplier          = m.PhysicalAttackMultiplier,
                    PhysicalAttackGrowthConstant      = m.PhysicalAttackGrowthConstant,
                    PhysicalAttackGrowthConstantLabel = m.PhysicalAttackGrowthConstant,
                    MagicalAttackMultiplier           = m.MagicalAttackMultiplier,
                    MagicalAttackGrowthConstant       = m.MagicalAttackGrowthConstant,
                    MagicalAttackGrowthConstantLabel  = m.MagicalAttackGrowthConstant,
                    BaseMoveLength                    = m.BaseMoveLength,
                    BaseJumpHeight                    = m.BaseJumpHeight,
                    BaseCombatEvasion                 = m.BaseCombatEvasion
                }).ToListAsync();

                rangeViewModel = new JobOverviewRangeViewModel
                {
                    HPGrowthConstantMax             = context.Jobs.Max(c => c.HPGrowthConstant),
                    HPGrowthConstantMin             = context.Jobs.Min(c => c.HPGrowthConstant),
                    MPGrowthConstantMax             = context.Jobs.Max(c => c.MPGrowthConstant),
                    MPGrowthConstantMin             = context.Jobs.Min(c => c.MPGrowthConstant),
                    SpeedGrowthConstantMax          = context.Jobs.Max(c => c.SpeedGrowthConstant),
                    SpeedGrowthConstantMin          = context.Jobs.Min(c => c.SpeedGrowthConstant),
                    PhysicalAttackGrowthConstantMax = context.Jobs.Max(c => c.PhysicalAttackGrowthConstant),
                    PhysicalAttackGrowthConstantMin = context.Jobs.Min(c => c.PhysicalAttackGrowthConstant),
                    MagicalAttackGrowthConstantMax  = context.Jobs.Max(c => c.MagicalAttackGrowthConstant),
                    MagicalAttackGrowthConstantMin  = context.Jobs.Min(c => c.MagicalAttackGrowthConstant)
                };

                int commonDenominator = (new int[] { rangeViewModel.HPGrowthConstantMax, rangeViewModel.MPGrowthConstantMax, rangeViewModel.SpeedGrowthConstantMax,
                                                     rangeViewModel.PhysicalAttackGrowthConstantMax, rangeViewModel.MagicalAttackGrowthConstantMax }).Max();
                rangeViewModel.HPGrowthConstantMultiplier             = (float)commonDenominator / (float)rangeViewModel.HPGrowthConstantMax;
                rangeViewModel.MPGrowthConstantMultiplier             = (float)commonDenominator / (float)rangeViewModel.MPGrowthConstantMax;
                rangeViewModel.SpeedGrowthConstantMultiplier          = (float)commonDenominator / (float)rangeViewModel.SpeedGrowthConstantMax;
                rangeViewModel.PhysicalAttackGrowthConstantMultiplier = (float)commonDenominator / (float)rangeViewModel.PhysicalAttackGrowthConstantMax;
                rangeViewModel.MagicalAttackGrowthConstantMultiplier  = (float)commonDenominator / (float)rangeViewModel.MagicalAttackGrowthConstantMax;

                foreach (JobOverviewViewModel viewModel in viewModels)
                {
                    viewModel.HPGrowthConstant = (int)((rangeViewModel.HPGrowthConstantMax + rangeViewModel.HPGrowthConstantMin - viewModel.HPGrowthConstant) *
                                                       rangeViewModel.HPGrowthConstantMultiplier);
                    viewModel.MPGrowthConstant = (int)((rangeViewModel.MPGrowthConstantMax + rangeViewModel.MPGrowthConstantMin - viewModel.MPGrowthConstant) *
                                                       rangeViewModel.MPGrowthConstantMultiplier);
                    viewModel.SpeedGrowthConstant = (int)((rangeViewModel.SpeedGrowthConstantMax + rangeViewModel.SpeedGrowthConstantMin - viewModel.SpeedGrowthConstant) *
                                                          rangeViewModel.SpeedGrowthConstantMultiplier);
                    viewModel.PhysicalAttackGrowthConstant = (int)((rangeViewModel.PhysicalAttackGrowthConstantMax + rangeViewModel.PhysicalAttackGrowthConstantMin -
                                                                    viewModel.PhysicalAttackGrowthConstant) * rangeViewModel.PhysicalAttackGrowthConstantMultiplier);
                    viewModel.MagicalAttackGrowthConstant = (int)((rangeViewModel.MagicalAttackGrowthConstantMax + rangeViewModel.MagicalAttackGrowthConstantMin -
                                                                   viewModel.MagicalAttackGrowthConstant) * rangeViewModel.MagicalAttackGrowthConstantMultiplier);
                }
            }

            return(viewModels);
        }
        public async Task <UnitDetailsViewModel> GetUnitStatsDetailDataAsync(UnitDetailsViewModel unit, int?ItemId = null)
        {
            Item        weaponItem1 = null, weaponItem2 = null, headItem = null, bodyItem = null, accessoryItem = null;
            List <Item> items = new List <Item>();

            unit.Unit.JobName         = Enum.GetName(typeof(Enums.Jobs), unit.Unit.JobID);
            unit.Unit.JobName         = unit.Unit.JobName.Contains("Onion") ? "Onion Knight" : unit.Unit.JobName;
            unit.Unit.JobPortraitPath = String.Format("/img/Jobs/{0}_{1}_Portrait.png", unit.Unit.JobName.Contains("Onion") ? "OnionKnight" : unit.Unit.JobName, unit.Unit.GenderName);
            unit.Unit.JobName         = string.Concat(unit.Unit.JobName.Select(m => Char.IsUpper(m) ? " " + m : m.ToString())).Trim();
            unit.Unit.GenderName      = Enum.GetName(typeof(Enums.Gender), unit.Unit.Gender);

            using (FFTContext context = new FFTContext())
            {
                if (ItemId != null)
                {
                    int  categoryListLength = Enum.GetNames(typeof(Enums.EquipmentCategoriesList)).Length;
                    Item selectedItem       = await context.Items.SingleAsync(m => m.ItemId == ItemId);

                    switch ((Enums.EquipmentCategoriesList)selectedItem.ItemCategory.EquipmentCategoryId)
                    {
                    case Enums.EquipmentCategoriesList.Weapon:
                        unit.WeaponID = selectedItem.ItemId;
                        break;

                    case Enums.EquipmentCategoriesList.Shield:
                        unit.ShieldID = selectedItem.ItemId;
                        break;

                    case Enums.EquipmentCategoriesList.Helmet:
                        unit.HeadID = selectedItem.ItemId;
                        break;

                    case Enums.EquipmentCategoriesList.Armor:
                        unit.BodyID = selectedItem.ItemId;
                        break;

                    case Enums.EquipmentCategoriesList.Accessory:
                        unit.AccessoryID = selectedItem.ItemId;
                        break;
                    }
                }

                if (unit.WeaponID != default(int))
                {
                    weaponItem1 = await context.Items.SingleAsync(m => m.ItemId == unit.WeaponID);

                    unit.WeaponRight = new ItemOverviewViewModel
                    {
                        WeaponPower         = weaponItem1.ItemCategory.EquipmentCategoryId == (int)Enums.EquipmentCategoriesList.Weapon ? weaponItem1.AttackPower.Value.ToString("D3") : "000",
                        WeaponHit           = weaponItem1.ItemCategory.EquipmentCategoryId == (int)Enums.EquipmentCategoriesList.Weapon ? weaponItem1.HitPercentage.Value.ToString("D3") : "000",
                        ShieldPhysicalEvade = weaponItem1.ItemCategory.EquipmentCategoryId == (int)Enums.EquipmentCategoriesList.Shield ? weaponItem1.PhysicalEvade.Value.ToString("D2") : "00",
                        ShieldMagicalEvade  = weaponItem1.ItemCategory.EquipmentCategoryId == (int)Enums.EquipmentCategoriesList.Shield ? weaponItem1.MagicalEvade.Value.ToString("D2") : "00",
                        PhysicalAttackPower = weaponItem1.PhysicalAttackBoost.HasValue ? weaponItem1.PhysicalAttackBoost.Value.ToString("D2") : "00",
                        MagicalAttackPower  = weaponItem1.MagicAttackBoost.HasValue ? weaponItem1.MagicAttackBoost.Value.ToString("D2") : "00",
                        ImagePath           = weaponItem1.ItemCategory.EquipmentCategoryId == (int)Enums.EquipmentCategoriesList.Weapon ? @"/img/Item_Icons/Weapons/" +
                                              weaponItem1.IconFileName : @"/img/Item_Icons/Armour/" + weaponItem1.IconFileName,
                        Name = weaponItem1.PspName,
                    };

                    items.Add(weaponItem1);
                }
                else
                {
                    unit.WeaponRight = new ItemOverviewViewModel();
                }

                if (unit.ShieldID != default && weaponItem1.ItemCategory.IsTwoHandOnly)
                {
                    weaponItem2 = await context.Items.SingleAsync(m => m.ItemId == unit.ShieldID);

                    unit.WeaponLeft = new ItemOverviewViewModel
                    {
                        WeaponPower = weaponItem2 != null ? weaponItem2.ItemCategory.EquipmentCategoryId == (int)Enums.EquipmentCategoriesList.Weapon ?
                                      weaponItem2.AttackPower.HasValue ? weaponItem2.AttackPower.Value.ToString("D3") : "000" : "000" : "000",
                        WeaponHit = weaponItem2 != null ? weaponItem2.ItemCategory.EquipmentCategoryId == (int)Enums.EquipmentCategoriesList.Weapon ?
                                    weaponItem2.HitPercentage.HasValue ? weaponItem2.HitPercentage.Value.ToString("D3") : "000" : "000" : "000",
                        ShieldPhysicalEvade = weaponItem2 != null ? weaponItem2.ItemCategory.EquipmentCategoryId == (int)Enums.EquipmentCategoriesList.Shield ?
                                              weaponItem2.PhysicalEvade.HasValue ? weaponItem2.PhysicalEvade.Value.ToString("D3") : "00" : "00" : "00",
                        ShieldMagicalEvade = weaponItem2 != null ? weaponItem2.ItemCategory.EquipmentCategoryId == (int)Enums.EquipmentCategoriesList.Shield ?
                                             weaponItem2.MagicalEvade.HasValue ? weaponItem2.MagicalEvade.Value.ToString("D3") : "00" : "00" : "00",
                        PhysicalAttackPower = weaponItem2 != null?weaponItem2.PhysicalAttackBoost.HasValue?weaponItem2.PhysicalAttackBoost.Value.ToString("D2") : "00" : "00",
                                                  MagicalAttackPower = weaponItem2 != null?weaponItem2.MagicAttackBoost.HasValue?weaponItem2.MagicAttackBoost.Value.ToString("D2") : "00" : "00",
                                                                           ImagePath = weaponItem2 != null ? weaponItem2.ItemCategory.EquipmentCategoryId == (int)Enums.EquipmentCategoriesList.Weapon ? @"/img/Item_Icons/Weapons/" +
                                                                                       weaponItem2.IconFileName : @"/img/Item_Icons/Armour/" + weaponItem2.IconFileName : "",
                                                                           Name = weaponItem2 != null ? weaponItem2.PspName : "",
                    };

                    items.Add(weaponItem2);
                }
                else
                {
                    unit.WeaponLeft = new ItemOverviewViewModel();
                }

                if (unit.HeadID != default(int))
                {
                    headItem = await context.Items.SingleAsync(m => m.ItemId == unit.HeadID);

                    unit.Head = new ItemOverviewViewModel
                    {
                        HPBonus             = headItem.HPBonus ?? 0,
                        MPBonus             = headItem.MPBonus ?? 0,
                        PhysicalAttackPower = headItem.PhysicalAttackBoost.HasValue ? headItem.PhysicalAttackBoost.Value.ToString("D2") : "00",
                        MagicalAttackPower  = headItem.MagicAttackBoost.HasValue ? headItem.MagicAttackBoost.Value.ToString("D2") : "00",
                        SpeedBonus          = headItem.SpeedBoost ?? 0,
                        ImagePath           = @"/img/Item_Icons/Armour/" + headItem.IconFileName,
                        Name = headItem.PspName,
                    };

                    items.Add(headItem);
                }
                else
                {
                    unit.Head = new ItemOverviewViewModel();
                }

                if (unit.BodyID != default(int))
                {
                    bodyItem = await context.Items.SingleAsync(m => m.ItemId == unit.BodyID);

                    unit.Body = new ItemOverviewViewModel
                    {
                        HPBonus             = bodyItem.HPBonus ?? 0,
                        MPBonus             = bodyItem.MPBonus ?? 0,
                        PhysicalAttackPower = bodyItem.PhysicalAttackBoost.HasValue ? bodyItem.PhysicalAttackBoost.Value.ToString("D2") : "00",
                        MagicalAttackPower  = bodyItem.MagicAttackBoost.HasValue ? bodyItem.MagicAttackBoost.Value.ToString("D2") : "00",
                        SpeedBonus          = bodyItem.SpeedBoost ?? 0,
                        ImagePath           = @"/img/Item_Icons/Armour/" + context.Items.Single(m => m.ItemId == unit.BodyID).IconFileName,
                        Name = context.Items.Single(m => m.ItemId == unit.BodyID).PspName,
                    };

                    items.Add(bodyItem);
                }
                else
                {
                    unit.Body = new ItemOverviewViewModel();
                }

                if (unit.AccessoryID != default(int))
                {
                    accessoryItem = await context.Items.SingleAsync(m => m.ItemId == unit.AccessoryID);

                    unit.Accessory = new ItemOverviewViewModel
                    {
                        ItemCategoryID         = accessoryItem.ItemCategoryId,
                        MoveBonus              = accessoryItem.MoveBoost ?? 0,
                        JumpBonus              = accessoryItem.JumpBoost ?? 0,
                        SpeedBonus             = accessoryItem.SpeedBoost ?? 0,
                        PhysicalAttackPower    = accessoryItem.PhysicalAttackBoost.HasValue ? accessoryItem.PhysicalAttackBoost.Value.ToString() : "00",
                        MagicalAttackPower     = accessoryItem.MagicAttackBoost.HasValue ? accessoryItem.MagicAttackBoost.Value.ToString() : "00",
                        AccessoryPhysicalEvade = accessoryItem.ItemCategory.EquipmentCategoryId == (int)Enums.EquipmentCategoriesList.Accessory ? accessoryItem.PhysicalEvade.HasValue ?
                                                 accessoryItem.PhysicalEvade.Value.ToString("D3") : "00" : "00",
                        AccessoryMagicalEvade = accessoryItem.ItemCategory.EquipmentCategoryId == (int)Enums.EquipmentCategoriesList.Accessory ? accessoryItem.MagicalEvade.HasValue ?
                                                accessoryItem.MagicalEvade.Value.ToString("D3") : "00" : "00",
                        ImagePath = @"/img/Item_Icons/Accessories/" + context.Items.Single(m => m.ItemId == unit.AccessoryID).IconFileName,
                        Name      = context.Items.Single(m => m.ItemId == unit.AccessoryID).PspName,
                    };

                    items.Add(accessoryItem);
                }
                else
                {
                    unit.Accessory = new ItemOverviewViewModel();
                }

                Job unitJob = await context.Jobs.SingleAsync(m => m.JobId == unit.Unit.JobID);

                unit = AttributeCalculatorService.CalculateHPAndMP(headItem, bodyItem, unit, unitJob);
                unit = AttributeCalculatorService.CalculateBasicStats(weaponItem1, weaponItem2, headItem, bodyItem, accessoryItem, unit, unitJob);
                unit = AttributeCalculatorService.CalculateEvasionStats(weaponItem2, accessoryItem, unitJob, unit);
                unit.PrimaryAbilityJobID = unitJob.JobId;
                unit.PrimaryAbilityName  = unitJob.AbilitySetPspName;
            }

            unit.Unit.AttributeDigits = new UnitOverviewHpMpViewModel
            {
                HpDigits         = unit.Unit.MaxHP.ToString().ToCharArray(),
                MpDigits         = unit.Unit.MaxMP.ToString().ToCharArray(),
                ExperienceDigits = unit.Unit.Experience < 10 ? ("0" + unit.Unit.Experience.ToString()).ToCharArray() : unit.Unit.Experience.ToString().ToCharArray(),
                LevelDigits      = unit.Unit.Level < 10 ? ("0" + unit.Unit.Level.ToString()).ToCharArray() : unit.Unit.Level.ToString().ToCharArray(),
                PositionDigits   = unit.Unit.Position < 10 ? ("0" + unit.Unit.Position.ToString()).ToCharArray() : unit.Unit.Position.ToString().ToCharArray()
            };

            unit = AttributeCalculatorService.CalculateResistancesAndImmunities(items, unit);
            return(unit);
        }
        public ActionResult GetJobSelectionPartial(string gender)
        {
            List <JobOverviewViewModel> viewModels;
            JobOverviewRangeViewModel   rangeViewModel;

            using (FFTContext context = new FFTContext())
            {
                viewModels = context.Jobs.Where(m => gender == "Male" ? !m.IsFemaleOnly : !m.IsMaleOnly).Select(m => new JobOverviewViewModel
                {
                    JobID                             = m.JobID,
                    FileName                          = (m.PspName.Contains("(") ? m.PspName.Remove(m.PspName.IndexOf("(")) : m.PspName).Replace(" ", ""),
                    DisplayName                       = m.PspName,
                    GenderID                          = gender == "Male" ? 0 : 1,
                    Gender                            = gender,
                    HPMultiplier                      = m.HPMultiplier,
                    HPGrowthConstant                  = m.HPGrowthConstant,
                    HPGrowthConstantLabel             = m.HPGrowthConstant,
                    MPMultiplier                      = m.MPMultiplier,
                    MPGrowthConstant                  = m.MPGrowthConstant,
                    MPGrowthConstantLabel             = m.MPGrowthConstant,
                    SpeedMulitplier                   = m.SpeedMulitplier,
                    SpeedGrowthConstant               = m.SpeedGrowthConstant,
                    SpeedGrowthConstantLabel          = m.SpeedGrowthConstant,
                    PhysicalAttackMultiplier          = m.PhysicalAttackMultiplier,
                    PhysicalAttackGrowthConstant      = m.PhysicalAttackGrowthConstant,
                    PhysicalAttackGrowthConstantLabel = m.PhysicalAttackGrowthConstant,
                    MagicalAttackMultiplier           = m.MagicalAttackMultiplier,
                    MagicalAttackGrowthConstant       = m.MagicalAttackGrowthConstant,
                    MagicalAttackGrowthConstantLabel  = m.MagicalAttackGrowthConstant,
                    BaseMoveLength                    = m.BaseMoveLength,
                    BaseJumpHeight                    = m.BaseJumpHeight,
                    BaseCombatEvasion                 = m.BaseCombatEvasion
                }).ToList();

                rangeViewModel = new JobOverviewRangeViewModel
                {
                    HPGrowthConstantMax             = context.Jobs.Max(c => c.HPGrowthConstant),
                    HPGrowthConstantMin             = context.Jobs.Min(c => c.HPGrowthConstant),
                    MPGrowthConstantMax             = context.Jobs.Max(c => c.MPGrowthConstant),
                    MPGrowthConstantMin             = context.Jobs.Min(c => c.MPGrowthConstant),
                    SpeedGrowthConstantMax          = context.Jobs.Max(c => c.SpeedGrowthConstant),
                    SpeedGrowthConstantMin          = context.Jobs.Min(c => c.SpeedGrowthConstant),
                    PhysicalAttackGrowthConstantMax = context.Jobs.Max(c => c.PhysicalAttackGrowthConstant),
                    PhysicalAttackGrowthConstantMin = context.Jobs.Min(c => c.PhysicalAttackGrowthConstant),
                    MagicalAttackGrowthConstantMax  = context.Jobs.Max(c => c.MagicalAttackGrowthConstant),
                    MagicalAttackGrowthConstantMin  = context.Jobs.Min(c => c.MagicalAttackGrowthConstant)
                };

                int commonDenominator = (new int[] { rangeViewModel.HPGrowthConstantMax, rangeViewModel.MPGrowthConstantMax, rangeViewModel.SpeedGrowthConstantMax,
                                                     rangeViewModel.PhysicalAttackGrowthConstantMax, rangeViewModel.MagicalAttackGrowthConstantMax }).Max();
                rangeViewModel.HPGrowthConstantMultiplier             = (float)commonDenominator / (float)rangeViewModel.HPGrowthConstantMax;
                rangeViewModel.MPGrowthConstantMultiplier             = (float)commonDenominator / (float)rangeViewModel.MPGrowthConstantMax;
                rangeViewModel.SpeedGrowthConstantMultiplier          = (float)commonDenominator / (float)rangeViewModel.SpeedGrowthConstantMax;
                rangeViewModel.PhysicalAttackGrowthConstantMultiplier = (float)commonDenominator / (float)rangeViewModel.PhysicalAttackGrowthConstantMax;
                rangeViewModel.MagicalAttackGrowthConstantMultiplier  = (float)commonDenominator / (float)rangeViewModel.MagicalAttackGrowthConstantMax;

                foreach (JobOverviewViewModel viewModel in viewModels)
                {
                    viewModel.HPGrowthConstant = (int)((rangeViewModel.HPGrowthConstantMax + rangeViewModel.HPGrowthConstantMin - viewModel.HPGrowthConstant) *
                                                       rangeViewModel.HPGrowthConstantMultiplier);
                    viewModel.MPGrowthConstant = (int)((rangeViewModel.MPGrowthConstantMax + rangeViewModel.MPGrowthConstantMin - viewModel.MPGrowthConstant) *
                                                       rangeViewModel.MPGrowthConstantMultiplier);
                    viewModel.SpeedGrowthConstant = (int)((rangeViewModel.SpeedGrowthConstantMax + rangeViewModel.SpeedGrowthConstantMin - viewModel.SpeedGrowthConstant) *
                                                          rangeViewModel.SpeedGrowthConstantMultiplier);
                    viewModel.PhysicalAttackGrowthConstant = (int)((rangeViewModel.PhysicalAttackGrowthConstantMax + rangeViewModel.PhysicalAttackGrowthConstantMin -
                                                                    viewModel.PhysicalAttackGrowthConstant) * rangeViewModel.PhysicalAttackGrowthConstantMultiplier);
                    viewModel.MagicalAttackGrowthConstant = (int)((rangeViewModel.MagicalAttackGrowthConstantMax + rangeViewModel.MagicalAttackGrowthConstantMin -
                                                                   viewModel.MagicalAttackGrowthConstant) * rangeViewModel.MagicalAttackGrowthConstantMultiplier);
                }
            }

            return(PartialView("~/Views/Home/_JobSelectionPartial.cshtml", viewModels));
        }
        public ActionResult GetItemSelectionPartial(int itemCategoryID)
        {
            List <ItemOverviewViewModel> items = new List <ItemOverviewViewModel>();

            using (FFTContext context = new FFTContext())
            {
                items.AddRange(context.Items.Where(m => m.ItemCategoryID == itemCategoryID).Select(c => new ItemOverviewViewModel
                {
                    ItemID = c.ItemID,
                    EquipmentCategoryID    = c.ItemCategory.EquipmentCategoryID,
                    EquipmentCategoryName  = c.ItemCategory.EquipmentCategoryName.ToLower(),
                    ItemCategoryID         = itemCategoryID,
                    AccessoryMagicalEvade  = (c.ItemCategoryID == (int)ItemCategoriesList.Cloak ? c.MagicalEvade ?? 0 : 0).ToString(),
                    AccessoryPhysicalEvade = (c.ItemCategoryID == (int)ItemCategoriesList.Cloak ? c.PhysicalEvade ?? 0 : 0).ToString(),
                    HPBonus             = (c.HPBonus ?? 0),
                    MPBonus             = (c.MPBonus ?? 0),
                    MoveBonus           = (c.MoveBoost ?? 0),
                    JumpBonus           = (c.JumpBoost ?? 0),
                    SpeedBonus          = (c.SpeedBoost ?? 0),
                    ShieldPhysicalEvade = (c.ItemCategoryID == (int)ItemCategoriesList.Shield ? c.PhysicalEvade ?? 0 : 0).ToString(),
                    ShieldMagicalEvade  = (c.ItemCategoryID == (int)ItemCategoriesList.Shield ? c.MagicalEvade ?? 0 : 0).ToString(),
                    PhysicalAttackPower = (c.PhysicalAttackBoost ?? 0).ToString(),
                    MagicalAttackPower  = (c.MagicAttackBoost ?? 0).ToString(),
                    Name        = c.PspName,
                    WeaponPower = (c.AttackPower ?? 0).ToString(),
                    WeaponHit   = (c.HitPercentage ?? 0).ToString(),
                    ImagePath   = (c.ItemCategory.EquipmentCategoryID == (int)EquipmentCategoriesList.Weapon ? @"/Content/Images/Item_Icons/Weapons/" : c.ItemCategory.EquipmentCategoryID > (int)EquipmentCategoriesList.Weapon &&
                                   c.ItemCategory.EquipmentCategoryID < (int)EquipmentCategoriesList.Accessory ? @"/Content/Images/Item_Icons/Armour/" : @"/Content/Images/Item_Icons/Accessories/") + c.IconFileName
                }));
            }

            if (items.Count > 0)
            {
                switch (items[0].EquipmentCategoryID)
                {
                case (int)EquipmentCategoriesList.Weapon:
                    return(PartialView("~/Views/Home/UnitItemSelectionPartials/_WeaponSelectionPartial.cshtml", items));

                case (int)EquipmentCategoriesList.Shield:
                    return(PartialView("~/Views/Home/UnitItemSelectionPartials/_ShieldSelectionPartial.cshtml", items));

                case (int)EquipmentCategoriesList.Accessory:
                    switch (items[0].ItemCategoryID)
                    {
                    case (int)ItemCategoriesList.Shoe:
                        return(PartialView("~/Views/Home/UnitItemSelectionPartials/_ShoeAccessorySelectionPartial.cshtml", items));

                    case (int)ItemCategoriesList.Cloak:
                        return(PartialView("~/Views/Home/UnitItemSelectionPartials/_CloakAccessorySelectionPartial.cshtml", items));

                    case (int)ItemCategoriesList.Armguard:
                        return(PartialView("~/Views/Home/UnitItemSelectionPartials/_ArmguardAccessorySelectionPartial.cshtml", items));

                    case (int)ItemCategoriesList.Ring:
                        return(PartialView("~/Views/Home/UnitItemSelectionPartials/_RingAccessorySelectionPartial.cshtml", items));

                    case (int)ItemCategoriesList.Armlet:
                        return(PartialView("~/Views/Home/UnitItemSelectionPartials/_RingAccessorySelectionPartial.cshtml", items));

                    default:
                        return(PartialView("~/Views/Home/UnitItemSelectionPartials/_DefaultAccessorySelectionPartial.cshtml", items));
                    }

                default:
                    return(PartialView("~/Views/Home/UnitItemSelectionPartials/_HelmetBodySelectionPartial.cshtml", items));
                }
            }

            return(null);
        }
        static void ScrapeItems()
        {
            ChromeOptions options = new ChromeOptions();

            options.AddExtension(@"..\..\Chrome Extensions\3.18.0_0.crx");
            //options.AddExtension(@"C:\Users\hasenb\AppData\Local\Google\Chrome\User Data\Default\Extensions\gighmmpiobklfepjocnamgkkbiglidom\3.18.0_0.crx");
            ChromeDriver driver = new ChromeDriver(options);

            Thread.Sleep(TimeSpan.FromSeconds(2));
            driver.Manage().Window.Maximize();
            driver.Navigate().GoToUrl("http://finalfantasy.wikia.com/wiki/List_of_Final_Fantasy_Tactics_Items");
            if (new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(m => m.FindElements(By.CssSelector("table.full-width.FFT")).Count == 21))
            {
                // All item tables for Items
                List <IWebElement> ItemTables = driver.FindElements(By.CssSelector("table.full-width.FFT")).OrderBy(m => m.Location.Y).ToList();
                // All the table row elements for a single item
                List <IWebElement> itemRows = new List <IWebElement>();
                List <Item>        Items    = new List <Item>();
                // Index of rows for the entire table
                int rowIndex = 0;
                // Flag to initialize new Item object
                bool Itemsentinel = false;

                foreach (IWebElement table in ItemTables)
                {
                    // All of the rows for the table
                    List <IWebElement> rows = table.FindElements(By.CssSelector("tr:not(.a)")).ToList();
                    Item Item = new Item();

                    while (rows.Count != rowIndex)
                    {
                        if (Itemsentinel)
                        {
                            itemRows.Clear();
                            Item = new Item();
                        }

                        // Add the row for the particular item
                        itemRows.Add(rows[rowIndex]);

                        if (rows[rowIndex].FindElements(By.CssSelector("th")).Count > 0)
                        {
                            int magickAttackBoost = 0;
                            List <IWebElement> itemRowElements = itemRows[rowIndex].FindElements(By.CssSelector("td")).ToList();

                            Item.PspName          = itemRows[rowIndex].FindElement(By.CssSelector("th > a > span")).Text.Trim();
                            Item.AttackPower      = Convert.ToInt16(itemRowElements[0].Text.Trim());
                            Item.HitPercentage    = Convert.ToInt16(itemRowElements[1].Text.Trim().Replace("%", ""));
                            Item.MagicAttackBoost = int.TryParse(itemRowElements[2].Text.Trim(), out magickAttackBoost) ? magickAttackBoost : 0;

                            string[] acquiredData = itemRowElements[3].Text.Trim().Split(new string[] { ":", "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
                            string   scrapedText  = "";
                            int      counter      = 1;

                            for (int i = 0; i < acquiredData.Length; i++)
                            {
                                string[] identifiers = new string[] { "Outfitters", "Treasure", "Mode", "Poach", "Steal", "Initial", "Catch" };

                                if (!identifiers.Contains(acquiredData[i]))
                                {
                                    scrapedText += (" " + acquiredData[i]).Trim();
                                    counter++;
                                }

                                if ((!String.IsNullOrEmpty(scrapedText) && identifiers.Contains(acquiredData[i])) || i == acquiredData.Length - 1)
                                {
                                    if (i == acquiredData.Length - 1)
                                    {
                                        counter = 1;
                                    }

                                    switch (acquiredData[i - counter])
                                    {
                                    case "Outfitters":
                                        Item.AcquiredViaLocation = scrapedText;
                                        break;

                                    case "Treasure":
                                        Item.AcquiredViaTreasureHunt = scrapedText;
                                        break;

                                    case "Mode":
                                        Item.AcquiredViaMode = scrapedText;
                                        break;

                                    case "Poach":
                                        Item.AcquiredViaPoach = scrapedText;
                                        break;

                                    case "Steal":
                                        Item.AcquiredViaSteal = scrapedText;
                                        break;

                                    case "Initial":
                                        Item.AcquiredViaInitialEquip = scrapedText;
                                        break;

                                    case "Catch":
                                        Item.AcquiredViaCatch = scrapedText;
                                        break;
                                    }

                                    scrapedText = "";
                                    counter     = 1;
                                }
                            }

                            Item.Cost = Convert.ToInt16(itemRowElements[4].Text.Trim());
                            rowIndex++;
                        }
                        else if (rows[rowIndex].FindElements(By.CssSelector("b")).Count > 0)
                        {
                            string   rowData        = rows[rowIndex].FindElements(By.CssSelector("td"))[0].Text.Trim();
                            string[] itemEffectData = rowData.Split(new string[] { ":", "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

                            for (int i = 0; i < itemEffectData.Length; i++)
                            {
                                string[] identifiers = new string[] { "Element", "Spell Effect", "Effect", "Equip", "Absorbs", "Boosts", "Removes" };

                                if (identifiers.Contains(itemEffectData[i]))
                                {
                                    switch (itemEffectData[i])
                                    {
                                    case "Element":
                                        Item.AcquiredViaLocation = itemEffectData[i + 1].Trim();
                                        break;

                                    case "Spell Effect":
                                        Item.AcquiredViaTreasureHunt = itemEffectData[i + 1].Trim();
                                        break;

                                    case "Effect":
                                        Item.AcquiredViaMode = itemEffectData[i + 1].Trim();
                                        break;

                                    case "Equip":
                                        Item.AcquiredViaPoach = itemEffectData[i + 1].Trim();
                                        break;

                                    case "Absorbs":
                                        Item.AcquiredViaSteal = itemEffectData[i + 1].Trim();
                                        break;

                                    case "Boosts":
                                        Item.AcquiredViaInitialEquip = itemEffectData[i + 1].Trim();
                                        break;

                                    case "Removes":
                                        Item.AcquiredViaCatch = itemEffectData[i + 1].Trim();
                                        break;
                                    }
                                }
                            }

                            rowIndex++;
                        }
                        else
                        {
                            Item.Description = rows[rowIndex].FindElements(By.CssSelector("i"))[0].Text.Trim();
                            Itemsentinel     = true;
                            rowIndex++;
                            Items.Add(Item);
                        }
                    }
                }

                using (FFTContext context = new FFTContext())
                {
                    context.Items.AddRange(Items);
                }
            }
        }