Exemplo n.º 1
0
 public RoleEntry(
     string id,
     ITeam team,
     IList <ICategory> categories,
     Color color,
     Color originalColor,
     bool natural,
     bool unique,
     IList <AbilityEntry> abilities,
     AttackStrength defaultDefense,
     bool defaultDetectionImmune,
     bool defaultRoleBlockImmune,
     HealProfileEntry defaultHealProfile)
 {
     Id      = id;
     Name    = new Key($"{id}name");
     Summary = new Key($"{id}summary");
     Goal    = new Key($"{id}goal");
     AbilitiesDescription = new Key($"{id}abilities");
     Team                   = team;
     Categories             = categories.ToImmutableList();
     Color                  = color;
     OriginalColor          = originalColor;
     Natural                = natural;
     Unique                 = unique;
     Abilities              = abilities.ToImmutableDictionary(x => x.Id, x => x);
     DefaultDefense         = defaultDefense;
     DefaultDetectionImmune = defaultDetectionImmune;
     DefaultRoleBlockImmune = defaultRoleBlockImmune;
     DefaultHealProfile     = defaultHealProfile;
 }
 /// <summary>
 /// Sets the attack strength for a specific scanner. Optionally filtered by a scan policy.
 /// </summary>
 /// <param name="scannerId">The ID of the scanner.</param>
 /// <param name="attackStrength">The attack strength.</param>
 /// <param name="scanPolicyName">Optional scan policy name</param>
 public void SetScannerAttackStrength(int scannerId, AttackStrength attackStrength, string scanPolicyName = null)
 {
     CallAction("setScannerAttackStrength", new Parameters
     {
         { "id", scannerId },
         { "attackStrength", attackStrength },
         { "scanPolicyName", scanPolicyName }
     });
 }
Exemplo n.º 3
0
    // Called when an attack has reached the max windup point
    public void MaxAttack()
    {
        // If the attack key is still being held down, pause the animation until it's released
        if (input.Attack)
        {
            animation.SetParameter("AttackSpeed", 0f);
        }

        attackStrength = AttackStrength.Large;
        animation.SetParameter("AttackStrength", AttackStrength.Large);
    }
Exemplo n.º 4
0
 public Attack(
     AttackStrength strength = AttackStrength.Base,
     int priority            = 5,
     bool direct             = true,
     bool stoppable          = true)
 {
     Strength  = strength;
     Priority  = priority;
     Direct    = direct;
     Stoppable = stoppable;
 }
Exemplo n.º 5
0
 // Called when an attack has reached the minimum windup point
 public void MinAttack()
 {
     // Only set the animation parameter if the input key has been released, otherwise the character may be charging up a more powerful attack
     if (!input.Attack)
     {
         attackStrength = AttackStrength.Small;
         animation.SetParameter("AttackStrength", AttackStrength.Small);
     }
     else
     {
         attackStrength = AttackStrength.Medium;
         animation.SetParameter("AttackStrength", AttackStrength.Medium);
     }
 }
Exemplo n.º 6
0
 public Death(
     IAbility ability,
     IPlayer victim,
     AttackStrength strength = AttackStrength.Base,
     bool direct             = true,
     bool stoppable          = true) :
     this(
         victim.Match.Phase.Day,
         victim,
         DeathCause.Murder,
         ability.MurderDescriptions.Get(victim.Match.Random),
         ability.User,
         strength,
         direct,
         stoppable)
 {
 }
Exemplo n.º 7
0
 // TODO: Abilities limited by threats and death
 public Death(
     int day,
     IPlayer victim,
     DeathCause cause,
     string description,
     IPlayer killer          = null,
     AttackStrength strength = AttackStrength.Base,
     bool direct             = true,
     bool stoppable          = true)
 {
     Day         = day;
     Victim      = victim;
     VictimName  = victim.Name;
     VictimRole  = victim.Role.Name;
     Cause       = cause;
     Killer      = killer;
     LastWill    = victim.LastWill;
     DeathNote   = killer?.DeathNote;
     Description = description;
     Strength    = strength;
     Direct      = direct;
     Stoppable   = stoppable;
 }
        public void SetScannerAttackStrength(
            [Frozen] Mock <IHttpClient> httpClientMock,
            [Greedy] ActiveScannerComponent sut,
            int policyId,
            AttackStrength attackStrength,
            string scanPolicyName)
        {
            // ARRANGE
            httpClientMock.SetupApiCall(sut, CallType.Action, "setScannerAttackStrength",
                                        new Parameters
            {
                { "id", policyId },
                { "attackStrength", attackStrength },
                { "scanPolicyName", scanPolicyName }
            })
            .ReturnsOkResult()
            .Verifiable();

            // ACT
            sut.SetScannerAttackStrength(policyId, attackStrength, scanPolicyName);

            // ASSERT
            httpClientMock.Verify();
        }
Exemplo n.º 9
0
        public bool StartWar(Gang enemyGang, TurfZone warZone, WarType theWarType, AttackStrength attackStrength)
        {
            if (!isOccurring || enemyGang == GangManager.instance.PlayerGang)
            {
                this.enemyGang    = enemyGang;
                this.warZone      = warZone;
                this.curWarType   = theWarType;
                curWarAtkStrength = attackStrength;
                playerNearWarzone = false;
                spawnPointsSet    = false;

                warBlip            = World.CreateBlip(warZone.zoneBlipPosition);
                warBlip.IsFlashing = true;
                warBlip.Sprite     = BlipSprite.Deathmatch;
                warBlip.Color      = BlipColor.Red;

                warAreaBlip = World.CreateBlip(warZone.zoneBlipPosition,
                                               ModOptions.instance.maxDistToWarBlipBeforePlayerLeavesWar);
                warAreaBlip.Sprite = BlipSprite.BigCircle;
                warAreaBlip.Color  = BlipColor.Red;
                warAreaBlip.Alpha  = 175;


                Function.Call(Hash.BEGIN_TEXT_COMMAND_SET_BLIP_NAME, "STRING");
                Function.Call(Hash._ADD_TEXT_COMPONENT_STRING, "Gang War (versus " + enemyGang.name + ")");
                Function.Call(Hash.END_TEXT_COMMAND_SET_BLIP_NAME, warBlip);

                curTicksAwayFromBattle = 0;
                enemiesInsideCars      = SpawnManager.instance.GetSpawnedMembersOfGang(enemyGang, true);

                if (theWarType == WarType.attackingEnemy)
                {
                    alliedReinforcements = GangCalculations.CalculateAttackerReinforcements(GangManager.instance.PlayerGang, attackStrength);
                    enemyReinforcements  = GangCalculations.CalculateDefenderReinforcements(enemyGang, warZone);
                }
                else
                {
                    alliedReinforcements = GangCalculations.CalculateDefenderReinforcements(GangManager.instance.PlayerGang, warZone);
                    enemyReinforcements  = GangCalculations.CalculateAttackerReinforcements(enemyGang, attackStrength);
                }

                float screenRatio = (float)Game.ScreenResolution.Width / Game.ScreenResolution.Height;

                int proportionalScreenWidth = (int)(1080 * screenRatio); //nativeUI UIResText works with 1080p height

                alliedNumText.Position = new Point((proportionalScreenWidth / 2) - 120, 10);
                enemyNumText.Position  = new Point((proportionalScreenWidth / 2) + 120, 10);

                alliedNumText.Caption = alliedReinforcements.ToString();
                enemyNumText.Caption  = enemyReinforcements.ToString();

                initialEnemyReinforcements = enemyReinforcements;

                reinforcementsAdvantage = alliedReinforcements / (float)enemyReinforcements;

                spawnedAllies  = SpawnManager.instance.GetSpawnedMembersOfGang(GangManager.instance.PlayerGang).Count;
                spawnedEnemies = SpawnManager.instance.GetSpawnedMembersOfGang(enemyGang).Count;

                maxSpawnedAllies  = (int)(RandoMath.Max((ModOptions.instance.spawnedMemberLimit / 2) * reinforcementsAdvantage, 5));
                maxSpawnedEnemies = RandoMath.Max(ModOptions.instance.spawnedMemberLimit - maxSpawnedAllies, 5);

                isOccurring = true;

                //BANG-like sound
                Function.Call(Hash.PLAY_SOUND_FRONTEND, -1, "PROPERTY_PURCHASE", "HUD_AWARDS");

                if (theWarType == WarType.attackingEnemy)
                {
                    UI.ShowSubtitle("The " + enemyGang.name + " are coming!");

                    //if we are attacking, set spawns around the player!
                    SetSpawnPoints(MindControl.CurrentPlayerCharacter.Position);
                }
                else
                {
                    UI.Notify(string.Concat("The ", enemyGang.name, " are attacking ", warZone.zoneName, "! They are ",
                                            GangCalculations.CalculateAttackerReinforcements(enemyGang, attackStrength).ToString(),
                                            " against our ",
                                            GangCalculations.CalculateDefenderReinforcements(GangManager.instance.PlayerGang, warZone).ToString()));
                    //spawns are set around the zone blip if we are defending
                    if (World.GetDistance(MindControl.CurrentPlayerCharacter.Position, warZone.zoneBlipPosition) < 100)
                    {
                        SetSpawnPoints(warZone.zoneBlipPosition);
                    }
                }

                SetHateRelationsBetweenGangs();

                return(true);
            }
            else
            {
                return(false);
            }
        }
Exemplo n.º 10
0
 public override string ToString()
 {
     return("Name: " + Name + " Hit Points: " + HitPoints.ToString() + " Attack Strength: " + AttackStrength.ToString());
 }
 void KickCommands(AttackStrength kick, int kickType, string kickStrength)
 {
     if (character.GetComponent <Ken> () != null)
     {
         if (CheckHurricaneKickSequence() && animator.GetBool("isAirborne") == false)
         {
             ShotoCompletesHurricaneKick("Ken", kickType);
         }
         else if (CheckHadoukenSequence() && animator.GetBool("isAirborne") == false)
         {
             KenCompletesRoll(kickType);
         }
         else if (animator.GetBool("isAttacking") == false)
         {
             character.AttackState();
             kick();
         }
     }
     else if (character.GetComponent <FeiLong> () != null)
     {
         if (CheckReverseShoryukenSequence() && animator.GetBool("isAirborne") == false)
         {
             FeiLongCompletesShienKyaku(kickStrength, kickType);
         }
         else if (CheckShoryukenSequence() && animator.GetBool("isAirborne") == false)
         {
             FeiLongCompletesRekkaKun(kickType);
         }
         else if (animator.GetBool("isAttacking") == false)
         {
             kick();
             character.AttackState();
         }
     }
     else if (character.GetComponent <Balrog> () != null)
     {
         if (chargeSystem.GetBackCharged() && !sharedProperties.GetBackPressed && animator.GetBool("isAirborne") == false && sharedProperties.GetForwardPressed)
         {
             BalrogCompletesKickRush(kickStrength, kickType);
         }
         else if (animator.GetBool("isAttacking") == false)
         {
             kick();
             character.AttackState();
         }
     }
     else if (character.GetComponent <Akuma> () != null)
     {
         if (CheckHurricaneKickSequence() && animator.GetBool("isAirborne") == false)
         {
             ShotoCompletesHurricaneKick("Akuma", kickType);
         }
         else if (CheckShoryukenSequence() && animator.GetBool("isAirborne") == false)
         {
             AkumaCompletesHyakkishu(kickType);
         }
         else if (animator.GetBool("hyakkishuActive") == true)
         {
             animator.SetInteger("hyakkishuAttackType", 2);
         }
         else if (animator.GetBool("isAttacking") == false)
         {
             kick();
             character.AttackState();
         }
     }
     else if (character.GetComponent <Sagat>() != null)
     {
         if (CheckHadoukenSequence() && animator.GetBool("isAirborne") == false && projectileP1Parent.transform.childCount <= 0)
         {
             SagatCompletesLowerTigerShot(kickType);
         }
         else if (CheckShoryukenSequence() && animator.GetBool("isAirborne") == false)
         {
             SagatCompletesTigerKnee(kickType);
         }
         else if (animator.GetBool("isAttacking") == false)
         {
             kick();
             character.AttackState();
         }
     }
     else if (character.GetComponent <MBison>() != null)
     {
         if (CheckMotionSuperSequence() && animator.GetBool("isAirborne") == false && character.GetSuper >= 100f)
         {
             CharacterCompletesMotionSuper("MBison", "KneePressNightmare");
         }
         else if (chargeSystem.GetBackCharged() && !sharedProperties.GetBackPressed && animator.GetBool("isAirborne") == false && sharedProperties.GetForwardPressed)
         {
             MBisonCompletesScissorKick(kickStrength, kickType);
         }
         else if (chargeSystem.GetDownCharged() && !sharedProperties.GetDownPressed && animator.GetBool("isAirborne") == false && pressedUp)
         {
             MBisonCompletesHeadStomp(kickType);
         }
         else if (animator.GetBool("isAttacking") == false)
         {
             kick();
             character.AttackState();
         }
     }
 }
 void PunchCommands(AttackStrength punch, FeiLongClosePunch feiLongPunches, int punchType, string punchStrength)
 {
     if (character.GetComponent <Ken> () != null)
     {
         if (CheckMotionSuperSequence() && animator.GetBool("isAirborne") == false && character.GetSuper >= 100f)
         {
             CharacterCompletesMotionSuper("Ken", "Shinryuken");
         }
         else if (CheckHadoukenSequence() && animator.GetBool("isAirborne") == false && projectileP1Parent.transform.childCount <= 0)
         {
             ShotoCompletesHadouken("Ken", punchType);
         }
         else if (CheckShoryukenSequence() && animator.GetBool("isAirborne") == false)
         {
             ShotoCompletesShoryuken("Ken", punchStrength, punchType);
         }
         else if (animator.GetBool("isAttacking") == false)
         {
             character.AttackState();
             punch();
         }
     }
     else if (character.GetComponent <FeiLong> () != null)
     {
         if (CheckMotionSuperSequence() && animator.GetBool("isAirborne") == false && character.GetSuper >= 100f)
         {
             CharacterCompletesMotionSuper("FeiLong", "RekkaShinken");
         }
         else if (CheckHadoukenSequence() && animator.GetBool("isAirborne") == false)
         {
             FeiLongCompletesRekka(punchType);
         }
         else if (animator.GetBool("isAttacking") == false)
         {
             if (Mathf.Abs(distance) < 0.75f && animator.GetBool("isStanding") == true)
             {
                 feiLongPunches();
             }
             else
             {
                 punch();
             }
             character.AttackState();
         }
     }
     else if (character.GetComponent <Balrog> () != null)
     {
         if (CheckMotionSuperSequence() && animator.GetBool("isAirborne") == false && character.GetSuper >= 100f)
         {
             CharacterCompletesMotionSuper("Balrog", "GigatonPunch");
         }
         else if (chargeSystem.GetBackCharged() && !sharedProperties.GetBackPressed && animator.GetBool("isAirborne") == false && sharedProperties.GetForwardPressed)
         {
             BalrogCompletesDashRushes(punchStrength, punchType);
         }
         else if (chargeSystem.GetDownCharged() && !sharedProperties.GetDownPressed && animator.GetBool("isAirborne") == false && pressedUp)
         {
             BalrogCompletesHeadButt(punchStrength, punchType);
         }
         else if (animator.GetBool("isAttacking") == false)
         {
             punch();
             character.AttackState();
         }
     }
     else if (character.GetComponent <Akuma> () != null)
     {
         if (CheckHadoukenSequence() && projectileP1Parent.transform.childCount <= 0)
         {
             if (animator.GetBool("isAirborne") == true)
             {
                 AkumaCompletesAirHadouken(punchType);
             }
             else
             {
                 ShotoCompletesHadouken("Akuma", punchType);
             }
         }
         else if (CheckShoryukenSequence() && animator.GetBool("isAirborne") == false)
         {
             ShotoCompletesShoryuken("Akuma", punchStrength, punchType);
         }
         else if (animator.GetBool("hyakkishuActive") == true)
         {
             animator.SetInteger("hyakkishuAttackType", 1);
         }
         else if (animator.GetBool("isAttacking") == false)
         {
             punch();
             character.AttackState();
         }
     }
     else if (character.GetComponent <Sagat>() != null)
     {
         if (CheckMotionSuperSequence() && animator.GetBool("isAirborne") == false && character.GetSuper >= 100f)
         {
             CharacterCompletesMotionSuper("Sagat", "TigerCannon");
         }
         else if (CheckHadoukenSequence() && animator.GetBool("isAirborne") == false && projectileP1Parent.transform.childCount <= 0)
         {
             SagatCompletesUpperTigerShot(punchType);
         }
         else if (CheckShoryukenSequence() && animator.GetBool("isAirborne") == false)
         {
             SagatCompletesTigerUppercut(punchStrength, punchType);
         }
         else if (animator.GetBool("isAttacking") == false)
         {
             punch();
             character.AttackState();
         }
     }
     else if (character.GetComponent <MBison>() != null)
     {
         if (chargeSystem.GetBackCharged() && !sharedProperties.GetBackPressed && animator.GetBool("isAirborne") == false && sharedProperties.GetForwardPressed)
         {
             MBisonCompletesPsychoCrusher(punchType);
         }
         else if (chargeSystem.GetDownCharged() && !sharedProperties.GetDownPressed && animator.GetBool("isAirborne") == false && pressedUp)
         {
             MBisonCompletesDevilReverse();
         }
         else if (animator.GetBool("reverseActive") == true || animator.GetBool("devilReverseActive") == true)
         {
             animator.SetTrigger("somerSaultInputed");
         }
         else if (animator.GetBool("isAttacking") == false)
         {
             punch();
             character.AttackState();
         }
     }
 }
 void AttacksInput()
 {
     if (Input.GetKey(KeyCode.A) && Input.GetKey(KeyCode.Z))
     {
         if (animator.GetBool("isAttacking") == false && animator.GetBool("isAirborne") == false)
         {
             character.AttackState();
             animator.Play("ThrowStartup");
         }
     }
     else if (CheckShunGokuSatsuSequence() && character.GetComponent <Akuma>() != null && animator.GetBool("isAirborne") == false && character.GetSuper >= 100f)
     {
         Debug.Log("shun goku satsu inputed");
         character.AttackState();
         animator.Play("AkumaShunGokuSatsuStartup", 0);
         character.GetSuper = 0f;
         comboSystem.ResetShunGokuSatsuSequence();
     }
     else
     {
         if (Input.GetKeyDown(KeyCode.A))
         {
             attackStrength = character.CharacterJab;
             if (character.GetComponent <FeiLong>() != null)
             {
                 feiLongPunch = feiLong.FeiLongCloseJab;
             }
             PunchCommands(attackStrength, feiLongPunch, 0, "Jab");
         }
         if (Input.GetKeyDown(KeyCode.S))
         {
             attackStrength = character.CharacterStrong;
             if (character.GetComponent <FeiLong>() != null)
             {
                 feiLongPunch = feiLong.FeiLongCloseStrong;
             }
             PunchCommands(attackStrength, feiLongPunch, 1, "Strong");
         }
         if (Input.GetKeyDown(KeyCode.D))
         {
             attackStrength = character.CharacterFierce;
             if (character.GetComponent <FeiLong>() != null)
             {
                 feiLongPunch = feiLong.FeiLongCloseFierce;
             }
             PunchCommands(attackStrength, feiLongPunch, 2, "Fierce");
         }
         if (Input.GetKeyDown(KeyCode.Z))
         {
             attackStrength = character.CharacterShort;
             KickCommands(attackStrength, 0, "Short");
         }
         if (Input.GetKeyDown(KeyCode.X))
         {
             attackStrength = character.CharacterForward;
             KickCommands(attackStrength, 1, "Forward");
         }
         if (Input.GetKeyDown(KeyCode.C))
         {
             attackStrength = character.CharacterRoundhouse;
             KickCommands(attackStrength, 2, "Roundhouse");
         }
         if (Input.GetKey(KeyCode.F))
         {
             if (character.GetComponent <Balrog>() != null)
             {
                 chargeSystem.ChargeTurnPunch();
             }
         }
         if (Input.GetKeyUp(KeyCode.F))
         {
             if (character.GetComponent <Balrog>() != null)
             {
                 BalrogCompletesTurnPunch();
             }
         }
     }
 }
Exemplo n.º 14
0
 /// <summary>
 /// Return a random int number from attack strength instance.
 /// </summary>
 /// <param name="attackStrength">AttackStrength instance to generate from.</param>
 /// <returns>A pseudo-random number.</returns>
 public static int Generate(AttackStrength attackStrength)
 {
     return(Random.Range(attackStrength.AttackStrengthMin, attackStrength.AttackStrengthMax));
 }
Exemplo n.º 15
0
                public static MasterObject ReadFrom(PrimitiveReader reader, int i)
                {
                    MasterObject value = new MasterObject();

                    byte objectType = reader.ReadUInt8();

                    value.ObjectType = objectType;
                    value.UnitId     = reader.ReadUInt16();
                    value.Unknown1   = reader.ReadUInt16();
                    value.Unknown2   = reader.ReadUInt16();
                    value.UnitClass  = reader.ReadUInt16();
                    value.Unknown3   = reader.ReadBytes(6);

                    const int breakId = -1;

                    switch (objectType)
                    {
                    default:
                        throw new NotImplementedException("Unsupported object type: " + objectType);

                    case 10:                             // Basic units
                    {
                        short  hitpoints        = reader.ReadInt16();
                        float  lengthOfSight    = reader.ReadFloat32();
                        byte   garrisonCapacity = reader.ReadUInt8();
                        float  sizeRadiusX      = reader.ReadFloat32();
                        float  sizeRadiusY      = reader.ReadFloat32();
                        ushort resourceCarriage = reader.ReadUInt16();
                        float  resourceAmount   = reader.ReadFloat32();

                        // Constants?
                        ushort unknown12 = reader.ReadUInt16();
                        byte   unknown13 = reader.ReadUInt8();
                    }
                    break;

                    case 25:                             // Same as 20, only DOPL uses this.
                    case 20:                             // Extended basic units (FLAGX)
                    {
                        value.UnitData = reader.ReadBytes(28);
                        PrimitiveReader r2               = new PrimitiveReader(value.UnitData);
                        short           hitpoints        = r2.ReadInt16();
                        float           lengthOfSight    = r2.ReadFloat32();
                        byte            garrisonCapacity = r2.ReadUInt8();
                        float           sizeRadiusX      = r2.ReadFloat32();
                        float           sizeRadiusY      = r2.ReadFloat32();

                        ulong  unknown1 = r2.ReadUInt64();
                        ushort unknown2 = r2.ReadUInt16();

                        if (unknown1 != 0 || unknown2 != 0)
                        {
                            File.WriteAllBytes("unitextended.bin", value.UnitData);
                            System.Diagnostics.Debugger.Break();
                        }

                        // Constants?
                        ushort unknown12 = r2.ReadUInt16();
                        byte   unknown13 = r2.ReadUInt8();

                        if (i == breakId)
                        {
                            System.Diagnostics.Debugger.Break();
                        }
                    } break;

                    case 30:                             // Dead units
                    {
                        value.UnitData = reader.ReadBytes(32);
                        if (i == breakId)
                        {
                            System.Diagnostics.Debugger.Break();
                        }
                    }
                    break;

                    case 60:                             // Projectiles
                    {
                        short hitpoints        = reader.ReadInt16();
                        float lengthOfSight    = reader.ReadFloat32();
                        byte  garrisonCapacity = reader.ReadUInt8();
                        float sizeRadiusX      = reader.ReadFloat32();
                        float sizeRadiusY      = reader.ReadFloat32();
                        short resourceCarriage = reader.ReadInt16();
                        float unknownFloat     = reader.ReadFloat32();
                        byte  unknown2         = reader.ReadUInt8();
                        float movementRate     = reader.ReadFloat32();

                        float extraRotationSpeed = reader.ReadFloat32();
                        float searchRadius       = reader.ReadFloat32();
                        float workRate           = reader.ReadFloat32();
                        short unknown4           = reader.ReadInt16();

                        ushort           attackStrengthsCount = reader.ReadUInt16();
                        AttackStrength[] strengths            = new AttackStrength[attackStrengthsCount];
                        for (int j = 0; j < strengths.Length; j++)
                        {
                            strengths[j] = AttackStrength.ReadFrom(reader);
                        }

                        ushort           armourStrengthsCount = reader.ReadUInt16();
                        ArmourStrength[] astrengths           = new ArmourStrength[armourStrengthsCount];
                        for (int j = 0; j < astrengths.Length; j++)
                        {
                            astrengths[j] = ArmourStrength.ReadFrom(reader);
                        }
                        float reloadTime   = reader.ReadFloat32();
                        float maximumRange = reader.ReadFloat32();

                        short accuracyPercentage = reader.ReadInt16();
                        short projectileUnitId   = reader.ReadInt16();

                        short unknown7             = reader.ReadInt16();
                        float displayedAttackRange = reader.ReadFloat32();
                        float blastRadius          = reader.ReadFloat32();
                        float minimumRange         = reader.ReadFloat32();

                        // Constants?
                        ushort unknown12 = reader.ReadUInt16();
                        byte   unknown13 = reader.ReadUInt8();

                        if (unknown2 != 0)
                        {
                            System.Diagnostics.Debugger.Break();
                        }
                        if (i == breakId)
                        {
                            System.Diagnostics.Debugger.Break();
                        }
                    } break;

                    case 70:                             // Living units
                    {
                        short hitpoints        = reader.ReadInt16();
                        float lengthOfSight    = reader.ReadFloat32();
                        byte  garrisonCapacity = reader.ReadUInt8();
                        float sizeRadiusX      = reader.ReadFloat32();
                        float sizeRadiusY      = reader.ReadFloat32();
                        short resourceCarriage = reader.ReadInt16();
                        float storageAmount    = reader.ReadFloat32();                                      // e.g. iron boar = 700

                        byte  unknown2           = reader.ReadUInt8();
                        float movementRate       = reader.ReadFloat32();
                        float extraRotationSpeed = reader.ReadFloat32();                                         // Rotation speed for extra parts - sails for ships.

                        float searchRadius = reader.ReadFloat32();
                        float workRate     = reader.ReadFloat32();
                        short unknown4     = reader.ReadInt16();

                        ushort           attackStrengthsCount = reader.ReadUInt16();
                        AttackStrength[] strengths            = new AttackStrength[attackStrengthsCount];
                        for (int j = 0; j < strengths.Length; j++)
                        {
                            strengths[j] = AttackStrength.ReadFrom(reader);
                        }

                        ushort           armourStrengthsCount = reader.ReadUInt16();
                        ArmourStrength[] astrengths           = new ArmourStrength[armourStrengthsCount];
                        for (int j = 0; j < astrengths.Length; j++)
                        {
                            astrengths[j] = ArmourStrength.ReadFrom(reader);
                        }
                        float reloadTime   = reader.ReadFloat32();
                        float maximumRange = reader.ReadFloat32();

                        short accuracyPercentage = reader.ReadInt16();
                        short projectileUnitId   = reader.ReadInt16();

                        short unknown7             = reader.ReadInt16();
                        float displayedAttackRange = reader.ReadFloat32();
                        float blastRadius          = reader.ReadFloat32();
                        float minimumRange         = reader.ReadFloat32();

                        ResourceCost res1                     = ResourceCost.ReadFrom(reader);
                        ResourceCost res2                     = ResourceCost.ReadFrom(reader);
                        ResourceCost res3                     = ResourceCost.ReadFrom(reader);
                        short        trainingTime             = reader.ReadInt16();
                        float        missileDuplicationAmount = reader.ReadFloat32();

                        // Constants?
                        ushort unknown12 = reader.ReadUInt16();
                        byte   unknown13 = reader.ReadUInt8();

                        if (i == breakId)
                        {
                            System.Diagnostics.Debugger.Break();
                        }
                    }
                    break;

                    case 80:                             // Buildings
                    {
                        short hitpoints        = reader.ReadInt16();
                        float lengthOfSight    = reader.ReadFloat32();
                        byte  garrisonCapacity = reader.ReadUInt8();
                        float sizeRadius1      = reader.ReadFloat32();
                        float sizeRadius2      = reader.ReadFloat32();
                        short resourceCarriage = reader.ReadInt16();
                        float storageAmount    = reader.ReadFloat32();

                        byte  unknown2     = reader.ReadUInt8();
                        float movementRate = reader.ReadFloat32();

                        float extraRotationSpeed = reader.ReadFloat32();                                        // Rotation speed for extra parts - something for trebuchets.
                        float searchRadius       = reader.ReadFloat32();
                        float workRate           = reader.ReadFloat32();
                        short unknown4           = reader.ReadInt16();

                        ushort           attackStrengthsCount = reader.ReadUInt16();
                        AttackStrength[] strengths            = new AttackStrength[attackStrengthsCount];
                        for (int j = 0; j < strengths.Length; j++)
                        {
                            strengths[j] = AttackStrength.ReadFrom(reader);
                        }

                        ushort           armourStrengthsCount = reader.ReadUInt16();
                        ArmourStrength[] astrengths           = new ArmourStrength[armourStrengthsCount];
                        for (int j = 0; j < astrengths.Length; j++)
                        {
                            astrengths[j] = ArmourStrength.ReadFrom(reader);
                        }
                        float reloadTime   = reader.ReadFloat32();
                        float maximumRange = reader.ReadFloat32();

                        short accuracyPercentage = reader.ReadInt16();
                        short projectileUnitId   = reader.ReadInt16();

                        short unknown7             = reader.ReadInt16();                             // Seems to have something to do with buildings
                        float displayedAttackRange = reader.ReadFloat32();
                        float blastRadius          = reader.ReadFloat32();
                        float minimumRange         = reader.ReadFloat32();

                        ResourceCost res1                     = ResourceCost.ReadFrom(reader);
                        ResourceCost res2                     = ResourceCost.ReadFrom(reader);
                        ResourceCost res3                     = ResourceCost.ReadFrom(reader);
                        short        trainingTime             = reader.ReadInt16();
                        float        missileDuplicationAmount = reader.ReadFloat32();
                        ushort       unknown14                = reader.ReadUInt16();                    // No clue at all.

                        // Constants?
                        ushort unknown12 = reader.ReadUInt16();
                        byte   unknown13 = reader.ReadUInt8();

                        if (i == breakId)
                        {
                            System.Diagnostics.Debugger.Break();
                        }
                    }
                    break;
                    }
                    return(value);
                }