(1137f730e) Instead of forcing the looping objectives to use the average, let them decide the method of evaluating the targets. Use the highest priority for now.

This commit is contained in:
Joonas Rikkonen
2019-05-16 05:11:32 +03:00
parent 759e4aee0d
commit de8a23f687
16 changed files with 115 additions and 24 deletions
@@ -176,6 +176,8 @@ namespace Barotrauma
public bool IgnoreLayoutGroups; public bool IgnoreLayoutGroups;
public bool IgnoreLayoutGroups;
public virtual ScalableFont Font public virtual ScalableFont Font
{ {
get; get;
@@ -179,6 +179,12 @@ namespace Barotrauma
Content = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.85f), InnerFrame.RectTransform, Anchor.Center)) { AbsoluteSpacing = 5 }; Content = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.85f), InnerFrame.RectTransform, Anchor.Center)) { AbsoluteSpacing = 5 };
Tag = tag; Tag = tag;
InnerFrame = new GUIFrame(new RectTransform(new Point(width, height), RectTransform, Anchor.Center) { IsFixedSize = false }, style: null);
GUI.Style.Apply(InnerFrame, "", this);
Content = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.85f), InnerFrame.RectTransform, Anchor.Center)) { AbsoluteSpacing = 5 };
Tag = tag;
if (height == 0) if (height == 0)
{ {
string wrappedText = ToolBox.WrapText(text, Content.Rect.Width, GUI.Font); string wrappedText = ToolBox.WrapText(text, Content.Rect.Width, GUI.Font);
@@ -98,6 +98,20 @@ namespace Barotrauma
CanBeFocused = false CanBeFocused = false
}; };
scrollButtonUp = new GUIButton(new RectTransform(scrollButtonSize, crewArea.RectTransform, Anchor.TopLeft, Pivot.TopLeft), "", Alignment.Center, "GUIButtonVerticalArrow")
{
Visible = false,
UserData = -1,
OnClicked = ScrollCharacterList
};
scrollButtonDown = new GUIButton(new RectTransform(scrollButtonSize, crewArea.RectTransform, Anchor.BottomLeft, Pivot.BottomLeft), "", Alignment.Center, "GUIButtonVerticalArrow")
{
Visible = false,
UserData = 1,
OnClicked = ScrollCharacterList
};
scrollButtonDown.Children.ForEach(c => c.SpriteEffects = SpriteEffects.FlipVertically);
var characterInfo = new CharacterInfo(subElement); var characterInfo = new CharacterInfo(subElement);
characterInfos.Add(characterInfo); characterInfos.Add(characterInfo);
foreach (XElement invElement in subElement.Elements()) foreach (XElement invElement in subElement.Elements())
@@ -159,6 +173,16 @@ namespace Barotrauma
ToggleCrewAreaOpen = GameMain.Config.CrewMenuOpen; ToggleCrewAreaOpen = GameMain.Config.CrewMenuOpen;
} }
#endregion
#region Character list management
public Rectangle GetCharacterListArea()
{
return characterListBox.Rect;
}
partial void InitProjectSpecific() partial void InitProjectSpecific()
{ {
guiFrame = new GUIFrame(new RectTransform(Vector2.One, GUICanvas.Instance), null, Color.Transparent) guiFrame = new GUIFrame(new RectTransform(Vector2.One, GUICanvas.Instance), null, Color.Transparent)
@@ -947,6 +947,33 @@ namespace Barotrauma
Color.Green, width: 2); Color.Green, width: 2);
} }
} }
foreach (MapEntity e in linkedTo)
{
if (e is Hull)
{
Hull linkedHull = (Hull)e;
Rectangle connectedHullRect = e.Submarine == null ?
linkedHull.rect :
new Rectangle(
(int)(Submarine.DrawPosition.X + linkedHull.WorldPosition.X),
(int)(Submarine.DrawPosition.Y + linkedHull.WorldPosition.Y),
linkedHull.WorldRect.Width, linkedHull.WorldRect.Height);
//center of the hull
Rectangle currentHullRect = Submarine == null ?
WorldRect :
new Rectangle(
(int)(Submarine.DrawPosition.X + WorldPosition.X),
(int)(Submarine.DrawPosition.Y + WorldPosition.Y),
WorldRect.Width, WorldRect.Height);
GUI.DrawLine(spriteBatch,
new Vector2(currentHullRect.X, -currentHullRect.Y),
new Vector2(connectedHullRect.X, -connectedHullRect.Y),
Color.Green, width: 2);
}
}
} }
public static void UpdateVertices(GraphicsDevice graphicsDevice, Camera cam, WaterRenderer renderer) public static void UpdateVertices(GraphicsDevice graphicsDevice, Camera cam, WaterRenderer renderer)
@@ -1094,6 +1094,8 @@ namespace Barotrauma
private bool IsProperlyLatchedOnSub => LatchOntoAI != null && LatchOntoAI.IsAttachedToSub && SelectedAiTarget?.Entity == wallTarget?.Structure; private bool IsProperlyLatchedOnSub => LatchOntoAI != null && LatchOntoAI.IsAttachedToSub && SelectedAiTarget?.Entity == wallTarget?.Structure;
private bool IsProperlyLatchedOnSub => LatchOntoAI != null && LatchOntoAI.IsAttachedToSub && SelectedAiTarget?.Entity == wallTarget?.Structure;
//goes through all the AItargets, evaluates how preferable it is to attack the target, //goes through all the AItargets, evaluates how preferable it is to attack the target,
//whether the Character can see/hear the target and chooses the most preferable target within //whether the Character can see/hear the target and chooses the most preferable target within
//sight/hearing range //sight/hearing range
@@ -51,7 +51,7 @@ namespace Barotrauma
} }
protected override bool Filter(PowerContainer battery) => true; protected override bool Filter(PowerContainer battery) => true;
protected override float Average(PowerContainer battery) => 100 - battery.ChargePercentage; protected override float TargetEvaluation() => targets.Max(t => 100 - t.ChargePercentage);
protected override IEnumerable<PowerContainer> GetList() => batteryList; protected override IEnumerable<PowerContainer> GetList() => batteryList;
protected override AIObjective ObjectiveConstructor(PowerContainer battery) => new AIObjectiveOperateItem(battery, character, Option, false) { IsLoop = true }; protected override AIObjective ObjectiveConstructor(PowerContainer battery) => new AIObjectiveOperateItem(battery, character, Option, false) { IsLoop = true };
} }
@@ -52,7 +52,7 @@ namespace Barotrauma
} }
public override bool IsDuplicate(AIObjective otherObjective) => otherObjective is AIObjectiveFixLeaks; public override bool IsDuplicate(AIObjective otherObjective) => otherObjective is AIObjectiveFixLeaks;
protected override float Average(Gap gap) => GetLeakSeverity(gap); protected override float TargetEvaluation() => targets.Max(t => GetLeakSeverity(t));
protected override IEnumerable<Gap> GetList() => Gap.GapList; protected override IEnumerable<Gap> GetList() => Gap.GapList;
protected override AIObjective ObjectiveConstructor(Gap gap) => new AIObjectiveFixLeak(gap, character); protected override AIObjective ObjectiveConstructor(Gap gap) => new AIObjectiveFixLeak(gap, character);
} }
@@ -95,13 +95,13 @@ namespace Barotrauma
//{ //{
// return AIObjectiveManager.OrderPriority; // return AIObjectiveManager.OrderPriority;
//} //}
float avg = targets.Average(t => Average(t)); float targetValue = MathHelper.Clamp(TargetEvaluation(), 0, 100);
// If the avg is less than 1% of the max value, let's just treat it as zero. // If the target value is less than 1% of the max value, let's just treat it as zero.
if (avg < 1) { return 0; } if (targetValue < 1) { return 0; }
float maxMultiplier = MathHelper.Min(PriorityModifier, 1); float maxMultiplier = MathHelper.Min(PriorityModifier, 1);
float max = MathHelper.Min((AIObjectiveManager.OrderPriority - 1) * maxMultiplier, 90); float max = MathHelper.Min((AIObjectiveManager.OrderPriority - 1) * maxMultiplier, 90);
float devotion = MathHelper.Min(10, Priority); float devotion = MathHelper.Min(10, Priority);
float value = MathHelper.Min((devotion + avg) / 100 * PriorityModifier, 1); float value = MathHelper.Min((devotion + targetValue) / 100 * PriorityModifier, 1);
return MathHelper.Lerp(0, max, value); return MathHelper.Lerp(0, max, value);
} }
@@ -145,7 +145,9 @@ namespace Barotrauma
/// <summary> /// <summary>
/// 0 to 100. /// 0 to 100.
/// </summary> /// </summary>
protected abstract float Average(T target); /// <returns></returns>
protected abstract float TargetEvaluation();
protected abstract AIObjective ObjectiveConstructor(T target); protected abstract AIObjective ObjectiveConstructor(T target);
protected abstract bool Filter(T target); protected abstract bool Filter(T target);
} }
@@ -53,7 +53,7 @@ namespace Barotrauma
protected override bool Filter(Pump pump) => true; protected override bool Filter(Pump pump) => true;
protected override IEnumerable<Pump> GetList() => pumpList; protected override IEnumerable<Pump> GetList() => pumpList;
protected override float Average(Pump target) => MathHelper.Lerp(0, 100, target.CurrFlow / target.MaxFlow);
protected override AIObjective ObjectiveConstructor(Pump pump) => new AIObjectiveOperateItem(pump, character, Option, false) { IsLoop = true }; protected override AIObjective ObjectiveConstructor(Pump pump) => new AIObjectiveOperateItem(pump, character, Option, false) { IsLoop = true };
protected override float TargetEvaluation() => targets.Max(t => MathHelper.Lerp(100, 0, t.CurrFlow / t.MaxFlow));
} }
} }
@@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using Barotrauma.Items.Components; using Barotrauma.Items.Components;
using Barotrauma.Extensions; using Barotrauma.Extensions;
@@ -66,7 +67,7 @@ namespace Barotrauma
return ignore; return ignore;
} }
protected override float Average(Item item) => 100 - item.ConditionPercentage; protected override float TargetEvaluation() => targets.Max(t => 100 - t.ConditionPercentage);
protected override IEnumerable<Item> GetList() => Item.ItemList; protected override IEnumerable<Item> GetList() => Item.ItemList;
protected override AIObjective ObjectiveConstructor(Item item) => new AIObjectiveRepairItem(character, item); protected override AIObjective ObjectiveConstructor(Item item) => new AIObjectiveRepairItem(character, item);
} }
@@ -2686,6 +2686,10 @@ namespace Barotrauma
GameMain.GameSession?.CrewManager?.RemoveCharacter(this); GameMain.GameSession?.CrewManager?.RemoveCharacter(this);
#endif #endif
#if CLIENT
GameMain.GameSession?.CrewManager?.RemoveCharacter(this);
#endif
#if CLIENT #if CLIENT
GameMain.GameSession?.CrewManager?.RemoveCharacter(this); GameMain.GameSession?.CrewManager?.RemoveCharacter(this);
#endif #endif
@@ -471,6 +471,19 @@ namespace Barotrauma.Items.Components
return true; return true;
} }
public override void OnItemLoaded()
{
sonar = item.GetComponent<Sonar>();
}
public override bool Select(Character character)
{
if (!CanBeSelected) return false;
user = character;
return true;
}
public override void Update(float deltaTime, Camera cam) public override void Update(float deltaTime, Camera cam)
{ {
networkUpdateTimer -= deltaTime; networkUpdateTimer -= deltaTime;
@@ -1168,6 +1168,10 @@ namespace Barotrauma
{ {
ApplyStatusEffects(!waterProof && inWater ? ActionType.InWater : ActionType.NotInWater, deltaTime); ApplyStatusEffects(!waterProof && inWater ? ActionType.InWater : ActionType.NotInWater, deltaTime);
} }
if (!broken)
{
ApplyStatusEffects(!waterProof && inWater ? ActionType.InWater : ActionType.NotInWater, deltaTime);
}
ApplyStatusEffects(!waterProof && inWater ? ActionType.InWater : ActionType.NotInWater, deltaTime); ApplyStatusEffects(!waterProof && inWater ? ActionType.InWater : ActionType.NotInWater, deltaTime);
if (body == null || !body.Enabled || !inWater || ParentInventory != null || Removed) { return; } if (body == null || !body.Enabled || !inWater || ParentInventory != null || Removed) { return; }
@@ -24,6 +24,8 @@ namespace Barotrauma
private bool removed; private bool removed;
private bool removed;
#if CLIENT #if CLIENT
private List<Decal> burnDecals = new List<Decal>(); private List<Decal> burnDecals = new List<Decal>();
#endif #endif
@@ -508,6 +508,25 @@ namespace Barotrauma
} }
} }
public string DisplayName
{
get;
private set;
}
private string roomName;
[Editable, Serialize("", true, translationTextTag: "RoomName.")]
public string RoomName
{
get { return roomName; }
set
{
if (roomName == value) { return; }
roomName = value;
DisplayName = TextManager.Get(roomName, returnNull: true) ?? roomName;
}
}
public override Rectangle Rect public override Rectangle Rect
{ {
get get
@@ -162,21 +162,6 @@ namespace Barotrauma
get { return binding; } get { return binding; }
} }
public void SetState()
{
hit = binding.IsHit();
if (hit) hitQueue = true;
held = binding.IsDown();
if (held) heldQueue = true;
}
#endif
public KeyOrMouse State
{
get { return binding; }
}
public void SetState() public void SetState()
{ {
hit = binding.IsHit(); hit = binding.IsHit();