Skip to content

Commit

Permalink
Rework American+British units
Browse files Browse the repository at this point in the history
- Don't highlight fogged tiles in movement ui
- Fix air/anti-air attacks
- Work on #52
- Fix aircraft point values
- Allow setting prefix length in language munging
  • Loading branch information
layagyasz committed Jun 8, 2018
1 parent dd56954 commit 8da21b8
Show file tree
Hide file tree
Showing 43 changed files with 273 additions and 260 deletions.
9 changes: 9 additions & 0 deletions Controller/Match/HumanMatchPlayerController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,15 @@ public Color GetTileColor(Tile Tile, byte ForTeam)
return HIGHLIGHT_COLORS.Last();
}

public bool FilterVisible(Tile Tile)
{
if (!Match.GetScenario().FogOfWar) return true;

if (Tile.Rules.Concealing || Tile.Rules.LowProfileConcealing)
return _CurrentTurn.Army.SightFinder.HasTileSightLevel(Tile, TileSightLevel.HARD_SPOTTED);
return _CurrentTurn.Army.SightFinder.HasTileSightLevel(Tile, TileSightLevel.SIGHTED);
}

void HighlightEnemyFieldOfSight(byte Team)
{
if (_HighlightToggles[(int)HighlightToggle.ENEMY_SIGHT_FIELD]) UnHighlight();
Expand Down
2 changes: 1 addition & 1 deletion Controller/Match/Subcontroller/AircraftController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public override void HandleUnitLeftClick(Unit Unit)
AddAttack(
Unit.Position,
new AirSingleAttackOrder(
_Controller.SelectedUnit, Unit.Position, _Controller.UseSecondaryWeapon()));
_Controller.SelectedUnit, Unit, _Controller.UseSecondaryWeapon()));
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion Controller/Match/Subcontroller/AttackController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ void HandleClick(Unit Unit, AttackMethod AttackMethod)
AddAttack(
Unit.Position,
new AntiAirSingleAttackOrder(
_Controller.SelectedUnit, Unit.Position, _Controller.UseSecondaryWeapon()));
_Controller.SelectedUnit, Unit, _Controller.UseSecondaryWeapon()));
}
else
{
Expand Down
4 changes: 3 additions & 1 deletion Controller/Match/Subcontroller/MovementController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,9 @@ void SetMovementHighlight(Unit Unit)
if (Unit.RemainingMovement > 0)
{
_Controller.Highlight(
Unit.GetFieldOfMovement(false).Select(
Unit.GetFieldOfMovement(false)
.Where(i => _Controller.FilterVisible(i.Item1))
.Select(
i => new Tuple<Tile, Color>(
i.Item1,
HumanMatchPlayerController.HIGHLIGHT_COLORS[
Expand Down
4 changes: 3 additions & 1 deletion Controller/Match/Subcontroller/OverrunController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,9 @@ public override void HandleUnitLeftClick(Unit Unit)
_Controller.SelectUnit(Unit);

_Controller.Highlight(
Unit.GetFieldOfMovement(true).Select(
Unit.GetFieldOfMovement(true)
.Where(i => _Controller.FilterVisible(i.Item1))
.Select(
i => new Tuple<Tile, Color>(
i.Item1,
HumanMatchPlayerController.HIGHLIGHT_COLORS[
Expand Down
10 changes: 6 additions & 4 deletions FileUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,9 @@ public static MarkovGenerator<char> LoadLanguage(string Path)
}
}

public static MarkovGenerator<char> GenerateLanguage(string ExamplePath)
public static MarkovGenerator<char> GenerateLanguage(uint PrefixLength, string ExamplePath)
{
var g = new MarkovGenerator<char>(3);
var g = new MarkovGenerator<char>(PrefixLength);
var parentheticals = new Regex("\\(.*\\)");
var capitals = new Regex("[A-Z- ]*");
foreach (var line in File.ReadAllLines(ExamplePath, Encoding.UTF8))
Expand All @@ -83,9 +83,11 @@ public static MarkovGenerator<char> GenerateLanguage(string ExamplePath)
return g;
}

public static void MungeLanguage(string ExamplePath, string OutputPath)
public static void MungeLanguage(uint PrefixLength, string ExamplePath, string OutputPath)
{
var g = GenerateLanguage(ExamplePath);
var g = GenerateLanguage(PrefixLength, ExamplePath);
var random = new Random();
for (int i = 0; i < 20; ++i) Console.WriteLine(new string(g.Generate(random).ToArray()));
using (FileStream fileStream = new FileStream(OutputPath, FileMode.Create))
{
using (GZipStream compressionStream = new GZipStream(fileStream, CompressionLevel.Optimal))
Expand Down
18 changes: 17 additions & 1 deletion Model/Orders/Attack/AirAttackOrder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,23 @@ public override bool MatchesTurnComponent(TurnComponent TurnComponent)

public override OrderInvalidReason Validate()
{
if (Target != AttackTarget.ALL) return OrderInvalidReason.MUST_ATTACK_ALL;
if (Target != AttackTarget.ALL && (TargetTile.Rules.MustAttackAllUnits
|| TargetTile.Units.Any(i => i.Configuration.UnitClass == UnitClass.FORT)))
return OrderInvalidReason.MUST_ATTACK_ALL;

if (Target == AttackTarget.EACH)
{
foreach (var attacker in _Attackers)
{
var r = attacker.Defender.CanBeAttackedBy(Army, AttackMethod);
if (r != OrderInvalidReason.NONE) return r;
}
if (_OddsCalculations.Count != TargetTile.Units.Count(
i => i.CanBeAttackedBy(Army, AttackMethod) == OrderInvalidReason.NONE))
return OrderInvalidReason.ILLEGAL_ATTACK_EACH;
if (_OddsCalculations.Any(i => i.Odds > 1 && i.OddsAgainst))
return OrderInvalidReason.ILLEGAL_ATTACK_EACH;
}

return base.Validate();
}
Expand Down
27 changes: 17 additions & 10 deletions Model/Orders/Attack/AirSingleAttackOrder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,28 @@ namespace PanzerBlitz
{
public class AirSingleAttackOrder : SingleAttackOrder
{
public override Tile AttackTile { get; protected set; }

public AirSingleAttackOrder(Unit Attacker, Tile AttackTile, bool UseSecondaryWeapon)
: base(Attacker, null, UseSecondaryWeapon)
public override Tile AttackTile
{
this.AttackTile = AttackTile;
get
{
return Defender.Position;
}
protected set
{
throw new NotSupportedException();
}
}

public AirSingleAttackOrder(Unit Attacker, Unit Defender, bool UseSecondaryWeapon)
: base(Attacker, Defender, UseSecondaryWeapon) { }

public AirSingleAttackOrder(SerializationInputStream Stream, List<GameObject> Objects)
: this((Unit)Objects[Stream.ReadInt32()], (Tile)Objects[Stream.ReadInt32()], Stream.ReadBoolean()) { }
: this((Unit)Objects[Stream.ReadInt32()], (Unit)Objects[Stream.ReadInt32()], Stream.ReadBoolean()) { }

public override void Serialize(SerializationOutputStream Stream)
{
Stream.Write(Attacker.Id);
Stream.Write(AttackTile.Id);
Stream.Write(Defender.Id);
Stream.Write(UseSecondaryWeapon);
}

Expand All @@ -36,7 +43,7 @@ public override AttackFactorCalculation GetAttack()

public override AttackOrder GenerateNewAttackOrder()
{
return new AirAttackOrder(Army, AttackTile);
return new AirAttackOrder(Army, Defender.Position);
}

public override bool MatchesTurnComponent(TurnComponent TurnComponent)
Expand All @@ -46,8 +53,8 @@ public override bool MatchesTurnComponent(TurnComponent TurnComponent)

public override OrderInvalidReason Validate()
{
if (AttackTile == null) return OrderInvalidReason.ILLEGAL;
if (Attacker.Position.HexCoordinate.Distance(AttackTile.HexCoordinate) > 1)
if (Defender == null) return OrderInvalidReason.ILLEGAL;
if (Attacker.Position.HexCoordinate.Distance(Defender.Position.HexCoordinate) > 1)
return OrderInvalidReason.TARGET_OUT_OF_RANGE;

return Attacker.CanAttack(AttackMethod.AIR, TreatStackAsArmored, null, UseSecondaryWeapon);
Expand Down
9 changes: 6 additions & 3 deletions Model/Orders/Attack/AntiAirAttackOrder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public override bool ResultPerDefender
{
get
{
return true;
return false;
}
}

Expand All @@ -32,7 +32,10 @@ public override CombatResultsTable CombatResultsTable
}

public AntiAirAttackOrder(Army Army, Tile TargetTile)
: base(Army, TargetTile) { }
: base(Army, TargetTile)
{
SetAttackTarget(AttackTarget.EACH);
}

public AntiAirAttackOrder(SerializationInputStream Stream, List<GameObject> Objects)
: base(Stream, Objects)
Expand All @@ -53,7 +56,7 @@ public override bool MatchesTurnComponent(TurnComponent TurnComponent)

public override OrderInvalidReason Validate()
{
if (Target != AttackTarget.ALL) return OrderInvalidReason.MUST_ATTACK_ALL;
if (Target != AttackTarget.EACH) return OrderInvalidReason.MUST_ATTACK_EACH;

return base.Validate();
}
Expand Down
30 changes: 20 additions & 10 deletions Model/Orders/Attack/AntiAirSingleAttackOrder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,37 @@ public class AntiAirSingleAttackOrder : SingleAttackOrder
{
public readonly LineOfSight LineOfSight;

public override Tile AttackTile { get; protected set; }
public override Tile AttackTile
{
get
{
return Defender.Position;
}
protected set
{
throw new NotSupportedException();
}
}

public AntiAirSingleAttackOrder(Unit Attacker, Tile AttackTile, bool UseSecondaryWeapon)
: base(Attacker, null, UseSecondaryWeapon)
public AntiAirSingleAttackOrder(Unit Attacker, Unit Defender, bool UseSecondaryWeapon)
: base(Attacker, Defender, UseSecondaryWeapon)
{
this.AttackTile = AttackTile;
LineOfSight = Attacker.GetLineOfSight(AttackTile);
LineOfSight = Attacker.GetLineOfSight(Defender.Position);
}

public AntiAirSingleAttackOrder(SerializationInputStream Stream, List<GameObject> Objects)
: this((Unit)Objects[Stream.ReadInt32()], (Tile)Objects[Stream.ReadInt32()], Stream.ReadBoolean())
: this((Unit)Objects[Stream.ReadInt32()], (Unit)Objects[Stream.ReadInt32()], Stream.ReadBoolean())
{
LineOfSight = new LineOfSight((Tile)Objects[Stream.ReadInt32()], AttackTile);
LineOfSight = new LineOfSight((Tile)Objects[Stream.ReadInt32()], (Tile)Objects[Stream.ReadInt32()]);
}

public override void Serialize(SerializationOutputStream Stream)
{
Stream.Write(Attacker.Id);
Stream.Write(AttackTile.Id);
Stream.Write(Defender.Id);
Stream.Write(UseSecondaryWeapon);
Stream.Write(LineOfSight.Initial.Id);
Stream.Write(LineOfSight.Final.Id);
}

public override AttackFactorCalculation GetAttack()
Expand All @@ -44,7 +54,7 @@ public override AttackFactorCalculation GetAttack()

public override AttackOrder GenerateNewAttackOrder()
{
return new AntiAirAttackOrder(Army, AttackTile);
return new AntiAirAttackOrder(Army, Defender.Position);
}

public override bool MatchesTurnComponent(TurnComponent TurnComponent)
Expand All @@ -54,7 +64,7 @@ public override bool MatchesTurnComponent(TurnComponent TurnComponent)

public override OrderInvalidReason Validate()
{
if (AttackTile == null) return OrderInvalidReason.ILLEGAL;
if (Defender == null) return OrderInvalidReason.ILLEGAL;
return Attacker.CanAttack(AttackMethod.ANTI_AIRCRAFT, TreatStackAsArmored, LineOfSight, UseSecondaryWeapon);
}

Expand Down
2 changes: 1 addition & 1 deletion Model/Orders/FullOrderAutomater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public bool AutomateTurn(Match Match, TurnInfo TurnInfo)
return !TurnInfo.Army.Units.Any(i => i.CanMove(false, false) == OrderInvalidReason.NONE);

case TurnComponent.WAIT:
return false;
return !Match.Scenario.FogOfWar;
case TurnComponent.RESET:
return true;
}
Expand Down
1 change: 1 addition & 0 deletions Model/Orders/OrderInvalidReason.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ public enum OrderInvalidReason
DEPLOYMENT_CONVOY_ORDER,

MUST_ATTACK_ALL,
MUST_ATTACK_EACH,
ILLEGAL_ATTACK_EACH,

ATTACK_NO_LOS,
Expand Down
16 changes: 15 additions & 1 deletion Model/ScenarioBuilder/ArmyBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
using System.Collections.Generic;
using System.Linq;

using Cardamom.Planar;

using SFML.Window;

namespace PanzerBlitz
{
public class ArmyBuilder : GameObject
Expand Down Expand Up @@ -57,6 +61,16 @@ public ArmyConfiguration BuildArmyConfiguration()
Objective objective =
new HighestScoreObjective(
new UnitsMatchedObjective(new UnitHasStatus(UnitStatus.DESTROYED), false, true));
int x1 = (Parameters.Team % 2) * Parameters.Parameters.MapSize.X / 2;
int x2 = (Parameters.Team % 2 + 1) * Parameters.Parameters.MapSize.X / 2;
var zone = new Polygon(
new Vector2f[]
{
new Vector2f(x1, 0),
new Vector2f(x2, 0),
new Vector2f(x2, Parameters.Parameters.MapSize.Y + 1),
new Vector2f(x1, Parameters.Parameters.MapSize.Y + 1)
});
return new ArmyConfiguration(
Id.ToString(),
Parameters.Faction,
Expand All @@ -66,7 +80,7 @@ public ArmyConfiguration BuildArmyConfiguration()
new UnitGroup(
Parameters.Faction.Name + " Deployment",
_Units.Select(i => new UnitCount(i.Item1.UnitConfiguration, i.Item2))),
new EmptyMatcher<Tile>())
new TileWithin(zone))
, 1),
new VictoryCondition(
Enumerable.Repeat(objective, 1),
Expand Down
4 changes: 3 additions & 1 deletion Model/Sight/LazySightFinder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public Army TrackingArmy
_TrackingArmy = value;
}
}

public UnitTracker UnitTracker { get; }

Army _TrackingArmy;
Expand Down Expand Up @@ -194,6 +195,7 @@ void HandleRemove(object Sender, ValuedEventArgs<Tile> E)
}
else
{
var unitDeltas = UnitTracker.Remove(this, unit);
if (OnSightUpdated != null)
{
OnSightUpdated(
Expand All @@ -202,7 +204,7 @@ void HandleRemove(object Sender, ValuedEventArgs<Tile> E)
unit,
null,
new List<Tuple<Tile, TileSightLevel>>(),
UnitTracker.Remove(this, unit)));
unitDeltas));
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion Model/Unit/Unit.cs
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ public OrderInvalidReason CanBeAttackedBy(Army Army, AttackMethod AttackMethod,
&& i.CanBeAttackedBy(Army, AttackMethod) == OrderInvalidReason.NONE))
return OrderInvalidReason.NONE;
}
if (!IgnoreConcealment && !Army.SightFinder.GetUnitVisibility(this).Visible)
if (!IgnoreConcealment && !Army.SightFinder.IsSighted(this))
return OrderInvalidReason.TARGET_CONCEALED;
if (Carrier != null) return OrderInvalidReason.UNIT_NO_ACTION;
return OrderInvalidReason.NONE;
Expand Down Expand Up @@ -631,6 +631,8 @@ public void Halt()

public void Reset()
{
if (Position == null) return;

Fired = false;
Moved = false;
MovedMoreThanOneTile = false;
Expand Down
7 changes: 3 additions & 4 deletions Model/Unit/UnitConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -523,7 +523,6 @@ float GetPointValueInternal(bool HalfPriceTrucks, Weapon Weapon)
return Weapon.Attack + .25f * Weapon.Range + Defense + Movement;
return Weapon.Attack + 4 + Defense + Movement;
case UnitClass.RECONNAISSANCE_VEHICLE:
if (CanSpot) return 5 + Defense + Movement;
if (CanAntiAircraft)
{
if (Weapon.WeaponClass == WeaponClass.INFANTRY)
Expand Down Expand Up @@ -581,9 +580,9 @@ float GetPointValueInternal(bool HalfPriceTrucks, Weapon Weapon)
case UnitClass.OBSERVATION_AIRCRAFT:
return 50;
case UnitClass.FIGHTER_BOMBER:
if (Weapon.WeaponClass == WeaponClass.INFANTRY) return 0;
if (Weapon.WeaponClass == WeaponClass.ANTI_ARMOR) return 3 * Weapon.Attack;
return Weapon.Attack;
if (Weapon.WeaponClass == WeaponClass.INFANTRY) return 5 + Weapon.Attack / 2;
if (Weapon.WeaponClass == WeaponClass.ANTI_ARMOR) return 5 + 3 * Weapon.Attack;
return 5 + Weapon.Attack;
default:
return Weapon.Attack + Weapon.Range + Defense + Movement;
}
Expand Down
4 changes: 2 additions & 2 deletions Modules/Default/Scenarios/BattleForBerlin/Scenario_21.blk
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@
int:count { 8 }
}
unit-count:_ {
!unit-configuration:unit-configuration { unit-configurations.achilles }
!unit-configuration:unit-configuration { unit-configurations.wolverine }
int:count { 2 }
}
unit-count:_ {
Expand All @@ -176,7 +176,7 @@
int:count { 1 }
}
unit-count:_ {
!unit-configuration:unit-configuration { unit-configurations.m-7-priest }
!unit-configuration:unit-configuration { unit-configurations.priest }
int:count { 3 }
}
unit-count:_ {
Expand Down

0 comments on commit 8da21b8

Please sign in to comment.