public override void Fire(Vector2 _forwardVec, Vector2 _firePosOffset, WeaponPartSchematic partSchematic) { forwardVec = _forwardVec; range = partSchematic.Range; damage = partSchematic.Damage; hitImpulse = (float)partSchematic.BulletInfos["hit_impulse"]; firePos = Owner.transform.position + (Vector3)_firePosOffset; this.Body.position = firePos; this.impulseVector = forwardVec.normalized * partSchematic.ShootImpulse; applyImpulseNextFrame = true; float angle = Vector2.SignedAngle(new Vector2(0, 1).Rotate(this.Body.rotation), forwardVec); this.Body.rotation = angle; float recoilImpulse = (float)partSchematic.BulletInfos["recoil_impulse"]; Vector2 backVec = forwardVec.Rotate(180); Owner.Body.AddForce(backVec.normalized * recoilImpulse, ForceMode2D.Impulse); numMissiles = (int)partSchematic.BulletInfos["num_missiles"]; missileRange = (float)partSchematic.BulletInfos["missile_range"]; missileShootTime = (float)partSchematic.BulletInfos["missile_shoot_time"]; missileInitImpulseMag = (float)partSchematic.BulletInfos["missile_init_impulse"]; missileFireImpulseMag = (float)partSchematic.BulletInfos["missile_fire_impulse"]; missileTriggerTime = (float)partSchematic.BulletInfos["missile_trigger_time"]; }
public override string GetStatString(PartSchematic diffSchem) { bool showDiff = diffSchem != null; string retStr = string.Empty; if (showDiff) { WeaponPartSchematic diffWeapon = (WeaponPartSchematic)diffSchem; string damageStr = string.Format("Damage:\n{0} => {2}{1}</color>", diffWeapon.Damage, Damage, getColorBasedChangeInVal(diffWeapon.Damage, Damage)); string rangeStr = string.Format("Range:\n{0} => {2}{1}</color>", diffWeapon.Range, Range, getColorBasedChangeInVal(diffWeapon.Range, Range)); string reloadTimeStr = string.Format("Reload Time:\n{0} => {2}{1}</color>", diffWeapon.ReloadTimeInSec, ReloadTimeInSec, getColorBasedChangeInVal(diffWeapon.ReloadTimeInSec, ReloadTimeInSec, false)); string fireStrengthStr = string.Format("Fire Strength:\n{0} => {2}{1}</color>", diffWeapon.ShootImpulse, ShootImpulse, getColorBasedChangeInVal(diffWeapon.ShootImpulse, ShootImpulse)); string tierStr = string.Format("Tier:\n{0} => {1}", diffWeapon.Tier, Tier); retStr = string.Format("Bullet Type:\n{0} => {1}\n{2}\n{3}\n{4}\n{5}\n{6}", diffWeapon.BulletType, BulletType, damageStr, rangeStr, reloadTimeStr, fireStrengthStr, tierStr); } else { retStr = string.Format("Bullet Type:\n{0}\nDamage:\n{1}\nRange:\n{2}\nReload Time:\n{3}\nFire Strength:\n{4}\nTier:\n{5}", BulletType, Damage, Range, ReloadTimeInSec, ShootImpulse, Tier); } return(retStr); }
public void SavePlayerInfo() { string weaponString = string.Empty; for (int i = 0; i < TankSchematic.WeaponSchematics.Length; ++i) { WeaponPartSchematic weaponSchem = TankSchematic.WeaponSchematics[i]; weaponString += "\""; if (weaponSchem != null) { weaponString += weaponSchem.Name; } weaponString += "\""; if (i < TankSchematic.WeaponSchematics.Length - 1) { weaponString += ","; } } string playerInfoJson = String.Format("{{\"Tank\":{{\"Hull\":\"{0}\",\"Weapons\":[{1}]}}}}", TankSchematic.HullSchematic.Name, weaponString); PlayerPrefs.SetString(PlayerInfoKey, playerInfoJson); }
public WeaponPart(WeaponPartSchematic schematic, Vector2 weaponFireOffset, Tank owner) { Schematic = schematic; origWeaponFireOffset = weaponFireOffset; lastShotTime = -10000; EquipIdx = -1; OwningTank = owner; }
public override void Fire(Vector2 forwardVec, Vector2 firePosOffset, WeaponPartSchematic partSchematic) { damage = partSchematic.Damage; hitImpulse = (float)partSchematic.BulletInfos["hit_impulse"]; shootForce = partSchematic.ShootImpulse; this.shotForwardVec = forwardVec; this.Body.position = Owner.transform.position + (Vector3)firePosOffset; origAngle = Vector2.SignedAngle(new Vector2(0, 1).Rotate(this.Body.rotation), this.shotForwardVec); this.Body.rotation = origAngle; float recoilImpulse = (float)partSchematic.BulletInfos["recoil_impulse"]; Vector2 backVec = this.shotForwardVec.Rotate(180); Owner.Body.AddForce(backVec.normalized * recoilImpulse, ForceMode2D.Impulse); }
public override void Fire(Vector2 forwardVec, Vector2 firePosOffset, WeaponPartSchematic partSchematic) { range = partSchematic.Range; damage = partSchematic.Damage; hitImpulse = (float)partSchematic.BulletInfos["hit_impulse"]; firePos = Owner.transform.position + (Vector3)firePosOffset; this.Body.position = firePos; this.impulseVector = forwardVec.normalized * partSchematic.ShootImpulse; applyImpulseNextFrame = true; float angle = Vector2.SignedAngle(new Vector2(0, 1).Rotate(this.Body.rotation), forwardVec); this.Body.rotation = angle; float recoilImpulse = (float)partSchematic.BulletInfos["recoil_impulse"]; Vector2 backVec = forwardVec.Rotate(180); Owner.Body.AddForce(backVec.normalized * recoilImpulse, ForceMode2D.Impulse); }
private void loadWeaponParts() { Dictionary <string, PartSchematic> schematics = new Dictionary <string, PartSchematic>(); TextAsset jsonText = Resources.Load("WeaponPartList") as TextAsset; JObject root = JObject.Parse(jsonText.text); foreach (var partInfo in root) { string name = partInfo.Key; JObject info = (JObject)partInfo.Value; float reloadTime = info.Value <float>("reload_time"); int energyUsage = info.Value <int>("energy_usage"); string tierStr = info.Value <string>("tier"); PartSchematic.WeaponTier tier = PartSchematic.WeaponTier.Light; if (tierStr.Equals("L")) { tier = PartSchematic.WeaponTier.Light; } else if (tierStr.Equals("M")) { tier = PartSchematic.WeaponTier.Medium; } else if (tierStr.Equals("H")) { tier = PartSchematic.WeaponTier.Heavy; } Bullet.BulletTypes bType = (Bullet.BulletTypes)Enum.Parse(typeof(Bullet.BulletTypes), info.Value <string>("bullet_type")); Dictionary <string, object> bulletInfoDict = parseBulletInfoJson(bType, info.Value <JObject>("bullet_info")); WeaponPartSchematic part = TankParSchematictFactory.CreateWeaponPartSchematic(name, reloadTime, energyUsage, tier, bType, bulletInfoDict); schematics.Add(part.Name, part); } partSchematicDics.Add(PartSchematic.PartType.Weapon, schematics); }
public override void Fire(Vector2 forwardVec, Vector2 firePosOffset, WeaponPartSchematic partSchematic) { // Not used. Debug.Assert(false, "Fire should never be called for MissileBullet"); }
public abstract void Fire(Vector2 forwardVec, Vector2 firePosOffset, WeaponPartSchematic partSchematic);
public static float CalcTimeToHitPos(Vector2 curPos, Vector2 curFireVec, TankStateInfo aimingTankInfo, WeaponPartSchematic schematic, Vector2 targetPos) { float timeToHit = 0; Vector2 diffVec = targetPos - curPos; // We have to calculate three things: rotation time, travel time to in range, and bullet travel time. // First calculate rotation time. timeToHit += aimingTankInfo.CalcTimeToRotate(curFireVec, diffVec); // Next, calculate travel time. float moveAmount = Mathf.Max(diffVec.magnitude - schematic.Range, 0); if (moveAmount > 0) { Vector2 newPos = diffVec.normalized * moveAmount + curPos; timeToHit += aimingTankInfo.CalcTimeToReachPosWithNoRot(newPos); } // Finally, calculate bullet travel time. timeToHit += Mathf.Min(schematic.Range, diffVec.magnitude) / schematic.ShootImpulse; return(timeToHit); }