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); }
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); }
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); }
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); }
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); }