public static List <string> GenerateUnitReadout(GameUnit myUnit, List <GameUnit> allUnits = null) { List <string> readout = new List <string>() { }; readout.Add(string.Empty); readout.Add(boundary); readout.Add($"* {myUnit.ToString(), -(ReadoutWidth - 4)} *"); readout.Add(separator); readout.Add(string.Format(outputFormat, "Status", myUnit.Status)); readout.Add(string.Format(outputFormat, "Screen Rating", myUnit.GetLocalScreenRating())); readout.Add(string.Format(outputFormat, "Area Screen Rating", myUnit.GetAreaScreenRating())); readout.Add(string.Format(outputFormat, "Armor", myUnit.Armor.ToString())); readout.Add(string.Format(outputFormat, "Hull", myUnit.Hull.ToString())); readout.AddRange(PrintReadoutCollection("Hull", myUnit.Hull.HullDisplay(), SuppressTitleLineForHullMatrix)); readout.Add(string.Format(outputFormat, "Crew", myUnit.CrewQuality)); readout.Add(separator); readout.Add(string.Format(outputFormat, "MainDrive", myUnit.MainDrive.ToString())); readout.Add(string.Format(outputFormat, "FTLDrive", myUnit.FtlDrive.ToString())); readout.Add(separator); readout.AddRange(PrintReadoutCollection("Electronics", myUnit.Electronics)); readout.AddRange(PrintReadoutCollection("Defenses", myUnit.Defenses)); readout.AddRange(PrintReadoutCollection("Holds", myUnit.Holds)); readout.AddRange(PrintReadoutCollection("Weapons", myUnit.Weapons)); readout.AddRange(PrintReadoutCollection("Log", myUnit.Log)); readout.Add(separator); readout.Add($"* {"Source: " + myUnit.SourceFile, -(ReadoutWidth - 4)} *"); readout.Add(boundary); return(readout); }
protected override IList <GameEvent> ReceiveWeaponAttackEvent(GameEvent arg) { var result = new List <GameEvent>(); var evt = arg as WeaponAttackEvent ?? throw ReceiverArgumentMismatch(nameof(arg), arg.GetType(), MethodBase.GetCurrentMethod().Name, typeof(AttackEvent)); // Unit receives event if: // a) WeaponAttack is assigned to this Unit's Formation // b) Attack's percentile roll is within this Unit's PercentileRange if (evt.TargetingData.Target.FormationId == this.unitFormationInfo.FormationId && this.unitFormationInfo.CoversPercentile(evt.UnitAssignmentPercentile)) { var target = evt.TargetingData.Target.UnitActor.unitFormationInfo; GameFormation targetFormation = target.GetFormationReference(); GameUnit targetUnit = target.GetUnitReference(); GameFormation attackerFormation = this.unitFormationInfo.GetFormationReference(); GameUnit attackerUnit = this.unitFormationInfo.GetUnitReference(); int firingRange = evt.TargetingData.FormationRange; result.Add(new UnitStatusEvent() { Description = $"UnitStatus: [{this.UnitId}]{this.UnitName}", Message = $"[{targetFormation.FormationId}]{targetFormation.FormationName}:[{targetUnit.IdNumeric}]{targetUnit.Name}" + $" covers percentile range {this.unitFormationInfo.PercentileLowerBound}-{this.unitFormationInfo.PercentileUpperBound}," + $" so incoming attack with percentile roll {evt.UnitAssignmentPercentile} targets it.", Exchange = evt.Exchange, Volley = evt.Volley }); WeaponSystem weapon = evt.AttackData.Weapon; // TODO: Add ability to override this from AttackData and/or TargetingData? Constants.DamageType effectiveDamageType = weapon.GetDamageType(); int evasionDRM = -1 * targetFormation.GetOrdersForVolley(evt.Volley).EvasionSuccesses; int otherDRM = targetFormation.GetDRMVersusWeaponType(weapon.GetType()) + targetUnit.GetDRMVersusWeaponType(weapon.GetType()); var localScreens = targetUnit.GetLocalScreenRating(); var areaScreens = targetFormation.GetFormationAreaScreenRating(); ScreenRating totalScreenRating = ScreenRating.Combine(localScreens, areaScreens); DamageResult weaponAttackResult = this.ResolveWeaponAttack(weapon, firingRange, totalScreenRating, evasionDRM, otherDRM); var statusMsg = $"[{attackerUnit.IdNumeric}]{attackerUnit.Name} fires [{weapon.Id}]{weapon.SystemName} at [{targetUnit.IdNumeric}]{targetUnit.Name}" + $"\n\t\t -- Net modifiers: Range {firingRange}" + $", Screen {weapon.FinalizeScreenValue(totalScreenRating)}" + $", Evasion DRM {weapon.FinalizeEvasionDRM(evasionDRM)}" + $", Other DRM {otherDRM}" + $"\n\t\t -- Rolls {weaponAttackResult.RollString()}" + $"\n\t\t -- Deals {weaponAttackResult.ToString()}"; result.Add(new UnitStatusEvent() { Description = $"UnitStatus: [{this.UnitId}]{this.UnitName}", Message = statusMsg, Exchange = evt.Exchange, Volley = evt.Volley }); } return(result); }