Ejemplo n.º 1
0
        private static int optimize_actor_item_value(InventoryOptimizePasses pass,
                                                     Game_Actor actor, Data_Item item)
        {
            int value = 0;

            switch (pass)
            {
            case InventoryOptimizePasses.HealingItem:
                value = item.healing_item_value();
                break;

            case InventoryOptimizePasses.Accessory:
                value = item.accessory_value();
                break;

            case InventoryOptimizePasses.DanceRing:
                value = item.dance_value();
                break;
            }

            // Bonus for Prfs
            if (item.is_prf)
            {
                value += 5;
            }
            return(value);
        }
Ejemplo n.º 2
0
        private bool optimize_staff(InventoryOptimizePasses pass,
                                    Game_Actor actor, List <WeaponType> weapon_types, List <Item_Data> staves)
        {
            if (staves.Any() && !actor.is_full_items)
            {
                var staff_subset = staves
                                   .Select(x => Tuple.Create(x, optimize_actor_weapon_value(pass, actor, x.to_weapon, weapon_types)))
                                   .OrderByDescending(x => x.Item2)
                                   .AsEnumerable();
                int minimum    = staff_subset.First().Item2;
                var staff_list = staff_subset
                                 .Where(x => x.Item2 == minimum)
                                 .Select(x => x.Item1)
                                 .ToList();
                staff_list.Sort(delegate(Item_Data a, Item_Data b)
                {
                    return(item_sort(b, a, false));
                });

                if (staff_subset.Any())
                {
                    Item_Data best_match = staff_list.First();
                    switch (pass)
                    {
                    case InventoryOptimizePasses.HealingStaff:
                        if (!best_match.to_weapon.Heals())
                        {
                            return(false);
                        }
                        break;

                    case InventoryOptimizePasses.StatusStaff:
                        if (!best_match.to_weapon.is_attack_staff())
                        {
                            return(false);
                        }
                        break;

                    case InventoryOptimizePasses.UtilityStaff:
                        if (best_match.to_weapon.Heals() || best_match.to_weapon.is_attack_staff())
                        {
                            return(false);
                        }
                        break;

                    default:
                        return(false);
                    }

                    actor.gain_item(best_match);
                    Data.Remove(best_match);
                    // Removes from weapon set
                    staves.Remove(best_match);
                    weapon_types.Remove(best_match.to_weapon.main_type());
                    return(true);
                }
            }
            return(false);
        }
Ejemplo n.º 3
0
        private bool optimize_item(InventoryOptimizePasses pass,
                                   Game_Actor actor, List <Item_Data> items)
        {
            if (items.Any() && !actor.is_full_items)
            {
                var item_subset = items
                                  .Select(x => Tuple.Create(x, optimize_actor_item_value(pass, actor, x.to_item)))
                                  .OrderByDescending(x => x.Item2)
                                  .AsEnumerable();
                int minimum   = item_subset.First().Item2;
                var item_list = item_subset
                                .Where(x => x.Item2 == minimum)
                                .Select(x => x.Item1)
                                .ToList();
                item_list.Sort(delegate(Item_Data a, Item_Data b)
                {
                    return(item_sort(b, a, false));
                });

                if (item_list.Any())
                {
                    Item_Data best_match = item_list.First();
                    switch (pass)
                    {
                    case InventoryOptimizePasses.HealingItem:
                        if (!best_match.to_item.can_heal_hp())
                        {
                            return(false);
                        }
                        break;

                    case InventoryOptimizePasses.Accessory:
                        if (best_match.to_item.Skills.Count == 0)
                        {
                            return(false);
                        }
                        break;

                    case InventoryOptimizePasses.DanceRing:
                        if (!best_match.to_item.Dancer_Ring)
                        {
                            return(false);
                        }
                        break;

                    default:
                        return(false);
                    }

                    actor.gain_item(best_match);
                    Data.Remove(best_match);
                    // Removes from item set
                    items.Remove(best_match);
                    return(true);
                }
            }
            return(false);
        }
Ejemplo n.º 4
0
        private static int optimize_actor_weapon_value(InventoryOptimizePasses pass,
                                                       Game_Actor actor, Data_Weapon weapon, List <WeaponType> weapon_types)
        {
            int value = 0;

            switch (pass)
            {
            case InventoryOptimizePasses.VanillaWeapon:
                value = weapon.vanilla_value();
                break;

            case InventoryOptimizePasses.RangedWeapon:
                value = weapon.ranged_value();
                break;

            case InventoryOptimizePasses.EffectWeapon:
                value = weapon.effect_value();
                break;

            case InventoryOptimizePasses.BackupWeapon:
                value = weapon.effect_value();
                if (weapon.main_type() == weapon_types[0])
                {
                    value += 10;
                }
                break;

            case InventoryOptimizePasses.HealingStaff:
                value = weapon.healing_value();
                break;

            case InventoryOptimizePasses.StatusStaff:
                value = weapon.status_value();
                break;

            case InventoryOptimizePasses.UtilityStaff:
                value = weapon.utility_value();
                break;
            }

            // Add a small bonus if it's the actor's best weapon type
            if (weapon.main_type() == weapon_types[0])
            {
                value += 3;
            }
            // Penalize AS loss
            value -= actor.wgt_penalty(weapon);
            // Bonus for Prfs
            if (weapon.is_prf)
            {
                value += 5;
            }
            return(value);
        }
Ejemplo n.º 5
0
        private bool optimize_weapon(InventoryOptimizePasses pass,
                                     Game_Actor actor, List <WeaponType> weapon_types, List <Item_Data> weapons)
        {
            if (weapons.Any() && !actor.is_full_items)
            {
                var weapon_subset = weapons
                                    .Select(x => Tuple.Create(x, optimize_actor_weapon_value(pass, actor, x.to_weapon, weapon_types)))
                                    .OrderByDescending(x => x.Item2)
                                    .AsEnumerable();
                int minimum     = weapon_subset.First().Item2;
                var weapon_list = weapon_subset
                                  .Where(x => x.Item2 == minimum)
                                  .Select(x => x.Item1)
                                  .ToList();
                weapon_list.Sort(delegate(Item_Data a, Item_Data b)
                {
                    return(item_sort(b, a, false));
                });

                if (weapon_subset.Any())
                {
                    Item_Data best_match = weapon_list.First();
                    switch (pass)
                    {
                    case InventoryOptimizePasses.VanillaWeapon:
                        break;

                    // If the actor already has a weapon, and the best match is already
                    // better as this type, skip it
                    case InventoryOptimizePasses.RangedWeapon:
                    case InventoryOptimizePasses.EffectWeapon:
                    case InventoryOptimizePasses.BackupWeapon:
                        bool already_has_better = actor.items.Any(x =>
                        {
                            if (x.is_weapon && !x.to_weapon.is_staff())
                            {
                                return(optimize_actor_weapon_value(pass, actor, x.to_weapon, weapon_types) >
                                       optimize_actor_weapon_value(pass, actor, best_match.to_weapon, weapon_types));
                            }
                            else
                            {
                                return(false);
                            }
                        });
                        if (already_has_better)
                        {
                            return(false);
                        }
                        break;

                    default:
                        return(false);
                    }

                    actor.gain_item(best_match);
                    Data.Remove(best_match);
                    // Removes from weapon set
                    weapons.Remove(best_match);
                    weapon_types.Remove(best_match.to_weapon.main_type());
                    return(true);
                }
            }
            return(false);
        }