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);
        }
示例#2
0
        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);
        }