(94ad97066) Refactor combat objective. The bots should now be able to reload and seek more ammunition. When they run out of ammunition, they first try to use another weapon and only if no other weapon is found, they seek more ammunition. Had to change the contain item and get item objectives a bit. Hopefully doesn't break things too much.

This commit is contained in:
Joonas Rikkonen
2019-05-16 06:13:15 +03:00
parent 298f1a79b0
commit ce7b9c4f52
41 changed files with 634 additions and 348 deletions
@@ -11,12 +11,13 @@ namespace Barotrauma
public Func<Item, float> GetItemPriority;
public int MinContainedAmount = 1;
public int targetItemCount = 1;
public string[] ignoredContainerIdentifiers;
public bool checkInventory = true;
//can either be a tag or an identifier
private readonly string[] itemIdentifiers;
private readonly ItemContainer container;
public readonly string[] itemIdentifiers;
public readonly ItemContainer container;
private bool isCompleted;
private AIObjectiveGetItem getItemObjective;
@@ -39,7 +40,6 @@ namespace Barotrauma
public override bool IsCompleted()
{
if (isCompleted) { return true; }
int containedItemCount = 0;
foreach (Item item in container.Inventory.Items)
{
@@ -48,7 +48,7 @@ namespace Barotrauma
containedItemCount++;
}
}
return containedItemCount >= MinContainedAmount;
return containedItemCount >= targetItemCount;
}
public override float GetPriority()
@@ -62,7 +62,6 @@ namespace Barotrauma
protected override void Act(float deltaTime)
{
if (isCompleted) { return; }
//get the item that should be contained
Item itemToContain = null;
foreach (string identifier in itemIdentifiers)
@@ -72,8 +71,13 @@ namespace Barotrauma
}
if (itemToContain == null)
{
if (getItemObjective != null && getItemObjective.IsCompleted())
{
getItemObjective = null;
targetItemCount--;
}
TryAddSubObjective(ref getItemObjective, () =>
new AIObjectiveGetItem(character, itemIdentifiers, objectiveManager)
new AIObjectiveGetItem(character, itemIdentifiers, objectiveManager, checkInventory: checkInventory)
{
GetItemPriority = GetItemPriority,
ignoredContainerIdentifiers = ignoredContainerIdentifiers
@@ -81,14 +85,7 @@ namespace Barotrauma
return;
}
if (container.Item.ParentInventory == character.Inventory)
{
var containedItems = container.Inventory.Items;
//if there's already something in the mask (empty oxygen tank?), drop it
var existingItem = containedItems.FirstOrDefault(i => i != null);
if (existingItem != null)
{
existingItem.Drop(character);
}
{
character.Inventory.RemoveItem(itemToContain);
container.Inventory.TryPutItem(itemToContain, null);
}
@@ -102,7 +99,6 @@ namespace Barotrauma
}
container.Combine(itemToContain);
}
isCompleted = true;
}
public override bool IsDuplicate(AIObjective otherObjective)