Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added sight based region flooders #13

Merged
merged 15 commits into from
Dec 21, 2022
Merged
Binary file modified 1.4/Assemblies/CombatAI.dll
Binary file not shown.
4 changes: 2 additions & 2 deletions 1.4/Defs/ThingDef_Buildings/Buildings_Security.xml
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,7 @@
<radiusNight>23</radiusNight>
<powered>true</powered>
<fieldOfView>65</fieldOfView>
<animator>CombatAI.CCTVTopAnimator_Periodic</animator>
<animator>CombatAI.CCTVTopAnimator_Controlled</animator>
<graphicData>
<graphicClass>Graphic_Single</graphicClass>
<texPath>Isma/Buildings/CCTV/cctv_wall_turret</texPath>
Expand Down Expand Up @@ -413,7 +413,7 @@
<radiusNight>41</radiusNight>
<powered>true</powered>
<fieldOfView>70</fieldOfView>
<animator>CombatAI.CCTVTopAnimator_Periodic</animator>
<animator>CombatAI.CCTVTopAnimator_Controlled</animator>
<graphicData>
<graphicClass>Graphic_Single</graphicClass>
<texPath>Isma/Buildings/CCTV/cctv_wall_turret</texPath>
Expand Down
81 changes: 33 additions & 48 deletions 1.4/Languages/English/Keyed/Translations.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,69 +6,54 @@
<CombatAI.Open>Open</CombatAI.Open>
<CombatAI.Hide>Hide</CombatAI.Hide>
<CombatAI.Expand>Hide</CombatAI.Expand>
<CombatAI.PlaceWorker.WallMounted>Needs to be mounted to a wall or a solid structure.
</CombatAI.PlaceWorker.WallMounted>
<CombatAI.PlaceWorker.WallMounted>Needs to be mounted to a wall or a solid structure.</CombatAI.PlaceWorker.WallMounted>
<CombatAI.Preparing>Preparing Combat AI</CombatAI.Preparing>
<CombatAI.Animator.Controller>Hold</CombatAI.Animator.Controller>
<CombatAI.Animator.Controller.Description>Hold at the current angle.</CombatAI.Animator.Controller.Description>
<CombatAI.Settings.Basic>Basic Settings</CombatAI.Settings.Basic>
<CombatAI.Settings.Basic.Presets>Performance/Difficulty presets</CombatAI.Settings.Basic.Presets>
<CombatAI.Settings.Basic.Presets.Easy>Easy/Perf</CombatAI.Settings.Basic.Presets.Easy>
<CombatAI.Settings.Basic.Presets.Normal>Normal</CombatAI.Settings.Basic.Presets.Normal>
<CombatAI.Settings.Basic.Presets.Hard>Hard/Complex</CombatAI.Settings.Basic.Presets.Hard>
<CombatAI.Settings.Basic.Presets.Deathwish>Deathwish</CombatAI.Settings.Basic.Presets.Deathwish>
<CombatAI.Settings.Basic.Presets.Applied>Applied preset:</CombatAI.Settings.Basic.Presets.Applied>
<CombatAI.Settings.Basic.Presets.Description>Performance presets will determine the complexity of AI calculations and their interval. More complex calculations means harder AI but lower performance. Default is normal.</CombatAI.Settings.Basic.Presets.Description>
<CombatAI.Settings.Basic.FogOfWar>[BETA] Fog of war</CombatAI.Settings.Basic.FogOfWar>
<CombatAI.Settings.Basic.FogOfWar.Enable>Enable fog of war</CombatAI.Settings.Basic.FogOfWar.Enable>
<CombatAI.Settings.Basic.FogOfWar.Density>Fog density (how dark the fog of war is)
</CombatAI.Settings.Basic.FogOfWar.Density>
<CombatAI.Settings.Basic.FogOfWar.Density.Readouts>{0} Fog desnity
</CombatAI.Settings.Basic.FogOfWar.Density.Readouts>
<CombatAI.Settings.Basic.FogOfWar.RangeMul>Fog of war sight radius multiplie (default is 1.0)
</CombatAI.Settings.Basic.FogOfWar.RangeMul>
<CombatAI.Settings.Basic.FogOfWar.Density>Fog density (how dark the fog of war is)</CombatAI.Settings.Basic.FogOfWar.Density>
<CombatAI.Settings.Basic.FogOfWar.Density.Readouts>{0} Fog desnity</CombatAI.Settings.Basic.FogOfWar.Density.Readouts>
<CombatAI.Settings.Basic.FogOfWar.RangeMul>Fog of war sight radius multiplie (default is 1.0)</CombatAI.Settings.Basic.FogOfWar.RangeMul>
<CombatAI.Settings.Basic.FogOfWar.RangeMul.Readouts>{0}x</CombatAI.Settings.Basic.FogOfWar.RangeMul.Readouts>
<CombatAI.Settings.Basic.FogOfWar.FadeMul>Fog of war sight fade radius multiplier (default is 0.5)
</CombatAI.Settings.Basic.FogOfWar.FadeMul>
<CombatAI.Settings.Basic.FogOfWar.FadeMul>Fog of war sight fade radius multiplier (default is 0.5)</CombatAI.Settings.Basic.FogOfWar.FadeMul>
<CombatAI.Settings.Basic.FogOfWar.FadeMul.Readouts>{0}x</CombatAI.Settings.Basic.FogOfWar.FadeMul.Readouts>
<CombatAI.Settings.Basic.KillBoxKiller>Enable The Killbox killer 5000</CombatAI.Settings.Basic.KillBoxKiller>
<CombatAI.Settings.Basic.CELean>Enable Combat Extended lean profile</CombatAI.Settings.Basic.CELean>
<CombatAI.Settings.Basic.PerformanceOpt>Enable dynamic performance settings</CombatAI.Settings.Basic.PerformanceOpt>
<CombatAI.Settings.Basic.PerformanceOpt.Description>Automatically adjust settings to maintain both a good level of
TPS and a good AI.
</CombatAI.Settings.Basic.PerformanceOpt.Description>
<CombatAI.Settings.Basic.PerformanceOpt>Enable Dynamic performance settings</CombatAI.Settings.Basic.PerformanceOpt>
<CombatAI.Settings.Basic.PerformanceOpt.Warning>WARNING: NOT having dynamic performance settings ON will result in lag spikes and lose of performance!</CombatAI.Settings.Basic.PerformanceOpt.Warning>
<CombatAI.Settings.Basic.PerformanceOpt.Description>Automatically adjust settings to maintain both a good level of TPS and a good AI.</CombatAI.Settings.Basic.PerformanceOpt.Description>
<CombatAI.Settings.Basic.Caster>Enable fire position tweaks</CombatAI.Settings.Basic.Caster>
<CombatAI.Settings.Basic.Targeter>Enable target selection tweaks</CombatAI.Settings.Basic.Targeter>
<CombatAI.Settings.Basic.Flanking>Enable aggressive flanking</CombatAI.Settings.Basic.Flanking>
<CombatAI.Settings.Basic.Reaction>Enable fast reactions</CombatAI.Settings.Basic.Reaction>
<CombatAI.Settings.Basic.Retreat>Enable tactical retreat</CombatAI.Settings.Basic.Retreat>
<CombatAI.Settings.Basic.Pather>Enable pathfinding tweaks</CombatAI.Settings.Basic.Pather>
<CombatAI.Settings.Basic.DestWeight>Pathfinding aggressiveness level</CombatAI.Settings.Basic.DestWeight>
<CombatAI.Settings.Basic.DestWeight.Description>Lower numbers mean pathfinding will be more aggressive at avoiding
enemies, flanking and minimizing risk to pawns.
</CombatAI.Settings.Basic.DestWeight.Description>
<CombatAI.Settings.Basic.DestWeight.Warning>WARNING: Lower values will cause alot of performance issues.
</CombatAI.Settings.Basic.DestWeight.Warning>

<CombatAI.Settings.Basic.DestWeight.Description>Lower numbers mean pathfinding will be more aggressive at avoiding enemies, flanking and minimizing risk to pawns.</CombatAI.Settings.Basic.DestWeight.Description>
<CombatAI.Settings.Basic.DestWeight.Warning>WARNING: Lower values will cause alot of performance issues.</CombatAI.Settings.Basic.DestWeight.Warning>
<CombatAI.Settings.Debugging>Debugging</CombatAI.Settings.Debugging>
<CombatAI.Settings.Debugging.Enable>Enable Debugging</CombatAI.Settings.Debugging.Enable>
Pathfinding_DestWeight
<CombatAI.Settings.Advance>Advance Settings</CombatAI.Settings.Advance>
<CombatAI.Settings.Advance.Warning>WARNING: This is only for advanced users! Don't enable this if you don't know
what you're doing!
</CombatAI.Settings.Advance.Warning>
<CombatAI.Settings.Advance.Warning>WARNING: This is only for advanced users! Don't enable this if you don't know what you're doing!</CombatAI.Settings.Advance.Warning>
<CombatAI.Settings.Advance.Enable>I'm an advanced user!</CombatAI.Settings.Advance.Enable>

<CombatAI.Settings.Advance.Sight.Performance>Performance</CombatAI.Settings.Advance.Sight.Performance>
<CombatAI.Settings.Advance.Sight.Performance.Description>You can adjust how many buckets pawns/turrets are divided
into and how often they updates. Warning: DON'T USE THIS IF YOU DON'T KNOW WHAT YOU'RE DOING
</CombatAI.Settings.Advance.Sight.Performance.Description>
<CombatAI.Settings.Advance.Sight.Performance.FrienldiesAndEnemies>Humanlike factions
</CombatAI.Settings.Advance.Sight.Performance.FrienldiesAndEnemies>
<CombatAI.Settings.Advance.Sight.Performance.MechsAndInsect>Mechs and insects
</CombatAI.Settings.Advance.Sight.Performance.MechsAndInsect>
<CombatAI.Settings.Advance.Sight.Performance.WildLife>Wildlife
</CombatAI.Settings.Advance.Sight.Performance.WildLife>
<CombatAI.Settings.Advance.Sight.Performance.Turrets>Map turrets
</CombatAI.Settings.Advance.Sight.Performance.Turrets>
<CombatAI.Settings.Advance.Sight.Performance.Readouts.Frequency>Update frequency {0}Hz (buckets * interval)
</CombatAI.Settings.Advance.Sight.Performance.Readouts.Frequency>
<CombatAI.Settings.Advance.Sight.Performance.Readouts.Buckets>Bucket count {0}
</CombatAI.Settings.Advance.Sight.Performance.Readouts.Buckets>
<CombatAI.Settings.Advance.Sight.Performance.Readouts.Interval>Ticks between bucket updates {0} Ticks
</CombatAI.Settings.Advance.Sight.Performance.Readouts.Interval>
<CombatAI.Settings.Advance.Sight.Performance.Readouts.CarryLimit>{0} Things maximum can obstuct line of sight
</CombatAI.Settings.Advance.Sight.Performance.Readouts.CarryLimit>
<CombatAI.Settings.Advance.Sight.Performance.Readouts.CarryLimit.Description>The maximum number of things along line
of sight. This includes trees, buildings, etc. Higher values means more accurate sight model but higher
performance impact.
</CombatAI.Settings.Advance.Sight.Performance.Readouts.CarryLimit.Description>
<CombatAI.Settings.Advance.Sight.Performance.Description>You can adjust how many buckets pawns/turrets are divided into and how often they updates. Warning: DON'T USE THIS IF YOU DON'T KNOW WHAT YOU'RE DOING</CombatAI.Settings.Advance.Sight.Performance.Description>
<CombatAI.Settings.Advance.Sight.Performance.FrienldiesAndEnemies>Humanlike factions</CombatAI.Settings.Advance.Sight.Performance.FrienldiesAndEnemies>
<CombatAI.Settings.Advance.Sight.Performance.MechsAndInsect>Mechs and insects</CombatAI.Settings.Advance.Sight.Performance.MechsAndInsect>
<CombatAI.Settings.Advance.Sight.Performance.WildLife>Wildlife</CombatAI.Settings.Advance.Sight.Performance.WildLife>
<CombatAI.Settings.Advance.Sight.Performance.Turrets>Map turrets</CombatAI.Settings.Advance.Sight.Performance.Turrets>
<CombatAI.Settings.Advance.Sight.Performance.Readouts.Frequency>Update frequency {0}Hz (buckets * interval)</CombatAI.Settings.Advance.Sight.Performance.Readouts.Frequency>
<CombatAI.Settings.Advance.Sight.Performance.Readouts.Buckets>Bucket count {0}</CombatAI.Settings.Advance.Sight.Performance.Readouts.Buckets>
<CombatAI.Settings.Advance.Sight.Performance.Readouts.Interval>Ticks between bucket updates {0} Ticks</CombatAI.Settings.Advance.Sight.Performance.Readouts.Interval>
<CombatAI.Settings.Advance.Sight.Performance.Readouts.CarryLimit>{0} Things maximum can obstuct line of sight</CombatAI.Settings.Advance.Sight.Performance.Readouts.CarryLimit>
<CombatAI.Settings.Advance.Sight.Performance.Readouts.CarryLimit.Description>The maximum number of things along line of sight. This includes trees, buildings, etc. Higher values means more accurate sight model but higher performance impact.</CombatAI.Settings.Advance.Sight.Performance.Readouts.CarryLimit.Description>
</LanguageData>
14 changes: 13 additions & 1 deletion Source/Rule56/CCTV/CCTVTopAnimator.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
using System.Collections.Generic;
using CombatAI.Comps;
using Verse;
namespace CombatAI
{
public abstract class CCTVTopAnimator
public abstract class CCTVTopAnimator : IExposable
{
public ThingComp_CCTVTop comp;

public CCTVTopAnimator()
{
}

public CCTVTopAnimator(ThingComp_CCTVTop comp)
{
this.comp = comp;
Expand All @@ -17,5 +23,11 @@ public abstract float CurRotation
}

public abstract void Tick();
public abstract void ExposeData();

public virtual IEnumerable<Gizmo> GetGizmos()
{
yield break;
}
}
}
47 changes: 47 additions & 0 deletions Source/Rule56/CCTV/CCTVTopAnimator_Controlled.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
using System.Collections.Generic;
using CombatAI.Comps;
using CombatAI.R;
using RimWorld;
using Verse;
namespace CombatAI
{
public class CCTVTopAnimator_Controlled : CCTVTopAnimator_Periodic
{
private bool paused;

public CCTVTopAnimator_Controlled(ThingComp_CCTVTop comp) : base(comp)
{
}

public override void Tick()
{
if (!paused)
{
base.Tick();
}
}

public override IEnumerable<Gizmo> GetGizmos()
{
Command_Toggle toggle = new Command_Toggle();
toggle.toggleAction = () =>
{
paused = !paused;
};
toggle.isActive = () =>
{
return paused;
};
toggle.icon = TexCommand.PauseCaravan;
toggle.defaultLabel = R.Keyed.CombatAI_Animator_Controller;
toggle.defaultDesc = R.Keyed.CombatAI_Animator_Controller_Description;
yield return toggle;
}

public override void ExposeData()
{
base.ExposeData();
Scribe_Values.Look(ref paused, "paused", false);
}
}
}
13 changes: 9 additions & 4 deletions Source/Rule56/CCTV/CCTVTopAnimator_Periodic.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ namespace CombatAI
{
public class CCTVTopAnimator_Periodic : CCTVTopAnimator
{
private bool idleTurnClockwise;
private int ticksUntilIdleTurn;
private float rot;
private bool idleTurnClockwise;
private int ticksUntilIdleTurn;

public CCTVTopAnimator_Periodic(ThingComp_CCTVTop comp) : base(comp)
{
Expand All @@ -17,8 +18,8 @@ public CCTVTopAnimator_Periodic(ThingComp_CCTVTop comp) : base(comp)
/// </summary>
public override float CurRotation
{
get;
set;
get => rot;
set => rot = value;
}

public override void Tick()
Expand All @@ -45,5 +46,9 @@ public override void Tick()
ticksUntilIdleTurn = Rand.RangeInclusive(30, 100);
}
}
public override void ExposeData()
{
Scribe_Values.Look(ref rot, "rot", 0);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using UnityEngine;
using Verse;
namespace CombatAI.Comps
Expand Down Expand Up @@ -53,16 +54,19 @@ public override void CompTick()
}
}

public override void PostSpawnSetup(bool respawningAfterLoad)
public override void PostPostMake()
{
base.PostSpawnSetup(respawningAfterLoad);
parent.Map.GetComp_Fast<WallCCTVTracker>().Register(this);
base.PostPostMake();
if (animator == null)
{
animator = (CCTVTopAnimator)Activator.CreateInstance((props as CompProperties_CCTVTop).animator, this);
}
}

public override void Initialize(CompProperties props)
public override void PostSpawnSetup(bool respawningAfterLoad)
{
base.Initialize(props);
animator = (CCTVTopAnimator)Activator.CreateInstance((props as CompProperties_CCTVTop).animator, this);
base.PostSpawnSetup(respawningAfterLoad);
parent.Map.GetComp_Fast<WallCCTVTracker>().Register(this);
}

/// <summary>
Expand All @@ -78,5 +82,20 @@ public override void PostDraw()
matrix.SetTRS(parent.DrawPos + Altitudes.AltIncVect + position, rot.ToQuat(), new Vector3(props.graphicData.drawSize.x, 1, props.graphicData.drawSize.y));
Graphics.DrawMesh(MeshPool.plane10, matrix, props.turretTopMat, 0);
}

public override void PostExposeData()
{
base.PostExposeData();
Scribe_Deep.Look(ref animator, "animator", this);
if (animator == null)
{
animator = (CCTVTopAnimator)Activator.CreateInstance((props as CompProperties_CCTVTop).animator, this);
}
}

public override IEnumerable<Gizmo> CompGetGizmosExtra()
{
return animator?.GetGizmos();
}
}
}
9 changes: 5 additions & 4 deletions Source/Rule56/CellFlooder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ public void Flood(IntVec3 center, Action<Node> action, Func<IntVec3, float> cost
Func<IntVec3, bool> blocked = GetBlockedTestFunc(validator);
walls = map.GetComponent<WallGrid>();
Node node = GetIntialFloodedCell(center);
node.dist = costFunction != null ? costFunction(node.cell) : 0;
node.dist = costFunction != null ? costFunction(node.cell) : 0;
sigArray[map.cellIndices.CellToIndex(node.cell)] = sig;
Node nextNode;
int cellIndex;
IntVec3 nextCell;
Expand Down Expand Up @@ -69,7 +70,8 @@ public void Flood(IntVec3 center, Action<Node> action, Func<IntVec3, float> cost
nextCell = node.cell + offset;
if (nextCell.InBounds(map))
{
if (sigArray[cellIndex = map.cellIndices.CellToIndex(nextCell)] != sig)
bool visited;
if (!(visited = sigArray[cellIndex = map.cellIndices.CellToIndex(nextCell)] == sig))
{
sigArray[cellIndex] = sig;
if (!blocked(nextCell))
Expand All @@ -95,12 +97,11 @@ public void Flood(IntVec3 center, Action<Node> action, Func<IntVec3, float> cost
nextNode.dist += costFunction(nextCell);
}
floodQueue.Enqueue(nextNode);
//
//floodedCells.Add(nextNode);
}
}
}
}
// }
}
}

Expand Down
Loading