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 } }); }
// 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); }
public Attack( AttackStrength strength = AttackStrength.Base, int priority = 5, bool direct = true, bool stoppable = true) { Strength = strength; Priority = priority; Direct = direct; Stoppable = stoppable; }
// 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); } }
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) { }
// 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(); }
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); } }
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(); } } } }
/// <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)); }
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); }