(d34fb2097) Major refactoring: - Replace custom logic regarding subobjectives with generic logic. - Ensure that all the objectives follow the same logic, reduce duplicate code where possible.

This commit is contained in:
Joonas Rikkonen
2019-05-16 05:32:56 +03:00
parent 05270aa165
commit a3db11876b
23 changed files with 555 additions and 865 deletions
@@ -8,18 +8,15 @@ namespace Barotrauma
{
public override string DebugTag => "decontain item";
//can either be a tag or an identifier
private string[] itemIdentifiers;
private ItemContainer container;
private bool isCompleted;
public Func<Item, float> GetItemPriority;
private AIObjectiveGetItem getItemObjective;
//can either be a tag or an identifier
private readonly string[] itemIdentifiers;
private readonly ItemContainer container;
private readonly Item targetItem;
private AIObjectiveGoTo goToObjective;
private Item targetItem;
private bool isCompleted;
public AIObjectiveDecontainItem(Character character, Item targetItem, ItemContainer container, AIObjectiveManager objectiveManager, float priorityModifier = 1)
: base(character, objectiveManager, priorityModifier)
@@ -40,27 +37,10 @@ namespace Barotrauma
{
itemIdentifiers[i] = itemIdentifiers[i].ToLowerInvariant();
}
this.container = container;
}
public override bool IsCompleted()
{
return isCompleted;
}
public override bool CanBeCompleted
{
get
{
if (goToObjective != null)
{
return goToObjective.CanBeCompleted;
}
return getItemObjective == null || getItemObjective.CanBeCompleted;
}
}
public override bool IsCompleted() => isCompleted;
public override float GetPriority()
{
@@ -68,16 +48,13 @@ namespace Barotrauma
{
return AIObjectiveManager.OrderPriority;
}
return 1.0f;
}
protected override void Act(float deltaTime)
{
if (isCompleted) return;
if (isCompleted) { return; }
Item itemToDecontain = null;
//get the item that should be de-contained
if (targetItem == null)
{
@@ -86,7 +63,7 @@ namespace Barotrauma
foreach (string identifier in itemIdentifiers)
{
itemToDecontain = container.Inventory.FindItemByIdentifier(identifier) ?? container.Inventory.FindItemByTag(identifier);
if (itemToDecontain != null) break;
if (itemToDecontain != null) { break; }
}
}
}
@@ -94,38 +71,32 @@ namespace Barotrauma
{
itemToDecontain = targetItem;
}
if (itemToDecontain == null || itemToDecontain.Container != container.Item) // Item not found or already de-contained, consider complete
{
isCompleted = true;
return;
}
if (itemToDecontain.OwnInventory != character.Inventory && itemToDecontain.ParentInventory != character.Inventory)
{
if (Vector2.Distance(character.Position, container.Item.Position) > container.Item.InteractDistance
&& !container.Item.IsInsideTrigger(character.WorldPosition))
if (Vector2.DistanceSquared(character.Position, container.Item.Position) > MathUtils.Pow(container.Item.InteractDistance, 2) && !container.Item.IsInsideTrigger(character.WorldPosition))
{
goToObjective = new AIObjectiveGoTo(container.Item, character, objectiveManager);
AddSubObjective(goToObjective);
TryAddSubObjective(ref goToObjective, () => new AIObjectiveGoTo(container.Item, character, objectiveManager));
return;
}
}
itemToDecontain.Drop(character);
isCompleted = true;
}
public override bool IsDuplicate(AIObjective otherObjective)
{
AIObjectiveDecontainItem decontainItem = otherObjective as AIObjectiveDecontainItem;
if (decontainItem == null) return false;
if (!(otherObjective is AIObjectiveDecontainItem decontainItem)) { return false; }
if (decontainItem.itemIdentifiers != null && itemIdentifiers != null)
{
if (decontainItem.itemIdentifiers.Length != itemIdentifiers.Length) return false;
if (decontainItem.itemIdentifiers.Length != itemIdentifiers.Length) { return false; }
for (int i = 0; i < decontainItem.itemIdentifiers.Length; i++)
{
if (decontainItem.itemIdentifiers[i] != itemIdentifiers[i]) return false;
if (decontainItem.itemIdentifiers[i] != itemIdentifiers[i]) { return false; }
}
return true;
}
@@ -133,7 +104,6 @@ namespace Barotrauma
{
return decontainItem.targetItem == targetItem;
}
return false;
}
}