(2d7903da7) Replaced some horizontal light components with vertical ones in tutorial outpost

This commit is contained in:
Joonas Rikkonen
2019-05-16 06:02:10 +03:00
parent d70c463f41
commit 6fc8b8b573
16 changed files with 208 additions and 479 deletions
@@ -11,10 +11,9 @@ namespace Barotrauma
class AIObjectiveCombat : AIObjective
{
public override string DebugTag => "combat";
public bool useCoolDown = true;
private readonly CombatMode initialMode;
const float coolDown = 10.0f;
const float CoolDown = 10.0f;
public Character Enemy { get; private set; }
@@ -26,7 +25,14 @@ namespace Barotrauma
{
_weapon = value;
_weaponComponent = null;
RemoveSubObjective(ref reloadWeaponObjective);
if (reloadWeaponObjective != null)
{
if (subObjectives.Contains(reloadWeaponObjective))
{
subObjectives.Remove(reloadWeaponObjective);
}
reloadWeaponObjective = null;
}
}
}
private ItemComponent _weaponComponent;
@@ -34,7 +40,6 @@ namespace Barotrauma
{
get
{
if (Weapon == null) { return null; }
if (_weaponComponent == null)
{
_weaponComponent =
@@ -59,8 +64,6 @@ namespace Barotrauma
private Hull retreatTarget;
private float coolDownTimer;
private IEnumerable<FarseerPhysics.Dynamics.Body> myBodies;
private float aimTimer;
public enum CombatMode
{
@@ -75,7 +78,7 @@ namespace Barotrauma
: base(character, objectiveManager, priorityModifier)
{
Enemy = enemy;
coolDownTimer = coolDown;
coolDownTimer = CoolDown;
findSafety = objectiveManager.GetObjective<AIObjectiveFindSafety>();
if (findSafety != null)
{
@@ -83,7 +86,6 @@ namespace Barotrauma
findSafety.unreachable.Clear();
}
Mode = mode;
initialMode = Mode;
if (Enemy == null)
{
Mode = CombatMode.Retreat;
@@ -102,7 +104,7 @@ namespace Barotrauma
public override bool IsCompleted()
{
bool completed = (Enemy != null && (Enemy.Removed || Enemy.IsDead)) || (initialMode != CombatMode.Offensive && coolDownTimer <= 0);
bool completed = (Enemy != null && (Enemy.Removed || Enemy.IsDead)) || (useCoolDown && coolDownTimer <= 0);
if (completed)
{
if (objectiveManager.CurrentOrder == this && Enemy != null && Enemy.IsDead)
@@ -119,73 +121,58 @@ namespace Barotrauma
protected override void Act(float deltaTime)
{
if (initialMode != CombatMode.Offensive)
if (useCoolDown)
{
coolDownTimer -= deltaTime;
}
if (abandon) { return; }
TryArm();
if (reloadWeaponObjective == null || !subObjectives.Contains(reloadWeaponObjective))
{
Move();
OperateWeapon(deltaTime);
}
Arm(deltaTime);
Move(deltaTime);
}
private void Move()
private void Arm(float deltaTime)
{
switch (Mode)
{
case CombatMode.Offensive:
Engage();
break;
case CombatMode.Defensive:
if (Weapon != null && !character.Inventory.Items.Contains(_weapon) || _weaponComponent != null && !_weaponComponent.HasRequiredContainedItems(false))
{
Weapon = null;
}
if (Weapon == null)
{
Weapon = GetWeapon();
}
if (Weapon == null)
{
Mode = CombatMode.Retreat;
}
if (Equip())
{
if (Reload(deltaTime))
{
Attack(deltaTime);
}
}
break;
case CombatMode.Retreat:
Retreat();
break;
default:
throw new NotImplementedException();
}
}
private void TryArm()
{
if (Weapon != null)
{
if (!character.Inventory.Items.Contains(Weapon) || WeaponComponent == null)
{
Weapon = null;
}
else if (!WeaponComponent.HasRequiredContainedItems(false))
{
//if (!Reload())
//{
// Weapon = null;
// Mode = CombatMode.Retreat;
//}
//return;
Weapon = null;
}
}
if (Weapon == null)
{
Weapon = GetWeapon();
}
Mode = Weapon == null ? CombatMode.Retreat : initialMode;
}
private void OperateWeapon(float deltaTime)
private void Move(float deltaTime)
{
switch (Mode)
{
case CombatMode.Offensive:
case CombatMode.Defensive:
if (Equip())
{
Attack(deltaTime);
}
Engage(deltaTime);
break;
case CombatMode.Defensive:
case CombatMode.Retreat:
Retreat(deltaTime);
break;
default:
throw new NotImplementedException();
@@ -266,7 +253,6 @@ namespace Barotrauma
Weapon.Drop(character);
}
}
return true;
}
private bool Equip()
@@ -277,11 +263,9 @@ namespace Barotrauma
if (character.Inventory.TryPutItem(Weapon, character, slots))
{
Weapon.Equip(character);
aimTimer = Rand.Range(0.5f, 1f);
}
else
{
Weapon = null;
Mode = CombatMode.Retreat;
return false;
}
@@ -289,10 +273,16 @@ namespace Barotrauma
return true;
}
private void Retreat()
private void Retreat(float deltaTime)
{
RemoveSubObjective(ref followTargetObjective);
RemoveSubObjective(ref reloadWeaponObjective);
if (followTargetObjective != null)
{
if (subObjectives.Contains(followTargetObjective))
{
subObjectives.Remove(followTargetObjective);
}
followTargetObjective = null;
}
if (retreatObjective != null && retreatObjective.Target != retreatTarget)
{
retreatObjective = null;
@@ -304,14 +294,16 @@ namespace Barotrauma
TryAddSubObjective(ref retreatObjective, () => new AIObjectiveGoTo(retreatTarget, character, objectiveManager, false, true));
}
private void Engage()
private void Engage(float deltaTime)
{
retreatTarget = null;
RemoveSubObjective(ref retreatObjective);
RemoveSubObjective(ref reloadWeaponObjective);
if (followTargetObjective != null && followTargetObjective.Target != Enemy)
if (retreatObjective != null)
{
followTargetObjective = null;
if (subObjectives.Contains(retreatObjective))
{
subObjectives.Remove(retreatObjective);
}
retreatObjective = null;
}
TryAddSubObjective(ref followTargetObjective,
constructor: () => new AIObjectiveGoTo(Enemy, character, objectiveManager, repeat: true, getDivingGearIfNeeded: true)
@@ -326,44 +318,35 @@ namespace Barotrauma
},
onAbandon: () =>
{
Mode = CombatMode.Retreat;
SteeringManager.Reset();
Mode = CombatMode.Retreat;
});
}
private bool Reload()
private bool Reload(float deltaTime)
{
// TODO: reload all ammunition
if (WeaponComponent == null) { return false; }
if (WeaponComponent.requiredItems.ContainsKey(RelatedItem.RelationType.Contained))
if (WeaponComponent != null && WeaponComponent.requiredItems.ContainsKey(RelatedItem.RelationType.Contained))
{
var containedItems = Weapon.ContainedItems;
RelatedItem item = null;
Item ammunition = null;
foreach (RelatedItem requiredItem in WeaponComponent.requiredItems[RelatedItem.RelationType.Contained])
{
item = requiredItem;
ammunition = containedItems.FirstOrDefault(it => it.Condition > 0.0f && requiredItem.MatchesItem(it));
if (ammunition != null) { return true; }
}
if (ammunition == null)
{
retreatTarget = null;
RemoveSubObjective(ref retreatObjective);
RemoveSubObjective(ref followTargetObjective);
TryAddSubObjective(ref reloadWeaponObjective,
constructor: () => new AIObjectiveContainItem(character, item.Identifiers, Weapon.GetComponent<ItemContainer>(), objectiveManager),
onAbandon: () =>
{
Weapon = null;
Mode = CombatMode.Retreat;
SteeringManager.Reset();
});
Item containedItem = containedItems.FirstOrDefault(it => it.Condition > 0.0f && requiredItem.MatchesItem(it));
if (containedItem == null)
{
TryAddSubObjective(ref reloadWeaponObjective,
constructor: () => new AIObjectiveContainItem(character, requiredItem.Identifiers, Weapon.GetComponent<ItemContainer>(), objectiveManager),
onAbandon: () =>
{
SteeringManager.Reset();
Mode = CombatMode.Retreat;
});
}
}
}
return true;
return reloadWeaponObjective == null || reloadWeaponObjective.IsCompleted();
}
private IEnumerable<FarseerPhysics.Dynamics.Body> myBodies;
private void Attack(float deltaTime)
{
float squaredDistance = Vector2.DistanceSquared(character.Position, Enemy.Position);
@@ -388,16 +371,6 @@ namespace Barotrauma
character.SetInput(InputType.Aim, false, true);
}
}
bool isFacing = character.AnimController.Dir > 0 && Enemy.WorldPosition.X > character.WorldPosition.X || character.AnimController.Dir < 0 && Enemy.WorldPosition.X < character.WorldPosition.X;
if (!isFacing)
{
aimTimer = Rand.Range(1f, 1.5f);
}
if (aimTimer > 0)
{
aimTimer -= deltaTime;
return;
}
if (WeaponComponent is MeleeWeapon meleeWeapon)
{
if (squaredDistance <= meleeWeapon.Range * meleeWeapon.Range)
@@ -412,14 +385,14 @@ namespace Barotrauma
{
if (squaredDistance > repairTool.Range * repairTool.Range) { return; }
}
if (VectorExtensions.Angle(VectorExtensions.Forward(Weapon.body.TransformedRotation), Enemy.Position - Weapon.Position) < MathHelper.PiOver4)
if (VectorExtensions.Angle(VectorExtensions.Forward(Weapon.body.TransformedRotation), Enemy.Position - character.Position) < MathHelper.PiOver4)
{
if (myBodies == null)
{
myBodies = character.AnimController.Limbs.Select(l => l.body.FarseerBody);
}
var collisionCategories = Physics.CollisionCharacter | Physics.CollisionWall;
var pickedBody = Submarine.PickBody(Weapon.SimPosition, Enemy.SimPosition, myBodies, collisionCategories);
var pickedBody = Submarine.PickBody(character.SimPosition, Enemy.SimPosition, myBodies, collisionCategories);
if (pickedBody != null)
{
Character target = null;
@@ -431,11 +404,10 @@ namespace Barotrauma
{
target = limb.character;
}
if (target != null && (target == Enemy || !HumanAIController.IsFriendly(target)))
if (target != null && target == Enemy)
{
character.SetInput(InputType.Shoot, false, true);
Weapon.Use(deltaTime, character);
aimTimer = Rand.Range(0.25f, 0.5f);
}
}
}